blob: e27c703eb4931b407019c096cbf880111baf0610 [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
49 case NullStmtClass:
50 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000051
52 case ReturnStmtClass:
53 return ReturnStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000054 }
Ted Kremenek215c2c82007-10-31 18:41:19 +000055}
56
Ted Kremenek2bd6e652007-11-07 00:37:40 +000057void BinaryOperator::directEmit(llvm::Serializer& S) const {
58 S.EmitInt(Opc);
59 S.Emit(OpLoc);;
60 S.Emit(getType());
61 S.EmitOwnedPtr(getLHS());
62 S.EmitOwnedPtr(getRHS());
63}
64
65BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
66 Opcode Opc = static_cast<Opcode>(D.ReadInt());
67 SourceLocation OpLoc = SourceLocation::ReadVal(D);
68 QualType Result = QualType::ReadVal(D);
69 Expr* LHS = D.ReadOwnedPtr<Expr>();
70 Expr* RHS = D.ReadOwnedPtr<Expr>();
71 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
72}
Ted Kremenek215c2c82007-10-31 18:41:19 +000073
Ted Kremenek215c2c82007-10-31 18:41:19 +000074
Ted Kremenek47281102007-11-07 00:17:35 +000075void CompoundStmt::directEmit(llvm::Serializer& S) const {
76 S.Emit(LBracLoc);
77 S.Emit(RBracLoc);
78 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +000079
Ted Kremenek47281102007-11-07 00:17:35 +000080 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +000081 S.EmitOwnedPtr(*I);
82}
83
Ted Kremenek47281102007-11-07 00:17:35 +000084CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
85 SourceLocation LB = SourceLocation::ReadVal(D);
86 SourceLocation RB = SourceLocation::ReadVal(D);
87 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +000088
Ted Kremenek47281102007-11-07 00:17:35 +000089 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
90
91 stmt->Body.reserve(size);
92
93 for (unsigned i = 0; i < size; ++i)
94 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
95
96 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +000097}
Ted Kremenek47281102007-11-07 00:17:35 +000098
Ted Kremenek2bd6e652007-11-07 00:37:40 +000099void DeclStmt::directEmit(llvm::Serializer& S) const {
100 // FIXME: special handling for struct decls.
101 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000102}
103
104void DeclRefExpr::directEmit(llvm::Serializer& S) const {
105 S.Emit(Loc);
106 S.Emit(getType());
107 S.EmitPtr(getDecl());
108}
109
110DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
111 SourceLocation Loc = SourceLocation::ReadVal(D);
112 QualType T = QualType::ReadVal(D);
113 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
114 D.ReadPtr(dr->D,false);
115 return dr;
116}
117
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000118DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
119 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
120 return new DeclStmt(decl);
121}
122
123
Ted Kremenek47281102007-11-07 00:17:35 +0000124void IntegerLiteral::directEmit(llvm::Serializer& S) const {
125 S.Emit(Loc);
126 S.Emit(getType());
127 S.Emit(getValue());
128}
129
130IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
131 SourceLocation Loc = SourceLocation::ReadVal(D);
132 QualType T = QualType::ReadVal(D);
133
134 // Create a dummy APInt because it is more efficient to deserialize
135 // it in place with the deserialized IntegerLiteral. (fewer copies)
136 llvm::APInt temp;
137 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
138 D.Read(expr->Value);
139
140 return expr;
141}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000142
Ted Kremenek25aaa262007-11-07 00:40:53 +0000143void NullStmt::directEmit(llvm::Serializer& S) const {
144 S.Emit(SemiLoc);
145}
146
147NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
148 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
149 return new NullStmt(SemiLoc);
150}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000151
152void ReturnStmt::directEmit(llvm::Serializer& S) const {
153 S.Emit(RetLoc);
154 S.EmitOwnedPtr(RetExpr);
155}
156
157ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
158 SourceLocation RetLoc = SourceLocation::ReadVal(D);
159 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
160 return new ReturnStmt(RetLoc,RetExpr);
161}
162