diff options
author | Reid Kleckner <reid@kleckner.net> | 2015-04-08 22:23:48 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2015-04-08 22:23:48 +0000 |
commit | 31a1bb0c146aae195308b4b1c8154ba5aced80ce (patch) | |
tree | 604d39172a63bb41222886880411ef3053ccb158 /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | ed6b5fc4b0ef3b277d9e2309323dcb3c6c4b4bd6 (diff) | |
download | bcm5719-llvm-31a1bb0c146aae195308b4b1c8154ba5aced80ce.tar.gz bcm5719-llvm-31a1bb0c146aae195308b4b1c8154ba5aced80ce.zip |
Reland "[SEH] Implement filter capturing in CodeGen"
The test should be fixed. It was failing in NDEBUG builds due to a
missing '*' character in a regex. In asserts builds, the pattern matched
a single digit value, which became a double digit value in NDEBUG
builds. Go figure.
This reverts commit r234261.
llvm-svn: 234447
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; |