X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-readobj%2FARMEHABIPrinter.h;h=beb5fd4ea042b4aafcd20b62b6c62ad40e92fe40;hb=813f44a29fd0fd140127023222d0633e23783bcc;hp=4b8744e201566ce11326b115627b6f85514b97eb;hpb=7eeb71ddc360486020df1fbc926f6e0c8c688cd5;p=oota-llvm.git diff --git a/tools/llvm-readobj/ARMEHABIPrinter.h b/tools/llvm-readobj/ARMEHABIPrinter.h index 4b8744e2015..beb5fd4ea04 100644 --- a/tools/llvm-readobj/ARMEHABIPrinter.h +++ b/tools/llvm-readobj/ARMEHABIPrinter.h @@ -305,12 +305,15 @@ void OpcodeDecoder::Decode(const uint8_t *Opcodes, off_t Offset, size_t Length) template class PrinterContext { - StreamWriter &SW; - const object::ELFFile *ELF; - typedef typename object::ELFFile::Elf_Sym Elf_Sym; typedef typename object::ELFFile::Elf_Shdr Elf_Shdr; typedef typename object::ELFFile::Elf_Rel Elf_Rel; + typedef typename object::ELFFile::Elf_Word Elf_Word; + + StreamWriter &SW; + const object::ELFFile *ELF; + const Elf_Shdr *Symtab; + ArrayRef ShndxTable; static const size_t IndexTableEntrySize; @@ -331,8 +334,9 @@ class PrinterContext { void PrintOpcodes(const uint8_t *Entry, size_t Length, off_t Offset) const; public: - PrinterContext(StreamWriter &Writer, const object::ELFFile *File) - : SW(Writer), ELF(File) {} + PrinterContext(StreamWriter &SW, const object::ELFFile *ELF, + const Elf_Shdr *Symtab) + : SW(SW), ELF(ELF), Symtab(Symtab) {} void PrintUnwindInformation() const; }; @@ -344,12 +348,11 @@ template ErrorOr PrinterContext::FunctionAtAddress(unsigned Section, uint64_t Address) const { - const Elf_Shdr *Symtab = ELF->getDotSymtabSec(); ErrorOr StrTableOrErr = ELF->getStringTableForSymtab(*Symtab); error(StrTableOrErr.getError()); StringRef StrTable = *StrTableOrErr; - for (const Elf_Sym &Sym : ELF->symbols()) + for (const Elf_Sym &Sym : ELF->symbols(Symtab)) if (Sym.st_shndx == Section && Sym.st_value == Address && Sym.getType() == ELF::STT_FUNC) return Sym.getName(StrTable); @@ -369,23 +372,29 @@ PrinterContext::FindExceptionTable(unsigned IndexSectionIndex, /// table. for (const Elf_Shdr &Sec : ELF->sections()) { - if (Sec.sh_type == ELF::SHT_REL && Sec.sh_info == IndexSectionIndex) { - for (const Elf_Rel &R : ELF->rels(&Sec)) { - if (R.r_offset == static_cast(IndexTableOffset)) { - typename object::ELFFile::Elf_Rela RelA; - RelA.r_offset = R.r_offset; - RelA.r_info = R.r_info; - RelA.r_addend = 0; - - std::pair Symbol = - ELF->getRelocationSymbol(&Sec, &RelA); - - ErrorOr Ret = ELF->getSection(Symbol.second); - if (std::error_code EC = Ret.getError()) - report_fatal_error(EC.message()); - return *Ret; - } - } + if (Sec.sh_type != ELF::SHT_REL || Sec.sh_info != IndexSectionIndex) + continue; + + ErrorOr SymTabOrErr = ELF->getSection(Sec.sh_link); + error(SymTabOrErr.getError()); + const Elf_Shdr *SymTab = *SymTabOrErr; + + for (const Elf_Rel &R : ELF->rels(&Sec)) { + if (R.r_offset != static_cast(IndexTableOffset)) + continue; + + typename object::ELFFile::Elf_Rela RelA; + RelA.r_offset = R.r_offset; + RelA.r_info = R.r_info; + RelA.r_addend = 0; + + const Elf_Sym *Symbol = ELF->getRelocationSymbol(&RelA, SymTab); + + ErrorOr Ret = + ELF->getSection(Symbol, SymTab, ShndxTable); + if (std::error_code EC = Ret.getError()) + report_fatal_error(EC.message()); + return *Ret; } } return nullptr;