diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h --- a/llvm/include/llvm/ObjectYAML/ELFYAML.h +++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h @@ -326,7 +326,7 @@ // Members of a group contain a flag and a list of section indices // that are part of the group. std::vector Members; - StringRef Signature; /* Info */ + Optional Signature; /* Info */ Group() : Section(SectionKind::Group) {} diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -791,10 +791,16 @@ assert(Section.Type == llvm::ELF::SHT_GROUP && "Section type is not SHT_GROUP"); + unsigned Link = 0; + if (Section.Link.empty() && SN2I.lookup(".symtab", Link)) + SHeader.sh_link = Link; + SHeader.sh_entsize = 4; SHeader.sh_size = SHeader.sh_entsize * Section.Members.size(); - SHeader.sh_info = - toSymbolIndex(Section.Signature, Section.Name, /*IsDynamic=*/false); + + if (Section.Signature) + SHeader.sh_info = + toSymbolIndex(*Section.Signature, Section.Name, /*IsDynamic=*/false); raw_ostream &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -1069,7 +1069,7 @@ static void groupSectionMapping(IO &IO, ELFYAML::Group &Group) { commonSectionMapping(IO, Group); - IO.mapOptional("Info", Group.Signature, StringRef()); + IO.mapOptional("Info", Group.Signature); IO.mapRequired("Members", Group.Members); } diff --git a/llvm/test/tools/yaml2obj/duplicate-section-names.test b/llvm/test/tools/yaml2obj/duplicate-section-names.test --- a/llvm/test/tools/yaml2obj/duplicate-section-names.test +++ b/llvm/test/tools/yaml2obj/duplicate-section-names.test @@ -150,7 +150,6 @@ Sections: - Name: .group Type: SHT_GROUP - Link: .symtab Info: foo Members: - SectionOrType: GRP_COMDAT @@ -159,7 +158,6 @@ Type: SHT_PROGBITS - Name: '.group [1]' Type: SHT_GROUP - Link: .symtab Info: 'foo [1]' Members: - SectionOrType: GRP_COMDAT diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml --- a/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml +++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml @@ -42,13 +42,11 @@ Sections: - Name: .group1 Type: SHT_GROUP - Link: .symtab Info: foo Members: - SectionOrType: GRP_COMDAT - Name: .group2 Type: SHT_GROUP - Link: .symtab Info: bar Members: - SectionOrType: GRP_COMDAT diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml --- a/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml +++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml @@ -14,8 +14,6 @@ Sections: - Name: .group Type: SHT_GROUP - Link: .symtab - Info: 0 Members: - SectionOrType: GRP_COMDAT - SectionOrType: .foo diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml --- a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml +++ b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml @@ -10,7 +10,6 @@ Sections: - Name: .group Type: SHT_GROUP - Link: .symtab Info: foo Members: - SectionOrType: 0xFF diff --git a/llvm/test/tools/yaml2obj/elf-override-shname.yaml b/llvm/test/tools/yaml2obj/elf-override-shname.yaml --- a/llvm/test/tools/yaml2obj/elf-override-shname.yaml +++ b/llvm/test/tools/yaml2obj/elf-override-shname.yaml @@ -63,7 +63,6 @@ ShName: 0x000000005 - Name: .group Type: SHT_GROUP - Info: 0 ShName: 0x000000006 Members: - Name: .gnu.version diff --git a/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml b/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml --- a/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml +++ b/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml @@ -43,7 +43,6 @@ ShOffset: 0x000000005 - Name: .group Type: SHT_GROUP - Info: 0 ShOffset: 0x000000006 Members: - Name: .gnu.version diff --git a/llvm/test/tools/yaml2obj/elf-override-shsize.yaml b/llvm/test/tools/yaml2obj/elf-override-shsize.yaml --- a/llvm/test/tools/yaml2obj/elf-override-shsize.yaml +++ b/llvm/test/tools/yaml2obj/elf-override-shsize.yaml @@ -43,7 +43,6 @@ ShSize: 0x000000005 - Name: .group Type: SHT_GROUP - Info: 0 ShSize: 0x000000006 Members: - Name: .gnu.version diff --git a/llvm/test/tools/yaml2obj/section-link.yaml b/llvm/test/tools/yaml2obj/section-link.yaml --- a/llvm/test/tools/yaml2obj/section-link.yaml +++ b/llvm/test/tools/yaml2obj/section-link.yaml @@ -44,3 +44,53 @@ - Name: .bar Type: SHT_PROGBITS Link: .unknown2 + +## Check we link SHT_GROUP to a symbol table by default if it exists. +## Also, check we can set an arbitrary value for sh_link. + +# RUN: yaml2obj --docnum=3 %s -o %t3 +# RUN: llvm-readobj --sections %t3 | FileCheck %s --check-prefix=GROUP-LINK + +# GROUP-LINK: Name: .group1 +# GROUP-LINK: Link: +# GROUP-LINK-SAME: 3 + +# GROUP-LINK: Name: .group2 +# GROUP-LINK: Link: +# GROUP-LINK-SAME: 255 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group1 + Type: SHT_GROUP + Members: + - Name: .group2 + Type: SHT_GROUP + Link: 0xFF + Members: +Symbols: [] + +## Check we set SHT_GROUP's link value to 0 when there is no symbol table. + +# RUN: yaml2obj --docnum=4 %s -o %t4 +# RUN: llvm-readobj --sections %t4 | FileCheck %s --check-prefix=GROUP-LINK-NOSYMTAB + +# GROUP-LINK-NOSYMTAB: Name: .group +# GROUP-LINK-NOSYMTAB: Link: +# GROUP-LINK-NOSYMTAB-SAME: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Members: