blob: c6af9a50c7ae80d176b906d47c3da0177a3c1776 [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 Kremenek47281102007-11-07 00:17:35 +000075 }
Ted Kremenek215c2c82007-10-31 18:41:19 +000076}
77
Ted Kremenek2bd6e652007-11-07 00:37:40 +000078void BinaryOperator::directEmit(llvm::Serializer& S) const {
79 S.EmitInt(Opc);
80 S.Emit(OpLoc);;
81 S.Emit(getType());
82 S.EmitOwnedPtr(getLHS());
83 S.EmitOwnedPtr(getRHS());
84}
85
86BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
87 Opcode Opc = static_cast<Opcode>(D.ReadInt());
88 SourceLocation OpLoc = SourceLocation::ReadVal(D);
89 QualType Result = QualType::ReadVal(D);
90 Expr* LHS = D.ReadOwnedPtr<Expr>();
91 Expr* RHS = D.ReadOwnedPtr<Expr>();
92 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
93}
Ted Kremenek215c2c82007-10-31 18:41:19 +000094
Ted Kremenek249d7cd2007-11-07 05:25:31 +000095void BreakStmt::directEmit(llvm::Serializer& S) const {
96 S.Emit(BreakLoc);
97}
98
99BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
100 SourceLocation Loc = SourceLocation::ReadVal(D);
101 return new BreakStmt(Loc);
102}
103
104void CaseStmt::directEmit(llvm::Serializer& S) const {
105 S.Emit(CaseLoc);
106 S.EmitOwnedPtr(getLHS());
107 S.EmitOwnedPtr(getRHS());
108 S.EmitOwnedPtr(getSubStmt());
109 S.EmitPtr(getNextSwitchCase());
110}
111
112CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
113 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
114 Expr* LHS = D.ReadOwnedPtr<Expr>();
115 Expr* RHS = D.ReadOwnedPtr<Expr>();
116 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
117
118 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
119 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
120
121 return stmt;
122}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000123
Ted Kremenek47281102007-11-07 00:17:35 +0000124void CompoundStmt::directEmit(llvm::Serializer& S) const {
125 S.Emit(LBracLoc);
126 S.Emit(RBracLoc);
127 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000128
Ted Kremenek47281102007-11-07 00:17:35 +0000129 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000130 S.EmitOwnedPtr(*I);
131}
132
Ted Kremenek47281102007-11-07 00:17:35 +0000133CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
134 SourceLocation LB = SourceLocation::ReadVal(D);
135 SourceLocation RB = SourceLocation::ReadVal(D);
136 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000137
Ted Kremenek47281102007-11-07 00:17:35 +0000138 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
139
140 stmt->Body.reserve(size);
141
142 for (unsigned i = 0; i < size; ++i)
143 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
144
145 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000146}
Ted Kremenek47281102007-11-07 00:17:35 +0000147
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000148void DeclStmt::directEmit(llvm::Serializer& S) const {
149 // FIXME: special handling for struct decls.
150 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000151}
152
153void DeclRefExpr::directEmit(llvm::Serializer& S) const {
154 S.Emit(Loc);
155 S.Emit(getType());
156 S.EmitPtr(getDecl());
157}
158
159DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
160 SourceLocation Loc = SourceLocation::ReadVal(D);
161 QualType T = QualType::ReadVal(D);
162 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
163 D.ReadPtr(dr->D,false);
164 return dr;
165}
166
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000167DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
168 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
169 return new DeclStmt(decl);
170}
171
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000172void DefaultStmt::directEmit(llvm::Serializer& S) const {
173 S.Emit(DefaultLoc);
174 S.EmitOwnedPtr(getSubStmt());
175 S.EmitPtr(getNextSwitchCase());
176}
177
178DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
179 SourceLocation Loc = SourceLocation::ReadVal(D);
180 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
181
182 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
183 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
184
185 return stmt;
186}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000187
Ted Kremenekca22d352007-11-07 07:19:30 +0000188void IfStmt::directEmit(llvm::Serializer& S) const {
189 S.Emit(IfLoc);
190 S.EmitOwnedPtr(getCond());
191 S.EmitOwnedPtr(getThen());
192 S.EmitOwnedPtr(getElse());
193}
194
195IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
196 SourceLocation L = SourceLocation::ReadVal(D);
197 Expr* Cond = D.ReadOwnedPtr<Expr>();
198 Stmt* Then = D.ReadOwnedPtr<Stmt>();
199 Stmt* Else = D.ReadOwnedPtr<Stmt>();
200 return new IfStmt(L,Cond,Then,Else);
201}
202
Ted Kremenek47281102007-11-07 00:17:35 +0000203void IntegerLiteral::directEmit(llvm::Serializer& S) const {
204 S.Emit(Loc);
205 S.Emit(getType());
206 S.Emit(getValue());
207}
208
209IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
210 SourceLocation Loc = SourceLocation::ReadVal(D);
211 QualType T = QualType::ReadVal(D);
212
213 // Create a dummy APInt because it is more efficient to deserialize
214 // it in place with the deserialized IntegerLiteral. (fewer copies)
215 llvm::APInt temp;
216 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
217 D.Read(expr->Value);
218
219 return expr;
220}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000221
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000222void LabelStmt::directEmit(llvm::Serializer& S) const {
223 S.EmitPtr(Label);
224 S.Emit(IdentLoc);
225 S.EmitOwnedPtr(SubStmt);
226}
227
228LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
229 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
230 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
231 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
232 return new LabelStmt(IdentLoc,Label,SubStmt);
233}
234
Ted Kremenek25aaa262007-11-07 00:40:53 +0000235void NullStmt::directEmit(llvm::Serializer& S) const {
236 S.Emit(SemiLoc);
237}
238
239NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
240 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
241 return new NullStmt(SemiLoc);
242}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000243
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000244void ParenExpr::directEmit(llvm::Serializer& S) const {
245 S.Emit(L);
246 S.Emit(R);
247 S.EmitOwnedPtr(Val);
248}
249
250ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
251 SourceLocation L = SourceLocation::ReadVal(D);
252 SourceLocation R = SourceLocation::ReadVal(D);
253 Expr* val = D.ReadOwnedPtr<Expr>();
254 return new ParenExpr(L,R,val);
255}
256
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000257void ReturnStmt::directEmit(llvm::Serializer& S) const {
258 S.Emit(RetLoc);
259 S.EmitOwnedPtr(RetExpr);
260}
261
262ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
263 SourceLocation RetLoc = SourceLocation::ReadVal(D);
264 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
265 return new ReturnStmt(RetLoc,RetExpr);
266}
267
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000268void SwitchStmt::directEmit(llvm::Serializer& S) const {
269 S.Emit(SwitchLoc);
270 S.EmitOwnedPtr(getCond());
271 S.EmitOwnedPtr(getBody());
272 S.EmitPtr(FirstCase);
273}
274
275SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
276 SourceLocation Loc = SourceLocation::ReadVal(D);
277 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
278 Stmt* Body = D.ReadOwnedPtr<Stmt>();
279 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
280
281 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
282 stmt->setBody(Body,Loc);
283 stmt->FirstCase = FirstCase;
284
285 return stmt;
286}