From badb15e1da683f56cf6db52541d44ec296633a33 Mon Sep 17 00:00:00 2001 From: Xing GUO Date: Sat, 2 Mar 2019 04:20:28 +0000 Subject: [PATCH] [llvm-objdump] Should print unknown d_tag in hex format Summary: Currently, `llvm-objdump` prints "unknown" instead of d_tag value in hex format. Because getDynamicTagAsString returns "unknown" rather than empty string. Reviewers: grimar, jhenderson Reviewed By: jhenderson Subscribers: rupprecht, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58763 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355262 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELF.h | 4 ++-- lib/Object/ELF.cpp | 6 +++--- test/tools/llvm-objdump/elf-dynamic-section.test | 3 +++ tools/llvm-objdump/ELFDump.cpp | 11 ++--------- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 1ba32b4875c..a49f7128c64 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -114,8 +114,8 @@ public: SmallVectorImpl &Result) const; uint32_t getRelativeRelocationType() const; - const char *getDynamicTagAsString(unsigned Arch, uint64_t Type) const; - const char *getDynamicTagAsString(uint64_t Type) const; + std::string getDynamicTagAsString(unsigned Arch, uint64_t Type) const; + std::string getDynamicTagAsString(uint64_t Type) const; /// Get the symbol for a given relocation. Expected getRelocationSymbol(const Elf_Rel *Rel, diff --git a/lib/Object/ELF.cpp b/lib/Object/ELF.cpp index 314be34ef59..dd8f3a9f331 100644 --- a/lib/Object/ELF.cpp +++ b/lib/Object/ELF.cpp @@ -424,7 +424,7 @@ ELFFile::android_relas(const Elf_Shdr *Sec) const { } template -const char *ELFFile::getDynamicTagAsString(unsigned Arch, +std::string ELFFile::getDynamicTagAsString(unsigned Arch, uint64_t Type) const { #define DYNAMIC_STRINGIFY_ENUM(tag, value) \ case value: \ @@ -470,12 +470,12 @@ const char *ELFFile::getDynamicTagAsString(unsigned Arch, #undef DYNAMIC_TAG_MARKER #undef DYNAMIC_STRINGIFY_ENUM default: - return "unknown"; + return "0x" + utohexstr(Type, true); } } template -const char *ELFFile::getDynamicTagAsString(uint64_t Type) const { +std::string ELFFile::getDynamicTagAsString(uint64_t Type) const { return getDynamicTagAsString(getHeader()->e_machine, Type); } diff --git a/test/tools/llvm-objdump/elf-dynamic-section.test b/test/tools/llvm-objdump/elf-dynamic-section.test index 0391ac719f3..b2154170941 100644 --- a/test/tools/llvm-objdump/elf-dynamic-section.test +++ b/test/tools/llvm-objdump/elf-dynamic-section.test @@ -58,6 +58,7 @@ # CHECK-NEXT: VERNEEDNUM 0x0000000000000000 # CHECK-NEXT: AUXILIARY D # CHECK-NEXT: FILTER U +# CHECK-NEXT: 0x1234abcd 0x0000000000000001 --- !ELF FileHeader: @@ -188,6 +189,8 @@ Sections: Value: 0x1 - Tag: DT_FILTER Value: 0x3 + - Tag: 0x1234abcd + Value: 0x1 - Tag: DT_NULL Value: 0x0 ProgramHeaders: diff --git a/tools/llvm-objdump/ELFDump.cpp b/tools/llvm-objdump/ELFDump.cpp index 6734f7618e4..c358b428e47 100644 --- a/tools/llvm-objdump/ELFDump.cpp +++ b/tools/llvm-objdump/ELFDump.cpp @@ -176,15 +176,8 @@ void printDynamicSection(const ELFFile *Elf, StringRef Filename) { if (Dyn.d_tag == ELF::DT_NULL) continue; - StringRef Str = StringRef(Elf->getDynamicTagAsString(Dyn.d_tag)); - - if (Str.empty()) { - std::string HexStr = utohexstr(static_cast(Dyn.d_tag), true); - outs() << format(" 0x%-19s", HexStr.c_str()); - } else { - // We use "-21" in order to match GNU objdump's output. - outs() << format(" %-21s", Str.data()); - } + std::string Str = Elf->getDynamicTagAsString(Dyn.d_tag); + outs() << format(" %-21s", Str.c_str()); const char *Fmt = ELFT::Is64Bits ? "0x%016" PRIx64 "\n" : "0x%08" PRIx64 "\n"; -- 2.11.0