[llvm] r258334 - [llvm-readobj][ELF] Teach llvm-readobj to show arch specific ELF section's flags

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 20 11:15:18 PST 2016


Author: atanasyan
Date: Wed Jan 20 13:15:18 2016
New Revision: 258334

URL: http://llvm.org/viewvc/llvm-project?rev=258334&view=rev
Log:
[llvm-readobj][ELF] Teach llvm-readobj to show arch specific ELF section's flags

Some architecture specific ELF section flags might have the same value
(for example SHF_X86_64_LARGE and SHF_HEX_GPREL) and we have to check
machine architectures to select an appropriate set of possible flags.

The patch selects architecture specific flags into separate arrays
`ElfxxxSectionFlags` and combines `ElfSectionFlags` and `ElfxxxSectionFlags`
before pass to the `StreamWriter::printFlags()` method.

Differential Revision: http://reviews.llvm.org/D16269

Added:
    llvm/trunk/test/tools/llvm-readobj/elf-sec-flags.test
Modified:
    llvm/trunk/lib/Object/ELFYAML.cpp
    llvm/trunk/test/Object/obj2yaml.test
    llvm/trunk/tools/llvm-readobj/ELFDumper.cpp

Modified: llvm/trunk/lib/Object/ELFYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFYAML.cpp?rev=258334&r1=258333&r2=258334&view=diff
==============================================================================
--- llvm/trunk/lib/Object/ELFYAML.cpp (original)
+++ llvm/trunk/lib/Object/ELFYAML.cpp Wed Jan 20 13:15:18 2016
@@ -336,6 +336,9 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>
     BCase(EF_AVR_ARCH_XMEGA6)
     BCase(EF_AVR_ARCH_XMEGA7)
     break;
+  case ELF::EM_AMDGPU:
+  case ELF::EM_X86_64:
+    break;
   default:
     llvm_unreachable("Unsupported architecture");
   }
@@ -422,6 +425,22 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF
     BCase(SHF_AMDGPU_HSA_CODE)
     BCase(SHF_AMDGPU_HSA_AGENT)
     break;
+  case ELF::EM_HEXAGON:
+    BCase(SHF_HEX_GPREL)
+    break;
+  case ELF::EM_MIPS:
+    BCase(SHF_MIPS_NODUPES)
+    BCase(SHF_MIPS_NAMES)
+    BCase(SHF_MIPS_LOCAL)
+    BCase(SHF_MIPS_NOSTRIP)
+    BCase(SHF_MIPS_GPREL)
+    BCase(SHF_MIPS_MERGE)
+    BCase(SHF_MIPS_ADDR)
+    BCase(SHF_MIPS_STRING)
+    break;
+  case ELF::EM_X86_64:
+    BCase(SHF_X86_64_LARGE)
+    break;
   default:
     // Nothing to do.
     break;

Modified: llvm/trunk/test/Object/obj2yaml.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/obj2yaml.test?rev=258334&r1=258333&r2=258334&view=diff
==============================================================================
--- llvm/trunk/test/Object/obj2yaml.test (original)
+++ llvm/trunk/test/Object/obj2yaml.test Wed Jan 20 13:15:18 2016
@@ -327,7 +327,7 @@ ELF-MIPS64EL-NEXT:     Flags:
 ELF-MIPS64EL-NEXT:     AddressAlign:    0x0000000000000010
 ELF-MIPS64EL-NEXT:   - Name:            .MIPS.options
 ELF-MIPS64EL-NEXT:     Type:            SHT_MIPS_OPTIONS
-ELF-MIPS64EL-NEXT:     Flags:           [ SHF_ALLOC ]
+ELF-MIPS64EL-NEXT:     Flags:           [ SHF_ALLOC, SHF_MIPS_NOSTRIP ]
 ELF-MIPS64EL-NEXT:     AddressAlign:    0x0000000000000008
 ELF-MIPS64EL-NEXT:     Content:         '01280000000000000000000000000000000000000000000000000000000000000000000000000000'
 ELF-MIPS64EL-NEXT:   - Name:            .pdr

Added: llvm/trunk/test/tools/llvm-readobj/elf-sec-flags.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/elf-sec-flags.test?rev=258334&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/elf-sec-flags.test (added)
+++ llvm/trunk/test/tools/llvm-readobj/elf-sec-flags.test Wed Jan 20 13:15:18 2016
@@ -0,0 +1,90 @@
+# Check that llvm-readobj shows arch specific ELF section flags.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-amdgpu.o
+# RUN: llvm-readobj -s %t-amdgpu.o | FileCheck -check-prefix=AMD %s
+
+# AMD:      Flags [ (0x300000)
+# AMD-NEXT:   SHF_AMDGPU_HSA_GLOBAL (0x100000)
+# AMD-NEXT:   SHF_AMDGPU_HSA_READONLY (0x200000)
+# AMD-NEXT: ]
+
+# amdgpu.o
+---
+FileHeader:
+  Class:    ELFCLASS64
+  Data:     ELFDATA2LSB
+  OSABI:    ELFOSABI_GNU
+  Type:     ET_REL
+  Machine:  EM_AMDGPU
+  Flags:    []
+Sections:
+  - Name:   .amdgpu
+    Type:   SHT_PROGBITS
+    Flags:  [SHF_AMDGPU_HSA_GLOBAL, SHF_AMDGPU_HSA_READONLY]
+    Size:   4
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-hex.o
+# RUN: llvm-readobj -s %t-hex.o | FileCheck -check-prefix=HEX %s
+
+# HEX:      Flags [ (0x10000000)
+# HEX-NEXT:   SHF_HEX_GPREL (0x10000000)
+# HEX-NEXT: ]
+
+# hex.o
+---
+FileHeader:
+  Class:    ELFCLASS32
+  Data:     ELFDATA2LSB
+  Type:     ET_REL
+  Machine:  EM_HEXAGON
+  Flags:    []
+Sections:
+  - Name:   .hex
+    Type:   SHT_PROGBITS
+    Flags:  [SHF_HEX_GPREL]
+    Size:   4
+
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-mips.o
+# RUN: llvm-readobj -s %t-mips.o | FileCheck -check-prefix=MIPS %s
+
+# MIPS:      Flags [ (0x38000000)
+# MIPS-NEXT:   SHF_MIPS_GPREL (0x10000000)
+# MIPS-NEXT:   SHF_MIPS_MERGE (0x20000000)
+# MIPS-NEXT:   SHF_MIPS_NOSTRIP (0x8000000)
+# MIPS-NEXT: ]
+
+# mips.o
+---
+FileHeader:
+  Class:    ELFCLASS32
+  Data:     ELFDATA2LSB
+  Type:     ET_REL
+  Machine:  EM_MIPS
+  Flags:    []
+Sections:
+  - Name:   .mips
+    Type:   SHT_PROGBITS
+    Flags:  [SHF_MIPS_GPREL, SHF_MIPS_MERGE, SHF_MIPS_NOSTRIP]
+    Size:   4
+
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-x86_64.o
+# RUN: llvm-readobj -s %t-x86_64.o | FileCheck -check-prefix=X86_64 %s
+
+# X86_64:      Flags [ (0x10000000)
+# X86_64-NEXT:   SHF_X86_64_LARGE (0x10000000)
+# X86_64-NEXT: ]
+
+# x86_64.o
+---
+FileHeader:
+  Class:    ELFCLASS64
+  Data:     ELFDATA2LSB
+  Type:     ET_REL
+  Machine:  EM_X86_64
+  Flags:    []
+Sections:
+  - Name:   .x86_64
+    Type:   SHT_PROGBITS
+    Flags:  [SHF_X86_64_LARGE]
+    Size:   4
+...

Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=258334&r1=258333&r2=258334&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Wed Jan 20 13:15:18 2016
@@ -806,13 +806,34 @@ static const EnumEntry<unsigned> ElfSect
   LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS             ),
   LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION),
   LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION),
-  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP    ),
+};
+
+static const EnumEntry<unsigned> ElfAMDGPUSectionFlags[] = {
   LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_GLOBAL),
   LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_READONLY),
   LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_CODE),
   LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_AGENT)
 };
 
+static const EnumEntry<unsigned> ElfHexagonSectionFlags[] = {
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_HEX_GPREL)
+};
+
+static const EnumEntry<unsigned> ElfMipsSectionFlags[] = {
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NODUPES),
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NAMES  ),
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_LOCAL  ),
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP),
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_GPREL  ),
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_MERGE  ),
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_ADDR   ),
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_STRING )
+};
+
+static const EnumEntry<unsigned> ElfX86_64SectionFlags[] = {
+  LLVM_READOBJ_ENUM_ENT(ELF, SHF_X86_64_LARGE)
+};
+
 static const char *getElfSegmentType(unsigned Arch, unsigned Type) {
   // Check potentially overlapped processor-specific
   // program header type.
@@ -1118,7 +1139,31 @@ void ELFDumper<ELFT>::printSections() {
     W.printHex("Type",
                getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type),
                Sec.sh_type);
-    W.printFlags("Flags", Sec.sh_flags, makeArrayRef(ElfSectionFlags));
+    std::vector<EnumEntry<unsigned>> SectionFlags(std::begin(ElfSectionFlags),
+                                                  std::end(ElfSectionFlags));
+    switch (Obj->getHeader()->e_machine) {
+    case EM_AMDGPU:
+      SectionFlags.insert(SectionFlags.end(), std::begin(ElfAMDGPUSectionFlags),
+                          std::end(ElfAMDGPUSectionFlags));
+      break;
+    case EM_HEXAGON:
+      SectionFlags.insert(SectionFlags.end(),
+                          std::begin(ElfHexagonSectionFlags),
+                          std::end(ElfHexagonSectionFlags));
+      break;
+    case EM_MIPS:
+      SectionFlags.insert(SectionFlags.end(), std::begin(ElfMipsSectionFlags),
+                          std::end(ElfMipsSectionFlags));
+      break;
+    case EM_X86_64:
+      SectionFlags.insert(SectionFlags.end(), std::begin(ElfX86_64SectionFlags),
+                          std::end(ElfX86_64SectionFlags));
+      break;
+    default:
+      // Nothing to do.
+      break;
+    }
+    W.printFlags("Flags", Sec.sh_flags, makeArrayRef(SectionFlags));
     W.printHex("Address", Sec.sh_addr);
     W.printHex("Offset", Sec.sh_offset);
     W.printNumber("Size", Sec.sh_size);




More information about the llvm-commits mailing list