diff options
author | Reid Kleckner <reid@kleckner.net> | 2015-04-29 17:17:17 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2015-04-29 17:17:17 +0000 |
commit | 0bb12a89815932c862bd6e0650b5e46e4c4321ec (patch) | |
tree | 4c155549422f68d1892633412aeacb70a5a15273 /clang/lib/CodeGen/CodeGenFunction.h | |
parent | ddf3a0ef38f4e53ecbfc71cbf831c31521925e63 (diff) | |
download | llvm-0bb12a89815932c862bd6e0650b5e46e4c4321ec.zip llvm-0bb12a89815932c862bd6e0650b5e46e4c4321ec.tar.gz llvm-0bb12a89815932c862bd6e0650b5e46e4c4321ec.tar.bz2 |
Re-land r236052, the linker errors were fixed by LLVM r236123
Basic __finally blocks don't cause linker errors anymore (although they
are miscompiled).
llvm-svn: 236128
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.h')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 7eca347..8a007d5 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -310,7 +310,13 @@ public: /// write the current selector value into this alloca. llvm::AllocaInst *EHSelectorSlot; - llvm::AllocaInst *AbnormalTerminationSlot; + /// Entering and leaving an SEH __try / __finally scope causes stores to this + /// slot. + llvm::Value *ChildAbnormalTerminationSlot; + + /// The SEH __abnormal_termination() intrinsic lowers down to loads from this + /// slot from a parent function. + llvm::Value *AbnormalTerminationSlot; /// The implicit parameter to SEH filter functions of type /// 'EXCEPTION_POINTERS*'. @@ -2033,8 +2039,16 @@ public: /// 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 EmitCapturedLocals(CodeGenFunction &ParentCGF, const Stmt *OutlinedStmt); + + /// Recovers the address of a local in a parent function. ParentVar is the + /// address of the variable used in the immediate parent function. It can + /// either be an alloca or a call to llvm.framerecover if there are nested + /// outlined functions. ParentFP is the frame pointer of the outermost parent + /// frame. + llvm::Value *recoverAddrOfEscapedLocal(CodeGenFunction &ParentCGF, + llvm::Value *ParentVar, + llvm::Value *ParentFP); void EmitCXXForRangeStmt(const CXXForRangeStmt &S, ArrayRef<const Attr *> Attrs = None); |