diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -516,7 +516,12 @@ template Expected ELFObjectFile::getSymbolAddress(DataRefImpl Symb) const { - uint64_t Result = getSymbolValue(Symb); + Expected SymbolValueOrErr = getSymbolValue(Symb); + if (!SymbolValueOrErr) + // TODO: Test this error. + return SymbolValueOrErr.takeError(); + + uint64_t Result = *SymbolValueOrErr; const Elf_Sym *ESym = getSymbol(Symb); switch (ESym->st_shndx) { case ELF::SHN_COMMON: diff --git a/llvm/include/llvm/Object/ObjectFile.h b/llvm/include/llvm/Object/ObjectFile.h --- a/llvm/include/llvm/Object/ObjectFile.h +++ b/llvm/include/llvm/Object/ObjectFile.h @@ -188,7 +188,7 @@ /// Return the value of the symbol depending on the object this can be an /// offset or a virtual address. - uint64_t getValue() const; + Expected getValue() const; /// Get the alignment of this symbol as the actual value (not log 2). uint32_t getAlignment() const; @@ -289,7 +289,7 @@ virtual void getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl &Result) const = 0; - uint64_t getSymbolValue(DataRefImpl Symb) const; + Expected getSymbolValue(DataRefImpl Symb) const; public: ObjectFile() = delete; @@ -390,7 +390,7 @@ return getObject()->getSymbolAddress(getRawDataRefImpl()); } -inline uint64_t SymbolRef::getValue() const { +inline Expected SymbolRef::getValue() const { return getObject()->getSymbolValue(getRawDataRefImpl()); } diff --git a/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp b/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp --- a/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp +++ b/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp @@ -86,9 +86,14 @@ consumeError(SymType.takeError()); continue; } - const uint64_t Addr = Sym.getValue(); + Expected AddrOrErr = Sym.getValue(); + if (!AddrOrErr) { + consumeError(AddrOrErr.takeError()); + continue; + } if (SymType.get() != SymbolRef::Type::ST_Function || - !Gsym.IsValidTextAddress(Addr) || Gsym.hasFunctionInfoForAddress(Addr)) + !Gsym.IsValidTextAddress(*AddrOrErr) || + Gsym.hasFunctionInfoForAddress(*AddrOrErr)) continue; // Function size for MachO files will be 0 constexpr bool NoCopy = false; @@ -102,8 +107,8 @@ // for mach-o files. if (IsMachO) Name->consume_front("_"); - Gsym.addFunctionInfo(FunctionInfo(Addr, size, - Gsym.insertString(*Name, NoCopy))); + Gsym.addFunctionInfo( + FunctionInfo(*AddrOrErr, size, Gsym.insertString(*Name, NoCopy))); } size_t FunctionsAddedCount = Gsym.getNumFunctionInfos() - NumBefore; Log << "Loaded " << FunctionsAddedCount << " functions from symbol table.\n"; diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCOFF.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCOFF.cpp --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCOFF.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCOFF.cpp @@ -76,7 +76,7 @@ uint64_t RuntimeDyldCOFF::getSymbolOffset(const SymbolRef &Sym) { // The value in a relocatable COFF object is the offset. - return Sym.getValue(); + return cantFail(Sym.getValue()); } uint64_t RuntimeDyldCOFF::getDLLImportOffset(unsigned SectionID, StubMap &Stubs, diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -166,7 +166,7 @@ } Expected COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const { - uint64_t Result = getSymbolValue(Ref); + uint64_t Result = cantFail(getSymbolValue(Ref)); COFFSymbolRef Symb = getCOFFSymbol(Ref); int32_t SectionNumber = Symb.getSectionNumber(); diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp --- a/llvm/lib/Object/ObjectFile.cpp +++ b/llvm/lib/Object/ObjectFile.cpp @@ -54,15 +54,15 @@ return *this == **SymSec; } -uint64_t ObjectFile::getSymbolValue(DataRefImpl Ref) const { +Expected ObjectFile::getSymbolValue(DataRefImpl Ref) const { if (Expected FlagsOrErr = getSymbolFlags(Ref)) { if (*FlagsOrErr & SymbolRef::SF_Undefined) return 0; if (*FlagsOrErr & SymbolRef::SF_Common) return getCommonSymbolSize(Ref); } else - // TODO: Actually report errors helpfully. - report_fatal_error(FlagsOrErr.takeError()); + // TODO: Test this error. + return FlagsOrErr.takeError(); return getSymbolValueImpl(Ref); } diff --git a/llvm/lib/Object/SymbolSize.cpp b/llvm/lib/Object/SymbolSize.cpp --- a/llvm/lib/Object/SymbolSize.cpp +++ b/llvm/lib/Object/SymbolSize.cpp @@ -61,8 +61,11 @@ unsigned SymNum = 0; for (symbol_iterator I = O.symbol_begin(), E = O.symbol_end(); I != E; ++I) { SymbolRef Sym = *I; - uint64_t Value = Sym.getValue(); - Addresses.push_back({I, Value, SymNum, getSymbolSectionID(O, Sym)}); + Expected ValueOrErr = Sym.getValue(); + if (!ValueOrErr) + // TODO: Actually report errors helpfully. + report_fatal_error(ValueOrErr.takeError()); + Addresses.push_back({I, *ValueOrErr, SymNum, getSymbolSectionID(O, Sym)}); ++SymNum; } for (SectionRef Sec : O.sections()) { diff --git a/llvm/lib/XRay/InstrumentationMap.cpp b/llvm/lib/XRay/InstrumentationMap.cpp --- a/llvm/lib/XRay/InstrumentationMap.cpp +++ b/llvm/lib/XRay/InstrumentationMap.cpp @@ -114,7 +114,11 @@ if (SupportsRelocation && SupportsRelocation(Reloc.getType())) { auto AddendOrErr = object::ELFRelocationRef(Reloc).getAddend(); auto A = AddendOrErr ? *AddendOrErr : 0; - uint64_t resolved = Resolver(Reloc, Reloc.getSymbol()->getValue(), A); + Expected ValueOrErr = Reloc.getSymbol()->getValue(); + if (!ValueOrErr) + // TODO: Test this error. + return ValueOrErr.takeError(); + uint64_t resolved = Resolver(Reloc, *ValueOrErr, A); Relocs.insert({Reloc.getOffset(), resolved}); } else if (Reloc.getType() == RelativeRelocation) { if (auto AddendOrErr = object::ELFRelocationRef(Reloc).getAddend()) diff --git a/llvm/tools/dsymutil/DebugMap.cpp b/llvm/tools/dsymutil/DebugMap.cpp --- a/llvm/tools/dsymutil/DebugMap.cpp +++ b/llvm/tools/dsymutil/DebugMap.cpp @@ -254,7 +254,12 @@ << toString(std::move(Err)) << '\n'; } else { for (const auto &Sym : Object->symbols()) { - uint64_t Address = Sym.getValue(); + Expected AddressOrErr = Sym.getValue(); + if (!AddressOrErr) { + // TODO: Actually report errors helpfully. + consumeError(AddressOrErr.takeError()); + continue; + } Expected Name = Sym.getName(); Expected FlagsOrErr = Sym.getFlags(); if (!Name || !FlagsOrErr || @@ -266,7 +271,7 @@ consumeError(Name.takeError()); continue; } - SymbolAddresses[*Name] = Address; + SymbolAddresses[*Name] = *AddressOrErr; } } } diff --git a/llvm/tools/dsymutil/MachODebugMapParser.cpp b/llvm/tools/dsymutil/MachODebugMapParser.cpp --- a/llvm/tools/dsymutil/MachODebugMapParser.cpp +++ b/llvm/tools/dsymutil/MachODebugMapParser.cpp @@ -478,7 +478,7 @@ CurrentObjectAddresses.clear(); for (auto Sym : Obj.symbols()) { - uint64_t Addr = Sym.getValue(); + uint64_t Addr = cantFail(Sym.getValue()); Expected Name = Sym.getName(); if (!Name) { // TODO: Actually report errors helpfully. @@ -562,7 +562,7 @@ Section = *SectionOrErr; if (Section == MainBinary.section_end() || Section->isText()) continue; - uint64_t Addr = Sym.getValue(); + uint64_t Addr = cantFail(Sym.getValue()); Expected NameOrErr = Sym.getName(); if (!NameOrErr) { // TODO: Actually report errors helpfully. diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -230,8 +230,10 @@ if (!BTypeOrErr) reportError(BTypeOrErr.takeError(), B.getObject()->getFileName()); SymbolRef::Type BType = *BTypeOrErr; - uint64_t AAddr = (AType != SymbolRef::ST_Function) ? 0 : A.getValue(); - uint64_t BAddr = (BType != SymbolRef::ST_Function) ? 0 : B.getValue(); + uint64_t AAddr = + (AType != SymbolRef::ST_Function) ? 0 : cantFail(A.getValue()); + uint64_t BAddr = + (BType != SymbolRef::ST_Function) ? 0 : cantFail(B.getValue()); return AAddr < BAddr; } }; @@ -1267,7 +1269,7 @@ SymbolRef::Type ST = unwrapOrError(Symbol.getType(), FileName); if (ST == SymbolRef::ST_Function || ST == SymbolRef::ST_Data || ST == SymbolRef::ST_Other) { - uint64_t Address = Symbol.getValue(); + uint64_t Address = cantFail(Symbol.getValue()); StringRef SymName = unwrapOrError(Symbol.getName(), FileName); if (!SymName.startswith(".objc")) (*AddrMap)[Address] = SymName; @@ -3352,7 +3354,7 @@ // and return its name. const char *SymbolName = nullptr; if (reloc_found && isExtern) { - n_value = Symbol.getValue(); + n_value = cantFail(Symbol.getValue()); StringRef Name = unwrapOrError(Symbol.getName(), info->O->getFileName()); if (!Name.empty()) { SymbolName = Name.data(); @@ -6908,7 +6910,7 @@ if (info->O->getAnyRelocationPCRel(RE)) { unsigned Type = info->O->getAnyRelocationType(RE); if (Type == MachO::X86_64_RELOC_SIGNED) { - ReferenceValue = Symbol.getValue(); + ReferenceValue = cantFail(Symbol.getValue()); } } } @@ -7449,7 +7451,7 @@ unwrapOrError(Symbol.getType(), MachOOF->getFileName()); if (ST == SymbolRef::ST_Function || ST == SymbolRef::ST_Data || ST == SymbolRef::ST_Other) { - uint64_t Address = Symbol.getValue(); + uint64_t Address = cantFail(Symbol.getValue()); StringRef SymName = unwrapOrError(Symbol.getName(), MachOOF->getFileName()); AddrMap[Address] = SymName; @@ -7528,7 +7530,7 @@ // Start at the address of the symbol relative to the section's address. uint64_t SectSize = Sections[SectIdx].getSize(); - uint64_t Start = Symbols[SymIdx].getValue(); + uint64_t Start = cantFail(Symbols[SymIdx].getValue()); uint64_t SectionAddress = Sections[SectIdx].getAddress(); Start -= SectionAddress; @@ -7549,7 +7551,7 @@ if (NextSymType == SymbolRef::ST_Function) { containsNextSym = Sections[SectIdx].containsSymbol(Symbols[NextSymIdx]); - NextSym = Symbols[NextSymIdx].getValue(); + NextSym = cantFail(Symbols[NextSymIdx].getValue()); NextSym -= SectionAddress; break; } @@ -8208,7 +8210,7 @@ if (Section == Obj->section_end()) continue; - uint64_t Addr = SymRef.getValue(); + uint64_t Addr = cantFail(SymRef.getValue()); Symbols.insert(std::make_pair(Addr, SymRef)); }