Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit b977d3a

Browse files
committed
Let the users of LLVMSymbolizer decide whether they want to symbolize inlined frames.
Introduce LLVMSymbolizer::symbolizeInlinedCode() instead of switching on PrintInlining option passed to the constructor. This will be needed once we retrun structured data (instead of std::string) from LLVMSymbolizer and move printing logic out. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251675 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 1f5948f commit b977d3a

File tree

3 files changed

+42
-21
lines changed

3 files changed

+42
-21
lines changed

include/llvm/DebugInfo/Symbolize/Symbolize.h

+8-6
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,16 @@ class LLVMSymbolizer {
3434
struct Options {
3535
FunctionNameKind PrintFunctions;
3636
bool UseSymbolTable : 1;
37-
bool PrintInlining : 1;
3837
bool Demangle : 1;
3938
bool RelativeAddresses : 1;
4039
std::string DefaultArch;
4140
std::vector<std::string> DsymHints;
4241
Options(FunctionNameKind PrintFunctions = FunctionNameKind::LinkageName,
43-
bool UseSymbolTable = true, bool PrintInlining = true,
44-
bool Demangle = true, bool RelativeAddresses = false,
45-
std::string DefaultArch = "")
42+
bool UseSymbolTable = true, bool Demangle = true,
43+
bool RelativeAddresses = false, std::string DefaultArch = "")
4644
: PrintFunctions(PrintFunctions), UseSymbolTable(UseSymbolTable),
47-
PrintInlining(PrintInlining), Demangle(Demangle),
48-
RelativeAddresses(RelativeAddresses), DefaultArch(DefaultArch) {}
45+
Demangle(Demangle), RelativeAddresses(RelativeAddresses),
46+
DefaultArch(DefaultArch) {}
4947
};
5048

5149
LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) {}
@@ -57,6 +55,8 @@ class LLVMSymbolizer {
5755
// a string (possibly containing newlines).
5856
std::string
5957
symbolizeCode(const std::string &ModuleName, uint64_t ModuleOffset);
58+
std::string symbolizeInlinedCode(const std::string &ModuleName,
59+
uint64_t ModuleOffset);
6060
std::string
6161
symbolizeData(const std::string &ModuleName, uint64_t ModuleOffset);
6262
void flush();
@@ -80,6 +80,8 @@ class LLVMSymbolizer {
8080

8181
std::string printDILineInfo(DILineInfo LineInfo,
8282
const SymbolizableModule *ModInfo) const;
83+
std::string printDIInliningInfo(DIInliningInfo InlinedContext,
84+
const SymbolizableModule *ModInfo) const;
8385
std::string printDIGlobal(DIGlobal Global,
8486
const SymbolizableModule *ModInfo) const;
8587

lib/DebugInfo/Symbolize/Symbolize.cpp

+30-12
Original file line numberDiff line numberDiff line change
@@ -73,23 +73,27 @@ std::string LLVMSymbolizer::symbolizeCode(const std::string &ModuleName,
7373
if (Opts.RelativeAddresses)
7474
ModuleOffset += Info->getModulePreferredBase();
7575

76-
if (Opts.PrintInlining) {
77-
DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
78-
ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable);
79-
uint32_t FramesNum = InlinedContext.getNumberOfFrames();
80-
assert(FramesNum > 0);
81-
std::string Result;
82-
for (uint32_t i = 0; i < FramesNum; i++) {
83-
DILineInfo LineInfo = InlinedContext.getFrame(i);
84-
Result += printDILineInfo(LineInfo, Info);
85-
}
86-
return Result;
87-
}
8876
DILineInfo LineInfo = Info->symbolizeCode(ModuleOffset, Opts.PrintFunctions,
8977
Opts.UseSymbolTable);
9078
return printDILineInfo(LineInfo, Info);
9179
}
9280

81+
std::string LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName,
82+
uint64_t ModuleOffset) {
83+
SymbolizableModule *Info = getOrCreateModuleInfo(ModuleName);
84+
if (!Info)
85+
return printDIInliningInfo(DIInliningInfo(), nullptr);
86+
87+
// If the user is giving us relative addresses, add the preferred base of the
88+
// object to the offset before we do the query. It's what DIContext expects.
89+
if (Opts.RelativeAddresses)
90+
ModuleOffset += Info->getModulePreferredBase();
91+
92+
DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
93+
ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable);
94+
return printDIInliningInfo(InlinedContext, Info);
95+
}
96+
9397
std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName,
9498
uint64_t ModuleOffset) {
9599
if (Opts.UseSymbolTable) {
@@ -374,6 +378,20 @@ LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo,
374378
return Result.str();
375379
}
376380

381+
std::string
382+
LLVMSymbolizer::printDIInliningInfo(DIInliningInfo InlinedContext,
383+
const SymbolizableModule *ModInfo) const {
384+
uint32_t FramesNum = InlinedContext.getNumberOfFrames();
385+
if (FramesNum == 0)
386+
return printDILineInfo(DILineInfo(), ModInfo);
387+
std::string Result;
388+
for (uint32_t i = 0; i < FramesNum; i++) {
389+
DILineInfo LineInfo = InlinedContext.getFrame(i);
390+
Result += printDILineInfo(LineInfo, ModInfo);
391+
}
392+
return Result;
393+
}
394+
377395
std::string
378396
LLVMSymbolizer::printDIGlobal(DIGlobal Global,
379397
const SymbolizableModule *ModInfo) const {

tools/llvm-symbolizer/llvm-symbolizer.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,7 @@ int main(int argc, char **argv) {
133133
llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
134134

135135
cl::ParseCommandLineOptions(argc, argv, "llvm-symbolizer\n");
136-
LLVMSymbolizer::Options Opts(ClPrintFunctions, ClUseSymbolTable,
137-
ClPrintInlining, ClDemangle,
136+
LLVMSymbolizer::Options Opts(ClPrintFunctions, ClUseSymbolTable, ClDemangle,
138137
ClUseRelativeAddress, ClDefaultArch);
139138
for (const auto &hint : ClDsymHint) {
140139
if (sys::path::extension(hint) == ".dSYM") {
@@ -152,7 +151,9 @@ int main(int argc, char **argv) {
152151
while (parseCommand(IsData, ModuleName, ModuleOffset)) {
153152
std::string Result =
154153
IsData ? Symbolizer.symbolizeData(ModuleName, ModuleOffset)
155-
: Symbolizer.symbolizeCode(ModuleName, ModuleOffset);
154+
: ClPrintInlining
155+
? Symbolizer.symbolizeInlinedCode(ModuleName, ModuleOffset)
156+
: Symbolizer.symbolizeCode(ModuleName, ModuleOffset);
156157
if (ClPrintAddress) {
157158
outs() << "0x";
158159
outs().write_hex(ModuleOffset);

0 commit comments

Comments
 (0)