From: Bill Wendling Date: Wed, 20 Aug 2014 07:39:19 +0000 (+0000) Subject: It fixes a regression with multiple address spaces in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a854770c0cd0332061ca0db9258e42f3e010859;p=clang It fixes a regression with multiple address spaces in OpenCL and blocks. Patch by Pekka. git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_35@216049 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 7ffebe2891..72fde9dc55 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -78,7 +78,13 @@ static llvm::Constant *buildBlockDescriptor(CodeGenModule &CGM, ASTContext &C = CGM.getContext(); llvm::Type *ulong = CGM.getTypes().ConvertType(C.UnsignedLongTy); - llvm::Type *i8p = CGM.getTypes().ConvertType(C.VoidPtrTy); + llvm::Type *i8p = NULL; + if (CGM.getLangOpts().OpenCL) + i8p = + llvm::Type::getInt8PtrTy( + CGM.getLLVMContext(), C.getTargetAddressSpace(LangAS::opencl_constant)); + else + i8p = CGM.getTypes().ConvertType(C.VoidPtrTy); SmallVector elements; diff --git a/test/CodeGen/blocks-opencl.cl b/test/CodeGen/blocks-opencl.cl new file mode 100644 index 0000000000..ab80f5eb7a --- /dev/null +++ b/test/CodeGen/blocks-opencl.cl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -O0 %s -ffake-address-space-map -emit-llvm -o - -fblocks -triple x86_64-unknown-unknown | FileCheck %s +// This used to crash due to trying to generate a bitcase from a cstring +// in the constant address space to i8* in AS0. + +void dummy(float (^op)(float)) +{ +} + +// CHECK: i8 addrspace(3)* getelementptr inbounds ([9 x i8] addrspace(3)* @.str, i32 0, i32 0) + +kernel void test_block() +{ + float (^X)(float) = ^(float x) { return x + 42.0f; }; + dummy(X); +} +