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) {
llvm::Value *result =
Builder.CreateBitCast(blockAddr,
ConvertType(blockInfo.getBlockExpr()->getType()));
- if (getLangOptions().CatchUndefined)
- EHStack.pushCleanup<CallMemsetLocalBlockObject>(NormalCleanup, blockAddr,
- blockInfo.BlockSize);
return result;
}
+++ /dev/null
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fcatch-undefined-behavior -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)