[LLDB] Switch to using DIL as default implementation for 'frame var'. (#147887)

(cherry picked from commit f5c676d6d95dc63b8dcb43dd2e4dfc913a9c5a50)
This commit is contained in:
cmtice 2025-07-15 08:19:10 -07:00 committed by Tobias Hieta
parent bbc8346e6b
commit 317403d705
7 changed files with 49 additions and 10 deletions

View File

@ -5,8 +5,8 @@ let Definition = "target_experimental" in {
Global, DefaultTrue,
Desc<"If true, inject local variables explicitly into the expression text. This will fix symbol resolution when there are name collisions between ivars and local variables. But it can make expressions run much more slowly.">;
def UseDIL : Property<"use-DIL", "Boolean">,
Global, DefaultFalse,
Desc<"If true, use the alternative DIL implementation for frame variable evaluation.">;
Global, DefaultTrue,
Desc<"If true, use the DIL implementation for frame variable evaluation.">;
}
let Definition = "target" in {

View File

@ -303,7 +303,7 @@ Interpreter::Visit(const MemberOfNode *node) {
}
}
if (field_obj && field_obj->GetName() == node->GetFieldName()) {
if (field_obj) {
if (m_use_dynamic != lldb::eNoDynamicValues) {
lldb::ValueObjectSP dynamic_val_sp =
field_obj->GetDynamicValue(m_use_dynamic);

View File

@ -29,3 +29,17 @@ class TestFrameVarDILQualifiedId(TestBase):
self.expect_var_path("ns::i", value="1")
self.expect_var_path("::ns::ns::i", value="2")
self.expect_var_path("ns::ns::i", value="2")
self.expect_var_path("foo", value="1")
self.expect_var_path("::(anonymous namespace)::foo", value="13")
self.expect_var_path("(anonymous namespace)::foo", value="13")
self.expect_var_path("ns1::(anonymous namespace)::foo", value="5")
self.expect_var_path(
"(anonymous namespace)::ns2::(anonymous namespace)::foo",
value="7",
)
self.expect_var_path("::ns1::(anonymous namespace)::foo", value="5")
self.expect_var_path(
"::(anonymous namespace)::ns2::(anonymous namespace)::foo",
value="7",
)

View File

@ -10,7 +10,26 @@ int i = 2;
} // namespace ns
int main(int argc, char **argv) {
return 0; // Set a breakpoint here
namespace {
int foo = 13;
}
namespace ns1 {
namespace {
int foo = 5;
}
} // namespace ns1
namespace {
namespace ns2 {
namespace {
int foo = 7;
}
} // namespace ns2
} // namespace
int main(int argc, char **argv) {
int foo = 1;
return foo + ::foo + ns1::foo + ns2::foo; // Set a breakpoint here
}

View File

@ -131,7 +131,7 @@ class TestDAP_evaluate(lldbdap_testcase.DAPTestCaseBase):
self.assertEvaluateFailure("a_function(1)")
self.assertEvaluateFailure("var2 + struct1.foo")
self.assertEvaluateFailure("foo_func")
self.assertEvaluateFailure("foo_var")
self.assertEvaluate("foo_var", "44")
# Expressions at breakpoint 2, which is an anonymous block
self.continue_to_breakpoint(breakpoint_2)
@ -169,7 +169,7 @@ class TestDAP_evaluate(lldbdap_testcase.DAPTestCaseBase):
self.assertEvaluateFailure("a_function(1)")
self.assertEvaluateFailure("var2 + struct1.foo")
self.assertEvaluateFailure("foo_func")
self.assertEvaluateFailure("foo_var")
self.assertEvaluate("foo_var", "44")
# Expressions at breakpoint 3, which is inside a_function
self.continue_to_breakpoint(breakpoint_3)
@ -195,7 +195,7 @@ class TestDAP_evaluate(lldbdap_testcase.DAPTestCaseBase):
self.assertEvaluateFailure("a_function(1)")
self.assertEvaluateFailure("list + 1")
self.assertEvaluateFailure("foo_func")
self.assertEvaluateFailure("foo_var")
self.assertEvaluate("foo_var", "44")
# Now we check that values are updated after stepping
self.continue_to_breakpoint(breakpoint_4)

View File

@ -15,7 +15,7 @@
# RUN: %clang_host -fmodules -Xclang -fmodules-cache-path=%t/cache -I%t -g -gmodules %t/b.m -o %t/b.o -c
# RUN: %clang_host %t/a.o %t/b.o -o %t/a.out
# RUN: rm -rf %t/cache
# RUN: %lldb %t/a.out -o "b main" -o run -o "p a" -o "p b" -o q 2>&1 | FileCheck %s
# RUN: %lldb %t/a.out -o "b main" -o run -o "expr a" -o "expr b" -o q 2>&1 | FileCheck %s
# CHECK: {{[ab]}}.o{{.*}}/cache/{{.*}}/C-{{.*}}.pcm' does not exist
# CHECK-NOT: /cache/{{.*}}/C-{.*}.pcm' does not exist
# CHECK: {{[ab]}}.o{{.*}}/cache/{{.*}}/C-{{.*}}.pcm' does not exist

View File

@ -313,6 +313,11 @@ Changes to LLDB
stop reason = SIGSEGV: sent by tkill system call (sender pid=649752, uid=2667987)
```
* ELF Cores can now have their siginfo structures inspected using `thread siginfo`.
* LLDB now uses
[DIL](https://discourse.llvm.org/t/rfc-data-inspection-language/69893) as the
default implementation for 'frame variable'. This should not change the
behavior of 'frame variable' at all, at this time. To revert to using the
old implementation use: `settings set target.experimental.use-DIL false`.
* Disassembly of unknown instructions now produces `<unknown>` instead of
nothing at all
* Changed the format of opcode bytes to match llvm-objdump when disassembling
@ -320,6 +325,7 @@ Changes to LLDB
* LLDB added native support for the Model Context Protocol (MCP). An MCP
server can be started with the `protocol-server start MCP` command.
### Changes to lldb-dap
* Breakpoints can now be set for specific columns within a line.