blob: bd8b5ca5e115d3e72359897d3e370b8e7e938413 [file] [log] [blame]
Ted Kremenek215c2c82007-10-31 18:41:19 +00001//===--- StmtSerialization.cpp - Serialization of Statements --------------===//
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 file defines the type-specific methods for serializing statements
11// and expressions.
12//
13//===----------------------------------------------------------------------===//
14
Ted Kremenek47281102007-11-07 00:17:35 +000015#include "clang/AST/Expr.h"
Ted Kremenek215c2c82007-10-31 18:41:19 +000016#include "llvm/Bitcode/Serialize.h"
17#include "llvm/Bitcode/Deserialize.h"
18
Ted Kremenek215c2c82007-10-31 18:41:19 +000019using namespace clang;
20
Ted Kremenek47281102007-11-07 00:17:35 +000021void Stmt::Emit(llvm::Serializer& S) const {
22 S.EmitInt(getStmtClass());
23 directEmit(S);
24}
Ted Kremenek215c2c82007-10-31 18:41:19 +000025
Ted Kremenek47281102007-11-07 00:17:35 +000026Stmt* Stmt::Materialize(llvm::Deserializer& D) {
27 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremenek215c2c82007-10-31 18:41:19 +000028
Ted Kremenek47281102007-11-07 00:17:35 +000029 switch (SC) {
30 default:
31 assert (false && "Not implemented.");
32 return NULL;
Ted Kremenek2bd6e652007-11-07 00:37:40 +000033
34 case BinaryOperatorClass:
35 return BinaryOperator::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000036
Ted Kremenek249d7cd2007-11-07 05:25:31 +000037 case BreakStmtClass:
38 return BreakStmt::directMaterialize(D);
39
40 case CaseStmtClass:
41 return CaseStmt::directMaterialize(D);
42
Ted Kremenek47281102007-11-07 00:17:35 +000043 case CompoundStmtClass:
44 return CompoundStmt::directMaterialize(D);
45
Ted Kremenek47281102007-11-07 00:17:35 +000046 case DeclRefExprClass:
47 return DeclRefExpr::directMaterialize(D);
48
Ted Kremenek2bd6e652007-11-07 00:37:40 +000049 case DeclStmtClass:
50 return DeclStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000051
52 case DefaultStmtClass:
53 return DefaultStmt::directMaterialize(D);
54
Ted Kremenekca22d352007-11-07 07:19:30 +000055 case IfStmtClass:
56 return IfStmt::directMaterialize(D);
57
Ted Kremenek47281102007-11-07 00:17:35 +000058 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000059 return IntegerLiteral::directMaterialize(D);
60
Ted Kremenek56a74bb2007-11-07 00:48:04 +000061 case LabelStmtClass:
62 return LabelStmt::directMaterialize(D);
63
Ted Kremenek25aaa262007-11-07 00:40:53 +000064 case NullStmtClass:
65 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000066
Ted Kremenek249d7cd2007-11-07 05:25:31 +000067 case ParenExprClass:
68 return ParenExpr::directMaterialize(D);
69
Ted Kremenek2bd6e652007-11-07 00:37:40 +000070 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +000071 return ReturnStmt::directMaterialize(D);
72
73 case SwitchStmtClass:
74 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +000075
76 case WhileStmtClass:
77 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000078 }
Ted Kremenek215c2c82007-10-31 18:41:19 +000079}
80
Ted Kremenek2bd6e652007-11-07 00:37:40 +000081void BinaryOperator::directEmit(llvm::Serializer& S) const {
82 S.EmitInt(Opc);
83 S.Emit(OpLoc);;
84 S.Emit(getType());
85 S.EmitOwnedPtr(getLHS());
86 S.EmitOwnedPtr(getRHS());
87}
88
89BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
90 Opcode Opc = static_cast<Opcode>(D.ReadInt());
91 SourceLocation OpLoc = SourceLocation::ReadVal(D);
92 QualType Result = QualType::ReadVal(D);
93 Expr* LHS = D.ReadOwnedPtr<Expr>();
94 Expr* RHS = D.ReadOwnedPtr<Expr>();
95 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
96}
Ted Kremenek215c2c82007-10-31 18:41:19 +000097
Ted Kremenek249d7cd2007-11-07 05:25:31 +000098void BreakStmt::directEmit(llvm::Serializer& S) const {
99 S.Emit(BreakLoc);
100}
101
102BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
103 SourceLocation Loc = SourceLocation::ReadVal(D);
104 return new BreakStmt(Loc);
105}
106
107void CaseStmt::directEmit(llvm::Serializer& S) const {
108 S.Emit(CaseLoc);
109 S.EmitOwnedPtr(getLHS());
110 S.EmitOwnedPtr(getRHS());
111 S.EmitOwnedPtr(getSubStmt());
112 S.EmitPtr(getNextSwitchCase());
113}
114
115CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
116 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
117 Expr* LHS = D.ReadOwnedPtr<Expr>();
118 Expr* RHS = D.ReadOwnedPtr<Expr>();
119 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
120
121 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
122 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
123
124 return stmt;
125}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000126
Ted Kremenek47281102007-11-07 00:17:35 +0000127void CompoundStmt::directEmit(llvm::Serializer& S) const {
128 S.Emit(LBracLoc);
129 S.Emit(RBracLoc);
130 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000131
Ted Kremenek47281102007-11-07 00:17:35 +0000132 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000133 S.EmitOwnedPtr(*I);
134}
135
Ted Kremenek47281102007-11-07 00:17:35 +0000136CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
137 SourceLocation LB = SourceLocation::ReadVal(D);
138 SourceLocation RB = SourceLocation::ReadVal(D);
139 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000140
Ted Kremenek47281102007-11-07 00:17:35 +0000141 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
142
143 stmt->Body.reserve(size);
144
145 for (unsigned i = 0; i < size; ++i)
146 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
147
148 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000149}
Ted Kremenek47281102007-11-07 00:17:35 +0000150
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000151void DeclStmt::directEmit(llvm::Serializer& S) const {
152 // FIXME: special handling for struct decls.
153 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000154}
155
156void DeclRefExpr::directEmit(llvm::Serializer& S) const {
157 S.Emit(Loc);
158 S.Emit(getType());
159 S.EmitPtr(getDecl());
160}
161
162DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
163 SourceLocation Loc = SourceLocation::ReadVal(D);
164 QualType T = QualType::ReadVal(D);
165 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
166 D.ReadPtr(dr->D,false);
167 return dr;
168}
169
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000170DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
171 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
172 return new DeclStmt(decl);
173}
174
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000175void DefaultStmt::directEmit(llvm::Serializer& S) const {
176 S.Emit(DefaultLoc);
177 S.EmitOwnedPtr(getSubStmt());
178 S.EmitPtr(getNextSwitchCase());
179}
180
181DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
182 SourceLocation Loc = SourceLocation::ReadVal(D);
183 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
184
185 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
186 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
187
188 return stmt;
189}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000190
Ted Kremenekca22d352007-11-07 07:19:30 +0000191void IfStmt::directEmit(llvm::Serializer& S) const {
192 S.Emit(IfLoc);
193 S.EmitOwnedPtr(getCond());
194 S.EmitOwnedPtr(getThen());
195 S.EmitOwnedPtr(getElse());
196}
197
198IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
199 SourceLocation L = SourceLocation::ReadVal(D);
200 Expr* Cond = D.ReadOwnedPtr<Expr>();
201 Stmt* Then = D.ReadOwnedPtr<Stmt>();
202 Stmt* Else = D.ReadOwnedPtr<Stmt>();
203 return new IfStmt(L,Cond,Then,Else);
204}
205
Ted Kremenek47281102007-11-07 00:17:35 +0000206void IntegerLiteral::directEmit(llvm::Serializer& S) const {
207 S.Emit(Loc);
208 S.Emit(getType());
209 S.Emit(getValue());
210}
211
212IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
213 SourceLocation Loc = SourceLocation::ReadVal(D);
214 QualType T = QualType::ReadVal(D);
215
216 // Create a dummy APInt because it is more efficient to deserialize
217 // it in place with the deserialized IntegerLiteral. (fewer copies)
218 llvm::APInt temp;
219 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
220 D.Read(expr->Value);
221
222 return expr;
223}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000224
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000225void LabelStmt::directEmit(llvm::Serializer& S) const {
226 S.EmitPtr(Label);
227 S.Emit(IdentLoc);
228 S.EmitOwnedPtr(SubStmt);
229}
230
231LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
232 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
233 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
234 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
235 return new LabelStmt(IdentLoc,Label,SubStmt);
236}
237
Ted Kremenek25aaa262007-11-07 00:40:53 +0000238void NullStmt::directEmit(llvm::Serializer& S) const {
239 S.Emit(SemiLoc);
240}
241
242NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
243 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
244 return new NullStmt(SemiLoc);
245}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000246
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000247void ParenExpr::directEmit(llvm::Serializer& S) const {
248 S.Emit(L);
249 S.Emit(R);
250 S.EmitOwnedPtr(Val);
251}
252
253ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
254 SourceLocation L = SourceLocation::ReadVal(D);
255 SourceLocation R = SourceLocation::ReadVal(D);
256 Expr* val = D.ReadOwnedPtr<Expr>();
257 return new ParenExpr(L,R,val);
258}
259
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000260void ReturnStmt::directEmit(llvm::Serializer& S) const {
261 S.Emit(RetLoc);
262 S.EmitOwnedPtr(RetExpr);
263}
264
265ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
266 SourceLocation RetLoc = SourceLocation::ReadVal(D);
267 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
268 return new ReturnStmt(RetLoc,RetExpr);
269}
270
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000271void SwitchStmt::directEmit(llvm::Serializer& S) const {
272 S.Emit(SwitchLoc);
273 S.EmitOwnedPtr(getCond());
274 S.EmitOwnedPtr(getBody());
275 S.EmitPtr(FirstCase);
276}
277
278SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
279 SourceLocation Loc = SourceLocation::ReadVal(D);
280 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
281 Stmt* Body = D.ReadOwnedPtr<Stmt>();
282 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
283
284 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
285 stmt->setBody(Body,Loc);
286 stmt->FirstCase = FirstCase;
287
288 return stmt;
289}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000290
291void WhileStmt::directEmit(llvm::Serializer& S) const {
292 S.Emit(WhileLoc);
293 S.EmitOwnedPtr(getCond());
294 S.EmitOwnedPtr(getBody());
295}
296
297WhileStmt* WhileStmt::directMaterialize(llvm::Deserializer& D) {
298 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
299 Expr* Cond = D.ReadOwnedPtr<Expr>();
300 Stmt* Body = D.ReadOwnedPtr<Stmt>();
301 return new WhileStmt(Cond,Body,WhileLoc);
302}