blob: 10965c24219af87d7dd8d15c81fd48273e43d11d [file] [log] [blame]
Ted Kremenek73af6692007-10-26 20:24:35 +00001//===--- 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 Kremenek2e7d3522007-10-31 17:50:23 +000015#include "clang/AST/Expr.h"
Ted Kremenek03ed4402007-11-13 22:02:55 +000016#include "clang/AST/ASTContext.h"
Ted Kremenek73af6692007-10-26 20:24:35 +000017#include "llvm/Bitcode/Serialize.h"
18#include "llvm/Bitcode/Deserialize.h"
19
20using namespace clang;
Ted Kremenek03ed4402007-11-13 22:02:55 +000021using llvm::Serializer;
22using llvm::Deserializer;
23using llvm::SerializedPtrID;
Ted Kremenek73af6692007-10-26 20:24:35 +000024
Ted Kremenek03ed4402007-11-13 22:02:55 +000025
26void QualType::Emit(Serializer& S) const {
Ted Kremenekc12f51a2007-11-14 23:35:01 +000027 S.EmitPtr(getTypePtr());
Ted Kremenek73af6692007-10-26 20:24:35 +000028 S.EmitInt(getQualifiers());
29}
30
Ted Kremenek03ed4402007-11-13 22:02:55 +000031QualType QualType::ReadVal(Deserializer& D) {
32 QualType Q;
33 D.ReadUIntPtr(Q.ThePtr,false);
34 Q.ThePtr |= D.ReadInt();
35 return Q;
Ted Kremenek73af6692007-10-26 20:24:35 +000036}
37
Ted Kremenek21d50e12007-11-14 22:51:02 +000038void QualType::ReadBackpatch(Deserializer& D) {
39 D.ReadUIntPtr(ThePtr,true);
40 ThePtr |= D.ReadInt();
41}
42
Ted Kremenek03ed4402007-11-13 22:02:55 +000043//===----------------------------------------------------------------------===//
44// Type Serialization: Dispatch code to handle specific types.
45//===----------------------------------------------------------------------===//
46
47void Type::Emit(Serializer& S) const {
48 S.EmitInt(getTypeClass());
49 S.EmitPtr(this);
50
51 if (!isa<BuiltinType>(this))
52 EmitImpl(S);
Ted Kremeneka4cb4522007-10-26 23:52:52 +000053}
54
Ted Kremenek03ed4402007-11-13 22:02:55 +000055void Type::EmitImpl(Serializer& S) const {
56 assert (false && "Serializization for type not supported.");
Ted Kremeneka4cb4522007-10-26 23:52:52 +000057}
58
Ted Kremenek03ed4402007-11-13 22:02:55 +000059void 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 Kremenek73af6692007-10-26 20:24:35 +000064 default:
Ted Kremenek03ed4402007-11-13 22:02:55 +000065 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 Kremenek73af6692007-10-26 20:24:35 +000072 break;
73
Ted Kremenek03ed4402007-11-13 22:02:55 +000074 case Type::Complex:
75 D.RegisterPtr(PtrID,ComplexType::CreateImpl(Context,D));
Ted Kremenek73af6692007-10-26 20:24:35 +000076 break;
Ted Kremenek03ed4402007-11-13 22:02:55 +000077
Ted Kremenekda5dbb42007-11-14 00:17:21 +000078 case Type::ConstantArray:
79 D.RegisterPtr(PtrID,ConstantArrayType::CreateImpl(Context,D));
Ted Kremenek190eecf2007-11-14 19:33:01 +000080 break;
Ted Kremenekda5dbb42007-11-14 00:17:21 +000081
Ted Kremenek2b14d462007-11-14 00:38:50 +000082 case Type::FunctionNoProto:
83 D.RegisterPtr(PtrID,FunctionTypeNoProto::CreateImpl(Context,D));
84 break;
85
Ted Kremenek03ed4402007-11-13 22:02:55 +000086 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 Kremeneka2254002007-11-14 00:03:56 +000092 break;
93
94 case Type::Tagged:
Ted Kremenek21d50e12007-11-14 22:51:02 +000095 D.RegisterPtr(PtrID,TagType::CreateImpl(Context,D));
Ted Kremeneka2254002007-11-14 00:03:56 +000096 break;
Ted Kremenekb28166d2007-11-14 00:27:46 +000097
98 case Type::TypeName:
99 D.RegisterPtr(PtrID,TypedefType::CreateImpl(Context,D));
100 break;
Ted Kremeneked1a01d2007-11-14 00:31:36 +0000101
102 case Type::VariableArray:
103 D.RegisterPtr(PtrID,VariableArrayType::CreateImpl(Context,D));
104 break;
Ted Kremenek73af6692007-10-26 20:24:35 +0000105 }
106}
Ted Kremenek73af6692007-10-26 20:24:35 +0000107
Ted Kremenek03ed4402007-11-13 22:02:55 +0000108//===----------------------------------------------------------------------===//
109// ComplexType
110//===----------------------------------------------------------------------===//
111
112void ComplexType::EmitImpl(Serializer& S) const {
113 S.Emit(getElementType());
Ted Kremenek73af6692007-10-26 20:24:35 +0000114}
115
Ted Kremenek03ed4402007-11-13 22:02:55 +0000116Type* ComplexType::CreateImpl(ASTContext& Context, Deserializer& D) {
117 return Context.getComplexType(QualType::ReadVal(D)).getTypePtr();
Ted Kremenek73af6692007-10-26 20:24:35 +0000118}
119
Ted Kremenek03ed4402007-11-13 22:02:55 +0000120//===----------------------------------------------------------------------===//
Ted Kremenekda5dbb42007-11-14 00:17:21 +0000121// ConstantArray
122//===----------------------------------------------------------------------===//
123
124void ConstantArrayType::EmitImpl(Serializer& S) const {
125 S.Emit(getElementType());
126 S.EmitInt(getSizeModifier());
127 S.EmitInt(getIndexTypeQualifier());
128 S.Emit(Size);
129}
130
131Type* 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 Kremenek2b14d462007-11-14 00:38:50 +0000143// FunctionTypeNoProto
Ted Kremenek03ed4402007-11-13 22:02:55 +0000144//===----------------------------------------------------------------------===//
Ted Kremeneka4cb4522007-10-26 23:52:52 +0000145
Ted Kremenek190eecf2007-11-14 19:33:01 +0000146void FunctionTypeNoProto::EmitImpl(Serializer& S) const {
147 S.Emit(getResultType());
148}
149
150Type* FunctionTypeNoProto::CreateImpl(ASTContext& Context, Deserializer& D) {
151 return Context.getFunctionTypeNoProto(QualType::ReadVal(D)).getTypePtr();
152}
153
154//===----------------------------------------------------------------------===//
155// FunctionTypeProto
156//===----------------------------------------------------------------------===//
157
Ted Kremenek03ed4402007-11-13 22:02:55 +0000158void FunctionTypeProto::EmitImpl(Serializer& S) const {
159 S.Emit(getResultType());
160 S.EmitBool(isVariadic());
161 S.EmitInt(getNumArgs());
Ted Kremenek73af6692007-10-26 20:24:35 +0000162
Ted Kremenek03ed4402007-11-13 22:02:55 +0000163 for (arg_type_iterator I=arg_type_begin(), E=arg_type_end(); I!=E; ++I)
164 S.Emit(*I);
Ted Kremenek73af6692007-10-26 20:24:35 +0000165}
Ted Kremenek71ac8462007-10-27 19:05:09 +0000166
Ted Kremenek03ed4402007-11-13 22:02:55 +0000167Type* FunctionTypeProto::CreateImpl(ASTContext& Context, Deserializer& D) {
168 QualType ResultType = QualType::ReadVal(D);
169 bool isVariadic = D.ReadBool();
Ted Kremenek4340bfa2007-10-28 00:59:26 +0000170 unsigned NumArgs = D.ReadInt();
171
Ted Kremenek03ed4402007-11-13 22:02:55 +0000172 llvm::SmallVector<QualType,15> Args;
Ted Kremenek2b14d462007-11-14 00:38:50 +0000173
Ted Kremenek03ed4402007-11-13 22:02:55 +0000174 for (unsigned j = 0; j < NumArgs; ++j)
175 Args.push_back(QualType::ReadVal(D));
Ted Kremenek2b14d462007-11-14 00:38:50 +0000176
Ted Kremenek03ed4402007-11-13 22:02:55 +0000177 return Context.getFunctionType(ResultType,&*Args.begin(),
Ted Kremenek2b14d462007-11-14 00:38:50 +0000178 NumArgs,isVariadic).getTypePtr();
179}
180
181//===----------------------------------------------------------------------===//
Ted Kremenek03ed4402007-11-13 22:02:55 +0000182// PointerType
183//===----------------------------------------------------------------------===//
184
185void PointerType::EmitImpl(Serializer& S) const {
186 S.Emit(getPointeeType());
Ted Kremenek4f50ee32007-10-28 21:21:04 +0000187}
188
Ted Kremenek03ed4402007-11-13 22:02:55 +0000189Type* PointerType::CreateImpl(ASTContext& Context, Deserializer& D) {
190 return Context.getPointerType(QualType::ReadVal(D)).getTypePtr();
Ted Kremenek4f50ee32007-10-28 21:21:04 +0000191}
Ted Kremeneka2254002007-11-14 00:03:56 +0000192
193//===----------------------------------------------------------------------===//
194// TagType
195//===----------------------------------------------------------------------===//
196
197void TagType::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000198 S.EmitOwnedPtr(getDecl());
Ted Kremeneka2254002007-11-14 00:03:56 +0000199}
200
Ted Kremenek21d50e12007-11-14 22:51:02 +0000201Type* TagType::CreateImpl(ASTContext& Context, Deserializer& D) {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000202 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 Kremenekaad48b62007-11-14 08:06:37 +0000208 // Deserialize the decl.
209 T->decl = cast<TagDecl>(D.ReadOwnedPtr<Decl>());
210
Ted Kremeneka2254002007-11-14 00:03:56 +0000211 return T;
212}
Ted Kremenekb28166d2007-11-14 00:27:46 +0000213
214//===----------------------------------------------------------------------===//
215// TypedefType
216//===----------------------------------------------------------------------===//
217
218void TypedefType::EmitImpl(Serializer& S) const {
219 S.Emit(QualType((Type*)this,0).getCanonicalType());
220 S.EmitPtr(Decl);
221}
222
223Type* 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 Kremenekb28166d2007-11-14 00:27:46 +0000231 return T;
232}
233
Ted Kremeneked1a01d2007-11-14 00:31:36 +0000234//===----------------------------------------------------------------------===//
235// VariableArrayType
236//===----------------------------------------------------------------------===//
237
238void VariableArrayType::EmitImpl(Serializer& S) const {
239 S.Emit(getElementType());
240 S.EmitInt(getSizeModifier());
241 S.EmitInt(getIndexTypeQualifier());
242 S.EmitOwnedPtr(SizeExpr);
243}
244
245Type* 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}