]> granicus.if.org Git - clang/commitdiff
Implemented serialization of AddrLabelExpr.
authorTed Kremenek <kremenek@apple.com>
Thu, 8 Nov 2007 16:32:00 +0000 (16:32 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 8 Nov 2007 16:32:00 +0000 (16:32 +0000)
Implemented serialization of ConditionalOperator.
Implemented serialization of StmtExpr.
Fixed bug in serialization of IndirectGoto (did not properly serialize subexpression).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43891 91177308-0d34-0410-b5e6-96231b3b80d8

AST/StmtSerialization.cpp
include/clang/AST/Expr.h

index 99a14f2a30fbb949845ce2f980cf38d9f0adba0e..5ea56c2b4569cab80908ea7cf66197b9b6bf2c15 100644 (file)
@@ -35,6 +35,9 @@ Stmt* Stmt::Materialize(Deserializer& D) {
       assert (false && "Not implemented.");
       return NULL;
     
+    case AddrLabelExprClass:
+      return AddrLabelExpr::directMaterialize(D);
+      
     case ArraySubscriptExprClass:
       return ArraySubscriptExpr::directMaterialize(D);
       
@@ -61,6 +64,9 @@ Stmt* Stmt::Materialize(Deserializer& D) {
       
     case CompoundStmtClass:
       return CompoundStmt::directMaterialize(D);
+    
+    case ConditionalOperatorClass:
+      return ConditionalOperator::directMaterialize(D);
       
     case ContinueStmtClass:
       return ContinueStmt::directMaterialize(D);
@@ -115,7 +121,10 @@ Stmt* Stmt::Materialize(Deserializer& D) {
       
     case ReturnStmtClass:
       return ReturnStmt::directMaterialize(D);
-     
+    
+    case StmtExprClass:
+      return StmtExpr::directMaterialize(D);
+      
     case StringLiteralClass:
       return StringLiteral::directMaterialize(D);
       
@@ -130,6 +139,22 @@ Stmt* Stmt::Materialize(Deserializer& D) {
   }
 }
 
+void AddrLabelExpr::directEmit(Serializer& S) const {
+  S.Emit(getType());
+  S.Emit(AmpAmpLoc);
+  S.Emit(LabelLoc);
+  S.EmitPtr(Label);
+}
+
+AddrLabelExpr* AddrLabelExpr::directMaterialize(Deserializer& D) {
+  QualType t = QualType::ReadVal(D);
+  SourceLocation AALoc = SourceLocation::ReadVal(D);
+  SourceLocation LLoc = SourceLocation::ReadVal(D);
+  AddrLabelExpr* expr = new AddrLabelExpr(AALoc,LLoc,NULL,t);
+  D.ReadPtr(expr->Label); // Pointer may be backpatched.
+  return expr;
+}
+
 void ArraySubscriptExpr::directEmit(Serializer& S) const {
   S.Emit(getType());
   S.Emit(RBracketLoc);
@@ -272,6 +297,18 @@ CompoundStmt* CompoundStmt::directMaterialize(Deserializer& D) {
   return stmt;
 }
 
+void ConditionalOperator::directEmit(Serializer& S) const {
+  S.Emit(getType());
+  S.BatchEmitOwnedPtrs((unsigned) END_EXPR, SubExprs);
+}
+
+ConditionalOperator* ConditionalOperator::directMaterialize(Deserializer& D) {
+  QualType t = QualType::ReadVal(D);
+  ConditionalOperator* c = new ConditionalOperator(NULL,NULL,NULL,t);
+  D.BatchReadOwnedPtrs((unsigned) END_EXPR, c->SubExprs);
+  return c;
+}
+
 void ContinueStmt::directEmit(Serializer& S) const {
   S.Emit(ContinueLoc);
 }
@@ -418,13 +455,12 @@ ImplicitCastExpr* ImplicitCastExpr::directMaterialize(Deserializer& D) {
 }
 
 void IndirectGotoStmt::directEmit(Serializer& S) const {
-  S.EmitPtr(Target);  
+  S.EmitOwnedPtr(Target);  
 }
 
 IndirectGotoStmt* IndirectGotoStmt::directMaterialize(Deserializer& D) {
-  IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
-  D.ReadPtr(stmt->Target); // The target may be backpatched.
-  return stmt;
+  Expr* Target = D.ReadOwnedPtr<Expr>();
+  return new IndirectGotoStmt(Target);
 }
 
 void IntegerLiteral::directEmit(Serializer& S) const {
@@ -505,6 +541,21 @@ ReturnStmt* ReturnStmt::directMaterialize(Deserializer& D) {
   return new ReturnStmt(RetLoc,RetExpr);
 }
 
+void StmtExpr::directEmit(Serializer& S) const {
+  S.Emit(getType());
+  S.Emit(LParenLoc);
+  S.Emit(RParenLoc);
+  S.EmitOwnedPtr(SubStmt);
+}
+
+StmtExpr* StmtExpr::directMaterialize(Deserializer& D) {
+  QualType t = QualType::ReadVal(D);
+  SourceLocation L = SourceLocation::ReadVal(D);
+  SourceLocation R = SourceLocation::ReadVal(D);
+  CompoundStmt* SubStmt = cast<CompoundStmt>(D.ReadOwnedPtr<Stmt>());
+  return new StmtExpr(SubStmt,t,L,R);
+}
+
 void StringLiteral::directEmit(Serializer& S) const {
   S.Emit(getType());
   S.Emit(firstTokLoc);
index b46da509b1ce8ddfc8f98c3c2283094ed5188a88..5c17aa604fde1d6d0513bd412c1481a20ea79b15 100644 (file)
@@ -912,6 +912,9 @@ public:
   // Iterators
   virtual child_iterator child_begin();
   virtual child_iterator child_end();
+  
+  virtual void directEmit(llvm::Serializer& S) const;
+  static ConditionalOperator* directMaterialize(llvm::Deserializer& D);
 };
 
 /// AddrLabelExpr - The GNU address of label extension, representing &&label.
@@ -937,6 +940,9 @@ public:
   // Iterators
   virtual child_iterator child_begin();
   virtual child_iterator child_end();
+  
+  virtual void directEmit(llvm::Serializer& S) const;
+  static AddrLabelExpr* directMaterialize(llvm::Deserializer& D);
 };
 
 /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
@@ -965,6 +971,9 @@ public:
   // Iterators
   virtual child_iterator child_begin();
   virtual child_iterator child_end();
+  
+  virtual void directEmit(llvm::Serializer& S) const;
+  static StmtExpr* directMaterialize(llvm::Deserializer& D);
 };
 
 /// TypesCompatibleExpr - GNU builtin-in function __builtin_type_compatible_p.