[llvm] 5b118a0 - [yaml2obj] - Improve handling of the SHT_GROUP section.

Georgii Rymar via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 29 01:16:34 PDT 2019


Author: Georgii Rymar
Date: 2019-10-29T11:09:12+03:00
New Revision: 5b118a0471435751f39eeb92d56ecc3956053304

URL: https://github.com/llvm/llvm-project/commit/5b118a0471435751f39eeb92d56ecc3956053304
DIFF: https://github.com/llvm/llvm-project/commit/5b118a0471435751f39eeb92d56ecc3956053304.diff

LOG: [yaml2obj] - Improve handling of the SHT_GROUP section.

Currently, when we do not specify "Info" field in a YAML description
for SHT_GROUP section, yaml2obj reports an error:
"error: unknown symbol referenced: '' by YAML section '.group1'"

Also, we do not link it with a symbol table by default,
though it is what we do for AddrsigSection, HashSection, RelocationSection.
(http://www.sco.com/developers/gabi/latest/ch4.sheader.html#sh_link)

The patch fixes missings mentioned.

Differential revision: https://reviews.llvm.org/D69299

Added: 
    

Modified: 
    llvm/include/llvm/ObjectYAML/ELFYAML.h
    llvm/lib/ObjectYAML/ELFEmitter.cpp
    llvm/lib/ObjectYAML/ELFYAML.cpp
    llvm/test/tools/yaml2obj/duplicate-section-names.test
    llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml
    llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml
    llvm/test/tools/yaml2obj/elf-comdat-broken.yaml
    llvm/test/tools/yaml2obj/elf-override-shname.yaml
    llvm/test/tools/yaml2obj/elf-override-shoffset.yaml
    llvm/test/tools/yaml2obj/elf-override-shsize.yaml
    llvm/test/tools/yaml2obj/section-link.yaml

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h
index 57f802ca50e4..8cd12b3f7588 100644
--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -326,7 +326,7 @@ struct Group : Section {
   // Members of a group contain a flag and a list of section indices
   // that are part of the group.
   std::vector<SectionOrType> Members;
-  StringRef Signature; /* Info */
+  Optional<StringRef> Signature; /* Info */
 
   Group() : Section(SectionKind::Group) {}
 

diff  --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index d5cdb85eab5f..6a4e00c62857 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -791,10 +791,16 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
   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
index ad316be85e8a..f362b9c23a7b 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -1069,7 +1069,7 @@ static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) {
 
 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
index 65d3de4c3039..4765179755e0 100644
--- a/llvm/test/tools/yaml2obj/duplicate-section-names.test
+++ b/llvm/test/tools/yaml2obj/duplicate-section-names.test
@@ -150,7 +150,6 @@ FileHeader:
 Sections:
   - Name: .group
     Type: SHT_GROUP
-    Link: .symtab
     Info: foo
     Members:
       - SectionOrType: GRP_COMDAT
@@ -159,7 +158,6 @@ Sections:
     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
index 6f2f7acd4925..d79b250ccc95 100644
--- a/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml
+++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml
@@ -42,13 +42,11 @@ FileHeader:
 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
index 63cb27e23d80..9ebcf02c9292 100644
--- a/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml
+++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml
@@ -14,8 +14,6 @@ FileHeader:
 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
index 87ff6fe66c00..88ed3c315c53 100644
--- a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml
+++ b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml
@@ -10,7 +10,6 @@ FileHeader:
 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
index 7c4cb615a38e..4698bc0eb499 100644
--- a/llvm/test/tools/yaml2obj/elf-override-shname.yaml
+++ b/llvm/test/tools/yaml2obj/elf-override-shname.yaml
@@ -63,7 +63,6 @@ Sections:
     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
index 26ef2862de06..9fe5ef01fa17 100644
--- a/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml
+++ b/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml
@@ -43,7 +43,6 @@ Sections:
     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
index c62e91a99459..4470ae22002f 100644
--- a/llvm/test/tools/yaml2obj/elf-override-shsize.yaml
+++ b/llvm/test/tools/yaml2obj/elf-override-shsize.yaml
@@ -43,7 +43,6 @@ Sections:
     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
index 88595eafd693..efe4d3fea74d 100644
--- a/llvm/test/tools/yaml2obj/section-link.yaml
+++ b/llvm/test/tools/yaml2obj/section-link.yaml
@@ -44,3 +44,53 @@ Sections:
   - 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:


        


More information about the llvm-commits mailing list