Let the users of LLVMSymbolizer decide whether they want to symbolize inlined frames.
[oota-llvm.git] / lib / DebugInfo / Symbolize / Symbolize.cpp
index 87f76eda6c7b99faabe394cee89014ba9614c188..2e6f60416a4e0881a5c2a3eefbd430bfd7bd2289 100644 (file)
@@ -73,23 +73,27 @@ std::string LLVMSymbolizer::symbolizeCode(const std::string &ModuleName,
   if (Opts.RelativeAddresses)
     ModuleOffset += Info->getModulePreferredBase();
 
-  if (Opts.PrintInlining) {
-    DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
-        ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable);
-    uint32_t FramesNum = InlinedContext.getNumberOfFrames();
-    assert(FramesNum > 0);
-    std::string Result;
-    for (uint32_t i = 0; i < FramesNum; i++) {
-      DILineInfo LineInfo = InlinedContext.getFrame(i);
-      Result += printDILineInfo(LineInfo, Info);
-    }
-    return Result;
-  }
   DILineInfo LineInfo = Info->symbolizeCode(ModuleOffset, Opts.PrintFunctions,
                                             Opts.UseSymbolTable);
   return printDILineInfo(LineInfo, Info);
 }
 
+std::string LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName,
+                                                 uint64_t ModuleOffset) {
+  SymbolizableModule *Info = getOrCreateModuleInfo(ModuleName);
+  if (!Info)
+    return printDIInliningInfo(DIInliningInfo(), nullptr);
+
+  // 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();
+
+  DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
+      ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable);
+  return printDIInliningInfo(InlinedContext, Info);
+}
+
 std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName,
                                           uint64_t ModuleOffset) {
   if (Opts.UseSymbolTable) {
@@ -374,6 +378,20 @@ LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo,
   return Result.str();
 }
 
+std::string
+LLVMSymbolizer::printDIInliningInfo(DIInliningInfo InlinedContext,
+                                   const SymbolizableModule *ModInfo) const {
+  uint32_t FramesNum = InlinedContext.getNumberOfFrames();
+  if (FramesNum == 0)
+    return printDILineInfo(DILineInfo(), ModInfo);
+  std::string Result;
+  for (uint32_t i = 0; i < FramesNum; i++) {
+    DILineInfo LineInfo = InlinedContext.getFrame(i);
+    Result += printDILineInfo(LineInfo, ModInfo);
+  }
+  return Result;
+}
+
 std::string
 LLVMSymbolizer::printDIGlobal(DIGlobal Global,
                               const SymbolizableModule *ModInfo) const {