summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-12-18 23:12:08 +0000
committerZachary Turner <zturner@google.com>2018-12-18 23:12:08 +0000
commitcb67fad44a59cb783d2047a27ad387ed3ec2a466 (patch)
treec825fbf12b153d09538022c08634672d2dbefa2b
parent61b189e06f7e968090357cb77c6b22e2be79fb1b (diff)
downloadbcm5719-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.lldbinit1
-rw-r--r--lldb/lit/SymbolFile/NativePDB/nested-types.cpp17
-rw-r--r--lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp5
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)
OpenPOWER on IntegriCloud