clc: force linking of spirvs with mismatching pointer types in signatures
With LLVM-17 and opaque pointers, sometimes the compiled spirvs lose all their information in regards to what specific pointer type a function parameter has. To workaround this, we can tell the spirv linker to insert casts to handle those cases. See https://github.com/KhronosGroup/SPIRV-Tools/pull/5534 Cc: mesa-stable Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30029>
This commit is contained in:
@@ -1228,10 +1228,17 @@ clc_link_spirv_binaries(const struct clc_linker_args *args,
|
|||||||
context.SetMessageConsumer(msgconsumer);
|
context.SetMessageConsumer(msgconsumer);
|
||||||
spvtools::LinkerOptions options;
|
spvtools::LinkerOptions options;
|
||||||
options.SetAllowPartialLinkage(args->create_library);
|
options.SetAllowPartialLinkage(args->create_library);
|
||||||
|
#if defined(HAS_SPIRV_LINK_LLVM_WORKAROUND) && LLVM_VERSION_MAJOR >= 17
|
||||||
|
options.SetAllowPtrTypeMismatch(true);
|
||||||
|
#endif
|
||||||
options.SetCreateLibrary(args->create_library);
|
options.SetCreateLibrary(args->create_library);
|
||||||
std::vector<uint32_t> linkingResult;
|
std::vector<uint32_t> linkingResult;
|
||||||
spv_result_t status = spvtools::Link(context, binaries, &linkingResult, options);
|
spv_result_t status = spvtools::Link(context, binaries, &linkingResult, options);
|
||||||
if (status != SPV_SUCCESS) {
|
if (status != SPV_SUCCESS) {
|
||||||
|
#if !defined(HAS_SPIRV_LINK_LLVM_WORKAROUND) && LLVM_VERSION_MAJOR >= 17
|
||||||
|
clc_warning(logger, "SPIRV-Tools doesn't contain https://github.com/KhronosGroup/SPIRV-Tools/pull/5534\n");
|
||||||
|
clc_warning(logger, "Please update in order to prevent spurious linking failures\n");
|
||||||
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -82,6 +82,19 @@ else
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
has_spirv_link_workaround = cpp.has_member(
|
||||||
|
'spvtools::LinkerOptions',
|
||||||
|
'SetAllowPtrTypeMismatch(true)',
|
||||||
|
prefix : [
|
||||||
|
'#include <spirv-tools/linker.hpp>',
|
||||||
|
],
|
||||||
|
dependencies : dep_spirv_tools,
|
||||||
|
)
|
||||||
|
|
||||||
|
if has_spirv_link_workaround
|
||||||
|
_libmesaclc_c_args += ['-DHAS_SPIRV_LINK_LLVM_WORKAROUND=1']
|
||||||
|
endif
|
||||||
|
|
||||||
_libmesaclc = static_library(
|
_libmesaclc = static_library(
|
||||||
'libmesaclc',
|
'libmesaclc',
|
||||||
files_libmesaclc,
|
files_libmesaclc,
|
||||||
|
Reference in New Issue
Block a user