[cfe-commits] r134045 - in /cfe/trunk: include/clang/Basic/LangOptions.h include/clang/Driver/CC1Options.td include/clang/Driver/Options.td lib/CodeGen/CGBlocks.cpp lib/Driver/Tools.cpp lib/Frontend/CompilerInvocation.cpp test/CodeGen/reset-local-block.c
Fariborz Jahanian
fjahanian at apple.com
Tue Jun 28 16:51:26 PDT 2011
Author: fjahanian
Date: Tue Jun 28 18:51:26 2011
New Revision: 134045
URL: http://llvm.org/viewvc/llvm-project?rev=134045&view=rev
Log:
Under a compiler flag, -freset-local-blocks,
wipe out stack blocks when they go out of scope.
// rdar://9227352
Added:
cfe/trunk/test/CodeGen/reset-local-block.c
Modified:
cfe/trunk/include/clang/Basic/LangOptions.h
cfe/trunk/include/clang/Driver/CC1Options.td
cfe/trunk/include/clang/Driver/Options.td
cfe/trunk/lib/CodeGen/CGBlocks.cpp
cfe/trunk/lib/Driver/Tools.cpp
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
Modified: cfe/trunk/include/clang/Basic/LangOptions.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=134045&r1=134044&r2=134045&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/LangOptions.h (original)
+++ cfe/trunk/include/clang/Basic/LangOptions.h Tue Jun 28 18:51:26 2011
@@ -72,6 +72,7 @@
unsigned POSIXThreads : 1; // Compiling with POSIX thread support
// (-pthread)
unsigned Blocks : 1; // block extension to C
+ unsigned ResetLocalBlocks : 1; // reset local blocks going out of scope
unsigned EmitAllDecls : 1; // Emit all declarations, even if
// they are unused.
unsigned MathErrno : 1; // Math functions must respect errno
@@ -198,7 +199,7 @@
ThreadsafeStatics = 1;
POSIXThreads = 0;
- Blocks = 0;
+ Blocks = ResetLocalBlocks = 0;
EmitAllDecls = 0;
MathErrno = 1;
SignedOverflowBehavior = SOB_Undefined;
Modified: cfe/trunk/include/clang/Driver/CC1Options.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=134045&r1=134044&r2=134045&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)
+++ cfe/trunk/include/clang/Driver/CC1Options.td Tue Jun 28 18:51:26 2011
@@ -444,6 +444,8 @@
HelpText<"Emit all declarations, even if unused">;
def fblocks : Flag<"-fblocks">,
HelpText<"enable the 'blocks' language feature">;
+def freset_local_blocks : Flag<"-freset-local-blocks">,
+ HelpText<"reset local blocks when they go out of scope">;
def fheinous_gnu_extensions : Flag<"-fheinous-gnu-extensions">;
def fexceptions : Flag<"-fexceptions">,
HelpText<"Enable support for exception handling">;
Modified: cfe/trunk/include/clang/Driver/Options.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=134045&r1=134044&r2=134045&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Options.td (original)
+++ cfe/trunk/include/clang/Driver/Options.td Tue Jun 28 18:51:26 2011
@@ -259,6 +259,7 @@
def fast : Flag<"-fast">, Group<f_Group>;
def fasynchronous_unwind_tables : Flag<"-fasynchronous-unwind-tables">, Group<f_Group>;
def fblocks : Flag<"-fblocks">, Group<f_Group>;
+def freset_local_blocks : Flag<"-freset-local-blocks">, Group<f_Group>;
def fbootclasspath_EQ : Joined<"-fbootclasspath=">, Group<f_Group>;
def fborland_extensions : Flag<"-fborland-extensions">, Group<f_Group>;
def fbuiltin_strcat : Flag<"-fbuiltin-strcat">, Group<f_Group>;
Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=134045&r1=134044&r2=134045&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Tue Jun 28 18:51:26 2011
@@ -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 *result =
Builder.CreateBitCast(blockAddr,
ConvertType(blockInfo.getBlockExpr()->getType()));
+ if (getLangOptions().ResetLocalBlocks)
+ EHStack.pushCleanup<CallMemsetLocalBlockObject>(NormalCleanup, blockAddr,
+ blockInfo.BlockSize);
return result;
}
Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=134045&r1=134044&r2=134045&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Tue Jun 28 18:51:26 2011
@@ -1709,6 +1709,8 @@
!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,
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=134045&r1=134044&r2=134045&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Tue Jun 28 18:51:26 2011
@@ -638,6 +638,8 @@
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 @@
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);
Added: cfe/trunk/test/CodeGen/reset-local-block.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/reset-local-block.c?rev=134045&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/reset-local-block.c (added)
+++ cfe/trunk/test/CodeGen/reset-local-block.c Tue Jun 28 18:51:26 2011
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -freset-local-blocks -o - %s | FileCheck %s
+// rdar://9227352
+
+typedef int (^BLOCK)();
+
+BLOCK FUNC() {
+ int i;
+ double d;
+ BLOCK block = ^{ return i + (int)d; };
+ if (!block)
+ block = ^{ return i; };
+ return block;
+}
+
+//CHECK: call void @llvm.memset{{.*}}, i8 -51, i64 36, i32 8, i1 false)
+//CHECK: call void @llvm.memset{{.*}}, i8 -51, i64 44, i32 8, i1 false)
More information about the cfe-commits
mailing list