summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo
diff options
context:
space:
mode:
authorAlexey Samsonov <vonosmas@gmail.com>2015-11-03 21:36:13 +0000
committerAlexey Samsonov <vonosmas@gmail.com>2015-11-03 21:36:13 +0000
commit688124989528ca1c00c3df8e0a82bc05d400319e (patch)
tree0902346e9915b68b3f3c2d31bb3769189e8185a7 /llvm/lib/DebugInfo
parent443f50a8339a28ea4b05f9177f678d57aa37a7ef (diff)
downloadbcm5719-llvm-688124989528ca1c00c3df8e0a82bc05d400319e.tar.gz
bcm5719-llvm-688124989528ca1c00c3df8e0a82bc05d400319e.zip
[LLVMSymbolize] Move demangling away from printing routines. NFC.
Make printDILineInfo and friends responsible for just rendering the contents of the structures, demangling should actually be performed earlier, when we have the information about the originating SymbolizableModule at hand. llvm-svn: 251981
Diffstat (limited to 'llvm/lib/DebugInfo')
-rw-r--r--llvm/lib/DebugInfo/Symbolize/Symbolize.cpp61
1 files changed, 33 insertions, 28 deletions
diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
index 2e6f60416a4..fe180f26dc9 100644
--- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
+++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
@@ -66,7 +66,7 @@ std::string LLVMSymbolizer::symbolizeCode(const std::string &ModuleName,
uint64_t ModuleOffset) {
SymbolizableModule *Info = getOrCreateModuleInfo(ModuleName);
if (!Info)
- return printDILineInfo(DILineInfo(), Info);
+ return printDILineInfo(DILineInfo());
// If the user is giving us relative addresses, add the preferred base of the
// object to the offset before we do the query. It's what DIContext expects.
@@ -75,14 +75,16 @@ std::string LLVMSymbolizer::symbolizeCode(const std::string &ModuleName,
DILineInfo LineInfo = Info->symbolizeCode(ModuleOffset, Opts.PrintFunctions,
Opts.UseSymbolTable);
- return printDILineInfo(LineInfo, Info);
+ if (Opts.Demangle)
+ LineInfo.FunctionName = DemangleName(LineInfo.FunctionName, Info);
+ return printDILineInfo(LineInfo);
}
std::string LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName,
uint64_t ModuleOffset) {
SymbolizableModule *Info = getOrCreateModuleInfo(ModuleName);
if (!Info)
- return printDIInliningInfo(DIInliningInfo(), nullptr);
+ return printDIInliningInfo(DIInliningInfo());
// If the user is giving us relative addresses, add the preferred base of the
// object to the offset before we do the query. It's what DIContext expects.
@@ -91,23 +93,33 @@ std::string LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName,
DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable);
- return printDIInliningInfo(InlinedContext, Info);
+ if (Opts.Demangle) {
+ for (int i = 0, n = InlinedContext.getNumberOfFrames(); i < n; i++) {
+ auto *Frame = InlinedContext.getMutableFrame(i);
+ Frame->FunctionName = DemangleName(Frame->FunctionName, Info);
+ }
+ }
+ return printDIInliningInfo(InlinedContext);
}
std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName,
uint64_t ModuleOffset) {
- if (Opts.UseSymbolTable) {
- if (SymbolizableModule *Info = getOrCreateModuleInfo(ModuleName)) {
- // If the user is giving us relative addresses, add the preferred base of
- // the object to the offset before we do the query. It's what DIContext
- // expects.
- if (Opts.RelativeAddresses)
- ModuleOffset += Info->getModulePreferredBase();
- DIGlobal Global = Info->symbolizeData(ModuleOffset);
- return printDIGlobal(Global, Info);
- }
- }
- return printDIGlobal(DIGlobal(), nullptr);
+ if (!Opts.UseSymbolTable)
+ return printDIGlobal(DIGlobal());
+ SymbolizableModule *Info = getOrCreateModuleInfo(ModuleName);
+ if (!Info)
+ return printDIGlobal(DIGlobal());
+
+ // If the user is giving us relative addresses, add the preferred base of
+ // the object to the offset before we do the query. It's what DIContext
+ // expects.
+ if (Opts.RelativeAddresses)
+ ModuleOffset += Info->getModulePreferredBase();
+
+ DIGlobal Global = Info->symbolizeData(ModuleOffset);
+ if (Opts.Demangle)
+ Global.Name = DemangleName(Global.Name, Info);
+ return printDIGlobal(Global);
}
void LLVMSymbolizer::flush() {
@@ -360,15 +372,12 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) {
}
std::string
-LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo,
- const SymbolizableModule *ModInfo) const {
+LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo) const {
std::stringstream Result;
if (Opts.PrintFunctions != FunctionNameKind::None) {
std::string FunctionName = LineInfo.FunctionName;
if (FunctionName == kDILineInfoBadString)
FunctionName = kBadString;
- else if (Opts.Demangle)
- FunctionName = DemangleName(FunctionName, ModInfo);
Result << FunctionName << "\n";
}
std::string Filename = LineInfo.FileName;
@@ -379,28 +388,24 @@ LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo,
}
std::string
-LLVMSymbolizer::printDIInliningInfo(DIInliningInfo InlinedContext,
- const SymbolizableModule *ModInfo) const {
+LLVMSymbolizer::printDIInliningInfo(DIInliningInfo InlinedContext) const {
uint32_t FramesNum = InlinedContext.getNumberOfFrames();
if (FramesNum == 0)
- return printDILineInfo(DILineInfo(), ModInfo);
+ return printDILineInfo(DILineInfo());
std::string Result;
for (uint32_t i = 0; i < FramesNum; i++) {
DILineInfo LineInfo = InlinedContext.getFrame(i);
- Result += printDILineInfo(LineInfo, ModInfo);
+ Result += printDILineInfo(LineInfo);
}
return Result;
}
std::string
-LLVMSymbolizer::printDIGlobal(DIGlobal Global,
- const SymbolizableModule *ModInfo) const {
+LLVMSymbolizer::printDIGlobal(DIGlobal Global) const {
std::stringstream Result;
std::string Name = Global.Name;
if (Name == kDILineInfoBadString)
Name = kBadString;
- else if (Opts.Demangle)
- Name = DemangleName(Name, ModInfo);
Result << Name << "\n";
Result << Global.Start << " " << Global.Size << "\n";
return Result.str();
OpenPOWER on IntegriCloud