Skip to content

Commit decb802

Browse files
authored
sysimg: reduce the number of special cases (#31948)
Put the entire image(*) into our pre-constructed data image, instead of attempting to leave out a couple of items. This saves us a couple lines of code, and should makes it simpler to keep the list of builtin objects (gc.c "tags") up-to-date. (*) The remaining special objects are ptls->root_task, since I was unsure the best way to handle it as no other Task object is allowed to be referenced, and the small integer caches.
1 parent e3afef0 commit decb802

15 files changed

Lines changed: 412 additions & 553 deletions

src/builtins.c

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ static uintptr_t type_object_id_(jl_value_t *v, jl_varidx_t *env) JL_NOTSAFEPOIN
279279

280280
JL_DLLEXPORT uintptr_t jl_object_id_(jl_value_t *tv, jl_value_t *v) JL_NOTSAFEPOINT
281281
{
282-
if (tv == (jl_value_t*)jl_sym_type)
282+
if (tv == (jl_value_t*)jl_symbol_type)
283283
return ((jl_sym_t*)v)->hash;
284284
if (tv == (jl_value_t*)jl_simplevector_type)
285285
return hash_svec((jl_svec_t*)v);
@@ -899,7 +899,7 @@ static int valid_type_param(jl_value_t *v)
899899
size_t i, l = jl_nparams(tt);
900900
for(i=0; i < l; i++) {
901901
jl_value_t *pi = jl_tparam(tt,i);
902-
if (!(pi == (jl_value_t*)jl_sym_type || jl_isbits(pi)))
902+
if (!(pi == (jl_value_t*)jl_symbol_type || jl_isbits(pi)))
903903
return 0;
904904
}
905905
return 1;
@@ -1253,54 +1253,53 @@ jl_fptr_args_t jl_get_builtin_fptr(jl_value_t *b)
12531253
return ((jl_typemap_entry_t*)jl_gf_mtable(b)->cache)->func.linfo->cache->specptr.fptr1;
12541254
}
12551255

1256-
static void add_builtin_func(const char *name, jl_fptr_args_t fptr)
1256+
static jl_value_t *add_builtin_func(const char *name, jl_fptr_args_t fptr)
12571257
{
1258-
jl_mk_builtin_func(NULL, name, fptr);
1258+
return jl_mk_builtin_func(NULL, name, fptr)->instance;
12591259
}
12601260

12611261
void jl_init_primitives(void) JL_GC_DISABLED
12621262
{
1263-
add_builtin_func("===", jl_f_is);
1264-
add_builtin_func("typeof", jl_f_typeof);
1265-
add_builtin_func("sizeof", jl_f_sizeof);
1266-
add_builtin_func("<:", jl_f_issubtype);
1267-
add_builtin_func("isa", jl_f_isa);
1268-
add_builtin_func("typeassert", jl_f_typeassert);
1269-
add_builtin_func("throw", jl_f_throw);
1270-
add_builtin_func("tuple", jl_f_tuple);
1271-
add_builtin_func("ifelse", jl_f_ifelse);
1263+
jl_builtin_is = add_builtin_func("===", jl_f_is);
1264+
jl_builtin_typeof = add_builtin_func("typeof", jl_f_typeof);
1265+
jl_builtin_sizeof = add_builtin_func("sizeof", jl_f_sizeof);
1266+
jl_builtin_issubtype = add_builtin_func("<:", jl_f_issubtype);
1267+
jl_builtin_isa = add_builtin_func("isa", jl_f_isa);
1268+
jl_builtin_typeassert = add_builtin_func("typeassert", jl_f_typeassert);
1269+
jl_builtin_throw = add_builtin_func("throw", jl_f_throw);
1270+
jl_builtin_tuple = add_builtin_func("tuple", jl_f_tuple);
1271+
jl_builtin_ifelse = add_builtin_func("ifelse", jl_f_ifelse);
12721272

12731273
// field access
1274-
add_builtin_func("getfield", jl_f_getfield);
1275-
add_builtin_func("setfield!", jl_f_setfield);
1276-
add_builtin_func("fieldtype", jl_f_fieldtype);
1277-
add_builtin_func("nfields", jl_f_nfields);
1278-
add_builtin_func("isdefined", jl_f_isdefined);
1274+
jl_builtin_getfield = add_builtin_func("getfield", jl_f_getfield);
1275+
jl_builtin_setfield = add_builtin_func("setfield!", jl_f_setfield);
1276+
jl_builtin_fieldtype = add_builtin_func("fieldtype", jl_f_fieldtype);
1277+
jl_builtin_nfields = add_builtin_func("nfields", jl_f_nfields);
1278+
jl_builtin_isdefined = add_builtin_func("isdefined", jl_f_isdefined);
12791279

12801280
// array primitives
1281-
add_builtin_func("arrayref", jl_f_arrayref);
1282-
add_builtin_func("const_arrayref", jl_f_arrayref);
1283-
add_builtin_func("arrayset", jl_f_arrayset);
1284-
add_builtin_func("arraysize", jl_f_arraysize);
1281+
jl_builtin_arrayref = add_builtin_func("arrayref", jl_f_arrayref);
1282+
jl_builtin_const_arrayref = add_builtin_func("const_arrayref", jl_f_arrayref);
1283+
jl_builtin_arrayset = add_builtin_func("arrayset", jl_f_arrayset);
1284+
jl_builtin_arraysize = add_builtin_func("arraysize", jl_f_arraysize);
12851285

12861286
// method table utils
1287-
add_builtin_func("applicable", jl_f_applicable);
1288-
add_builtin_func("invoke", jl_f_invoke);
1289-
jl_value_t *invokef = jl_get_global(jl_core_module, jl_symbol("invoke"));
1290-
jl_typename_t *itn = ((jl_datatype_t*)jl_typeof(invokef))->name;
1287+
jl_builtin_applicable = add_builtin_func("applicable", jl_f_applicable);
1288+
jl_builtin_invoke = add_builtin_func("invoke", jl_f_invoke);
1289+
jl_typename_t *itn = ((jl_datatype_t*)jl_typeof(jl_builtin_invoke))->name;
12911290
jl_value_t *ikws = jl_new_generic_function_with_supertype(itn->name, jl_core_module, jl_builtin_type, 1);
12921291
itn->mt->kwsorter = ikws;
12931292
jl_gc_wb(itn->mt, ikws);
12941293
jl_mk_builtin_func((jl_datatype_t*)jl_typeof(ikws), jl_symbol_name(jl_gf_name(ikws)), jl_f_invoke_kwsorter);
12951294

12961295
// internal functions
1297-
add_builtin_func("apply_type", jl_f_apply_type);
1298-
add_builtin_func("_apply", jl_f__apply);
1296+
jl_builtin_apply_type = add_builtin_func("apply_type", jl_f_apply_type);
1297+
jl_builtin__apply = add_builtin_func("_apply", jl_f__apply);
1298+
jl_builtin__expr = add_builtin_func("_expr", jl_f__expr);
1299+
jl_builtin_svec = add_builtin_func("svec", jl_f_svec);
12991300
add_builtin_func("_apply_pure", jl_f__apply_pure);
13001301
add_builtin_func("_apply_latest", jl_f__apply_latest);
1301-
add_builtin_func("_expr", jl_f__expr);
13021302
add_builtin_func("_typevar", jl_f__typevar);
1303-
add_builtin_func("svec", jl_f_svec);
13041303

13051304
// builtin types
13061305
add_builtin("Any", (jl_value_t*)jl_any_type);
@@ -1323,7 +1322,7 @@ void jl_init_primitives(void) JL_GC_DISABLED
13231322
add_builtin("CodeInstance", (jl_value_t*)jl_code_instance_type);
13241323
add_builtin("TypeMapEntry", (jl_value_t*)jl_typemap_entry_type);
13251324
add_builtin("TypeMapLevel", (jl_value_t*)jl_typemap_level_type);
1326-
add_builtin("Symbol", (jl_value_t*)jl_sym_type);
1325+
add_builtin("Symbol", (jl_value_t*)jl_symbol_type);
13271326
add_builtin("SSAValue", (jl_value_t*)jl_ssavalue_type);
13281327
add_builtin("Slot", (jl_value_t*)jl_abstractslot_type);
13291328
add_builtin("SlotNumber", (jl_value_t*)jl_slotnumber_type);

src/codegen.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ static std::map<jl_fptr_args_t, Function*> builtin_func_map;
345345
// --- code generation ---
346346
extern "C" {
347347
int globalUnique = 0;
348+
jl_cgparams_t jl_default_cgparams = {1, 1, 1, 1, 0, NULL, NULL, NULL, NULL, NULL};
348349
}
349350

350351
template<typename T>
@@ -2383,7 +2384,7 @@ static Value *emit_f_is(jl_codectx_t &ctx, const jl_cgval_t &arg1, const jl_cgva
23832384
// TODO: handle with emit_bitsunion_compare
23842385

23852386
int ptr_comparable = 0; // whether this type is unique'd by pointer
2386-
if (rt1 == (jl_value_t*)jl_sym_type || rt2 == (jl_value_t*)jl_sym_type)
2387+
if (rt1 == (jl_value_t*)jl_symbol_type || rt2 == (jl_value_t*)jl_symbol_type)
23872388
ptr_comparable = 1;
23882389
if (jl_is_mutable_datatype(rt1) && // excludes abstract types
23892390
rt1 != (jl_value_t*)jl_string_type && // technically mutable, but compared by contents
@@ -7637,6 +7638,11 @@ extern "C" void *jl_init_llvm(void)
76377638

76387639
jl_page_size = jl_getpagesize();
76397640
imaging_mode = jl_generating_output() && !jl_options.incremental;
7641+
jl_default_cgparams.module_setup = jl_nothing;
7642+
jl_default_cgparams.module_activation = jl_nothing;
7643+
jl_default_cgparams.raise_exception = jl_nothing;
7644+
jl_default_cgparams.emit_function = jl_nothing;
7645+
jl_default_cgparams.emitted_function = jl_nothing;
76407646
jl_init_debuginfo();
76417647

76427648
#ifdef USE_POLLY

src/datatype.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ unsigned jl_special_vector_alignment(size_t nfields, jl_value_t *t)
223223

224224
STATIC_INLINE int jl_is_datatype_make_singleton(jl_datatype_t *d)
225225
{
226-
return (!d->abstract && jl_datatype_size(d) == 0 && d != jl_sym_type && d->name != jl_array_typename &&
226+
return (!d->abstract && jl_datatype_size(d) == 0 && d != jl_symbol_type && d->name != jl_array_typename &&
227227
d->uid != 0 && !d->mutabl);
228228
}
229229

@@ -337,7 +337,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
337337
return;
338338
uint32_t nfields = jl_svec_len(st->types);
339339
if (nfields == 0) {
340-
if (st == jl_sym_type || st == jl_string_type) {
340+
if (st == jl_symbol_type || st == jl_string_type) {
341341
// opaque layout - heap-allocated blob
342342
static const jl_datatype_layout_t opaque_byte_layout = {0, 1, 0, 1, 0};
343343
st->layout = &opaque_byte_layout;
@@ -371,7 +371,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
371371
desc = (jl_fielddesc32_t*)alloca(descsz);
372372
int haspadding = 0;
373373
assert(st->name == jl_tuple_typename ||
374-
st == jl_sym_type ||
374+
st == jl_symbol_type ||
375375
st == jl_simplevector_type ||
376376
nfields != 0);
377377

@@ -623,8 +623,7 @@ void jl_assign_bits(void *dest, jl_value_t *bits)
623623

624624
#define PERMBOXN_FUNC(nb,nw) \
625625
jl_value_t *jl_permbox##nb(jl_datatype_t *t, int##nb##_t x) \
626-
{ \
627-
assert(jl_isbits(t)); \
626+
{ /* NOTE: t must be a concrete isbits datatype */ \
628627
assert(jl_datatype_size(t) == sizeof(x)); \
629628
jl_value_t *v = jl_gc_permobj(nw * sizeof(void*), t); \
630629
*(int##nb##_t*)jl_data_ptr(v) = x; \

src/dump.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,6 @@ static jl_array_t *serializer_worklist JL_GLOBALLY_ROOTED;
6868
// (only used by the incremental serializer in MODE_MODULE)
6969
htable_t edges_map;
7070

71-
// list of modules being deserialized with __init__ methods
72-
// (not used in MODE_IR)
73-
extern jl_array_t *jl_module_init_order;
74-
7571
#define TAG_SYMBOL 2
7672
#define TAG_SSAVALUE 3
7773
#define TAG_DATATYPE 4

src/gc.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2477,7 +2477,6 @@ mark: {
24772477
}
24782478
}
24792479

2480-
extern jl_array_t *jl_module_init_order;
24812480
extern jl_typemap_entry_t *call_cache[N_CALL_CACHE];
24822481
extern jl_array_t *jl_all_methods;
24832482

src/gf.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ JL_DLLEXPORT jl_code_instance_t* jl_set_method_inferred(
133133
jl_value_t *inferred_const, jl_value_t *inferred,
134134
int32_t const_flags, size_t min_world, size_t max_world);
135135

136-
void jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr) JL_GC_DISABLED
136+
jl_datatype_t *jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr) JL_GC_DISABLED
137137
{
138138
jl_sym_t *sname = jl_symbol(name);
139139
if (dt == NULL) {
@@ -164,6 +164,7 @@ void jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr
164164
jl_typemap_insert(&mt->cache, (jl_value_t*)mt, jl_anytuple_type,
165165
NULL, jl_emptysvec, (jl_value_t*)mi, 0, &lambda_cache, 1, ~(size_t)0, NULL);
166166
JL_GC_POP();
167+
return dt;
167168
}
168169

169170
// run type inference on lambda "mi" for given argument types.
@@ -1695,7 +1696,7 @@ JL_DLLEXPORT jl_value_t *jl_matching_methods(jl_tupletype_t *types, int lim, int
16951696
return jl_false; // indeterminate - ml_matches can't deal with this case
16961697
jl_methtable_t *mt = dt->name->mt;
16971698
if (mt == NULL)
1698-
return (jl_value_t*)jl_alloc_vec_any(0);
1699+
return (jl_value_t*)jl_an_empty_vec_any;
16991700
return ml_matches(mt->defs, 0, types, lim, include_ambiguous, world, min_valid, max_valid);
17001701
}
17011702

0 commit comments

Comments
 (0)