diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGCXXTemp.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 25 |
2 files changed, 26 insertions, 3 deletions
diff --git a/lib/CodeGen/CGCXXTemp.cpp b/lib/CodeGen/CGCXXTemp.cpp index 4511078e1d..59ed3bbc60 100644 --- a/lib/CodeGen/CGCXXTemp.cpp +++ b/lib/CodeGen/CGCXXTemp.cpp @@ -17,7 +17,7 @@ using namespace CodeGen; void CodeGenFunction::PushCXXTemporary(const CXXTemporary *Temporary, llvm::Value *Ptr) { - LiveTemporaries.push_back(Temporary); + LiveTemporaries.push_back(CXXLiveTemporaryInfo(Temporary, Ptr, 0, 0)); // Make a cleanup scope and emit the destructor. { @@ -40,7 +40,7 @@ CodeGenFunction::EmitCXXExprWithTemporaries(const CXXExprWithTemporaries *E, // Go through the temporaries backwards. for (unsigned i = E->getNumTemporaries(); i != 0; --i) { - assert(LiveTemporaries.back() == E->getTemporary(i - 1)); + assert(LiveTemporaries.back().Temporary == E->getTemporary(i - 1)); LiveTemporaries.pop_back(); } diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index b7894a4068..97ca81bc2b 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -239,7 +239,30 @@ private: /// 'this' declaration. ImplicitParamDecl *CXXThisDecl; - llvm::SmallVector<const CXXTemporary*, 4> LiveTemporaries; + /// CXXLiveTemporaryInfo - Holds information about a live C++ temporary. + struct CXXLiveTemporaryInfo { + /// Temporary - The live temporary. + const CXXTemporary *Temporary; + + /// ThisPtr - The pointer to the temporary. + llvm::Value *ThisPtr; + + /// DtorBlock - The destructor block. + llvm::BasicBlock *DtorBlock; + + /// CondPtr - If this is a conditional temporary, this is the pointer to + /// the condition variable that states whether the destructor should be + /// called or not. + llvm::Value *CondPtr; + + CXXLiveTemporaryInfo(const CXXTemporary *temporary, + llvm::Value *thisptr, llvm::Value *condptr, + llvm::BasicBlock *dtorblock) + : Temporary(temporary), ThisPtr(thisptr), DtorBlock(dtorblock), + CondPtr(condptr) { } + }; + + llvm::SmallVector<CXXLiveTemporaryInfo, 4> LiveTemporaries; public: CodeGenFunction(CodeGenModule &cgm); |