aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Commands/CommandObjectFrame.cpp
diff options
context:
space:
mode:
authorMed Ismail Bennani <medismail.bennani@gmail.com>2020-03-13 23:56:35 +0100
committerMed Ismail Bennani <medismail.bennani@gmail.com>2020-03-18 14:15:58 +0100
commitdb31e2e1e6cacb31f3fe5a9b0e9e52cd626b5ff2 (patch)
tree7a39d155cee338bdd5cf3197fd609945a6dc6995 /lldb/source/Commands/CommandObjectFrame.cpp
parentb09cce07c7ebd6d42c97f7144f5a2e7dd8fca19e (diff)
downloadllvm-db31e2e1e6cacb31f3fe5a9b0e9e52cd626b5ff2.zip
llvm-db31e2e1e6cacb31f3fe5a9b0e9e52cd626b5ff2.tar.gz
llvm-db31e2e1e6cacb31f3fe5a9b0e9e52cd626b5ff2.tar.bz2
[lldb/Target] Support more than 2 symbols in StackFrameRecognizer
This patch changes the way the StackFrame Recognizers match a certain frame. Until now, recognizers could be registered with a function name but also an alternate symbol. This change is motivated by a test failure for the Assert frame recognizer on Linux. Depending the version of the libc, the abort function (triggered by an assertion), could have more than two signatures (i.e. `raise`, `__GI_raise` and `gsignal`). Instead of only checking the default symbol name and the alternate one, lldb will iterate over a list of symbols to match against. rdar://60386577 Differential Revision: https://reviews.llvm.org/D76188 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
Diffstat (limited to 'lldb/source/Commands/CommandObjectFrame.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectFrame.cpp41
1 files changed, 25 insertions, 16 deletions
diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp
index baf64e5..4fef9f4 100644
--- a/lldb/source/Commands/CommandObjectFrame.cpp
+++ b/lldb/source/Commands/CommandObjectFrame.cpp
@@ -746,7 +746,7 @@ private:
m_module = std::string(option_arg);
break;
case 'n':
- m_function = std::string(option_arg);
+ m_symbols.push_back(std::string(option_arg));
break;
case 'x':
m_regex = true;
@@ -760,7 +760,7 @@ private:
void OptionParsingStarting(ExecutionContext *execution_context) override {
m_module = "";
- m_function = "";
+ m_symbols.clear();
m_class_name = "";
m_regex = false;
}
@@ -772,7 +772,7 @@ private:
// Instance variables to hold the values for command options.
std::string m_class_name;
std::string m_module;
- std::string m_function;
+ std::vector<std::string> m_symbols;
bool m_regex;
};
@@ -854,9 +854,18 @@ bool CommandObjectFrameRecognizerAdd::DoExecute(Args &command,
return false;
}
- if (m_options.m_function.empty()) {
- result.AppendErrorWithFormat("%s needs a function name (-n argument).\n",
- m_cmd_name.c_str());
+ if (m_options.m_symbols.empty()) {
+ result.AppendErrorWithFormat(
+ "%s needs at least one symbol name (-n argument).\n",
+ m_cmd_name.c_str());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ if (m_options.m_regex && m_options.m_symbols.size() > 1) {
+ result.AppendErrorWithFormat(
+ "%s needs only one symbol regular expression (-n argument).\n",
+ m_cmd_name.c_str());
result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -876,12 +885,13 @@ bool CommandObjectFrameRecognizerAdd::DoExecute(Args &command,
auto module =
RegularExpressionSP(new RegularExpression(m_options.m_module));
auto func =
- RegularExpressionSP(new RegularExpression(m_options.m_function));
+ RegularExpressionSP(new RegularExpression(m_options.m_symbols.front()));
StackFrameRecognizerManager::AddRecognizer(recognizer_sp, module, func);
} else {
auto module = ConstString(m_options.m_module);
- auto func = ConstString(m_options.m_function);
- StackFrameRecognizerManager::AddRecognizer(recognizer_sp, module, func, {});
+ std::vector<ConstString> symbols(m_options.m_symbols.begin(),
+ m_options.m_symbols.end());
+ StackFrameRecognizerManager::AddRecognizer(recognizer_sp, module, symbols);
}
#endif
@@ -958,9 +968,9 @@ protected:
bool DoExecute(Args &command, CommandReturnObject &result) override {
bool any_printed = false;
StackFrameRecognizerManager::ForEach(
- [&result, &any_printed](uint32_t recognizer_id, std::string name,
- std::string module, std::string symbol,
- std::string alternate_symbol, bool regexp) {
+ [&result, &any_printed](
+ uint32_t recognizer_id, std::string name, std::string module,
+ llvm::ArrayRef<ConstString> symbols, bool regexp) {
Stream &stream = result.GetOutputStream();
if (name.empty())
@@ -969,10 +979,9 @@ protected:
stream << std::to_string(recognizer_id) << ": " << name;
if (!module.empty())
stream << ", module " << module;
- if (!symbol.empty())
- stream << ", function " << symbol;
- if (!alternate_symbol.empty())
- stream << ", symbol " << alternate_symbol;
+ if (!symbols.empty())
+ for (auto &symbol : symbols)
+ stream << ", symbol " << symbol;
if (regexp)
stream << " (regexp)";