diff --git a/src/compiler/clc/clc.h b/src/compiler/clc/clc.h index 9e8604c0953..1cfe4f867a3 100644 --- a/src/compiler/clc/clc.h +++ b/src/compiler/clc/clc.h @@ -92,6 +92,11 @@ struct clc_compile_args { */ const char * const *allowed_spirv_extensions; + /* Indicate that the input file tries to be compatible with C code. This + * means that for example the bit-field clang extension is enabled. + */ + bool c_compatible; + unsigned address_bits; }; diff --git a/src/compiler/clc/clc_helpers.cpp b/src/compiler/clc/clc_helpers.cpp index e15d0c96e01..41d4c4baf99 100644 --- a/src/compiler/clc/clc_helpers.cpp +++ b/src/compiler/clc/clc_helpers.cpp @@ -945,6 +945,9 @@ clc_compile_to_llvm_module(LLVMContext &llvm_ctx, c->getTargetOpts().OpenCLExtensionsAsWritten.push_back("+cl_khr_global_int32_extended_atomics"); c->getTargetOpts().OpenCLExtensionsAsWritten.push_back("+cl_khr_local_int32_base_atomics"); c->getTargetOpts().OpenCLExtensionsAsWritten.push_back("+cl_khr_local_int32_extended_atomics"); + if (args->c_compatible) { + c->getTargetOpts().OpenCLExtensionsAsWritten.push_back("+__cl_clang_bitfields"); + } c->getPreprocessorOpts().addMacroDef("cl_khr_expect_assume=1"); bool needs_opencl_c_h = false; diff --git a/src/compiler/clc/mesa_clc.c b/src/compiler/clc/mesa_clc.c index 55425b5e3d1..9633ddd431c 100644 --- a/src/compiler/clc/mesa_clc.c +++ b/src/compiler/clc/mesa_clc.c @@ -133,6 +133,7 @@ main(int argc, char **argv) .source.value = map, .args = util_dynarray_begin(&clang_args), .num_args = util_dynarray_num_elements(&clang_args, char *), + .c_compatible = true, }; /* Enable all features, we don't know the target here and it is the diff --git a/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs b/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs index ad7ef1aa3c4..7861d6e875c 100644 --- a/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs +++ b/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs @@ -151,6 +151,7 @@ impl SPIRVBin { features: features, use_llvm_spirv_target: false, allowed_spirv_extensions: spirv_extensions.as_ptr(), + c_compatible: false, address_bits: address_bits, }; let mut msgs: Vec = Vec::new();