gallivm: rework debug printf hook to use global mapping.
authorDave Airlie <airlied@redhat.com>
Fri, 15 May 2020 00:05:55 +0000 (10:05 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 10 Jun 2020 20:05:40 +0000 (06:05 +1000)
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 <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5049>

src/gallium/auxiliary/gallivm/lp_bld_init.c
src/gallium/auxiliary/gallivm/lp_bld_init.h
src/gallium/auxiliary/gallivm/lp_bld_printf.c

index e3fd26cd2ec39d90121b8ef50f3f243e156654f5..ce522806669672e063866a807883e4ac183e9e99 100644 (file)
@@ -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);
 
index 1c0c627fb5997ce2b3ccc3997ecb0eb78beca10a..cebf6a793d536dc26961e51966d6c2118bfe2458 100644 (file)
@@ -54,6 +54,7 @@ struct gallivm_state
    unsigned compiled;
    LLVMValueRef coro_malloc_hook;
    LLVMValueRef coro_free_hook;
+   LLVMValueRef debug_printf_hook;
 };
 
 
index a4233a24e3317cc98f0c1cb3afe60cdc73258826..1772fd0e8cdc74d5b764ebb1846b2c030723271e 100644 (file)
@@ -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, "");
 }