diff options
Diffstat (limited to 'lldb/source')
8 files changed, 103 insertions, 50 deletions
diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index 46c75e3..ef57582 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/source/Commands/CommandObjectFrame.cpp @@ -168,8 +168,7 @@ protected: // We've already handled the case where the value object sp is null, so // this is just to make sure future changes don't skip that: assert(valobj_sp.get() && "Must have a valid ValueObject to print"); - ValueObjectPrinter printer(*valobj_sp, &result.GetOutputStream(), - options); + ValueObjectPrinter printer(*valobj_sp, &result.GetOutputStream(), options); if (llvm::Error error = printer.PrintValueObject()) result.AppendError(toString(std::move(error))); } @@ -899,13 +898,16 @@ void CommandObjectFrameRecognizerAdd::DoExecute(Args &command, auto func = RegularExpressionSP(new RegularExpression(m_options.m_symbols.front())); GetTarget().GetFrameRecognizerManager().AddRecognizer( - recognizer_sp, module, func, m_options.m_first_instruction_only); + recognizer_sp, module, func, Mangled::NamePreference::ePreferDemangled, + m_options.m_first_instruction_only); } else { auto module = ConstString(m_options.m_module); std::vector<ConstString> symbols(m_options.m_symbols.begin(), m_options.m_symbols.end()); GetTarget().GetFrameRecognizerManager().AddRecognizer( - recognizer_sp, module, symbols, m_options.m_first_instruction_only); + recognizer_sp, module, symbols, + Mangled::NamePreference::ePreferDemangled, + m_options.m_first_instruction_only); } #endif @@ -927,6 +929,34 @@ protected: } }; +static void +PrintRecognizerDetails(Stream &strm, const std::string &name, + const std::string &module, + llvm::ArrayRef<lldb_private::ConstString> symbols, + Mangled::NamePreference symbol_mangling, bool regexp) { + strm << name << ", "; + + if (!module.empty()) + strm << "module " << module << ", "; + + switch (symbol_mangling) { + case Mangled::NamePreference ::ePreferMangled: + strm << "mangled symbol "; + break; + case Mangled::NamePreference ::ePreferDemangled: + strm << "demangled symbol "; + break; + case Mangled::NamePreference ::ePreferDemangledWithoutArguments: + strm << "demangled (no args) symbol "; + break; + } + + if (regexp) + strm << "regex "; + + llvm::interleaveComma(symbols, strm); +} + class CommandObjectFrameRecognizerDelete : public CommandObjectParsed { public: CommandObjectFrameRecognizerDelete(CommandInterpreter &interpreter) @@ -947,19 +977,13 @@ public: GetTarget().GetFrameRecognizerManager().ForEach( [&request](uint32_t rid, std::string rname, std::string module, llvm::ArrayRef<lldb_private::ConstString> symbols, - bool regexp) { + Mangled::NamePreference symbol_mangling, bool regexp) { StreamString strm; if (rname.empty()) rname = "(internal)"; - strm << rname; - if (!module.empty()) - strm << ", module " << module; - if (!symbols.empty()) - for (auto &symbol : symbols) - strm << ", symbol " << symbol; - if (regexp) - strm << " (regexp)"; + PrintRecognizerDetails(strm, rname, module, symbols, symbol_mangling, + regexp); request.TryCompleteCurrentArg(std::to_string(rid), strm.GetString()); }); @@ -1016,22 +1040,18 @@ protected: void DoExecute(Args &command, CommandReturnObject &result) override { bool any_printed = false; GetTarget().GetFrameRecognizerManager().ForEach( - [&result, &any_printed]( - uint32_t recognizer_id, std::string name, std::string module, - llvm::ArrayRef<ConstString> symbols, bool regexp) { + [&result, + &any_printed](uint32_t recognizer_id, std::string name, + std::string module, llvm::ArrayRef<ConstString> symbols, + Mangled::NamePreference symbol_mangling, bool regexp) { Stream &stream = result.GetOutputStream(); if (name.empty()) name = "(internal)"; - stream << std::to_string(recognizer_id) << ": " << name; - if (!module.empty()) - stream << ", module " << module; - if (!symbols.empty()) - for (auto &symbol : symbols) - stream << ", symbol " << symbol; - if (regexp) - stream << " (regexp)"; + stream << std::to_string(recognizer_id) << ": "; + PrintRecognizerDetails(stream, name, module, symbols, symbol_mangling, + regexp); stream.EOL(); stream.Flush(); diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td index 9c4dbed..df906e9 100644 --- a/lldb/source/Commands/Options.td +++ b/lldb/source/Commands/Options.td @@ -1049,7 +1049,7 @@ let Command = "thread backtrace" in { def thread_backtrace_extended : Option<"extended", "e">, Group<1>, Arg<"Boolean">, Desc<"Show the extended backtrace, if available">; def thread_backtrace_unfiltered : Option<"unfiltered", "u">, Group<1>, - Desc<"Filter out frames according to installed frame recognizers">; + Desc<"Do not filter out frames according to installed frame recognizers">; } let Command = "thread step scope" in { diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp index 1e4a2cb..faa05e8 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include <cstring> +#include <iostream> #include <memory> @@ -44,7 +45,7 @@ char CPPLanguageRuntime::ID = 0; /// A frame recognizer that is installed to hide libc++ implementation /// details from the backtrace. class LibCXXFrameRecognizer : public StackFrameRecognizer { - RegularExpression m_hidden_function_regex; + std::array<RegularExpression, 4> m_hidden_regex; RecognizedStackFrameSP m_hidden_frame; struct LibCXXHiddenFrame : public RecognizedStackFrame { @@ -53,10 +54,30 @@ class LibCXXFrameRecognizer : public StackFrameRecognizer { public: LibCXXFrameRecognizer() - : m_hidden_function_regex( - R"(^std::__.*::(__function.*::operator\(\)|__invoke))" - R"((\[.*\])?)" // ABI tag. - R"(( const)?$)"), // const. + : m_hidden_regex{ + // internal implementation details of std::function + // std::__1::__function::__alloc_func<void (*)(), std::__1::allocator<void (*)()>, void ()>::operator()[abi:ne200000] + // std::__1::__function::__func<void (*)(), std::__1::allocator<void (*)()>, void ()>::operator() + // std::__1::__function::__value_func<void ()>::operator()[abi:ne200000]() const + RegularExpression{"" + R"(^std::__[^:]*::)" // Namespace. + R"(__function::.*::operator\(\))"}, + // internal implementation details of std::function in ABI v2 + // std::__2::__function::__policy_invoker<void (int, int)>::__call_impl[abi:ne200000]<std::__2::__function::__default_alloc_func<int (*)(int, int), int (int, int)>> + RegularExpression{"" + R"(^std::__[^:]*::)" // Namespace. + R"(__function::.*::__call_impl)"}, + // internal implementation details of std::invoke + // std::__1::__invoke[abi:ne200000]<void (*&)()> + RegularExpression{ + R"(^std::__[^:]*::)" // Namespace. + R"(__invoke)"}, + // internal implementation details of std::invoke + // std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ne200000]<void (*&)()> + RegularExpression{ + R"(^std::__[^:]*::)" // Namespace. + R"(__invoke_void_return_wrapper<.*>::__call)"} + }, m_hidden_frame(new LibCXXHiddenFrame()) {} std::string GetName() override { return "libc++ frame recognizer"; } @@ -69,8 +90,9 @@ public: if (!sc.function) return {}; - if (m_hidden_function_regex.Execute(sc.function->GetNameNoArguments())) - return m_hidden_frame; + for (RegularExpression &r : m_hidden_regex) + if (r.Execute(sc.function->GetNameNoArguments())) + return m_hidden_frame; return {}; } @@ -81,8 +103,9 @@ CPPLanguageRuntime::CPPLanguageRuntime(Process *process) if (process) process->GetTarget().GetFrameRecognizerManager().AddRecognizer( StackFrameRecognizerSP(new LibCXXFrameRecognizer()), {}, - std::make_shared<RegularExpression>("^std::__.*::"), - /*first_instruction_only*/ false); + std::make_shared<RegularExpression>("^std::__[^:]*::"), + /*mangling_preference=*/Mangled::ePreferDemangledWithoutArguments, + /*first_instruction_only=*/false); } bool CPPLanguageRuntime::IsAllowedRuntimeValue(ConstString name) { @@ -108,8 +131,7 @@ bool contains_lambda_identifier(llvm::StringRef &str_ref) { CPPLanguageRuntime::LibCppStdFunctionCallableInfo line_entry_helper(Target &target, const SymbolContext &sc, Symbol *symbol, - llvm::StringRef first_template_param_sref, - bool has_invoke) { + llvm::StringRef first_template_param_sref, bool has_invoke) { CPPLanguageRuntime::LibCppStdFunctionCallableInfo optional_info; @@ -190,7 +212,7 @@ CPPLanguageRuntime::FindLibCppStdFunctionCallableInfo( ValueObjectSP sub_member_f_(member_f_->GetChildMemberWithName("__f_")); if (sub_member_f_) - member_f_ = sub_member_f_; + member_f_ = sub_member_f_; } if (!member_f_) diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp index 9409497..c810ba0 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp @@ -3465,6 +3465,6 @@ static void RegisterObjCExceptionRecognizer(Process *process) { process->GetTarget().GetFrameRecognizerManager().AddRecognizer( StackFrameRecognizerSP(new ObjCExceptionThrowFrameRecognizer()), - module.GetFilename(), symbols, + module.GetFilename(), symbols, Mangled::NamePreference::ePreferDemangled, /*first_instruction_only*/ true); } diff --git a/lldb/source/Plugins/SystemRuntime/MacOSX/AbortWithPayloadFrameRecognizer.cpp b/lldb/source/Plugins/SystemRuntime/MacOSX/AbortWithPayloadFrameRecognizer.cpp index d42e31c..fd04db7 100644 --- a/lldb/source/Plugins/SystemRuntime/MacOSX/AbortWithPayloadFrameRecognizer.cpp +++ b/lldb/source/Plugins/SystemRuntime/MacOSX/AbortWithPayloadFrameRecognizer.cpp @@ -36,8 +36,9 @@ void RegisterAbortWithPayloadFrameRecognizer(Process *process) { return; process->GetTarget().GetFrameRecognizerManager().AddRecognizer( - std::make_shared<AbortWithPayloadFrameRecognizer>(), module_name, - sym_name, /*first_instruction_only*/ false); + std::make_shared<AbortWithPayloadFrameRecognizer>(), module_name, + sym_name, Mangled::NamePreference::ePreferDemangled, + /*first_instruction_only*/ false); } RecognizedStackFrameSP diff --git a/lldb/source/Target/AssertFrameRecognizer.cpp b/lldb/source/Target/AssertFrameRecognizer.cpp index da7c102..00b1f54 100644 --- a/lldb/source/Target/AssertFrameRecognizer.cpp +++ b/lldb/source/Target/AssertFrameRecognizer.cpp @@ -89,6 +89,7 @@ void RegisterAssertFrameRecognizer(Process *process) { target.GetFrameRecognizerManager().AddRecognizer( std::make_shared<AssertFrameRecognizer>(), location.module_spec.GetFilename(), location.symbols, + Mangled::ePreferDemangled, /*first_instruction_only*/ false); return; } @@ -112,6 +113,7 @@ void RegisterAssertFrameRecognizer(Process *process) { std::make_shared<AssertFrameRecognizer>(), std::make_shared<RegularExpression>(std::move(module_re)), std::make_shared<RegularExpression>(std::move(symbol_re)), + Mangled::ePreferDemangled, /*first_instruction_only*/ false); } diff --git a/lldb/source/Target/StackFrameRecognizer.cpp b/lldb/source/Target/StackFrameRecognizer.cpp index 44411af..fa24253 100644 --- a/lldb/source/Target/StackFrameRecognizer.cpp +++ b/lldb/source/Target/StackFrameRecognizer.cpp @@ -62,25 +62,29 @@ void StackFrameRecognizerManager::BumpGeneration() { void StackFrameRecognizerManager::AddRecognizer( StackFrameRecognizerSP recognizer, ConstString module, - llvm::ArrayRef<ConstString> symbols, bool first_instruction_only) { + llvm::ArrayRef<ConstString> symbols, + Mangled::NamePreference symbol_mangling, bool first_instruction_only) { m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, false, module, RegularExpressionSP(), symbols, - RegularExpressionSP(), first_instruction_only}); + RegularExpressionSP(), symbol_mangling, + first_instruction_only}); BumpGeneration(); } void StackFrameRecognizerManager::AddRecognizer( StackFrameRecognizerSP recognizer, RegularExpressionSP module, - RegularExpressionSP symbol, bool first_instruction_only) { + RegularExpressionSP symbol, Mangled::NamePreference symbol_mangling, + bool first_instruction_only) { m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, true, ConstString(), module, std::vector<ConstString>(), - symbol, first_instruction_only}); + symbol, symbol_mangling, first_instruction_only}); BumpGeneration(); } void StackFrameRecognizerManager::ForEach( - const std::function<void(uint32_t, std::string, std::string, - llvm::ArrayRef<ConstString>, bool)> &callback) { + const std::function< + void(uint32_t, std::string, std::string, llvm::ArrayRef<ConstString>, + Mangled::NamePreference name_reference, bool)> &callback) { for (auto entry : m_recognizers) { if (entry.is_regexp) { std::string module_name; @@ -92,11 +96,13 @@ void StackFrameRecognizerManager::ForEach( symbol_name = entry.symbol_regexp->GetText().str(); callback(entry.recognizer_id, entry.recognizer->GetName(), module_name, - llvm::ArrayRef(ConstString(symbol_name)), true); + llvm::ArrayRef(ConstString(symbol_name)), entry.symbol_mangling, + true); } else { callback(entry.recognizer_id, entry.recognizer->GetName(), - entry.module.GetCString(), entry.symbols, false); + entry.module.GetCString(), entry.symbols, entry.symbol_mangling, + false); } } } @@ -125,7 +131,6 @@ StackFrameRecognizerSP StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) { const SymbolContext &symctx = frame->GetSymbolContext( eSymbolContextModule | eSymbolContextFunction | eSymbolContextSymbol); - ConstString function_name = symctx.GetFunctionName(); ModuleSP module_sp = symctx.module_sp; if (!module_sp) return StackFrameRecognizerSP(); @@ -145,6 +150,8 @@ StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) { if (!entry.module_regexp->Execute(module_name.GetStringRef())) continue; + ConstString function_name = symctx.GetFunctionName(entry.symbol_mangling); + if (!entry.symbols.empty()) if (!llvm::is_contained(entry.symbols, function_name)) continue; diff --git a/lldb/source/Target/VerboseTrapFrameRecognizer.cpp b/lldb/source/Target/VerboseTrapFrameRecognizer.cpp index fe72c8a..de710fc 100644 --- a/lldb/source/Target/VerboseTrapFrameRecognizer.cpp +++ b/lldb/source/Target/VerboseTrapFrameRecognizer.cpp @@ -116,7 +116,8 @@ void RegisterVerboseTrapFrameRecognizer(Process &process) { std::make_shared<VerboseTrapFrameRecognizer>(); process.GetTarget().GetFrameRecognizerManager().AddRecognizer( - srf_recognizer_sp, module_regex_sp, symbol_regex_sp, false); + srf_recognizer_sp, module_regex_sp, symbol_regex_sp, + Mangled::ePreferDemangled, false); } } // namespace lldb_private |