Skip to content

Commit

Permalink
sysimg: reduce the number of special cases (JuliaLang#31948)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
vtjnash committed May 9, 2019
1 parent e3afef0 commit decb802
Show file tree
Hide file tree
Showing 15 changed files with 412 additions and 553 deletions.
61 changes: 30 additions & 31 deletions src/builtins.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ static uintptr_t type_object_id_(jl_value_t *v, jl_varidx_t *env) JL_NOTSAFEPOIN

JL_DLLEXPORT uintptr_t jl_object_id_(jl_value_t *tv, jl_value_t *v) JL_NOTSAFEPOINT
{
if (tv == (jl_value_t*)jl_sym_type)
if (tv == (jl_value_t*)jl_symbol_type)
return ((jl_sym_t*)v)->hash;
if (tv == (jl_value_t*)jl_simplevector_type)
return hash_svec((jl_svec_t*)v);
Expand Down Expand Up @@ -899,7 +899,7 @@ static int valid_type_param(jl_value_t *v)
size_t i, l = jl_nparams(tt);
for(i=0; i < l; i++) {
jl_value_t *pi = jl_tparam(tt,i);
if (!(pi == (jl_value_t*)jl_sym_type || jl_isbits(pi)))
if (!(pi == (jl_value_t*)jl_symbol_type || jl_isbits(pi)))
return 0;
}
return 1;
Expand Down Expand Up @@ -1253,54 +1253,53 @@ jl_fptr_args_t jl_get_builtin_fptr(jl_value_t *b)
return ((jl_typemap_entry_t*)jl_gf_mtable(b)->cache)->func.linfo->cache->specptr.fptr1;
}

static void add_builtin_func(const char *name, jl_fptr_args_t fptr)
static jl_value_t *add_builtin_func(const char *name, jl_fptr_args_t fptr)
{
jl_mk_builtin_func(NULL, name, fptr);
return jl_mk_builtin_func(NULL, name, fptr)->instance;
}

void jl_init_primitives(void) JL_GC_DISABLED
{
add_builtin_func("===", jl_f_is);
add_builtin_func("typeof", jl_f_typeof);
add_builtin_func("sizeof", jl_f_sizeof);
add_builtin_func("<:", jl_f_issubtype);
add_builtin_func("isa", jl_f_isa);
add_builtin_func("typeassert", jl_f_typeassert);
add_builtin_func("throw", jl_f_throw);
add_builtin_func("tuple", jl_f_tuple);
add_builtin_func("ifelse", jl_f_ifelse);
jl_builtin_is = add_builtin_func("===", jl_f_is);
jl_builtin_typeof = add_builtin_func("typeof", jl_f_typeof);
jl_builtin_sizeof = add_builtin_func("sizeof", jl_f_sizeof);
jl_builtin_issubtype = add_builtin_func("<:", jl_f_issubtype);
jl_builtin_isa = add_builtin_func("isa", jl_f_isa);
jl_builtin_typeassert = add_builtin_func("typeassert", jl_f_typeassert);
jl_builtin_throw = add_builtin_func("throw", jl_f_throw);
jl_builtin_tuple = add_builtin_func("tuple", jl_f_tuple);
jl_builtin_ifelse = add_builtin_func("ifelse", jl_f_ifelse);

// field access
add_builtin_func("getfield", jl_f_getfield);
add_builtin_func("setfield!", jl_f_setfield);
add_builtin_func("fieldtype", jl_f_fieldtype);
add_builtin_func("nfields", jl_f_nfields);
add_builtin_func("isdefined", jl_f_isdefined);
jl_builtin_getfield = add_builtin_func("getfield", jl_f_getfield);
jl_builtin_setfield = add_builtin_func("setfield!", jl_f_setfield);
jl_builtin_fieldtype = add_builtin_func("fieldtype", jl_f_fieldtype);
jl_builtin_nfields = add_builtin_func("nfields", jl_f_nfields);
jl_builtin_isdefined = add_builtin_func("isdefined", jl_f_isdefined);

// array primitives
add_builtin_func("arrayref", jl_f_arrayref);
add_builtin_func("const_arrayref", jl_f_arrayref);
add_builtin_func("arrayset", jl_f_arrayset);
add_builtin_func("arraysize", jl_f_arraysize);
jl_builtin_arrayref = add_builtin_func("arrayref", jl_f_arrayref);
jl_builtin_const_arrayref = add_builtin_func("const_arrayref", jl_f_arrayref);
jl_builtin_arrayset = add_builtin_func("arrayset", jl_f_arrayset);
jl_builtin_arraysize = add_builtin_func("arraysize", jl_f_arraysize);

// method table utils
add_builtin_func("applicable", jl_f_applicable);
add_builtin_func("invoke", jl_f_invoke);
jl_value_t *invokef = jl_get_global(jl_core_module, jl_symbol("invoke"));
jl_typename_t *itn = ((jl_datatype_t*)jl_typeof(invokef))->name;
jl_builtin_applicable = add_builtin_func("applicable", jl_f_applicable);
jl_builtin_invoke = add_builtin_func("invoke", jl_f_invoke);
jl_typename_t *itn = ((jl_datatype_t*)jl_typeof(jl_builtin_invoke))->name;
jl_value_t *ikws = jl_new_generic_function_with_supertype(itn->name, jl_core_module, jl_builtin_type, 1);
itn->mt->kwsorter = ikws;
jl_gc_wb(itn->mt, ikws);
jl_mk_builtin_func((jl_datatype_t*)jl_typeof(ikws), jl_symbol_name(jl_gf_name(ikws)), jl_f_invoke_kwsorter);

// internal functions
add_builtin_func("apply_type", jl_f_apply_type);
add_builtin_func("_apply", jl_f__apply);
jl_builtin_apply_type = add_builtin_func("apply_type", jl_f_apply_type);
jl_builtin__apply = add_builtin_func("_apply", jl_f__apply);
jl_builtin__expr = add_builtin_func("_expr", jl_f__expr);
jl_builtin_svec = add_builtin_func("svec", jl_f_svec);
add_builtin_func("_apply_pure", jl_f__apply_pure);
add_builtin_func("_apply_latest", jl_f__apply_latest);
add_builtin_func("_expr", jl_f__expr);
add_builtin_func("_typevar", jl_f__typevar);
add_builtin_func("svec", jl_f_svec);

// builtin types
add_builtin("Any", (jl_value_t*)jl_any_type);
Expand All @@ -1323,7 +1322,7 @@ void jl_init_primitives(void) JL_GC_DISABLED
add_builtin("CodeInstance", (jl_value_t*)jl_code_instance_type);
add_builtin("TypeMapEntry", (jl_value_t*)jl_typemap_entry_type);
add_builtin("TypeMapLevel", (jl_value_t*)jl_typemap_level_type);
add_builtin("Symbol", (jl_value_t*)jl_sym_type);
add_builtin("Symbol", (jl_value_t*)jl_symbol_type);
add_builtin("SSAValue", (jl_value_t*)jl_ssavalue_type);
add_builtin("Slot", (jl_value_t*)jl_abstractslot_type);
add_builtin("SlotNumber", (jl_value_t*)jl_slotnumber_type);
Expand Down
8 changes: 7 additions & 1 deletion src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ static std::map<jl_fptr_args_t, Function*> builtin_func_map;
// --- code generation ---
extern "C" {
int globalUnique = 0;
jl_cgparams_t jl_default_cgparams = {1, 1, 1, 1, 0, NULL, NULL, NULL, NULL, NULL};
}

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

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

jl_page_size = jl_getpagesize();
imaging_mode = jl_generating_output() && !jl_options.incremental;
jl_default_cgparams.module_setup = jl_nothing;
jl_default_cgparams.module_activation = jl_nothing;
jl_default_cgparams.raise_exception = jl_nothing;
jl_default_cgparams.emit_function = jl_nothing;
jl_default_cgparams.emitted_function = jl_nothing;
jl_init_debuginfo();

#ifdef USE_POLLY
Expand Down
9 changes: 4 additions & 5 deletions src/datatype.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ unsigned jl_special_vector_alignment(size_t nfields, jl_value_t *t)

STATIC_INLINE int jl_is_datatype_make_singleton(jl_datatype_t *d)
{
return (!d->abstract && jl_datatype_size(d) == 0 && d != jl_sym_type && d->name != jl_array_typename &&
return (!d->abstract && jl_datatype_size(d) == 0 && d != jl_symbol_type && d->name != jl_array_typename &&
d->uid != 0 && !d->mutabl);
}

Expand Down Expand Up @@ -337,7 +337,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
return;
uint32_t nfields = jl_svec_len(st->types);
if (nfields == 0) {
if (st == jl_sym_type || st == jl_string_type) {
if (st == jl_symbol_type || st == jl_string_type) {
// opaque layout - heap-allocated blob
static const jl_datatype_layout_t opaque_byte_layout = {0, 1, 0, 1, 0};
st->layout = &opaque_byte_layout;
Expand Down Expand Up @@ -371,7 +371,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
desc = (jl_fielddesc32_t*)alloca(descsz);
int haspadding = 0;
assert(st->name == jl_tuple_typename ||
st == jl_sym_type ||
st == jl_symbol_type ||
st == jl_simplevector_type ||
nfields != 0);

Expand Down Expand Up @@ -623,8 +623,7 @@ void jl_assign_bits(void *dest, jl_value_t *bits)

#define PERMBOXN_FUNC(nb,nw) \
jl_value_t *jl_permbox##nb(jl_datatype_t *t, int##nb##_t x) \
{ \
assert(jl_isbits(t)); \
{ /* NOTE: t must be a concrete isbits datatype */ \
assert(jl_datatype_size(t) == sizeof(x)); \
jl_value_t *v = jl_gc_permobj(nw * sizeof(void*), t); \
*(int##nb##_t*)jl_data_ptr(v) = x; \
Expand Down
4 changes: 0 additions & 4 deletions src/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,6 @@ static jl_array_t *serializer_worklist JL_GLOBALLY_ROOTED;
// (only used by the incremental serializer in MODE_MODULE)
htable_t edges_map;

// list of modules being deserialized with __init__ methods
// (not used in MODE_IR)
extern jl_array_t *jl_module_init_order;

#define TAG_SYMBOL 2
#define TAG_SSAVALUE 3
#define TAG_DATATYPE 4
Expand Down
1 change: 0 additions & 1 deletion src/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2477,7 +2477,6 @@ mark: {
}
}

extern jl_array_t *jl_module_init_order;
extern jl_typemap_entry_t *call_cache[N_CALL_CACHE];
extern jl_array_t *jl_all_methods;

Expand Down
5 changes: 3 additions & 2 deletions src/gf.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ JL_DLLEXPORT jl_code_instance_t* jl_set_method_inferred(
jl_value_t *inferred_const, jl_value_t *inferred,
int32_t const_flags, size_t min_world, size_t max_world);

void jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr) JL_GC_DISABLED
jl_datatype_t *jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr) JL_GC_DISABLED
{
jl_sym_t *sname = jl_symbol(name);
if (dt == NULL) {
Expand Down Expand Up @@ -164,6 +164,7 @@ void jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr
jl_typemap_insert(&mt->cache, (jl_value_t*)mt, jl_anytuple_type,
NULL, jl_emptysvec, (jl_value_t*)mi, 0, &lambda_cache, 1, ~(size_t)0, NULL);
JL_GC_POP();
return dt;
}

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

Expand Down
Loading

0 comments on commit decb802

Please sign in to comment.