diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -1447,33 +1447,64 @@ }; static const EnumEntry ElfXCoreSectionFlags[] = { - LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION), - LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION) + ENUM_ENT(XCORE_SHF_CP_SECTION, ""), + ENUM_ENT(XCORE_SHF_DP_SECTION, "") }; static const EnumEntry ElfARMSectionFlags[] = { - LLVM_READOBJ_ENUM_ENT(ELF, SHF_ARM_PURECODE) + ENUM_ENT(SHF_ARM_PURECODE, "y") }; static const EnumEntry ElfHexagonSectionFlags[] = { - LLVM_READOBJ_ENUM_ENT(ELF, SHF_HEX_GPREL) + ENUM_ENT(SHF_HEX_GPREL, "") }; static const EnumEntry 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 ) + ENUM_ENT(SHF_MIPS_NODUPES, ""), + ENUM_ENT(SHF_MIPS_NAMES, ""), + ENUM_ENT(SHF_MIPS_LOCAL, ""), + ENUM_ENT(SHF_MIPS_NOSTRIP, ""), + ENUM_ENT(SHF_MIPS_GPREL, ""), + ENUM_ENT(SHF_MIPS_MERGE, ""), + ENUM_ENT(SHF_MIPS_ADDR, ""), + ENUM_ENT(SHF_MIPS_STRING, "") }; static const EnumEntry ElfX86_64SectionFlags[] = { - LLVM_READOBJ_ENUM_ENT(ELF, SHF_X86_64_LARGE) + ENUM_ENT(SHF_X86_64_LARGE, "l") }; +static std::vector> +getSectionFlagsForTarget(unsigned EMachine) { + std::vector> Ret(std::begin(ElfSectionFlags), + std::end(ElfSectionFlags)); + switch (EMachine) { + case EM_ARM: + Ret.insert(Ret.end(), std::begin(ElfARMSectionFlags), + std::end(ElfARMSectionFlags)); + break; + case EM_HEXAGON: + Ret.insert(Ret.end(), std::begin(ElfHexagonSectionFlags), + std::end(ElfHexagonSectionFlags)); + break; + case EM_MIPS: + Ret.insert(Ret.end(), std::begin(ElfMipsSectionFlags), + std::end(ElfMipsSectionFlags)); + break; + case EM_X86_64: + Ret.insert(Ret.end(), std::begin(ElfX86_64SectionFlags), + std::end(ElfX86_64SectionFlags)); + break; + case EM_XCORE: + Ret.insert(Ret.end(), std::begin(ElfXCoreSectionFlags), + std::end(ElfXCoreSectionFlags)); + break; + default: + break; + } + return Ret; +} + static std::string getGNUFlags(unsigned EMachine, uint64_t Flags) { // Here we are trying to build the flags string in the same way as GNU does. // It is not that straightforward. Imagine we have sh_flags == 0x90000000. @@ -1484,27 +1515,26 @@ bool HasUnknownFlag = false; bool HasOSFlag = false; bool HasProcFlag = false; + std::vector> FlagsList = + getSectionFlagsForTarget(EMachine); while (Flags) { // Take the least significant bit as a flag. uint64_t Flag = Flags & -Flags; Flags -= Flag; // Find the flag in the known flags list. - auto I = llvm::find_if(ElfSectionFlags, [=](const EnumEntry &E) { - return E.Value == Flag; + auto I = llvm::find_if(FlagsList, [=](const EnumEntry &E) { + // Flags with empty names are not printed in GNU style output. + return E.Value == Flag && !E.AltName.empty(); }); - if (I != std::end(ElfSectionFlags)) { + if (I != FlagsList.end()) { Str += I->AltName; continue; } // If we did not find a matching regular flag, then we deal with an OS // specific flag, processor specific flag or an unknown flag. - if (EMachine == EM_X86_64 && Flag == SHF_X86_64_LARGE) { - Str += 'l'; - } else if (EMachine == EM_ARM && Flag == SHF_ARM_PURECODE) { - Str += 'y'; - } else if (Flag & ELF::SHF_MASKOS) { + if (Flag & ELF::SHF_MASKOS) { HasOSFlag = true; Flags &= ~ELF::SHF_MASKOS; } else if (Flag & ELF::SHF_MASKPROC) { @@ -5677,6 +5707,8 @@ int SectionIndex = -1; ArrayRef Sections = unwrapOrError(this->FileName, Obj->sections()); const ELFObjectFile *ElfObj = this->dumper()->getElfObject(); + std::vector> FlagsList = + getSectionFlagsForTarget(Obj->getHeader()->e_machine); for (const Elf_Shdr &Sec : Sections) { StringRef Name = unwrapOrError( ElfObj->getFileName(), Obj->getSectionName(&Sec, this->WarningHandler)); @@ -5687,35 +5719,7 @@ "Type", object::getELFSectionTypeName(Obj->getHeader()->e_machine, Sec.sh_type), Sec.sh_type); - std::vector> SectionFlags(std::begin(ElfSectionFlags), - std::end(ElfSectionFlags)); - switch (Obj->getHeader()->e_machine) { - case EM_ARM: - SectionFlags.insert(SectionFlags.end(), std::begin(ElfARMSectionFlags), - std::end(ElfARMSectionFlags)); - 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; - case EM_XCORE: - SectionFlags.insert(SectionFlags.end(), std::begin(ElfXCoreSectionFlags), - std::end(ElfXCoreSectionFlags)); - break; - default: - // Nothing to do. - break; - } - W.printFlags("Flags", Sec.sh_flags, makeArrayRef(SectionFlags)); + W.printFlags("Flags", Sec.sh_flags, makeArrayRef(FlagsList)); W.printHex("Address", Sec.sh_addr); W.printHex("Offset", Sec.sh_offset); W.printNumber("Size", Sec.sh_size);