Skip to content

Commit be5c83c

Browse files
committed
cleanup rebase a bit, now missing functionality
1 parent 701a60a commit be5c83c

File tree

5 files changed

+24
-71
lines changed

5 files changed

+24
-71
lines changed

src/aotcompile.cpp

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ typedef struct {
9393
std::vector<GlobalValue*> jl_sysimg_gvars;
9494
std::map<jl_code_instance_t*, std::tuple<uint32_t, uint32_t>> jl_fvar_map;
9595
std::vector<void*> jl_value_to_llvm;
96-
std::map<std::tuple<jl_code_instance_t*, bool>, int32_t> jl_external_to_llvm; // uses 1-based indexing
96+
std::vector<jl_code_instance_t*> jl_external_to_llvm;
9797
int32_t external_fns_begin;
9898
} jl_native_code_desc_t;
9999

@@ -121,23 +121,12 @@ void jl_get_llvm_gvs_impl(void *native_code, arraylist_t *gvs)
121121
}
122122

123123
extern "C" JL_DLLEXPORT
124-
void jl_iterate_llvm_external_fns_impl(void *native_code, void (*callback)(void*, int32_t, jl_code_instance_t*, uint8_t), void* ctx)
124+
void jl_get_llvm_external_fns_impl(void *native_code, arraylist_t *external_fns)
125125
{
126126
jl_native_code_desc_t *data = (jl_native_code_desc_t*)native_code;
127-
if (data) {
128-
for (std::pair<std::tuple<jl_code_instance_t*, uint8_t>, int32_t> pair : data->jl_external_to_llvm) {
129-
callback(ctx, pair.second, std::get<0>(pair.first), std::get<1>(pair.first));
130-
}
131-
}
132-
}
133-
extern "C" JL_DLLEXPORT
134-
int32_t jl_get_llvm_external_fns_begin_impl(void *native_code)
135-
{
136-
jl_native_code_desc_t *data = (jl_native_code_desc_t*)native_code;
137-
if (data) {
138-
return data->external_fns_begin;
139-
}
140-
return 0;
127+
arraylist_grow(external_fns, data->jl_external_to_llvm.size());
128+
memcpy(external_fns->items, data->jl_external_to_llvm.data(),
129+
external_fns->len * sizeof(jl_code_instance_t*));
141130
}
142131

143132
extern "C" JL_DLLEXPORT
@@ -367,16 +356,18 @@ void *jl_create_native_impl(jl_array_t *methods, LLVMOrcThreadSafeModuleRef llvm
367356
}
368357
CreateNativeMethods += emitted.size();
369358

370-
data->external_fns_begin = gvars.size() + 1;
359+
size_t offset = gvars.size();
360+
data->jl_external_to_llvm.resize(params.external_fns.size());
371361

372362
for (auto &extern_fn : params.external_fns) {
373-
// jl_code_instance_t *this_code = std::get<0>(extern_fn.first);
374-
// bool specsig = std::get<1>(extern_fn.first);
363+
jl_code_instance_t *this_code = std::get<0>(extern_fn.first);
364+
bool specsig = std::get<1>(extern_fn.first);
365+
assert(specsig && "Error external_fns doesn't handle non-specsig yet");
375366
Function *F = extern_fn.second;
376367
Module *M = F->getParent();
377368

378369
Type *T_funcp = F->getFunctionType()->getPointerTo();
379-
// Can't create a GC with type FunctionType grr
370+
// Can't create a GC with type FunctionType. Alias also doesn't work
380371
GlobalVariable *GV = new GlobalVariable(*M, T_funcp, false,
381372
GlobalVariable::ExternalLinkage,
382373
Constant::getNullValue(T_funcp),
@@ -399,8 +390,10 @@ void *jl_create_native_impl(jl_array_t *methods, LLVMOrcThreadSafeModuleRef llvm
399390
GV->takeName(F);
400391
F->eraseFromParent();
401392

393+
size_t idx = gvars.size() - offset;
394+
assert(idx >= 0);
395+
data->jl_external_to_llvm.at(idx) = this_code;
402396
gvars.push_back(std::string(GV->getName()));
403-
data->jl_external_to_llvm[extern_fn.first] = gvars.size();
404397
}
405398

406399
// clones the contents of the module `m` to the shadow_output collector

src/codegen-stubs.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +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
const char *sysimg_data, size_t sysimg_len) UNAVAILABLE
1616
JL_DLLEXPORT void jl_get_llvm_gvs_fallback(void *native_code, arraylist_t *gvs) UNAVAILABLE
17-
JL_DLLEXPORT void jl_iterate_llvm_gv_fallback(void *native_code, void (*callback)(void*, int32_t, void*), void* ctx) UNAVAILABLE
18-
JL_DLLEXPORT void jl_iterate_llvm_external_fns_fallback(void *native_code, void (*callback)(void*, int32_t, jl_code_instance_t*, uint8_t), void* ctx) UNAVAILABLE
19-
JL_DLLEXPORT int32_t jl_get_llvm_external_fns_begin_fallback(void *native_code) UNAVAILABLE;
17+
JL_DLLEXPORT void jl_get_llvm_external_fns_fallback(void *native_code, arraylist_t *gvs) UNAVAILABLE
2018

2119
JL_DLLEXPORT void jl_extern_c_fallback(jl_function_t *f, jl_value_t *rt, jl_value_t *argt, char *name) UNAVAILABLE
2220
JL_DLLEXPORT jl_value_t *jl_dump_method_asm_fallback(jl_method_instance_t *linfo, size_t world,

src/jl_exported_funcs.inc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,9 +535,7 @@
535535
YY(jl_get_LLVM_VERSION) \
536536
YY(jl_dump_native) \
537537
YY(jl_get_llvm_gvs) \
538-
YY(jl_iterate_llvm_gv) \
539-
YY(jl_iterate_llvm_external_fns) \
540-
YY(jl_get_llvm_external_fns_begin) \
538+
YY(jl_get_llvm_external_fns) \
541539
YY(jl_dump_function_asm) \
542540
YY(jl_LLVMCreateDisasm) \
543541
YY(jl_LLVMDisasmInstruction) \

src/julia_internal.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -975,9 +975,7 @@ void jl_dump_native(void *native_code,
975975
const char *bc_fname, const char *unopt_bc_fname, const char *obj_fname, const char *asm_fname,
976976
const char *sysimg_data, size_t sysimg_len);
977977
void jl_get_llvm_gvs(void *native_code, arraylist_t *gvs);
978-
void jl_iterate_llvm_gv(void *native_code, void (*callback)(void*, int32_t, void*), void*) JL_NOTSAFEPOINT;
979-
void jl_iterate_llvm_external_fns(void *native_code, void (*callback)(void*, int32_t, jl_code_instance_t*, uint8_t), void*) JL_NOTSAFEPOINT;
980-
int32_t jl_get_llvm_external_fns_begin(void *native_code);
978+
void jl_get_llvm_external_fns(void *native_code, arraylist_t *gvs);
981979
JL_DLLEXPORT void jl_get_function_id(void *native_code, jl_code_instance_t *ncode,
982980
int32_t *func_idx, int32_t *specfunc_idx);
983981

src/staticdata.c

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,42 +1451,6 @@ static void jl_write_values(jl_serializer_state *s) JL_GC_DISABLED
14511451
}
14521452
}
14531453

1454-
static void jl_ensure_extern(void* ctx, int32_t GV, void* v) {
1455-
jl_serializer_state *s = (jl_serializer_state*)ctx;
1456-
// externally_linked is insufficient as a check because it doesn't visit
1457-
// everything needed by LLVM and can't efficiently identify whether a
1458-
// global variable is external.
1459-
uintptr_t item = external_linkage(s, (jl_value_t*)v, s->link_ids_gvars);
1460-
if (item == 0)
1461-
return;
1462-
1463-
// TODO: Check that we don't override an existing entry
1464-
// jl_printf(JL_STDOUT, "GV: %ld, record_gvar for %lx, build_id: %lx\n", GV, item, jl_array_data(s->link_ids_gvars)[jl_array_len(s->link_ids_gvars)-1]);
1465-
assert(item >> RELOC_TAG_OFFSET == ExternalLinkage);
1466-
record_gvar(s, GV, item);
1467-
}
1468-
1469-
static void jl_ensure_extern_gv(jl_serializer_state *s) {
1470-
jl_iterate_llvm_gv(native_functions, jl_ensure_extern, (void*)s);
1471-
}
1472-
1473-
static void jl_ensure_extern_fn(void* ctx, int32_t GV, jl_code_instance_t* codeinst, uint8_t specsig) {
1474-
jl_serializer_state *s = (jl_serializer_state*)ctx;
1475-
1476-
// TODO: Record specsig in a side-table?
1477-
uintptr_t item = external_linkage(s, (jl_value_t*)codeinst, s->link_ids_external_fnvars);
1478-
jl_printf(JL_STDOUT, "External Functions: %ld, record_gvar for %lx\n", GV, item);
1479-
if (item == 0)
1480-
return;
1481-
1482-
assert(item >> RELOC_TAG_OFFSET == ExternalLinkage);
1483-
record_gvar(s, GV, item);
1484-
}
1485-
1486-
static void jl_ensure_extern_fns(jl_serializer_state *s) {
1487-
jl_iterate_llvm_external_fns(native_functions, jl_ensure_extern_fn, (void*)s);
1488-
}
1489-
14901454
// In deserialization, create Symbols and set up the
14911455
// index for backreferencing
14921456
static void jl_read_symbols(jl_serializer_state *s)
@@ -2265,9 +2229,13 @@ static void jl_save_system_image_to_stream(ios_t *f,
22652229
jl_value_t **const*const tags = get_tags(); // worklist == NULL ? get_tags() : NULL;
22662230

22672231
arraylist_t gvars;
2232+
arraylist_t external_fns;
22682233
arraylist_new(&gvars, 0);
2269-
if (native_functions)
2234+
arraylist_new(&external_fns);
2235+
if (native_functions) {
22702236
jl_get_llvm_gvs(native_functions, &gvars);
2237+
jl_get_llvm_external_fns(native_functions, &external_fns);
2238+
}
22712239

22722240
if (worklist == NULL) {
22732241
// empty!(Core.ARGS)
@@ -2333,6 +2301,7 @@ static void jl_save_system_image_to_stream(ios_t *f,
23332301
jl_serialize_reachable(&s);
23342302
// step 1.2: now that we have marked all bindings (badly), ensure all gvars are part of the sysimage
23352303
record_gvars(&s, &gvars);
2304+
// TODO record external_fns?
23362305
jl_serialize_reachable(&s);
23372306
// step 1.3: prune (garbage collect) some special weak references from
23382307
// built-in type caches
@@ -2349,12 +2318,9 @@ static void jl_save_system_image_to_stream(ios_t *f,
23492318
{ // step 2: build all the sysimg sections
23502319
write_padding(&sysimg, sizeof(uintptr_t));
23512320
jl_write_values(&s);
2352-
if (worklist) {
2353-
jl_ensure_extern_gv(&s);
2354-
jl_ensure_extern_fns(&s);
2355-
}
23562321
jl_write_relocations(&s);
23572322
write_gvars(&s, &gvars);
2323+
// TODO write external_fns;
23582324
}
23592325

23602326
if (sysimg.size > ((uintptr_t)1 << RELOC_TAG_OFFSET)) {

0 commit comments

Comments
 (0)