https://github.com/vogelsgesang updated https://github.com/llvm/llvm-project/pull/109219
>From c471c2fe615082fb9f9c5f39466bd47ec5b86bb0 Mon Sep 17 00:00:00 2001 From: Adrian Vogelsgesang <avogelsges...@salesforce.com> Date: Wed, 18 Sep 2024 22:34:30 +0000 Subject: [PATCH 1/5] [lldb] Add support for disabling frame recognizers Sometimes you only want to temporarily disable a frame recognizer instead of deleting it. In particular, when dealing with one of the builtin frame recognizers, which cannot be restored after deletion. --- .../lldb/Target/StackFrameRecognizer.h | 7 +- lldb/source/Commands/CommandObjectFrame.cpp | 144 +++++++++++++----- lldb/source/Target/StackFrameRecognizer.cpp | 29 +++- 3 files changed, 131 insertions(+), 49 deletions(-) diff --git a/lldb/include/lldb/Target/StackFrameRecognizer.h b/lldb/include/lldb/Target/StackFrameRecognizer.h index 617b1617d404a1..0deb4d46454784 100644 --- a/lldb/include/lldb/Target/StackFrameRecognizer.h +++ b/lldb/include/lldb/Target/StackFrameRecognizer.h @@ -125,11 +125,13 @@ class StackFrameRecognizerManager { bool first_instruction_only = true); void ForEach(std::function< - void(uint32_t recognizer_id, std::string recognizer_name, - std::string module, llvm::ArrayRef<ConstString> symbols, + void(uint32_t recognizer_id, bool enabled, + std::string recognizer_name, std::string module, + llvm::ArrayRef<ConstString> symbols, Mangled::NamePreference name_reference, bool regexp)> const &callback); + bool SetEnabledForID(uint32_t recognizer_id, bool enabled); bool RemoveRecognizerWithID(uint32_t recognizer_id); void RemoveAllRecognizers(); @@ -155,6 +157,7 @@ class StackFrameRecognizerManager { lldb::RegularExpressionSP symbol_regexp; Mangled::NamePreference symbol_mangling; bool first_instruction_only; + bool enabled; }; std::deque<RegisteredEntry> m_recognizers; diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index d8091e8993fde1..86db334ddc677e 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/source/Commands/CommandObjectFrame.cpp @@ -31,8 +31,10 @@ #include "lldb/Target/Thread.h" #include "lldb/Utility/Args.h" +#include <iostream> #include <memory> #include <optional> +#include <ostream> #include <string> using namespace lldb; @@ -930,10 +932,13 @@ class CommandObjectFrameRecognizerClear : public CommandObjectParsed { }; static void -PrintRecognizerDetails(Stream &strm, const std::string &name, +PrintRecognizerDetails(Stream &strm, const std::string &name, bool enabled, const std::string &module, llvm::ArrayRef<lldb_private::ConstString> symbols, Mangled::NamePreference symbol_mangling, bool regexp) { + if (!enabled) + strm << "[disabled] "; + strm << name << ", "; if (!module.empty()) @@ -957,53 +962,43 @@ PrintRecognizerDetails(Stream &strm, const std::string &name, llvm::interleaveComma(symbols, strm); } -class CommandObjectFrameRecognizerDelete : public CommandObjectParsed { -public: - CommandObjectFrameRecognizerDelete(CommandInterpreter &interpreter) - : CommandObjectParsed(interpreter, "frame recognizer delete", - "Delete an existing frame recognizer by id.", - nullptr) { - AddSimpleArgumentList(eArgTypeRecognizerID); - } - - ~CommandObjectFrameRecognizerDelete() override = default; +// Base class for commands which accept a single frame recognizer as an argument +class CommandObjectWithFrameRecognizerArg : public CommandObjectParsed { + public: + CommandObjectWithFrameRecognizerArg(CommandInterpreter &interpreter, + const char *name, + const char *help = nullptr, + const char *syntax = nullptr, + uint32_t flags = 0) + : CommandObjectParsed(interpreter, name, help, syntax, flags) { + AddSimpleArgumentList(eArgTypeRecognizerID); + } void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override { + std::cerr << request.GetCursorIndex() << std::endl; if (request.GetCursorIndex() != 0) return; GetTarget().GetFrameRecognizerManager().ForEach( - [&request](uint32_t rid, std::string rname, std::string module, + [&request](uint32_t rid, bool enabled, std::string rname, std::string module, llvm::ArrayRef<lldb_private::ConstString> symbols, Mangled::NamePreference symbol_mangling, bool regexp) { StreamString strm; if (rname.empty()) rname = "(internal)"; - PrintRecognizerDetails(strm, rname, module, symbols, symbol_mangling, - regexp); + PrintRecognizerDetails(strm, rname, enabled, module, symbols, + symbol_mangling, regexp); request.TryCompleteCurrentArg(std::to_string(rid), strm.GetString()); }); } -protected: - void DoExecute(Args &command, CommandReturnObject &result) override { - if (command.GetArgumentCount() == 0) { - if (!m_interpreter.Confirm( - "About to delete all frame recognizers, do you want to do that?", - true)) { - result.AppendMessage("Operation cancelled..."); - return; - } - - GetTarget().GetFrameRecognizerManager().RemoveAllRecognizers(); - result.SetStatus(eReturnStatusSuccessFinishResult); - return; - } + virtual void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) = 0; + void DoExecute(Args &command, CommandReturnObject &result) override { if (command.GetArgumentCount() != 1) { result.AppendErrorWithFormat("'%s' takes zero or one arguments.\n", m_cmd_name.c_str()); @@ -1017,10 +1012,73 @@ class CommandObjectFrameRecognizerDelete : public CommandObjectParsed { return; } - if (!GetTarget().GetFrameRecognizerManager().RemoveRecognizerWithID( - recognizer_id)) { - result.AppendErrorWithFormat("'%s' is not a valid recognizer id.\n", - command.GetArgumentAtIndex(0)); + DoExecuteWithId(result, recognizer_id); + } +}; + +class CommandObjectFrameRecognizerEnable : public CommandObjectWithFrameRecognizerArg { +public: + CommandObjectFrameRecognizerEnable(CommandInterpreter &interpreter) + : CommandObjectWithFrameRecognizerArg( + interpreter, "frame recognizer enable", + "Enable a frame recognizer by id.", nullptr) { + AddSimpleArgumentList(eArgTypeRecognizerID); + } + + ~CommandObjectFrameRecognizerEnable() override = default; + +protected: + void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override { + auto& recognizer_mgr = GetTarget().GetFrameRecognizerManager(); + if (!recognizer_mgr.SetEnabledForID(recognizer_id, true)) { + result.AppendErrorWithFormat("'%u' is not a valid recognizer id.\n", + recognizer_id); + return; + } + result.SetStatus(eReturnStatusSuccessFinishResult); + } +}; + +class CommandObjectFrameRecognizerDisable : public CommandObjectWithFrameRecognizerArg { +public: + CommandObjectFrameRecognizerDisable(CommandInterpreter &interpreter) + : CommandObjectWithFrameRecognizerArg( + interpreter, "frame recognizer disable", + "Disable a frame recognizer by id.", nullptr) { + AddSimpleArgumentList(eArgTypeRecognizerID); + } + + ~CommandObjectFrameRecognizerDisable() override = default; + +protected: + void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override { + auto& recognizer_mgr = GetTarget().GetFrameRecognizerManager(); + if (!recognizer_mgr.SetEnabledForID(recognizer_id, false)) { + result.AppendErrorWithFormat("'%u' is not a valid recognizer id.\n", + recognizer_id); + return; + } + result.SetStatus(eReturnStatusSuccessFinishResult); + } +}; + +class CommandObjectFrameRecognizerDelete : public CommandObjectWithFrameRecognizerArg { +public: + CommandObjectFrameRecognizerDelete(CommandInterpreter &interpreter) + : CommandObjectWithFrameRecognizerArg( + interpreter, "frame recognizer delete", + "Delete an existing frame recognizer by id.", nullptr) { + AddSimpleArgumentList(eArgTypeRecognizerID); + } + + ~CommandObjectFrameRecognizerDelete() override = default; + +protected: + void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override { + auto& recognizer_mgr = GetTarget().GetFrameRecognizerManager(); + if (!recognizer_mgr.RemoveRecognizerWithID(recognizer_id)) { + result.AppendErrorWithFormat("'%u' is not a valid recognizer id.\n", + recognizer_id); return; } result.SetStatus(eReturnStatusSuccessFinishResult); @@ -1041,7 +1099,7 @@ class CommandObjectFrameRecognizerList : public CommandObjectParsed { bool any_printed = false; GetTarget().GetFrameRecognizerManager().ForEach( [&result, - &any_printed](uint32_t recognizer_id, std::string name, + &any_printed](uint32_t recognizer_id, bool enabled, std::string name, std::string module, llvm::ArrayRef<ConstString> symbols, Mangled::NamePreference symbol_mangling, bool regexp) { Stream &stream = result.GetOutputStream(); @@ -1050,7 +1108,7 @@ class CommandObjectFrameRecognizerList : public CommandObjectParsed { name = "(internal)"; stream << std::to_string(recognizer_id) << ": "; - PrintRecognizerDetails(stream, name, module, symbols, symbol_mangling, + PrintRecognizerDetails(stream, name, enabled, module, symbols, symbol_mangling, regexp); stream.EOL(); @@ -1135,18 +1193,24 @@ class CommandObjectFrameRecognizer : public CommandObjectMultiword { interpreter, "frame recognizer", "Commands for editing and viewing frame recognizers.", "frame recognizer [<sub-command-options>] ") { + LoadSubCommand("info", CommandObjectSP(new CommandObjectFrameRecognizerInfo( + interpreter))); + LoadSubCommand("list", CommandObjectSP(new CommandObjectFrameRecognizerList( + interpreter))); LoadSubCommand("add", CommandObjectSP(new CommandObjectFrameRecognizerAdd( interpreter))); LoadSubCommand( - "clear", - CommandObjectSP(new CommandObjectFrameRecognizerClear(interpreter))); + "enable", + CommandObjectSP(new CommandObjectFrameRecognizerEnable(interpreter))); + LoadSubCommand( + "disable", + CommandObjectSP(new CommandObjectFrameRecognizerDisable(interpreter))); LoadSubCommand( "delete", CommandObjectSP(new CommandObjectFrameRecognizerDelete(interpreter))); - LoadSubCommand("list", CommandObjectSP(new CommandObjectFrameRecognizerList( - interpreter))); - LoadSubCommand("info", CommandObjectSP(new CommandObjectFrameRecognizerInfo( - interpreter))); + LoadSubCommand( + "clear", + CommandObjectSP(new CommandObjectFrameRecognizerClear(interpreter))); } ~CommandObjectFrameRecognizer() override = default; diff --git a/lldb/source/Target/StackFrameRecognizer.cpp b/lldb/source/Target/StackFrameRecognizer.cpp index fa24253320a3f2..4592702942f8c9 100644 --- a/lldb/source/Target/StackFrameRecognizer.cpp +++ b/lldb/source/Target/StackFrameRecognizer.cpp @@ -67,7 +67,7 @@ void StackFrameRecognizerManager::AddRecognizer( m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, false, module, RegularExpressionSP(), symbols, RegularExpressionSP(), symbol_mangling, - first_instruction_only}); + first_instruction_only, true}); BumpGeneration(); } @@ -77,13 +77,14 @@ void StackFrameRecognizerManager::AddRecognizer( bool first_instruction_only) { m_recognizers.push_front({(uint32_t)m_recognizers.size(), recognizer, true, ConstString(), module, std::vector<ConstString>(), - symbol, symbol_mangling, first_instruction_only}); + symbol, symbol_mangling, first_instruction_only, + true}); BumpGeneration(); } void StackFrameRecognizerManager::ForEach( const std::function< - void(uint32_t, std::string, std::string, llvm::ArrayRef<ConstString>, + void(uint32_t, bool, std::string, std::string, llvm::ArrayRef<ConstString>, Mangled::NamePreference name_reference, bool)> &callback) { for (auto entry : m_recognizers) { if (entry.is_regexp) { @@ -95,22 +96,33 @@ void StackFrameRecognizerManager::ForEach( if (entry.symbol_regexp) symbol_name = entry.symbol_regexp->GetText().str(); - callback(entry.recognizer_id, entry.recognizer->GetName(), module_name, + callback(entry.recognizer_id, entry.enabled, entry.recognizer->GetName(), module_name, llvm::ArrayRef(ConstString(symbol_name)), entry.symbol_mangling, true); } else { - callback(entry.recognizer_id, entry.recognizer->GetName(), + callback(entry.recognizer_id, entry.enabled, entry.recognizer->GetName(), entry.module.GetCString(), entry.symbols, entry.symbol_mangling, false); } } } +bool StackFrameRecognizerManager::SetEnabledForID(uint32_t recognizer_id, + bool enabled) { + auto found = + llvm::find_if(m_recognizers, [recognizer_id](const RegisteredEntry &e) { + return e.recognizer_id == recognizer_id; + }); + if (found == m_recognizers.end()) + return false; + found->enabled = enabled; + BumpGeneration(); + return true; +} + bool StackFrameRecognizerManager::RemoveRecognizerWithID( uint32_t recognizer_id) { - if (recognizer_id >= m_recognizers.size()) - return false; auto found = llvm::find_if(m_recognizers, [recognizer_id](const RegisteredEntry &e) { return e.recognizer_id == recognizer_id; @@ -142,6 +154,9 @@ StackFrameRecognizerManager::GetRecognizerForFrame(StackFrameSP frame) { Address current_addr = frame->GetFrameCodeAddress(); for (auto entry : m_recognizers) { + if (!entry.enabled) + continue; + if (entry.module) if (entry.module != module_name) continue; >From 3220960b35ad0c0581c0fec64fd9d292295bf5be Mon Sep 17 00:00:00 2001 From: Adrian Vogelsgesang <avogelsges...@salesforce.com> Date: Fri, 20 Sep 2024 06:45:07 +0000 Subject: [PATCH 2/5] Add test case --- .../API/commands/frame/recognizer/Makefile | 2 +- .../frame/recognizer/TestFrameRecognizer.py | 146 ++++++++++++++++-- .../API/commands/frame/recognizer/categories | 1 - .../frame/recognizer/{main.m => main.c} | 2 +- 4 files changed, 138 insertions(+), 13 deletions(-) delete mode 100644 lldb/test/API/commands/frame/recognizer/categories rename lldb/test/API/commands/frame/recognizer/{main.m => main.c} (93%) diff --git a/lldb/test/API/commands/frame/recognizer/Makefile b/lldb/test/API/commands/frame/recognizer/Makefile index 09f6bd59a2fb32..796767e2425343 100644 --- a/lldb/test/API/commands/frame/recognizer/Makefile +++ b/lldb/test/API/commands/frame/recognizer/Makefile @@ -1,4 +1,4 @@ -OBJC_SOURCES := main.m +C_SOURCES := main.c CFLAGS_EXTRAS := -g0 # No debug info. MAKE_DSYM := NO diff --git a/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py b/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py index 24d6a67c0ccd48..17396fb2c5b37f 100644 --- a/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py +++ b/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py @@ -14,10 +14,13 @@ class FrameRecognizerTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True - @skipUnlessDarwin def test_frame_recognizer_1(self): self.build() exe = self.getBuildArtifact("a.out") + target, process, thread, _ = lldbutil.run_to_name_breakpoint( + self, "foo", exe_name=exe + ) + frame = thread.GetSelectedFrame() # Clear internal & plugins recognizers that get initialized at launch self.runCmd("frame recognizer clear") @@ -96,11 +99,6 @@ def test_frame_recognizer_1(self): "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo" ) - target, process, thread, _ = lldbutil.run_to_name_breakpoint( - self, "foo", exe_name=exe - ) - frame = thread.GetSelectedFrame() - self.expect("frame variable", substrs=["(int) a = 42", "(int) b = 56"]) # Recognized arguments don't show up by default... @@ -164,7 +162,6 @@ def test_frame_recognizer_1(self): substrs=['*a = 78']) """ - @skipUnlessDarwin def test_frame_recognizer_hiding(self): self.build() @@ -204,7 +201,6 @@ def test_frame_recognizer_hiding(self): frame = thread.GetSelectedFrame() self.assertIn("main", frame.name) - @skipUnlessDarwin def test_frame_recognizer_multi_symbol(self): self.build() exe = self.getBuildArtifact("a.out") @@ -250,7 +246,6 @@ def test_frame_recognizer_multi_symbol(self): substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], ) - @skipUnlessDarwin def test_frame_recognizer_target_specific(self): self.build() exe = self.getBuildArtifact("a.out") @@ -318,7 +313,138 @@ def test_frame_recognizer_target_specific(self): substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], ) - @skipUnlessDarwin + def test_frame_recognizer_not_only_first_instruction(self): + self.build() + exe = self.getBuildArtifact("a.out") + + # Clear internal & plugins recognizers that get initialized at launch. + self.runCmd("frame recognizer clear") + + self.runCmd( + "command script import " + + os.path.join(self.getSourceDir(), "recognizer.py") + ) + + self.expect("frame recognizer list", substrs=["no matching results found."]) + + # Create a target. + target, process, thread, _ = lldbutil.run_to_name_breakpoint( + self, "foo", exe_name=exe + ) + + # Move the PC one instruction further. + self.runCmd("next") + + # Add a frame recognizer in that target. + self.runCmd( + "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar" + ) + + # It's not applied to foo(), because frame's PC is not at the first instruction of the function. + self.expect( + "frame recognizer info 0", + substrs=["frame 0 not recognized by any recognizer"], + ) + + # Add a frame recognizer with --first-instruction-only=true. + self.runCmd("frame recognizer clear") + + self.runCmd( + "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar --first-instruction-only=true" + ) + + # It's not applied to foo(), because frame's PC is not at the first instruction of the function. + self.expect( + "frame recognizer info 0", + substrs=["frame 0 not recognized by any recognizer"], + ) + + # Now add a frame recognizer with --first-instruction-only=false. + self.runCmd("frame recognizer clear") + + self.runCmd( + "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar --first-instruction-only=false" + ) + + # This time it should recognize the frame. + self.expect( + "frame recognizer info 0", + substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], + ) + + opts = lldb.SBVariablesOptions() + opts.SetIncludeRecognizedArguments(True) + frame = thread.GetSelectedFrame() + variables = frame.GetVariables(opts) + + self.assertEqual(variables.GetSize(), 2) + self.assertEqual(variables.GetValueAtIndex(0).name, "a") + self.assertEqual(variables.GetValueAtIndex(0).signed, 42) + self.assertEqual( + variables.GetValueAtIndex(0).GetValueType(), lldb.eValueTypeVariableArgument + ) + self.assertEqual(variables.GetValueAtIndex(1).name, "b") + self.assertEqual(variables.GetValueAtIndex(1).signed, 56) + self.assertEqual( + variables.GetValueAtIndex(1).GetValueType(), lldb.eValueTypeVariableArgument + ) + + def test_frame_recognizer_disable(self): + self.build() + exe = self.getBuildArtifact("a.out") + target, process, thread, _ = lldbutil.run_to_name_breakpoint( + self, "foo", exe_name=exe + ) + + # Clear internal & plugins recognizers that get initialized at launch. + self.runCmd("frame recognizer clear") + + self.runCmd( + "command script import " + + os.path.join(self.getSourceDir(), "recognizer.py") + ) + + # Add a frame recognizer in that target. + self.runCmd( + "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar" + ) + + # The frame is recognized + self.expect( + "frame recognizer info 0", + substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], + ) + + # Disable the recognizer + self.runCmd("frame recognizer disable 0") + + self.expect( + "frame recognizer list", + substrs=[ + "0: [disabled] recognizer.MyFrameRecognizer, module a.out, demangled symbol foo" + ], + ) + + self.expect( + "frame recognizer info 0", + substrs=["frame 0 not recognized by any recognizer"], + ) + + # Re-enable the recognizer + self.runCmd("frame recognizer enable 0") + + self.expect( + "frame recognizer list", + substrs=[ + "0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo" + ], + ) + + self.expect( + "frame recognizer info 0", + substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], + ) + def test_frame_recognizer_not_only_first_instruction(self): self.build() exe = self.getBuildArtifact("a.out") diff --git a/lldb/test/API/commands/frame/recognizer/categories b/lldb/test/API/commands/frame/recognizer/categories deleted file mode 100644 index 72cf07c1efeaeb..00000000000000 --- a/lldb/test/API/commands/frame/recognizer/categories +++ /dev/null @@ -1 +0,0 @@ -objc diff --git a/lldb/test/API/commands/frame/recognizer/main.m b/lldb/test/API/commands/frame/recognizer/main.c similarity index 93% rename from lldb/test/API/commands/frame/recognizer/main.m rename to lldb/test/API/commands/frame/recognizer/main.c index 74d219f1fff4c5..652945e81c95b1 100644 --- a/lldb/test/API/commands/frame/recognizer/main.m +++ b/lldb/test/API/commands/frame/recognizer/main.c @@ -1,4 +1,4 @@ -#import <stdio.h> +#include<stdio.h> void foo(int a, int b) { printf("%d %d\n", a, b); } >From 64e2a5394cfeb9777f5f9bf72d2af727f64965fa Mon Sep 17 00:00:00 2001 From: Adrian Vogelsgesang <avogelsges...@salesforce.com> Date: Fri, 20 Sep 2024 07:33:25 +0000 Subject: [PATCH 3/5] Code formatting --- .../lldb/Target/StackFrameRecognizer.h | 12 ++--- lldb/source/Commands/CommandObjectFrame.cpp | 52 +++++++++++-------- lldb/source/Target/StackFrameRecognizer.cpp | 13 +++-- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/lldb/include/lldb/Target/StackFrameRecognizer.h b/lldb/include/lldb/Target/StackFrameRecognizer.h index 0deb4d46454784..6c67a7fb4f68dd 100644 --- a/lldb/include/lldb/Target/StackFrameRecognizer.h +++ b/lldb/include/lldb/Target/StackFrameRecognizer.h @@ -124,12 +124,12 @@ class StackFrameRecognizerManager { Mangled::NamePreference symbol_mangling, bool first_instruction_only = true); - void ForEach(std::function< - void(uint32_t recognizer_id, bool enabled, - std::string recognizer_name, std::string module, - llvm::ArrayRef<ConstString> symbols, - Mangled::NamePreference name_reference, bool regexp)> const - &callback); + void + ForEach(std::function<void(uint32_t recognizer_id, bool enabled, + std::string recognizer_name, std::string module, + llvm::ArrayRef<ConstString> symbols, + Mangled::NamePreference name_preference, + bool regexp)> const &callback); bool SetEnabledForID(uint32_t recognizer_id, bool enabled); bool RemoveRecognizerWithID(uint32_t recognizer_id); diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index 86db334ddc677e..d42cbeaba15f22 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/source/Commands/CommandObjectFrame.cpp @@ -964,15 +964,15 @@ PrintRecognizerDetails(Stream &strm, const std::string &name, bool enabled, // Base class for commands which accept a single frame recognizer as an argument class CommandObjectWithFrameRecognizerArg : public CommandObjectParsed { - public: - CommandObjectWithFrameRecognizerArg(CommandInterpreter &interpreter, - const char *name, - const char *help = nullptr, - const char *syntax = nullptr, - uint32_t flags = 0) - : CommandObjectParsed(interpreter, name, help, syntax, flags) { - AddSimpleArgumentList(eArgTypeRecognizerID); - } +public: + CommandObjectWithFrameRecognizerArg(CommandInterpreter &interpreter, + const char *name, + const char *help = nullptr, + const char *syntax = nullptr, + uint32_t flags = 0) + : CommandObjectParsed(interpreter, name, help, syntax, flags) { + AddSimpleArgumentList(eArgTypeRecognizerID); + } void HandleArgumentCompletion(CompletionRequest &request, @@ -982,7 +982,8 @@ class CommandObjectWithFrameRecognizerArg : public CommandObjectParsed { return; GetTarget().GetFrameRecognizerManager().ForEach( - [&request](uint32_t rid, bool enabled, std::string rname, std::string module, + [&request](uint32_t rid, bool enabled, std::string rname, + std::string module, llvm::ArrayRef<lldb_private::ConstString> symbols, Mangled::NamePreference symbol_mangling, bool regexp) { StreamString strm; @@ -996,7 +997,8 @@ class CommandObjectWithFrameRecognizerArg : public CommandObjectParsed { }); } - virtual void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) = 0; + virtual void DoExecuteWithId(CommandReturnObject &result, + uint32_t recognizer_id) = 0; void DoExecute(Args &command, CommandReturnObject &result) override { if (command.GetArgumentCount() != 1) { @@ -1016,7 +1018,8 @@ class CommandObjectWithFrameRecognizerArg : public CommandObjectParsed { } }; -class CommandObjectFrameRecognizerEnable : public CommandObjectWithFrameRecognizerArg { +class CommandObjectFrameRecognizerEnable + : public CommandObjectWithFrameRecognizerArg { public: CommandObjectFrameRecognizerEnable(CommandInterpreter &interpreter) : CommandObjectWithFrameRecognizerArg( @@ -1028,8 +1031,9 @@ class CommandObjectFrameRecognizerEnable : public CommandObjectWithFrameRecogniz ~CommandObjectFrameRecognizerEnable() override = default; protected: - void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override { - auto& recognizer_mgr = GetTarget().GetFrameRecognizerManager(); + void DoExecuteWithId(CommandReturnObject &result, + uint32_t recognizer_id) override { + auto &recognizer_mgr = GetTarget().GetFrameRecognizerManager(); if (!recognizer_mgr.SetEnabledForID(recognizer_id, true)) { result.AppendErrorWithFormat("'%u' is not a valid recognizer id.\n", recognizer_id); @@ -1039,7 +1043,8 @@ class CommandObjectFrameRecognizerEnable : public CommandObjectWithFrameRecogniz } }; -class CommandObjectFrameRecognizerDisable : public CommandObjectWithFrameRecognizerArg { +class CommandObjectFrameRecognizerDisable + : public CommandObjectWithFrameRecognizerArg { public: CommandObjectFrameRecognizerDisable(CommandInterpreter &interpreter) : CommandObjectWithFrameRecognizerArg( @@ -1051,8 +1056,9 @@ class CommandObjectFrameRecognizerDisable : public CommandObjectWithFrameRecogni ~CommandObjectFrameRecognizerDisable() override = default; protected: - void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override { - auto& recognizer_mgr = GetTarget().GetFrameRecognizerManager(); + void DoExecuteWithId(CommandReturnObject &result, + uint32_t recognizer_id) override { + auto &recognizer_mgr = GetTarget().GetFrameRecognizerManager(); if (!recognizer_mgr.SetEnabledForID(recognizer_id, false)) { result.AppendErrorWithFormat("'%u' is not a valid recognizer id.\n", recognizer_id); @@ -1062,7 +1068,8 @@ class CommandObjectFrameRecognizerDisable : public CommandObjectWithFrameRecogni } }; -class CommandObjectFrameRecognizerDelete : public CommandObjectWithFrameRecognizerArg { +class CommandObjectFrameRecognizerDelete + : public CommandObjectWithFrameRecognizerArg { public: CommandObjectFrameRecognizerDelete(CommandInterpreter &interpreter) : CommandObjectWithFrameRecognizerArg( @@ -1074,8 +1081,9 @@ class CommandObjectFrameRecognizerDelete : public CommandObjectWithFrameRecogniz ~CommandObjectFrameRecognizerDelete() override = default; protected: - void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override { - auto& recognizer_mgr = GetTarget().GetFrameRecognizerManager(); + void DoExecuteWithId(CommandReturnObject &result, + uint32_t recognizer_id) override { + auto &recognizer_mgr = GetTarget().GetFrameRecognizerManager(); if (!recognizer_mgr.RemoveRecognizerWithID(recognizer_id)) { result.AppendErrorWithFormat("'%u' is not a valid recognizer id.\n", recognizer_id); @@ -1108,8 +1116,8 @@ class CommandObjectFrameRecognizerList : public CommandObjectParsed { name = "(internal)"; stream << std::to_string(recognizer_id) << ": "; - PrintRecognizerDetails(stream, name, enabled, module, symbols, symbol_mangling, - regexp); + PrintRecognizerDetails(stream, name, enabled, module, symbols, + symbol_mangling, regexp); stream.EOL(); stream.Flush(); diff --git a/lldb/source/Target/StackFrameRecognizer.cpp b/lldb/source/Target/StackFrameRecognizer.cpp index 4592702942f8c9..d23c1fa1a928be 100644 --- a/lldb/source/Target/StackFrameRecognizer.cpp +++ b/lldb/source/Target/StackFrameRecognizer.cpp @@ -83,9 +83,9 @@ void StackFrameRecognizerManager::AddRecognizer( } void StackFrameRecognizerManager::ForEach( - const std::function< - void(uint32_t, bool, std::string, std::string, llvm::ArrayRef<ConstString>, - Mangled::NamePreference name_reference, bool)> &callback) { + const std::function<void( + uint32_t, bool, std::string, std::string, llvm::ArrayRef<ConstString>, + Mangled::NamePreference name_preference, bool)> &callback) { for (auto entry : m_recognizers) { if (entry.is_regexp) { std::string module_name; @@ -96,10 +96,9 @@ void StackFrameRecognizerManager::ForEach( if (entry.symbol_regexp) symbol_name = entry.symbol_regexp->GetText().str(); - callback(entry.recognizer_id, entry.enabled, entry.recognizer->GetName(), module_name, - llvm::ArrayRef(ConstString(symbol_name)), entry.symbol_mangling, - true); - + callback(entry.recognizer_id, entry.enabled, entry.recognizer->GetName(), + module_name, llvm::ArrayRef(ConstString(symbol_name)), + entry.symbol_mangling, true); } else { callback(entry.recognizer_id, entry.enabled, entry.recognizer->GetName(), entry.module.GetCString(), entry.symbols, entry.symbol_mangling, >From a07226bf675ae756781bdb08dd6bffbf496db641 Mon Sep 17 00:00:00 2001 From: Adrian Vogelsgesang <avogelsges...@salesforce.com> Date: Fri, 20 Sep 2024 07:39:33 +0000 Subject: [PATCH 4/5] Remove duplicate check --- lldb/source/Commands/CommandObjectFrame.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index d42cbeaba15f22..ab6780eb75dcd8 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/source/Commands/CommandObjectFrame.cpp @@ -1001,12 +1001,6 @@ class CommandObjectWithFrameRecognizerArg : public CommandObjectParsed { uint32_t recognizer_id) = 0; void DoExecute(Args &command, CommandReturnObject &result) override { - if (command.GetArgumentCount() != 1) { - result.AppendErrorWithFormat("'%s' takes zero or one arguments.\n", - m_cmd_name.c_str()); - return; - } - uint32_t recognizer_id; if (!llvm::to_integer(command.GetArgumentAtIndex(0), recognizer_id)) { result.AppendErrorWithFormat("'%s' is not a valid recognizer id.\n", >From a788e1bad76e7b33273f3e548b18402d1f84d5cd Mon Sep 17 00:00:00 2001 From: Adrian Vogelsgesang <avogelsges...@salesforce.com> Date: Fri, 20 Sep 2024 07:41:52 +0000 Subject: [PATCH 5/5] Remove debug code --- lldb/source/Commands/CommandObjectFrame.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index ab6780eb75dcd8..86a5c9c1fc2a07 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/source/Commands/CommandObjectFrame.cpp @@ -977,7 +977,6 @@ class CommandObjectWithFrameRecognizerArg : public CommandObjectParsed { void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override { - std::cerr << request.GetCursorIndex() << std::endl; if (request.GetCursorIndex() != 0) return; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits