[llvm] 6d3098e - [obj2yaml,yaml2obj] - Refine how we set/dump the sh_entsize field.

Georgii Rymar via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 13 00:53:25 PST 2021


Author: Georgii Rymar
Date: 2021-01-13T11:52:40+03:00
New Revision: 6d3098e7ff968ad7d3033d7751af05a1fcd2ed9b

URL: https://github.com/llvm/llvm-project/commit/6d3098e7ff968ad7d3033d7751af05a1fcd2ed9b
DIFF: https://github.com/llvm/llvm-project/commit/6d3098e7ff968ad7d3033d7751af05a1fcd2ed9b.diff

LOG: [obj2yaml,yaml2obj] - Refine how we set/dump the sh_entsize field.

This reuses the code from yaml2obj (moves it to ELFYAML.h).
With it we can set the `sh_entsize` in a single place in `obj2yaml`.

Note that it also fixes a bug of `yaml2obj`: we do not
set the `sh_entsize` field for the `SHT_ARM_EXIDX` section properly.

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

Added: 
    

Modified: 
    llvm/include/llvm/ObjectYAML/ELFYAML.h
    llvm/lib/ObjectYAML/ELFEmitter.cpp
    llvm/test/Object/obj2yaml.test
    llvm/test/tools/obj2yaml/ELF/call-graph-profile-section.yaml
    llvm/test/tools/obj2yaml/ELF/mips-abi-flags.yaml
    llvm/test/tools/obj2yaml/ELF/sht-symtab-shndx.yaml
    llvm/test/tools/obj2yaml/ELF/versym-section.yaml
    llvm/test/tools/yaml2obj/ELF/arm-exidx-section.yaml
    llvm/tools/obj2yaml/elf2yaml.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h
index a838b69273ce..a289aab05b2c 100644
--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -16,6 +16,8 @@
 #define LLVM_OBJECTYAML_ELFYAML_H
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/BinaryFormat/ELF.h"
+#include "llvm/Object/ELFTypes.h"
 #include "llvm/ObjectYAML/DWARFYAML.h"
 #include "llvm/ObjectYAML/YAML.h"
 #include "llvm/Support/YAMLTraits.h"
@@ -69,6 +71,38 @@ LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_ISA)
 LLVM_YAML_STRONG_TYPEDEF(StringRef, YAMLFlowString)
 LLVM_YAML_STRONG_TYPEDEF(int64_t, YAMLIntUInt)
 
+template <class ELFT>
+unsigned getDefaultShEntSize(unsigned EMachine, ELF_SHT SecType,
+                             StringRef SecName) {
+  if (EMachine == ELF::EM_MIPS && SecType == ELF::SHT_MIPS_ABIFLAGS)
+    return sizeof(object::Elf_Mips_ABIFlags<ELFT>);
+
+  switch (SecType) {
+  case ELF::SHT_GROUP:
+    return sizeof(typename ELFT::Word);
+  case ELF::SHT_REL:
+    return sizeof(typename ELFT::Rel);
+  case ELF::SHT_RELA:
+    return sizeof(typename ELFT::Rela);
+  case ELF::SHT_RELR:
+    return sizeof(typename ELFT::Relr);
+  case ELF::SHT_DYNAMIC:
+    return sizeof(typename ELFT::Dyn);
+  case ELF::SHT_HASH:
+    return sizeof(typename ELFT::Word);
+  case ELF::SHT_SYMTAB_SHNDX:
+    return sizeof(typename ELFT::Word);
+  case ELF::SHT_GNU_versym:
+    return sizeof(typename ELFT::Half);
+  case ELF::SHT_LLVM_CALL_GRAPH_PROFILE:
+    return sizeof(object::Elf_CGProfile_Impl<ELFT>);
+  default:
+    if (SecName == ".debug_str")
+      return 1;
+    return 0;
+  }
+}
+
 // For now, hardcode 64 bits everywhere that 32 or 64 would be needed
 // since 64-bit can hold 32-bit values too.
 struct FileHeader {

diff  --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index 181b130de621..ba0525c4a675 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -704,6 +704,12 @@ void ELFState<ELFT>::initSectionHeaders(std::vector<Elf_Shdr> &SHeaders,
     if (Sec->Link)
       SHeader.sh_link = toSectionIndex(*Sec->Link, Sec->Name);
 
+    if (Sec->EntSize)
+      SHeader.sh_entsize = *Sec->EntSize;
+    else
+      SHeader.sh_entsize = ELFYAML::getDefaultShEntSize<ELFT>(
+          Doc.Header.Machine.getValueOr(ELF::EM_NONE), Sec->Type, Sec->Name);
+
     if (IsFirstUndefSection) {
       if (auto RawSec = dyn_cast<ELFYAML::RawContentSection>(Sec)) {
         // We do not write any content for special SHN_UNDEF section.
@@ -712,8 +718,6 @@ void ELFState<ELFT>::initSectionHeaders(std::vector<Elf_Shdr> &SHeaders,
         if (RawSec->Info)
           SHeader.sh_info = *RawSec->Info;
       }
-      if (Sec->EntSize)
-        SHeader.sh_entsize = *Sec->EntSize;
 
       LocationCounter += SHeader.sh_size;
       overrideFields<ELFT>(Sec, SHeader);
@@ -1161,9 +1165,6 @@ template <class ELFT>
 void ELFState<ELFT>::writeSectionContent(
     Elf_Shdr &SHeader, const ELFYAML::RawContentSection &Section,
     ContiguousBlobAccumulator &CBA) {
-  if (Section.EntSize)
-    SHeader.sh_entsize = *Section.EntSize;
-
   if (Section.Info)
     SHeader.sh_info = *Section.Info;
 }
@@ -1182,12 +1183,6 @@ void ELFState<ELFT>::writeSectionContent(
           Section.Type == llvm::ELF::SHT_RELA) &&
          "Section type is not SHT_REL nor SHT_RELA");
 
-  bool IsRela = Section.Type == llvm::ELF::SHT_RELA;
-  if (Section.EntSize)
-    SHeader.sh_entsize = *Section.EntSize;
-  else
-    SHeader.sh_entsize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
-
   // For relocation section set link to .symtab by default.
   unsigned Link = 0;
   if (!Section.Link && !ExcludedSectionHeaders.count(".symtab") &&
@@ -1200,6 +1195,7 @@ void ELFState<ELFT>::writeSectionContent(
   if (!Section.Relocations)
     return;
 
+  const bool IsRela = Section.Type == llvm::ELF::SHT_RELA;
   for (const ELFYAML::Relocation &Rel : *Section.Relocations) {
     const bool IsDynamic = Section.Link && (*Section.Link == ".dynsym");
     unsigned SymIdx =
@@ -1228,9 +1224,6 @@ template <class ELFT>
 void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
                                          const ELFYAML::RelrSection &Section,
                                          ContiguousBlobAccumulator &CBA) {
-  SHeader.sh_entsize =
-      Section.EntSize ? uint64_t(*Section.EntSize) : sizeof(Elf_Relr);
-
   if (!Section.Entries)
     return;
 
@@ -1248,8 +1241,6 @@ template <class ELFT>
 void ELFState<ELFT>::writeSectionContent(
     Elf_Shdr &SHeader, const ELFYAML::SymtabShndxSection &Shndx,
     ContiguousBlobAccumulator &CBA) {
-  SHeader.sh_entsize = Shndx.EntSize ? (uint64_t)*Shndx.EntSize : 4;
-
   if (Shndx.Content || Shndx.Size) {
     SHeader.sh_size = writeContent(CBA, Shndx.Content, Shndx.Size);
     return;
@@ -1275,11 +1266,6 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
       SN2I.lookup(".symtab", Link))
     SHeader.sh_link = Link;
 
-  if (Section.EntSize)
-    SHeader.sh_entsize = *Section.EntSize;
-  else
-    SHeader.sh_entsize = sizeof(typename ELFT::Word);
-
   if (Section.Signature)
     SHeader.sh_info =
         toSymbolIndex(*Section.Signature, Section.Name, /*IsDynamic=*/false);
@@ -1302,8 +1288,6 @@ template <class ELFT>
 void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
                                          const ELFYAML::SymverSection &Section,
                                          ContiguousBlobAccumulator &CBA) {
-  SHeader.sh_entsize = Section.EntSize ? (uint64_t)*Section.EntSize : 2;
-
   if (!Section.Entries)
     return;
 
@@ -1409,11 +1393,6 @@ template <class ELFT>
 void ELFState<ELFT>::writeSectionContent(
     Elf_Shdr &SHeader, const ELFYAML::CallGraphProfileSection &Section,
     ContiguousBlobAccumulator &CBA) {
-  if (Section.EntSize)
-    SHeader.sh_entsize = *Section.EntSize;
-  else
-    SHeader.sh_entsize = 16;
-
   unsigned Link = 0;
   if (!Section.Link && !ExcludedSectionHeaders.count(".symtab") &&
       SN2I.lookup(".symtab", Link))
@@ -1442,11 +1421,6 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
       SN2I.lookup(".dynsym", Link))
     SHeader.sh_link = Link;
 
-  if (Section.EntSize)
-    SHeader.sh_entsize = *Section.EntSize;
-  else
-    SHeader.sh_entsize = sizeof(typename ELFT::Word);
-
   if (!Section.Bucket)
     return;
 
@@ -1578,7 +1552,6 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
 
   object::Elf_Mips_ABIFlags<ELFT> Flags;
   zero(Flags);
-  SHeader.sh_entsize = sizeof(Flags);
   SHeader.sh_size = SHeader.sh_entsize;
 
   Flags.version = Section.Version;
@@ -1602,11 +1575,6 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
   assert(Section.Type == llvm::ELF::SHT_DYNAMIC &&
          "Section type is not SHT_DYNAMIC");
 
-  if (Section.EntSize)
-    SHeader.sh_entsize = *Section.EntSize;
-  else
-    SHeader.sh_entsize = 2 * sizeof(uintX_t);
-
   if (!Section.Entries)
     return;
 

diff  --git a/llvm/test/Object/obj2yaml.test b/llvm/test/Object/obj2yaml.test
index ea538a16782c..f57af6f1fca1 100644
--- a/llvm/test/Object/obj2yaml.test
+++ b/llvm/test/Object/obj2yaml.test
@@ -385,6 +385,7 @@
 # ELF-MIPSEL-NEXT:     Type:            SHT_MIPS_ABIFLAGS
 # ELF-MIPSEL-NEXT:     Flags:           [ SHF_ALLOC ]
 # ELF-MIPSEL-NEXT:     AddressAlign:    0x8
+# ELF-MIPSEL-NEXT:     EntSize:         0x0
 # ELF-MIPSEL-NEXT:     ISA:             MIPS32
 # ELF-MIPSEL-NEXT:     ISARevision:     0x1
 # ELF-MIPSEL-NEXT:     FpABI:           FP_DOUBLE

diff  --git a/llvm/test/tools/obj2yaml/ELF/call-graph-profile-section.yaml b/llvm/test/tools/obj2yaml/ELF/call-graph-profile-section.yaml
index 939e6c913175..88ea98af4bdd 100644
--- a/llvm/test/tools/obj2yaml/ELF/call-graph-profile-section.yaml
+++ b/llvm/test/tools/obj2yaml/ELF/call-graph-profile-section.yaml
@@ -12,10 +12,9 @@
 # RUN: obj2yaml %t.be32 | FileCheck %s --check-prefix=BASIC
 
 # BASIC:      Sections:
-# BASIC-NEXT:   - Name:    .llvm.call-graph-profile
-# BASIC-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# BASIC-NEXT:     Link:    .symtab
-# BASIC-NEXT:     EntSize: 0x10
+# BASIC-NEXT:   - Name: .llvm.call-graph-profile
+# BASIC-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# BASIC-NEXT:     Link: .symtab
 # BASIC-NEXT:     Entries:
 # BASIC-NEXT:       - From:   foo
 # BASIC-NEXT:         To:     bar
@@ -55,58 +54,50 @@ Symbols:
 # INVALID-NEXT:   Data:  ELFDATA2MSB
 # INVALID-NEXT:   Type:  ET_DYN
 # INVALID-NEXT: Sections:
-# INVALID-NEXT:   - Name:    .empty
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .symtab
-# INVALID-NEXT:     EntSize: 0x10
-# INVALID-NEXT:   - Name:    .multiple.16.valid
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .symtab
-# INVALID-NEXT:     EntSize: 0x10
+# INVALID-NEXT:   - Name: .empty
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link: .symtab
+# INVALID-NEXT:   - Name: .multiple.16.valid
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link: .symtab
 # INVALID-NEXT:     Entries:
 # INVALID-NEXT:       - From:   foo
 # INVALID-NEXT:         To:     bar
 # INVALID-NEXT:         Weight: 3
-# INVALID-NEXT:   - Name:    .non.multiple.16
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .symtab
-# INVALID-NEXT:     EntSize: 0x10
+# INVALID-NEXT:   - Name: .non.multiple.16
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link: .symtab
 # INVALID-NEXT:     Content: '0000000100000002000000000000000300'
-# INVALID-NEXT:   - Name:    .multiple.16.invalid
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .symtab
-# INVALID-NEXT:     EntSize: 0x10
+# INVALID-NEXT:   - Name: .multiple.16.invalid
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link: .symtab
 # INVALID-NEXT:     Content: 00112233445566778899AABBCCDDEEFF
-# INVALID-NEXT:   - Name:    .unknown.symbol.1
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .symtab
-# INVALID-NEXT:     EntSize: 0x10
+# INVALID-NEXT:   - Name: .unknown.symbol.1
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link: .symtab
 # INVALID-NEXT:     Content: 000000FF000000020000000000000003
-# INVALID-NEXT:   - Name:    .unknown.symbol.2
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .symtab
-# INVALID-NEXT:     EntSize: 0x10
+# INVALID-NEXT:   - Name: .unknown.symbol.2
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link: .symtab
 # INVALID-NEXT:     Content: 00000001000000FF0000000000000003
-# INVALID-NEXT:   - Name:    .link.to.symtable
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .symtab
-# INVALID-NEXT:     EntSize: 0x10
+# INVALID-NEXT:   - Name: .link.to.symtable
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link: .symtab
 # INVALID-NEXT:     Entries:
 # INVALID-NEXT:       - From:   foo
 # INVALID-NEXT:         To:     bar
 # INVALID-NEXT:         Weight: 0
-# INVALID-NEXT:   - Name:    .link.to.non.symtable.1
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     EntSize: 0x10
-# INVALID-NEXT:     Content: '00000001000000020000000000000000'
-# INVALID-NEXT:   - Name:    .link.to.non.symtable.2
-# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link:    .empty
-# INVALID-NEXT:     EntSize: 0x10
+# INVALID-NEXT:   - Name: .link.to.non.symtable.1
+# INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
 # INVALID-NEXT:     Content: '00000001000000020000000000000000'
-# INVALID-NEXT:   - Name: .zero.entry.size
+# INVALID-NEXT:   - Name: .link.to.non.symtable.2
 # INVALID-NEXT:     Type: SHT_LLVM_CALL_GRAPH_PROFILE
-# INVALID-NEXT:     Link: .symtab
+# INVALID-NEXT:     Link: .empty
+# INVALID-NEXT:     Content: '00000001000000020000000000000000'
+# INVALID-NEXT:   - Name:    .zero.entry.size
+# INVALID-NEXT:     Type:    SHT_LLVM_CALL_GRAPH_PROFILE
+# INVALID-NEXT:     Link:    .symtab
+# INVALID-NEXT:     EntSize: 0x0
 # INVALID-NEXT:     Entries:
 # INVALID-NEXT:       - From:   foo
 # INVALID-NEXT:         To:     bar
@@ -184,6 +175,7 @@ Sections:
         To:     2
         Weight: 0
 ## Case 5: Check we can dump a section that has a sh_entsize that is not a multiple of 16.
+##         Check that in these cases we print the "EntSize" key.
   - Name: .zero.entry.size
     Type: SHT_LLVM_CALL_GRAPH_PROFILE
     EntSize: 0

diff  --git a/llvm/test/tools/obj2yaml/ELF/mips-abi-flags.yaml b/llvm/test/tools/obj2yaml/ELF/mips-abi-flags.yaml
index 7361359350bf..86c641be875a 100644
--- a/llvm/test/tools/obj2yaml/ELF/mips-abi-flags.yaml
+++ b/llvm/test/tools/obj2yaml/ELF/mips-abi-flags.yaml
@@ -7,7 +7,6 @@
 # CHECK-NEXT:   - Name:         .MIPS.abiflags
 # CHECK-NEXT:     Type:         SHT_MIPS_ABIFLAGS
 # CHECK-NEXT:     AddressAlign: 0x8
-# CHECK-NEXT:     EntSize:      0x18
 # CHECK-NEXT:     ISA:          MIPS64
 # CHECK-NEXT:     ISARevision:  0x5
 # CHECK-NEXT:     ISAExtension: EXT_OCTEON3
@@ -52,11 +51,16 @@ Sections:
 
 # MIPS:      - Name: .MIPS.abiflags
 # MIPS-NEXT:   Type: SHT_MIPS_ABIFLAGS
+## We don't print the "EntSize" key, because 0x18 is the default value
+## for the sh_entsize field of SHT_MIPS_ABIFLAGS.
 # MIPS-NEXT:   ISA:  0x0
 # MIPS-NEXT: ...
 
 # NOT-MIPS:      - Name:    .MIPS.abiflags
 # NOT-MIPS-NEXT:   Type:    0x7000002A
+## We print the "EntSize" key, because 0x7000002A only means
+## "SHT_MIPS_ABIFLAGS" when machine is EM_MIPS, so 0x18 is not a known default value.
+# NOT-MIPS-NEXT:   EntSize: 0x18
 # NOT-MIPS-NEXT:   Content: '000000000000000000000000000000000000000000000000'
 # NOT-MIPS-NEXT: ...
 
@@ -67,7 +71,17 @@ FileHeader:
   Type:    ET_REL
   Machine: [[MACHINE]]
 Sections:
-  - Name:   .MIPS.abiflags
-    Type:   SHT_PROGBITS
-    ShType: 0x7000002a ## SHT_MIPS_ABIFLAGS.
-    Size:   0x18
+  - Name:    .MIPS.abiflags
+    Type:    SHT_PROGBITS
+    ShType:  0x7000002a ## SHT_MIPS_ABIFLAGS.
+    Size:    0x18
+    EntSize: [[ENTSIZE=0x18]]
+
+## Check we dump the "EntSize" key when the value of the "sh_entsize" field is not equal to 0x18.
+
+# RUN: yaml2obj %s --docnum=2 -DMACHINE=EM_MIPS -DENTSIZE=0x19 -o %t2.mips.entsize
+# RUN: obj2yaml %t2.mips.entsize | FileCheck %s --check-prefix=MIPS-ENTSIZE
+
+# MIPS-ENTSIZE:      - Name:    .MIPS.abiflags
+# MIPS-ENTSIZE-NEXT:   Type:    SHT_MIPS_ABIFLAGS
+# MIPS-ENTSIZE-NEXT:   EntSize: 0x19

diff  --git a/llvm/test/tools/obj2yaml/ELF/sht-symtab-shndx.yaml b/llvm/test/tools/obj2yaml/ELF/sht-symtab-shndx.yaml
index 12fba6c13714..6e995cce96f0 100644
--- a/llvm/test/tools/obj2yaml/ELF/sht-symtab-shndx.yaml
+++ b/llvm/test/tools/obj2yaml/ELF/sht-symtab-shndx.yaml
@@ -11,12 +11,11 @@
 # CASE1-NEXT:   Data:  ELFDATA2LSB
 # CASE1-NEXT:   Type:  ET_REL
 # CASE1-NEXT: Sections:
-# CASE1-NEXT:   - Name:    bar
-# CASE1-NEXT:     Type:    SHT_PROGBITS
-# CASE1-NEXT:   - Name:    .symtab_shndx
-# CASE1-NEXT:     Type:    SHT_SYMTAB_SHNDX
-# CASE1-NEXT:     Link:    .symtab
-# CASE1-NEXT:     EntSize: 0x4
+# CASE1-NEXT:   - Name: bar
+# CASE1-NEXT:     Type: SHT_PROGBITS
+# CASE1-NEXT:   - Name: .symtab_shndx
+# CASE1-NEXT:     Type: SHT_SYMTAB_SHNDX
+# CASE1-NEXT:     Link: .symtab
 # CASE1-NEXT:     Entries: [ 0, 1, 2 ]
 # CASE1-NEXT: Symbols:
 # CASE1-NEXT:   - Name:  bar
@@ -186,3 +185,36 @@ Sections:
     Link:    .foo
   - Name:    .foo
     Type:    SHT_PROGBITS
+
+## Check that we are unable to dump the SHT_SYMTAB_SHNDX section when its
+## sh_entsize has an unexpected value (not equal to 4).
+
+# RUN: yaml2obj -DENTSIZE=0xff --docnum=7 %s -o %t7.entsize.bad
+# RUN: not obj2yaml %t7.entsize.bad 2>&1 | \
+# RUN:   FileCheck %s -DFILE=%t7.entsize.bad --check-prefix=CASE7-BAD
+
+# CASE7-BAD: Error reading file: [[FILE]]: unable to read extended section indexes: section [index 1] has invalid sh_entsize: expected 4, but got 255
+
+## Check we don't print the "EntSize" field when the "sh_entsize" field has the default value.
+
+# RUN: yaml2obj -DENTSIZE=4 --docnum=7 %s -o %t7.entsize.ok
+# RUN: obj2yaml %t7.entsize.ok | FileCheck %s -DFILE=%t7.entsize.ok --check-prefix=CASE7
+
+# CASE7:      - Name:    .symtab_shndx
+# CASE7-NEXT:   Type:    SHT_SYMTAB_SHNDX
+# CASE7-NEXT:   Link:    .symtab
+# CASE7-NEXT:   Entries: [ 0 ]
+# CASE7-NEXT: Symbols:
+
+--- !ELF
+FileHeader:
+  Class: ELFCLASS64
+  Data:  ELFDATA2LSB
+  Type:  ET_REL
+Sections:
+  - Name:    .symtab_shndx
+    Type:    SHT_SYMTAB_SHNDX
+    EntSize: [[ENTSIZE]]
+    Entries: [ 0 ]
+    Link:    .symtab
+Symbols: []

diff  --git a/llvm/test/tools/obj2yaml/ELF/versym-section.yaml b/llvm/test/tools/obj2yaml/ELF/versym-section.yaml
index c1b6e1423aab..fcdb2aad6c64 100644
--- a/llvm/test/tools/obj2yaml/ELF/versym-section.yaml
+++ b/llvm/test/tools/obj2yaml/ELF/versym-section.yaml
@@ -10,14 +10,13 @@
 # CHECK-NEXT:   Type:  ET_EXEC
 # CHECK-NEXT:   Entry: 0x201000
 # CHECK-NEXT: Sections:
-# CHECK-NEXT:   - Name:            .gnu.version
-# CHECK-NEXT:     Type:            SHT_GNU_versym
-# CHECK-NEXT:     Flags:           [ SHF_ALLOC ]
-# CHECK-NEXT:     Address:         0x200210
-# CHECK-NEXT:     Link:            .dynsym
-# CHECK-NEXT:     AddressAlign:    0x2
-# CHECK-NEXT:     EntSize:         0x2
-# CHECK-NEXT:     Entries:         [ 0, 3, 4 ]
+# CHECK-NEXT:   - Name:         .gnu.version
+# CHECK-NEXT:     Type:         SHT_GNU_versym
+# CHECK-NEXT:     Flags:        [ SHF_ALLOC ]
+# CHECK-NEXT:     Address:      0x200210
+# CHECK-NEXT:     Link:         .dynsym
+# CHECK-NEXT:     AddressAlign: 0x2
+# CHECK-NEXT:     Entries:      [ 0, 3, 4 ]
 # CHECK-NEXT:   - Name:
 # CHECK:      DynamicSymbols:
 # CHECK-NEXT:   - Name:    f1

diff  --git a/llvm/test/tools/yaml2obj/ELF/arm-exidx-section.yaml b/llvm/test/tools/yaml2obj/ELF/arm-exidx-section.yaml
index b78a77dd32e6..c573fe0708e8 100644
--- a/llvm/test/tools/yaml2obj/ELF/arm-exidx-section.yaml
+++ b/llvm/test/tools/yaml2obj/ELF/arm-exidx-section.yaml
@@ -56,7 +56,7 @@ Sections:
 # RUN: llvm-readelf --sections %t.props.o | FileCheck %s --check-prefix=PROPERTIES
 
 # PROPERTIES: [Nr] Name       Type      Address          Off    Size   ES Flg Lk    Inf Al
-# PROPERTIES: [ 1] .ARM.exidx ARM_EXIDX 0000000000001122 000055 000000 00 AMS 13124 0   85
+# PROPERTIES: [ 1] .ARM.exidx ARM_EXIDX 0000000000001122 000055 000000 66 AMS 13124 0   85
 
 --- !ELF
 FileHeader:

diff  --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp
index 89bbee49657a..3c7f6dd8319d 100644
--- a/llvm/tools/obj2yaml/elf2yaml.cpp
+++ b/llvm/tools/obj2yaml/elf2yaml.cpp
@@ -730,29 +730,6 @@ Error ELFDumper<ELFT>::dumpRelocation(const RelT *Rel, const Elf_Shdr *SymTab,
   return Error::success();
 }
 
-template <class ELFT>
-static unsigned getDefaultShEntSize(ELFYAML::ELF_SHT SecType,
-                                    StringRef SecName) {
-  switch (SecType) {
-  case ELF::SHT_GROUP:
-    return sizeof(typename ELFT::Word);
-  case ELF::SHT_REL:
-    return sizeof(typename ELFT::Rel);
-  case ELF::SHT_RELA:
-    return sizeof(typename ELFT::Rela);
-  case ELF::SHT_RELR:
-    return sizeof(typename ELFT::Relr);
-  case ELF::SHT_DYNAMIC:
-    return sizeof(typename ELFT::Dyn);
-  case ELF::SHT_HASH:
-    return sizeof(typename ELFT::Word);
-  default:
-    if (SecName == ".debug_str")
-      return 1;
-    return 0;
-  }
-}
-
 template <class ELFT>
 Error ELFDumper<ELFT>::dumpCommonSection(const Elf_Shdr *Shdr,
                                          ELFYAML::Section &S) {
@@ -772,7 +749,8 @@ Error ELFDumper<ELFT>::dumpCommonSection(const Elf_Shdr *Shdr,
     return NameOrErr.takeError();
   S.Name = NameOrErr.get();
 
-  if (Shdr->sh_entsize != getDefaultShEntSize<ELFT>(S.Type, S.Name))
+  if (Shdr->sh_entsize != ELFYAML::getDefaultShEntSize<ELFT>(
+                              Obj.getHeader().e_machine, S.Type, S.Name))
     S.EntSize = static_cast<llvm::yaml::Hex64>(Shdr->sh_entsize);
 
   if (Shdr->sh_link != ELF::SHN_UNDEF) {


        


More information about the llvm-commits mailing list