Skip to content

Commit 406d6bd

Browse files
authored
[LLDB][NativePDB] Mark blocks as parsed after parsing (#157493)
After parsing blocks in a function, the blocks should be marked as parsed for them to be dumped (see [Function::Dump](https://github.com/llvm/llvm-project/blob/e6aefbec782dbb57f72eb0ae399ed944fe49db2e/lldb/source/Symbol/Function.cpp#L446-L447)). As explained in #114906 (comment), this happens (accidentally?) in the DIA plugin when parsing variables, because it calls `function.GetBlock(can_create=true)` which marks blocks as parsed. In the native plugin, this was never called, so blocks and variables were never included in the `lldb-test symbols` output. The `variables.test` for the DIA plugin tests this. One difference between the plugins is how they specify the location of local variables. This causes the output of the native plugin to be two lines per variable, whereas the DIA plugin has one line: ``` (native): 000002C4B7593020: Variable{0x1c800001}, name = "var_arg1", type = {0000000000000744} 0x000002C4B6CA7900 (int), scope = parameter, location = 0x00000000: [0x000000014000102c, 0x000000014000103e): DW_OP_breg7 RSP+8 ``` ``` (DIA): 000002778C827EE0: Variable{0x0000001b}, name = "var_arg1", type = {0000000000000005} 0x000002778C1FBAB0 (int), scope = parameter, decl = VariablesTest.cpp:32, location = DW_OP_breg7 RSP+8 ``` In the test, I filtered lines starting with spaces followed by `[0x`, so we can still use `CHECK-NEXT`. --- Another difference between the plugins is that DIA marks the `this` pointer as artificial (equivalent to DWARF). This is done if a variable's object kind is `ObjectPtr` ([source](https://github.com/llvm/llvm-project/blob/ab898f32c60689d1d47d0b6de66c30d3476994bb/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp#L1050)). As far as I know, there isn't anything in the debug info that says "this variable is the `this` pointer" other than the name/type of a variable and the type of the function.
1 parent 9c858f5 commit 406d6bd

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,8 @@ size_t SymbolFileNativePDB::ParseBlocksRecursive(Function &func) {
16241624
for (uint64_t uid : remove_uids) {
16251625
m_inline_sites.erase(uid);
16261626
}
1627+
1628+
func.GetBlock(false).SetBlockInfoHasBeenParsed(true, true);
16271629
return count;
16281630
}
16291631

lldb/test/Shell/SymbolFile/PDB/variables.test

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,27 @@ REQUIRES: system-windows, msvc
22
RUN: mkdir -p %t.dir
33
RUN: %build --compiler=clang-cl --mode=compile --arch=64 --nodefaultlib --output=%t.dir/VariablesTest.cpp.obj %S/Inputs/VariablesTest.cpp
44
RUN: %build --compiler=msvc --mode=link --arch=64 --nodefaultlib --output=%t.dir/VariablesTest.cpp.exe %t.dir/VariablesTest.cpp.obj
5-
RUN: lldb-test symbols %t.dir/VariablesTest.cpp.exe > %t.dir/VariablesTest.out
6-
RUN: FileCheck --check-prefix=GLOBALS --input-file=%t.dir/VariablesTest.out %s
7-
RUN: FileCheck --check-prefix=FUNC-F --input-file=%t.dir/VariablesTest.out %s
8-
RUN: FileCheck --check-prefix=FUNC-MAIN --input-file=%t.dir/VariablesTest.out %s
9-
RUN: FileCheck --check-prefix=FUNC-CONSTRUCTOR --input-file=%t.dir/VariablesTest.out %s
10-
RUN: FileCheck --check-prefix=FUNC-MEMBER --input-file=%t.dir/VariablesTest.out %s
5+
# Note: The native plugin creates a location list for variables that's only valid for the function.
6+
# The DIA plugin creates a location expression that's always valid. This causes DIA to output
7+
# one line per variable where the native plugin would output two (the second would contain the
8+
# location information). This removes the second line from the output of the native plugin.
9+
# It's done in both cases, because LLDB might not be compiled with the DIA SDK in which case
10+
# the native plugin is always used.
11+
RUN: env LLDB_USE_NATIVE_PDB_READER=0 lldb-test symbols %t.dir/VariablesTest.cpp.exe | sed '/^ \+\[0x/d' > %t.dir/VariablesTest.DIA.out
12+
RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb-test symbols %t.dir/VariablesTest.cpp.exe | sed '/^ \+\[0x/d' > %t.dir/VariablesTest.Native.out
13+
RUN: FileCheck --check-prefix=GLOBALS --input-file=%t.dir/VariablesTest.DIA.out %s
14+
RUN: FileCheck --check-prefix=GLOBALS --input-file=%t.dir/VariablesTest.Native.out %s
15+
RUN: FileCheck --check-prefix=FUNC-F --input-file=%t.dir/VariablesTest.DIA.out %s
16+
RUN: FileCheck --check-prefix=FUNC-F --input-file=%t.dir/VariablesTest.Native.out %s
17+
RUN: FileCheck --check-prefix=FUNC-MAIN --input-file=%t.dir/VariablesTest.DIA.out %s
18+
RUN: FileCheck --check-prefix=FUNC-MAIN --input-file=%t.dir/VariablesTest.Native.out %s
19+
RUN: FileCheck --check-prefix=FUNC-CONSTRUCTOR --input-file=%t.dir/VariablesTest.DIA.out %s
20+
RUN: FileCheck --check-prefix=FUNC-CONSTRUCTOR --input-file=%t.dir/VariablesTest.Native.out %s
21+
RUN: FileCheck --check-prefix=FUNC-MEMBER --input-file=%t.dir/VariablesTest.DIA.out %s
22+
RUN: FileCheck --check-prefix=FUNC-MEMBER --input-file=%t.dir/VariablesTest.Native.out %s
1123

1224
GLOBALS: Module [[MOD:.*]]
13-
GLOBALS: SymbolFile pdb ([[MOD]])
25+
GLOBALS: SymbolFile {{(native-)?}}pdb ([[MOD]])
1426
GLOBALS: CompileUnit{{.*}}, language = "c++", file = '{{.*}}\VariablesTest.cpp'
1527
GLOBALS-DAG: Variable{{.*}}, name = "g_IntVar"
1628
GLOBALS-SAME: scope = global, location = {{.*}}, external
@@ -30,7 +42,7 @@ GLOBALS-DAG: Variable{{.*}}, name = "g_Const"
3042
GLOBALS-SAME: scope = ??? (2)
3143
GLOBALS: Function
3244

33-
FUNC-F: Function{{.*}}, mangled = ?f@@YAHHH@Z
45+
FUNC-F: Function{{.*}}, {{mangled = \?f@@YAHHH@Z|demangled = f}}
3446
FUNC-F-NEXT: Block
3547
FUNC-F-NEXT: Variable{{.*}}, name = "var_arg1"
3648
FUNC-F-SAME: scope = parameter
@@ -39,7 +51,7 @@ FUNC-F-SAME: scope = parameter
3951
FUNC-F-NEXT: Variable{{.*}}, name = "same_name_var"
4052
FUNC-F-SAME: scope = local
4153

42-
FUNC-MAIN: Function{{.*}}, mangled = main
54+
FUNC-MAIN: Function{{.*}}, {{(de)?}}mangled = main
4355
FUNC-MAIN-NEXT: Block
4456
FUNC-MAIN-NEXT: Variable{{.*}}, name = "same_name_var"
4557
FUNC-MAIN-SAME: scope = local
@@ -52,16 +64,14 @@ FUNC-MAIN-SAME: scope = local
5264
FUNC-MAIN-NEXT: Variable{{.*}}, name = "a"
5365
FUNC-MAIN-SAME: scope = local
5466

55-
FUNC-CONSTRUCTOR: Function{{.*}}, {{(de)?}}mangled = {{.*}}{{(Class::)?}}Class{{.*}}
67+
FUNC-CONSTRUCTOR: Function{{.*}}, {{(de)?}}mangled = {{.*}}Class::Class{{.*}}
5668
FUNC-CONSTRUCTOR-NEXT: Block
5769
FUNC-CONSTRUCTOR-NEXT: Variable{{.*}}, name = "this"
5870
FUNC-CONSTRUCTOR-SAME: scope = parameter
59-
FUNC-CONSTRUCTOR-SAME: artificial
6071
FUNC-CONSTRUCTOR-NEXT: Variable{{.*}}, name = "a"
6172
FUNC-CONSTRUCTOR-SAME: scope = parameter
6273

6374
FUNC-MEMBER: Function{{.*}}, {{(de)?}}mangled = {{.*}}{{(Class::)?}}Func{{.*}}
6475
FUNC-MEMBER-NEXT: Block
6576
FUNC-MEMBER-NEXT: Variable{{.*}}, name = "this"
6677
FUNC-MEMBER-SAME: scope = parameter
67-
FUNC-MEMBER-SAME: artificial

0 commit comments

Comments
 (0)