diff options
author | Zachary Turner <zturner@google.com> | 2018-12-18 23:12:08 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2018-12-18 23:12:08 +0000 |
commit | cb67fad44a59cb783d2047a27ad387ed3ec2a466 (patch) | |
tree | c825fbf12b153d09538022c08634672d2dbefa2b | |
parent | 61b189e06f7e968090357cb77c6b22e2be79fb1b (diff) | |
download | bcm5719-llvm-cb67fad44a59cb783d2047a27ad387ed3ec2a466.tar.gz bcm5719-llvm-cb67fad44a59cb783d2047a27ad387ed3ec2a466.zip |
[NativePDB] Correctly reconstruct DeclContext for nested enums.
We reconstruct the AST hierarchy by trying to hack up a mangled
name for the parent type using the child type's mangled name.
This was failing for enums because their tag type is represented
with two letters ("W4") instead of one letter ("T", "U", etc) as
it is with classes, structs, and unions. After accounting for
this we can now correctly determine when an enum is nested
inside of a namespace or a class.
llvm-svn: 349565
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit | 1 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/nested-types.cpp | 17 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp | 5 |
3 files changed, 19 insertions, 4 deletions
diff --git a/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit b/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit index 21c3001e3a1..466df81fc42 100644 --- a/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit +++ b/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit @@ -8,5 +8,6 @@ target variable -T GlobalE target variable -T GlobalF target variable -T GlobalG target variable -T GlobalH +target variable -T GlobalEnum target modules dump ast diff --git a/lldb/lit/SymbolFile/NativePDB/nested-types.cpp b/lldb/lit/SymbolFile/NativePDB/nested-types.cpp index 5693f7f320f..eb2b3ec7e34 100644 --- a/lldb/lit/SymbolFile/NativePDB/nested-types.cpp +++ b/lldb/lit/SymbolFile/NativePDB/nested-types.cpp @@ -11,6 +11,11 @@ struct S { int A = 0; int B = 1; }; + + enum class NestedEnum { + EnumValue1 = 0, + EnumValue2 = 1, + }; int C = 2; int D = 3; using VoidPtrT = void *; @@ -70,6 +75,7 @@ constexpr T::U GlobalE; constexpr U<int> GlobalF; constexpr U<int>::V<int> GlobalG; constexpr U<int>::W GlobalH; +constexpr S::NestedEnum GlobalEnum = S::NestedEnum::EnumValue1; int main(int argc, char **argv) { @@ -113,6 +119,8 @@ int main(int argc, char **argv) { // CHECK: (int) I = 8 // CHECK: (int) J = 9 // CHECK: } +// CHECK: (lldb) target variable -T GlobalEnum +// CHECK: (const S::NestedEnum) GlobalEnum = EnumValue1 // CHECK: (lldb) target modules dump ast // CHECK: Dumping clang ast for 1 modules. // CHECK: TranslationUnitDecl {{.*}} @@ -120,9 +128,12 @@ int main(int argc, char **argv) { // CHECK: | |-FieldDecl {{.*}} C 'int' // CHECK: | |-FieldDecl {{.*}} D 'int' // CHECK: | |-FieldDecl {{.*}} DD 'void *' -// CHECK: | `-CXXRecordDecl {{.*}} struct NestedStruct definition -// CHECK: | |-FieldDecl {{.*}} A 'int' -// CHECK: | `-FieldDecl {{.*}} B 'int' +// CHECK: | |-CXXRecordDecl {{.*}} struct NestedStruct definition +// CHECK: | | |-FieldDecl {{.*}} A 'int' +// CHECK: | | `-FieldDecl {{.*}} B 'int' +// CHECK: | `-EnumDecl {{.*}} NestedEnum
+// CHECK: | |-EnumConstantDecl {{.*}} EnumValue1 'S::NestedEnum'
+// CHECK: | `-EnumConstantDecl {{.*}} EnumValue2 'S::NestedEnum' // CHECK: |-CXXRecordDecl {{.*}} struct T definition // CHECK: | |-FieldDecl {{.*}} NT 'int' // CHECK: | |-CXXRecordDecl {{.*}} struct NestedStruct definition diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp index 956e56f504d..778c4021962 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp @@ -188,7 +188,10 @@ GetNestedTagRecord(const NestedTypeRecord &Record, const CVTagRecord &parent, // inner tag type is not necessarily the same as the outer tag type, re-write // it to match the inner tag type. qname[3] = child.asTag().getUniqueName()[3]; - std::string piece = Record.Name; + std::string piece; + if (qname[3] == 'W') + piece = "4"; + piece += Record.Name; piece.push_back('@'); qname.insert(4, std::move(piece)); if (qname != child.asTag().UniqueName) |