diff options
Diffstat (limited to 'llvm/lib/DebugInfo/Symbolize')
-rw-r--r-- | llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp | 62 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h | 15 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/Symbolize/Symbolize.cpp | 51 |
4 files changed, 66 insertions, 66 deletions
diff --git a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp index 2f3a2500c293f..10352237763c9 100644 --- a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp +++ b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp @@ -73,12 +73,12 @@ void DIPrinter::print(const DILineInfo &Info, bool Inlined) { std::string Filename = Info.FileName; if (Filename == DILineInfo::BadString) Filename = DILineInfo::Addr2LineBadString; - else if (Basenames) - Filename = llvm::sys::path::filename(Filename); if (!Verbose) { OS << Filename << ":" << Info.Line; if (Style == OutputStyle::LLVM) OS << ":" << Info.Column; + else if (Style == OutputStyle::GNU && Info.Discriminator != 0) + OS << " (discriminator " << Info.Discriminator << ")"; OS << "\n"; printContext(Filename, Info.Line); return; diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index b4d49d9ff9582..84524195fa8af 100644 --- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -35,13 +35,7 @@ using namespace llvm; using namespace object; using namespace symbolize; -static DILineInfoSpecifier -getDILineInfoSpecifier(FunctionNameKind FNKind) { - return DILineInfoSpecifier( - DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath, FNKind); -} - -ErrorOr<std::unique_ptr<SymbolizableObjectFile>> +Expected<std::unique_ptr<SymbolizableObjectFile>> SymbolizableObjectFile::create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx, bool UntagAddresses) { @@ -56,12 +50,12 @@ SymbolizableObjectFile::create(const object::ObjectFile *Obj, for (section_iterator Section : Obj->sections()) { Expected<StringRef> NameOrErr = Section->getName(); if (!NameOrErr) - return errorToErrorCode(NameOrErr.takeError()); + return NameOrErr.takeError(); if (*NameOrErr == ".opd") { Expected<StringRef> E = Section->getContents(); if (!E) - return errorToErrorCode(E.takeError()); + return E.takeError(); OpdExtractor.reset(new DataExtractor(*E, Obj->isLittleEndian(), Obj->getBytesInAddress())); OpdAddress = Section->getAddress(); @@ -72,14 +66,16 @@ SymbolizableObjectFile::create(const object::ObjectFile *Obj, std::vector<std::pair<SymbolRef, uint64_t>> Symbols = computeSymbolSizes(*Obj); for (auto &P : Symbols) - res->addSymbol(P.first, P.second, OpdExtractor.get(), OpdAddress); + if (Error E = + res->addSymbol(P.first, P.second, OpdExtractor.get(), OpdAddress)) + return std::move(E); // If this is a COFF object and we didn't find any symbols, try the export // table. if (Symbols.empty()) { if (auto *CoffObj = dyn_cast<COFFObjectFile>(Obj)) - if (auto EC = res->addCoffExportSymbols(CoffObj)) - return EC; + if (Error E = res->addCoffExportSymbols(CoffObj)) + return std::move(E); } std::vector<std::pair<SymbolDesc, StringRef>> &Fs = res->Functions, @@ -123,7 +119,7 @@ struct OffsetNamePair { } // end anonymous namespace -std::error_code SymbolizableObjectFile::addCoffExportSymbols( +Error SymbolizableObjectFile::addCoffExportSymbols( const COFFObjectFile *CoffObj) { // Get all export names and offsets. std::vector<OffsetNamePair> ExportSyms; @@ -137,7 +133,7 @@ std::error_code SymbolizableObjectFile::addCoffExportSymbols( ExportSyms.push_back(OffsetNamePair{Offset, Name}); } if (ExportSyms.empty()) - return std::error_code(); + return Error::success(); // Sort by ascending offset. array_pod_sort(ExportSyms.begin(), ExportSyms.end()); @@ -154,27 +150,27 @@ std::error_code SymbolizableObjectFile::addCoffExportSymbols( SymbolDesc SD = {SymbolStart, SymbolSize}; Functions.emplace_back(SD, Export.Name); } - return std::error_code(); + return Error::success(); } -std::error_code SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol, - uint64_t SymbolSize, - DataExtractor *OpdExtractor, - uint64_t OpdAddress) { +Error SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol, + uint64_t SymbolSize, + DataExtractor *OpdExtractor, + uint64_t OpdAddress) { // Avoid adding symbols from an unknown/undefined section. const ObjectFile *Obj = Symbol.getObject(); Expected<section_iterator> Sec = Symbol.getSection(); if (!Sec || (Obj && Obj->section_end() == *Sec)) - return std::error_code(); + return Error::success(); Expected<SymbolRef::Type> SymbolTypeOrErr = Symbol.getType(); if (!SymbolTypeOrErr) - return errorToErrorCode(SymbolTypeOrErr.takeError()); + return SymbolTypeOrErr.takeError(); SymbolRef::Type SymbolType = *SymbolTypeOrErr; if (SymbolType != SymbolRef::ST_Function && SymbolType != SymbolRef::ST_Data) - return std::error_code(); + return Error::success(); Expected<uint64_t> SymbolAddressOrErr = Symbol.getAddress(); if (!SymbolAddressOrErr) - return errorToErrorCode(SymbolAddressOrErr.takeError()); + return SymbolAddressOrErr.takeError(); uint64_t SymbolAddress = *SymbolAddressOrErr; if (UntagAddresses) { // For kernel addresses, bits 56-63 need to be set, so we sign extend bit 55 @@ -194,7 +190,7 @@ std::error_code SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol, } Expected<StringRef> SymbolNameOrErr = Symbol.getName(); if (!SymbolNameOrErr) - return errorToErrorCode(SymbolNameOrErr.takeError()); + return SymbolNameOrErr.takeError(); StringRef SymbolName = *SymbolNameOrErr; // Mach-O symbol table names have leading underscore, skip it. if (Module->isMachO() && !SymbolName.empty() && SymbolName[0] == '_') @@ -204,7 +200,7 @@ std::error_code SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol, auto &M = SymbolType == SymbolRef::ST_Function ? Functions : Objects; SymbolDesc SD = { SymbolAddress, SymbolSize }; M.emplace_back(SD, SymbolName); - return std::error_code(); + return Error::success(); } // Return true if this is a 32-bit x86 PE COFF module. @@ -251,16 +247,16 @@ bool SymbolizableObjectFile::shouldOverrideWithSymbolTable( DILineInfo SymbolizableObjectFile::symbolizeCode(object::SectionedAddress ModuleOffset, - FunctionNameKind FNKind, + DILineInfoSpecifier LineInfoSpecifier, bool UseSymbolTable) const { if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection) ModuleOffset.SectionIndex = getModuleSectionIndexForAddress(ModuleOffset.Address); - DILineInfo LineInfo = DebugInfoContext->getLineInfoForAddress( - ModuleOffset, getDILineInfoSpecifier(FNKind)); + DILineInfo LineInfo = + DebugInfoContext->getLineInfoForAddress(ModuleOffset, LineInfoSpecifier); // Override function name from symbol table if necessary. - if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) { + if (shouldOverrideWithSymbolTable(LineInfoSpecifier.FNKind, UseSymbolTable)) { std::string FunctionName; uint64_t Start, Size; if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset.Address, @@ -272,20 +268,20 @@ SymbolizableObjectFile::symbolizeCode(object::SectionedAddress ModuleOffset, } DIInliningInfo SymbolizableObjectFile::symbolizeInlinedCode( - object::SectionedAddress ModuleOffset, FunctionNameKind FNKind, - bool UseSymbolTable) const { + object::SectionedAddress ModuleOffset, + DILineInfoSpecifier LineInfoSpecifier, bool UseSymbolTable) const { if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection) ModuleOffset.SectionIndex = getModuleSectionIndexForAddress(ModuleOffset.Address); DIInliningInfo InlinedContext = DebugInfoContext->getInliningInfoForAddress( - ModuleOffset, getDILineInfoSpecifier(FNKind)); + ModuleOffset, LineInfoSpecifier); // Make sure there is at least one frame in context. if (InlinedContext.getNumberOfFrames() == 0) InlinedContext.addFrame(DILineInfo()); // Override the function name in lower frame with name from symbol table. - if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) { + if (shouldOverrideWithSymbolTable(LineInfoSpecifier.FNKind, UseSymbolTable)) { std::string FunctionName; uint64_t Start, Size; if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset.Address, diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h index b5b9793a44d99..0ba304ee4c61c 100644 --- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -30,15 +30,15 @@ namespace symbolize { class SymbolizableObjectFile : public SymbolizableModule { public: - static ErrorOr<std::unique_ptr<SymbolizableObjectFile>> + static Expected<std::unique_ptr<SymbolizableObjectFile>> create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx, bool UntagAddresses); DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset, - FunctionNameKind FNKind, + DILineInfoSpecifier LineInfoSpecifier, bool UseSymbolTable) const override; DIInliningInfo symbolizeInlinedCode(object::SectionedAddress ModuleOffset, - FunctionNameKind FNKind, + DILineInfoSpecifier LineInfoSpecifier, bool UseSymbolTable) const override; DIGlobal symbolizeData(object::SectionedAddress ModuleOffset) const override; std::vector<DILocal> @@ -60,11 +60,10 @@ private: uint64_t &Size) const; // For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd // (function descriptor) section and OpdExtractor refers to its contents. - std::error_code addSymbol(const object::SymbolRef &Symbol, - uint64_t SymbolSize, - DataExtractor *OpdExtractor = nullptr, - uint64_t OpdAddress = 0); - std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj); + Error addSymbol(const object::SymbolRef &Symbol, uint64_t SymbolSize, + DataExtractor *OpdExtractor = nullptr, + uint64_t OpdAddress = 0); + Error addCoffExportSymbols(const object::COFFObjectFile *CoffObj); /// Search for the first occurence of specified Address in ObjectFile. uint64_t getModuleSectionIndexForAddress(uint64_t Address) const; diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp index 35e3ead6317b6..1d767a2b0d889 100644 --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -51,8 +51,9 @@ LLVMSymbolizer::symbolizeCodeCommon(SymbolizableModule *Info, if (Opts.RelativeAddresses) ModuleOffset.Address += Info->getModulePreferredBase(); - DILineInfo LineInfo = Info->symbolizeCode(ModuleOffset, Opts.PrintFunctions, - Opts.UseSymbolTable); + DILineInfo LineInfo = Info->symbolizeCode( + ModuleOffset, DILineInfoSpecifier(Opts.PathStyle, Opts.PrintFunctions), + Opts.UseSymbolTable); if (Opts.Demangle) LineInfo.FunctionName = DemangleName(LineInfo.FunctionName, Info); return LineInfo; @@ -66,8 +67,7 @@ LLVMSymbolizer::symbolizeCode(const ObjectFile &Obj, if (I != Modules.end()) return symbolizeCodeCommon(I->second.get(), ModuleOffset); - std::unique_ptr<DIContext> Context = - DWARFContext::create(Obj, nullptr, DWARFContext::defaultErrorHandler); + std::unique_ptr<DIContext> Context = DWARFContext::create(Obj); Expected<SymbolizableModule *> InfoOrErr = createModuleInfo(&Obj, std::move(Context), ModuleName); if (!InfoOrErr) @@ -104,7 +104,8 @@ LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName, ModuleOffset.Address += Info->getModulePreferredBase(); DIInliningInfo InlinedContext = Info->symbolizeInlinedCode( - ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable); + ModuleOffset, DILineInfoSpecifier(Opts.PathStyle, Opts.PrintFunctions), + Opts.UseSymbolTable); if (Opts.Demangle) { for (int i = 0, n = InlinedContext.getNumberOfFrames(); i < n; i++) { auto *Frame = InlinedContext.getMutableFrame(i); @@ -184,7 +185,7 @@ std::string getDarwinDWARFResourceForPath( } sys::path::append(ResourceName, "Contents", "Resources", "DWARF"); sys::path::append(ResourceName, Basename); - return ResourceName.str(); + return std::string(ResourceName.str()); } bool checkFileCRC(StringRef Path, uint32_t CRCHash) { @@ -205,14 +206,14 @@ bool findDebugBinary(const std::string &OrigPath, // Try relative/path/to/original_binary/debuglink_name llvm::sys::path::append(DebugPath, DebuglinkName); if (checkFileCRC(DebugPath, CRCHash)) { - Result = DebugPath.str(); + Result = std::string(DebugPath.str()); return true; } // Try relative/path/to/original_binary/.debug/debuglink_name DebugPath = OrigDir; llvm::sys::path::append(DebugPath, ".debug", DebuglinkName); if (checkFileCRC(DebugPath, CRCHash)) { - Result = DebugPath.str(); + Result = std::string(DebugPath.str()); return true; } // Make the path absolute so that lookups will go to @@ -234,7 +235,7 @@ bool findDebugBinary(const std::string &OrigPath, llvm::sys::path::append(DebugPath, llvm::sys::path::relative_path(OrigDir), DebuglinkName); if (checkFileCRC(DebugPath, CRCHash)) { - Result = DebugPath.str(); + Result = std::string(DebugPath.str()); return true; } return false; @@ -300,6 +301,7 @@ Optional<ArrayRef<uint8_t>> getBuildID(const ELFFile<ELFT> *Obj) { for (auto N : Obj->notes(P, Err)) if (N.getType() == ELF::NT_GNU_BUILD_ID && N.getName() == ELF::ELF_NOTE_GNU) return N.getDesc(); + consumeError(std::move(Err)); } return {}; } @@ -341,7 +343,7 @@ bool findDebugBinary(const std::vector<std::string> &DebugFileDirectory, #endif ); if (llvm::sys::fs::exists(Path)) { - Result = Path.str(); + Result = std::string(Path.str()); return true; } } else { @@ -349,7 +351,7 @@ bool findDebugBinary(const std::vector<std::string> &DebugFileDirectory, // Try <debug-file-directory>/.build-id/../... SmallString<128> Path = getDebugPath(Directory); if (llvm::sys::fs::exists(Path)) { - Result = Path.str(); + Result = std::string(Path.str()); return true; } } @@ -365,9 +367,11 @@ ObjectFile *LLVMSymbolizer::lookUpDsymFile(const std::string &ExePath, // resource directory. std::vector<std::string> DsymPaths; StringRef Filename = sys::path::filename(ExePath); - DsymPaths.push_back(getDarwinDWARFResourceForPath(ExePath, Filename)); + DsymPaths.push_back( + getDarwinDWARFResourceForPath(ExePath, std::string(Filename))); for (const auto &Path : Opts.DsymHints) { - DsymPaths.push_back(getDarwinDWARFResourceForPath(Path, Filename)); + DsymPaths.push_back( + getDarwinDWARFResourceForPath(Path, std::string(Filename))); } for (const auto &Path : DsymPaths) { auto DbgObjOrErr = getOrCreateObject(Path, ArchName); @@ -508,11 +512,11 @@ LLVMSymbolizer::createModuleInfo(const ObjectFile *Obj, std::unique_ptr<SymbolizableModule> SymMod; if (InfoOrErr) SymMod = std::move(*InfoOrErr); - auto InsertResult = - Modules.insert(std::make_pair(ModuleName, std::move(SymMod))); + auto InsertResult = Modules.insert( + std::make_pair(std::string(ModuleName), std::move(SymMod))); assert(InsertResult.second); - if (std::error_code EC = InfoOrErr.getError()) - return errorCodeToError(EC); + if (!InfoOrErr) + return InfoOrErr.takeError(); return InsertResult.first->second.get(); } @@ -551,8 +555,11 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { if (!EC && DebugInfo != nullptr && !PDBFileName.empty()) { using namespace pdb; std::unique_ptr<IPDBSession> Session; - if (auto Err = loadDataForEXE(PDB_ReaderType::DIA, - Objects.first->getFileName(), Session)) { + PDB_ReaderType ReaderType = Opts.UseNativePDBReader + ? PDB_ReaderType::Native + : PDB_ReaderType::DIA; + if (auto Err = loadDataForEXE(ReaderType, Objects.first->getFileName(), + Session)) { Modules.emplace(ModuleName, std::unique_ptr<SymbolizableModule>()); // Return along the PDB filename to provide more context return createFileError(PDBFileName, std::move(Err)); @@ -561,9 +568,7 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { } } if (!Context) - Context = - DWARFContext::create(*Objects.second, nullptr, - DWARFContext::defaultErrorHandler, Opts.DWPName); + Context = DWARFContext::create(*Objects.second, nullptr, Opts.DWPName); return createModuleInfo(Objects.first, std::move(Context), ModuleName); } @@ -619,7 +624,7 @@ LLVMSymbolizer::DemangleName(const std::string &Name, // Only do MSVC C++ demangling on symbols starting with '?'. int status = 0; char *DemangledName = microsoftDemangle( - Name.c_str(), nullptr, nullptr, &status, + Name.c_str(), nullptr, nullptr, nullptr, &status, MSDemangleFlags(MSDF_NoAccessSpecifier | MSDF_NoCallingConvention | MSDF_NoMemberType | MSDF_NoReturnType)); if (status != 0) |