Author: Georgii Rymar Date: 2020-12-23T11:13:19+03:00 New Revision: bdef1f87aba656a64b34f76d2a6613b6e9299a03
URL: https://github.com/llvm/llvm-project/commit/bdef1f87aba656a64b34f76d2a6613b6e9299a03 DIFF: https://github.com/llvm/llvm-project/commit/bdef1f87aba656a64b34f76d2a6613b6e9299a03.diff LOG: [llvm-readobj] - Dump the ELF file type better. Currently llvm-readelf might print "OS Specific/Processor Specific/<unknown>" hint when dumping the ELF file type. The patch teaches llvm-readobj to do the same. This fixes https://bugs.llvm.org/show_bug.cgi?id=40868 I am removing `Object/elf-unknown-type.test` test because it is not in the right place, it is outdated and very limited. The `readobj/ELF/file-types.test` checks the functionality much better. Differential revision: https://reviews.llvm.org/D93689 Added: Modified: llvm/test/tools/llvm-readobj/ELF/file-types.test llvm/tools/llvm-readobj/ELFDumper.cpp Removed: llvm/test/Object/elf-unknown-type.test ################################################################################ diff --git a/llvm/test/Object/elf-unknown-type.test b/llvm/test/Object/elf-unknown-type.test deleted file mode 100644 index 508e831ae90e..000000000000 --- a/llvm/test/Object/elf-unknown-type.test +++ /dev/null @@ -1,10 +0,0 @@ -# RUN: yaml2obj %s | llvm-readobj --file-headers - | FileCheck %s - -!ELF -FileHeader: !FileHeader - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: 42 - Machine: EM_X86_64 - -# CHECK: Type: 0x2A diff --git a/llvm/test/tools/llvm-readobj/ELF/file-types.test b/llvm/test/tools/llvm-readobj/ELF/file-types.test index 767ce4d646ff..f06f302b8642 100644 --- a/llvm/test/tools/llvm-readobj/ELF/file-types.test +++ b/llvm/test/tools/llvm-readobj/ELF/file-types.test @@ -62,7 +62,7 @@ FileHeader: # RUN: llvm-readelf -h %t.unknown | FileCheck %s --match-full-lines --check-prefix GNU-UNNKNOWN # LLVM-UNNKNOWN: ElfHeader { -# LLVM-UNNKNOWN: Type: 0xFDFF +# LLVM-UNNKNOWN: Type: Unknown (0xFDFF) # GNU-UNNKNOWN: ELF Header: # GNU-UNNKNOWN: Type: <unknown>: fdff @@ -72,7 +72,7 @@ FileHeader: # RUN: llvm-readelf -h %t6 | FileCheck %s --match-full-lines --check-prefix GNU-LOOS # LLVM-LOOS: ElfHeader { -# LLVM-LOOS: Type: 0xFE00 +# LLVM-LOOS: Type: OS Specific (0xFE00) # GNU-LOOS: ELF Header: # GNU-LOOS: Type: OS Specific: (fe00) @@ -82,7 +82,7 @@ FileHeader: # RUN: llvm-readelf -h %t7 | FileCheck %s --match-full-lines --check-prefix GNU-HIOS # LLVM-HIOS: ElfHeader { -# LLVM-HIOS: Type: 0xFEFF +# LLVM-HIOS: Type: OS Specific (0xFEFF) # GNU-HIOS: ELF Header: # GNU-HIOS: Type: OS Specific: (feff) @@ -92,7 +92,7 @@ FileHeader: # RUN: llvm-readelf -h %t8 | FileCheck %s --match-full-lines --check-prefix GNU-LOPROC # LLVM-LOPROC: ElfHeader { -# LLVM-LOPROC: Type: 0xFF00 +# LLVM-LOPROC: Type: Processor Specific (0xFF00) # GNU-LOPROC: ELF Header: # GNU-LOPROC: Type: Processor Specific: (ff00) @@ -102,7 +102,7 @@ FileHeader: # RUN: llvm-readelf -h %t9 | FileCheck %s --match-full-lines --check-prefix GNU-HIPROC # LLVM-HIPROC: ElfHeader { -# LLVM-HIPROC: Type: 0xFFFF +# LLVM-HIPROC: Type: Processor Specific (0xFFFF) # GNU-HIPROC: ELF Header: # GNU-HIPROC: Type: Processor Specific: (ffff) diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index a82494ad1b4d..00f8c3fcefac 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3515,6 +3515,15 @@ static std::string getSectionHeaderTableIndexString(const ELFFile<ELFT> &Obj, to_string((*ArrOrErr)[0].sh_link) + ")"; } +static const EnumEntry<unsigned> *getObjectFileEnumEntry(unsigned Type) { + auto It = llvm::find_if(ElfObjectFileType, [&](const EnumEntry<unsigned> &E) { + return E.Value == Type; + }); + if (It != makeArrayRef(ElfObjectFileType).end()) + return It; + return nullptr; +} + template <class ELFT> void GNUStyle<ELFT>::printFileHeaders() { const Elf_Ehdr &e = this->Obj.getHeader(); OS << "ELF Header:\n"; @@ -3539,17 +3548,15 @@ template <class ELFT> void GNUStyle<ELFT>::printFileHeaders() { printFields(OS, "ABI Version:", std::to_string(e.e_ident[ELF::EI_ABIVERSION])); - Str = printEnum(e.e_type, makeArrayRef(ElfObjectFileType)); - if (makeArrayRef(ElfObjectFileType).end() == - llvm::find_if(ElfObjectFileType, [&](const EnumEntry<unsigned> &E) { - return E.Value == e.e_type; - })) { + if (const EnumEntry<unsigned> *E = getObjectFileEnumEntry(e.e_type)) { + Str = E->AltName.str(); + } else { if (e.e_type >= ET_LOPROC) - Str = "Processor Specific: (" + Str + ")"; + Str = "Processor Specific: (" + to_hexString(e.e_type, false) + ")"; else if (e.e_type >= ET_LOOS) - Str = "OS Specific: (" + Str + ")"; + Str = "OS Specific: (" + to_hexString(e.e_type, false) + ")"; else - Str = "<unknown>: " + Str; + Str = "<unknown>: " + to_hexString(e.e_type, false); } printFields(OS, "Type:", Str); @@ -6343,7 +6350,19 @@ template <class ELFT> void LLVMStyle<ELFT>::printFileHeaders() { W.printBinary("Unused", makeArrayRef(E.e_ident).slice(ELF::EI_PAD)); } - W.printEnum("Type", E.e_type, makeArrayRef(ElfObjectFileType)); + std::string TypeStr; + if (const EnumEntry<unsigned> *Ent = getObjectFileEnumEntry(E.e_type)) { + TypeStr = Ent->Name.str(); + } else { + if (E.e_type >= ET_LOPROC) + TypeStr = "Processor Specific"; + else if (E.e_type >= ET_LOOS) + TypeStr = "OS Specific"; + else + TypeStr = "Unknown"; + } + W.printString("Type", TypeStr + " (0x" + to_hexString(E.e_type) + ")"); + W.printEnum("Machine", E.e_machine, makeArrayRef(ElfMachineType)); W.printNumber("Version", E.e_version); W.printHex("Entry", E.e_entry); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits