gallivm: handle llvm coroutines for llvm > 15

LLVM 15 changed the coroutine presplit function attribute in

735e6c40b5e9 [Coroutines] Convert coroutine.presplit to enum attr

This needed to be updated in mesa.

Cc: mesa-stable
Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18815>
(cherry picked from commit bcb136d548)

Conflicts:
	src/gallium/auxiliary/gallivm/lp_bld_intr.h
This commit is contained in:
Dave Airlie
2022-09-26 11:37:05 +10:00
committed by Dylan Baker
parent ab947b5778
commit aa1df86867
6 changed files with 17 additions and 3 deletions

View File

@@ -7492,7 +7492,7 @@
"description": "gallivm: handle llvm coroutines for llvm > 15",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View File

@@ -3381,7 +3381,7 @@ draw_tcs_llvm_generate(struct draw_llvm *llvm,
LLVMSetFunctionCallConv(variant_coro, LLVMCCallConv);
LLVMAddTargetDependentFunctionAttr(variant_coro, "coroutine.presplit", "0");
lp_build_coro_add_presplit(variant_coro);
for (i = 0; i < ARRAY_SIZE(arg_types); ++i) {
if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) {

View File

@@ -29,6 +29,7 @@
#include <stdbool.h>
#include "pipe/p_compiler.h"
#include "gallivm/lp_bld.h"
#include "gallivm/lp_bld_intr.h"
struct gallivm_state;
LLVMValueRef lp_build_coro_id(struct gallivm_state *gallivm);
@@ -73,4 +74,14 @@ void lp_build_coro_suspend_switch(struct gallivm_state *gallivm,
void lp_build_coro_add_malloc_hooks(struct gallivm_state *gallivm);
void lp_build_coro_declare_malloc_hooks(struct gallivm_state *gallivm);
static inline void lp_build_coro_add_presplit(LLVMValueRef coro)
{
#if LLVM_VERSION_MAJOR >= 15
lp_add_function_attr(coro, -1, LP_FUNC_ATTR_PRESPLITCORO);
#else
LLVMAddTargetDependentFunctionAttr(coro, "coroutine.presplit", "0");
#endif
}
#endif

View File

@@ -162,6 +162,7 @@ static const char *attr_to_str(enum lp_func_attr attr)
case LP_FUNC_ATTR_WRITEONLY: return "writeonly";
case LP_FUNC_ATTR_INACCESSIBLE_MEM_ONLY: return "inaccessiblememonly";
case LP_FUNC_ATTR_CONVERGENT: return "convergent";
case LP_FUNC_ATTR_PRESPLITCORO: return "presplitcoroutine";
default:
_debug_printf("Unhandled function attribute: %x\n", attr);
return 0;

View File

@@ -41,6 +41,7 @@
#include "gallivm/lp_bld.h"
#include "gallivm/lp_bld_init.h"
struct lp_type;
/**
* Max number of arguments in an intrinsic.
@@ -57,6 +58,7 @@ enum lp_func_attr {
LP_FUNC_ATTR_WRITEONLY = LLVM_VERSION_MAJOR >= 4 ? (1 << 7) : 0,
LP_FUNC_ATTR_INACCESSIBLE_MEM_ONLY = LLVM_VERSION_MAJOR >= 4 ? (1 << 8) : 0,
LP_FUNC_ATTR_CONVERGENT = LLVM_VERSION_MAJOR >= 4 ? (1 << 9) : 0,
LP_FUNC_ATTR_PRESPLITCORO = (1 << 10),
/* Legacy intrinsic that needs attributes on function declarations
* and they must match the internal LLVM definition exactly, otherwise

View File

@@ -133,7 +133,7 @@ generate_compute(struct llvmpipe_context *lp,
coro = LLVMAddFunction(gallivm->module, func_name_coro, coro_func_type);
LLVMSetFunctionCallConv(coro, LLVMCCallConv);
LLVMAddTargetDependentFunctionAttr(coro, "coroutine.presplit", "0");
lp_build_coro_add_presplit(coro);
variant->function = function;