From 333ee94285ac453b9d75ce93b01bc26e48bf96d7 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 15 May 2020 10:05:55 +1000 Subject: [PATCH] gallivm: rework debug printf hook to use global mapping. Cached shaders require relinking, so hardcoding the pointer can't work. This switches out the printf code to use new proper API. Reviewed-by: Roland Scheidegger Part-of: --- src/gallium/auxiliary/gallivm/lp_bld_init.c | 3 +++ src/gallium/auxiliary/gallivm/lp_bld_init.h | 1 + src/gallium/auxiliary/gallivm/lp_bld_printf.c | 12 +++++------- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c index e3fd26cd2ec..ce522806669 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c @@ -643,6 +643,9 @@ gallivm_compile_module(struct gallivm_state *gallivm) ++gallivm->compiled; + if (gallivm->debug_printf_hook) + LLVMAddGlobalMapping(gallivm->engine, gallivm->debug_printf_hook, debug_printf); + if (gallivm_debug & GALLIVM_DEBUG_ASM) { LLVMValueRef llvm_func = LLVMGetFirstFunction(gallivm->module); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.h b/src/gallium/auxiliary/gallivm/lp_bld_init.h index 1c0c627fb59..cebf6a793d5 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.h @@ -54,6 +54,7 @@ struct gallivm_state unsigned compiled; LLVMValueRef coro_malloc_hook; LLVMValueRef coro_free_hook; + LLVMValueRef debug_printf_hook; }; diff --git a/src/gallium/auxiliary/gallivm/lp_bld_printf.c b/src/gallium/auxiliary/gallivm/lp_bld_printf.c index a4233a24e33..1772fd0e8cd 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_printf.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_printf.c @@ -48,8 +48,6 @@ lp_build_print_args(struct gallivm_state* gallivm, { LLVMBuilderRef builder = gallivm->builder; LLVMContextRef context = gallivm->context; - LLVMValueRef func_printf; - LLVMTypeRef printf_type; int i; assert(args); @@ -64,11 +62,11 @@ lp_build_print_args(struct gallivm_state* gallivm, args[i] = LLVMBuildFPExt(builder, args[i], LLVMDoubleTypeInContext(context), ""); } - printf_type = LLVMFunctionType(LLVMInt32TypeInContext(context), NULL, 0, 1); - func_printf = lp_build_const_int_pointer(gallivm, func_to_pointer((func_pointer)debug_printf)); - func_printf = LLVMBuildBitCast(builder, func_printf, LLVMPointerType(printf_type, 0), "debug_printf"); - - return LLVMBuildCall(builder, func_printf, args, argcount, ""); + if (!gallivm->debug_printf_hook) { + LLVMTypeRef printf_type = LLVMFunctionType(LLVMInt32TypeInContext(context), NULL, 0, 1); + gallivm->debug_printf_hook = LLVMAddFunction(gallivm->module, "debug_printf", printf_type); + } + return LLVMBuildCall(builder, gallivm->debug_printf_hook, args, argcount, ""); } -- 2.30.2