170 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-linux-pc -fsycl-is-host -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s2// CHECK: @[[LAMBDA_KERNEL3:[^\w]+]] = private unnamed_addr constant [[LAMBDA_K3_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ4mainEUlPZ4mainEUlvE_E_\00"3// CHECK: @[[INT1:[^\w]+]] = private unnamed_addr constant [[INT_SIZE:\[[0-9]+ x i8\]]] c"_ZTSi\00"4// CHECK: @[[STRING:[^\w]+]] = private unnamed_addr constant [[STRING_SIZE:\[[0-9]+ x i8\]]] c"_ZTSAppL_ZZ4mainE1jE_i\00",5// CHECK: @[[INT2:[^\w]+]] = private unnamed_addr constant [[INT_SIZE]] c"_ZTSi\00"6// CHECK: @[[LAMBDA_X:[^\w]+]] = private unnamed_addr constant [[LAMBDA_X_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE_\00"7// CHECK: @[[MACRO_X:[^\w]+]] = private unnamed_addr constant [[MACRO_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE0_\00"8// CHECK: @[[MACRO_Y:[^\w]+]] = private unnamed_addr constant [[MACRO_SIZE]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE1_\00"9// CHECK: @{{.*}} = private unnamed_addr constant [32 x i8] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE2_\00", align 110// CHECK: @{{.*}} = private unnamed_addr constant [32 x i8] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE3_\00", align 111// CHECK: @[[MACRO_MACRO_X:[^\w]+]] = private unnamed_addr constant [[MACRO_MACRO_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE4_\00"12// CHECK: @[[MACRO_MACRO_Y:[^\w]+]] = private unnamed_addr constant [[MACRO_MACRO_SIZE]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE5_\00"13// CHECK: @[[INT3:[^\w]+]] = private unnamed_addr constant [[INT_SIZE]] c"_ZTSi\00"14// CHECK: @[[LAMBDA:[^\w]+]] = private unnamed_addr constant [[LAMBDA_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE_\00"15// CHECK: @[[LAMBDA_IN_DEP_INT:[^\w]+]] = private unnamed_addr constant [[DEP_INT_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ28lambda_in_dependent_functionIiEvvEUlvE_\00",16// 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",17// 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// 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// 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",20 21extern "C" void puts(const char *) {}22 23template <typename T>24void template_param() {25 puts(__builtin_sycl_unique_stable_name(T));26}27 28template <typename T>29void lambda_in_dependent_function() {30 auto y = [] {};31 puts(__builtin_sycl_unique_stable_name(decltype(y)));32}33 34template <typename Tw, typename Tz>35void lambda_two_dep() {36 auto z = [] {};37 puts(__builtin_sycl_unique_stable_name(decltype(z)));38}39 40template <typename Tw, typename Tz>41void lambda_no_dep(Tw a, Tz b) {42 auto p = [](Tw a, Tz b) { return ((Tz)a + b); };43 puts(__builtin_sycl_unique_stable_name(decltype(p)));44}45 46#define DEF_IN_MACRO() \47 auto MACRO_X = []() {}; \48 auto MACRO_Y = []() {}; \49 puts(__builtin_sycl_unique_stable_name(decltype(MACRO_X))); \50 puts(__builtin_sycl_unique_stable_name(decltype(MACRO_Y)));51 52#define MACRO_CALLS_MACRO() \53 { DEF_IN_MACRO(); } \54 { DEF_IN_MACRO(); }55 56template <typename Ty>57auto func() -> decltype(__builtin_sycl_unique_stable_name(decltype(Ty::str)));58 59struct Derp {60 static constexpr const char str[] = "derp derp derp";61};62 63template <typename KernelName, typename KernelType>64[[clang::sycl_kernel]] void kernel_single_task(KernelType kernelFunc) {65 kernelFunc();66}67 68template<typename KernelType>69void unnamed_kernel_single_task(KernelType kernelFunc) {70 kernel_single_task<KernelType>(kernelFunc);71}72 73template <typename KernelName, typename KernelType>74void not_kernel_single_task(KernelType kernelFunc) {75 kernelFunc();76}77 78int main() {79 not_kernel_single_task<class kernel2>(func<Derp>);80 // CHECK: call void @_Z22not_kernel_single_taskIZ4mainE7kernel2PFPKcvEEvT0_(ptr noundef @_Z4funcI4DerpEDTu33__builtin_sycl_unique_stable_nameDtsrT_3strEEEv)81 82 auto l1 = []() { return 1; };83 auto l2 = [](decltype(l1) *l = nullptr) { return 2; };84 kernel_single_task<decltype(l2)>(l2);85 puts(__builtin_sycl_unique_stable_name(decltype(l2)));86 // CHECK: call void @_Z18kernel_single_taskIZ4mainEUlPZ4mainEUlvE_E_S2_EvT0_87 // CHECK: call void @puts(ptr noundef @[[LAMBDA_KERNEL3]])88 89 constexpr const char str[] = "lalala";90 static_assert(__builtin_strcmp(__builtin_sycl_unique_stable_name(decltype(str)), "_ZTSA7_Kc\0") == 0, "unexpected mangling");91 92 int i = 0;93 puts(__builtin_sycl_unique_stable_name(decltype(i++)));94 // CHECK: call void @puts(ptr noundef @[[INT1]])95 96 // FIXME: Ensure that j is incremented because VLAs are terrible.97 int j = 55;98 puts(__builtin_sycl_unique_stable_name(int[++j]));99 // CHECK: call void @puts(ptr noundef @[[STRING]])100 101 // CHECK: define internal void @_Z22not_kernel_single_taskIZ4mainE7kernel2PFPKcvEEvT0_102 // CHECK: declare noundef ptr @_Z4funcI4DerpEDTu33__builtin_sycl_unique_stable_nameDtsrT_3strEEEv103 // CHECK: define internal void @_Z18kernel_single_taskIZ4mainEUlPZ4mainEUlvE_E_S2_EvT0_104 // CHECK: define internal void @_Z18kernel_single_taskIZ4mainEUlvE0_S0_EvT0_105 106 unnamed_kernel_single_task(107 []() {108 puts(__builtin_sycl_unique_stable_name(int));109 // CHECK: call void @puts(ptr noundef @[[INT2]])110 111 auto x = []() {};112 puts(__builtin_sycl_unique_stable_name(decltype(x)));113 // CHECK: call void @puts(ptr noundef @[[LAMBDA_X]])114 115 DEF_IN_MACRO();116 // CHECK: call void @puts(ptr noundef @[[MACRO_X]])117 // CHECK: call void @puts(ptr noundef @[[MACRO_Y]])118 119 MACRO_CALLS_MACRO();120 // CHECK: call void @puts(ptr noundef @[[MACRO_MACRO_X]])121 // CHECK: call void @puts(ptr noundef @[[MACRO_MACRO_Y]])122 123 template_param<int>();124 // CHECK: call void @_Z14template_paramIiEvv125 126 template_param<decltype(x)>();127 // CHECK: call void @_Z14template_paramIZZ4mainENKUlvE0_clEvEUlvE_Evv128 129 lambda_in_dependent_function<int>();130 // CHECK: call void @_Z28lambda_in_dependent_functionIiEvv131 132 lambda_in_dependent_function<decltype(x)>();133 // CHECK: call void @_Z28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_Evv134 135 lambda_no_dep<int, double>(3, 5.5);136 // CHECK: call void @_Z13lambda_no_depIidEvT_T0_(i32 noundef 3, double noundef 5.500000e+00)137 138 int a = 5;139 double b = 10.7;140 auto y = [](int a) { return a; };141 auto z = [](double b) { return b; };142 lambda_two_dep<decltype(y), decltype(z)>();143 // CHECK: call void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_Evv144 145 lambda_two_dep<decltype(z), decltype(y)>();146 // CHECK: call void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_Evv147 });148}149 150// CHECK: define linkonce_odr void @_Z14template_paramIiEvv151// CHECK: call void @puts(ptr noundef @[[INT3]])152 153// CHECK: define internal void @_Z14template_paramIZZ4mainENKUlvE0_clEvEUlvE_Evv154// CHECK: call void @puts(ptr noundef @[[LAMBDA]])155 156// CHECK: define linkonce_odr void @_Z28lambda_in_dependent_functionIiEvv157// CHECK: call void @puts(ptr noundef @[[LAMBDA_IN_DEP_INT]])158 159// CHECK: define internal void @_Z28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_Evv160// CHECK: call void @puts(ptr noundef @[[LAMBDA_IN_DEP_X]])161 162// CHECK: define linkonce_odr void @_Z13lambda_no_depIidEvT_T0_(i32 noundef %a, double noundef %b)163// CHECK: call void @puts(ptr noundef @[[LAMBDA_NO_DEP]])164 165// CHECK: define internal void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_Evv166// CHECK: call void @puts(ptr noundef @[[LAMBDA_TWO_DEP]])167 168// CHECK: define internal void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_Evv169// CHECK: call void @puts(ptr noundef @[[LAMBDA_TWO_DEP2]])170