]> granicus.if.org Git - clang/commitdiff
Fix a crash when compiling blocks in OpenCL with multiple
authorPekka Jaaskelainen <pekka.jaaskelainen@tut.fi>
Thu, 14 Aug 2014 09:37:50 +0000 (09:37 +0000)
committerPekka Jaaskelainen <pekka.jaaskelainen@tut.fi>
Thu, 14 Aug 2014 09:37:50 +0000 (09:37 +0000)
address spaces.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215629 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBlocks.cpp
test/CodeGen/blocks-opencl.cl [new file with mode: 0644]

index 06ad552bde492a68bbee33907adb4ac5582c1088..2fe93f87cccb18668a3f09983a2649b5d8af2dbc 100644 (file)
@@ -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<llvm::Constant*, 6> elements;
 
diff --git a/test/CodeGen/blocks-opencl.cl b/test/CodeGen/blocks-opencl.cl
new file mode 100644 (file)
index 0000000..ab80f5e
--- /dev/null
@@ -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);
+}
+