Skip to content

Commit c3e074c

Browse files
committed
[lldb] Support frame recognizer regexp on mangled names.
Instead of doing the coarse-grained initial matching of frame recognizers on fully demangled names, it can be much more efficient and reliable to filter on all functions of a particular language by discriminating on the mangled symbol name. This way a recognizer can be registered that should run on all functions of a particular language by matching on its mangling prefix(es). (cherry picked from commit 099a969f10f0e60e420954db6627b55747da302d)
1 parent 8edc44f commit c3e074c

File tree

8 files changed

+68
-35
lines changed

8 files changed

+68
-35
lines changed

lldb/include/lldb/Target/StackFrameRecognizer.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,21 @@ class StackFrameRecognizerManager {
109109
ConstString module, llvm::ArrayRef<ConstString> symbols,
110110
bool first_instruction_only = true);
111111

112+
/// Add a new recognizer that triggers on a symbol regex.
113+
///
114+
/// \param symbol_mangling controls whether the regex should apply
115+
/// to the mangled or demangled name.
112116
void AddRecognizer(lldb::StackFrameRecognizerSP recognizer,
113117
lldb::RegularExpressionSP module,
114118
lldb::RegularExpressionSP symbol,
119+
Mangled::NamePreference symbol_mangling,
115120
bool first_instruction_only = true);
116121

117122
void ForEach(std::function<
118123
void(uint32_t recognizer_id, std::string recognizer_name,
119124
std::string module, llvm::ArrayRef<ConstString> symbols,
120-
bool regexp)> const &callback);
125+
Mangled::NamePreference name_reference, bool regexp)> const
126+
&callback);
121127

122128
bool RemoveRecognizerWithID(uint32_t recognizer_id);
123129

@@ -142,6 +148,7 @@ class StackFrameRecognizerManager {
142148
lldb::RegularExpressionSP module_regexp;
143149
std::vector<ConstString> symbols;
144150
lldb::RegularExpressionSP symbol_regexp;
151+
Mangled::NamePreference symbol_mangling;
145152
bool first_instruction_only;
146153
};
147154

lldb/source/Commands/CommandObjectFrame.cpp

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,8 @@ void CommandObjectFrameRecognizerAdd::DoExecute(Args &command,
899899
auto func =
900900
RegularExpressionSP(new RegularExpression(m_options.m_symbols.front()));
901901
GetTarget().GetFrameRecognizerManager().AddRecognizer(
902-
recognizer_sp, module, func, m_options.m_first_instruction_only);
902+
recognizer_sp, module, func, Mangled::NamePreference::ePreferDemangled,
903+
m_options.m_first_instruction_only);
903904
} else {
904905
auto module = ConstString(m_options.m_module);
905906
std::vector<ConstString> symbols(m_options.m_symbols.begin(),
@@ -927,6 +928,32 @@ class CommandObjectFrameRecognizerClear : public CommandObjectParsed {
927928
}
928929
};
929930

931+
static void
932+
PrintRecognizerDetails(Stream &strm, const std::string &module,
933+
llvm::ArrayRef<lldb_private::ConstString> symbols,
934+
Mangled::NamePreference preference, bool regexp) {
935+
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;
954+
}
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 preference, bool regexp) {
951978
StreamString strm;
952979
if (rname.empty())
953980
rname = "(internal)";
954981

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

964985
request.TryCompleteCurrentArg(std::to_string(rid), strm.GetString());
965986
});
@@ -1016,22 +1037,17 @@ 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 preference, bool regexp) {
10221044
Stream &stream = result.GetOutputStream();
10231045

10241046
if (name.empty())
10251047
name = "(internal)";
10261048

10271049
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)";
1050+
PrintRecognizerDetails(stream, module, symbols, preference, regexp);
10351051

10361052
stream.EOL();
10371053
stream.Flush();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ CPPLanguageRuntime::CPPLanguageRuntime(Process *process)
8282
process->GetTarget().GetFrameRecognizerManager().AddRecognizer(
8383
StackFrameRecognizerSP(new LibCXXFrameRecognizer()), {},
8484
std::make_shared<RegularExpression>("^std::__1::"),
85+
Mangled::NamePreference::ePreferDemangledWithoutArguments,
8586
/*first_instruction_only*/ false);
8687
}
8788

lldb/source/Target/AssertFrameRecognizer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ void RegisterAssertFrameRecognizer(Process *process) {
112112
std::make_shared<AssertFrameRecognizer>(),
113113
std::make_shared<RegularExpression>(std::move(module_re)),
114114
std::make_shared<RegularExpression>(std::move(symbol_re)),
115+
Mangled::ePreferMangled,
115116
/*first_instruction_only*/ false);
116117
}
117118

lldb/source/Target/StackFrameRecognizer.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,25 +63,28 @@ void StackFrameRecognizerManager::BumpGeneration() {
6363
void StackFrameRecognizerManager::AddRecognizer(
6464
StackFrameRecognizerSP recognizer, ConstString module,
6565
llvm::ArrayRef<ConstString> symbols, bool first_instruction_only) {
66-
m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, false,
67-
module, RegularExpressionSP(), symbols,
68-
RegularExpressionSP(), 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});
6970
BumpGeneration();
7071
}
7172

7273
void StackFrameRecognizerManager::AddRecognizer(
7374
StackFrameRecognizerSP recognizer, RegularExpressionSP module,
74-
RegularExpressionSP symbol, bool first_instruction_only) {
75+
RegularExpressionSP symbol, Mangled::NamePreference symbol_mangling,
76+
bool first_instruction_only) {
7577
m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, true,
7678
ConstString(), module, std::vector<ConstString>(),
77-
symbol, first_instruction_only});
79+
symbol, symbol_mangling, first_instruction_only});
7880
BumpGeneration();
7981
}
8082

8183
void StackFrameRecognizerManager::ForEach(
8284
const std::function<void(uint32_t, std::string, std::string,
83-
llvm::ArrayRef<ConstString>, bool)> &callback) {
84-
for (auto entry : m_recognizers) {
85+
llvm::ArrayRef<ConstString>,
86+
Mangled::NamePreference, bool)> &callback) {
87+
for (const auto &entry : m_recognizers) {
8588
if (entry.is_regexp) {
8689
std::string module_name;
8790
std::string symbol_name;
@@ -92,11 +95,13 @@ void StackFrameRecognizerManager::ForEach(
9295
symbol_name = entry.symbol_regexp->GetText().str();
9396

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

97101
} else {
98102
callback(entry.recognizer_id, entry.recognizer->GetName(),
99-
entry.module.GetCString(), entry.symbols, false);
103+
entry.module.GetCString(), entry.symbols, entry.symbol_mangling,
104+
false);
100105
}
101106
}
102107
}
@@ -150,7 +155,8 @@ StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) {
150155
continue;
151156

152157
if (entry.symbol_regexp)
153-
if (!entry.symbol_regexp->Execute(function_name.GetStringRef()))
158+
if (!entry.symbol_regexp->Execute(
159+
symctx.GetFunctionName(entry.symbol_mangling)))
154160
continue;
155161

156162
if (entry.first_instruction_only)

lldb/source/Target/VerboseTrapFrameRecognizer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ void RegisterVerboseTrapFrameRecognizer(Process &process) {
149149
std::make_shared<VerboseTrapFrameRecognizer>();
150150

151151
process.GetTarget().GetFrameRecognizerManager().AddRecognizer(
152-
srf_recognizer_sp, module_regex_sp, symbol_regex_sp, false);
152+
srf_recognizer_sp, module_regex_sp, symbol_regex_sp,
153+
Mangled::ePreferMangled, false);
153154
}
154155

155156
} // namespace lldb_private

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ 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)",
48+
"1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regexp bar",
4949
"0: recognizer.MyFrameRecognizer, module a.out, symbol foo",
5050
],
5151
)
@@ -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 regexp bar"
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(

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 preference,
7576
bool regexp) { any_printed = true; });
7677

7778
EXPECT_TRUE(any_printed);

0 commit comments

Comments
 (0)