Since #189401, LLVM and Clang generate `S_DEFRANGE_REGISTER_REL_INDIR` for indirect locations. This adds support in LLDB. The offset added after dereferencing is signed here - unlike in `S_REGREL32_INDIR` (at least that's the assumption). So I updated `MakeRegisterBasedIndirectLocationExpressionInternal` to handle the signedness. This is the reason the MSVC test was changed here. I didn't find a test case where LLVM emits the record with the `VFRAME` register. Other than that, the clang test is similar to the MSVC one except that the locations are slightly different.
44 lines
1.2 KiB
Plaintext
44 lines
1.2 KiB
Plaintext
# REQUIRES: lld, msvc, target-windows
|
|
|
|
# Test that LLDB can show variables introduced in C++ 17 structured bindings
|
|
# when compiled with MSVC.
|
|
|
|
# RUN: split-file %s %t
|
|
|
|
# RUN: %build --compiler=msvc --arch=64 --std=c++17 --nodefaultlib -o %t.exe -- %t/main.cpp
|
|
# RUN: lldb-test symbols %t.exe | FileCheck %s --check-prefix=SYMBOLS
|
|
# RUN: %lldb -f %t.exe -s %t/commands.input | FileCheck %s --check-prefix=LLDB
|
|
|
|
#--- main.cpp
|
|
|
|
struct Foo { int a; int b; };
|
|
|
|
int main() {
|
|
Foo f{1, 2};
|
|
|
|
auto&[a, b] = f;
|
|
return a + b; // break here
|
|
}
|
|
|
|
#--- commands.input
|
|
|
|
br set -p "break here"
|
|
r
|
|
v f
|
|
v a
|
|
v b
|
|
q
|
|
|
|
# SYMBOLS: Function{{.*}}, demangled = main, type =
|
|
# SYMBOLS-NEXT: Block{{.*}}, ranges =
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "f", type = {{.*}} (Foo), scope = local, location =
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "b", type = {{.*}} (int), scope = local, location = DW_OP_breg{{.*}}, DW_OP_deref, DW_OP_consts {{[+-][0-9]+}}, DW_OP_plus
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "a", type = {{.*}} (int), scope = local, location = DW_OP_breg{{.*}}, DW_OP_deref, DW_OP_consts +0, DW_OP_plus
|
|
|
|
# LLDB: (lldb) v f
|
|
# LLDB-NEXT: (Foo) f = (a = 1, b = 2)
|
|
# LLDB-NEXT: (lldb) v a
|
|
# LLDB-NEXT: (int) a = 1
|
|
# LLDB-NEXT: (lldb) v b
|
|
# LLDB-NEXT: (int) b = 2
|