aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGTemporaries.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CGTemporaries.cpp')
-rw-r--r--lib/CodeGen/CGTemporaries.cpp86
1 files changed, 40 insertions, 46 deletions
diff --git a/lib/CodeGen/CGTemporaries.cpp b/lib/CodeGen/CGTemporaries.cpp
index fd7c616b1162..dfb8dc63c5c5 100644
--- a/lib/CodeGen/CGTemporaries.cpp
+++ b/lib/CodeGen/CGTemporaries.cpp
@@ -15,34 +15,43 @@
using namespace clang;
using namespace CodeGen;
-static void EmitTemporaryCleanup(CodeGenFunction &CGF,
- const CXXTemporary *Temporary,
- llvm::Value *Addr,
- llvm::Value *CondPtr) {
- llvm::BasicBlock *CondEnd = 0;
+namespace {
+ struct DestroyTemporary : EHScopeStack::Cleanup {
+ const CXXTemporary *Temporary;
+ llvm::Value *Addr;
+ llvm::Value *CondPtr;
+
+ DestroyTemporary(const CXXTemporary *Temporary, llvm::Value *Addr,
+ llvm::Value *CondPtr)
+ : Temporary(Temporary), Addr(Addr), CondPtr(CondPtr) {}
+
+ void Emit(CodeGenFunction &CGF, bool IsForEH) {
+ llvm::BasicBlock *CondEnd = 0;
- // If this is a conditional temporary, we need to check the condition
- // boolean and only call the destructor if it's true.
- if (CondPtr) {
- llvm::BasicBlock *CondBlock = CGF.createBasicBlock("temp.cond-dtor.call");
- CondEnd = CGF.createBasicBlock("temp.cond-dtor.cont");
+ // If this is a conditional temporary, we need to check the condition
+ // boolean and only call the destructor if it's true.
+ if (CondPtr) {
+ llvm::BasicBlock *CondBlock =
+ CGF.createBasicBlock("temp.cond-dtor.call");
+ CondEnd = CGF.createBasicBlock("temp.cond-dtor.cont");
- llvm::Value *Cond = CGF.Builder.CreateLoad(CondPtr);
- CGF.Builder.CreateCondBr(Cond, CondBlock, CondEnd);
- CGF.EmitBlock(CondBlock);
- }
+ llvm::Value *Cond = CGF.Builder.CreateLoad(CondPtr);
+ CGF.Builder.CreateCondBr(Cond, CondBlock, CondEnd);
+ CGF.EmitBlock(CondBlock);
+ }
- CGF.EmitCXXDestructorCall(Temporary->getDestructor(),
- Dtor_Complete, /*ForVirtualBase=*/false,
- Addr);
+ CGF.EmitCXXDestructorCall(Temporary->getDestructor(),
+ Dtor_Complete, /*ForVirtualBase=*/false,
+ Addr);
- if (CondPtr) {
- // Reset the condition to false.
- CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(CGF.getLLVMContext()),
- CondPtr);
- CGF.EmitBlock(CondEnd);
- }
-}
+ if (CondPtr) {
+ // Reset the condition to false.
+ CGF.Builder.CreateStore(CGF.Builder.getFalse(), CondPtr);
+ CGF.EmitBlock(CondEnd);
+ }
+ }
+ };
+}
/// Emits all the code to cause the given temporary to be cleaned up.
void CodeGenFunction::EmitCXXTemporary(const CXXTemporary *Temporary,
@@ -59,16 +68,11 @@ void CodeGenFunction::EmitCXXTemporary(const CXXTemporary *Temporary,
InitTempAlloca(CondPtr, llvm::ConstantInt::getFalse(VMContext));
// Now set it to true.
- Builder.CreateStore(llvm::ConstantInt::getTrue(VMContext), CondPtr);
+ Builder.CreateStore(Builder.getTrue(), CondPtr);
}
- CleanupBlock Cleanup(*this, NormalCleanup);
- EmitTemporaryCleanup(*this, Temporary, Ptr, CondPtr);
-
- if (Exceptions) {
- Cleanup.beginEHCleanup();
- EmitTemporaryCleanup(*this, Temporary, Ptr, CondPtr);
- }
+ EHStack.pushCleanup<DestroyTemporary>(NormalAndEHCleanup,
+ Temporary, Ptr, CondPtr);
}
RValue
@@ -76,23 +80,13 @@ CodeGenFunction::EmitCXXExprWithTemporaries(const CXXExprWithTemporaries *E,
llvm::Value *AggLoc,
bool IsAggLocVolatile,
bool IsInitializer) {
- RValue RV;
- {
- RunCleanupsScope Scope(*this);
-
- RV = EmitAnyExpr(E->getSubExpr(), AggLoc, IsAggLocVolatile,
+ RunCleanupsScope Scope(*this);
+ return EmitAnyExpr(E->getSubExpr(), AggLoc, IsAggLocVolatile,
/*IgnoreResult=*/false, IsInitializer);
- }
- return RV;
}
LValue CodeGenFunction::EmitCXXExprWithTemporariesLValue(
const CXXExprWithTemporaries *E) {
- LValue LV;
- {
- RunCleanupsScope Scope(*this);
-
- LV = EmitLValue(E->getSubExpr());
- }
- return LV;
+ RunCleanupsScope Scope(*this);
+ return EmitLValue(E->getSubExpr());
}