https://github.com/hokein updated https://github.com/llvm/llvm-project/pull/71928
>From 08c3b1a40b508d360f47bed6d7d42050c18b01a0 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Fri, 10 Nov 2023 12:35:10 +0100 Subject: [PATCH 1/5] [LLDB] Display artificial __promise and __coro_frame variables. See the discussion in #69309. --- .../CPlusPlus/CPPLanguageRuntime.cpp | 6 +++++- .../generic/coroutine_handle/TestCoroutineHandle.py | 13 ++++++++++++- .../generic/coroutine_handle/main.cpp | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp index c2488eaa9f5b50d..b5dfd07bdff2453 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp @@ -41,7 +41,11 @@ CPPLanguageRuntime::CPPLanguageRuntime(Process *process) : LanguageRuntime(process) {} bool CPPLanguageRuntime::IsAllowedRuntimeValue(ConstString name) { - return name == g_this; + // FIXME: use a list when the list grows more. + return name == g_this || + // Artificial coroutine-related variables emitted by clang. + name == ConstString("__promise") || + name == ConstString("__coro_frame"); } bool CPPLanguageRuntime::GetObjectDescription(Stream &str, diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py index 42ee32f9ccca58d..bcb1da6dc3838c8 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py @@ -78,8 +78,19 @@ def do_test(self, stdlib_type): ], ) - # Run until after the `co_yield` process = self.process() + + # Break at a coroutine body + lldbutil.continue_to_source_breakpoint( + self, process, "// Break at co_yield", lldb.SBFileSpec("main.cpp", False) + ) + # Expect artificial variables to be displayed + self.expect( + "frame variable", + substrs=['__promise', '__coro_frame'] + ) + + # Run until after the `co_yield` lldbutil.continue_to_source_breakpoint( self, process, "// Break after co_yield", lldb.SBFileSpec("main.cpp", False) ) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp index 8cb81c3bc9f4c4e..4523b7c7baf80aa 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp @@ -33,7 +33,7 @@ struct int_generator { ~int_generator() { hdl.destroy(); } }; -int_generator my_generator_func() { co_yield 42; } +int_generator my_generator_func() { co_yield 42; } // Break at co_yield // This is an empty function which we call just so the debugger has // a place to reliably set a breakpoint on. >From f684e1972eb3dc600603c67bf4a755d07971d7d2 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Fri, 10 Nov 2023 15:16:08 +0100 Subject: [PATCH 2/5] Remove an unneeded FIXME. --- .../Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp index b5dfd07bdff2453..2d14cf0d7a62add 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp @@ -41,9 +41,8 @@ CPPLanguageRuntime::CPPLanguageRuntime(Process *process) : LanguageRuntime(process) {} bool CPPLanguageRuntime::IsAllowedRuntimeValue(ConstString name) { - // FIXME: use a list when the list grows more. return name == g_this || - // Artificial coroutine-related variables emitted by clang. + // Artificial coroutine-related variables emitted by clang. name == ConstString("__promise") || name == ConstString("__coro_frame"); } >From 43ab6022f2a63a57d8195dcdd83b0c54ae66b1f6 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Mon, 13 Nov 2023 09:29:59 +0100 Subject: [PATCH 3/5] Use static constants for builtin variables. --- .../LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp index 2d14cf0d7a62add..e65b99f44be6dc4 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp @@ -34,6 +34,9 @@ using namespace lldb; using namespace lldb_private; static ConstString g_this = ConstString("this"); +// Artificial coroutine-related variables emitted by clang. +static ConstString g_promise = ConstString("__promise"); +static ConstString g_coro_frame = ConstString("__coro_frame"); char CPPLanguageRuntime::ID = 0; @@ -41,10 +44,7 @@ CPPLanguageRuntime::CPPLanguageRuntime(Process *process) : LanguageRuntime(process) {} bool CPPLanguageRuntime::IsAllowedRuntimeValue(ConstString name) { - return name == g_this || - // Artificial coroutine-related variables emitted by clang. - name == ConstString("__promise") || - name == ConstString("__coro_frame"); + return name == g_this || name == g_promise || name == g_coro_frame; } bool CPPLanguageRuntime::GetObjectDescription(Stream &str, >From d77afeecd96941ca88ebd267ba65230313ac5357 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Mon, 13 Nov 2023 15:23:31 +0100 Subject: [PATCH 4/5] Break on the coroutine function, per a review comment. --- .../generic/coroutine_handle/TestCoroutineHandle.py | 4 +++- .../data-formatter-stl/generic/coroutine_handle/main.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py index bcb1da6dc3838c8..3659f97c4c9fb9c 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py @@ -82,8 +82,10 @@ def do_test(self, stdlib_type): # Break at a coroutine body lldbutil.continue_to_source_breakpoint( - self, process, "// Break at co_yield", lldb.SBFileSpec("main.cpp", False) + self, process, "int_generator my_generator_func", + lldb.SBFileSpec("main.cpp", False) ) + # Expect artificial variables to be displayed self.expect( "frame variable", diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp index 4523b7c7baf80aa..8cb81c3bc9f4c4e 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp @@ -33,7 +33,7 @@ struct int_generator { ~int_generator() { hdl.destroy(); } }; -int_generator my_generator_func() { co_yield 42; } // Break at co_yield +int_generator my_generator_func() { co_yield 42; } // This is an empty function which we call just so the debugger has // a place to reliably set a breakpoint on. >From 3bdefade0289e73426a926d5e6fb165956523f0b Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Tue, 14 Nov 2023 08:56:12 +0100 Subject: [PATCH 5/5] Fix format --- .../generic/coroutine_handle/TestCoroutineHandle.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py index 3659f97c4c9fb9c..8f5fbf2aee61fe5 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py @@ -82,15 +82,14 @@ def do_test(self, stdlib_type): # Break at a coroutine body lldbutil.continue_to_source_breakpoint( - self, process, "int_generator my_generator_func", - lldb.SBFileSpec("main.cpp", False) + self, + process, + "int_generator my_generator_func", + lldb.SBFileSpec("main.cpp", False), ) # Expect artificial variables to be displayed - self.expect( - "frame variable", - substrs=['__promise', '__coro_frame'] - ) + self.expect("frame variable", substrs=["__promise", "__coro_frame"]) # Run until after the `co_yield` lldbutil.continue_to_source_breakpoint( _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits