Skip to content

Commit 0259bf8

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

File tree

10 files changed

+89
-66
lines changed

10 files changed

+89
-66
lines changed

lldb/include/lldb/Target/StackFrameRecognizer.h

Lines changed: 15 additions & 6 deletions
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

Lines changed: 41 additions & 24 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
}
@@ -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,31 @@ class CommandObjectFrameRecognizerClear : public CommandObjectParsed {
927929
}
928930
};
929931

932+
static void
933+
PrintRecognizerDetails(Stream &strm, const std::string &module,
934+
llvm::ArrayRef<lldb_private::ConstString> symbols,
935+
Mangled::NamePreference symbol_mangling, bool regexp) {
936+
if (!module.empty())
937+
strm << ", module " << module;
938+
939+
switch (symbol_mangling) {
940+
case Mangled::NamePreference ::ePreferMangled:
941+
strm << "mangled symbol ";
942+
break;
943+
case Mangled::NamePreference ::ePreferDemangled:
944+
strm << "demangled symbol ";
945+
break;
946+
case Mangled::NamePreference ::ePreferDemangledWithoutArguments:
947+
strm << "demangled (no args) symbol ";
948+
break;
949+
}
950+
951+
if (regexp)
952+
strm << "regex ";
953+
954+
llvm::interleaveComma(symbols, strm);
955+
}
956+
930957
class CommandObjectFrameRecognizerDelete : public CommandObjectParsed {
931958
public:
932959
CommandObjectFrameRecognizerDelete(CommandInterpreter &interpreter)
@@ -947,19 +974,13 @@ class CommandObjectFrameRecognizerDelete : public CommandObjectParsed {
947974
GetTarget().GetFrameRecognizerManager().ForEach(
948975
[&request](uint32_t rid, std::string rname, std::string module,
949976
llvm::ArrayRef<lldb_private::ConstString> symbols,
950-
bool regexp) {
977+
Mangled::NamePreference symbol_mangling, bool regexp) {
951978
StreamString strm;
952979
if (rname.empty())
953980
rname = "(internal)";
954981

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)";
982+
PrintRecognizerDetails(strm, module, symbols, symbol_mangling,
983+
regexp);
963984

964985
request.TryCompleteCurrentArg(std::to_string(rid), strm.GetString());
965986
});
@@ -1016,22 +1037,18 @@ class CommandObjectFrameRecognizerList : public CommandObjectParsed {
10161037
void DoExecute(Args &command, CommandReturnObject &result) override {
10171038
bool any_printed = false;
10181039
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) {
1040+
[&result,
1041+
&any_printed](uint32_t recognizer_id, std::string name,
1042+
std::string module, llvm::ArrayRef<ConstString> symbols,
1043+
Mangled::NamePreference symbol_mangling, bool regexp) {
10221044
Stream &stream = result.GetOutputStream();
10231045

10241046
if (name.empty())
10251047
name = "(internal)";
1026-
10271048
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)";
1049+
1050+
PrintRecognizerDetails(stream, module, symbols, symbol_mangling,
1051+
regexp);
10351052

10361053
stream.EOL();
10371054
stream.Flush();

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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 1 addition & 1 deletion
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

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 & 0 deletions
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

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,28 +62,28 @@ 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, first_instruction_only});
7070
BumpGeneration();
7171
}
7272

7373
void StackFrameRecognizerManager::AddRecognizer(
7474
StackFrameRecognizerSP recognizer, RegularExpressionSP module,
75-
RegularExpressionSP symbol, bool first_instruction_only,
76-
Mangled::NamePreference mangling_preference) {
75+
RegularExpressionSP symbol,
76+
Mangled::NamePreference symbol_mangling, bool first_instruction_only) {
7777
m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, true,
7878
ConstString(), module, std::vector<ConstString>(),
79-
symbol, first_instruction_only,
80-
mangling_preference});
79+
symbol, symbol_mangling, first_instruction_only});
8180
BumpGeneration();
8281
}
8382

8483
void StackFrameRecognizerManager::ForEach(
85-
const std::function<void(uint32_t, std::string, std::string,
86-
llvm::ArrayRef<ConstString>, bool)> &callback) {
84+
const std::function<
85+
void(uint32_t, std::string, std::string, llvm::ArrayRef<ConstString>,
86+
Mangled::NamePreference name_reference, bool)> &callback) {
8787
for (auto entry : m_recognizers) {
8888
if (entry.is_regexp) {
8989
std::string module_name;
@@ -95,11 +95,13 @@ void StackFrameRecognizerManager::ForEach(
9595
symbol_name = entry.symbol_regexp->GetText().str();
9696

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

100101
} else {
101102
callback(entry.recognizer_id, entry.recognizer->GetName(),
102-
entry.module.GetCString(), entry.symbols, false);
103+
entry.module.GetCString(), entry.symbols, entry.symbol_mangling,
104+
false);
103105
}
104106
}
105107
}
@@ -147,16 +149,7 @@ StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) {
147149
if (!entry.module_regexp->Execute(module_name.GetStringRef()))
148150
continue;
149151

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-
}();
152+
ConstString function_name = symctx.GetFunctionName(entry.symbol_mangling);
160153

161154
if (!entry.symbols.empty())
162155
if (!llvm::is_contained(entry.symbols, function_name))

lldb/source/Target/VerboseTrapFrameRecognizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ 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, Mangled::ePreferDemangled, false);
120120
}
121121

122122
} // namespace lldb_private

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ 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=["0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo"],
3939
)
4040

4141
self.runCmd(
@@ -45,8 +45,8 @@ def test_frame_recognizer_1(self):
4545
self.expect(
4646
"frame recognizer list",
4747
substrs=[
48-
"1: recognizer.MyOtherFrameRecognizer, module a.out, symbol bar (regexp)",
49-
"0: recognizer.MyFrameRecognizer, module a.out, symbol foo",
48+
"1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar",
49+
"0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo",
5050
],
5151
)
5252

@@ -56,7 +56,7 @@ def test_frame_recognizer_1(self):
5656
self.expect(
5757
"frame recognizer list",
5858
substrs=[
59-
"1: recognizer.MyOtherFrameRecognizer, module a.out, symbol bar (regexp)"
59+
"1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol bar (regexp)"
6060
],
6161
)
6262
self.expect(
@@ -79,7 +79,7 @@ def test_frame_recognizer_1(self):
7979
self.expect(
8080
"frame recognizer list",
8181
substrs=[
82-
"1: recognizer.MyOtherFrameRecognizer, module a.out, symbol bar (regexp)"
82+
"1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regexp bar"
8383
],
8484
)
8585
self.expect(
@@ -224,7 +224,7 @@ def test_frame_recognizer_multi_symbol(self):
224224
self.expect(
225225
"frame recognizer list",
226226
substrs=[
227-
"recognizer.MyFrameRecognizer, module a.out, symbol foo, symbol bar"
227+
"recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar"
228228
],
229229
)
230230

@@ -279,7 +279,7 @@ def test_frame_recognizer_target_specific(self):
279279
self.expect(
280280
"frame recognizer list",
281281
substrs=[
282-
"recognizer.MyFrameRecognizer, module a.out, symbol foo, symbol bar"
282+
"recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar"
283283
],
284284
)
285285

@@ -305,7 +305,7 @@ def test_frame_recognizer_target_specific(self):
305305

306306
self.expect(
307307
"frame recognizer list",
308-
substrs=["recognizer.MyFrameRecognizer, module a.out, symbol bar"],
308+
substrs=["recognizer.MyFrameRecognizer, module a.out, demangled symbol bar"],
309309
)
310310

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

lldb/unittests/Target/StackFrameRecognizerTest.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void RegisterDummyStackFrameRecognizer(StackFrameRecognizerManager &manager) {
5555
StackFrameRecognizerSP dummy_recognizer_sp(new DummyStackFrameRecognizer());
5656

5757
manager.AddRecognizer(dummy_recognizer_sp, module_regex_sp, symbol_regex_sp,
58-
false);
58+
Mangled::NamePreference::ePreferDemangled, false);
5959
}
6060

6161
} // namespace
@@ -72,6 +72,7 @@ TEST_F(StackFrameRecognizerTest, NullModuleRegex) {
7272
manager.ForEach([&any_printed](uint32_t recognizer_id, std::string name,
7373
std::string function,
7474
llvm::ArrayRef<ConstString> symbols,
75+
Mangled::NamePreference symbol_mangling,
7576
bool regexp) { any_printed = true; });
7677

7778
EXPECT_TRUE(any_printed);

0 commit comments

Comments
 (0)