[llvm] 552b1b3 - [llvm-readobj] Use a helper to extract the Other Flags from symbols
Paul Kirth via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 17 16:30:23 PDT 2023
Author: Paul Kirth
Date: 2023-03-17T23:30:12Z
New Revision: 552b1b3c44d1dd669f7c6b10c1b4c6c39ee55174
URL: https://github.com/llvm/llvm-project/commit/552b1b3c44d1dd669f7c6b10c1b4c6c39ee55174
DIFF: https://github.com/llvm/llvm-project/commit/552b1b3c44d1dd669f7c6b10c1b4c6c39ee55174.diff
LOG: [llvm-readobj] Use a helper to extract the Other Flags from symbols
Since all ELFDumper implementations will require the same logic when
dealing with Other Flags, we move the logic into a helper so that it can
be easily reused across implementations.
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D137092
Added:
Modified:
llvm/tools/llvm-readobj/ELFDumper.cpp
Removed:
################################################################################
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index ec77f72451587..693b7e253dd0f 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -235,6 +235,9 @@ template <typename ELFT> class ELFDumper : public ObjDumper {
return 4;
}
+ std::vector<EnumEntry<unsigned>>
+ getOtherFlagsFromSymbol(const Elf_Ehdr &Header, const Elf_Sym &Symbol) const;
+
Elf_Dyn_Range dynamic_table() const {
// A valid .dynamic section contains an array of entries terminated
// with a DT_NULL entry. However, sometimes the section content may
@@ -3270,6 +3273,35 @@ void ELFDumper<ELFT>::printReloc(const Relocation<ELFT> &R, unsigned RelIndex,
printRelRelaReloc(R, *Target);
}
+template <class ELFT>
+std::vector<EnumEntry<unsigned>>
+ELFDumper<ELFT>::getOtherFlagsFromSymbol(const Elf_Ehdr &Header,
+ const Elf_Sym &Symbol) const {
+ std::vector<EnumEntry<unsigned>> SymOtherFlags(std::begin(ElfSymOtherFlags),
+ std::end(ElfSymOtherFlags));
+ if (Header.e_machine == EM_MIPS) {
+ // Someone in their infinite wisdom decided to make STO_MIPS_MIPS16
+ // flag overlap with other ST_MIPS_xxx flags. So consider both
+ // cases separately.
+ if ((Symbol.st_other & STO_MIPS_MIPS16) == STO_MIPS_MIPS16)
+ SymOtherFlags.insert(SymOtherFlags.end(),
+ std::begin(ElfMips16SymOtherFlags),
+ std::end(ElfMips16SymOtherFlags));
+ else
+ SymOtherFlags.insert(SymOtherFlags.end(),
+ std::begin(ElfMipsSymOtherFlags),
+ std::end(ElfMipsSymOtherFlags));
+ } else if (Header.e_machine == EM_AARCH64) {
+ SymOtherFlags.insert(SymOtherFlags.end(),
+ std::begin(ElfAArch64SymOtherFlags),
+ std::end(ElfAArch64SymOtherFlags));
+ } else if (Header.e_machine == EM_RISCV) {
+ SymOtherFlags.insert(SymOtherFlags.end(), std::begin(ElfRISCVSymOtherFlags),
+ std::end(ElfRISCVSymOtherFlags));
+ }
+ return SymOtherFlags;
+}
+
static inline void printFields(formatted_raw_ostream &OS, StringRef Str1,
StringRef Str2) {
OS.PadToColumn(2u);
@@ -6868,29 +6900,8 @@ void LLVMELFDumper<ELFT>::printSymbol(const Elf_Sym &Symbol, unsigned SymIndex,
// by flags enumeration in that case.
W.printNumber("Other", 0);
else {
- std::vector<EnumEntry<unsigned>> SymOtherFlags(std::begin(ElfSymOtherFlags),
- std::end(ElfSymOtherFlags));
- if (this->Obj.getHeader().e_machine == EM_MIPS) {
- // Someones in their infinite wisdom decided to make STO_MIPS_MIPS16
- // flag overlapped with other ST_MIPS_xxx flags. So consider both
- // cases separately.
- if ((Symbol.st_other & STO_MIPS_MIPS16) == STO_MIPS_MIPS16)
- SymOtherFlags.insert(SymOtherFlags.end(),
- std::begin(ElfMips16SymOtherFlags),
- std::end(ElfMips16SymOtherFlags));
- else
- SymOtherFlags.insert(SymOtherFlags.end(),
- std::begin(ElfMipsSymOtherFlags),
- std::end(ElfMipsSymOtherFlags));
- } else if (this->Obj.getHeader().e_machine == EM_AARCH64) {
- SymOtherFlags.insert(SymOtherFlags.end(),
- std::begin(ElfAArch64SymOtherFlags),
- std::end(ElfAArch64SymOtherFlags));
- } else if (this->Obj.getHeader().e_machine == EM_RISCV) {
- SymOtherFlags.insert(SymOtherFlags.end(),
- std::begin(ElfRISCVSymOtherFlags),
- std::end(ElfRISCVSymOtherFlags));
- }
+ std::vector<EnumEntry<unsigned>> SymOtherFlags =
+ this->getOtherFlagsFromSymbol(this->Obj.getHeader(), Symbol);
W.printFlags("Other", Symbol.st_other, ArrayRef(SymOtherFlags), 0x3u);
}
printSymbolSection(Symbol, SymIndex, ShndxTable);
More information about the llvm-commits
mailing list