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.h | |
parent | a85f0e82dc17687fea7534bee70ffd387d7a6953 (diff) | |
download | llvm-0ada50f17fd38aa537c80248e24a18541418d8c6.zip llvm-0ada50f17fd38aa537c80248e24a18541418d8c6.tar.gz llvm-0ada50f17fd38aa537c80248e24a18541418d8c6.tar.bz2 |
[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.h')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 8d3408a..6183b49 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -877,6 +877,10 @@ private: typedef llvm::DenseMap<const Decl*, llvm::Value*> DeclMapTy; DeclMapTy LocalDeclMap; + /// Track escaped local variables with auto storage. Used during SEH + /// outlining to produce a call to llvm.frameescape. + llvm::DenseMap<llvm::AllocaInst *, int> EscapedLocals; + /// LabelMap - This keeps track of the LLVM basic block for each C label. llvm::DenseMap<const LabelDecl*, JumpDest> LabelMap; @@ -2007,6 +2011,12 @@ public: llvm::Value *EmitSEHExceptionInfo(); llvm::Value *EmitSEHAbnormalTermination(); + /// Scan the outlined statement for captures from the parent function. For + /// each capture, mark the capture as escaped and emit a call to + /// llvm.framerecover. Insert the framerecover result into the LocalDeclMap. + void EmitCapturedLocals(CodeGenFunction &ParentCGF, const Stmt *OutlinedStmt, + llvm::Value *ParentFP); + void EmitCXXForRangeStmt(const CXXForRangeStmt &S, ArrayRef<const Attr *> Attrs = None); |