diff options
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 26 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ARMEHABIPrinter.h | 5 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 30 | ||||
-rw-r--r-- | llvm/tools/obj2yaml/elf2yaml.cpp | 54 |
4 files changed, 75 insertions, 40 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index dde7e55cfa0..6139cfbea1b 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -319,12 +319,20 @@ static std::error_code getRelocationValueString(const ELFObjectFile<ELFT> *Obj, typedef typename ELFObjectFile<ELFT>::Elf_Shdr Elf_Shdr; const ELFFile<ELFT> &EF = *Obj->getELFFile(); - const Elf_Shdr *sec = EF.getSection(Rel.d.a); - const Elf_Shdr *SymTab = EF.getSection(sec->sh_link); + ErrorOr<const Elf_Shdr *> SecOrErr = EF.getSection(Rel.d.a); + if (std::error_code EC = SecOrErr.getError()) + return EC; + const Elf_Shdr *Sec = *SecOrErr; + ErrorOr<const Elf_Shdr *> SymTabOrErr = EF.getSection(Sec->sh_link); + if (std::error_code EC = SymTabOrErr.getError()) + return EC; + const Elf_Shdr *SymTab = *SymTabOrErr; assert(SymTab->sh_type == ELF::SHT_SYMTAB || SymTab->sh_type == ELF::SHT_DYNSYM); - const Elf_Shdr *StrTabSec = EF.getSection(SymTab->sh_link); - ErrorOr<StringRef> StrTabOrErr = EF.getStringTable(StrTabSec); + ErrorOr<const Elf_Shdr *> StrTabSec = EF.getSection(SymTab->sh_link); + if (std::error_code EC = StrTabSec.getError()) + return EC; + ErrorOr<StringRef> StrTabOrErr = EF.getStringTable(*StrTabSec); if (std::error_code EC = StrTabOrErr.getError()) return EC; StringRef StrTab = *StrTabOrErr; @@ -332,7 +340,7 @@ static std::error_code getRelocationValueString(const ELFObjectFile<ELFT> *Obj, StringRef res; int64_t addend = 0; uint16_t symbol_index = 0; - switch (sec->sh_type) { + switch (Sec->sh_type) { default: return object_error::parse_failed; case ELF::SHT_REL: { @@ -349,11 +357,13 @@ static std::error_code getRelocationValueString(const ELFObjectFile<ELFT> *Obj, } } const Elf_Sym *symb = - EF.template getEntry<Elf_Sym>(sec->sh_link, symbol_index); + EF.template getEntry<Elf_Sym>(Sec->sh_link, symbol_index); StringRef Target; - const Elf_Shdr *SymSec = EF.getSection(symb); + ErrorOr<const Elf_Shdr *> SymSec = EF.getSection(symb); + if (std::error_code EC = SymSec.getError()) + return EC; if (symb->getType() == ELF::STT_SECTION) { - ErrorOr<StringRef> SecName = EF.getSectionName(SymSec); + ErrorOr<StringRef> SecName = EF.getSectionName(*SymSec); if (std::error_code EC = SecName.getError()) return EC; Target = *SecName; diff --git a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h index 55d10b151de..dd2490d503d 100644 --- a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h +++ b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h @@ -377,7 +377,10 @@ PrinterContext<ET>::FindExceptionTable(unsigned IndexSectionIndex, std::pair<const Elf_Shdr *, const Elf_Sym *> Symbol = ELF->getRelocationSymbol(&Sec, &RelA); - return ELF->getSection(Symbol.second); + ErrorOr<const Elf_Shdr *> Ret = ELF->getSection(Symbol.second); + if (std::error_code EC = Ret.getError()) + report_fatal_error(EC.message()); + return *Ret; } } } diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 705ab6c62e5..a4b25efeb9b 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -162,8 +162,9 @@ getSectionNameIndex(const ELFO &Obj, const typename ELFO::Elf_Sym *Symbol, else { if (SectionIndex == SHN_XINDEX) SectionIndex = Obj.getExtendedSymbolTableIndex(&*Symbol); - const typename ELFO::Elf_Shdr *Sec = Obj.getSection(SectionIndex); - SectionName = errorOrDefault(Obj.getSectionName(Sec)); + ErrorOr<const typename ELFO::Elf_Shdr *> Sec = Obj.getSection(SectionIndex); + if (!error(Sec.getError())) + SectionName = errorOrDefault(Obj.getSectionName(*Sec)); } } @@ -644,7 +645,10 @@ void ELFDumper<ELFT>::printSections() { if (opts::SectionSymbols) { ListScope D(W, "Symbols"); for (const typename ELFO::Elf_Sym &Sym : Obj->symbols()) { - if (Obj->getSection(&Sym) == &Sec) + ErrorOr<const Elf_Shdr *> SymSec = Obj->getSection(&Sym); + if (!SymSec) + continue; + if (*SymSec == &Sec) printSymbol(&Sym, false); } } @@ -746,16 +750,20 @@ void ELFDumper<ELFT>::printRelocation(const Elf_Shdr *Sec, std::pair<const Elf_Shdr *, const Elf_Sym *> Sym = Obj->getRelocationSymbol(Sec, &Rel); if (Sym.second && Sym.second->getType() == ELF::STT_SECTION) { - const Elf_Shdr *Sec = Obj->getSection(Sym.second); - ErrorOr<StringRef> SecName = Obj->getSectionName(Sec); - if (SecName) - TargetName = SecName.get(); + ErrorOr<const Elf_Shdr *> Sec = Obj->getSection(Sym.second); + if (!error(Sec.getError())) { + ErrorOr<StringRef> SecName = Obj->getSectionName(*Sec); + if (SecName) + TargetName = SecName.get(); + } } else if (Sym.first) { const Elf_Shdr *SymTable = Sym.first; - const Elf_Shdr *StrTableSec = Obj->getSection(SymTable->sh_link); - ErrorOr<StringRef> StrTableOrErr = Obj->getStringTable(StrTableSec); - if (!error(StrTableOrErr.getError())) - TargetName = errorOrDefault(Sym.second->getName(*StrTableOrErr)); + ErrorOr<const Elf_Shdr *> StrTableSec = Obj->getSection(SymTable->sh_link); + if (!error(StrTableSec.getError())) { + ErrorOr<StringRef> StrTableOrErr = Obj->getStringTable(*StrTableSec); + if (!error(StrTableOrErr.getError())) + TargetName = errorOrDefault(Sym.second->getName(*StrTableOrErr)); + } } if (opts::ExpandRelocs) { diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp index db384b05085..9afcedef639 100644 --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -157,7 +157,10 @@ std::error_code ELFDumper<ELFT>::dumpSymbol(const Elf_Sym *Sym, bool IsDynamic, return EC; S.Name = NameOrErr.get(); - const Elf_Shdr *Shdr = Obj.getSection(&*Sym); + ErrorOr<const Elf_Shdr *> ShdrOrErr = Obj.getSection(&*Sym); + if (std::error_code EC = ShdrOrErr.getError()) + return EC; + const Elf_Shdr *Shdr = *ShdrOrErr; if (!Shdr) return obj2yaml_error::success; @@ -183,8 +186,10 @@ std::error_code ELFDumper<ELFT>::dumpRelocation(const Elf_Shdr *Shdr, return obj2yaml_error::success; const Elf_Shdr *SymTab = NamePair.first; - const Elf_Shdr *StrTabSec = Obj.getSection(SymTab->sh_link); - ErrorOr<StringRef> StrTabOrErr = Obj.getStringTable(StrTabSec); + ErrorOr<const Elf_Shdr *> StrTabSec = Obj.getSection(SymTab->sh_link); + if (std::error_code EC = StrTabSec.getError()) + return EC; + ErrorOr<StringRef> StrTabOrErr = Obj.getStringTable(*StrTabSec); if (std::error_code EC = StrTabOrErr.getError()) return EC; StringRef StrTab = *StrTabOrErr; @@ -211,12 +216,13 @@ std::error_code ELFDumper<ELFT>::dumpCommonSection(const Elf_Shdr *Shdr, S.Name = NameOrErr.get(); if (Shdr->sh_link != ELF::SHN_UNDEF) { - if (const Elf_Shdr *LinkSection = Obj.getSection(Shdr->sh_link)) { - NameOrErr = Obj.getSectionName(LinkSection); - if (std::error_code EC = NameOrErr.getError()) - return EC; - S.Link = NameOrErr.get(); - } + ErrorOr<const Elf_Shdr *> LinkSection = Obj.getSection(Shdr->sh_link); + if (std::error_code EC = LinkSection.getError()) + return EC; + NameOrErr = Obj.getSectionName(*LinkSection); + if (std::error_code EC = NameOrErr.getError()) + return EC; + S.Link = NameOrErr.get(); } return obj2yaml_error::success; @@ -229,12 +235,14 @@ ELFDumper<ELFT>::dumpCommonRelocationSection(const Elf_Shdr *Shdr, if (std::error_code EC = dumpCommonSection(Shdr, S)) return EC; - if (const Elf_Shdr *InfoSection = Obj.getSection(Shdr->sh_info)) { - ErrorOr<StringRef> NameOrErr = Obj.getSectionName(InfoSection); - if (std::error_code EC = NameOrErr.getError()) - return EC; - S.Info = NameOrErr.get(); - } + ErrorOr<const Elf_Shdr *> InfoSection = Obj.getSection(Shdr->sh_info); + if (std::error_code EC = InfoSection.getError()) + return EC; + + ErrorOr<StringRef> NameOrErr = Obj.getSectionName(*InfoSection); + if (std::error_code EC = NameOrErr.getError()) + return EC; + S.Info = NameOrErr.get(); return obj2yaml_error::success; } @@ -304,9 +312,13 @@ ErrorOr<ELFYAML::Group *> ELFDumper<ELFT>::dumpGroup(const Elf_Shdr *Shdr) { return EC; // Get sh_info which is the signature. const Elf_Sym *symbol = Obj.getSymbol(Shdr->sh_info); - const Elf_Shdr *symtab = Obj.getSection(Shdr->sh_link); - const Elf_Shdr *StrTabSec = Obj.getSection(symtab->sh_link); - ErrorOr<StringRef> StrTabOrErr = Obj.getStringTable(StrTabSec); + ErrorOr<const Elf_Shdr *> Symtab = Obj.getSection(Shdr->sh_link); + if (std::error_code EC = Symtab.getError()) + return EC; + ErrorOr<const Elf_Shdr *> StrTabSec = Obj.getSection((*Symtab)->sh_link); + if (std::error_code EC = StrTabSec.getError()) + return EC; + ErrorOr<StringRef> StrTabOrErr = Obj.getStringTable(*StrTabSec); if (std::error_code EC = StrTabOrErr.getError()) return EC; StringRef StrTab = *StrTabOrErr; @@ -325,8 +337,10 @@ ErrorOr<ELFYAML::Group *> ELFDumper<ELFT>::dumpGroup(const Elf_Shdr *Shdr) { if (groupMembers[i] == llvm::ELF::GRP_COMDAT) { s.sectionNameOrType = "GRP_COMDAT"; } else { - const Elf_Shdr *sHdr = Obj.getSection(groupMembers[i]); - ErrorOr<StringRef> sectionName = Obj.getSectionName(sHdr); + ErrorOr<const Elf_Shdr *> sHdr = Obj.getSection(groupMembers[i]); + if (std::error_code EC = sHdr.getError()) + return EC; + ErrorOr<StringRef> sectionName = Obj.getSectionName(*sHdr); if (std::error_code ec = sectionName.getError()) return ec; s.sectionNameOrType = *sectionName; |