Skip to content

Commit e384eb9

Browse files
committed
Copy additional content from adrian-prantl's commit
1 parent 6947b13 commit e384eb9

File tree

13 files changed

+125
-76
lines changed

13 files changed

+125
-76
lines changed

lldb/include/lldb/Target/StackFrameRecognizer.h

+15-6
Original file line numberDiff line numberDiff line change
@@ -105,21 +105,30 @@ 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,
110-
bool first_instruction_only = true,
111-
Mangled::NamePreference mangling_preference = Mangled::ePreferDemangled);
114+
Mangled::NamePreference symbol_mangling,
115+
bool first_instruction_only = true);
112116

117+
/// Add a new recognizer that triggers on a symbol regex.
118+
///
119+
/// \param symbol_mangling controls whether the regex should apply
120+
/// to the mangled or demangled name.
113121
void AddRecognizer(lldb::StackFrameRecognizerSP recognizer,
114122
lldb::RegularExpressionSP module,
115123
lldb::RegularExpressionSP symbol,
116-
bool first_instruction_only = true,
117-
Mangled::NamePreference mangling_preference = Mangled::ePreferDemangled);
124+
Mangled::NamePreference symbol_mangling,
125+
bool first_instruction_only = true);
118126

119127
void ForEach(std::function<
120128
void(uint32_t recognizer_id, std::string recognizer_name,
121129
std::string module, llvm::ArrayRef<ConstString> symbols,
122-
bool regexp)> const &callback);
130+
Mangled::NamePreference name_reference, bool regexp)> const
131+
&callback);
123132

124133
bool RemoveRecognizerWithID(uint32_t recognizer_id);
125134

@@ -144,8 +153,8 @@ class StackFrameRecognizerManager {
144153
lldb::RegularExpressionSP module_regexp;
145154
std::vector<ConstString> symbols;
146155
lldb::RegularExpressionSP symbol_regexp;
156+
Mangled::NamePreference symbol_mangling;
147157
bool first_instruction_only;
148-
Mangled::NamePreference mangling_preference;
149158
};
150159

151160
std::deque<RegisteredEntry> m_recognizers;

lldb/source/Commands/CommandObjectFrame.cpp

+44-24
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
}
@@ -899,13 +898,16 @@ void CommandObjectFrameRecognizerAdd::DoExecute(Args &command,
899898
auto func =
900899
RegularExpressionSP(new RegularExpression(m_options.m_symbols.front()));
901900
GetTarget().GetFrameRecognizerManager().AddRecognizer(
902-
recognizer_sp, module, func, m_options.m_first_instruction_only);
901+
recognizer_sp, module, func, Mangled::NamePreference::ePreferDemangled,
902+
m_options.m_first_instruction_only);
903903
} else {
904904
auto module = ConstString(m_options.m_module);
905905
std::vector<ConstString> symbols(m_options.m_symbols.begin(),
906906
m_options.m_symbols.end());
907907
GetTarget().GetFrameRecognizerManager().AddRecognizer(
908-
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);
909911
}
910912
#endif
911913

@@ -927,6 +929,34 @@ class CommandObjectFrameRecognizerClear : public CommandObjectParsed {
927929
}
928930
};
929931

932+
static void
933+
PrintRecognizerDetails(Stream &strm, const std::string &name,
934+
const std::string &module,
935+
llvm::ArrayRef<lldb_private::ConstString> symbols,
936+
Mangled::NamePreference symbol_mangling, bool regexp) {
937+
strm << name << ", ";
938+
939+
if (!module.empty())
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;
952+
}
953+
954+
if (regexp)
955+
strm << "regex ";
956+
957+
llvm::interleaveComma(symbols, strm);
958+
}
959+
930960
class CommandObjectFrameRecognizerDelete : public CommandObjectParsed {
931961
public:
932962
CommandObjectFrameRecognizerDelete(CommandInterpreter &interpreter)
@@ -947,19 +977,13 @@ class CommandObjectFrameRecognizerDelete : public CommandObjectParsed {
947977
GetTarget().GetFrameRecognizerManager().ForEach(
948978
[&request](uint32_t rid, std::string rname, std::string module,
949979
llvm::ArrayRef<lldb_private::ConstString> symbols,
950-
bool regexp) {
980+
Mangled::NamePreference symbol_mangling, bool regexp) {
951981
StreamString strm;
952982
if (rname.empty())
953983
rname = "(internal)";
954984

955-
strm << rname;
956-
if (!module.empty())
957-
strm << ", module " << module;
958-
if (!symbols.empty())
959-
for (auto &symbol : symbols)
960-
strm << ", symbol " << symbol;
961-
if (regexp)
962-
strm << " (regexp)";
985+
PrintRecognizerDetails(strm, rname, module, symbols, symbol_mangling,
986+
regexp);
963987

964988
request.TryCompleteCurrentArg(std::to_string(rid), strm.GetString());
965989
});
@@ -1016,22 +1040,18 @@ class CommandObjectFrameRecognizerList : public CommandObjectParsed {
10161040
void DoExecute(Args &command, CommandReturnObject &result) override {
10171041
bool any_printed = false;
10181042
GetTarget().GetFrameRecognizerManager().ForEach(
1019-
[&result, &any_printed](
1020-
uint32_t recognizer_id, std::string name, std::string module,
1021-
llvm::ArrayRef<ConstString> symbols, bool regexp) {
1043+
[&result,
1044+
&any_printed](uint32_t recognizer_id, std::string name,
1045+
std::string module, llvm::ArrayRef<ConstString> symbols,
1046+
Mangled::NamePreference symbol_mangling, bool regexp) {
10221047
Stream &stream = result.GetOutputStream();
10231048

10241049
if (name.empty())
10251050
name = "(internal)";
10261051

1027-
stream << std::to_string(recognizer_id) << ": " << name;
1028-
if (!module.empty())
1029-
stream << ", module " << module;
1030-
if (!symbols.empty())
1031-
for (auto &symbol : symbols)
1032-
stream << ", symbol " << symbol;
1033-
if (regexp)
1034-
stream << " (regexp)";
1052+
stream << std::to_string(recognizer_id) << ": ";
1053+
PrintRecognizerDetails(stream, name, module, symbols, symbol_mangling,
1054+
regexp);
10351055

10361056
stream.EOL();
10371057
stream.Flush();

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ CPPLanguageRuntime::CPPLanguageRuntime(Process *process)
106106
process->GetTarget().GetFrameRecognizerManager().AddRecognizer(
107107
StackFrameRecognizerSP(new LibCXXFrameRecognizer()), {},
108108
std::make_shared<RegularExpression>("^std::__[^:]*::"),
109-
/*first_instruction_only=*/ false,
110-
/*mangling_preference=*/ Mangled::ePreferDemangledWithoutArguments);
109+
/*mangling_preference=*/Mangled::ePreferDemangledWithoutArguments,
110+
/*first_instruction_only=*/false);
111111
}
112112

113113
bool CPPLanguageRuntime::IsAllowedRuntimeValue(ConstString name) {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -3465,6 +3465,6 @@ static void RegisterObjCExceptionRecognizer(Process *process) {
34653465

34663466
process->GetTarget().GetFrameRecognizerManager().AddRecognizer(
34673467
StackFrameRecognizerSP(new ObjCExceptionThrowFrameRecognizer()),
3468-
module.GetFilename(), symbols,
3468+
module.GetFilename(), symbols, Mangled::NamePreference::ePreferDemangled,
34693469
/*first_instruction_only*/ true);
34703470
}

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

+6-5
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
@@ -55,7 +56,7 @@ AbortWithPayloadFrameRecognizer::RecognizeFrame(lldb::StackFrameSP frame_sp) {
5556
static constexpr llvm::StringLiteral info_key("abort_with_payload");
5657

5758
Log *log = GetLog(LLDBLog::SystemRuntime);
58-
59+
5960
if (!frame_sp) {
6061
LLDB_LOG(log, "abort_with_payload recognizer: invalid frame.");
6162
return {};
@@ -196,8 +197,8 @@ AbortWithPayloadFrameRecognizer::RecognizeFrame(lldb::StackFrameSP frame_sp) {
196197
abort_dict_sp->AddStringItem(reason_key, reason_string);
197198
abort_dict_sp->AddIntegerItem(flags_key, flags_val);
198199

199-
// This will overwrite the abort_with_payload information in the dictionary
200-
// already. But we can only crash on abort_with_payload once, so that
200+
// This will overwrite the abort_with_payload information in the dictionary
201+
// already. But we can only crash on abort_with_payload once, so that
201202
// shouldn't matter.
202203
process->GetExtendedCrashInfoDict()->AddItem(info_key, abort_dict_sp);
203204

lldb/source/Target/AssertFrameRecognizer.cpp

+2
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,6 +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)),
116+
Mangled::ePreferDemangled,
115117
/*first_instruction_only*/ false);
116118
}
117119

lldb/source/Target/StackFrameRecognizer.cpp

+15-21
Original file line numberDiff line numberDiff line change
@@ -62,28 +62,29 @@ void StackFrameRecognizerManager::BumpGeneration() {
6262

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

7374
void StackFrameRecognizerManager::AddRecognizer(
7475
StackFrameRecognizerSP recognizer, RegularExpressionSP module,
75-
RegularExpressionSP symbol, bool first_instruction_only,
76-
Mangled::NamePreference mangling_preference) {
76+
RegularExpressionSP symbol, Mangled::NamePreference symbol_mangling,
77+
bool first_instruction_only) {
7778
m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, true,
7879
ConstString(), module, std::vector<ConstString>(),
79-
symbol, first_instruction_only,
80-
mangling_preference});
80+
symbol, symbol_mangling, first_instruction_only});
8181
BumpGeneration();
8282
}
8383

8484
void StackFrameRecognizerManager::ForEach(
85-
const std::function<void(uint32_t, std::string, std::string,
86-
llvm::ArrayRef<ConstString>, bool)> &callback) {
85+
const std::function<
86+
void(uint32_t, std::string, std::string, llvm::ArrayRef<ConstString>,
87+
Mangled::NamePreference name_reference, bool)> &callback) {
8788
for (auto entry : m_recognizers) {
8889
if (entry.is_regexp) {
8990
std::string module_name;
@@ -95,11 +96,13 @@ void StackFrameRecognizerManager::ForEach(
9596
symbol_name = entry.symbol_regexp->GetText().str();
9697

9798
callback(entry.recognizer_id, entry.recognizer->GetName(), module_name,
98-
llvm::ArrayRef(ConstString(symbol_name)), true);
99+
llvm::ArrayRef(ConstString(symbol_name)), entry.symbol_mangling,
100+
true);
99101

100102
} else {
101103
callback(entry.recognizer_id, entry.recognizer->GetName(),
102-
entry.module.GetCString(), entry.symbols, false);
104+
entry.module.GetCString(), entry.symbols, entry.symbol_mangling,
105+
false);
103106
}
104107
}
105108
}
@@ -147,16 +150,7 @@ StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) {
147150
if (!entry.module_regexp->Execute(module_name.GetStringRef()))
148151
continue;
149152

150-
ConstString function_name = [&]() {
151-
switch (entry.mangling_preference) {
152-
case Mangled::ePreferMangled:
153-
return symctx.GetFunctionName(entry.mangling_preference);
154-
case Mangled::ePreferDemangled:
155-
return symctx.GetFunctionName(entry.mangling_preference);
156-
case Mangled::ePreferDemangledWithoutArguments:
157-
return symctx.GetFunctionName(entry.mangling_preference);
158-
}
159-
}();
153+
ConstString function_name = symctx.GetFunctionName(entry.symbol_mangling);
160154

161155
if (!entry.symbols.empty())
162156
if (!llvm::is_contained(entry.symbols, function_name))

lldb/source/Target/VerboseTrapFrameRecognizer.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ void RegisterVerboseTrapFrameRecognizer(Process &process) {
116116
std::make_shared<VerboseTrapFrameRecognizer>();
117117

118118
process.GetTarget().GetFrameRecognizerManager().AddRecognizer(
119-
srf_recognizer_sp, module_regex_sp, symbol_regex_sp, false);
119+
srf_recognizer_sp, module_regex_sp, symbol_regex_sp,
120+
Mangled::ePreferDemangled, false);
120121
}
121122

122123
} // namespace lldb_private

lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ def test_frame_recognizer_1(self):
3535

3636
self.expect(
3737
"frame recognizer list",
38-
substrs=["0: recognizer.MyFrameRecognizer, module a.out, symbol foo"],
38+
substrs=[
39+
"0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo"
40+
],
3941
)
4042

4143
self.runCmd(
@@ -45,8 +47,8 @@ def test_frame_recognizer_1(self):
4547
self.expect(
4648
"frame recognizer list",
4749
substrs=[
48-
"1: recognizer.MyOtherFrameRecognizer, module a.out, symbol bar (regexp)",
49-
"0: recognizer.MyFrameRecognizer, module a.out, symbol foo",
50+
"1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar",
51+
"0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo",
5052
],
5153
)
5254

@@ -56,7 +58,7 @@ def test_frame_recognizer_1(self):
5658
self.expect(
5759
"frame recognizer list",
5860
substrs=[
59-
"1: recognizer.MyOtherFrameRecognizer, module a.out, symbol bar (regexp)"
61+
"1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol bar (regexp)"
6062
],
6163
)
6264
self.expect(
@@ -79,7 +81,7 @@ def test_frame_recognizer_1(self):
7981
self.expect(
8082
"frame recognizer list",
8183
substrs=[
82-
"1: recognizer.MyOtherFrameRecognizer, module a.out, symbol bar (regexp)"
84+
"1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regexp bar"
8385
],
8486
)
8587
self.expect(
@@ -224,7 +226,7 @@ def test_frame_recognizer_multi_symbol(self):
224226
self.expect(
225227
"frame recognizer list",
226228
substrs=[
227-
"recognizer.MyFrameRecognizer, module a.out, symbol foo, symbol bar"
229+
"recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar"
228230
],
229231
)
230232

@@ -279,7 +281,7 @@ def test_frame_recognizer_target_specific(self):
279281
self.expect(
280282
"frame recognizer list",
281283
substrs=[
282-
"recognizer.MyFrameRecognizer, module a.out, symbol foo, symbol bar"
284+
"recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar"
283285
],
284286
)
285287

@@ -305,7 +307,9 @@ def test_frame_recognizer_target_specific(self):
305307

306308
self.expect(
307309
"frame recognizer list",
308-
substrs=["recognizer.MyFrameRecognizer, module a.out, symbol bar"],
310+
substrs=[
311+
"recognizer.MyFrameRecognizer, module a.out, demangled symbol bar"
312+
],
309313
)
310314

311315
# Now the new target should also recognize the frame.

lldb/test/API/functionalities/completion/TestCompletion.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,7 @@ def test_frame_recognizer_delete(self):
708708
)
709709
self.check_completion_with_desc(
710710
"frame recognizer delete ",
711-
[["0", "py_class, module module_name, symbol recognizer_name"]],
711+
[["0", "py_class, module module_name, demangled symbol recognizer_name"]],
712712
)
713713

714714
def test_platform_install_local_file(self):

0 commit comments

Comments
 (0)