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;
+         }
       }
    }
 

Reply via email to