diff options
Diffstat (limited to 'llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp')
| -rw-r--r-- | llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp b/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp index 99ee639fc45d..78be632f2153 100644 --- a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp +++ b/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp @@ -238,22 +238,27 @@ ErrorOr<SymbolRef> Decoder::getRelocatedSymbol(const COFFObjectFile &, return inconvertibleErrorCode(); } -SymbolRef Decoder::getPreferredSymbol(const COFFObjectFile &COFF, - SymbolRef Sym) { +SymbolRef Decoder::getPreferredSymbol(const COFFObjectFile &COFF, SymbolRef Sym, + uint64_t &SymbolOffset) { // The symbol resolved by getRelocatedSymbol can be any internal // nondescriptive symbol; try to resolve a more descriptive one. COFFSymbolRef CoffSym = COFF.getCOFFSymbol(Sym); - if (CoffSym.getStorageClass() != COFF::IMAGE_SYM_CLASS_LABEL) + if (CoffSym.getStorageClass() != COFF::IMAGE_SYM_CLASS_LABEL && + CoffSym.getSectionDefinition() == nullptr) return Sym; for (const auto &S : COFF.symbols()) { COFFSymbolRef CS = COFF.getCOFFSymbol(S); if (CS.getSectionNumber() == CoffSym.getSectionNumber() && - CS.getValue() == CoffSym.getValue()) { - if (CS.isExternal()) - return S; - if (CS.getStorageClass() != COFF::IMAGE_SYM_CLASS_LABEL) { + CS.getValue() <= CoffSym.getValue() + SymbolOffset && + CS.getStorageClass() != COFF::IMAGE_SYM_CLASS_LABEL && + CS.getSectionDefinition() == nullptr) { + uint32_t Offset = CoffSym.getValue() + SymbolOffset - CS.getValue(); + if (Offset <= SymbolOffset) { + SymbolOffset = Offset; Sym = S; CoffSym = CS; + if (CS.isExternal() && SymbolOffset == 0) + return Sym; } } } @@ -277,12 +282,14 @@ ErrorOr<SymbolRef> Decoder::getSymbolForLocation( std::string Buf; llvm::raw_string_ostream OS(Buf); logAllUnhandledErrors(AddressOrErr.takeError(), OS); - OS.flush(); - report_fatal_error(Buf); + report_fatal_error(Twine(OS.str())); } // We apply SymbolOffset here directly. We return it separately to allow // the caller to print it as an offset on the symbol name. SymbolAddress = *AddressOrErr + SymbolOffset; + + if (FunctionOnly) // Resolve label/section symbols into function names. + SymOrErr = getPreferredSymbol(COFF, *SymOrErr, SymbolOffset); } else { // No matching relocation found; operating on a linked image. Try to // find a descriptive symbol if possible. The immediate offset contains @@ -292,8 +299,6 @@ ErrorOr<SymbolRef> Decoder::getSymbolForLocation( SymbolOffset = 0; SymOrErr = getSymbol(COFF, SymbolAddress, FunctionOnly); } - if (SymOrErr && FunctionOnly) // Resolve label symbols into function names - SymOrErr = getPreferredSymbol(COFF, *SymOrErr); return SymOrErr; } @@ -1000,8 +1005,7 @@ bool Decoder::dumpXDataRecord(const COFFObjectFile &COFF, std::string Buf; llvm::raw_string_ostream OS(Buf); logAllUnhandledErrors(Name.takeError(), OS); - OS.flush(); - report_fatal_error(Buf); + report_fatal_error(Twine(OS.str())); } ListScope EHS(SW, "ExceptionHandler"); @@ -1040,8 +1044,7 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF, std::string Buf; llvm::raw_string_ostream OS(Buf); logAllUnhandledErrors(FunctionNameOrErr.takeError(), OS); - OS.flush(); - report_fatal_error(Buf); + report_fatal_error(Twine(OS.str())); } FunctionName = *FunctionNameOrErr; } @@ -1055,8 +1058,7 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF, std::string Buf; llvm::raw_string_ostream OS(Buf); logAllUnhandledErrors(Name.takeError(), OS); - OS.flush(); - report_fatal_error(Buf); + report_fatal_error(Twine(OS.str())); } SW.printString("ExceptionRecord", @@ -1101,8 +1103,7 @@ bool Decoder::dumpPackedEntry(const object::COFFObjectFile &COFF, std::string Buf; llvm::raw_string_ostream OS(Buf); logAllUnhandledErrors(FunctionNameOrErr.takeError(), OS); - OS.flush(); - report_fatal_error(Buf); + report_fatal_error(Twine(OS.str())); } FunctionName = *FunctionNameOrErr; } @@ -1143,8 +1144,7 @@ bool Decoder::dumpPackedARM64Entry(const object::COFFObjectFile &COFF, std::string Buf; llvm::raw_string_ostream OS(Buf); logAllUnhandledErrors(FunctionNameOrErr.takeError(), OS); - OS.flush(); - report_fatal_error(Buf); + report_fatal_error(Twine(OS.str())); } FunctionName = *FunctionNameOrErr; } |
