[llvm] 301cb91 - [llvm-readobj] - Remove an excessive helper for printing dynamic tags.

Georgii Rymar via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 24 00:56:35 PST 2019


Author: Georgii Rymar
Date: 2019-12-24T11:55:45+03:00
New Revision: 301cb91428eed651eeb1c3c0f11eed2e4f78f5f0

URL: https://github.com/llvm/llvm-project/commit/301cb91428eed651eeb1c3c0f11eed2e4f78f5f0
DIFF: https://github.com/llvm/llvm-project/commit/301cb91428eed651eeb1c3c0f11eed2e4f78f5f0.diff

LOG: [llvm-readobj] - Remove an excessive helper for printing dynamic tags.

This removes the `getTypeString` from readeobj source because it
almost duplicates the existent method: `ELFFile<ELFT>::getDynamicTagAsString`.

Side effect: now it prints "<unknown:>0xHEXVALUE" instead of "(unknown)" for unknown values.
llvm-readelf before this patch printed:

```
0x0000000012345678 (unknown) 0x8765432187654321
0x000000006abcdef0 (unknown) 0x9988776655443322
0x0000000076543210 (unknown) 0x5555666677778888
```

and now it prints:

```
0x0000000012345678 (<unknown:>0x12345678) 0x8765432187654321
0x000000006abcdef0 (<unknown:>0x6abcdef0) 0x9988776655443322
0x0000000076543210 (<unknown:>0x76543210) 0x5555666677778888
```

GNU reaedlf prints different thing:

```
0x0000000012345678 (<unknown>: 12345678) 0x8765432187654321
0x000000006abcdef0 (Operating System specific: 6abcdef0) 0x9988776655443322
0x0000000076543210 (Processor Specific: 76543210) 0x5555666677778888
```

I am not sure we want to follow GNU here. Even if we do, it should be separate
patch probably. The new output looks better and closer to GNU anyways,
and the code is a bit simpler.

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

Added: 
    

Modified: 
    llvm/lib/Object/ELF.cpp
    llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test
    llvm/tools/llvm-readobj/ELFDumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp
index d491288579df..f17a6da23d7d 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -477,7 +477,7 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch,
 #define PPC64_DYNAMIC_TAG(name, value)
 // Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
 #define DYNAMIC_TAG_MARKER(name, value)
-#define DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value)
+#define DYNAMIC_TAG(name, value) case value: return #name;
 #include "llvm/BinaryFormat/DynamicTags.def"
 #undef DYNAMIC_TAG
 #undef AARCH64_DYNAMIC_TAG

diff  --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test
index bbf9f798cc6d..f9c4ff06d313 100644
--- a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test
@@ -66,75 +66,75 @@
 # LLVM-NEXT:   0x000000007FFFFFFD AUXILIARY            Auxiliary library: [D]
 # LLVM-NEXT:   0x000000007FFFFFFE USED                 Not needed object: [U]
 # LLVM-NEXT:   0x000000007FFFFFFF FILTER               Filter library: [U]
-# LLVM-NEXT:   0x0000000012345678 unknown              0x8765432187654321
-# LLVM-NEXT:   0x000000006ABCDEF0 unknown              0x9988776655443322
-# LLVM-NEXT:   0x0000000076543210 unknown              0x5555666677778888
+# LLVM-NEXT:   0x0000000012345678 <unknown:>0x12345678 0x8765432187654321
+# LLVM-NEXT:   0x000000006ABCDEF0 <unknown:>0x6abcdef0 0x9988776655443322
+# LLVM-NEXT:   0x0000000076543210 <unknown:>0x76543210 0x5555666677778888
 # LLVM-NEXT:   0x0000000000000000 NULL                 0x0
 # LLVM-NEXT: ]
 
 # GNU:      Dynamic section at offset {{.*}} contains 61 entries:
-# GNU-NEXT:   Tag                Type                 Name/Value
-# GNU-NEXT:   0x0000000000000001 (NEEDED)             Shared library: [D]
-# GNU-NEXT:   0x0000000000000002 (PLTRELSZ)           16 (bytes)
-# GNU-NEXT:   0x0000000000000003 (PLTGOT)             0x1000
-# GNU-NEXT:   0x0000000000000004 (HASH)               0x1000
-# GNU-NEXT:   0x0000000000000005 (STRTAB)             0x1000
-# GNU-NEXT:   0x0000000000000006 (SYMTAB)             0x1000
-# GNU-NEXT:   0x0000000000000007 (RELA)               0x1000
-# GNU-NEXT:   0x0000000000000008 (RELASZ)             16 (bytes)
-# GNU-NEXT:   0x0000000000000009 (RELAENT)            1929 (bytes)
-# GNU-NEXT:   0x000000000000000a (STRSZ)              16 (bytes)
-# GNU-NEXT:   0x000000000000000b (SYMENT)             2439 (bytes)
-# GNU-NEXT:   0x000000000000000c (INIT)               0x1000
-# GNU-NEXT:   0x000000000000000d (FINI)               0x1000
-# GNU-NEXT:   0x000000000000000e (SONAME)             Library soname: [U]
-# GNU-NEXT:   0x000000000000000f (RPATH)              Library rpath: [f]
-# GNU-NEXT:   0x0000000000000010 (SYMBOLIC)           0x1234567890abcdef
-# GNU-NEXT:   0x0000000000000011 (REL)                0x1000
-# GNU-NEXT:   0x0000000000000012 (RELSZ)              16 (bytes)
-# GNU-NEXT:   0x0000000000000013 (RELENT)             291 (bytes)
-# GNU-NEXT:   0x0000000000000014 (PLTREL)             RELA
-# GNU-NEXT:   0x0000000000000015 (DEBUG)              0xfedcba0987654321
-# GNU-NEXT:   0x0000000000000016 (TEXTREL)            0x1122334455667788
-# GNU-NEXT:   0x0000000000000017 (JMPREL)             0x1000
-# GNU-NEXT:   0x0000000000000018 (BIND_NOW)           0x8877665544332211
-# GNU-NEXT:   0x0000000000000019 (INIT_ARRAY)         0x1000
-# GNU-NEXT:   0x000000000000001a (FINI_ARRAY)         0x1000
-# GNU-NEXT:   0x000000000000001b (INIT_ARRAYSZ)       16 (bytes)
-# GNU-NEXT:   0x000000000000001c (FINI_ARRAYSZ)       16 (bytes)
-# GNU-NEXT:   0x000000000000001d (RUNPATH)            Library runpath: [w]
-# GNU-NEXT:   0x000000000000001e (FLAGS)              ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}}
-# GNU-NEXT:   0x0000000000000020 (PREINIT_ARRAY)      0x1000
-# GNU-NEXT:   0x0000000000000021 (PREINIT_ARRAYSZ)    16 (bytes)
-# GNU-NEXT:   0x0000000000000022 (SYMTAB_SHNDX)       0x1000
-# GNU-NEXT:   0x0000000000000023 (RELRSZ)             0x10
-# GNU-NEXT:   0x0000000000000024 (RELR)               0x1000
-# GNU-NEXT:   0x0000000000000025 (RELRENT)            0x4321
-# GNU-NEXT:   0x000000006000000f (ANDROID_REL)        0x1000
-# GNU-NEXT:   0x0000000060000010 (ANDROID_RELSZ)      16 (bytes)
-# GNU-NEXT:   0x0000000060000011 (ANDROID_RELA)       0x1000
-# GNU-NEXT:   0x0000000060000012 (ANDROID_RELASZ)     16 (bytes)
-# GNU-NEXT:   0x000000006fffe000 (ANDROID_RELR)       0x1000
-# GNU-NEXT:   0x000000006fffe001 (ANDROID_RELRSZ)     0x10
-# GNU-NEXT:   0x000000006fffe003 (ANDROID_RELRENT)    0x1234
-# GNU-NEXT:   0x000000006ffffef5 (GNU_HASH)           0x1000
-# GNU-NEXT:   0x000000006ffffef6 (TLSDESC_PLT)        0x1000
-# GNU-NEXT:   0x000000006ffffef7 (TLSDESC_GOT)        0x1000
-# GNU-NEXT:   0x000000006ffffff9 (RELACOUNT)          0
-# GNU-NEXT:   0x000000006ffffffa (RELCOUNT)           0
-# GNU-NEXT:   0x000000006ffffffb (FLAGS_1)            NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}}
-# GNU-NEXT:   0x000000006ffffff0 (VERSYM)             0x1000
-# GNU-NEXT:   0x000000006ffffffc (VERDEF)             0x1000
-# GNU-NEXT:   0x000000006ffffffd (VERDEFNUM)          0
-# GNU-NEXT:   0x000000006ffffffe (VERNEED)            0x1000
-# GNU-NEXT:   0x000000006fffffff (VERNEEDNUM)         0
-# GNU-NEXT:   0x000000007ffffffd (AUXILIARY)          Auxiliary library: [D]
-# GNU-NEXT:   0x000000007ffffffe (USED)               Not needed object: [U]
-# GNU-NEXT:   0x000000007fffffff (FILTER)             Filter library: [U]
-# GNU-NEXT:   0x0000000012345678 (unknown)            0x8765432187654321
-# GNU-NEXT:   0x000000006abcdef0 (unknown)            0x9988776655443322
-# GNU-NEXT:   0x0000000076543210 (unknown)            0x5555666677778888
-# GNU-NEXT:   0x0000000000000000 (NULL)               0x0
+# GNU-NEXT:   Tag                Type                   Name/Value
+# GNU-NEXT:   0x0000000000000001 (NEEDED)               Shared library: [D]
+# GNU-NEXT:   0x0000000000000002 (PLTRELSZ)             16 (bytes)
+# GNU-NEXT:   0x0000000000000003 (PLTGOT)               0x1000
+# GNU-NEXT:   0x0000000000000004 (HASH)                 0x1000
+# GNU-NEXT:   0x0000000000000005 (STRTAB)               0x1000
+# GNU-NEXT:   0x0000000000000006 (SYMTAB)               0x1000
+# GNU-NEXT:   0x0000000000000007 (RELA)                 0x1000
+# GNU-NEXT:   0x0000000000000008 (RELASZ)               16 (bytes)
+# GNU-NEXT:   0x0000000000000009 (RELAENT)              1929 (bytes)
+# GNU-NEXT:   0x000000000000000a (STRSZ)                16 (bytes)
+# GNU-NEXT:   0x000000000000000b (SYMENT)               2439 (bytes)
+# GNU-NEXT:   0x000000000000000c (INIT)                 0x1000
+# GNU-NEXT:   0x000000000000000d (FINI)                 0x1000
+# GNU-NEXT:   0x000000000000000e (SONAME)               Library soname: [U]
+# GNU-NEXT:   0x000000000000000f (RPATH)                Library rpath: [f]
+# GNU-NEXT:   0x0000000000000010 (SYMBOLIC)             0x1234567890abcdef
+# GNU-NEXT:   0x0000000000000011 (REL)                  0x1000
+# GNU-NEXT:   0x0000000000000012 (RELSZ)                16 (bytes)
+# GNU-NEXT:   0x0000000000000013 (RELENT)               291 (bytes)
+# GNU-NEXT:   0x0000000000000014 (PLTREL)               RELA
+# GNU-NEXT:   0x0000000000000015 (DEBUG)                0xfedcba0987654321
+# GNU-NEXT:   0x0000000000000016 (TEXTREL)              0x1122334455667788
+# GNU-NEXT:   0x0000000000000017 (JMPREL)               0x1000
+# GNU-NEXT:   0x0000000000000018 (BIND_NOW)             0x8877665544332211
+# GNU-NEXT:   0x0000000000000019 (INIT_ARRAY)           0x1000
+# GNU-NEXT:   0x000000000000001a (FINI_ARRAY)           0x1000
+# GNU-NEXT:   0x000000000000001b (INIT_ARRAYSZ)         16 (bytes)
+# GNU-NEXT:   0x000000000000001c (FINI_ARRAYSZ)         16 (bytes)
+# GNU-NEXT:   0x000000000000001d (RUNPATH)              Library runpath: [w]
+# GNU-NEXT:   0x000000000000001e (FLAGS)                ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}}
+# GNU-NEXT:   0x0000000000000020 (PREINIT_ARRAY)        0x1000
+# GNU-NEXT:   0x0000000000000021 (PREINIT_ARRAYSZ)      16 (bytes)
+# GNU-NEXT:   0x0000000000000022 (SYMTAB_SHNDX)         0x1000
+# GNU-NEXT:   0x0000000000000023 (RELRSZ)               0x10
+# GNU-NEXT:   0x0000000000000024 (RELR)                 0x1000
+# GNU-NEXT:   0x0000000000000025 (RELRENT)              0x4321
+# GNU-NEXT:   0x000000006000000f (ANDROID_REL)          0x1000
+# GNU-NEXT:   0x0000000060000010 (ANDROID_RELSZ)        16 (bytes)
+# GNU-NEXT:   0x0000000060000011 (ANDROID_RELA)         0x1000
+# GNU-NEXT:   0x0000000060000012 (ANDROID_RELASZ)       16 (bytes)
+# GNU-NEXT:   0x000000006fffe000 (ANDROID_RELR)         0x1000
+# GNU-NEXT:   0x000000006fffe001 (ANDROID_RELRSZ)       0x10
+# GNU-NEXT:   0x000000006fffe003 (ANDROID_RELRENT)      0x1234
+# GNU-NEXT:   0x000000006ffffef5 (GNU_HASH)             0x1000
+# GNU-NEXT:   0x000000006ffffef6 (TLSDESC_PLT)          0x1000
+# GNU-NEXT:   0x000000006ffffef7 (TLSDESC_GOT)          0x1000
+# GNU-NEXT:   0x000000006ffffff9 (RELACOUNT)            0
+# GNU-NEXT:   0x000000006ffffffa (RELCOUNT)             0
+# GNU-NEXT:   0x000000006ffffffb (FLAGS_1)              NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}}
+# GNU-NEXT:   0x000000006ffffff0 (VERSYM)               0x1000
+# GNU-NEXT:   0x000000006ffffffc (VERDEF)               0x1000
+# GNU-NEXT:   0x000000006ffffffd (VERDEFNUM)            0
+# GNU-NEXT:   0x000000006ffffffe (VERNEED)              0x1000
+# GNU-NEXT:   0x000000006fffffff (VERNEEDNUM)           0
+# GNU-NEXT:   0x000000007ffffffd (AUXILIARY)            Auxiliary library: [D]
+# GNU-NEXT:   0x000000007ffffffe (USED)                 Not needed object: [U]
+# GNU-NEXT:   0x000000007fffffff (FILTER)               Filter library: [U]
+# GNU-NEXT:   0x0000000012345678 (<unknown:>0x12345678) 0x8765432187654321
+# GNU-NEXT:   0x000000006abcdef0 (<unknown:>0x6abcdef0) 0x9988776655443322
+# GNU-NEXT:   0x0000000076543210 (<unknown:>0x76543210) 0x5555666677778888
+# GNU-NEXT:   0x0000000000000000 (NULL)                 0x0
 
 --- !ELF
 FileHeader:

diff  --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 53f04094bb69..5a15eb11932c 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -257,7 +257,7 @@ template <typename ELFT> class ELFDumper : public ObjDumper {
   std::pair<const Elf_Phdr *, const Elf_Shdr *>
   findDynamic(const ELFFile<ELFT> *Obj);
   void loadDynamicTable(const ELFFile<ELFT> *Obj);
-  void parseDynamicTable();
+  void parseDynamicTable(const ELFFile<ELFT> *Obj);
 
   Expected<StringRef> getSymbolVersion(const Elf_Sym *symb,
                                        bool &IsDefault) const;
@@ -1868,7 +1868,7 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
   if (!DynamicPhdr || !DynamicSec) {
     if ((DynamicPhdr && IsPhdrTableValid) || (DynamicSec && IsSecTableValid)) {
       DynamicTable = DynamicPhdr ? FromPhdr : FromSec;
-      parseDynamicTable();
+      parseDynamicTable(Obj);
     } else {
       reportWarning(createError("no valid dynamic table was found"),
                     ObjF->getFileName());
@@ -1909,7 +1909,7 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
     DynamicTable = FromSec;
   }
 
-  parseDynamicTable();
+  parseDynamicTable(Obj);
 }
 
 template <typename ELFT>
@@ -1975,82 +1975,13 @@ ELFDumper<ELFT>::ELFDumper(const object::ELFObjectFile<ELFT> *ObjF,
     ELFDumperStyle.reset(new LLVMStyle<ELFT>(Writer, this));
 }
 
-static const char *getTypeString(unsigned Arch, uint64_t Type) {
-#define DYNAMIC_TAG(n, v)
-  switch (Arch) {
-
-  case EM_AARCH64:
-    switch (Type) {
-#define AARCH64_DYNAMIC_TAG(name, value)                                       \
-    case DT_##name:                                                            \
-      return #name;
-#include "llvm/BinaryFormat/DynamicTags.def"
-#undef AARCH64_DYNAMIC_TAG
-    }
-    break;
-
-  case EM_HEXAGON:
-    switch (Type) {
-#define HEXAGON_DYNAMIC_TAG(name, value)                                       \
-  case DT_##name:                                                              \
-    return #name;
-#include "llvm/BinaryFormat/DynamicTags.def"
-#undef HEXAGON_DYNAMIC_TAG
-    }
-    break;
-
-  case EM_MIPS:
-    switch (Type) {
-#define MIPS_DYNAMIC_TAG(name, value)                                          \
-  case DT_##name:                                                              \
-    return #name;
-#include "llvm/BinaryFormat/DynamicTags.def"
-#undef MIPS_DYNAMIC_TAG
-    }
-    break;
-
-  case EM_PPC64:
-    switch (Type) {
-#define PPC64_DYNAMIC_TAG(name, value)                                         \
-  case DT_##name:                                                              \
-    return #name;
-#include "llvm/BinaryFormat/DynamicTags.def"
-#undef PPC64_DYNAMIC_TAG
-    }
-    break;
-  }
-#undef DYNAMIC_TAG
-  switch (Type) {
-// Now handle all dynamic tags except the architecture specific ones
-#define AARCH64_DYNAMIC_TAG(name, value)
-#define MIPS_DYNAMIC_TAG(name, value)
-#define HEXAGON_DYNAMIC_TAG(name, value)
-#define PPC64_DYNAMIC_TAG(name, value)
-// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
-#define DYNAMIC_TAG_MARKER(name, value)
-#define DYNAMIC_TAG(name, value)                                               \
-  case DT_##name:                                                              \
-    return #name;
-#include "llvm/BinaryFormat/DynamicTags.def"
-#undef DYNAMIC_TAG
-#undef AARCH64_DYNAMIC_TAG
-#undef MIPS_DYNAMIC_TAG
-#undef HEXAGON_DYNAMIC_TAG
-#undef PPC64_DYNAMIC_TAG
-#undef DYNAMIC_TAG_MARKER
-  default:
-    return "unknown";
-  }
-}
-
-template <typename ELFT> void ELFDumper<ELFT>::parseDynamicTable() {
+template <typename ELFT>
+void ELFDumper<ELFT>::parseDynamicTable(const ELFFile<ELFT> *Obj) {
   auto toMappedAddr = [&](uint64_t Tag, uint64_t VAddr) -> const uint8_t * {
     auto MappedAddrOrError = ObjF->getELFFile()->toMappedAddr(VAddr);
     if (!MappedAddrOrError) {
       Error Err =
-          createError("Unable to parse DT_" +
-                      Twine(getTypeString(
-                          ObjF->getELFFile()->getHeader()->e_machine, Tag)) +
+          createError("Unable to parse DT_" + Obj->getDynamicTagAsString(Tag) +
                       ": " + llvm::toString(MappedAddrOrError.takeError()));
 
       reportWarning(std::move(Err), ObjF->getFileName());
@@ -4061,9 +3992,8 @@ template <class ELFT> void GNUStyle<ELFT>::printDynamic(const ELFO *Obj) {
     OS << "  Tag        Type                 Name/Value\n";
   for (auto Entry : Table) {
     uintX_t Tag = Entry.getTag();
-    std::string TypeString = std::string("(") +
-                             getTypeString(Obj->getHeader()->e_machine, Tag) +
-                             ")";
+    std::string TypeString =
+        std::string("(") + Obj->getDynamicTagAsString(Tag).c_str() + ")";
     OS << "  " << format_hex(Tag, Is64 ? 18 : 10)
        << format(" %-20s ", TypeString.c_str());
     this->dumper()->printDynamicEntry(OS, Tag, Entry.getVal());
@@ -5866,12 +5796,10 @@ template <class ELFT> void LLVMStyle<ELFT>::printDynamic(const ELFFile<ELFT> *Ob
   for (auto Entry : Table) {
     uintX_t Tag = Entry.getTag();
     W.startLine() << "  " << format_hex(Tag, Is64 ? 18 : 10, true) << " "
-                  << format("%-21s",
-                            getTypeString(Obj->getHeader()->e_machine, Tag));
+                  << format("%-21s", Obj->getDynamicTagAsString(Tag).c_str());
     this->dumper()->printDynamicEntry(OS, Tag, Entry.getVal());
     OS << "\n";
   }
-
   W.startLine() << "]\n";
 }
 


        


More information about the llvm-commits mailing list