zequanwu updated this revision to Diff 414529.
zequanwu added a comment.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

We simply shouldn't complete the types of static members at all, which is how 
dwarf does it.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D121030/new/

https://reviews.llvm.org/D121030

Files:
  lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
  lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
  lldb/test/Shell/SymbolFile/NativePDB/Inputs/local-variables.lldbinit
  lldb/test/Shell/SymbolFile/NativePDB/local-variables.cpp

Index: lldb/test/Shell/SymbolFile/NativePDB/local-variables.cpp
===================================================================
--- lldb/test/Shell/SymbolFile/NativePDB/local-variables.cpp
+++ lldb/test/Shell/SymbolFile/NativePDB/local-variables.cpp
@@ -5,6 +5,26 @@
 // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \
 // RUN:     %p/Inputs/local-variables.lldbinit 2>&1 | FileCheck %s
 
+class B;
+class A {
+public:
+    static const A constA;
+    static A a;
+    static B b;
+    int val = 1;
+};
+class B {
+public:
+    static A a;
+    int val = 2;
+};
+A varA;
+B varB;
+const A A::constA = varA;
+A A::a = varA;
+B A::b = varB;
+A B::a = varA;
+
 int Function(int Param1, char Param2) {
   unsigned Local1 = Param1 + 1;
   char Local2 = Param2 + 1;
@@ -15,7 +35,7 @@
 
 int main(int argc, char **argv) {
   int SomeLocal = argc * 2;
-  return Function(SomeLocal, 'a');
+  return varA.val + varB.val + Function(SomeLocal, 'a');
 }
 
 // CHECK:      (lldb) target create "{{.*}}local-variables.cpp.tmp.exe"
@@ -28,13 +48,13 @@
 // CHECK-NEXT: Process {{.*}} stopped
 // CHECK-NEXT: * thread #1, stop reason = breakpoint 1.1
 // CHECK-NEXT:     frame #0: {{.*}} local-variables.cpp.tmp.exe`main(argc=8, argv={{.*}}) at local-variables.cpp:{{.*}}
-// CHECK-NEXT:    14   }
-// CHECK-NEXT:    15
-// CHECK-NEXT:    16   int main(int argc, char **argv) {
-// CHECK-NEXT: -> 17     int SomeLocal = argc * 2;
-// CHECK-NEXT:    18     return Function(SomeLocal, 'a');
-// CHECK-NEXT:    19   }
-// CHECK-NEXT:    20
+// CHECK-NEXT:    34   }
+// CHECK-NEXT:    35
+// CHECK-NEXT:    36   int main(int argc, char **argv) {
+// CHECK-NEXT: -> 37     int SomeLocal = argc * 2;
+// CHECK-NEXT:    38     return varA.val + varB.val + Function(SomeLocal, 'a');
+// CHECK-NEXT:    39   }
+// CHECK-NEXT:    40
 
 // CHECK:      Process {{.*}} launched: '{{.*}}local-variables.cpp.tmp.exe'
 // CHECK-NEXT: (lldb) p argc
@@ -43,12 +63,12 @@
 // CHECK-NEXT: Process {{.*}} stopped
 // CHECK-NEXT: * thread #1, stop reason = step in
 // CHECK-NEXT:     frame #0: {{.*}} local-variables.cpp.tmp.exe`main(argc=8, argv={{.*}}) at local-variables.cpp:{{.*}}
-// CHECK-NEXT:    15
-// CHECK-NEXT:    16 int main(int argc, char **argv) {
-// CHECK-NEXT:    17     int SomeLocal = argc * 2;
-// CHECK-NEXT: -> 18     return Function(SomeLocal, 'a');
-// CHECK-NEXT:    19 }
-// CHECK-NEXT:    20
+// CHECK-NEXT:    35
+// CHECK-NEXT:    36 int main(int argc, char **argv) {
+// CHECK-NEXT:    37     int SomeLocal = argc * 2;
+// CHECK-NEXT: -> 38     return varA.val + varB.val + Function(SomeLocal, 'a');
+// CHECK-NEXT:    39 }
+// CHECK-NEXT:    40
 
 // CHECK:      (lldb) p SomeLocal
 // CHECK-NEXT: (int) $1 = 16
@@ -56,13 +76,13 @@
 // CHECK-NEXT: Process {{.*}} stopped
 // CHECK-NEXT: * thread #1, stop reason = step in
 // CHECK-NEXT:     frame #0: {{.*}} local-variables.cpp.tmp.exe`Function(Param1=16, Param2='a') at local-variables.cpp:{{.*}}
-// CHECK-NEXT:    6
-// CHECK-NEXT:    7
-// CHECK-NEXT:    8 int Function(int Param1, char Param2) {
-// CHECK-NEXT: -> 9      unsigned Local1 = Param1 + 1;
-// CHECK-NEXT:    10     char Local2 = Param2 + 1;
-// CHECK-NEXT:    11     ++Local1;
-// CHECK-NEXT:    12     ++Local2;
+// CHECK-NEXT:    26
+// CHECK-NEXT:    27
+// CHECK-NEXT:    28 int Function(int Param1, char Param2) {
+// CHECK-NEXT: -> 29      unsigned Local1 = Param1 + 1;
+// CHECK-NEXT:    30      char Local2 = Param2 + 1;
+// CHECK-NEXT:    31      ++Local1;
+// CHECK-NEXT:    32      ++Local2;
 
 // CHECK:      (lldb) p Param1
 // CHECK-NEXT: (int) $2 = 16
@@ -72,13 +92,13 @@
 // CHECK-NEXT: Process {{.*}} stopped
 // CHECK-NEXT: * thread #1, stop reason = step in
 // CHECK-NEXT:     frame #0: {{.*}} local-variables.cpp.tmp.exe`Function(Param1=16, Param2='a') at local-variables.cpp:{{.*}}
-// CHECK-NEXT:    7
-// CHECK-NEXT:    8    int Function(int Param1, char Param2) {
-// CHECK-NEXT:    9      unsigned Local1 = Param1 + 1;
-// CHECK-NEXT: -> 10     char Local2 = Param2 + 1;
-// CHECK-NEXT:    11     ++Local1;
-// CHECK-NEXT:    12     ++Local2;
-// CHECK-NEXT:    13     return Local1;
+// CHECK-NEXT:    27
+// CHECK-NEXT:    28    int Function(int Param1, char Param2) {
+// CHECK-NEXT:    29      unsigned Local1 = Param1 + 1;
+// CHECK-NEXT: -> 30      char Local2 = Param2 + 1;
+// CHECK-NEXT:    31      ++Local1;
+// CHECK-NEXT:    32      ++Local2;
+// CHECK-NEXT:    33      return Local1;
 
 // CHECK:      (lldb) p Param1
 // CHECK-NEXT: (int) $4 = 16
@@ -90,13 +110,13 @@
 // CHECK-NEXT: Process {{.*}} stopped
 // CHECK-NEXT: * thread #1, stop reason = step in
 // CHECK-NEXT:     frame #0: {{.*}} local-variables.cpp.tmp.exe`Function(Param1=16, Param2='a') at local-variables.cpp:{{.*}}
-// CHECK-NEXT:    8    int Function(int Param1, char Param2) {
-// CHECK-NEXT:    9      unsigned Local1 = Param1 + 1;
-// CHECK-NEXT:    10     char Local2 = Param2 + 1;
-// CHECK-NEXT: -> 11     ++Local1;
-// CHECK-NEXT:    12     ++Local2;
-// CHECK-NEXT:    13     return Local1;
-// CHECK-NEXT:    14   }
+// CHECK-NEXT:    28    int Function(int Param1, char Param2) {
+// CHECK-NEXT:    29      unsigned Local1 = Param1 + 1;
+// CHECK-NEXT:    30      char Local2 = Param2 + 1;
+// CHECK-NEXT: -> 31      ++Local1;
+// CHECK-NEXT:    32      ++Local2;
+// CHECK-NEXT:    33      return Local1;
+// CHECK-NEXT:    34    }
 
 // CHECK:      (lldb) p Param1
 // CHECK-NEXT: (int) $7 = 16
@@ -110,13 +130,13 @@
 // CHECK-NEXT: Process {{.*}} stopped
 // CHECK-NEXT: * thread #1, stop reason = step in
 // CHECK-NEXT:     frame #0: {{.*}} local-variables.cpp.tmp.exe`Function(Param1=16, Param2='a') at local-variables.cpp:{{.*}}
-// CHECK-NEXT:    9      unsigned Local1 = Param1 + 1;
-// CHECK-NEXT:    10     char Local2 = Param2 + 1;
-// CHECK-NEXT:    11     ++Local1;
-// CHECK-NEXT: -> 12     ++Local2;
-// CHECK-NEXT:    13     return Local1;
-// CHECK-NEXT:    14   }
-// CHECK-NEXT:    15
+// CHECK-NEXT:    29      unsigned Local1 = Param1 + 1;
+// CHECK-NEXT:    30      char Local2 = Param2 + 1;
+// CHECK-NEXT:    31      ++Local1;
+// CHECK-NEXT: -> 32      ++Local2;
+// CHECK-NEXT:    33      return Local1;
+// CHECK-NEXT:    34    }
+// CHECK-NEXT:    35
 
 // CHECK:      (lldb) p Param1
 // CHECK-NEXT: (int) $11 = 16
@@ -130,13 +150,13 @@
 // CHECK-NEXT: Process {{.*}} stopped
 // CHECK-NEXT: * thread #1, stop reason = step in
 // CHECK-NEXT:     frame #0: {{.*}} local-variables.cpp.tmp.exe`Function(Param1=16, Param2='a') at local-variables.cpp:{{.*}}
-// CHECK-NEXT:    10      char Local2 = Param2 + 1;
-// CHECK-NEXT:    11     ++Local1;
-// CHECK-NEXT:    12     ++Local2;
-// CHECK-NEXT: -> 13     return Local1;
-// CHECK-NEXT:    14   }
-// CHECK-NEXT:    15
-// CHECK-NEXT:    16   int main(int argc, char **argv) {
+// CHECK-NEXT:    30      char Local2 = Param2 + 1;
+// CHECK-NEXT:    31      ++Local1;
+// CHECK-NEXT:    32      ++Local2;
+// CHECK-NEXT: -> 33      return Local1;
+// CHECK-NEXT:    34    }
+// CHECK-NEXT:    35
+// CHECK-NEXT:    36    int main(int argc, char **argv) {
 
 // CHECK:      (lldb) p Param1
 // CHECK-NEXT: (int) $15 = 16
@@ -146,9 +166,13 @@
 // CHECK-NEXT: (unsigned int) $17 = 18
 // CHECK-NEXT: (lldb) p Local2
 // CHECK-NEXT: (char) $18 = 'c'
+// CHECK-NEXT: (lldb) p varA.val
+// CHECK-NEXT: (int) $19 = 1
+// CHECK-NEXT: (lldb) p varB.val
+// CHECK-NEXT: (int) $20 = 2
 // CHECK-NEXT: (lldb) continue
 // CHECK-NEXT: Process {{.*}} resuming
-// CHECK-NEXT: Process {{.*}} exited with status = 18 (0x00000012)
+// CHECK-NEXT: Process {{.*}} exited with status = 21 (0x00000015)
 
 // CHECK:      (lldb) target modules dump ast
 // CHECK-NEXT: Dumping clang ast for {{.*}} modules.
@@ -157,6 +181,6 @@
 // CHECK-NEXT: | |-ParmVarDecl {{.*}} argc 'int'
 // CHECK-NEXT: | `-ParmVarDecl {{.*}} argv 'char **'
 // CHECK-NEXT: |-FunctionDecl {{.*}} __scrt_common_main_seh 'int ()' static 
-// CHECK-NEXT: `-FunctionDecl {{.*}} Function 'int (int, char)'
+// CHECK-NEXT: |-FunctionDecl {{.*}} Function 'int (int, char)'
 // CHECK-NEXT:   |-ParmVarDecl {{.*}} Param1 'int'
 // CHECK-NEXT:   `-ParmVarDecl {{.*}} Param2 'char'
Index: lldb/test/Shell/SymbolFile/NativePDB/Inputs/local-variables.lldbinit
===================================================================
--- lldb/test/Shell/SymbolFile/NativePDB/Inputs/local-variables.lldbinit
+++ lldb/test/Shell/SymbolFile/NativePDB/Inputs/local-variables.lldbinit
@@ -25,6 +25,8 @@
 p Param2
 p Local1
 p Local2
+p varA.val
+p varB.val
 continue
 
 target modules dump ast
Index: lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
+++ lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
@@ -138,8 +138,6 @@
   clang::QualType member_type =
       m_ast_builder.GetOrCreateType(PdbTypeSymId(static_data_member.Type));
 
-  m_ast_builder.CompleteType(member_type);
-
   CompilerType member_ct = m_ast_builder.ToCompilerType(member_type);
 
   lldb::AccessType access =
@@ -149,7 +147,7 @@
 
   // Static constant members may be a const[expr] declaration.
   // Query the symbol's value as the variable initializer if valid.
-  if (member_ct.IsConst()) {
+  if (member_ct.IsConst() && member_ct.IsCompleteType()) {
     std::string qual_name = decl->getQualifiedNameAsString();
 
     auto results =
Index: lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
+++ lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
@@ -1231,8 +1231,10 @@
 clang::QualType PdbAstBuilder::CreateArrayType(const ArrayRecord &ar) {
   clang::QualType element_type = GetOrCreateType(ar.ElementType);
 
-  uint64_t element_count =
-      ar.Size / GetSizeOfType({ar.ElementType}, m_index.tpi());
+  uint64_t element_size = GetSizeOfType({ar.ElementType}, m_index.tpi());
+  if (element_size == 0)
+    return {};
+  uint64_t element_count = ar.Size / element_size;
 
   CompilerType array_ct = m_clang.CreateArrayType(ToCompilerType(element_type),
                                                   element_count, false);
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to