Skip to content

Commit 2bf87af

Browse files
committed
Remove arraylist_t from external native code APIs.
This makes them usable for GPUCompiler.jl and other external consumers.
1 parent f6ebc4b commit 2bf87af

File tree

3 files changed

+58
-24
lines changed

3 files changed

+58
-24
lines changed

src/aotcompile.cpp

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,33 +95,55 @@ void jl_get_function_id_impl(void *native_code, jl_code_instance_t *codeinst,
9595
}
9696
}
9797

98-
extern "C" JL_DLLEXPORT_CODEGEN
99-
void jl_get_llvm_mis_impl(void *native_code, arraylist_t* MIs)
98+
extern "C" JL_DLLEXPORT_CODEGEN void
99+
jl_get_llvm_mis_impl(void *native_code, size_t *num_elements, jl_method_instance_t **data)
100100
{
101-
jl_native_code_desc_t *data = (jl_native_code_desc_t*)native_code;
102-
auto map = data->jl_fvar_map;
101+
jl_native_code_desc_t *desc = (jl_native_code_desc_t *)native_code;
102+
auto &map = desc->jl_fvar_map;
103+
104+
if (data == NULL) {
105+
*num_elements = map.size();
106+
return;
107+
}
108+
109+
assert(*num_elements == map.size());
110+
size_t i = 0;
103111
for (auto &ci : map) {
104-
jl_method_instance_t *mi = ci.first->def;
105-
arraylist_push(MIs, mi);
112+
data[i++] = ci.first->def;
106113
}
107114
}
108115

109-
extern "C" JL_DLLEXPORT_CODEGEN
110-
void jl_get_llvm_gvs_impl(void *native_code, arraylist_t *gvs)
116+
extern "C" JL_DLLEXPORT_CODEGEN void jl_get_llvm_gvs_impl(void *native_code,
117+
size_t *num_elements, void **data)
111118
{
112119
// map a memory location (jl_value_t or jl_binding_t) to a GlobalVariable
113-
jl_native_code_desc_t *data = (jl_native_code_desc_t*)native_code;
114-
arraylist_grow(gvs, data->jl_value_to_llvm.size());
115-
memcpy(gvs->items, data->jl_value_to_llvm.data(), gvs->len * sizeof(void*));
120+
jl_native_code_desc_t *desc = (jl_native_code_desc_t *)native_code;
121+
auto &value_map = desc->jl_value_to_llvm;
122+
123+
if (data == NULL) {
124+
*num_elements = value_map.size();
125+
return;
126+
}
127+
128+
assert(*num_elements == value_map.size());
129+
memcpy(data, value_map.data(), *num_elements * sizeof(void *));
116130
}
117131

118-
extern "C" JL_DLLEXPORT_CODEGEN
119-
void jl_get_llvm_external_fns_impl(void *native_code, arraylist_t *external_fns)
132+
extern "C" JL_DLLEXPORT_CODEGEN void jl_get_llvm_external_fns_impl(void *native_code,
133+
size_t *num_elements,
134+
jl_code_instance_t *data)
120135
{
121-
jl_native_code_desc_t *data = (jl_native_code_desc_t*)native_code;
122-
arraylist_grow(external_fns, data->jl_external_to_llvm.size());
123-
memcpy(external_fns->items, data->jl_external_to_llvm.data(),
124-
external_fns->len * sizeof(jl_code_instance_t*));
136+
jl_native_code_desc_t *desc = (jl_native_code_desc_t *)native_code;
137+
auto &external_map = desc->jl_external_to_llvm;
138+
139+
if (data == NULL) {
140+
*num_elements = external_map.size();
141+
return;
142+
}
143+
144+
assert(*num_elements == external_map.size());
145+
memcpy((void *)data, (const void *)external_map.data(),
146+
*num_elements * sizeof(jl_code_instance_t *));
125147
}
126148

127149
extern "C" JL_DLLEXPORT_CODEGEN

src/julia_internal.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,13 +1951,15 @@ JL_DLLIMPORT void *jl_create_native(jl_array_t *methods, LLVMOrcThreadSafeModule
19511951
JL_DLLIMPORT void jl_dump_native(void *native_code,
19521952
const char *bc_fname, const char *unopt_bc_fname, const char *obj_fname, const char *asm_fname,
19531953
ios_t *z, ios_t *s, jl_emission_params_t *params);
1954-
JL_DLLIMPORT void jl_get_llvm_gvs(void *native_code, arraylist_t *gvs);
1955-
JL_DLLIMPORT void jl_get_llvm_external_fns(void *native_code, arraylist_t *gvs);
1954+
JL_DLLIMPORT void jl_get_llvm_gvs(void *native_code, size_t *num_els, void **gvs);
1955+
JL_DLLIMPORT void jl_get_llvm_external_fns(void *native_code, size_t *num_els,
1956+
jl_code_instance_t *gvs);
19561957
JL_DLLIMPORT void jl_get_function_id(void *native_code, jl_code_instance_t *ncode,
19571958
int32_t *func_idx, int32_t *specfunc_idx);
19581959
JL_DLLIMPORT void jl_register_fptrs(uint64_t image_base, const struct _jl_image_fptrs_t *fptrs,
19591960
jl_method_instance_t **linfos, size_t n);
1960-
JL_DLLIMPORT void jl_get_llvm_mis(void *native_code, arraylist_t* MIs);
1961+
JL_DLLIMPORT void jl_get_llvm_mis(void *native_code, size_t *num_els,
1962+
jl_method_instance_t *MIs);
19611963
JL_DLLIMPORT void jl_init_codegen(void);
19621964
JL_DLLIMPORT void jl_teardown_codegen(void) JL_NOTSAFEPOINT;
19631965
JL_DLLIMPORT int jl_getFunctionInfo(jl_frame_t **frames, uintptr_t pointer, int skipC, int noInline) JL_NOTSAFEPOINT;

src/staticdata.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2896,10 +2896,20 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
28962896

28972897
int en = jl_gc_enable(0);
28982898
if (native_functions) {
2899-
jl_get_llvm_gvs(native_functions, &gvars);
2900-
jl_get_llvm_external_fns(native_functions, &external_fns);
2901-
if (jl_options.trim)
2902-
jl_get_llvm_mis(native_functions, &MIs);
2899+
size_t num_gvars, num_external_fns;
2900+
jl_get_llvm_gvs(native_functions, &num_gvars, NULL);
2901+
arraylist_grow(&gvars, num_gvars);
2902+
jl_get_llvm_gvs(native_functions, &num_gvars, gvars.items);
2903+
jl_get_llvm_external_fns(native_functions, &num_external_fns, NULL);
2904+
arraylist_grow(&external_fns, num_external_fns);
2905+
jl_get_llvm_external_fns(native_functions, &num_external_fns,
2906+
(jl_code_instance_t *)external_fns.items);
2907+
if (jl_options.trim) {
2908+
size_t num_mis;
2909+
jl_get_llvm_mis(native_functions, &num_mis, NULL);
2910+
arraylist_grow(&MIs, num_mis);
2911+
jl_get_llvm_mis(native_functions, &num_mis, (jl_method_instance_t *)MIs.items);
2912+
}
29032913
}
29042914
if (jl_options.trim) {
29052915
jl_rebuild_methtables(&MIs, &new_methtables);

0 commit comments

Comments
 (0)