mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 17:26:06 +00:00

Currently Clang uses default address space (0) to represent private address space for OpenCL in AST. There are two issues with this: Multiple address spaces including private address space cannot be diagnosed. There is no mangling for default address space. For example, if private int* is emitted as i32 addrspace(5)* in IR. It is supposed to be mangled as PUAS5i but it is mangled as Pi instead. This patch attempts to represent OpenCL private address space explicitly in AST. It adds a new enum LangAS::opencl_private and adds it to the variable types which are implicitly private: automatic variables without address space qualifier function parameter pointee type without address space qualifier (OpenCL 1.2 and below) Differential Revision: https://reviews.llvm.org/D35082 llvm-svn: 315668
57 lines
2.2 KiB
Common Lisp
57 lines
2.2 KiB
Common Lisp
// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=yes -triple %itanium_abi_triple -emit-llvm -o - | FileCheck -check-prefixes=ASMANG,ASMAN10 %s
|
|
// RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -faddress-space-map-mangling=yes -triple %itanium_abi_triple -emit-llvm -o - | FileCheck -check-prefixes=ASMANG,ASMAN20 %s
|
|
// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=no -triple %itanium_abi_triple -emit-llvm -o - | FileCheck -check-prefixes=NOASMANG,NOASMAN10 %s
|
|
// RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -faddress-space-map-mangling=no -triple %itanium_abi_triple -emit-llvm -o - | FileCheck -check-prefixes=NOASMANG,NOASMAN20 %s
|
|
|
|
// We check that the address spaces are mangled the same in both version of OpenCL
|
|
// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=CL2.0 -emit-llvm -o - | FileCheck -check-prefix=OCL-20 %s
|
|
// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=CL1.2 -emit-llvm -o - | FileCheck -check-prefix=OCL-12 %s
|
|
|
|
// We can't name this f as private is equivalent to default
|
|
// no specifier given address space so we get multiple definition
|
|
// warnings, but we do want it for comparison purposes.
|
|
__attribute__((overloadable))
|
|
void ff(int *arg) { }
|
|
// ASMANG10: @_Z2ffPi
|
|
// ASMANG20: @_Z2ffPU3AS4i
|
|
// NOASMANG10: @_Z2ffPi
|
|
// NOASMANG20: @_Z2ffPU9CLgenerici
|
|
// OCL-20-DAG: @_Z2ffPU3AS4i
|
|
// OCL-12-DAG: @_Z2ffPi
|
|
|
|
__attribute__((overloadable))
|
|
void f(private int *arg) { }
|
|
// ASMANG: @_Z1fPi
|
|
// NOASMANG: @_Z1fPU9CLprivatei
|
|
// OCL-20-DAG: @_Z1fPi
|
|
// OCL-12-DAG: @_Z1fPi
|
|
|
|
__attribute__((overloadable))
|
|
void f(global int *arg) { }
|
|
// ASMANG: @_Z1fPU3AS1i
|
|
// NOASMANG: @_Z1fPU8CLglobali
|
|
// OCL-20-DAG: @_Z1fPU3AS1i
|
|
// OCL-12-DAG: @_Z1fPU3AS1i
|
|
|
|
__attribute__((overloadable))
|
|
void f(local int *arg) { }
|
|
// ASMANG: @_Z1fPU3AS3i
|
|
// NOASMANG: @_Z1fPU7CLlocali
|
|
// OCL-20-DAG: @_Z1fPU3AS3i
|
|
// OCL-12-DAG: @_Z1fPU3AS3i
|
|
|
|
__attribute__((overloadable))
|
|
void f(constant int *arg) { }
|
|
// ASMANG: @_Z1fPU3AS2i
|
|
// NOASMANG: @_Z1fPU10CLconstanti
|
|
// OCL-20-DAG: @_Z1fPU3AS2i
|
|
// OCL-12-DAG: @_Z1fPU3AS2i
|
|
|
|
#if __OPENCL_C_VERSION__ >= 200
|
|
__attribute__((overloadable))
|
|
void f(generic int *arg) { }
|
|
// ASMANG20: @_Z1fPU3AS4i
|
|
// NOASMANG20: @_Z1fPU9CLgenerici
|
|
// OCL-20-DAG: @_Z1fPU3AS4i
|
|
#endif
|