Index: llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h =================================================================== --- llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h +++ llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h @@ -63,11 +63,19 @@ Expected symbolizeCode(const std::string &ModuleName, object::SectionedAddress ModuleOffset); Expected + symbolizeInlinedCode(const ObjectFile &Obj, + object::SectionedAddress ModuleOffset); + Expected symbolizeInlinedCode(const std::string &ModuleName, object::SectionedAddress ModuleOffset); + + Expected symbolizeData(const ObjectFile &Obj, + object::SectionedAddress ModuleOffset); Expected symbolizeData(const std::string &ModuleName, object::SectionedAddress ModuleOffset); Expected> + symbolizeFrame(const ObjectFile &Obj, object::SectionedAddress ModuleOffset); + Expected> symbolizeFrame(const std::string &ModuleName, object::SectionedAddress ModuleOffset); void flush(); @@ -84,6 +92,14 @@ Expected symbolizeCodeCommon(SymbolizableModule *Info, object::SectionedAddress ModuleOffset); + Expected + symbolizeInlinedCodeCommon(SymbolizableModule *Info, + object::SectionedAddress ModuleOffset); + Expected symbolizeDataCommon(SymbolizableModule *Info, + object::SectionedAddress ModuleOffset); + Expected> + symbolizeFrameCommon(SymbolizableModule *Info, + object::SectionedAddress ModuleOffset); /// Returns a SymbolizableModule or an error if loading debug info failed. /// Only one attempt is made to load a module, and errors during loading are Index: llvm/lib/DebugInfo/Symbolize/Symbolize.cpp =================================================================== --- llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -85,15 +85,8 @@ return symbolizeCodeCommon(*InfoOrErr, ModuleOffset); } -Expected -LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName, - object::SectionedAddress ModuleOffset) { - SymbolizableModule *Info; - if (auto InfoOrErr = getOrCreateModuleInfo(ModuleName)) - Info = InfoOrErr.get(); - else - return InfoOrErr.takeError(); - +Expected LLVMSymbolizer::symbolizeInlinedCodeCommon( + SymbolizableModule *Info, object::SectionedAddress ModuleOffset) { // A null module means an error has already been reported. Return an empty // result. if (!Info) @@ -116,15 +109,34 @@ return InlinedContext; } -Expected -LLVMSymbolizer::symbolizeData(const std::string &ModuleName, - object::SectionedAddress ModuleOffset) { - SymbolizableModule *Info; - if (auto InfoOrErr = getOrCreateModuleInfo(ModuleName)) - Info = InfoOrErr.get(); - else +Expected +LLVMSymbolizer::symbolizeInlinedCode(const ObjectFile &Obj, + object::SectionedAddress ModuleOffset) { + StringRef ModuleName = Obj.getFileName(); + auto I = Modules.find(ModuleName); + if (I != Modules.end()) + return symbolizeInlinedCodeCommon(I->second.get(), ModuleOffset); + + std::unique_ptr Context = DWARFContext::create(Obj); + Expected InfoOrErr = + createModuleInfo(&Obj, std::move(Context), ModuleName); + if (!InfoOrErr) return InfoOrErr.takeError(); + return symbolizeInlinedCodeCommon(*InfoOrErr, ModuleOffset); +} + +Expected +LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName, + object::SectionedAddress ModuleOffset) { + Expected InfoOrErr = getOrCreateModuleInfo(ModuleName); + if (!InfoOrErr) + return InfoOrErr.takeError(); + return symbolizeInlinedCodeCommon(*InfoOrErr, ModuleOffset); +} +Expected +LLVMSymbolizer::symbolizeDataCommon(SymbolizableModule *Info, + object::SectionedAddress ModuleOffset) { // A null module means an error has already been reported. Return an empty // result. if (!Info) @@ -142,15 +154,34 @@ return Global; } -Expected> -LLVMSymbolizer::symbolizeFrame(const std::string &ModuleName, - object::SectionedAddress ModuleOffset) { - SymbolizableModule *Info; - if (auto InfoOrErr = getOrCreateModuleInfo(ModuleName)) - Info = InfoOrErr.get(); - else +Expected +LLVMSymbolizer::symbolizeData(const ObjectFile &Obj, + object::SectionedAddress ModuleOffset) { + StringRef ModuleName = Obj.getFileName(); + auto I = Modules.find(ModuleName); + if (I != Modules.end()) + return symbolizeDataCommon(I->second.get(), ModuleOffset); + + std::unique_ptr Context = DWARFContext::create(Obj); + Expected InfoOrErr = + createModuleInfo(&Obj, std::move(Context), ModuleName); + if (!InfoOrErr) return InfoOrErr.takeError(); + return symbolizeDataCommon(*InfoOrErr, ModuleOffset); +} +Expected +LLVMSymbolizer::symbolizeData(const std::string &ModuleName, + object::SectionedAddress ModuleOffset) { + Expected InfoOrErr = getOrCreateModuleInfo(ModuleName); + if (!InfoOrErr) + return InfoOrErr.takeError(); + return symbolizeDataCommon(*InfoOrErr, ModuleOffset); +} + +Expected> +LLVMSymbolizer::symbolizeFrameCommon(SymbolizableModule *Info, + object::SectionedAddress ModuleOffset) { // A null module means an error has already been reported. Return an empty // result. if (!Info) @@ -165,6 +196,31 @@ return Info->symbolizeFrame(ModuleOffset); } +Expected> +LLVMSymbolizer::symbolizeFrame(const ObjectFile &Obj, + object::SectionedAddress ModuleOffset) { + StringRef ModuleName = Obj.getFileName(); + auto I = Modules.find(ModuleName); + if (I != Modules.end()) + return symbolizeFrameCommon(I->second.get(), ModuleOffset); + + std::unique_ptr Context = DWARFContext::create(Obj); + Expected InfoOrErr = + createModuleInfo(&Obj, std::move(Context), ModuleName); + if (!InfoOrErr) + return InfoOrErr.takeError(); + return symbolizeFrameCommon(*InfoOrErr, ModuleOffset); +} + +Expected> +LLVMSymbolizer::symbolizeFrame(const std::string &ModuleName, + object::SectionedAddress ModuleOffset) { + Expected InfoOrErr = getOrCreateModuleInfo(ModuleName); + if (!InfoOrErr) + return InfoOrErr.takeError(); + return symbolizeFrameCommon(*InfoOrErr, ModuleOffset); +} + void LLVMSymbolizer::flush() { ObjectForUBPathAndArch.clear(); BinaryForPath.clear();