From 6a2fe4a363c3848e08fbb0cdf02ac88da4359395 Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Mon, 23 Jun 2025 12:57:06 +0200 Subject: [PATCH] Convert pointer address spaces when calling rtlib functions. We currently emit runtime functions in the generic address space, while source arguments may reside in a specific address space, e.g., when pointing to global variables. This only affects Julia 1.12, where Julia functions use actual pointers, and LLVM.jl 9.4.1+, which emits global strings in the correct address space. --- src/rtlib.jl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/rtlib.jl b/src/rtlib.jl index c790b23c..91b4c71c 100644 --- a/src/rtlib.jl +++ b/src/rtlib.jl @@ -49,10 +49,16 @@ function LLVM.call!(builder, rt::Runtime.RuntimeMethodInstance, args=LLVM.Value[ end for (i,arg) in enumerate(args) if value_type(arg) != parameters(ft)[i] - if (value_type(arg) isa LLVM.PointerType) && + args[i] = if (value_type(arg) isa LLVM.PointerType) && (parameters(ft)[i] isa LLVM.IntegerType) - # Julia pointers are passed as integers - args[i] = ptrtoint!(builder, args[i], parameters(ft)[i]) + # pointers are passed as integers on Julia 1.11 and earlier + ptrtoint!(builder, args[i], parameters(ft)[i]) + elseif value_type(arg) isa LLVM.PointerType && + parameters(ft)[i] isa LLVM.PointerType && + addrspace(value_type(arg)) != addrspace(parameters(ft)[i]) + # runtime functions are always in the default address space, + # while arguments may come from globals in other address spaces. + addrspacecast!(builder, args[i], parameters(ft)[i]) else error("Don't know how to convert ", arg, " argument to ", parameters(ft)[i]) end