blob: 485876dfd2f9bc582cc315a593aa3cbc4f30ca41 [file] [log] [blame]
Ted Kremeneke522d852007-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 Kremenek2dc9ac72007-11-07 00:17:35 +000015#include "clang/AST/Expr.h"
Ted Kremeneke522d852007-10-31 18:41:19 +000016#include "llvm/Bitcode/Serialize.h"
17#include "llvm/Bitcode/Deserialize.h"
18
Ted Kremeneke522d852007-10-31 18:41:19 +000019using namespace clang;
20
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000021void Stmt::Emit(llvm::Serializer& S) const {
22 S.EmitInt(getStmtClass());
23 directEmit(S);
24}
Ted Kremeneke522d852007-10-31 18:41:19 +000025
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000026Stmt* Stmt::Materialize(llvm::Deserializer& D) {
27 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremeneke522d852007-10-31 18:41:19 +000028
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000029 switch (SC) {
30 default:
31 assert (false && "Not implemented.");
32 return NULL;
Ted Kremenek0965f442007-11-07 00:37:40 +000033
34 case BinaryOperatorClass:
35 return BinaryOperator::directMaterialize(D);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000036
37 case CompoundStmtClass:
38 return CompoundStmt::directMaterialize(D);
39
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000040 case DeclRefExprClass:
41 return DeclRefExpr::directMaterialize(D);
42
Ted Kremenek0965f442007-11-07 00:37:40 +000043 case DeclStmtClass:
44 return DeclStmt::directMaterialize(D);
45
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000046 case IntegerLiteralClass:
Ted Kremenek0965f442007-11-07 00:37:40 +000047 return IntegerLiteral::directMaterialize(D);
48
49 case ReturnStmtClass:
50 return ReturnStmt::directMaterialize(D);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000051 }
Ted Kremeneke522d852007-10-31 18:41:19 +000052}
53
Ted Kremenek0965f442007-11-07 00:37:40 +000054void BinaryOperator::directEmit(llvm::Serializer& S) const {
55 S.EmitInt(Opc);
56 S.Emit(OpLoc);;
57 S.Emit(getType());
58 S.EmitOwnedPtr(getLHS());
59 S.EmitOwnedPtr(getRHS());
60}
61
62BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
63 Opcode Opc = static_cast<Opcode>(D.ReadInt());
64 SourceLocation OpLoc = SourceLocation::ReadVal(D);
65 QualType Result = QualType::ReadVal(D);
66 Expr* LHS = D.ReadOwnedPtr<Expr>();
67 Expr* RHS = D.ReadOwnedPtr<Expr>();
68 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
69}
Ted Kremeneke522d852007-10-31 18:41:19 +000070
Ted Kremeneke522d852007-10-31 18:41:19 +000071
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000072void CompoundStmt::directEmit(llvm::Serializer& S) const {
73 S.Emit(LBracLoc);
74 S.Emit(RBracLoc);
75 S.Emit(Body.size());
Ted Kremeneke522d852007-10-31 18:41:19 +000076
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000077 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremeneke522d852007-10-31 18:41:19 +000078 S.EmitOwnedPtr(*I);
79}
80
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000081CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
82 SourceLocation LB = SourceLocation::ReadVal(D);
83 SourceLocation RB = SourceLocation::ReadVal(D);
84 unsigned size = D.ReadInt();
Ted Kremeneke522d852007-10-31 18:41:19 +000085
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000086 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
87
88 stmt->Body.reserve(size);
89
90 for (unsigned i = 0; i < size; ++i)
91 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
92
93 return stmt;
Ted Kremeneke522d852007-10-31 18:41:19 +000094}
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000095
Ted Kremenek0965f442007-11-07 00:37:40 +000096void DeclStmt::directEmit(llvm::Serializer& S) const {
97 // FIXME: special handling for struct decls.
98 S.EmitOwnedPtr(getDecl());
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000099}
100
101void DeclRefExpr::directEmit(llvm::Serializer& S) const {
102 S.Emit(Loc);
103 S.Emit(getType());
104 S.EmitPtr(getDecl());
105}
106
107DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
108 SourceLocation Loc = SourceLocation::ReadVal(D);
109 QualType T = QualType::ReadVal(D);
110 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
111 D.ReadPtr(dr->D,false);
112 return dr;
113}
114
Ted Kremenek0965f442007-11-07 00:37:40 +0000115DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
116 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
117 return new DeclStmt(decl);
118}
119
120
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000121void IntegerLiteral::directEmit(llvm::Serializer& S) const {
122 S.Emit(Loc);
123 S.Emit(getType());
124 S.Emit(getValue());
125}
126
127IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
128 SourceLocation Loc = SourceLocation::ReadVal(D);
129 QualType T = QualType::ReadVal(D);
130
131 // Create a dummy APInt because it is more efficient to deserialize
132 // it in place with the deserialized IntegerLiteral. (fewer copies)
133 llvm::APInt temp;
134 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
135 D.Read(expr->Value);
136
137 return expr;
138}
Ted Kremenek0965f442007-11-07 00:37:40 +0000139
140
141void ReturnStmt::directEmit(llvm::Serializer& S) const {
142 S.Emit(RetLoc);
143 S.EmitOwnedPtr(RetExpr);
144}
145
146ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
147 SourceLocation RetLoc = SourceLocation::ReadVal(D);
148 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
149 return new ReturnStmt(RetLoc,RetExpr);
150}
151