@@ -131,14 +131,12 @@ function Base.unsafe_load(ptr::LLVMPtr{ROCPrintfBuffer, AS.Global})
131131 args = []
132132 while true
133133 # Read argument type
134- T_ptr = Ptr {UInt64} ( unsafe_load (ptr))
134+ T_id = unsafe_load (ptr):: UInt64
135135 ptr += sizeof (UInt64)
136- if UInt64 (T_ptr) == 0
137- # Terminator
138- break
139- end
140- T = unsafe_pointer_to_objref (T_ptr)
136+ T_id == 0 && break # Terminator.
137+
141138 # Read argument.
139+ T = _printf_type_from_id (Val (T_id))
142140 arg = unsafe_load (reinterpret (Ptr{T}, ptr))
143141 push! (args, arg)
144142 ptr += sizeof (arg)
@@ -158,12 +156,19 @@ function _rocprintf_fmt(ptr::LLVMPtr{UInt64, AS.Global}, fmt_ptr, fmt_len::Int64
158156 return ptr
159157end
160158
161- function _pointer_from_type (:: Type{T} ) where T
162- UInt64 (pointer_from_objref (T))
159+ for (id, T) in enumerate ((
160+ Int16, Int32, Int64,
161+ UInt16, UInt32, UInt64,
162+ Float16, Float32, Float64,
163+ ))
164+ @eval @inline _printf_type_id (:: Type{$T} ) = Val {UInt64($id)} ()
165+ @eval @inline _printf_type_from_id (:: Val{UInt64($id)} ) = $ T
163166end
164167
168+ @inline _from_val (:: Val{V} ) where V = V
169+
165170function _rocprintf_arg (ptr:: LLVMPtr{UInt64, AS.Global} , arg:: T ) where T
166- unsafe_store! (ptr, _pointer_from_type (T ))
171+ unsafe_store! (ptr, _from_val ( _printf_type_id (T) ))
167172 ptr += sizeof (UInt64)
168173
169174 unsafe_store! (reinterpret (LLVMPtr{T, AS. Global}, ptr), arg)
0 commit comments