Skip to content

Commit b55191a

Browse files
Merge pull request #9485 from felipepiovezan/felipe/cherry_pick_frame_recognizer_stuff
[cherry-pick][lldb] Upstream frame recognizer fixes
2 parents 9d655fd + bd60286 commit b55191a

File tree

16 files changed

+211
-73
lines changed

16 files changed

+211
-73
lines changed

lldb/include/lldb/Target/StackFrameRecognizer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,13 @@ class ScriptedStackFrameRecognizer : public StackFrameRecognizer {
105105
/// Class that provides a registry of known stack frame recognizers.
106106
class StackFrameRecognizerManager {
107107
public:
108+
/// Add a new recognizer that triggers on a given symbol name.
109+
///
110+
/// \param symbol_mangling controls whether the symbol name should be
111+
/// compared to the mangled or demangled name.
108112
void AddRecognizer(lldb::StackFrameRecognizerSP recognizer,
109113
ConstString module, llvm::ArrayRef<ConstString> symbols,
114+
Mangled::NamePreference symbol_mangling,
110115
bool first_instruction_only = true);
111116

112117
/// Add a new recognizer that triggers on a symbol regex.

lldb/source/Commands/CommandObjectFrame.cpp

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,7 @@ class CommandObjectFrameDiagnose : public CommandObjectParsed {
168168
// We've already handled the case where the value object sp is null, so
169169
// this is just to make sure future changes don't skip that:
170170
assert(valobj_sp.get() && "Must have a valid ValueObject to print");
171-
ValueObjectPrinter printer(*valobj_sp, &result.GetOutputStream(),
172-
options);
171+
ValueObjectPrinter printer(*valobj_sp, &result.GetOutputStream(), options);
173172
if (llvm::Error error = printer.PrintValueObject())
174173
result.AppendError(toString(std::move(error)));
175174
}
@@ -906,7 +905,9 @@ void CommandObjectFrameRecognizerAdd::DoExecute(Args &command,
906905
std::vector<ConstString> symbols(m_options.m_symbols.begin(),
907906
m_options.m_symbols.end());
908907
GetTarget().GetFrameRecognizerManager().AddRecognizer(
909-
recognizer_sp, module, symbols, m_options.m_first_instruction_only);
908+
recognizer_sp, module, symbols,
909+
Mangled::NamePreference::ePreferDemangled,
910+
m_options.m_first_instruction_only);
910911
}
911912
#endif
912913

@@ -929,29 +930,31 @@ class CommandObjectFrameRecognizerClear : public CommandObjectParsed {
929930
};
930931

931932
static void
932-
PrintRecognizerDetails(Stream &strm, const std::string &module,
933+
PrintRecognizerDetails(Stream &strm, const std::string &name,
934+
const std::string &module,
933935
llvm::ArrayRef<lldb_private::ConstString> symbols,
934-
Mangled::NamePreference preference, bool regexp) {
936+
Mangled::NamePreference symbol_mangling, bool regexp) {
937+
strm << name << ", ";
938+
935939
if (!module.empty())
936-
strm << ", module " << module;
937-
for (auto &symbol : symbols) {
938-
strm << ", ";
939-
if (!regexp)
940-
strm << "symbol";
941-
else
942-
switch (preference) {
943-
case Mangled::NamePreference ::ePreferMangled:
944-
strm << "mangled symbol regexp";
945-
break;
946-
case Mangled::NamePreference ::ePreferDemangled:
947-
strm << "demangled symbol regexp";
948-
break;
949-
case Mangled::NamePreference ::ePreferDemangledWithoutArguments:
950-
strm << "demangled (no args) symbol regexp";
951-
break;
952-
}
953-
strm << " " << symbol;
940+
strm << "module " << module << ", ";
941+
942+
switch (symbol_mangling) {
943+
case Mangled::NamePreference ::ePreferMangled:
944+
strm << "mangled symbol ";
945+
break;
946+
case Mangled::NamePreference ::ePreferDemangled:
947+
strm << "demangled symbol ";
948+
break;
949+
case Mangled::NamePreference ::ePreferDemangledWithoutArguments:
950+
strm << "demangled (no args) symbol ";
951+
break;
954952
}
953+
954+
if (regexp)
955+
strm << "regex ";
956+
957+
llvm::interleaveComma(symbols, strm);
955958
}
956959

957960
class CommandObjectFrameRecognizerDelete : public CommandObjectParsed {
@@ -974,13 +977,13 @@ class CommandObjectFrameRecognizerDelete : public CommandObjectParsed {
974977
GetTarget().GetFrameRecognizerManager().ForEach(
975978
[&request](uint32_t rid, std::string rname, std::string module,
976979
llvm::ArrayRef<lldb_private::ConstString> symbols,
977-
Mangled::NamePreference preference, bool regexp) {
980+
Mangled::NamePreference symbol_mangling, bool regexp) {
978981
StreamString strm;
979982
if (rname.empty())
980983
rname = "(internal)";
981984

982-
strm << rname;
983-
PrintRecognizerDetails(strm, module, symbols, preference, regexp);
985+
PrintRecognizerDetails(strm, rname, module, symbols, symbol_mangling,
986+
regexp);
984987

985988
request.TryCompleteCurrentArg(std::to_string(rid), strm.GetString());
986989
});
@@ -1040,14 +1043,15 @@ class CommandObjectFrameRecognizerList : public CommandObjectParsed {
10401043
[&result,
10411044
&any_printed](uint32_t recognizer_id, std::string name,
10421045
std::string module, llvm::ArrayRef<ConstString> symbols,
1043-
Mangled::NamePreference preference, bool regexp) {
1046+
Mangled::NamePreference symbol_mangling, bool regexp) {
10441047
Stream &stream = result.GetOutputStream();
10451048

10461049
if (name.empty())
10471050
name = "(internal)";
10481051

1049-
stream << std::to_string(recognizer_id) << ": " << name;
1050-
PrintRecognizerDetails(stream, module, symbols, preference, regexp);
1052+
stream << std::to_string(recognizer_id) << ": ";
1053+
PrintRecognizerDetails(stream, name, module, symbols, symbol_mangling,
1054+
regexp);
10511055

10521056
stream.EOL();
10531057
stream.Flush();

lldb/source/Commands/Options.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ let Command = "thread backtrace" in {
10611061
def thread_backtrace_extended : Option<"extended", "e">, Group<1>,
10621062
Arg<"Boolean">, Desc<"Show the extended backtrace, if available">;
10631063
def thread_backtrace_unfiltered : Option<"unfiltered", "u">, Group<1>,
1064-
Desc<"Filter out frames according to installed frame recognizers">;
1064+
Desc<"Do not filter out frames according to installed frame recognizers">;
10651065
}
10661066

10671067
let Command = "thread step scope" in {

lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include <cstring>
10+
#include <iostream>
1011

1112
#include <memory>
1213

@@ -44,7 +45,7 @@ char CPPLanguageRuntime::ID = 0;
4445
/// A frame recognizer that is installed to hide libc++ implementation
4546
/// details from the backtrace.
4647
class LibCXXFrameRecognizer : public StackFrameRecognizer {
47-
RegularExpression m_hidden_function_regex;
48+
std::array<RegularExpression, 4> m_hidden_regex;
4849
RecognizedStackFrameSP m_hidden_frame;
4950

5051
struct LibCXXHiddenFrame : public RecognizedStackFrame {
@@ -53,10 +54,30 @@ class LibCXXFrameRecognizer : public StackFrameRecognizer {
5354

5455
public:
5556
LibCXXFrameRecognizer()
56-
: m_hidden_function_regex(
57-
R"(^std::__1::(__function.*::operator\(\)|__invoke))"
58-
R"((\[.*\])?)" // ABI tag.
59-
R"(( const)?$)"), // const.
57+
: m_hidden_regex{
58+
// internal implementation details of std::function
59+
// std::__1::__function::__alloc_func<void (*)(), std::__1::allocator<void (*)()>, void ()>::operator()[abi:ne200000]
60+
// std::__1::__function::__func<void (*)(), std::__1::allocator<void (*)()>, void ()>::operator()
61+
// std::__1::__function::__value_func<void ()>::operator()[abi:ne200000]() const
62+
RegularExpression{""
63+
R"(^std::__[^:]*::)" // Namespace.
64+
R"(__function::.*::operator\(\))"},
65+
// internal implementation details of std::function in ABI v2
66+
// std::__2::__function::__policy_invoker<void (int, int)>::__call_impl[abi:ne200000]<std::__2::__function::__default_alloc_func<int (*)(int, int), int (int, int)>>
67+
RegularExpression{""
68+
R"(^std::__[^:]*::)" // Namespace.
69+
R"(__function::.*::__call_impl)"},
70+
// internal implementation details of std::invoke
71+
// std::__1::__invoke[abi:ne200000]<void (*&)()>
72+
RegularExpression{
73+
R"(^std::__[^:]*::)" // Namespace.
74+
R"(__invoke)"},
75+
// internal implementation details of std::invoke
76+
// std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ne200000]<void (*&)()>
77+
RegularExpression{
78+
R"(^std::__[^:]*::)" // Namespace.
79+
R"(__invoke_void_return_wrapper<.*>::__call)"}
80+
},
6081
m_hidden_frame(new LibCXXHiddenFrame()) {}
6182

6283
std::string GetName() override { return "libc++ frame recognizer"; }
@@ -69,8 +90,9 @@ class LibCXXFrameRecognizer : public StackFrameRecognizer {
6990
if (!sc.function)
7091
return {};
7192

72-
if (m_hidden_function_regex.Execute(sc.function->GetNameNoArguments()))
73-
return m_hidden_frame;
93+
for (RegularExpression &r : m_hidden_regex)
94+
if (r.Execute(sc.function->GetNameNoArguments()))
95+
return m_hidden_frame;
7496

7597
return {};
7698
}
@@ -81,9 +103,9 @@ CPPLanguageRuntime::CPPLanguageRuntime(Process *process)
81103
if (process)
82104
process->GetTarget().GetFrameRecognizerManager().AddRecognizer(
83105
StackFrameRecognizerSP(new LibCXXFrameRecognizer()), {},
84-
std::make_shared<RegularExpression>("^std::__1::"),
85-
Mangled::NamePreference::ePreferDemangledWithoutArguments,
86-
/*first_instruction_only*/ false);
106+
std::make_shared<RegularExpression>("^std::__[^:]*::"),
107+
/*mangling_preference=*/Mangled::ePreferDemangledWithoutArguments,
108+
/*first_instruction_only=*/false);
87109
}
88110

89111
bool CPPLanguageRuntime::IsAllowedRuntimeValue(ConstString name) {
@@ -109,8 +131,7 @@ bool contains_lambda_identifier(llvm::StringRef &str_ref) {
109131

110132
CPPLanguageRuntime::LibCppStdFunctionCallableInfo
111133
line_entry_helper(Target &target, const SymbolContext &sc, Symbol *symbol,
112-
llvm::StringRef first_template_param_sref,
113-
bool has_invoke) {
134+
llvm::StringRef first_template_param_sref, bool has_invoke) {
114135

115136
CPPLanguageRuntime::LibCppStdFunctionCallableInfo optional_info;
116137

@@ -191,7 +212,7 @@ CPPLanguageRuntime::FindLibCppStdFunctionCallableInfo(
191212
ValueObjectSP sub_member_f_(member_f_->GetChildMemberWithName("__f_"));
192213

193214
if (sub_member_f_)
194-
member_f_ = sub_member_f_;
215+
member_f_ = sub_member_f_;
195216
}
196217

197218
if (!member_f_)

lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3478,6 +3478,6 @@ static void RegisterObjCExceptionRecognizer(Process *process) {
34783478

34793479
process->GetTarget().GetFrameRecognizerManager().AddRecognizer(
34803480
StackFrameRecognizerSP(new ObjCExceptionThrowFrameRecognizer()),
3481-
module.GetFilename(), symbols,
3481+
module.GetFilename(), symbols, Mangled::NamePreference::ePreferDemangled,
34823482
/*first_instruction_only*/ true);
34833483
}

lldb/source/Plugins/SystemRuntime/MacOSX/AbortWithPayloadFrameRecognizer.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ void RegisterAbortWithPayloadFrameRecognizer(Process *process) {
3636
return;
3737

3838
process->GetTarget().GetFrameRecognizerManager().AddRecognizer(
39-
std::make_shared<AbortWithPayloadFrameRecognizer>(), module_name,
40-
sym_name, /*first_instruction_only*/ false);
39+
std::make_shared<AbortWithPayloadFrameRecognizer>(), module_name,
40+
sym_name, Mangled::NamePreference::ePreferDemangled,
41+
/*first_instruction_only*/ false);
4142
}
4243

4344
RecognizedStackFrameSP

lldb/source/Target/AssertFrameRecognizer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void RegisterAssertFrameRecognizer(Process *process) {
8989
target.GetFrameRecognizerManager().AddRecognizer(
9090
std::make_shared<AssertFrameRecognizer>(),
9191
location.module_spec.GetFilename(), location.symbols,
92+
Mangled::ePreferDemangled,
9293
/*first_instruction_only*/ false);
9394
return;
9495
}
@@ -112,7 +113,7 @@ void RegisterAssertFrameRecognizer(Process *process) {
112113
std::make_shared<AssertFrameRecognizer>(),
113114
std::make_shared<RegularExpression>(std::move(module_re)),
114115
std::make_shared<RegularExpression>(std::move(symbol_re)),
115-
Mangled::ePreferMangled,
116+
Mangled::ePreferDemangled,
116117
/*first_instruction_only*/ false);
117118
}
118119

lldb/source/Target/StackFrameRecognizer.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,12 @@ void StackFrameRecognizerManager::BumpGeneration() {
6262

6363
void StackFrameRecognizerManager::AddRecognizer(
6464
StackFrameRecognizerSP recognizer, ConstString module,
65-
llvm::ArrayRef<ConstString> symbols, bool first_instruction_only) {
66-
m_recognizers.push_front(
67-
{(uint32_t)m_recognizers.size(), recognizer, false, module,
68-
RegularExpressionSP(), symbols, RegularExpressionSP(),
69-
Mangled::NamePreference::ePreferMangled, first_instruction_only});
65+
llvm::ArrayRef<ConstString> symbols,
66+
Mangled::NamePreference symbol_mangling, bool first_instruction_only) {
67+
m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, false,
68+
module, RegularExpressionSP(), symbols,
69+
RegularExpressionSP(), symbol_mangling,
70+
first_instruction_only});
7071
BumpGeneration();
7172
}
7273

@@ -81,10 +82,10 @@ void StackFrameRecognizerManager::AddRecognizer(
8182
}
8283

8384
void StackFrameRecognizerManager::ForEach(
84-
const std::function<void(uint32_t, std::string, std::string,
85-
llvm::ArrayRef<ConstString>,
86-
Mangled::NamePreference, bool)> &callback) {
87-
for (const auto &entry : m_recognizers) {
85+
const std::function<
86+
void(uint32_t, std::string, std::string, llvm::ArrayRef<ConstString>,
87+
Mangled::NamePreference name_reference, bool)> &callback) {
88+
for (auto entry : m_recognizers) {
8889
if (entry.is_regexp) {
8990
std::string module_name;
9091
std::string symbol_name;
@@ -130,7 +131,6 @@ StackFrameRecognizerSP
130131
StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) {
131132
const SymbolContext &symctx = frame->GetSymbolContext(
132133
eSymbolContextModule | eSymbolContextFunction | eSymbolContextSymbol);
133-
ConstString function_name = symctx.GetFunctionName();
134134
ModuleSP module_sp = symctx.module_sp;
135135
if (!module_sp)
136136
return StackFrameRecognizerSP();
@@ -150,13 +150,14 @@ StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) {
150150
if (!entry.module_regexp->Execute(module_name.GetStringRef()))
151151
continue;
152152

153+
ConstString function_name = symctx.GetFunctionName(entry.symbol_mangling);
154+
153155
if (!entry.symbols.empty())
154156
if (!llvm::is_contained(entry.symbols, function_name))
155157
continue;
156158

157159
if (entry.symbol_regexp)
158-
if (!entry.symbol_regexp->Execute(
159-
symctx.GetFunctionName(entry.symbol_mangling)))
160+
if (!entry.symbol_regexp->Execute(function_name.GetStringRef()))
160161
continue;
161162

162163
if (entry.first_instruction_only)

lldb/source/Target/VerboseTrapFrameRecognizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void RegisterVerboseTrapFrameRecognizer(Process &process) {
156156

157157
process.GetTarget().GetFrameRecognizerManager().AddRecognizer(
158158
srf_recognizer_sp, module_regex_sp, symbol_regex_sp,
159-
Mangled::ePreferMangled, false);
159+
Mangled::ePreferDemangled, false);
160160
}
161161

162162
} // namespace lldb_private

0 commit comments

Comments
 (0)