Teach the symbolizer lib symbolize objects directly.
Currently, the symbolizer lib can only symbolize a file on disk.
This patch teaches the symbolizer lib to symbolize objects.
llvm-objdump needs this to support archive disassembly with source info.
https://bugs.llvm.org/show_bug.cgi?id=41871
Reviewed by: jhenderson, grimar, MaskRay
Differential Revision: https://reviews.llvm.org/D63521
llvm-svn: 365376
diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
index 1cb8a7a..6a619f8 100644
--- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
+++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
@@ -52,14 +52,8 @@
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 @@
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 @@
}
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 @@
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 {