From 37c948ae7959552f9c990bbec2b719e3b4931e0e Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 26 Jun 2015 13:11:15 +0000 Subject: [PATCH] Implement elf_section_iterator and getELFType(). And with those, simplify getSymbolNMTypeChar. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240780 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELFObjectFile.h | 27 +++++++++++++++++++++++++ tools/llvm-nm/llvm-nm.cpp | 31 ++++++++++------------------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 60a9f70f6ab..011b2c5d1b6 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -47,6 +47,8 @@ protected: virtual uint64_t getSymbolSize(DataRefImpl Symb) const = 0; virtual uint8_t getSymbolOther(DataRefImpl Symb) const = 0; + virtual uint8_t getSymbolELFType(DataRefImpl Symb) const = 0; + virtual uint32_t getSectionType(DataRefImpl Sec) const = 0; virtual uint64_t getSectionFlags(DataRefImpl Sec) const = 0; @@ -84,6 +86,21 @@ public: } }; +class elf_section_iterator : public section_iterator { +public: + elf_section_iterator(const section_iterator &B) : section_iterator(B) { + assert(isa(B->getObject())); + } + + const ELFSectionRef *operator->() const { + return static_cast(section_iterator::operator->()); + } + + const ELFSectionRef &operator*() const { + return static_cast(section_iterator::operator*()); + } +}; + class ELFSymbolRef : public SymbolRef { public: ELFSymbolRef(const SymbolRef &B) : SymbolRef(B) { @@ -101,6 +118,10 @@ public: uint8_t getOther() const { return getObject()->getSymbolOther(getRawDataRefImpl()); } + + uint8_t getELFType() const { + return getObject()->getSymbolELFType(getRawDataRefImpl()); + } }; class elf_symbol_iterator : public symbol_iterator { @@ -155,6 +176,7 @@ protected: uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override; uint32_t getSymbolFlags(DataRefImpl Symb) const override; uint8_t getSymbolOther(DataRefImpl Symb) const override; + uint8_t getSymbolELFType(DataRefImpl Symb) const override; SymbolRef::Type getSymbolType(DataRefImpl Symb) const override; section_iterator getSymbolSection(const Elf_Sym *Symb) const; std::error_code getSymbolSection(DataRefImpl Symb, @@ -404,6 +426,11 @@ uint8_t ELFObjectFile::getSymbolOther(DataRefImpl Symb) const { return toELFSymIter(Symb)->st_other; } +template +uint8_t ELFObjectFile::getSymbolELFType(DataRefImpl Symb) const { + return toELFSymIter(Symb)->getType(); +} + template SymbolRef::Type ELFObjectFile::getSymbolType(DataRefImpl Symb) const { const Elf_Sym *ESym = getSymbol(Symb); diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 16579883d75..6105a0f8e53 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -630,25 +630,20 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, SymbolList.clear(); } -template -static char getSymbolNMTypeChar(ELFObjectFile &Obj, +static char getSymbolNMTypeChar(ELFObjectFileBase &Obj, basic_symbol_iterator I) { - typedef typename ELFObjectFile::Elf_Sym Elf_Sym; - typedef typename ELFObjectFile::Elf_Shdr Elf_Shdr; - // OK, this is ELF - symbol_iterator SymI(I); + elf_symbol_iterator SymI(I); - DataRefImpl Symb = I->getRawDataRefImpl(); - const Elf_Sym *ESym = Obj.getSymbol(Symb); - const ELFFile &EF = *Obj.getELFFile(); - const Elf_Shdr *ESec = EF.getSection(ESym); + elf_section_iterator SecI = Obj.section_end(); + if (error(SymI->getSection(SecI))) + return '?'; - if (ESec) { - switch (ESec->sh_type) { + if (SecI != Obj.section_end()) { + switch (SecI->getType()) { case ELF::SHT_PROGBITS: case ELF::SHT_DYNAMIC: - switch (ESec->sh_flags) { + switch (SecI->getFlags()) { case (ELF::SHF_ALLOC | ELF::SHF_EXECINSTR): return 't'; case (ELF::SHF_TLS | ELF::SHF_ALLOC | ELF::SHF_WRITE): @@ -665,7 +660,7 @@ static char getSymbolNMTypeChar(ELFObjectFile &Obj, } } - if (ESym->getType() == ELF::STT_SECTION) { + if (SymI->getELFType() == ELF::STT_SECTION) { StringRef Name; if (error(SymI->getName(Name))) return '?'; @@ -828,14 +823,8 @@ static char getNMTypeChar(SymbolicFile &Obj, basic_symbol_iterator I) { Ret = getSymbolNMTypeChar(*COFF, I); else if (MachOObjectFile *MachO = dyn_cast(&Obj)) Ret = getSymbolNMTypeChar(*MachO, I); - else if (ELF32LEObjectFile *ELF = dyn_cast(&Obj)) - Ret = getSymbolNMTypeChar(*ELF, I); - else if (ELF64LEObjectFile *ELF = dyn_cast(&Obj)) - Ret = getSymbolNMTypeChar(*ELF, I); - else if (ELF32BEObjectFile *ELF = dyn_cast(&Obj)) - Ret = getSymbolNMTypeChar(*ELF, I); else - Ret = getSymbolNMTypeChar(cast(Obj), I); + Ret = getSymbolNMTypeChar(cast(Obj), I); if (Symflags & object::SymbolRef::SF_Global) Ret = toupper(Ret); -- 2.34.1