diff options
-rw-r--r-- | lib/CodeGen/CGCleanup.cpp | 8 | ||||
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGExprAgg.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGTemporaries.cpp | 37 | ||||
-rw-r--r-- | lib/CodeGen/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 3 |
6 files changed, 12 insertions, 41 deletions
diff --git a/lib/CodeGen/CGCleanup.cpp b/lib/CodeGen/CGCleanup.cpp index f9ffc9373f..40c316f436 100644 --- a/lib/CodeGen/CGCleanup.cpp +++ b/lib/CodeGen/CGCleanup.cpp @@ -1094,3 +1094,11 @@ llvm::Value *CodeGenFunction::getNormalCleanupDestSlot() { CreateTempAlloca(Builder.getInt32Ty(), "cleanup.dest.slot"); return NormalCleanupDest; } + +/// Emits all the code to cause the given temporary to be cleaned up. +void CodeGenFunction::EmitCXXTemporary(const CXXTemporary *Temporary, + QualType TempType, + llvm::Value *Ptr) { + pushDestroy(NormalAndEHCleanup, Ptr, TempType, destroyCXXObject, + /*useEHCleanup*/ true); +} diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index bf0a34a6d0..2b24f5938d 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -2353,7 +2353,7 @@ CodeGenFunction::EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E) { AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue"); Slot.setExternallyDestructed(); EmitAggExpr(E->getSubExpr(), Slot); - EmitCXXTemporary(E->getTemporary(), Slot.getAddr()); + EmitCXXTemporary(E->getTemporary(), E->getType(), Slot.getAddr()); return MakeAddrLValue(Slot.getAddr(), E->getType()); } diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp index bc8b0818ee..0996339d3a 100644 --- a/lib/CodeGen/CGExprAgg.cpp +++ b/lib/CodeGen/CGExprAgg.cpp @@ -526,7 +526,7 @@ void AggExprEmitter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { // Push that destructor we promised. if (!wasExternallyDestructed) - CGF.EmitCXXTemporary(E->getTemporary(), Dest.getAddr()); + CGF.EmitCXXTemporary(E->getTemporary(), E->getType(), Dest.getAddr()); } void diff --git a/lib/CodeGen/CGTemporaries.cpp b/lib/CodeGen/CGTemporaries.cpp deleted file mode 100644 index 7e9ff91a92..0000000000 --- a/lib/CodeGen/CGTemporaries.cpp +++ /dev/null @@ -1,37 +0,0 @@ -//===--- CGTemporaries.cpp - Emit LLVM Code for C++ temporaries -----------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This contains code dealing with C++ code generation of temporaries -// -//===----------------------------------------------------------------------===// - -#include "CodeGenFunction.h" -using namespace clang; -using namespace CodeGen; - -namespace { - struct DestroyTemporary : EHScopeStack::Cleanup { - const CXXDestructorDecl *dtor; - llvm::Value *addr; - DestroyTemporary(const CXXDestructorDecl *dtor, llvm::Value *addr) - : dtor(dtor), addr(addr) {} - void Emit(CodeGenFunction &CGF, Flags flags) { - CGF.EmitCXXDestructorCall(dtor, Dtor_Complete, /*ForVirtualBase=*/false, - addr); - } - }; -} - -/// Emits all the code to cause the given temporary to be cleaned up. -void CodeGenFunction::EmitCXXTemporary(const CXXTemporary *Temporary, - llvm::Value *Ptr) { - pushFullExprCleanup<DestroyTemporary>(NormalAndEHCleanup, - Temporary->getDestructor(), - Ptr); -} diff --git a/lib/CodeGen/CMakeLists.txt b/lib/CodeGen/CMakeLists.txt index ba6b284153..28e96a33fa 100644 --- a/lib/CodeGen/CMakeLists.txt +++ b/lib/CodeGen/CMakeLists.txt @@ -38,7 +38,6 @@ add_clang_library(clangCodeGen CGRecordLayoutBuilder.cpp CGRTTI.cpp CGStmt.cpp - CGTemporaries.cpp CGVTables.cpp CGVTT.cpp CodeGenAction.cpp diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 740a13e122..25436562e7 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -1781,7 +1781,8 @@ public: void EmitNewArrayInitializer(const CXXNewExpr *E, QualType elementType, llvm::Value *NewPtr, llvm::Value *NumElements); - void EmitCXXTemporary(const CXXTemporary *Temporary, llvm::Value *Ptr); + void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType, + llvm::Value *Ptr); llvm::Value *EmitCXXNewExpr(const CXXNewExpr *E); void EmitCXXDeleteExpr(const CXXDeleteExpr *E); |