Author: zturner Date: Tue Dec 18 15:12:08 2018 New Revision: 349565 URL: http://llvm.org/viewvc/llvm-project?rev=349565&view=rev Log: [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. Modified: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit lldb/trunk/lit/SymbolFile/NativePDB/nested-types.cpp lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp Modified: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit?rev=349565&r1=349564&r2=349565&view=diff ============================================================================== --- lldb/trunk/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit (original) +++ lldb/trunk/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit Tue Dec 18 15:12:08 2018 @@ -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 Modified: lldb/trunk/lit/SymbolFile/NativePDB/nested-types.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/nested-types.cpp?rev=349565&r1=349564&r2=349565&view=diff ============================================================================== --- lldb/trunk/lit/SymbolFile/NativePDB/nested-types.cpp (original) +++ lldb/trunk/lit/SymbolFile/NativePDB/nested-types.cpp Tue Dec 18 15:12:08 2018 @@ -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 Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp?rev=349565&r1=349564&r2=349565&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp Tue Dec 18 15:12:08 2018 @@ -188,7 +188,10 @@ GetNestedTagRecord(const NestedTypeRecor // 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) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits