Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 1 | //===--- TypeSerialization.cpp - Serialization of Decls ---------*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file was developed by Ted Kremenek and is distributed under |
| 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This files defines methods that implement bitcode serialization for Types. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "clang/AST/Type.h" |
Ted Kremenek | 2e7d352 | 2007-10-31 17:50:23 +0000 | [diff] [blame] | 15 | #include "clang/AST/Expr.h" |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 16 | #include "clang/AST/ASTContext.h" |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 17 | #include "llvm/Bitcode/Serialize.h" |
| 18 | #include "llvm/Bitcode/Deserialize.h" |
| 19 | |
| 20 | using namespace clang; |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 21 | using llvm::Serializer; |
| 22 | using llvm::Deserializer; |
| 23 | using llvm::SerializedPtrID; |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 24 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 25 | |
| 26 | void QualType::Emit(Serializer& S) const { |
Ted Kremenek | c12f51a | 2007-11-14 23:35:01 +0000 | [diff] [blame] | 27 | S.EmitPtr(getTypePtr()); |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 28 | S.EmitInt(getQualifiers()); |
| 29 | } |
| 30 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 31 | QualType QualType::ReadVal(Deserializer& D) { |
| 32 | QualType Q; |
| 33 | D.ReadUIntPtr(Q.ThePtr,false); |
| 34 | Q.ThePtr |= D.ReadInt(); |
| 35 | return Q; |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 36 | } |
| 37 | |
Ted Kremenek | 21d50e1 | 2007-11-14 22:51:02 +0000 | [diff] [blame] | 38 | void QualType::ReadBackpatch(Deserializer& D) { |
| 39 | D.ReadUIntPtr(ThePtr,true); |
| 40 | ThePtr |= D.ReadInt(); |
| 41 | } |
| 42 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 43 | //===----------------------------------------------------------------------===// |
| 44 | // Type Serialization: Dispatch code to handle specific types. |
| 45 | //===----------------------------------------------------------------------===// |
| 46 | |
| 47 | void Type::Emit(Serializer& S) const { |
| 48 | S.EmitInt(getTypeClass()); |
| 49 | S.EmitPtr(this); |
| 50 | |
| 51 | if (!isa<BuiltinType>(this)) |
| 52 | EmitImpl(S); |
Ted Kremenek | a4cb452 | 2007-10-26 23:52:52 +0000 | [diff] [blame] | 53 | } |
| 54 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 55 | void Type::EmitImpl(Serializer& S) const { |
| 56 | assert (false && "Serializization for type not supported."); |
Ted Kremenek | a4cb452 | 2007-10-26 23:52:52 +0000 | [diff] [blame] | 57 | } |
| 58 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 59 | void Type::Create(ASTContext& Context, unsigned i, Deserializer& D) { |
| 60 | Type::TypeClass K = static_cast<Type::TypeClass>(D.ReadInt()); |
| 61 | SerializedPtrID PtrID = D.ReadPtrID(); |
| 62 | |
| 63 | switch (K) { |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 64 | default: |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 65 | assert (false && "Deserialization for type not supported."); |
| 66 | break; |
| 67 | |
| 68 | case Type::Builtin: |
| 69 | assert (i < Context.getTypes().size()); |
| 70 | assert (isa<BuiltinType>(Context.getTypes()[i])); |
| 71 | D.RegisterPtr(PtrID,Context.getTypes()[i]); |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 72 | break; |
| 73 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 74 | case Type::Complex: |
| 75 | D.RegisterPtr(PtrID,ComplexType::CreateImpl(Context,D)); |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 76 | break; |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 77 | |
Ted Kremenek | da5dbb4 | 2007-11-14 00:17:21 +0000 | [diff] [blame] | 78 | case Type::ConstantArray: |
| 79 | D.RegisterPtr(PtrID,ConstantArrayType::CreateImpl(Context,D)); |
Ted Kremenek | 190eecf | 2007-11-14 19:33:01 +0000 | [diff] [blame] | 80 | break; |
Ted Kremenek | da5dbb4 | 2007-11-14 00:17:21 +0000 | [diff] [blame] | 81 | |
Ted Kremenek | 2b14d46 | 2007-11-14 00:38:50 +0000 | [diff] [blame] | 82 | case Type::FunctionNoProto: |
| 83 | D.RegisterPtr(PtrID,FunctionTypeNoProto::CreateImpl(Context,D)); |
| 84 | break; |
| 85 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 86 | case Type::FunctionProto: |
| 87 | D.RegisterPtr(PtrID,FunctionTypeProto::CreateImpl(Context,D)); |
| 88 | break; |
| 89 | |
| 90 | case Type::Pointer: |
| 91 | D.RegisterPtr(PtrID,PointerType::CreateImpl(Context,D)); |
Ted Kremenek | a225400 | 2007-11-14 00:03:56 +0000 | [diff] [blame] | 92 | break; |
| 93 | |
| 94 | case Type::Tagged: |
Ted Kremenek | 21d50e1 | 2007-11-14 22:51:02 +0000 | [diff] [blame] | 95 | D.RegisterPtr(PtrID,TagType::CreateImpl(Context,D)); |
Ted Kremenek | a225400 | 2007-11-14 00:03:56 +0000 | [diff] [blame] | 96 | break; |
Ted Kremenek | b28166d | 2007-11-14 00:27:46 +0000 | [diff] [blame] | 97 | |
| 98 | case Type::TypeName: |
| 99 | D.RegisterPtr(PtrID,TypedefType::CreateImpl(Context,D)); |
| 100 | break; |
Ted Kremenek | ed1a01d | 2007-11-14 00:31:36 +0000 | [diff] [blame] | 101 | |
| 102 | case Type::VariableArray: |
| 103 | D.RegisterPtr(PtrID,VariableArrayType::CreateImpl(Context,D)); |
| 104 | break; |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 105 | } |
| 106 | } |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 107 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 108 | //===----------------------------------------------------------------------===// |
| 109 | // ComplexType |
| 110 | //===----------------------------------------------------------------------===// |
| 111 | |
| 112 | void ComplexType::EmitImpl(Serializer& S) const { |
| 113 | S.Emit(getElementType()); |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 114 | } |
| 115 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 116 | Type* ComplexType::CreateImpl(ASTContext& Context, Deserializer& D) { |
| 117 | return Context.getComplexType(QualType::ReadVal(D)).getTypePtr(); |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 118 | } |
| 119 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 120 | //===----------------------------------------------------------------------===// |
Ted Kremenek | da5dbb4 | 2007-11-14 00:17:21 +0000 | [diff] [blame] | 121 | // ConstantArray |
| 122 | //===----------------------------------------------------------------------===// |
| 123 | |
| 124 | void ConstantArrayType::EmitImpl(Serializer& S) const { |
| 125 | S.Emit(getElementType()); |
| 126 | S.EmitInt(getSizeModifier()); |
| 127 | S.EmitInt(getIndexTypeQualifier()); |
| 128 | S.Emit(Size); |
| 129 | } |
| 130 | |
| 131 | Type* ConstantArrayType::CreateImpl(ASTContext& Context, Deserializer& D) { |
| 132 | QualType ElTy = QualType::ReadVal(D); |
| 133 | ArraySizeModifier am = static_cast<ArraySizeModifier>(D.ReadInt()); |
| 134 | unsigned ITQ = D.ReadInt(); |
| 135 | |
| 136 | llvm::APInt Size; |
| 137 | D.Read(Size); |
| 138 | |
| 139 | return Context.getConstantArrayType(ElTy,Size,am,ITQ).getTypePtr(); |
| 140 | } |
| 141 | |
| 142 | //===----------------------------------------------------------------------===// |
Ted Kremenek | 2b14d46 | 2007-11-14 00:38:50 +0000 | [diff] [blame] | 143 | // FunctionTypeNoProto |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 144 | //===----------------------------------------------------------------------===// |
Ted Kremenek | a4cb452 | 2007-10-26 23:52:52 +0000 | [diff] [blame] | 145 | |
Ted Kremenek | 190eecf | 2007-11-14 19:33:01 +0000 | [diff] [blame] | 146 | void FunctionTypeNoProto::EmitImpl(Serializer& S) const { |
| 147 | S.Emit(getResultType()); |
| 148 | } |
| 149 | |
| 150 | Type* FunctionTypeNoProto::CreateImpl(ASTContext& Context, Deserializer& D) { |
| 151 | return Context.getFunctionTypeNoProto(QualType::ReadVal(D)).getTypePtr(); |
| 152 | } |
| 153 | |
| 154 | //===----------------------------------------------------------------------===// |
| 155 | // FunctionTypeProto |
| 156 | //===----------------------------------------------------------------------===// |
| 157 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 158 | void FunctionTypeProto::EmitImpl(Serializer& S) const { |
| 159 | S.Emit(getResultType()); |
| 160 | S.EmitBool(isVariadic()); |
| 161 | S.EmitInt(getNumArgs()); |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 162 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 163 | for (arg_type_iterator I=arg_type_begin(), E=arg_type_end(); I!=E; ++I) |
| 164 | S.Emit(*I); |
Ted Kremenek | 73af669 | 2007-10-26 20:24:35 +0000 | [diff] [blame] | 165 | } |
Ted Kremenek | 71ac846 | 2007-10-27 19:05:09 +0000 | [diff] [blame] | 166 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 167 | Type* FunctionTypeProto::CreateImpl(ASTContext& Context, Deserializer& D) { |
| 168 | QualType ResultType = QualType::ReadVal(D); |
| 169 | bool isVariadic = D.ReadBool(); |
Ted Kremenek | 4340bfa | 2007-10-28 00:59:26 +0000 | [diff] [blame] | 170 | unsigned NumArgs = D.ReadInt(); |
| 171 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 172 | llvm::SmallVector<QualType,15> Args; |
Ted Kremenek | 2b14d46 | 2007-11-14 00:38:50 +0000 | [diff] [blame] | 173 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 174 | for (unsigned j = 0; j < NumArgs; ++j) |
| 175 | Args.push_back(QualType::ReadVal(D)); |
Ted Kremenek | 2b14d46 | 2007-11-14 00:38:50 +0000 | [diff] [blame] | 176 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 177 | return Context.getFunctionType(ResultType,&*Args.begin(), |
Ted Kremenek | 2b14d46 | 2007-11-14 00:38:50 +0000 | [diff] [blame] | 178 | NumArgs,isVariadic).getTypePtr(); |
| 179 | } |
| 180 | |
| 181 | //===----------------------------------------------------------------------===// |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 182 | // PointerType |
| 183 | //===----------------------------------------------------------------------===// |
| 184 | |
| 185 | void PointerType::EmitImpl(Serializer& S) const { |
| 186 | S.Emit(getPointeeType()); |
Ted Kremenek | 4f50ee3 | 2007-10-28 21:21:04 +0000 | [diff] [blame] | 187 | } |
| 188 | |
Ted Kremenek | 03ed440 | 2007-11-13 22:02:55 +0000 | [diff] [blame] | 189 | Type* PointerType::CreateImpl(ASTContext& Context, Deserializer& D) { |
| 190 | return Context.getPointerType(QualType::ReadVal(D)).getTypePtr(); |
Ted Kremenek | 4f50ee3 | 2007-10-28 21:21:04 +0000 | [diff] [blame] | 191 | } |
Ted Kremenek | a225400 | 2007-11-14 00:03:56 +0000 | [diff] [blame] | 192 | |
| 193 | //===----------------------------------------------------------------------===// |
| 194 | // TagType |
| 195 | //===----------------------------------------------------------------------===// |
| 196 | |
| 197 | void TagType::EmitImpl(Serializer& S) const { |
Ted Kremenek | aad48b6 | 2007-11-14 08:06:37 +0000 | [diff] [blame] | 198 | S.EmitOwnedPtr(getDecl()); |
Ted Kremenek | a225400 | 2007-11-14 00:03:56 +0000 | [diff] [blame] | 199 | } |
| 200 | |
Ted Kremenek | 21d50e1 | 2007-11-14 22:51:02 +0000 | [diff] [blame] | 201 | Type* TagType::CreateImpl(ASTContext& Context, Deserializer& D) { |
Ted Kremenek | aad48b6 | 2007-11-14 08:06:37 +0000 | [diff] [blame] | 202 | std::vector<Type*>& Types = |
| 203 | const_cast<std::vector<Type*>&>(Context.getTypes()); |
| 204 | |
| 205 | TagType* T = new TagType(NULL,QualType()); |
| 206 | Types.push_back(T); |
| 207 | |
Ted Kremenek | aad48b6 | 2007-11-14 08:06:37 +0000 | [diff] [blame] | 208 | // Deserialize the decl. |
| 209 | T->decl = cast<TagDecl>(D.ReadOwnedPtr<Decl>()); |
| 210 | |
Ted Kremenek | a225400 | 2007-11-14 00:03:56 +0000 | [diff] [blame] | 211 | return T; |
| 212 | } |
Ted Kremenek | b28166d | 2007-11-14 00:27:46 +0000 | [diff] [blame] | 213 | |
| 214 | //===----------------------------------------------------------------------===// |
| 215 | // TypedefType |
| 216 | //===----------------------------------------------------------------------===// |
| 217 | |
| 218 | void TypedefType::EmitImpl(Serializer& S) const { |
| 219 | S.Emit(QualType((Type*)this,0).getCanonicalType()); |
| 220 | S.EmitPtr(Decl); |
| 221 | } |
| 222 | |
| 223 | Type* TypedefType::CreateImpl(ASTContext& Context, Deserializer& D) { |
| 224 | std::vector<Type*>& Types = |
| 225 | const_cast<std::vector<Type*>&>(Context.getTypes()); |
| 226 | |
| 227 | TypedefType* T = new TypedefType(NULL,QualType::ReadVal(D)); |
| 228 | Types.push_back(T); |
| 229 | |
| 230 | D.ReadPtr(T->Decl); // May be backpatched. |
Ted Kremenek | b28166d | 2007-11-14 00:27:46 +0000 | [diff] [blame] | 231 | return T; |
| 232 | } |
| 233 | |
Ted Kremenek | ed1a01d | 2007-11-14 00:31:36 +0000 | [diff] [blame] | 234 | //===----------------------------------------------------------------------===// |
| 235 | // VariableArrayType |
| 236 | //===----------------------------------------------------------------------===// |
| 237 | |
| 238 | void VariableArrayType::EmitImpl(Serializer& S) const { |
| 239 | S.Emit(getElementType()); |
| 240 | S.EmitInt(getSizeModifier()); |
| 241 | S.EmitInt(getIndexTypeQualifier()); |
| 242 | S.EmitOwnedPtr(SizeExpr); |
| 243 | } |
| 244 | |
| 245 | Type* VariableArrayType::CreateImpl(ASTContext& Context, Deserializer& D) { |
| 246 | QualType ElTy = QualType::ReadVal(D); |
| 247 | ArraySizeModifier am = static_cast<ArraySizeModifier>(D.ReadInt()); |
| 248 | unsigned ITQ = D.ReadInt(); |
| 249 | Expr* SizeExpr = D.ReadOwnedPtr<Expr>(); |
| 250 | |
| 251 | return Context.getVariableArrayType(ElTy,SizeExpr,am,ITQ).getTypePtr(); |
| 252 | } |