From 63e95d47e692352fac5541b6ee835b573f4c4898 Mon Sep 17 00:00:00 2001 From: Ian Butterworth Date: Fri, 9 Feb 2024 02:34:34 -0500 Subject: [PATCH] Add nested precomp highlight debug (#53111) --- base/loading.jl | 13 +++++++++++++ pkgimage.mk | 3 +++ 2 files changed, 16 insertions(+) diff --git a/base/loading.jl b/base/loading.jl index 34d1e848ecb98..d18d4e72ae809 100644 --- a/base/loading.jl +++ b/base/loading.jl @@ -2508,6 +2508,7 @@ function create_expr_cache(pkg::PkgId, input::String, output::String, output_o:: # write data over stdin to avoid the (unlikely) case of exceeding max command line size write(io.in, """ empty!(Base.EXT_DORMITORY) # If we have a custom sysimage with `EXT_DORMITORY` prepopulated + Base.track_nested_precomp($(vcat(Base.precompilation_stack, pkg))) Base.precompiling_extension = $(loading_extension) Base.include_package_for_output($(pkg_str(pkg)), $(repr(abspath(input))), $(repr(depot_path)), $(repr(dl_load_path)), $(repr(load_path)), $deps, $(repr(source_path(nothing)))) @@ -2516,6 +2517,18 @@ function create_expr_cache(pkg::PkgId, input::String, output::String, output_o:: return io end +const precompilation_stack = Vector{PkgId}() +# Helpful for debugging when precompilation is unexpectedly nested. +# Enable with `JULIA_DEBUG=nested_precomp`. Note that it expected to be nested in classical code-load precompilation +# TODO: Add detection if extension precompilation is nested and error / return early? +function track_nested_precomp(pkgs::Vector{PkgId}) + append!(precompilation_stack, pkgs) + if length(precompilation_stack) > 1 + list() = join(map(p->p.name, precompilation_stack), " > ") + @debug "Nested precompilation: $(list())" _group=:nested_precomp + end +end + function compilecache_dir(pkg::PkgId) entrypath, entryfile = cache_file_entry(pkg) return joinpath(DEPOT_PATH[1], entrypath) diff --git a/pkgimage.mk b/pkgimage.mk index 9a46a8d581bf8..b45b4ab89560b 100644 --- a/pkgimage.mk +++ b/pkgimage.mk @@ -69,6 +69,9 @@ cache-debug-$1: $$(BUILDDIR)/stdlib/$1.debug.image .SECONDARY: $$(BUILDDIR)/stdlib/$1.release.image $$(BUILDDIR)/stdlib/$1.debug.image endef +# Note: you can check for the correctness of this tree by running `JULIA_DEBUG=nested_precomp make` and looking +# out for `Debug: Nested precompilation` logs. + # no dependencies $(eval $(call stdlib_builder,MozillaCACerts_jll,)) $(eval $(call stdlib_builder,ArgTools,))