[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