diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h | 6 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/Symbolize/Symbolize.cpp | 64 |
3 files changed, 51 insertions, 23 deletions
diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index 60925841696..2765bf44d50 100644 --- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -42,7 +42,7 @@ getDILineInfoSpecifier(FunctionNameKind FNKind) { } ErrorOr<std::unique_ptr<SymbolizableObjectFile>> -SymbolizableObjectFile::create(object::ObjectFile *Obj, +SymbolizableObjectFile::create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx) { assert(DICtx); std::unique_ptr<SymbolizableObjectFile> res( @@ -102,7 +102,7 @@ SymbolizableObjectFile::create(object::ObjectFile *Obj, return std::move(res); } -SymbolizableObjectFile::SymbolizableObjectFile(ObjectFile *Obj, +SymbolizableObjectFile::SymbolizableObjectFile(const ObjectFile *Obj, std::unique_ptr<DIContext> DICtx) : Module(Obj), DebugInfoContext(std::move(DICtx)) {} diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h index 3a511dcb4d4..9cab94178c1 100644 --- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -31,7 +31,7 @@ namespace symbolize { class SymbolizableObjectFile : public SymbolizableModule { public: static ErrorOr<std::unique_ptr<SymbolizableObjectFile>> - create(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx); + create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx); DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset, FunctionNameKind FNKind, @@ -68,7 +68,7 @@ private: /// Search for the first occurence of specified Address in ObjectFile. uint64_t getModuleSectionIndexForAddress(uint64_t Address) const; - object::ObjectFile *Module; + const object::ObjectFile *Module; std::unique_ptr<DIContext> DebugInfoContext; struct SymbolDesc { @@ -84,7 +84,7 @@ private: std::vector<std::pair<SymbolDesc, StringRef>> Functions; std::vector<std::pair<SymbolDesc, StringRef>> Objects; - SymbolizableObjectFile(object::ObjectFile *Obj, + SymbolizableObjectFile(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx); }; diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp index 1cb8a7a829e..6a619f8f2f3 100644 --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -52,14 +52,8 @@ namespace llvm { namespace symbolize { Expected<DILineInfo> -LLVMSymbolizer::symbolizeCode(const std::string &ModuleName, - object::SectionedAddress ModuleOffset) { - SymbolizableModule *Info; - if (auto InfoOrErr = getOrCreateModuleInfo(ModuleName)) - Info = InfoOrErr.get(); - else - return InfoOrErr.takeError(); - +LLVMSymbolizer::symbolizeCodeCommon(SymbolizableModule *Info, + object::SectionedAddress ModuleOffset) { // A null module means an error has already been reported. Return an empty // result. if (!Info) @@ -77,6 +71,32 @@ LLVMSymbolizer::symbolizeCode(const std::string &ModuleName, return LineInfo; } +Expected<DILineInfo> +LLVMSymbolizer::symbolizeCode(const ObjectFile &Obj, + object::SectionedAddress ModuleOffset) { + StringRef ModuleName = Obj.getFileName(); + auto I = Modules.find(ModuleName); + if (I != Modules.end()) + return symbolizeCodeCommon(I->second.get(), ModuleOffset); + + std::unique_ptr<DIContext> Context = + DWARFContext::create(Obj, nullptr, DWARFContext::defaultErrorHandler); + Expected<SymbolizableModule *> InfoOrErr = + createModuleInfo(&Obj, std::move(Context), ModuleName); + if (!InfoOrErr) + return InfoOrErr.takeError(); + return symbolizeCodeCommon(*InfoOrErr, ModuleOffset); +} + +Expected<DILineInfo> +LLVMSymbolizer::symbolizeCode(const std::string &ModuleName, + object::SectionedAddress ModuleOffset) { + Expected<SymbolizableModule *> InfoOrErr = getOrCreateModuleInfo(ModuleName); + if (!InfoOrErr) + return InfoOrErr.takeError(); + return symbolizeCodeCommon(*InfoOrErr, ModuleOffset); +} + Expected<DIInliningInfo> LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName, object::SectionedAddress ModuleOffset) { @@ -395,6 +415,23 @@ LLVMSymbolizer::getOrCreateObject(const std::string &Path, } Expected<SymbolizableModule *> +LLVMSymbolizer::createModuleInfo(const ObjectFile *Obj, + std::unique_ptr<DIContext> Context, + StringRef ModuleName) { + auto InfoOrErr = + SymbolizableObjectFile::create(Obj, std::move(Context)); + std::unique_ptr<SymbolizableModule> SymMod; + if (InfoOrErr) + SymMod = std::move(*InfoOrErr); + auto InsertResult = + Modules.insert(std::make_pair(ModuleName, std::move(SymMod))); + assert(InsertResult.second); + if (std::error_code EC = InfoOrErr.getError()) + return errorCodeToError(EC); + return InsertResult.first->second.get(); +} + +Expected<SymbolizableModule *> LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { auto I = Modules.find(ModuleName); if (I != Modules.end()) @@ -442,16 +479,7 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { Context = DWARFContext::create(*Objects.second, nullptr, DWARFContext::defaultErrorHandler, Opts.DWPName); - auto InfoOrErr = - SymbolizableObjectFile::create(Objects.first, std::move(Context)); - std::unique_ptr<SymbolizableModule> SymMod; - if (InfoOrErr) - SymMod = std::move(InfoOrErr.get()); - auto InsertResult = Modules.emplace(ModuleName, std::move(SymMod)); - assert(InsertResult.second); - if (auto EC = InfoOrErr.getError()) - return errorCodeToError(EC); - return InsertResult.first->second.get(); + return createModuleInfo(Objects.first, std::move(Context), ModuleName); } namespace { |

