[cfe-commits] r68984 - in /cfe/trunk: lib/Frontend/PCHReader.cpp test/PCH/types.c test/PCH/types.h

Douglas Gregor dgregor at apple.com
Mon Apr 13 13:46:52 PDT 2009


Author: dgregor
Date: Mon Apr 13 15:46:52 2009
New Revision: 68984

URL: http://llvm.org/viewvc/llvm-project?rev=68984&view=rev
Log:
Introduce PCH (de-)serialization for most compound types, excluding
Objective-C types and record types for the moment.

Added:
    cfe/trunk/test/PCH/types.c
    cfe/trunk/test/PCH/types.h
Modified:
    cfe/trunk/lib/Frontend/PCHReader.cpp

Modified: cfe/trunk/lib/Frontend/PCHReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReader.cpp?rev=68984&r1=68983&r2=68984&view=diff

==============================================================================
--- cfe/trunk/lib/Frontend/PCHReader.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHReader.cpp Mon Apr 13 15:46:52 2009
@@ -80,13 +80,17 @@
 
 void PCHDeclReader::VisitTypeDecl(TypeDecl *TD) {
   VisitNamedDecl(TD);
-  // FIXME: circular dependencies here?
   TD->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
 }
 
 void PCHDeclReader::VisitTypedefDecl(TypedefDecl *TD) {
-  VisitTypeDecl(TD);
-  TD->setUnderlyingType(Reader.GetType(Record[Idx++]));
+  // Note that we cannot use VisitTypeDecl here, because we need to
+  // set the underlying type of the typedef *before* we try to read
+  // the type associated with the TypedefDecl.
+  VisitNamedDecl(TD);
+  TD->setUnderlyingType(Reader.GetType(Record[Idx + 1]));
+  TD->setTypeForDecl(Reader.GetType(Record[Idx]).getTypePtr());
+  Idx += 2;
 }
 
 void PCHDeclReader::VisitTagDecl(TagDecl *TD) {
@@ -775,6 +779,11 @@
   RecordData Record;
   unsigned Code = Stream.ReadCode();
   switch ((pch::TypeCode)Stream.ReadRecord(Code, Record)) {
+  case pch::TYPE_EXT_QUAL:
+    // FIXME: Deserialize ExtQualType
+    assert(false && "Cannot deserialize qualified types yet");
+    return QualType();
+
   case pch::TYPE_FIXED_WIDTH_INT: {
     assert(Record.size() == 2 && "Incorrect encoding of fixed-width int type");
     return Context.getFixedWidthIntType(Record[0], Record[1]);
@@ -817,14 +826,118 @@
     return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
   }
 
+  case pch::TYPE_CONSTANT_ARRAY: {
+    QualType ElementType = GetType(Record[0]);
+    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
+    unsigned IndexTypeQuals = Record[2];
+    unsigned Idx = 3;
+    llvm::APInt Size = ReadAPInt(Record, Idx);
+    return Context.getConstantArrayType(ElementType, Size, ASM, IndexTypeQuals);
+  }
+
+  case pch::TYPE_INCOMPLETE_ARRAY: {
+    QualType ElementType = GetType(Record[0]);
+    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
+    unsigned IndexTypeQuals = Record[2];
+    return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
+  }
+
+  case pch::TYPE_VARIABLE_ARRAY: {
+    // FIXME: implement this
+    assert(false && "Unable to de-serialize variable-length array type");
+    return QualType();
+  }
+
+  case pch::TYPE_VECTOR: {
+    if (Record.size() != 2) {
+      Error("Incorrect encoding of vector type in PCH file");
+      return QualType();
+    }
+
+    QualType ElementType = GetType(Record[0]);
+    unsigned NumElements = Record[1];
+    return Context.getVectorType(ElementType, NumElements);
+  }
+
+  case pch::TYPE_EXT_VECTOR: {
+    if (Record.size() != 2) {
+      Error("Incorrect encoding of extended vector type in PCH file");
+      return QualType();
+    }
+
+    QualType ElementType = GetType(Record[0]);
+    unsigned NumElements = Record[1];
+    return Context.getExtVectorType(ElementType, NumElements);
+  }
+
+  case pch::TYPE_FUNCTION_NO_PROTO: {
+    if (Record.size() != 1) {
+      Error("Incorrect encoding of no-proto function type");
+      return QualType();
+    }
+    QualType ResultType = GetType(Record[0]);
+    return Context.getFunctionNoProtoType(ResultType);
+  }
+
+  case pch::TYPE_FUNCTION_PROTO: {
+    QualType ResultType = GetType(Record[0]);
+    unsigned Idx = 1;
+    unsigned NumParams = Record[Idx++];
+    llvm::SmallVector<QualType, 16> ParamTypes;
+    for (unsigned I = 0; I != NumParams; ++I)
+      ParamTypes.push_back(GetType(Record[Idx++]));
+    bool isVariadic = Record[Idx++];
+    unsigned Quals = Record[Idx++];
+    return Context.getFunctionType(ResultType, &ParamTypes[0], NumParams,
+                                   isVariadic, Quals);
+  }
+
+  case pch::TYPE_TYPEDEF:
+    assert(Record.size() == 1 && "Incorrect encoding of typedef type");
+    return Context.getTypeDeclType(cast<TypedefDecl>(GetDecl(Record[0])));
+
+  case pch::TYPE_TYPEOF_EXPR:
+    // FIXME: Deserialize TypeOfExprType
+    assert(false && "Cannot de-serialize typeof(expr) from a PCH file");
+    return QualType();
+
+  case pch::TYPE_TYPEOF: {
+    if (Record.size() != 1) {
+      Error("Incorrect encoding of typeof(type) in PCH file");
+      return QualType();
+    }
+    QualType UnderlyingType = GetType(Record[0]);
+    return Context.getTypeOfType(UnderlyingType);
+  }
+    
+  case pch::TYPE_RECORD:
+    // FIXME: Deserialize RecordType
+    assert(false && "Cannot de-serialize record types yet");
+    return QualType();
+
   case pch::TYPE_ENUM:
     assert(Record.size() == 1 && "Incorrect encoding of enum type");
     return Context.getTypeDeclType(cast<EnumDecl>(GetDecl(Record[0])));
 
-    // FIXME: Several other kinds of types to deserialize here!
-  default:
-    assert(false && "Unable to deserialize this type");
-    break;
+  case pch::TYPE_OBJC_INTERFACE:
+    // FIXME: Deserialize ObjCInterfaceType
+    assert(false && "Cannot de-serialize ObjC interface types yet");
+    return QualType();
+
+  case pch::TYPE_OBJC_QUALIFIED_INTERFACE:
+    // FIXME: Deserialize ObjCQualifiedInterfaceType
+    assert(false && "Cannot de-serialize ObjC qualified interface types yet");
+    return QualType();
+
+  case pch::TYPE_OBJC_QUALIFIED_ID:
+    // FIXME: Deserialize ObjCQualifiedIdType
+    assert(false && "Cannot de-serialize ObjC qualified id types yet");
+    return QualType();
+
+  case pch::TYPE_OBJC_QUALIFIED_CLASS:
+    // FIXME: Deserialize ObjCQualifiedClassType
+    assert(false && "Cannot de-serialize ObjC qualified class types yet");
+    return QualType();
   }
 
   // Suppress a GCC warning

Added: cfe/trunk/test/PCH/types.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/types.c?rev=68984&view=auto

==============================================================================
--- cfe/trunk/test/PCH/types.c (added)
+++ cfe/trunk/test/PCH/types.c Mon Apr 13 15:46:52 2009
@@ -0,0 +1,62 @@
+// Test this without pch.
+// RUN: clang-cc -triple=i686-apple-darwin9 -fblocks -include %S/types.h -fsyntax-only -verify %s
+
+// Test with pch.
+// RUN: clang-cc -emit-pch -triple=i686-apple-darwin9 -fblocks -o %t %S/types.h &&
+// RUN: clang-cc -triple=i686-apple-darwin9 -fblocks -include-pch %t -fsyntax-only -verify %s 
+
+// FIXME: TYPE_EXT_QUAL
+// FIXME: TYPE_FIXED_WIDTH_INT
+
+// TYPE_COMPLEX
+_Complex float Cfloat_val;
+Cfloat *Cfloat_ptr = &Cfloat_val;
+
+// TYPE_POINTER
+typedef int INT;
+INT int_value;
+int_ptr int_value_ptr = &int_value;
+
+// TYPE_BLOCK_POINTER
+void test_block_ptr(Block *bl) {
+  *bl = ^(int x, float f) { return x; };
+}
+
+// TYPE_CONSTANT_ARRAY
+five_ints fvi = { 1, 2, 3, 4, 5 };
+
+// TYPE_INCOMPLETE_ARRAY
+float_array fa1 = { 1, 2, 3 };
+float_array fa2 = { 1, 2, 3, 4, 5, 6, 7, 8 };
+
+// FIXME: TYPE_VARIABLE_ARRAY
+
+// TYPE_VECTOR
+float4 f4 = { 1.0, 2.0, 3.0, 4.0 };
+
+// TYPE_EXT_VECTOR
+ext_float4 ef4 = { 1.0, 2.0, 3.0, 4.0 };
+
+// TYPE_FUNCTION_NO_PROTO
+noproto np1;
+int np1(x, y)
+     int x;
+     float y;
+{
+  return x;
+}
+
+// TYPE_FUNCTION_PROTO
+proto p1;
+float p1(float x, float y, ...) {
+  return x + y;
+}
+proto *p2 = p1;
+
+// TYPE_TYPEDEF
+int_ptr_ptr ipp = &int_value_ptr;
+
+// FIXME: TYPE_TYPEOF_EXPR
+
+// TYPE_TYPEOF
+int_ptr_ptr2 ipp2 = &int_value_ptr;

Added: cfe/trunk/test/PCH/types.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/types.h?rev=68984&view=auto

==============================================================================
--- cfe/trunk/test/PCH/types.h (added)
+++ cfe/trunk/test/PCH/types.h Mon Apr 13 15:46:52 2009
@@ -0,0 +1,41 @@
+/* Used with the types.c test */
+
+// FIXME: TYPE_EXT_QUAL
+// FIXME: TYPE_FIXED_WIDTH_INT
+
+// TYPE_COMPLEX
+typedef _Complex float Cfloat;
+
+// TYPE_POINTER
+typedef int * int_ptr;
+
+// TYPE_BLOCK_POINTER
+typedef int (^Block)(int, float);
+
+// TYPE_CONSTANT_ARRAY
+typedef int five_ints[5];
+
+// TYPE_INCOMPLETE_ARRAY
+typedef float float_array[];
+
+// FIXME: TYPE_VARIABLE_ARRAY
+
+// TYPE_VECTOR
+typedef float float4 __attribute__((vector_size(16)));
+
+// TYPE_EXT_VECTOR
+typedef float ext_float4 __attribute__((ext_vector_type(4)));
+
+// TYPE_FUNCTION_NO_PROTO
+typedef int noproto();
+
+// TYPE_FUNCTION_PROTO
+typedef float proto(float, float, ...);
+
+// TYPE_TYPEDEF
+typedef int_ptr * int_ptr_ptr;
+
+// FIXME: TYPE_TYPEOF_EXPR
+
+// TYPE_TYPEOF
+typedef typeof(int_ptr *) int_ptr_ptr2;





More information about the cfe-commits mailing list