diff options
author | Reid Kleckner <reid@kleckner.net> | 2015-04-06 23:51:44 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2015-04-06 23:51:44 +0000 |
commit | 0ada50f17fd38aa537c80248e24a18541418d8c6 (patch) | |
tree | f7765d95d5b93aa287bbd30ad4dad8754f62cea4 /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | a85f0e82dc17687fea7534bee70ffd387d7a6953 (diff) | |
download | bcm5719-llvm-0ada50f17fd38aa537c80248e24a18541418d8c6.tar.gz bcm5719-llvm-0ada50f17fd38aa537c80248e24a18541418d8c6.zip |
[SEH] Implement filter capturing in CodeGen
While capturing filters aren't very common, we'd like to outline
__finally blocks in the frontend to simplify -O0 EH preparation and
reduce code size. Finally blocks are usually have captures, and this is
the first step towards that.
Currently we don't support capturing 'this' or VLAs.
Reviewers: majnemer
Differential Revision: http://reviews.llvm.org/D8825
llvm-svn: 234261
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 7de61e354ae..e59a50ee76c 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -279,6 +279,20 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { Builder.ClearInsertionPoint(); } + // If some of our locals escaped, insert a call to llvm.frameescape in the + // entry block. + if (!EscapedLocals.empty()) { + // Invert the map from local to index into a simple vector. There should be + // no holes. + SmallVector<llvm::Value *, 4> EscapeArgs; + EscapeArgs.resize(EscapedLocals.size()); + for (auto &Pair : EscapedLocals) + EscapeArgs[Pair.second] = Pair.first; + llvm::Function *FrameEscapeFn = llvm::Intrinsic::getDeclaration( + &CGM.getModule(), llvm::Intrinsic::frameescape); + CGBuilderTy(AllocaInsertPt).CreateCall(FrameEscapeFn, EscapeArgs); + } + // Remove the AllocaInsertPt instruction, which is just a convenience for us. llvm::Instruction *Ptr = AllocaInsertPt; AllocaInsertPt = nullptr; |