From 317de7ce5b4a6c3dfbc24c3234c1082a8dcf9130 Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Fri, 24 Jun 2016 18:24:42 +0000 Subject: [PATCH] =?UTF-8?q?Thread=20Expected<...>=20up=20from=20libObject?= =?UTF-8?q?=E2=80=99s=20getSymbolAddress()=20for=20symbols=20to=20allow=20?= =?UTF-8?q?a=20good=20error=20message=20to=20be=20produced.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is nearly the last libObject interface that used ErrorOr and the last one that appears in llvm/include/llvm/Object/MachO.h . For Mach-O objects this is just a clean up because it’s version of getSymbolAddress() can’t return an error. I will leave it to the experts on COFF and ELF to actually add meaning full error messages in their tests if they wish. And also leave it to these experts to change the last two ErrorOr interfaces in llvm/include/llvm/Object/ObjectFile.h for createCOFFObjectFile() and createELFObjectFile() if they wish. Since there are no test cases for COFF and ELF error cases with respect to getSymbolAddress() in the test suite this is no functional change (NFC). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273701 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/COFF.h | 2 +- include/llvm/Object/ELFObjectFile.h | 6 +-- include/llvm/Object/MachO.h | 2 +- include/llvm/Object/ObjectFile.h | 6 +-- lib/DebugInfo/DWARF/DWARFContext.cpp | 10 +++-- .../Symbolize/SymbolizableObjectFile.cpp | 6 +-- .../RuntimeDyld/RuntimeDyld.cpp | 8 ++-- lib/Object/COFFObjectFile.cpp | 4 +- lib/Object/MachOObjectFile.cpp | 2 +- lib/Object/Object.cpp | 11 ++++-- tools/llvm-cxxdump/llvm-cxxdump.cpp | 4 +- tools/llvm-nm/llvm-nm.cpp | 6 ++- tools/llvm-objdump/COFFDump.cpp | 6 +-- tools/llvm-objdump/llvm-objdump.cpp | 20 ++++++---- tools/llvm-readobj/ARMWinEHPrinter.cpp | 37 ++++++++++++++----- tools/llvm-readobj/Win64EHDumper.cpp | 6 +-- tools/llvm-rtdyld/llvm-rtdyld.cpp | 7 +++- tools/sancov/sancov.cc | 4 +- 18 files changed, 92 insertions(+), 55 deletions(-) diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index ebf9bb82f38..a87f7651a2e 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -722,7 +722,7 @@ public: protected: void moveSymbolNext(DataRefImpl &Symb) const override; Expected getSymbolName(DataRefImpl Symb) const override; - ErrorOr getSymbolAddress(DataRefImpl Symb) const override; + Expected getSymbolAddress(DataRefImpl Symb) const override; uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override; uint32_t getSymbolFlags(DataRefImpl Symb) const override; diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index f93008810a6..6dcd2d48681 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -207,7 +207,7 @@ protected: void moveSymbolNext(DataRefImpl &Symb) const override; Expected getSymbolName(DataRefImpl Symb) const override; - ErrorOr getSymbolAddress(DataRefImpl Symb) const override; + Expected getSymbolAddress(DataRefImpl Symb) const override; uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; uint32_t getSymbolAlignment(DataRefImpl Symb) const override; uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override; @@ -397,7 +397,7 @@ uint64_t ELFObjectFile::getSymbolValueImpl(DataRefImpl Symb) const { } template -ErrorOr +Expected ELFObjectFile::getSymbolAddress(DataRefImpl Symb) const { uint64_t Result = getSymbolValue(Symb); const Elf_Sym *ESym = getSymbol(Symb); @@ -415,7 +415,7 @@ ELFObjectFile::getSymbolAddress(DataRefImpl Symb) const { ErrorOr SectionOrErr = EF.getSection(ESym, SymTab, ShndxTable); if (std::error_code EC = SectionOrErr.getError()) - return EC; + return errorCodeToError(EC); const Elf_Shdr *Section = *SectionOrErr; if (Section) Result += Section->sh_addr; diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 53915a9f0b5..7906db1e8a7 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -205,7 +205,7 @@ public: std::error_code getIndirectName(DataRefImpl Symb, StringRef &Res) const; unsigned getSectionType(SectionRef Sec) const; - ErrorOr getSymbolAddress(DataRefImpl Symb) const override; + Expected getSymbolAddress(DataRefImpl Symb) const override; uint32_t getSymbolAlignment(DataRefImpl Symb) const override; uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override; Expected getSymbolType(DataRefImpl Symb) const override; diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index 838495657b9..6272a5f056e 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -135,7 +135,7 @@ public: Expected getName() const; /// Returns the symbol virtual address (i.e. address at which it will be /// mapped). - ErrorOr getAddress() const; + Expected getAddress() const; /// Return the value of the symbol depending on the object this can be an /// offset or a virtual address. @@ -198,7 +198,7 @@ protected: virtual Expected getSymbolName(DataRefImpl Symb) const = 0; std::error_code printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override; - virtual ErrorOr getSymbolAddress(DataRefImpl Symb) const = 0; + virtual Expected getSymbolAddress(DataRefImpl Symb) const = 0; virtual uint64_t getSymbolValueImpl(DataRefImpl Symb) const = 0; virtual uint32_t getSymbolAlignment(DataRefImpl Symb) const; virtual uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const = 0; @@ -312,7 +312,7 @@ inline Expected SymbolRef::getName() const { return getObject()->getSymbolName(getRawDataRefImpl()); } -inline ErrorOr SymbolRef::getAddress() const { +inline Expected SymbolRef::getAddress() const { return getObject()->getSymbolAddress(getRawDataRefImpl()); } diff --git a/lib/DebugInfo/DWARF/DWARFContext.cpp b/lib/DebugInfo/DWARF/DWARFContext.cpp index 27b8c564d91..3f03e63ce03 100644 --- a/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -793,10 +793,14 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj, // First calculate the address of the symbol or section as it appears // in the objct file if (Sym != Obj.symbol_end()) { - ErrorOr SymAddrOrErr = Sym->getAddress(); - if (std::error_code EC = SymAddrOrErr.getError()) { + Expected SymAddrOrErr = Sym->getAddress(); + if (!SymAddrOrErr) { + std::string Buf; + raw_string_ostream OS(Buf); + logAllUnhandledErrors(SymAddrOrErr.takeError(), OS, ""); + OS.flush(); errs() << "error: failed to compute symbol address: " - << EC.message() << '\n'; + << Buf << '\n'; continue; } SymAddr = *SymAddrOrErr; diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index a66722cb2c5..9661b4d85e7 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -125,9 +125,9 @@ std::error_code SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol, SymbolRef::Type SymbolType = *SymbolTypeOrErr; if (SymbolType != SymbolRef::ST_Function && SymbolType != SymbolRef::ST_Data) return std::error_code(); - ErrorOr SymbolAddressOrErr = Symbol.getAddress(); - if (auto EC = SymbolAddressOrErr.getError()) - return EC; + Expected SymbolAddressOrErr = Symbol.getAddress(); + if (!SymbolAddressOrErr) + return errorToErrorCode(SymbolAddressOrErr.takeError()); uint64_t SymbolAddress = *SymbolAddressOrErr; if (OpdExtractor) { // For big-endian PowerPC64 ELF, symbols in the .opd section refer to diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 4a282cb66e5..dcbcec8c1d9 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -163,9 +163,9 @@ void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress, static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result) { - ErrorOr AddressOrErr = Sym.getAddress(); - if (std::error_code EC = AddressOrErr.getError()) - return errorCodeToError(EC); + Expected AddressOrErr = Sym.getAddress(); + if (!AddressOrErr) + return AddressOrErr.takeError(); Result = *AddressOrErr - Sec.getAddress(); return Error::success(); } @@ -236,7 +236,7 @@ RuntimeDyldImpl::loadObjectImpl(const object::ObjectFile &Obj) { if (auto AddrOrErr = I->getAddress()) Addr = *AddrOrErr; else - return errorCodeToError(AddrOrErr.getError()); + return AddrOrErr.takeError(); unsigned SectionID = AbsoluteSymbolSection; diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 28627cd1d42..878b93fcda0 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -157,7 +157,7 @@ uint64_t COFFObjectFile::getSymbolValueImpl(DataRefImpl Ref) const { return getCOFFSymbol(Ref).getValue(); } -ErrorOr COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const { +Expected COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const { uint64_t Result = getSymbolValue(Ref); COFFSymbolRef Symb = getCOFFSymbol(Ref); int32_t SectionNumber = Symb.getSectionNumber(); @@ -168,7 +168,7 @@ ErrorOr COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const { const coff_section *Section = nullptr; if (std::error_code EC = getSection(SectionNumber, Section)) - return EC; + return errorCodeToError(EC); Result += Section->VirtualAddress; // The section VirtualAddress does not include ImageBase, and we want to diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index d7ec3e57a58..3c88f9fb382 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -473,7 +473,7 @@ uint64_t MachOObjectFile::getSymbolValueImpl(DataRefImpl Sym) const { return getNValue(Sym); } -ErrorOr MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const { +Expected MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const { return getSymbolValue(Sym); } diff --git a/lib/Object/Object.cpp b/lib/Object/Object.cpp index 6777b322da3..6df481b060e 100644 --- a/lib/Object/Object.cpp +++ b/lib/Object/Object.cpp @@ -195,9 +195,14 @@ const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) { } uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) { - ErrorOr Ret = (*unwrap(SI))->getAddress(); - if (std::error_code EC = Ret.getError()) - report_fatal_error(EC.message()); + Expected Ret = (*unwrap(SI))->getAddress(); + if (!Ret) { + std::string Buf; + raw_string_ostream OS(Buf); + logAllUnhandledErrors(Ret.takeError(), OS, ""); + OS.flush(); + report_fatal_error(Buf); + } return *Ret; } diff --git a/tools/llvm-cxxdump/llvm-cxxdump.cpp b/tools/llvm-cxxdump/llvm-cxxdump.cpp index 16ea629260d..0c408ccb5ba 100644 --- a/tools/llvm-cxxdump/llvm-cxxdump.cpp +++ b/tools/llvm-cxxdump/llvm-cxxdump.cpp @@ -190,8 +190,8 @@ static void dumpCXXData(const ObjectFile *Obj) { continue; StringRef SecContents; error(Sec.getContents(SecContents)); - ErrorOr SymAddressOrErr = Sym.getAddress(); - error(SymAddressOrErr.getError()); + Expected SymAddressOrErr = Sym.getAddress(); + error(errorToErrorCode(SymAddressOrErr.takeError())); uint64_t SymAddress = *SymAddressOrErr; uint64_t SecAddress = Sec.getAddress(); uint64_t SecSize = Sec.getSize(); diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index f31c3180811..9661f8e2020 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -1015,9 +1015,11 @@ dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName, } if (PrintAddress && isa(Obj)) { SymbolRef SymRef(Sym); - ErrorOr AddressOrErr = SymRef.getAddress(); - if (error(AddressOrErr.getError())) + Expected AddressOrErr = SymRef.getAddress(); + if (!AddressOrErr) { + consumeError(AddressOrErr.takeError()); break; + } S.Address = *AddressOrErr; } S.TypeChar = getNMTypeChar(Obj, Sym); diff --git a/tools/llvm-objdump/COFFDump.cpp b/tools/llvm-objdump/COFFDump.cpp index 62c9edcbe93..4f1b9b11913 100644 --- a/tools/llvm-objdump/COFFDump.cpp +++ b/tools/llvm-objdump/COFFDump.cpp @@ -161,9 +161,9 @@ static std::error_code resolveSectionAndAddress(const COFFObjectFile *Obj, const SymbolRef &Sym, const coff_section *&ResolvedSection, uint64_t &ResolvedAddr) { - ErrorOr ResolvedAddrOrErr = Sym.getAddress(); - if (std::error_code EC = ResolvedAddrOrErr.getError()) - return EC; + Expected ResolvedAddrOrErr = Sym.getAddress(); + if (!ResolvedAddrOrErr) + return errorToErrorCode(ResolvedAddrOrErr.takeError()); ResolvedAddr = *ResolvedAddrOrErr; Expected Iter = Sym.getSection(); if (!Iter) diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 3beb01ad6eb..3c536af5713 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -649,9 +649,14 @@ static void printRelocationTargetName(const MachOObjectFile *O, for (const SymbolRef &Symbol : O->symbols()) { std::error_code ec; - ErrorOr Addr = Symbol.getAddress(); - if ((ec = Addr.getError())) - report_fatal_error(ec.message()); + Expected Addr = Symbol.getAddress(); + if (!Addr) { + std::string Buf; + raw_string_ostream OS(Buf); + logAllUnhandledErrors(Addr.takeError(), OS, ""); + OS.flush(); + report_fatal_error(Buf); + } if (*Addr != Val) continue; Expected Name = Symbol.getName(); @@ -992,8 +997,8 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { typedef std::vector> SectionSymbolsTy; std::map AllSymbols; for (const SymbolRef &Symbol : Obj->symbols()) { - ErrorOr AddressOrErr = Symbol.getAddress(); - error(AddressOrErr.getError()); + Expected AddressOrErr = Symbol.getAddress(); + error(errorToErrorCode(AddressOrErr.takeError())); uint64_t Address = *AddressOrErr; Expected Name = Symbol.getName(); @@ -1389,8 +1394,9 @@ void llvm::PrintSymbolTable(const ObjectFile *o, StringRef ArchiveName, return; } for (const SymbolRef &Symbol : o->symbols()) { - ErrorOr AddressOrError = Symbol.getAddress(); - error(AddressOrError.getError()); + Expected AddressOrError = Symbol.getAddress(); + if (!AddressOrError) + report_error(ArchiveName, o->getFileName(), AddressOrError.takeError()); uint64_t Address = *AddressOrError; Expected TypeOrError = Symbol.getType(); if (!TypeOrError) diff --git a/tools/llvm-readobj/ARMWinEHPrinter.cpp b/tools/llvm-readobj/ARMWinEHPrinter.cpp index 9e14e69015d..1a033b1eb42 100644 --- a/tools/llvm-readobj/ARMWinEHPrinter.cpp +++ b/tools/llvm-readobj/ARMWinEHPrinter.cpp @@ -204,9 +204,9 @@ ErrorOr Decoder::getSymbol(const COFFObjectFile &COFF, if (FunctionOnly && *Type != SymbolRef::ST_Function) continue; - ErrorOr Address = Symbol.getAddress(); - if (std::error_code EC = Address.getError()) - return EC; + Expected Address = Symbol.getAddress(); + if (!Address) + return errorToErrorCode(Address.takeError()); if (*Address == VA) return Symbol; } @@ -618,9 +618,14 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF, report_fatal_error(Buf); } FunctionName = *FunctionNameOrErr; - ErrorOr FunctionAddressOrErr = Function->getAddress(); - if (std::error_code EC = FunctionAddressOrErr.getError()) - report_fatal_error(EC.message()); + Expected FunctionAddressOrErr = Function->getAddress(); + if (!FunctionAddressOrErr) { + std::string Buf; + llvm::raw_string_ostream OS(Buf); + logAllUnhandledErrors(FunctionAddressOrErr.takeError(), OS, ""); + OS.flush(); + report_fatal_error(Buf); + } FunctionAddress = *FunctionAddressOrErr; } else { const pe32_header *PEHeader; @@ -641,9 +646,14 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF, report_fatal_error(Buf); } - ErrorOr AddressOrErr = XDataRecord->getAddress(); - if (std::error_code EC = AddressOrErr.getError()) - report_fatal_error(EC.message()); + Expected AddressOrErr = XDataRecord->getAddress(); + if (!AddressOrErr) { + std::string Buf; + llvm::raw_string_ostream OS(Buf); + logAllUnhandledErrors(AddressOrErr.takeError(), OS, ""); + OS.flush(); + report_fatal_error(Buf); + } uint64_t Address = *AddressOrErr; SW.printString("ExceptionRecord", formatSymbol(*Name, Address)); @@ -698,7 +708,14 @@ bool Decoder::dumpPackedEntry(const object::COFFObjectFile &COFF, report_fatal_error(Buf); } FunctionName = *FunctionNameOrErr; - ErrorOr FunctionAddressOrErr = Function->getAddress(); + Expected FunctionAddressOrErr = Function->getAddress(); + if (!FunctionAddressOrErr) { + std::string Buf; + llvm::raw_string_ostream OS(Buf); + logAllUnhandledErrors(FunctionAddressOrErr.takeError(), OS, ""); + OS.flush(); + report_fatal_error(Buf); + } FunctionAddress = *FunctionAddressOrErr; } else { const pe32_header *PEHeader; diff --git a/tools/llvm-readobj/Win64EHDumper.cpp b/tools/llvm-readobj/Win64EHDumper.cpp index f797d4baa40..f7e56b36154 100644 --- a/tools/llvm-readobj/Win64EHDumper.cpp +++ b/tools/llvm-readobj/Win64EHDumper.cpp @@ -148,9 +148,9 @@ static std::error_code resolveRelocation(const Dumper::Context &Ctx, Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData)) return EC; - ErrorOr ResolvedAddressOrErr = Symbol.getAddress(); - if (std::error_code EC = ResolvedAddressOrErr.getError()) - return EC; + Expected ResolvedAddressOrErr = Symbol.getAddress(); + if (!ResolvedAddressOrErr) + return errorToErrorCode(ResolvedAddressOrErr.takeError()); ResolvedAddress = *ResolvedAddressOrErr; Expected SI = Symbol.getSection(); diff --git a/tools/llvm-rtdyld/llvm-rtdyld.cpp b/tools/llvm-rtdyld/llvm-rtdyld.cpp index 249dbd28674..b1460e35de8 100644 --- a/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/tools/llvm-rtdyld/llvm-rtdyld.cpp @@ -349,9 +349,12 @@ static int printLineInfoForInput(bool LoadObjects, bool UseDebugObj) { consumeError(Name.takeError()); continue; } - ErrorOr AddrOrErr = Sym.getAddress(); - if (!AddrOrErr) + Expected AddrOrErr = Sym.getAddress(); + if (!AddrOrErr) { + // TODO: Actually report errors helpfully. + consumeError(AddrOrErr.takeError()); continue; + } uint64_t Addr = *AddrOrErr; uint64_t Size = P.second; diff --git a/tools/sancov/sancov.cc b/tools/sancov/sancov.cc index 4f8df41f2f1..8423d29e751 100644 --- a/tools/sancov/sancov.cc +++ b/tools/sancov/sancov.cc @@ -321,8 +321,8 @@ findSanitizerCovFunctions(const object::ObjectFile &O) { std::set Result; for (const object::SymbolRef &Symbol : O.symbols()) { - ErrorOr AddressOrErr = Symbol.getAddress(); - FailIfError(AddressOrErr); + Expected AddressOrErr = Symbol.getAddress(); + FailIfError(errorToErrorCode(AddressOrErr.takeError())); Expected NameOrErr = Symbol.getName(); FailIfError(errorToErrorCode(NameOrErr.takeError()));