]> granicus.if.org Git - clang/commitdiff
implement code generation for scalar stmt expressions.
authorChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2007 22:09:40 +0000 (22:09 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2007 22:09:40 +0000 (22:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41656 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExprScalar.cpp
CodeGen/CGStmt.cpp
CodeGen/CodeGenFunction.h

index 1499054b6cce8bf7047d7b82378bfb42ae9860fc..db0e6bf492e5290e96d1aa732cc8f34211a03f01 100644 (file)
@@ -129,6 +129,8 @@ public:
     return CGF.EmitCallExpr(E).getVal();
   }
   
+  Value *VisitStmtExpr(const StmtExpr *E);
+  
   // Unary Operators.
   Value *VisitPrePostIncDec(const UnaryOperator *E, bool isInc, bool isPre);
   Value *VisitUnaryPostDec(const UnaryOperator *E) {
@@ -437,6 +439,11 @@ Value *ScalarExprEmitter::EmitCastExpr(const Expr *E, QualType DestTy) {
                                        DestTy);
 }
 
+Value *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) {
+  return CGF.EmitCompoundStmt(*E->getSubStmt(), true).getVal();
+}
+
+
 //===----------------------------------------------------------------------===//
 //                             Unary Operators
 //===----------------------------------------------------------------------===//
index 04c9c1d3eb706d62ae7b86797dab86a3f19baabc..85a6ca8705ed9792cc3579721993c907857b2931 100644 (file)
@@ -60,12 +60,29 @@ void CodeGenFunction::EmitStmt(const Stmt *S) {
   }
 }
 
-void CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S) {
+/// EmitCompoundStmt - Emit a compound statement {..} node.  If GetLast is true,
+/// this captures the expression result of the last sub-statement and returns it
+/// (for use by the statement expression extension).
+RValue CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S, bool GetLast) {
   // FIXME: handle vla's etc.
+  if (S.body_empty() || !isa<Expr>(S.body_back())) GetLast = false;
   
-  for (CompoundStmt::const_body_iterator I = S.body_begin(), E = S.body_end();
-       I != E; ++I)
+  for (CompoundStmt::const_body_iterator I = S.body_begin(),
+       E = S.body_end()-GetLast; I != E; ++I)
     EmitStmt(*I);
+  
+  
+  if (!GetLast)
+    return RValue::get(0);
+    
+  const Expr *Last = cast<Expr>(S.body_back());
+  if (!hasAggregateLLVMType(Last->getType()))
+    return RValue::get(EmitScalarExpr(Last));
+  assert(0 && "Unimp");
+  //else if (Last->getType()->isComplexType())
+  //  EmitComplexExpr(Last);
+  //else
+  //  EmitAggExpr(E, 0, false);
 }
 
 void CodeGenFunction::EmitBlock(llvm::BasicBlock *BB) {
index af8d80bbb2795b00a2c1f177e5e896c51067f3a3..a597f4326869406d153e31bc5809774314dcf9bf 100644 (file)
@@ -265,7 +265,7 @@ public:
   //===--------------------------------------------------------------------===//
 
   void EmitStmt(const Stmt *S);
-  void EmitCompoundStmt(const CompoundStmt &S);
+  RValue EmitCompoundStmt(const CompoundStmt &S, bool GetLast = false);
   void EmitLabelStmt(const LabelStmt &S);
   void EmitGotoStmt(const GotoStmt &S);
   void EmitIfStmt(const IfStmt &S);