diff options
author | Simon Atanasyan <simon@atanasyan.com> | 2016-01-20 19:15:18 +0000 |
---|---|---|
committer | Simon Atanasyan <simon@atanasyan.com> | 2016-01-20 19:15:18 +0000 |
commit | 2d0d8530e38e9865db50525f02108b72ec365589 (patch) | |
tree | 69045d858fe083f6f27b897ffe91113a00042335 /llvm/tools/llvm-readobj/ELFDumper.cpp | |
parent | 2d7fa7065f0d07d4c376d4228f2097e686a9c143 (diff) | |
download | bcm5719-llvm-2d0d8530e38e9865db50525f02108b72ec365589.tar.gz bcm5719-llvm-2d0d8530e38e9865db50525f02108b72ec365589.zip |
[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
llvm-svn: 258334
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 0bb3a3dbb83..f6ec9770d80 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -806,13 +806,34 @@ static const EnumEntry<unsigned> ElfSectionFlags[] = { 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); |