[Lldb-commits] [lldb] r326859 - [SymbolFilePDB] Add support for CVR pointer type qualifier

Aaron Smith via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 6 16:39:25 PST 2018


Author: asmith
Date: Tue Mar  6 16:39:25 2018
New Revision: 326859

URL: http://llvm.org/viewvc/llvm-project?rev=326859&view=rev
Log:
[SymbolFilePDB] Add support for CVR pointer type qualifier

Summary:
- Complete element type of PDBSymbolTypeArray.

- Add a test to check types of multi-dimensional array and pointers with CVR.

Reviewers: zturner, rnk, lldb-commits

Reviewed By: zturner

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D44167

Added:
    lldb/trunk/lit/SymbolFile/PDB/Inputs/TypeQualsTest.cpp
    lldb/trunk/lit/SymbolFile/PDB/type-quals.test
Modified:
    lldb/trunk/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp

Added: lldb/trunk/lit/SymbolFile/PDB/Inputs/TypeQualsTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/PDB/Inputs/TypeQualsTest.cpp?rev=326859&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/PDB/Inputs/TypeQualsTest.cpp (added)
+++ lldb/trunk/lit/SymbolFile/PDB/Inputs/TypeQualsTest.cpp Tue Mar  6 16:39:25 2018
@@ -0,0 +1,46 @@
+// Rank > 0 array
+typedef volatile int* RankNArray[10][100];
+RankNArray ArrayVar;
+
+typedef int __unaligned *UnalignedTypedef;
+UnalignedTypedef UnVar;
+
+typedef long* __restrict RestrictTypedef;
+RestrictTypedef RestrictVar;
+
+void Func1(const int* a, int const* b, const int ** const c, const int* const* d) {
+  return;
+}
+
+void Func2(volatile int* a, int volatile* b) {
+ return;
+}
+
+void Func3(int*& a, int& b, const int&c, int&& d) {
+  return;
+}
+
+void Func4(int* __unaligned a, __unaligned int* b) {
+  return;
+}
+
+void Func5(int a, int* __restrict b, int& __restrict c) {
+  return;
+}
+
+void Func6(const volatile int* __restrict b) {
+  return;
+}
+
+// LValue
+typedef int& IntRef;
+int x = 0;
+IntRef IVar = x;
+
+// RValue
+typedef int&& IIRef;
+IIRef IIVar = int(1);
+
+int main() {
+  return 0;
+}

Added: lldb/trunk/lit/SymbolFile/PDB/type-quals.test
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/PDB/type-quals.test?rev=326859&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/PDB/type-quals.test (added)
+++ lldb/trunk/lit/SymbolFile/PDB/type-quals.test Tue Mar  6 16:39:25 2018
@@ -0,0 +1,39 @@
+REQUIRES: windows
+RUN: clang-cl -m32 /Z7 /c /GS- %S/Inputs/TypeQualsTest.cpp /o %T/TypeQualsTest.cpp.obj
+RUN: link %T/TypeQualsTest.cpp.obj /DEBUG /nodefaultlib /ENTRY:main /OUT:%T/TypeQualsTest.cpp.exe
+RUN: lldb-test symbols %T/TypeQualsTest.cpp.exe | FileCheck %s
+
+CHECK: Module [[MOD:.*]]
+CHECK-DAG: {{^[0-9A-F]+}}: SymbolVendor ([[MOD]])
+CHECK:      Type{{.*}} , name = "const int", size = 4, compiler_type = {{.*}} const int
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int *
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int **const
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int *const
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int *const *
+CHECK:      Type{{.*}} , name = "Func1", {{.*}}, compiler_type = {{.*}} void (const int *, const int *, const int **const, const int *const *)
+
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} volatile int *
+CHECK:      Type{{.*}} , name = "Func2", {{.*}}, compiler_type = {{.*}} void (volatile int *, volatile int *)
+
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} int *
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} int *&
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} int &
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int &
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} int &&
+CHECK:      Type{{.*}} , name = "Func3", {{.*}}, compiler_type = {{.*}} void (int *&, int &, const int &, int &&)
+
+// FIXME: __unaligned is not supported.
+CHECK:      Type{{.*}} , name = "Func4", {{.*}}, compiler_type = {{.*}} void (int *, int *)
+
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} int *__restrict
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} int &__restrict
+CHECK:      Type{{.*}} , name = "Func5", {{.*}}, compiler_type = {{.*}} void (int, int *__restrict, int &__restrict)
+
+CHECK:      Type{{.*}} , name = "Func6", {{.*}}, compiler_type = {{.*}} void (const volatile int *__restrict)
+
+CHECK:      Type{{.*}} , size = 400, compiler_type = {{.*}} volatile int *[100]
+CHECK:      Type{{.*}} , size = 4000, compiler_type = {{.*}} volatile int *[10][100]
+
+CHECK:      Type{{.*}} , size = 4, compiler_type = {{.*}} long *__restrict
+
+CHECK-DAG: {{^[0-9A-F]+}}:   CompileUnit{{[{]0x[0-9a-f]+[}]}}, language = "c++", file = '{{.*}}\TypeQualsTest.cpp'

Modified: lldb/trunk/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp?rev=326859&r1=326858&r2=326859&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp Tue Mar  6 16:39:25 2018
@@ -292,6 +292,9 @@ lldb::TypeSP PDBASTParser::CreateLLDBTyp
         m_ast.GetSymbolFile()->GetDeclContextForUID(target_type->GetID());
     CompilerType ast_typedef =
         m_ast.CreateTypedefType(target_ast_type, name.c_str(), target_decl_ctx);
+    if (!ast_typedef)
+      return nullptr;
+
     return std::make_shared<lldb_private::Type>(
         type_def->getSymIndexId(), m_ast.GetSymbolFile(), ConstString(name),
         bytes, nullptr, target_type->GetID(),
@@ -365,20 +368,35 @@ lldb::TypeSP PDBASTParser::CreateLLDBTyp
     auto array_type = llvm::dyn_cast<PDBSymbolTypeArray>(&type);
     assert(array_type);
     uint32_t num_elements = array_type->getCount();
-    uint32_t element_uid = array_type->getElementType()->getSymIndexId();
+    uint32_t element_uid = array_type->getElementTypeId();
     uint32_t bytes = array_type->getLength();
 
+    // If array rank > 0, PDB gives the element type at N=0. So element type
+    // will parsed in the order N=0, N=1,..., N=rank sequentially.
     lldb_private::Type *element_type =
         m_ast.GetSymbolFile()->ResolveTypeUID(element_uid);
     if (!element_type)
       return nullptr;
-    CompilerType element_ast_type = element_type->GetFullCompilerType();
+
+    CompilerType element_ast_type = element_type->GetForwardCompilerType();
+    // If element type is UDT, it needs to be complete.
+    if (ClangASTContext::IsCXXClassType(element_ast_type) &&
+        element_ast_type.GetCompleteType() == false) {
+      if (ClangASTContext::StartTagDeclarationDefinition(element_ast_type)) {
+        ClangASTContext::CompleteTagDeclarationDefinition(element_ast_type);
+      } else {
+        // We are not able to start defintion.
+        return nullptr;
+      }
+    }
     CompilerType array_ast_type =
-        m_ast.CreateArrayType(element_ast_type, num_elements, false);
-    return std::make_shared<lldb_private::Type>(
+        m_ast.CreateArrayType(element_ast_type, num_elements, /*is_gnu_vector*/false);
+    TypeSP type_sp = std::make_shared<lldb_private::Type>(
         array_type->getSymIndexId(), m_ast.GetSymbolFile(), ConstString(),
         bytes, nullptr, LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID,
         decl, array_ast_type, lldb_private::Type::eResolveStateFull);
+    type_sp->SetEncodingType(element_type);
+    return type_sp;
   } break;
   case PDB_SymType::BuiltinType: {
     auto *builtin_type = llvm::dyn_cast<PDBSymbolTypeBuiltin>(&type);
@@ -392,20 +410,17 @@ lldb::TypeSP PDBASTParser::CreateLLDBTyp
     CompilerType builtin_ast_type = GetBuiltinTypeForPDBEncodingAndBitSize(
         &m_ast, builtin_type, encoding, bytes * 8);
 
-    Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID;
-    if (builtin_type->isConstType()) {
-      encoding_data_type = Type::eEncodingIsConstUID;
+    if (builtin_type->isConstType())
       builtin_ast_type = builtin_ast_type.AddConstModifier();
-    }
-    if (builtin_type->isVolatileType()) {
-      encoding_data_type = Type::eEncodingIsVolatileUID;
+
+    if (builtin_type->isVolatileType())
       builtin_ast_type = builtin_ast_type.AddVolatileModifier();
-    }
+
     auto type_name = GetPDBBuiltinTypeName(builtin_type, builtin_ast_type);
 
     return std::make_shared<lldb_private::Type>(
         builtin_type->getSymIndexId(), m_ast.GetSymbolFile(), type_name,
-        bytes, nullptr, LLDB_INVALID_UID, encoding_data_type,
+        bytes, nullptr, LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID,
         decl, builtin_ast_type, lldb_private::Type::eResolveStateFull);
   } break;
   case PDB_SymType::PointerType: {
@@ -417,18 +432,27 @@ lldb::TypeSP PDBASTParser::CreateLLDBTyp
       return nullptr;
 
     CompilerType pointer_ast_type;
-    Type::EncodingDataType encoding_data_type = Type::eEncodingIsPointerUID;
-    if (pointer_type->isReference()) {
-      encoding_data_type = Type::eEncodingIsLValueReferenceUID;
-      pointer_ast_type =
-          pointee_type->GetFullCompilerType().GetLValueReferenceType();
-    } else
-      pointer_ast_type = pointee_type->GetFullCompilerType().GetPointerType();
+    pointer_ast_type = pointee_type->GetFullCompilerType();
+    if (pointer_type->isReference())
+      pointer_ast_type = pointer_ast_type.GetLValueReferenceType();
+    else if (pointer_type->getRawSymbol().isRValueReference())
+      pointer_ast_type = pointer_ast_type.GetRValueReferenceType();
+    else
+      pointer_ast_type = pointer_ast_type.GetPointerType();
+
+    if (pointer_type->isConstType())
+      pointer_ast_type = pointer_ast_type.AddConstModifier();
+
+    if (pointer_type->isVolatileType())
+      pointer_ast_type = pointer_ast_type.AddVolatileModifier();
+
+    if (pointer_type->getRawSymbol().isRestrictedType())
+      pointer_ast_type = pointer_ast_type.AddRestrictModifier();
 
     return std::make_shared<lldb_private::Type>(
         pointer_type->getSymIndexId(), m_ast.GetSymbolFile(), ConstString(),
         pointer_type->getLength(), nullptr, LLDB_INVALID_UID,
-        encoding_data_type, decl, pointer_ast_type,
+        lldb_private::Type::eEncodingIsUID, decl, pointer_ast_type,
         lldb_private::Type::eResolveStateFull);
   } break;
   default: break;




More information about the lldb-commits mailing list