[cfe-commits] r150146 - in /cfe/trunk/lib/CodeGen: CGExpr.cpp CGExprAgg.cpp CGExprCXX.cpp CodeGenFunction.h

Eli Friedman eli.friedman at gmail.com
Wed Feb 8 19:32:31 PST 2012


Author: efriedma
Date: Wed Feb  8 21:32:31 2012
New Revision: 150146

URL: http://llvm.org/viewvc/llvm-project?rev=150146&view=rev
Log:
Refactor lambda IRGen so AggExprEmitter::VisitLambdaExpr does the right thing.


Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/CodeGen/CGExprAgg.cpp
    cfe/trunk/lib/CodeGen/CGExprCXX.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=150146&r1=150145&r2=150146&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Wed Feb  8 21:32:31 2012
@@ -2361,55 +2361,10 @@
   return MakeAddrLValue(Slot.getAddr(), E->getType());
 }
 
-namespace {
-  struct CallLambdaMemberDtor : EHScopeStack::Cleanup {
-    FieldDecl *Field;
-    CXXDestructorDecl *Dtor;
-    llvm::Value *Lambda;
-
-    CallLambdaMemberDtor(FieldDecl *Field, CXXDestructorDecl *Dtor,
-                         llvm::Value *Lambda)
-      : Field(Field), Dtor(Dtor), Lambda(Lambda) {}
-
-    void Emit(CodeGenFunction &CGF, Flags flags) {
-      LValue LHS = CGF.EmitLValueForField(Lambda, Field, 0);
-      CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete, /*ForVirtualBase=*/false,
-                                LHS.getAddress());
-    }
-  };
-}
-
 LValue
 CodeGenFunction::EmitLambdaLValue(const LambdaExpr *E) {
   AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue");
-
-  EHScopeStack::stable_iterator CleanupDepth = EHStack.stable_begin();
-  CXXRecordDecl::field_iterator CurField = E->getLambdaClass()->field_begin();
-  for (LambdaExpr::capture_init_iterator i = E->capture_init_begin(),
-                                         e = E->capture_init_end();
-      i != e; ++i, ++CurField) {
-    // FIXME: Add array handling
-    // FIXME: Try to refactor with CodeGenFunction::EmitCtorPrologue
-
-    // Emit initialization
-    LValue LV = EmitLValueForFieldInitialization(Slot.getAddr(), *CurField, 0);
-    EmitExprAsInit(*i, *CurField, LV, false);
-
-    // Add temporary cleanup to handle the case where a later initialization
-    // throws.
-    if (!CGM.getLangOptions().Exceptions)
-      continue;
-    const RecordType *RT = CurField->getType()->getAs<RecordType>();
-    if (!RT)
-      continue;
-    CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
-    if (!RD->hasTrivialDestructor())
-      EHStack.pushCleanup<CallLambdaMemberDtor>(EHCleanup, *CurField,
-                                                RD->getDestructor(),
-                                                Slot.getAddr());
-  }
-  PopCleanupBlocks(CleanupDepth);
-
+  EmitLambdaExpr(E, Slot);
   return MakeAddrLValue(Slot.getAddr(), E->getType());
 }
 

Modified: cfe/trunk/lib/CodeGen/CGExprAgg.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprAgg.cpp?rev=150146&r1=150145&r2=150146&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprAgg.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprAgg.cpp Wed Feb  8 21:32:31 2012
@@ -142,12 +142,12 @@
   }
   void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
   void VisitCXXConstructExpr(const CXXConstructExpr *E);
+  void VisitLambdaExpr(LambdaExpr *E);
   void VisitExprWithCleanups(ExprWithCleanups *E);
   void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
   void VisitCXXTypeidExpr(CXXTypeidExpr *E) { EmitAggLoadOfLValue(E); }
   void VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
   void VisitOpaqueValueExpr(OpaqueValueExpr *E);
-  void VisitLambdaExpr(LambdaExpr *E) { EmitAggLoadOfLValue(E); }
 
   void VisitPseudoObjectExpr(PseudoObjectExpr *E) {
     if (E->isGLValue()) {
@@ -539,6 +539,12 @@
   CGF.EmitCXXConstructExpr(E, Slot);
 }
 
+void
+AggExprEmitter::VisitLambdaExpr(LambdaExpr *E) {
+  AggValueSlot Slot = EnsureSlot(E->getType());
+  CGF.EmitLambdaExpr(E, Slot);
+}
+
 void AggExprEmitter::VisitExprWithCleanups(ExprWithCleanups *E) {
   CGF.enterFullExpression(E);
   CodeGenFunction::RunCleanupsScope cleanups(CGF);

Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=150146&r1=150145&r2=150146&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Wed Feb  8 21:32:31 2012
@@ -1764,3 +1764,50 @@
 
   return Value;
 }
+
+namespace {
+  struct CallLambdaMemberDtor : EHScopeStack::Cleanup {
+    FieldDecl *Field;
+    CXXDestructorDecl *Dtor;
+    llvm::Value *Lambda;
+
+    CallLambdaMemberDtor(FieldDecl *Field, CXXDestructorDecl *Dtor,
+                         llvm::Value *Lambda)
+      : Field(Field), Dtor(Dtor), Lambda(Lambda) {}
+
+    void Emit(CodeGenFunction &CGF, Flags flags) {
+      LValue LHS = CGF.EmitLValueForField(Lambda, Field, 0);
+      CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete, /*ForVirtualBase=*/false,
+                                LHS.getAddress());
+    }
+  };
+}
+
+void CodeGenFunction::EmitLambdaExpr(const LambdaExpr *E, AggValueSlot Slot) {
+  EHScopeStack::stable_iterator CleanupDepth = EHStack.stable_begin();
+  CXXRecordDecl::field_iterator CurField = E->getLambdaClass()->field_begin();
+  for (LambdaExpr::capture_init_iterator i = E->capture_init_begin(),
+                                         e = E->capture_init_end();
+      i != e; ++i, ++CurField) {
+    // FIXME: Add array handling
+    // FIXME: Try to refactor with CodeGenFunction::EmitCtorPrologue
+
+    // Emit initialization
+    LValue LV = EmitLValueForFieldInitialization(Slot.getAddr(), *CurField, 0);
+    EmitExprAsInit(*i, *CurField, LV, false);
+
+    // Add temporary cleanup to handle the case where a later initialization
+    // throws.
+    if (!CGM.getLangOptions().Exceptions)
+      continue;
+    const RecordType *RT = CurField->getType()->getAs<RecordType>();
+    if (!RT)
+      continue;
+    CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
+    if (!RD->hasTrivialDestructor())
+      EHStack.pushCleanup<CallLambdaMemberDtor>(EHCleanup, *CurField,
+                                                RD->getDestructor(),
+                                                Slot.getAddr());
+  }
+  PopCleanupBlocks(CleanupDepth);
+}

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=150146&r1=150145&r2=150146&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Wed Feb  8 21:32:31 2012
@@ -2400,6 +2400,8 @@
 
   void EmitCXXThrowExpr(const CXXThrowExpr *E);
 
+  void EmitLambdaExpr(const LambdaExpr *E, AggValueSlot Dest);
+
   RValue EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest = 0);
 
   //===--------------------------------------------------------------------===//





More information about the cfe-commits mailing list