diff options
author | Arnaud A. de Grandmaison <arnaud.degrandmaison@arm.com> | 2014-10-02 12:19:51 +0000 |
---|---|---|
committer | Arnaud A. de Grandmaison <arnaud.degrandmaison@arm.com> | 2014-10-02 12:19:51 +0000 |
commit | 42d314d1ba7fd02da1784c2a2e26e7a91a6ef1b4 (patch) | |
tree | 210dca4280865c7a7848760ce67e68e2559eb43e /clang/lib/CodeGen/CodeGenFunction.h | |
parent | 4ae7f2e839957dbb1f7bc38f524adf6c6d4b416a (diff) | |
download | llvm-42d314d1ba7fd02da1784c2a2e26e7a91a6ef1b4.zip llvm-42d314d1ba7fd02da1784c2a2e26e7a91a6ef1b4.tar.gz llvm-42d314d1ba7fd02da1784c2a2e26e7a91a6ef1b4.tar.bz2 |
Emit lifetime.start / lifetime.end markers for unnamed temporary objects.
This will give more information to the optimizers so that they can reuse stack slots
and reduce stack usage.
llvm-svn: 218865
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.h')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 2709a36..a4171a0 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -444,6 +444,23 @@ public: new (Buffer + sizeof(Header)) T(a0, a1, a2, a3); } + /// \brief Queue a cleanup to be pushed after finishing the current + /// full-expression. + template <class T, class A0, class A1> + void pushCleanupAfterFullExpr(CleanupKind Kind, A0 a0, A1 a1) { + assert(!isInConditionalBranch() && "can't defer conditional cleanup"); + + LifetimeExtendedCleanupHeader Header = { sizeof(T), Kind }; + + size_t OldSize = LifetimeExtendedCleanupStack.size(); + LifetimeExtendedCleanupStack.resize( + LifetimeExtendedCleanupStack.size() + sizeof(Header) + Header.Size); + + char *Buffer = &LifetimeExtendedCleanupStack[OldSize]; + new (Buffer) LifetimeExtendedCleanupHeader(Header); + new (Buffer + sizeof(Header)) T(a0, a1); + } + /// Set up the last cleaup that was pushed as a conditional /// full-expression cleanup. void initFullExprCleanup(); @@ -596,6 +613,10 @@ public: void PopCleanupBlocks(EHScopeStack::stable_iterator OldCleanupStackSize, size_t OldLifetimeExtendedStackSize); + /// \brief Moves deferred cleanups from lifetime-extended variables from + /// the given position on top of the stack + void MoveDeferedCleanups(size_t OldLifetimeExtendedSize); + void ResolveBranchFixups(llvm::BasicBlock *Target); /// The given basic block lies in the current EH scope, but may be a @@ -1112,6 +1133,9 @@ public: void pushLifetimeExtendedDestroy(CleanupKind kind, llvm::Value *addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray); + void pushLifetimeEndMarker(StorageDuration SD, + llvm::Value *ReferenceTemporary, + llvm::Value *SizeForLifeTimeMarkers); void pushStackRestore(CleanupKind kind, llvm::Value *SPMem); void emitDestroy(llvm::Value *addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray); @@ -1715,6 +1739,9 @@ public: void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType, llvm::Value *Ptr); + llvm::Value *EmitLifetimeStart(uint64_t Size, llvm::Value *Addr); + void EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr); + llvm::Value *EmitCXXNewExpr(const CXXNewExpr *E); void EmitCXXDeleteExpr(const CXXDeleteExpr *E); |