diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index e8b8f2859cc6b..b7cbc56e5c988 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -336,7 +336,8 @@ class SYCLIntegrationHeader { /// Adds a kernel parameter descriptor to current kernel invocation /// descriptor. - void addParamDesc(kernel_param_kind_t Kind, int Info, unsigned Offset); + void addParamDesc(kernel_param_kind_t Kind, int Info, unsigned Offset, + unsigned NumOpenCLParams); /// Signals that addition of parameter descriptors to current kernel /// invocation descriptor has finished. @@ -358,8 +359,9 @@ class SYCLIntegrationHeader { int Info = 0; // Offset of the captured parameter value in the lambda or function object. unsigned Offset = 0; - - KernelParamDesc() = default; + // NumOpenCLParams to capture number of parameters in Accessor __init + // method. + unsigned NumOpenCLParams = 1; }; // Kernel invocation descriptor diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index c8fd21d3eccc6..7efd3fc29d120 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1765,6 +1765,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { void addParam(const FieldDecl *FD, QualType ArgTy, SYCLIntegrationHeader::kernel_param_kind_t Kind) { + assert(Kind != SYCLIntegrationHeader::kind_accessor && + "Kernel parameter should not be an Accessor"); uint64_t Size; const ConstantArrayType *CAT = SemaRef.getASTContext().getAsConstantArrayType(ArgTy); @@ -1772,7 +1774,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { ArgTy = CAT->getElementType(); Size = SemaRef.getASTContext().getTypeSizeInChars(ArgTy).getQuantity(); Header.addParamDesc(Kind, static_cast(Size), - static_cast(CurOffset)); + static_cast(CurOffset), + /*NumOpenCLParams=*/1); } public: @@ -1783,6 +1786,13 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { Header.startKernel(Name, NameType, StableName, KernelObj->getLocation()); } + unsigned getNumOpenCLParams(const CXXRecordDecl *AccessorTy) { + assert(AccessorTy && "Accessor type must be a C++ record type"); + CXXMethodDecl *InitMethod = getMethodByName(AccessorTy, InitMethodName); + assert(InitMethod && "accessor must have __init method"); + return InitMethod->param_size(); + } + bool handleSyclAccessorType(const CXXBaseSpecifier &BC, QualType FieldTy) final { const auto *AccTy = @@ -1792,7 +1802,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { int Dims = static_cast( AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue()); int Info = getAccessTarget(AccTy) | (Dims << 11); - Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset); + Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset, + getNumOpenCLParams(AccTy)); return true; } @@ -1804,7 +1815,8 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { int Dims = static_cast( AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue()); int Info = getAccessTarget(AccTy) | (Dims << 11); - Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset); + Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset, + getNumOpenCLParams(AccTy)); return true; } @@ -1813,11 +1825,11 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { assert(SamplerTy && "Sampler type must be a C++ record type"); CXXMethodDecl *InitMethod = getMethodByName(SamplerTy, InitMethodName); assert(InitMethod && "sampler must have __init method"); - // sampler __init method has only one argument + assert((InitMethod->param_size() == 1) && + "sampler __init method should have only one argument"); const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); assert(SamplerArg && "sampler __init method must have sampler parameter"); - addParam(FD, SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler); return true; } @@ -2682,19 +2694,43 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { } O << "};\n\n"; + O << "// array representing kernel parameters used in all kernels defined in " + "the\n"; + O << "// corresponding source\n"; + O << "static constexpr\n"; + O << "const bool param_omit_table[] = {\n"; + O << " // OMIT_TABLE_BEGIN\n"; + for (const KernelDesc &K : KernelDescs) { + O << " //--- " << K.Name << "\n"; + O << " "; + for (const KernelParamDesc &P : K.Params) + for (unsigned J = 0; J < P.NumOpenCLParams; J++) + O << "false, "; + O << "\n"; + } + O << " // OMIT_TABLE_END\n"; + O << " }; \n\n"; + O << "// array representing signatures of all kernels defined in the\n"; O << "// corresponding source\n"; O << "static constexpr\n"; O << "const kernel_param_desc_t kernel_signatures[] = {\n"; - for (unsigned I = 0; I < KernelDescs.size(); I++) { - auto &K = KernelDescs[I]; + unsigned CurIndex = 0; + for (const KernelDesc &K : KernelDescs) { O << " //--- " << K.Name << "\n"; - - for (const auto &P : K.Params) { + for (const KernelParamDesc &P : K.Params) { std::string TyStr = paramKind2Str(P.Kind); O << " { kernel_param_kind_t::" << TyStr << ", "; - O << P.Info << ", " << P.Offset << " },\n"; + O << P.Info << ", " << P.Offset << ", "; + O << "param_omit_table[" << CurIndex << "]"; + ++CurIndex; + for (unsigned X = 1; X < P.NumOpenCLParams; X++) { + O << " | (param_omit_table[" << CurIndex << "] << " << X << ")"; + ++CurIndex; + } + O << "}"; + O << ",\n"; } O << "\n"; } @@ -2789,14 +2825,11 @@ void SYCLIntegrationHeader::startKernel(StringRef KernelName, } void SYCLIntegrationHeader::addParamDesc(kernel_param_kind_t Kind, int Info, - unsigned Offset) { + unsigned Offset, + unsigned NumOpenCLParams) { auto *K = getCurKernelDesc(); assert(K && "no kernels"); - K->Params.push_back(KernelParamDesc()); - KernelParamDesc &PD = K->Params.back(); - PD.Kind = Kind; - PD.Info = Info; - PD.Offset = Offset; + K->Params.push_back({Kind, Info, Offset, NumOpenCLParams}); } void SYCLIntegrationHeader::endKernel() { diff --git a/clang/test/CodeGenSYCL/integration_header.cpp b/clang/test/CodeGenSYCL/integration_header.cpp index a0859f4925c43..2169e1137e8ab 100644 --- a/clang/test/CodeGenSYCL/integration_header.cpp +++ b/clang/test/CodeGenSYCL/integration_header.cpp @@ -25,41 +25,56 @@ // CHECK-NEXT: }; // // CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE12first_kernel +// CHECK-NEXT: false, false, false, false, false, false, false, false, false, false, false, false, +// CHECK-NEXT: //--- _ZTSN16second_namespace13second_kernelIcEE +// CHECK-NEXT: false, false, false, false, false, false, +// CHECK-NEXT: //--- _ZTS12third_kernelILi1Ei5pointIZ4mainE1XEE +// CHECK-NEXT: false, false, false, false, false, false, +// CHECK-NEXT: //--- _ZTS13fourth_kernelIJN15template_arg_ns14namespaced_argILi1EEEEE +// CHECK-NEXT: false, false, false, false, false, +// CHECK-NEXT: //--- _ZTSZ4mainE16accessor_in_base +// CHECK-NEXT: false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; +// CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE12first_kernel -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 24 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 40 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[0]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4, param_omit_table[1]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, param_omit_table[2]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, param_omit_table[3] | (param_omit_table[4] << 1) | (param_omit_table[5] << 2) | (param_omit_table[6] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 24, param_omit_table[7] | (param_omit_table[8] << 1) | (param_omit_table[9] << 2) | (param_omit_table[10] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 40, param_omit_table[11]}, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTSN16second_namespace13second_kernelIcEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[12]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, param_omit_table[13] | (param_omit_table[14] << 1) | (param_omit_table[15] << 2) | (param_omit_table[16] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, param_omit_table[17]}, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTS12third_kernelILi1Ei5pointIZ4mainE1XEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[18]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, param_omit_table[19] | (param_omit_table[20] << 1) | (param_omit_table[21] << 2) | (param_omit_table[22] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_sampler, 8, 16, param_omit_table[23]}, // CHECK-EMPTY: // CHECK-NEXT: //--- _ZTS13fourth_kernelIJN15template_arg_ns14namespaced_argILi1EEEEE -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[24]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4, param_omit_table[25] | (param_omit_table[26] << 1) | (param_omit_table[27] << 2) | (param_omit_table[28] << 3)}, // CHECK-EMPTY: -// CHECK-NEXT: //--- _ZTSZ4mainE16accessor_in_base -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 8 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 24 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 36 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 40 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 52 }, +// CHECK-NEXT: //--- _ZTSZ4mainE16accessor_in_base +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[29]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, param_omit_table[30]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 8, param_omit_table[31] | (param_omit_table[32] << 1) | (param_omit_table[33] << 2) | (param_omit_table[34] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, param_omit_table[35]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 24, param_omit_table[36] | (param_omit_table[37] << 1) | (param_omit_table[38] << 2) | (param_omit_table[39] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 36, param_omit_table[40]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 40, param_omit_table[41] | (param_omit_table[42] << 1) | (param_omit_table[43] << 2) | (param_omit_table[44] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 52, param_omit_table[45] | (param_omit_table[46] << 1) | (param_omit_table[47] << 2) | (param_omit_table[48] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; -// + // CHECK: template <> struct KernelInfo { // CHECK: template <> struct KernelInfo<::second_namespace::second_kernel> { // CHECK: template <> struct KernelInfo<::third_kernel<1, int, ::point>> { diff --git a/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp index 7f458efb36a57..c7edccb6f0b27 100644 --- a/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-acc-array-ih.cpp @@ -16,20 +16,26 @@ // CHECK-NEXT: const char* const kernel_names[] = { // CHECK-NEXT: "_ZTSZ4mainE8kernel_A" // CHECK-NEXT: }; - +// +// CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_A +// CHECK-NEXT: false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; +// // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { // CHECK-NEXT: //--- _ZTSZ4mainE8kernel_A -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12 }, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, param_omit_table[4] | (param_omit_table[5] << 1) | (param_omit_table[6] << 2) | (param_omit_table[7] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; - // CHECK: static constexpr // CHECK-NEXT: const unsigned kernel_signature_start[] = { // CHECK-NEXT: 0 // _ZTSZ4mainE8kernel_A // CHECK-NEXT: }; - // CHECK: template <> struct KernelInfo { #include diff --git a/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp index db2ffcfb13fd5..e6096bc2397ae 100644 --- a/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-member-acc-array-ih.cpp @@ -17,11 +17,19 @@ // CHECK-NEXT: "_ZTSZ4mainE8kernel_C" // CHECK-NEXT: }; +// CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_C +// CHECK-NEXT: false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_C -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12 }, +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_C +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 12, param_omit_table[4] | (param_omit_table[5] << 1) | (param_omit_table[6] << 2) | (param_omit_table[7] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp b/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp index b0dc2132fb06a..f215b3a8417f0 100755 --- a/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp +++ b/clang/test/CodeGenSYCL/kernel-param-pod-array-ih.cpp @@ -16,14 +16,22 @@ // CHECK-NEXT: "_ZTSZ4mainE8kernel_B" // CHECK-NEXT: }; +// CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_B +// CHECK-NEXT: false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_B -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16 }, +// CHECK-NEXT: //--- _ZTSZ4mainE8kernel_B +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0, param_omit_table[0]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 4, param_omit_table[1]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 8, param_omit_table[2]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, param_omit_table[3]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, param_omit_table[4]}, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/clang/test/CodeGenSYCL/struct_kernel_param.cpp b/clang/test/CodeGenSYCL/struct_kernel_param.cpp index a00f147b0dee0..54c86555e2ea1 100644 --- a/clang/test/CodeGenSYCL/struct_kernel_param.cpp +++ b/clang/test/CodeGenSYCL/struct_kernel_param.cpp @@ -1,17 +1,31 @@ // RUN: %clang_cc1 -I %S/Inputs -fsycl -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -fsycl-int-header=%t.h %s -o %t.out // RUN: FileCheck -input-file=%t.h %s -// CHECK: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 24 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 28 }, -// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 32 }, +// CHECK: static constexpr +// CHECK-NEXT: const char* const kernel_names[] = { +// CHECK-NEXT: "_ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel" +// CHECK-NEXT: }; + +// CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel +// CHECK-NEXT: false, false, false, false, false, false, false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; + +// CHECK: static constexpr +// CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { +// CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 12, param_omit_table[4]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 16, param_omit_table[5]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 20, param_omit_table[6]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 24, param_omit_table[7]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 28, param_omit_table[8]}, +// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 32, param_omit_table[9]}, // CHECK-EMPTY: -// CHECK-NEXT:}; +// CHECK-NEXT: }; // This test checks if compiler accepts structures as kernel parameters. diff --git a/clang/test/CodeGenSYCL/usm-int-header.cpp b/clang/test/CodeGenSYCL/usm-int-header.cpp index 298a7464ac588..5702bb3398389 100644 --- a/clang/test/CodeGenSYCL/usm-int-header.cpp +++ b/clang/test/CodeGenSYCL/usm-int-header.cpp @@ -2,8 +2,8 @@ // RUN: %clang_cc1 -I %S/Inputs -fsycl -fsycl -fsycl-is-device -fsycl-int-header=%t.h %s -o %t.out // RUN: FileCheck -input-file=%t.h %s --check-prefix=INT-HEADER -// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 0 }, -// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 8 }, +// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 0, param_omit_table[0]}, +// INT-HEADER:{ kernel_param_kind_t::kind_pointer, 8, 8, param_omit_table[1]}, //==--usm-int-header.cpp - USM kernel param aspace and int header test -----==// // diff --git a/clang/test/CodeGenSYCL/wrapped-accessor.cpp b/clang/test/CodeGenSYCL/wrapped-accessor.cpp index bf511f6ae9fa7..8f20ae624dc53 100644 --- a/clang/test/CodeGenSYCL/wrapped-accessor.cpp +++ b/clang/test/CodeGenSYCL/wrapped-accessor.cpp @@ -14,10 +14,18 @@ // CHECK-NEXT: "_ZTSZ4mainE14wrapped_access" // CHECK-NEXT: }; +// CHECK: static constexpr +// CHECK-NEXT: const bool param_omit_table[] = { +// CHECK-NEXT: // OMIT_TABLE_BEGIN +// CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access +// CHECK-NEXT: false, false, false, false, +// CHECK-NEXT: // OMIT_TABLE_END +// CHECK-NEXT: }; + // CHECK: static constexpr // CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = { -// CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access -// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 }, +// CHECK-NEXT: //--- _ZTSZ4mainE14wrapped_access +// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0, param_omit_table[0] | (param_omit_table[1] << 1) | (param_omit_table[2] << 2) | (param_omit_table[3] << 3)}, // CHECK-EMPTY: // CHECK-NEXT: }; diff --git a/sycl/include/CL/sycl/detail/kernel_desc.hpp b/sycl/include/CL/sycl/detail/kernel_desc.hpp index 120fb9dc4e96c..1b6fcd194d1c4 100644 --- a/sycl/include/CL/sycl/detail/kernel_desc.hpp +++ b/sycl/include/CL/sycl/detail/kernel_desc.hpp @@ -42,6 +42,8 @@ struct kernel_param_desc_t { // offset of the captured value of the parameter in the lambda or function // object int offset; + // bitfield to mark kernel parameters that will be omitted + unsigned char kernel_param_omitted; }; // Translates specialization constant type to its name.