diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h index 5fd2d38793c1..d5ce410d58c3 100644 --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -111,13 +111,10 @@ public: ErrorOr sections() const; - Elf_Sym_Range symbols(const Elf_Shdr *Sec) const { + ErrorOr symbols(const Elf_Shdr *Sec) const { if (!Sec) return makeArrayRef(nullptr, nullptr); - auto V = getSectionContentsAsArray(Sec); - if (!V) - report_fatal_error(V.getError().message()); - return *V; + return getSectionContentsAsArray(Sec); } Elf_Rela_Range relas(const Elf_Shdr *Sec) const { @@ -164,7 +161,10 @@ public: ErrorOr getSymbol(const Elf_Shdr *Sec, uint32_t Index) const { - Elf_Sym_Range Symbols = symbols(Sec); + auto SymtabOrErr = symbols(Sec); + if (std::error_code EC = SymtabOrErr.getError()) + return object_error::parse_failed; + Elf_Sym_Range Symbols = *SymtabOrErr; if (Index >= Symbols.size()) return object_error::invalid_symbol_index; return &Symbols[Index]; @@ -195,7 +195,10 @@ template uint32_t ELFFile::getExtendedSymbolTableIndex( const Elf_Sym *Sym, const Elf_Shdr *SymTab, ArrayRef ShndxTable) const { - return getExtendedSymbolTableIndex(Sym, symbols(SymTab).begin(), ShndxTable); + auto SymsOrErr = symbols(SymTab); + if (std::error_code EC = SymsOrErr.getError()) + report_fatal_error(EC.message()); + return getExtendedSymbolTableIndex(Sym, SymsOrErr->begin(), ShndxTable); } template diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index 179f07a76cc3..ad1c2e12ce1e 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -507,8 +507,8 @@ uint32_t ELFObjectFile::getSymbolFlags(DataRefImpl Sym) const { Result |= SymbolRef::SF_Absolute; if (ESym->getType() == ELF::STT_FILE || ESym->getType() == ELF::STT_SECTION || - ESym == EF.symbols(DotSymtabSec).begin() || - ESym == EF.symbols(DotDynSymSec).begin()) + ESym == (*EF.symbols(DotSymtabSec)).begin() || + ESym == (*EF.symbols(DotDynSymSec)).begin()) Result |= SymbolRef::SF_FormatSpecific; if (EF.getHeader()->e_machine == ELF::EM_ARM) { diff --git a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h index a85f987def0c..1e0e8714b6e3 100644 --- a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h +++ b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h @@ -353,7 +353,7 @@ PrinterContext::FunctionAtAddress(unsigned Section, error(StrTableOrErr.getError()); StringRef StrTable = *StrTableOrErr; - for (const Elf_Sym &Sym : ELF->symbols(Symtab)) + for (const Elf_Sym &Sym : unwrapOrError(ELF->symbols(Symtab))) if (Sym.st_shndx == Section && Sym.st_value == Address && Sym.getType() == ELF::STT_FUNC) { auto NameOrErr = Sym.getName(StrTable); diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 845abf9b5fe8..f50ecc157d52 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -246,7 +246,7 @@ void ELFDumper::printSymbolsHelper(bool IsDynamic) const { if (!DotSymtabSec) return; StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec)); - Syms = Obj->symbols(DotSymtabSec); + Syms = unwrapOrError(Obj->symbols(DotSymtabSec)); SymtabName = unwrapOrError(Obj->getSectionName(DotSymtabSec)); Entries = DotSymtabSec->getEntityCount(); } @@ -3494,11 +3494,12 @@ template void LLVMStyle::printSections(const ELFO *Obj) { const Elf_Shdr *Symtab = this->dumper()->getDotSymtabSec(); StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); - for (const Elf_Sym &Sym : Obj->symbols(Symtab)) { + for (const Elf_Sym &Sym : unwrapOrError(Obj->symbols(Symtab))) { const Elf_Shdr *SymSec = unwrapOrError( Obj->getSection(&Sym, Symtab, this->dumper()->getShndxTable())); if (SymSec == &Sec) - printSymbol(Obj, &Sym, Obj->symbols(Symtab).begin(), StrTable, false); + printSymbol(Obj, &Sym, unwrapOrError(Obj->symbols(Symtab)).begin(), + StrTable, false); } } diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp index bc790e4faac2..8da8aa10c118 100644 --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -145,7 +145,10 @@ ErrorOr ELFDumper::dump() { StringRef StrTable = *StrTableOrErr; bool IsFirstSym = true; - for (const Elf_Sym &Sym : Obj.symbols(Symtab)) { + auto SymtabOrErr = Obj.symbols(Symtab); + if (std::error_code EC = SymtabOrErr.getError()) + return EC; + for (const Elf_Sym &Sym : *SymtabOrErr) { if (IsFirstSym) { IsFirstSym = false; continue;