diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 19 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 2 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 3 |
3 files changed, 24 insertions, 0 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index a0a8d667df..20b5c9bed0 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -25,6 +25,22 @@ using namespace clang; using namespace CodeGen; +struct CallMemsetLocalBlockObject : EHScopeStack::Cleanup { + llvm::AllocaInst *BlockAddr; + CharUnits BlockSize; + + CallMemsetLocalBlockObject(llvm::AllocaInst *blockAddr, + CharUnits blocSize) + : BlockAddr(blockAddr), BlockSize(blocSize) {} + + void Emit(CodeGenFunction &CGF, bool isForEH) { + CGF.Builder.CreateMemSet(BlockAddr, + llvm::ConstantInt::get(CGF.Int8Ty, 0xCD), + BlockSize.getQuantity(), + BlockAddr->getAlignment()); + } +}; + CGBlockInfo::CGBlockInfo(const BlockExpr *blockExpr, const char *N) : Name(N), CXXThisIndex(0), CanBeGlobal(false), NeedsCopyDispose(false), HasCXXObject(false), UsesStret(false), StructureType(0), Block(blockExpr) { @@ -649,6 +665,9 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const BlockExpr *blockExpr) { llvm::Value *result = Builder.CreateBitCast(blockAddr, ConvertType(blockInfo.getBlockExpr()->getType())); + if (getLangOptions().ResetLocalBlocks) + EHStack.pushCleanup<CallMemsetLocalBlockObject>(NormalCleanup, blockAddr, + blockInfo.BlockSize); return result; } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 41be873b35..d384c2b739 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1709,6 +1709,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_fno_blocks))) { CmdArgs.push_back("-fblocks"); } + if (Args.hasArg(options::OPT_freset_local_blocks)) + CmdArgs.push_back("-freset-local-blocks"); // -faccess-control is default. if (Args.hasFlag(options::OPT_fno_access_control, diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 12e51a61e1..f2ca212b3a 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -638,6 +638,8 @@ static void LangOptsToArgs(const LangOptions &Opts, Res.push_back("-pthread"); if (Opts.Blocks) Res.push_back("-fblocks"); + if (Opts.ResetLocalBlocks) + Res.push_back("-freset-local-blocks"); if (Opts.EmitAllDecls) Res.push_back("-femit-all-decls"); if (Opts.MathErrno) @@ -1612,6 +1614,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.RTTI = !Args.hasArg(OPT_fno_rtti); Opts.Blocks = Args.hasArg(OPT_fblocks); + Opts.ResetLocalBlocks = Args.hasArg(OPT_freset_local_blocks); Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); Opts.ShortEnums = Args.hasArg(OPT_fshort_enums); |