OSDN Git Service

[yaml2obj] - Teach yaml2obj to produce SHT_GROUP section with a custom Info field.
authorGeorge Rimar <grimar@accesssoftek.com>
Wed, 15 Aug 2018 13:55:22 +0000 (13:55 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Wed, 15 Aug 2018 13:55:22 +0000 (13:55 +0000)
This allows to set custom Info field value for SHT_GROUP sections.

It is useful to allow this because we would be able to replace at least one binary
object committed in LLD and replace it with the yaml2obj based test.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339772 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/yaml2obj/elf-comdat-broken-info.yaml [new file with mode: 0644]
tools/yaml2obj/yaml2elf.cpp

diff --git a/test/tools/yaml2obj/elf-comdat-broken-info.yaml b/test/tools/yaml2obj/elf-comdat-broken-info.yaml
new file mode 100644 (file)
index 0000000..4528d35
--- /dev/null
@@ -0,0 +1,27 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj -sections %t | FileCheck %s
+
+--- !ELF
+FileHeader:
+  Class:               ELFCLASS64
+  Data:                ELFDATA2LSB
+  Type:                ET_REL
+  Machine:             EM_X86_64
+Sections:
+  - Name:              .group
+    Type:              SHT_GROUP
+    Link:              .symtab
+    Info:              12345
+    Members:
+      - SectionOrType: GRP_COMDAT
+
+## Check we are able to produce SHT_GROUP section with a custom Info value (12345).
+# CHECK:      Name: .group
+# CHECK-NEXT: Type: SHT_GROUP
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size:
+# CHECK-NEXT: Link:
+# CHECK-NEXT: Info: 12345
index ccf1bc8..ec8cec1 100644 (file)
@@ -274,7 +274,7 @@ bool ELFState<ELFT>::initSectionHeaders(std::vector<Elf_Shdr> &SHeaders,
         return false;
     } else if (auto S = dyn_cast<ELFYAML::Group>(Sec.get())) {
       unsigned SymIdx;
-      if (SymN2I.lookup(S->Info, SymIdx)) {
+      if (SymN2I.lookup(S->Info, SymIdx) && !to_integer(S->Info, SymIdx)) {
         WithColor::error() << "Unknown symbol referenced: '" << S->Info
                            << "' at YAML section '" << S->Name << "'.\n";
         return false;