blob: 9f2a7cb84d641a2fae9d57777bee4c5353e68e83 [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
37 case CompoundStmtClass:
38 return CompoundStmt::directMaterialize(D);
39
Ted Kremenek47281102007-11-07 00:17:35 +000040 case DeclRefExprClass:
41 return DeclRefExpr::directMaterialize(D);
42
Ted Kremenek2bd6e652007-11-07 00:37:40 +000043 case DeclStmtClass:
44 return DeclStmt::directMaterialize(D);
45
Ted Kremenek47281102007-11-07 00:17:35 +000046 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000047 return IntegerLiteral::directMaterialize(D);
48
Ted Kremenek56a74bb2007-11-07 00:48:04 +000049 case LabelStmtClass:
50 return LabelStmt::directMaterialize(D);
51
Ted Kremenek25aaa262007-11-07 00:40:53 +000052 case NullStmtClass:
53 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000054
55 case ReturnStmtClass:
56 return ReturnStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000057 }
Ted Kremenek215c2c82007-10-31 18:41:19 +000058}
59
Ted Kremenek2bd6e652007-11-07 00:37:40 +000060void BinaryOperator::directEmit(llvm::Serializer& S) const {
61 S.EmitInt(Opc);
62 S.Emit(OpLoc);;
63 S.Emit(getType());
64 S.EmitOwnedPtr(getLHS());
65 S.EmitOwnedPtr(getRHS());
66}
67
68BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
69 Opcode Opc = static_cast<Opcode>(D.ReadInt());
70 SourceLocation OpLoc = SourceLocation::ReadVal(D);
71 QualType Result = QualType::ReadVal(D);
72 Expr* LHS = D.ReadOwnedPtr<Expr>();
73 Expr* RHS = D.ReadOwnedPtr<Expr>();
74 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
75}
Ted Kremenek215c2c82007-10-31 18:41:19 +000076
Ted Kremenek215c2c82007-10-31 18:41:19 +000077
Ted Kremenek47281102007-11-07 00:17:35 +000078void CompoundStmt::directEmit(llvm::Serializer& S) const {
79 S.Emit(LBracLoc);
80 S.Emit(RBracLoc);
81 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +000082
Ted Kremenek47281102007-11-07 00:17:35 +000083 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +000084 S.EmitOwnedPtr(*I);
85}
86
Ted Kremenek47281102007-11-07 00:17:35 +000087CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
88 SourceLocation LB = SourceLocation::ReadVal(D);
89 SourceLocation RB = SourceLocation::ReadVal(D);
90 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +000091
Ted Kremenek47281102007-11-07 00:17:35 +000092 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
93
94 stmt->Body.reserve(size);
95
96 for (unsigned i = 0; i < size; ++i)
97 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
98
99 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000100}
Ted Kremenek47281102007-11-07 00:17:35 +0000101
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000102void DeclStmt::directEmit(llvm::Serializer& S) const {
103 // FIXME: special handling for struct decls.
104 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000105}
106
107void DeclRefExpr::directEmit(llvm::Serializer& S) const {
108 S.Emit(Loc);
109 S.Emit(getType());
110 S.EmitPtr(getDecl());
111}
112
113DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
114 SourceLocation Loc = SourceLocation::ReadVal(D);
115 QualType T = QualType::ReadVal(D);
116 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
117 D.ReadPtr(dr->D,false);
118 return dr;
119}
120
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000121DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
122 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
123 return new DeclStmt(decl);
124}
125
126
Ted Kremenek47281102007-11-07 00:17:35 +0000127void IntegerLiteral::directEmit(llvm::Serializer& S) const {
128 S.Emit(Loc);
129 S.Emit(getType());
130 S.Emit(getValue());
131}
132
133IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
134 SourceLocation Loc = SourceLocation::ReadVal(D);
135 QualType T = QualType::ReadVal(D);
136
137 // Create a dummy APInt because it is more efficient to deserialize
138 // it in place with the deserialized IntegerLiteral. (fewer copies)
139 llvm::APInt temp;
140 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
141 D.Read(expr->Value);
142
143 return expr;
144}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000145
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000146void LabelStmt::directEmit(llvm::Serializer& S) const {
147 S.EmitPtr(Label);
148 S.Emit(IdentLoc);
149 S.EmitOwnedPtr(SubStmt);
150}
151
152LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
153 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
154 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
155 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
156 return new LabelStmt(IdentLoc,Label,SubStmt);
157}
158
Ted Kremenek25aaa262007-11-07 00:40:53 +0000159void NullStmt::directEmit(llvm::Serializer& S) const {
160 S.Emit(SemiLoc);
161}
162
163NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
164 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
165 return new NullStmt(SemiLoc);
166}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000167
168void ReturnStmt::directEmit(llvm::Serializer& S) const {
169 S.Emit(RetLoc);
170 S.EmitOwnedPtr(RetExpr);
171}
172
173ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
174 SourceLocation RetLoc = SourceLocation::ReadVal(D);
175 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
176 return new ReturnStmt(RetLoc,RetExpr);
177}
178