diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-02 20:55:21 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-02 20:55:21 +0000 |
commit | 5d0c2ffadf84839b951f12a23a163acbd8162d05 (patch) | |
tree | 664f4d3c3de6e77a695a2feb4555d261cfc9d9ab /llvm/tools/llvm-readobj | |
parent | 4dc5adc731a7a157e06c78295de0f1b41846edb3 (diff) | |
download | bcm5719-llvm-5d0c2ffadf84839b951f12a23a163acbd8162d05.tar.gz bcm5719-llvm-5d0c2ffadf84839b951f12a23a163acbd8162d05.zip |
Return ErrorOr from SymbolRef::getName.
This function can really fail since the string table offset can be out of
bounds.
Using ErrorOr makes sure the error is checked.
Hopefully a lot of the boilerplate code in tools/* can go away once we have
a diagnostic manager in Object.
llvm-svn: 241297
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp | 27 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 12 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/MachODumper.cpp | 8 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/Win64EHDumper.cpp | 20 |
4 files changed, 41 insertions, 26 deletions
diff --git a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp b/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp index 515272ead77..a1ea79f3688 100644 --- a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp +++ b/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp @@ -567,12 +567,12 @@ bool Decoder::dumpXDataRecord(const COFFObjectFile &COFF, if (!Symbol) Symbol = getSymbol(COFF, Address, /*FunctionOnly=*/true); - StringRef Name; - if (Symbol) - Symbol->getName(Name); + ErrorOr<StringRef> Name = Symbol->getName(); + if (std::error_code EC = Name.getError()) + report_fatal_error(EC.message()); ListScope EHS(SW, "ExceptionHandler"); - SW.printString("Routine", formatSymbol(Name, Address)); + SW.printString("Routine", formatSymbol(*Name, Address)); SW.printHex("Parameter", Parameter); } @@ -601,7 +601,10 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF, StringRef FunctionName; uint64_t FunctionAddress; if (Function) { - Function->getName(FunctionName); + ErrorOr<StringRef> FunctionNameOrErr = Function->getName(); + if (std::error_code EC = FunctionNameOrErr.getError()) + report_fatal_error(EC.message()); + FunctionName = *FunctionNameOrErr; Function->getAddress(FunctionAddress); } else { const pe32_header *PEHeader; @@ -613,13 +616,14 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF, SW.printString("Function", formatSymbol(FunctionName, FunctionAddress)); if (XDataRecord) { - StringRef Name; - uint64_t Address; + ErrorOr<StringRef> Name = XDataRecord->getName(); + if (std::error_code EC = Name.getError()) + report_fatal_error(EC.message()); - XDataRecord->getName(Name); + uint64_t Address; XDataRecord->getAddress(Address); - SW.printString("ExceptionRecord", formatSymbol(Name, Address)); + SW.printString("ExceptionRecord", formatSymbol(*Name, Address)); section_iterator SI = COFF.section_end(); if (XDataRecord->getSection(SI)) @@ -658,7 +662,10 @@ bool Decoder::dumpPackedEntry(const object::COFFObjectFile &COFF, StringRef FunctionName; uint64_t FunctionAddress; if (Function) { - Function->getName(FunctionName); + ErrorOr<StringRef> FunctionNameOrErr = Function->getName(); + if (std::error_code EC = FunctionNameOrErr.getError()) + report_fatal_error(EC.message()); + FunctionName = *FunctionNameOrErr; Function->getAddress(FunctionAddress); } else { const pe32_header *PEHeader; diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 5dde7f93edf..f5effe29244 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -139,8 +139,10 @@ std::error_code COFFDumper::resolveSymbolName(const coff_section *Section, SymbolRef Symbol; if (std::error_code EC = resolveSymbol(Section, Offset, Symbol)) return EC; - if (std::error_code EC = Symbol.getName(Name)) + ErrorOr<StringRef> NameOrErr = Symbol.getName(); + if (std::error_code EC = NameOrErr.getError()) return EC; + Name = *NameOrErr; return std::error_code(); } @@ -809,8 +811,12 @@ void COFFDumper::printRelocation(const SectionRef &Section, StringRef SymbolName; Reloc.getTypeName(RelocName); symbol_iterator Symbol = Reloc.getSymbol(); - if (Symbol != Obj->symbol_end() && error(Symbol->getName(SymbolName))) - return; + if (Symbol != Obj->symbol_end()) { + ErrorOr<StringRef> SymbolNameOrErr = Symbol->getName(); + if (error(SymbolNameOrErr.getError())) + return; + SymbolName = *SymbolNameOrErr; + } if (opts::ExpandRelocs) { DictScope Group(W, "Relocation"); diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index 049c9f5d8c1..adb99b0acd7 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -474,8 +474,10 @@ void MachODumper::printRelocation(const MachOObjectFile *Obj, if (IsExtern) { symbol_iterator Symbol = Reloc.getSymbol(); if (Symbol != Obj->symbol_end()) { - if (error(Symbol->getName(TargetName))) + ErrorOr<StringRef> TargetNameOrErr = Symbol->getName(); + if (error(TargetNameOrErr.getError())) return; + TargetName = *TargetNameOrErr; } } else if (!IsScattered) { section_iterator SecI = Obj->getRelocationSection(DR); @@ -538,8 +540,8 @@ void MachODumper::printDynamicSymbols() { void MachODumper::printSymbol(const SymbolRef &Symbol) { StringRef SymbolName; - if (Symbol.getName(SymbolName)) - SymbolName = ""; + if (ErrorOr<StringRef> SymbolNameOrErr = Symbol.getName()) + SymbolName = *SymbolNameOrErr; MachOSymbol MOSymbol; getSymbol(Obj, Symbol.getRawDataRefImpl(), MOSymbol); diff --git a/llvm/tools/llvm-readobj/Win64EHDumper.cpp b/llvm/tools/llvm-readobj/Win64EHDumper.cpp index b148c5d2abd..5a8af4135bd 100644 --- a/llvm/tools/llvm-readobj/Win64EHDumper.cpp +++ b/llvm/tools/llvm-readobj/Win64EHDumper.cpp @@ -118,19 +118,19 @@ static std::string formatSymbol(const Dumper::Context &Ctx, std::string Buffer; raw_string_ostream OS(Buffer); - StringRef Name; SymbolRef Symbol; - if (Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData) || - Symbol.getName(Name)) { - OS << format(" (0x%" PRIX64 ")", Offset); - return OS.str(); + if (!Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData)) { + if (ErrorOr<StringRef> Name = Symbol.getName()) { + OS << *Name; + if (Displacement > 0) + OS << format(" +0x%X (0x%" PRIX64 ")", Displacement, Offset); + else + OS << format(" (0x%" PRIX64 ")", Offset); + return OS.str(); + } } - OS << Name; - if (Displacement > 0) - OS << format(" +0x%X (0x%" PRIX64 ")", Displacement, Offset); - else - OS << format(" (0x%" PRIX64 ")", Offset); + OS << format(" (0x%" PRIX64 ")", Offset); return OS.str(); } |