diff --git a/Compiler/src/verifytrim.jl b/Compiler/src/verifytrim.jl index eef2f15d43e86..0a77a860c2c8b 100644 --- a/Compiler/src/verifytrim.jl +++ b/Compiler/src/verifytrim.jl @@ -189,7 +189,6 @@ function verify_codeinstance!(interp::NativeInterpreter, codeinst::CodeInstance, end # TODO: check for calls to Base.atexit? elseif isexpr(stmt, :call) - error = "unresolved call" farg = stmt.args[1] ftyp = widenconst(argextype(farg, codeinfo, sptypes)) if ftyp <: IntrinsicFunction @@ -250,6 +249,8 @@ function verify_codeinstance!(interp::NativeInterpreter, codeinst::CodeInstance, elseif Core.memoryrefmodify! isa ftyp error = "trim verification not yet implemented for builtin `Core.memoryrefmodify!`" else @assert false "unexpected builtin" end + else + error = "unresolved call" end extyp = argextype(SSAValue(i), codeinfo, sptypes) if extyp === Union{} diff --git a/src/staticdata.c b/src/staticdata.c index ec7f5f4267a55..f537097b0c06e 100644 --- a/src/staticdata.c +++ b/src/staticdata.c @@ -2956,11 +2956,31 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array, size_t num_mis; jl_get_llvm_cis(native_functions, &num_mis, NULL); arraylist_grow(&MIs, num_mis); + + // Record MethodInstances for user-provided code (as reported by codegen) jl_get_llvm_cis(native_functions, &num_mis, (jl_code_instance_t**)MIs.items); for (size_t i = 0; i < num_mis; i++) { jl_code_instance_t *ci = (jl_code_instance_t*)MIs.items[i]; MIs.items[i] = (void*)jl_get_ci_mi(ci); } + + // Record MethodInstances for built-ins (used when dynamically dispatching to a + // built-in, e.g., in the Core._apply_iterate implementation) + for (size_t i = 0; i < jl_n_builtins; i++) { + jl_value_t *builtin = jl_builtin_instances[i]; + if (builtin == NULL) + continue; + + jl_datatype_t *dt = (jl_datatype_t*)jl_typeof(builtin); + jl_value_t *params[2]; + params[0] = dt->name->wrapper; + params[1] = jl_tparam0(jl_anytuple_type); + jl_datatype_t *tt = (jl_datatype_t*)jl_apply_tuple_type_v(params, 2); + + jl_method_instance_t *mi = (jl_method_instance_t *)jl_method_lookup_by_tt(tt, /* world */ 1, /* mt */ jl_nothing); + assert(!jl_is_nothing(mi)); + arraylist_push(&MIs, mi); + } } } if (jl_options.trim) { diff --git a/test/trimming/basic_jll.jl b/test/trimming/basic_jll.jl index 748bc2585c050..87b409405dbfd 100644 --- a/test/trimming/basic_jll.jl +++ b/test/trimming/basic_jll.jl @@ -9,6 +9,8 @@ function print_string(fptr::Ptr{Cvoid}) println(Core.stdout, unsafe_string(ccall(fptr, Cstring, ()))) end +version_str::String = "1.2.3" + function @main(args::Vector{String})::Cint # Test the basic "Hello, world!" println(Core.stdout, "Julia! Hello, world!") @@ -18,6 +20,9 @@ function @main(args::Vector{String})::Cint println(Core.stdout, ver) @assert ver == build_ver + parsed_ver = VersionNumber(version_str) + @assert parsed_ver == v"1.2.3" + sleep(0.01) # Add an indirection via `@cfunction` / 1-arg ccall