From 0787cba409f832fa26a2dfd711bdf974ce454e70 Mon Sep 17 00:00:00 2001 From: Christian Guinard <28689358+christiangnrd@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:08:17 -0400 Subject: [PATCH 1/2] Typo --- src/metal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metal.jl b/src/metal.jl index 569a6cd1..50574ad6 100644 --- a/src/metal.jl +++ b/src/metal.jl @@ -565,7 +565,7 @@ function add_argument_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Modul args = classify_arguments(job, entry_ft; post_optimization=job.config.optimize) i = 1 for arg in args - arg.idx === nothing && continue + arg.idx === nothing && continue if job.config.optimize @assert parameters(entry_ft)[arg.idx] isa LLVM.PointerType else From 564351f01d5de67e3c8d1c570724bc6fac2c4348 Mon Sep 17 00:00:00 2001 From: Christian Guinard <28689358+christiangnrd@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:09:14 -0400 Subject: [PATCH 2/2] [Metal] Emit global dynamic memory --- src/metal.jl | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/src/metal.jl b/src/metal.jl index 50574ad6..98ac17a6 100644 --- a/src/metal.jl +++ b/src/metal.jl @@ -168,6 +168,8 @@ function finish_ir!(@nospecialize(job::CompilerJob{MetalCompilerTarget}), mod::L add_argument_metadata!(job, mod, entry) + add_globals_metadata!(job, mod, entry) + add_module_metadata!(job, mod) end @@ -550,6 +552,96 @@ function argument_type_name(typ) end end +# global metadata generation +# +# module metadata is used to identify global buffers that are used as kernel arguments. +function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module, + entry::LLVM.Function) + entry_ft = function_type(entry) + + ## argument info + arg_infos = Metadata[] + + + # Iterate through arguments and create metadata for them + globs = globals(mod) + @show globs + i = 1 + for gv in globs + @show gv + gv_typ = global_value_type(gv) + (isconstant(gv) && addrspace(gv_typ) == 3) || continue + # if job.config.optimize + # @assert parameters(entry_ft)[arg.idx] isa LLVM.PointerType + # else + # parameters(entry_ft)[arg.idx] isa LLVM.PointerType || continue + # end + + # # NOTE: we emit the bare minimum of argument metadata to support + # # bindless argument encoding. Actually using the argument encoder + # # APIs (deprecated in Metal 3) turned out too difficult, given the + # # undocumented nature of the argument metadata, and the complex + # # arguments we encounter with typical Julia kernels. + global_infos = Metadata[] + + push!(global_infos, MDString("air.global_binding")) + push!(global_infos, Metadata(gv)) + + md = Metadata[] + + # argument index + push!(md, Metadata(ConstantInt(Int32(-1)))) + + push!(md, MDString("air.buffer")) + + push!(md, MDString("air.location_index")) + push!(md, Metadata(ConstantInt(Int32(i-1)))) + + # XXX: unknown + push!(md, Metadata(ConstantInt(Int32(1)))) + + push!(md, MDString("air.read_write")) # TODO: Check for const array + + push!(md, MDString("air.address_space")) + push!(md, Metadata(ConstantInt(Int32(addrspace(global_value_type(gv)))))) + + val_type = global_value_type(gv) + # val_type = if value_type(gv) <: Core.LLVMPtr + # arg.typ.parameters[1] + # else + # arg.typ + # end + + @show gv_typ + @show isconstant(gv) + # @show isconstant(gv_typ) + # @show Int32(alignment(gv)) + + push!(md, MDString("air.arg_type_size")) + push!(md, Metadata(ConstantInt(Int32(4)))) + + push!(md, MDString("air.arg_type_align_size")) + push!(md, Metadata(ConstantInt(Int32(alignment(gv))))) + + push!(md, MDString("air.arg_type_name")) + # push!(md, MDString(repr(arg.typ))) + + push!(md, MDString("air.arg_name")) + push!(md, MDString(String(LLVM.name(gv)))) + + push!(arg_infos, MDNode(md)) + + i += 1 + end + + println() + arg_infos = MDNode(arg_infos) + + push!(metadata(mod)["air.global_bindings"], arg_infos) + + return +end + # argument metadata generation # # module metadata is used to identify buffers that are passed as kernel arguments.