diff options
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/Object/Object.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/Object/ObjectFile.cpp | 6 |
4 files changed, 34 insertions, 14 deletions
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 71037e857f4..a00d0c43e50 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -144,12 +144,12 @@ void COFFObjectFile::moveSymbolNext(DataRefImpl &Ref) const { } } -ErrorOr<StringRef> COFFObjectFile::getSymbolName(DataRefImpl Ref) const { +Expected<StringRef> COFFObjectFile::getSymbolName(DataRefImpl Ref) const { COFFSymbolRef Symb = getCOFFSymbol(Ref); StringRef Result; std::error_code EC = getSymbolName(Symb, Result); if (EC) - return EC; + return errorCodeToError(EC); return Result; } diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index deb7f9cece3..41c9a5239a6 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -46,12 +46,11 @@ malformedError(std::string FileName, std::string Msg, ECOverride); } - // FIXME: Remove ECOverride once Error has been plumbed down to obj tool code. static Error -malformedError(const MachOObjectFile &Obj, std::string Msg, +malformedError(const MachOObjectFile &Obj, Twine Msg, object_error ECOverride = object_error::parse_failed) { - return malformedError(Obj.getFileName(), std::move(Msg), ECOverride); + return malformedError(Obj.getFileName(), std::move(Msg.str()), ECOverride); } // FIXME: Replace all uses of this function with getStructOrErr. @@ -444,12 +443,16 @@ void MachOObjectFile::moveSymbolNext(DataRefImpl &Symb) const { Symb.p += SymbolTableEntrySize; } -ErrorOr<StringRef> MachOObjectFile::getSymbolName(DataRefImpl Symb) const { +Expected<StringRef> MachOObjectFile::getSymbolName(DataRefImpl Symb) const { StringRef StringTable = getStringTableData(); MachO::nlist_base Entry = getSymbolTableEntryBase(this, Symb); const char *Start = &StringTable.data()[Entry.n_strx]; - if (Start < getData().begin() || Start >= getData().end()) - return object_error::parse_failed; + if (Start < getData().begin() || Start >= getData().end()) { + return malformedError(*this, Twine("truncated or malformed object (bad " + "string index: ") + Twine(Entry.n_strx) + Twine(" for " + "symbol at index ") + Twine(getSymbolIndex(Symb)) + + Twine(")")); + } return StringRef(Start); } @@ -1108,6 +1111,18 @@ basic_symbol_iterator MachOObjectFile::getSymbolByIndex(unsigned Index) const { return basic_symbol_iterator(SymbolRef(DRI, this)); } +uint64_t MachOObjectFile::getSymbolIndex(DataRefImpl Symb) const { + MachO::symtab_command Symtab = getSymtabLoadCommand(); + if (!SymtabLoadCmd) + report_fatal_error("getSymbolIndex() called with no symbol table symbol"); + unsigned SymbolTableEntrySize = + is64Bit() ? sizeof(MachO::nlist_64) : sizeof(MachO::nlist); + DataRefImpl DRIstart; + DRIstart.p = reinterpret_cast<uintptr_t>(getPtr(this, Symtab.symoff)); + uint64_t Index = (Symb.p - DRIstart.p) / SymbolTableEntrySize; + return Index; +} + section_iterator MachOObjectFile::section_begin() const { DataRefImpl DRI; return section_iterator(SectionRef(DRI, this)); diff --git a/llvm/lib/Object/Object.cpp b/llvm/lib/Object/Object.cpp index 4932f233f17..58d8fa08235 100644 --- a/llvm/lib/Object/Object.cpp +++ b/llvm/lib/Object/Object.cpp @@ -178,9 +178,14 @@ void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI) { // SymbolRef accessors const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) { - ErrorOr<StringRef> Ret = (*unwrap(SI))->getName(); - if (std::error_code EC = Ret.getError()) - report_fatal_error(EC.message()); + Expected<StringRef> Ret = (*unwrap(SI))->getName(); + if (!Ret) { + std::string Buf; + raw_string_ostream OS(Buf); + logAllUnhandledErrors(Ret.takeError(), OS, ""); + OS.flush(); + report_fatal_error(Buf); + } return Ret->data(); } diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp index 31ec22bd2e9..27a93688d5d 100644 --- a/llvm/lib/Object/ObjectFile.cpp +++ b/llvm/lib/Object/ObjectFile.cpp @@ -46,9 +46,9 @@ uint64_t ObjectFile::getSymbolValue(DataRefImpl Ref) const { std::error_code ObjectFile::printSymbolName(raw_ostream &OS, DataRefImpl Symb) const { - ErrorOr<StringRef> Name = getSymbolName(Symb); - if (std::error_code EC = Name.getError()) - return EC; + Expected<StringRef> Name = getSymbolName(Symb); + if (!Name) + return errorToErrorCode(Name.takeError()); OS << *Name; return std::error_code(); } |