Skip to content

Commit 4b90899

Browse files
authored
Expose native_code's jl_sysimg_gvars. (#58423)
#57010 overhauled how global variables are initialized in code, breaking GPUCompiler.jl. After talking to @vtjnash, we are apparently supposed to use `jl_get_llvm_gvs` now to get the Julia memory location of a global variable (for a binding or constant value), however, the elements in there don't exactly correspond to the global variables in the module (not all module globals are "managed" by Julia, and the order is different). To make GPUCompiler.jl work again, here I propose renaming `jl_get_llvm_gvs` to `jl_get_llvm_gv_inits`, and making `jl_get_llvm_gvs` instead return the list of the managed global variables, making it possible to perform the global variable initialization that was done by Julia before using something like: ```julia if VERSION >= v"1.13.0-DEV.533" num_gvars = Ref{Csize_t}(0) @CCall jl_get_llvm_gvs(native_code::Ptr{Cvoid}, num_gvars::Ptr{Csize_t}, C_NULL::Ptr{Cvoid})::Nothing gvs = Vector{Ptr{LLVM.API.LLVMOpaqueValue}}(undef, num_gvars[]) @CCall jl_get_llvm_gvs(native_code::Ptr{Cvoid}, num_gvars::Ptr{Csize_t}, gvs::Ptr{LLVM.API.LLVMOpaqueValue})::Nothing inits = Vector{Ptr{Cvoid}}(undef, num_gvars[]) @CCall jl_get_llvm_gv_inits(native_code::Ptr{Cvoid}, num_gvars::Ptr{Csize_t}, inits::Ptr{Cvoid})::Nothing for (gv_ref, init) in zip(gvs, inits) gv = GlobalVariable(gv_ref) ptr = const_inttoptr(ConstantInt(Int64(init)), value_type(gv)) initializer!(gv, ptr) obj = Base.unsafe_pointer_to_objref(init) @safe_info "Resolved $(name(gv)) to $obj" end end ```
1 parent c940a31 commit 4b90899

File tree

5 files changed

+28
-8
lines changed

5 files changed

+28
-8
lines changed

src/aotcompile.cpp

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,20 +108,37 @@ jl_get_llvm_mis_impl(void *native_code, size_t *num_elements, jl_method_instance
108108
}
109109
}
110110

111+
// get the list of global variables managed by the compiler
111112
extern "C" JL_DLLEXPORT_CODEGEN void jl_get_llvm_gvs_impl(void *native_code,
112113
size_t *num_elements, void **data)
113114
{
114-
// map a memory location (jl_value_t or jl_binding_t) to a GlobalVariable
115115
jl_native_code_desc_t *desc = (jl_native_code_desc_t *)native_code;
116-
auto &value_map = desc->jl_value_to_llvm;
116+
auto &gvars = desc->jl_sysimg_gvars;
117117

118118
if (data == NULL) {
119-
*num_elements = value_map.size();
119+
*num_elements = gvars.size();
120120
return;
121121
}
122122

123-
assert(*num_elements == value_map.size());
124-
memcpy(data, value_map.data(), *num_elements * sizeof(void *));
123+
assert(*num_elements == gvars.size());
124+
memcpy(data, gvars.data(), *num_elements * sizeof(void *));
125+
}
126+
127+
// get the initializer values (jl_value_t or jl_binding_t ptr) of managed global variables
128+
extern "C" JL_DLLEXPORT_CODEGEN void jl_get_llvm_gv_inits_impl(void *native_code,
129+
size_t *num_elements,
130+
void **data)
131+
{
132+
jl_native_code_desc_t *desc = (jl_native_code_desc_t *)native_code;
133+
auto &inits = desc->jl_value_to_llvm;
134+
135+
if (data == NULL) {
136+
*num_elements = inits.size();
137+
return;
138+
}
139+
140+
assert(*num_elements == inits.size());
141+
memcpy(data, inits.data(), *num_elements * sizeof(void *));
125142
}
126143

127144
extern "C" JL_DLLEXPORT_CODEGEN void jl_get_llvm_external_fns_impl(void *native_code,

src/codegen-stubs.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ JL_DLLEXPORT void jl_dump_native_fallback(void *native_code,
1414
const char *bc_fname, const char *unopt_bc_fname, const char *obj_fname, const char *asm_fname,
1515
ios_t *z, ios_t *s) UNAVAILABLE
1616
JL_DLLEXPORT void jl_get_llvm_gvs_fallback(void *native_code, arraylist_t *gvs) UNAVAILABLE
17+
JL_DLLEXPORT void jl_get_llvm_gv_inits_fallback(void *native_code, arraylist_t *inits) UNAVAILABLE
1718
JL_DLLEXPORT void jl_get_llvm_external_fns_fallback(void *native_code, arraylist_t *gvs) UNAVAILABLE
1819
JL_DLLEXPORT void jl_get_llvm_mis_fallback(void *native_code, arraylist_t* MIs) UNAVAILABLE
1920

src/jl_exported_funcs.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@
514514
YY(jl_get_LLVM_VERSION) \
515515
YY(jl_dump_native) \
516516
YY(jl_get_llvm_gvs) \
517+
YY(jl_get_llvm_gv_inits) \
517518
YY(jl_get_llvm_external_fns) \
518519
YY(jl_get_llvm_mis) \
519520
YY(jl_dump_function_asm) \

src/julia_internal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2043,8 +2043,9 @@ JL_DLLIMPORT void jl_dump_native(void *native_code,
20432043
const char *bc_fname, const char *unopt_bc_fname, const char *obj_fname, const char *asm_fname,
20442044
ios_t *z, ios_t *s, jl_emission_params_t *params);
20452045
JL_DLLIMPORT void jl_get_llvm_gvs(void *native_code, size_t *num_els, void **gvs);
2046+
JL_DLLIMPORT void jl_get_llvm_gv_inits(void *native_code, size_t *num_els, void **inits);
20462047
JL_DLLIMPORT void jl_get_llvm_external_fns(void *native_code, size_t *num_els,
2047-
jl_code_instance_t *gvs);
2048+
jl_code_instance_t *fns);
20482049
JL_DLLIMPORT void jl_get_function_id(void *native_code, jl_code_instance_t *ncode,
20492050
int32_t *func_idx, int32_t *specfunc_idx);
20502051
JL_DLLIMPORT void jl_register_fptrs(uint64_t image_base, const struct _jl_image_fptrs_t *fptrs,

src/staticdata.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3055,9 +3055,9 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
30553055
int en = jl_gc_enable(0);
30563056
if (native_functions) {
30573057
size_t num_gvars, num_external_fns;
3058-
jl_get_llvm_gvs(native_functions, &num_gvars, NULL);
3058+
jl_get_llvm_gv_inits(native_functions, &num_gvars, NULL);
30593059
arraylist_grow(&gvars, num_gvars);
3060-
jl_get_llvm_gvs(native_functions, &num_gvars, gvars.items);
3060+
jl_get_llvm_gv_inits(native_functions, &num_gvars, gvars.items);
30613061
jl_get_llvm_external_fns(native_functions, &num_external_fns, NULL);
30623062
arraylist_grow(&external_fns, num_external_fns);
30633063
jl_get_llvm_external_fns(native_functions, &num_external_fns,

0 commit comments

Comments
 (0)