diff --git a/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h b/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h --- a/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h +++ b/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h @@ -36,6 +36,7 @@ int PrintSourceContext; bool Verbose; OutputStyle Style; + bool PrintSourceFiles; void print(const DILineInfo &Info, bool Inlined); void printContext(const std::string &FileName, int64_t Line); @@ -43,10 +44,11 @@ public: DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true, bool PrintPretty = false, int PrintSourceContext = 0, - bool Verbose = false, OutputStyle Style = OutputStyle::LLVM) + bool Verbose = false, OutputStyle Style = OutputStyle::LLVM, + bool PrintSourceFiles = true) : OS(OS), PrintFunctionNames(PrintFunctionNames), PrintPretty(PrintPretty), PrintSourceContext(PrintSourceContext), - Verbose(Verbose), Style(Style) {} + Verbose(Verbose), Style(Style), PrintSourceFiles(PrintSourceFiles) {} DIPrinter &operator<<(const DILineInfo &Info); DIPrinter &operator<<(const DIInliningInfo &Info); diff --git a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp --- a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp +++ b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp @@ -70,6 +70,8 @@ StringRef Prefix = (PrintPretty && Inlined) ? " (inlined by) " : ""; OS << Prefix << FunctionName << Delimiter; } + if (!PrintSourceFiles) + return; std::string Filename = Info.FileName; if (Filename == DILineInfo::BadString) Filename = DILineInfo::Addr2LineBadString; diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -63,6 +63,12 @@ static cl::opt ClPrintInlining("inlining", cl::init(true), cl::desc("Print all inlined frames for a given address")); + +static cl::opt + ClNoPrintInlining("no-inlining", cl::init(false), + cl::desc("Don't print all inlined frames for a given" + " address")); + static cl::alias ClPrintInliningAliasI("i", cl::desc("Alias for -inlining"), cl::NotHidden, cl::aliasopt(ClPrintInlining), @@ -89,6 +95,14 @@ ClNoDemangle("no-demangle", cl::init(false), cl::desc("Don't demangle function names")); +static cl::opt + ClSourceFile("source-file", cl::init(true), + cl::desc("Print source file info for a given address")); + +static cl::opt ClNoSourceFile( + "no-source-file", cl::init(false), + cl::desc("Don't print source file info for a given address")); + static cl::opt ClDefaultArch("default-arch", cl::init(""), cl::desc("Default architecture " "(for multi-arch objects)")); @@ -280,7 +294,7 @@ ModuleName, {Offset, object::SectionedAddress::UndefSection}); Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get()); } - if (ClOutputStyle == DIPrinter::OutputStyle::LLVM) + if (ClOutputStyle == DIPrinter::OutputStyle::LLVM && ClPrintInlining) outs() << "\n"; } @@ -307,6 +321,12 @@ if (ClNoDemangle.getPosition() > ClDemangle.getPosition()) ClDemangle = !ClNoDemangle; + if (ClNoSourceFile.getPosition() > ClSourceFile.getPosition()) + ClSourceFile = !ClNoSourceFile; + + if (ClNoPrintInlining.getPosition() > ClPrintInlining.getPosition()) + ClPrintInlining = !ClNoPrintInlining; + LLVMSymbolizer::Options Opts; Opts.PrintFunctions = ClPrintFunctions; Opts.UseSymbolTable = ClUseSymbolTable; @@ -326,6 +346,9 @@ else if (ClRelativenames) Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::RelativeFilePath; + if (!ClSourceFile) + Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::None; + for (const auto &hint : ClDsymHint) { if (sys::path::extension(hint) == ".dSYM") { Opts.DsymHints.push_back(hint); @@ -338,7 +361,7 @@ DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None, ClPrettyPrint, ClPrintSourceContextLines, ClVerbose, - ClOutputStyle); + ClOutputStyle, ClSourceFile); if (ClInputAddresses.empty()) { const int kMaxInputStringLength = 1024;