diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/CodeGen/CGCXX.cpp | 37 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGCXXTemp.cpp | 53 | 
2 files changed, 53 insertions, 37 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index 731e38c5146..4f9a4caee69 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -189,43 +189,6 @@ CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest,                           E->arg_begin(), E->arg_end());  } -void CodeGenFunction::PushCXXTemporary(const CXXTemporary *Temporary,  -                                       llvm::Value *Ptr) { -  LiveTemporaries.push_back(Temporary); -   -  // Make a cleanup scope and emit the destructor. -  { -    CleanupScope Scope(*this); -    -    EmitCXXDestructorCall(Temporary->getDestructor(), Dtor_Complete, Ptr); -  } -} - -RValue  -CodeGenFunction::EmitCXXExprWithTemporaries(const CXXExprWithTemporaries *E, -                                            llvm::Value *AggLoc, -                                            bool isAggLocVolatile) { -  // Keep track of the current cleanup stack depth. -  size_t CleanupStackDepth = CleanupEntries.size(); - -  unsigned OldNumLiveTemporaries = LiveTemporaries.size(); -   -  RValue RV = EmitAnyExpr(E->getSubExpr(), AggLoc, isAggLocVolatile); -   -  // Go through the temporaries backwards. -  for (unsigned i = E->getNumTemporaries(); i != 0; --i) { -    assert(LiveTemporaries.back() == E->getTemporary(i - 1)); -    LiveTemporaries.pop_back(); -  } - -  assert(OldNumLiveTemporaries == LiveTemporaries.size() && -         "Live temporary stack mismatch!"); -   -  EmitCleanupBlocks(CleanupStackDepth); - -  return RV; -} -  llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {    if (E->isArray()) {      ErrorUnsupported(E, "new[] expression"); diff --git a/clang/lib/CodeGen/CGCXXTemp.cpp b/clang/lib/CodeGen/CGCXXTemp.cpp new file mode 100644 index 00000000000..4511078e1d1 --- /dev/null +++ b/clang/lib/CodeGen/CGCXXTemp.cpp @@ -0,0 +1,53 @@ +//===--- CGCXXTemp.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; + +void CodeGenFunction::PushCXXTemporary(const CXXTemporary *Temporary,  +                                       llvm::Value *Ptr) { +  LiveTemporaries.push_back(Temporary); +   +  // Make a cleanup scope and emit the destructor. +  { +    CleanupScope Scope(*this); +    +    EmitCXXDestructorCall(Temporary->getDestructor(), Dtor_Complete, Ptr); +  } +} + +RValue  +CodeGenFunction::EmitCXXExprWithTemporaries(const CXXExprWithTemporaries *E, +                                            llvm::Value *AggLoc, +                                            bool isAggLocVolatile) { +  // Keep track of the current cleanup stack depth. +  size_t CleanupStackDepth = CleanupEntries.size(); + +  unsigned OldNumLiveTemporaries = LiveTemporaries.size(); +   +  RValue RV = EmitAnyExpr(E->getSubExpr(), AggLoc, isAggLocVolatile); +   +  // Go through the temporaries backwards. +  for (unsigned i = E->getNumTemporaries(); i != 0; --i) { +    assert(LiveTemporaries.back() == E->getTemporary(i - 1)); +    LiveTemporaries.pop_back(); +  } + +  assert(OldNumLiveTemporaries == LiveTemporaries.size() && +         "Live temporary stack mismatch!"); +   +  EmitCleanupBlocks(CleanupStackDepth); + +  return RV; +}  | 

