Skip to content

Commit 8128473

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 8128473

File tree

3 files changed

+50
-21
lines changed

3 files changed

+50
-21
lines changed

src/aotcompile.cpp

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,32 +96,52 @@ void jl_get_function_id_impl(void *native_code, jl_code_instance_t *codeinst,
9696
}
9797

9898
extern "C" JL_DLLEXPORT_CODEGEN
99-
void jl_get_llvm_mis_impl(void *native_code, arraylist_t* MIs)
99+
void 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

109116
extern "C" JL_DLLEXPORT_CODEGEN
110-
void jl_get_llvm_gvs_impl(void *native_code, arraylist_t *gvs)
117+
void jl_get_llvm_gvs_impl(void *native_code, 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

118132
extern "C" JL_DLLEXPORT_CODEGEN
119-
void jl_get_llvm_external_fns_impl(void *native_code, arraylist_t *external_fns)
133+
void jl_get_llvm_external_fns_impl(void *native_code, size_t *num_elements, jl_code_instance_t *data)
120134
{
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*));
135+
jl_native_code_desc_t *desc = (jl_native_code_desc_t*)native_code;
136+
auto &external_map = desc->jl_external_to_llvm;
137+
138+
if (data == NULL) {
139+
*num_elements = external_map.size();
140+
return;
141+
}
142+
143+
assert(*num_elements == external_map.size());
144+
memcpy(data, external_map.data(), *num_elements * sizeof(jl_code_instance_t*));
125145
}
126146

127147
extern "C" JL_DLLEXPORT_CODEGEN

src/julia_internal.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,13 +1951,13 @@ 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, jl_code_instance_t *gvs);
19561956
JL_DLLIMPORT void jl_get_function_id(void *native_code, jl_code_instance_t *ncode,
19571957
int32_t *func_idx, int32_t *specfunc_idx);
19581958
JL_DLLIMPORT void jl_register_fptrs(uint64_t image_base, const struct _jl_image_fptrs_t *fptrs,
19591959
jl_method_instance_t **linfos, size_t n);
1960-
JL_DLLIMPORT void jl_get_llvm_mis(void *native_code, arraylist_t* MIs);
1960+
JL_DLLIMPORT void jl_get_llvm_mis(void *native_code, size_t *num_els, jl_method_instance_t* MIs);
19611961
JL_DLLIMPORT void jl_init_codegen(void);
19621962
JL_DLLIMPORT void jl_teardown_codegen(void) JL_NOTSAFEPOINT;
19631963
JL_DLLIMPORT int jl_getFunctionInfo(jl_frame_t **frames, uintptr_t pointer, int skipC, int noInline) JL_NOTSAFEPOINT;

src/staticdata.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2896,10 +2896,19 @@ 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, (jl_code_instance_t*) external_fns.items);
2906+
if (jl_options.trim) {
2907+
size_t num_mis;
2908+
jl_get_llvm_mis(native_functions, &num_mis, NULL);
2909+
arraylist_grow(&MIs, num_mis);
2910+
jl_get_llvm_mis(native_functions, &num_mis, (jl_method_instance_t*) MIs.items);
2911+
}
29032912
}
29042913
if (jl_options.trim) {
29052914
jl_rebuild_methtables(&MIs, &new_methtables);

0 commit comments

Comments
 (0)