Module: Mesa Branch: main Commit: 37c0e8beda42e989cafa8ae4f6467a29e0db07ec URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=37c0e8beda42e989cafa8ae4f6467a29e0db07ec
Author: Jesse Natalie <[email protected]> Date: Thu Dec 7 15:16:42 2023 -0800 compiler/clc: Don't fail to parse SPIR-V if there's no kernels It's valid to have library SPIR-V being parsed that has no entrypoints. We still want to get spec constant info for them. Reviewed-by: Karol Herbst <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26582> --- src/compiler/clc/clc_helpers.cpp | 57 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/compiler/clc/clc_helpers.cpp b/src/compiler/clc/clc_helpers.cpp index d2742eca8ea..6cb65e3e579 100644 --- a/src/compiler/clc/clc_helpers.cpp +++ b/src/compiler/clc/clc_helpers.cpp @@ -677,7 +677,7 @@ clc_spirv_get_kernels_info(const struct clc_binary *spvbin, unsigned *num_spec_constants, const struct clc_logger *logger) { - struct clc_kernel_info *kernels; + struct clc_kernel_info *kernels = NULL; struct clc_parsed_spec_constant *spec_constants = NULL; SPIRVKernelParser parser; @@ -687,35 +687,34 @@ clc_spirv_get_kernels_info(const struct clc_binary *spvbin, *num_kernels = parser.kernels.size(); *num_spec_constants = parser.specConstants.size(); - if (!*num_kernels) - return false; + if (*num_kernels) { + kernels = reinterpret_cast<struct clc_kernel_info *>(calloc(*num_kernels, + sizeof(*kernels))); + assert(kernels); + for (unsigned i = 0; i < parser.kernels.size(); i++) { + kernels[i].name = strdup(parser.kernels[i].name.c_str()); + kernels[i].num_args = parser.kernels[i].args.size(); + kernels[i].vec_hint_size = parser.kernels[i].vecHint >> 16; + kernels[i].vec_hint_type = (enum clc_vec_hint_type)(parser.kernels[i].vecHint & 0xFFFF); + memcpy(kernels[i].local_size, parser.kernels[i].localSize, sizeof(kernels[i].local_size)); + memcpy(kernels[i].local_size_hint, parser.kernels[i].localSizeHint, sizeof(kernels[i].local_size_hint)); + if (!kernels[i].num_args) + continue; + + struct clc_kernel_arg *args; - kernels = reinterpret_cast<struct clc_kernel_info *>(calloc(*num_kernels, - sizeof(*kernels))); - assert(kernels); - for (unsigned i = 0; i < parser.kernels.size(); i++) { - kernels[i].name = strdup(parser.kernels[i].name.c_str()); - kernels[i].num_args = parser.kernels[i].args.size(); - kernels[i].vec_hint_size = parser.kernels[i].vecHint >> 16; - kernels[i].vec_hint_type = (enum clc_vec_hint_type)(parser.kernels[i].vecHint & 0xFFFF); - memcpy(kernels[i].local_size, parser.kernels[i].localSize, sizeof(kernels[i].local_size)); - memcpy(kernels[i].local_size_hint, parser.kernels[i].localSizeHint, sizeof(kernels[i].local_size_hint)); - if (!kernels[i].num_args) - continue; - - struct clc_kernel_arg *args; - - args = reinterpret_cast<struct clc_kernel_arg *>(calloc(kernels[i].num_args, - sizeof(*kernels->args))); - kernels[i].args = args; - assert(args); - for (unsigned j = 0; j < kernels[i].num_args; j++) { - if (!parser.kernels[i].args[j].name.empty()) - args[j].name = strdup(parser.kernels[i].args[j].name.c_str()); - args[j].type_name = strdup(parser.kernels[i].args[j].typeName.c_str()); - args[j].address_qualifier = parser.kernels[i].args[j].addrQualifier; - args[j].type_qualifier = parser.kernels[i].args[j].typeQualifier; - args[j].access_qualifier = parser.kernels[i].args[j].accessQualifier; + args = reinterpret_cast<struct clc_kernel_arg *>(calloc(kernels[i].num_args, + sizeof(*kernels->args))); + kernels[i].args = args; + assert(args); + for (unsigned j = 0; j < kernels[i].num_args; j++) { + if (!parser.kernels[i].args[j].name.empty()) + args[j].name = strdup(parser.kernels[i].args[j].name.c_str()); + args[j].type_name = strdup(parser.kernels[i].args[j].typeName.c_str()); + args[j].address_qualifier = parser.kernels[i].args[j].addrQualifier; + args[j].type_qualifier = parser.kernels[i].args[j].typeQualifier; + args[j].access_qualifier = parser.kernels[i].args[j].accessQualifier; + } } }
