1eba69b59SErich Keane // RUN: %clang_cc1 -triple spir64-unknown-unknown-sycldevice -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s 2*9324cc2cSErich Keane // CHECK: @[[LAMBDA_KERNEL3:[^\w]+]] = private unnamed_addr constant [[LAMBDA_K3_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ4mainEUlPZ4mainEUlvE_E_\00" 3eba69b59SErich Keane // CHECK: @[[INT1:[^\w]+]] = private unnamed_addr constant [[INT_SIZE:\[[0-9]+ x i8\]]] c"_ZTSi\00" 4eba69b59SErich Keane // CHECK: @[[STRING:[^\w]+]] = private unnamed_addr constant [[STRING_SIZE:\[[0-9]+ x i8\]]] c"_ZTSAppL_ZZ4mainE1jE_i\00", 5eba69b59SErich Keane // CHECK: @[[INT2:[^\w]+]] = private unnamed_addr constant [[INT_SIZE]] c"_ZTSi\00" 6*9324cc2cSErich Keane // CHECK: @[[LAMBDA_X:[^\w]+]] = private unnamed_addr constant [[LAMBDA_X_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE_\00" 7*9324cc2cSErich Keane // CHECK: @[[MACRO_X:[^\w]+]] = private unnamed_addr constant [[MACRO_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE0_\00" 8*9324cc2cSErich Keane // CHECK: @[[MACRO_Y:[^\w]+]] = private unnamed_addr constant [[MACRO_SIZE]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE1_\00" 9*9324cc2cSErich Keane // CHECK: @{{.*}} = private unnamed_addr constant [32 x i8] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE2_\00", align 1 10*9324cc2cSErich Keane // CHECK: @{{.*}} = private unnamed_addr constant [32 x i8] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE3_\00", align 1 11*9324cc2cSErich Keane // CHECK: @[[MACRO_MACRO_X:[^\w]+]] = private unnamed_addr constant [[MACRO_MACRO_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE4_\00" 12*9324cc2cSErich Keane // CHECK: @[[MACRO_MACRO_Y:[^\w]+]] = private unnamed_addr constant [[MACRO_MACRO_SIZE]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE5_\00" 13eba69b59SErich Keane // CHECK: @[[INT3:[^\w]+]] = private unnamed_addr constant [[INT_SIZE]] c"_ZTSi\00" 14*9324cc2cSErich Keane // CHECK: @[[LAMBDA:[^\w]+]] = private unnamed_addr constant [[LAMBDA_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE_\00" 15eba69b59SErich Keane // CHECK: @[[LAMBDA_IN_DEP_INT:[^\w]+]] = private unnamed_addr constant [[DEP_INT_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ28lambda_in_dependent_functionIiEvvEUlvE_\00", 16*9324cc2cSErich Keane // CHECK: @[[LAMBDA_IN_DEP_X:[^\w]+]] = private unnamed_addr constant [[DEP_LAMBDA_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_EvvEUlvE_\00", 17eba69b59SErich Keane // CHECK: @[[LAMBDA_NO_DEP:[^\w]+]] = private unnamed_addr constant [[NO_DEP_LAMBDA_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ13lambda_no_depIidEvT_T0_EUlidE_\00", 18*9324cc2cSErich Keane // CHECK: @[[LAMBDA_TWO_DEP:[^\w]+]] = private unnamed_addr constant [[DEP_LAMBDA1_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_EvvEUlvE_\00", 19*9324cc2cSErich Keane // CHECK: @[[LAMBDA_TWO_DEP2:[^\w]+]] = private unnamed_addr constant [[DEP_LAMBDA2_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_EvvEUlvE_\00", 20eba69b59SErich Keane 21eba69b59SErich Keane extern "C" void puts(const char *) {} 22eba69b59SErich Keane 23eba69b59SErich Keane template <typename T> 24eba69b59SErich Keane void template_param() { 25eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(T)); 26eba69b59SErich Keane } 27eba69b59SErich Keane 28eba69b59SErich Keane template <typename T> 29eba69b59SErich Keane void lambda_in_dependent_function() { 30eba69b59SErich Keane auto y = [] {}; 31eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(y))); 32eba69b59SErich Keane } 33eba69b59SErich Keane 34eba69b59SErich Keane template <typename Tw, typename Tz> 35eba69b59SErich Keane void lambda_two_dep() { 36eba69b59SErich Keane auto z = [] {}; 37eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(z))); 38eba69b59SErich Keane } 39eba69b59SErich Keane 40eba69b59SErich Keane template <typename Tw, typename Tz> 41eba69b59SErich Keane void lambda_no_dep(Tw a, Tz b) { 42eba69b59SErich Keane auto p = [](Tw a, Tz b) { return ((Tz)a + b); }; 43eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(p))); 44eba69b59SErich Keane } 45eba69b59SErich Keane 46eba69b59SErich Keane #define DEF_IN_MACRO() \ 47eba69b59SErich Keane auto MACRO_X = []() {}; \ 48eba69b59SErich Keane auto MACRO_Y = []() {}; \ 49eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(MACRO_X))); \ 50eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(MACRO_Y))); 51eba69b59SErich Keane 52eba69b59SErich Keane #define MACRO_CALLS_MACRO() \ 53eba69b59SErich Keane { DEF_IN_MACRO(); } \ 54eba69b59SErich Keane { DEF_IN_MACRO(); } 55eba69b59SErich Keane 56eba69b59SErich Keane template <typename Ty> 57eba69b59SErich Keane auto func() -> decltype(__builtin_sycl_unique_stable_name(decltype(Ty::str))); 58eba69b59SErich Keane 59eba69b59SErich Keane struct Derp { 60eba69b59SErich Keane static constexpr const char str[] = "derp derp derp"; 61eba69b59SErich Keane }; 62eba69b59SErich Keane 63eba69b59SErich Keane template <typename KernelName, typename KernelType> 64eba69b59SErich Keane [[clang::sycl_kernel]] void kernel_single_task(KernelType kernelFunc) { 65eba69b59SErich Keane kernelFunc(); 66eba69b59SErich Keane } 67eba69b59SErich Keane 68eba69b59SErich Keane int main() { 69eba69b59SErich Keane kernel_single_task<class kernel2>(func<Derp>); 70eba69b59SErich Keane // CHECK: call spir_func void @_Z18kernel_single_taskIZ4mainE7kernel2PFPKcvEEvT0_(i8 addrspace(4)* ()* @_Z4funcI4DerpEDTu33__builtin_sycl_unique_stable_nameDtsrT_3strEEEv) 71eba69b59SErich Keane 72eba69b59SErich Keane auto l1 = []() { return 1; }; 73eba69b59SErich Keane auto l2 = [](decltype(l1) *l = nullptr) { return 2; }; 74eba69b59SErich Keane kernel_single_task<class kernel3>(l2); 75eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(l2))); 76eba69b59SErich Keane // CHECK: call spir_func void @_Z18kernel_single_taskIZ4mainE7kernel3Z4mainEUlPZ4mainEUlvE_E_EvT0_ 77eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[LAMBDA_K3_SIZE]], [[LAMBDA_K3_SIZE]]* @[[LAMBDA_KERNEL3]], i32 0, i32 0) to i8 addrspace(4)*)) 78eba69b59SErich Keane 79eba69b59SErich Keane constexpr const char str[] = "lalala"; 80eba69b59SErich Keane static_assert(__builtin_strcmp(__builtin_sycl_unique_stable_name(decltype(str)), "_ZTSA7_Kc\0") == 0, "unexpected mangling"); 81eba69b59SErich Keane 82eba69b59SErich Keane int i = 0; 83eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(i++))); 84eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[INT_SIZE]], [[INT_SIZE]]* @[[INT1]], i32 0, i32 0) to i8 addrspace(4)*)) 85eba69b59SErich Keane 86eba69b59SErich Keane // FIXME: Ensure that j is incremented because VLAs are terrible. 87eba69b59SErich Keane int j = 55; 88eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(int[++j])); 89eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[STRING_SIZE]], [[STRING_SIZE]]* @[[STRING]], i32 0, i32 0) to i8 addrspace(4)*)) 90eba69b59SErich Keane 91eba69b59SErich Keane // CHECK: define internal spir_func void @_Z18kernel_single_taskIZ4mainE7kernel2PFPKcvEEvT0_ 92eba69b59SErich Keane // CHECK: declare spir_func i8 addrspace(4)* @_Z4funcI4DerpEDTu33__builtin_sycl_unique_stable_nameDtsrT_3strEEEv 93eba69b59SErich Keane // CHECK: define internal spir_func void @_Z18kernel_single_taskIZ4mainE7kernel3Z4mainEUlPZ4mainEUlvE_E_EvT0_ 94eba69b59SErich Keane // CHECK: define internal spir_func void @_Z18kernel_single_taskIZ4mainE6kernelZ4mainEUlvE0_EvT0_ 95eba69b59SErich Keane 96eba69b59SErich Keane kernel_single_task<class kernel>( 97eba69b59SErich Keane []() { 98eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(int)); 99eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[INT_SIZE]], [[INT_SIZE]]* @[[INT2]], i32 0, i32 0) to i8 addrspace(4)*)) 100eba69b59SErich Keane 101eba69b59SErich Keane auto x = []() {}; 102eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(x))); 103eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[LAMBDA_X_SIZE]], [[LAMBDA_X_SIZE]]* @[[LAMBDA_X]], i32 0, i32 0) to i8 addrspace(4)*)) 104eba69b59SErich Keane 105eba69b59SErich Keane DEF_IN_MACRO(); 106eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[MACRO_SIZE]], [[MACRO_SIZE]]* @[[MACRO_X]], i32 0, i32 0) to i8 addrspace(4)*)) 107eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[MACRO_SIZE]], [[MACRO_SIZE]]* @[[MACRO_Y]], i32 0, i32 0) to i8 addrspace(4)*)) 108eba69b59SErich Keane 109eba69b59SErich Keane MACRO_CALLS_MACRO(); 110eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[MACRO_MACRO_SIZE]], [[MACRO_MACRO_SIZE]]* @[[MACRO_MACRO_X]], i32 0, i32 0) to i8 addrspace(4)*)) 111eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[MACRO_MACRO_SIZE]], [[MACRO_MACRO_SIZE]]* @[[MACRO_MACRO_Y]], i32 0, i32 0) to i8 addrspace(4)*)) 112eba69b59SErich Keane 113eba69b59SErich Keane template_param<int>(); 114eba69b59SErich Keane // CHECK: call spir_func void @_Z14template_paramIiEvv 115eba69b59SErich Keane 116eba69b59SErich Keane template_param<decltype(x)>(); 117eba69b59SErich Keane // CHECK: call spir_func void @_Z14template_paramIZZ4mainENKUlvE0_clEvEUlvE_Evv 118eba69b59SErich Keane 119eba69b59SErich Keane lambda_in_dependent_function<int>(); 120eba69b59SErich Keane // CHECK: call spir_func void @_Z28lambda_in_dependent_functionIiEvv 121eba69b59SErich Keane 122eba69b59SErich Keane lambda_in_dependent_function<decltype(x)>(); 123eba69b59SErich Keane // CHECK: call spir_func void @_Z28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_Evv 124eba69b59SErich Keane 125eba69b59SErich Keane lambda_no_dep<int, double>(3, 5.5); 126eba69b59SErich Keane // CHECK: call spir_func void @_Z13lambda_no_depIidEvT_T0_(i32 3, double 5.500000e+00) 127eba69b59SErich Keane 128eba69b59SErich Keane int a = 5; 129eba69b59SErich Keane double b = 10.7; 130eba69b59SErich Keane auto y = [](int a) { return a; }; 131eba69b59SErich Keane auto z = [](double b) { return b; }; 132eba69b59SErich Keane lambda_two_dep<decltype(y), decltype(z)>(); 133eba69b59SErich Keane // CHECK: call spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_Evv 134eba69b59SErich Keane 135eba69b59SErich Keane lambda_two_dep<decltype(z), decltype(y)>(); 136eba69b59SErich Keane // CHECK: call spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_Evv 137eba69b59SErich Keane }); 138eba69b59SErich Keane } 139eba69b59SErich Keane 140eba69b59SErich Keane // CHECK: define linkonce_odr spir_func void @_Z14template_paramIiEvv 141eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[INT_SIZE]], [[INT_SIZE]]* @[[INT3]], i32 0, i32 0) to i8 addrspace(4)*)) 142eba69b59SErich Keane 143eba69b59SErich Keane // CHECK: define internal spir_func void @_Z14template_paramIZZ4mainENKUlvE0_clEvEUlvE_Evv 144eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[LAMBDA_SIZE]], [[LAMBDA_SIZE]]* @[[LAMBDA]], i32 0, i32 0) to i8 addrspace(4)*)) 145eba69b59SErich Keane 146eba69b59SErich Keane // CHECK: define linkonce_odr spir_func void @_Z28lambda_in_dependent_functionIiEvv 147eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[DEP_INT_SIZE]], [[DEP_INT_SIZE]]* @[[LAMBDA_IN_DEP_INT]], i32 0, i32 0) to i8 addrspace(4)*)) 148eba69b59SErich Keane 149eba69b59SErich Keane // CHECK: define internal spir_func void @_Z28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_Evv 150eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[DEP_LAMBDA_SIZE]], [[DEP_LAMBDA_SIZE]]* @[[LAMBDA_IN_DEP_X]], i32 0, i32 0) to i8 addrspace(4)*)) 151eba69b59SErich Keane 152eba69b59SErich Keane // CHECK: define linkonce_odr spir_func void @_Z13lambda_no_depIidEvT_T0_(i32 %a, double %b) 153eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[NO_DEP_LAMBDA_SIZE]], [[NO_DEP_LAMBDA_SIZE]]* @[[LAMBDA_NO_DEP]], i32 0, i32 0) to i8 addrspace(4)*)) 154eba69b59SErich Keane 155eba69b59SErich Keane // CHECK: define internal spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_Evv 156eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[DEP_LAMBDA1_SIZE]], [[DEP_LAMBDA1_SIZE]]* @[[LAMBDA_TWO_DEP]], i32 0, i32 0) to i8 addrspace(4)*)) 157eba69b59SErich Keane 158eba69b59SErich Keane // CHECK: define internal spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_Evv 159eba69b59SErich Keane // CHECK: call spir_func void @puts(i8 addrspace(4)* addrspacecast (i8* getelementptr inbounds ([[DEP_LAMBDA2_SIZE]], [[DEP_LAMBDA2_SIZE]]* @[[LAMBDA_TWO_DEP2]], i32 0, i32 0) to i8 addrspace(4)*)) 160