Skip to content

Commit

Permalink
allow the Compiler.jl stdlib to be installed on older version of Julia
Browse files Browse the repository at this point in the history
Since #56409, Compiler.jl as a standard library has
become available. However, for Julia versions prior to this change, even
though the stdlib can be installed via Pkg.jl, the precompilation fails
due to code compatibility issues. Consequently, when an external package
that uses the Compiler stdlib adds Compiler.jl to its Project.toml, the
package would stop working on older Julia versions.

To address this, this commit adopts the same approach as JET.jl.
Specifically, on older Julia versions, a dummy `Compiler` module is
defined, allowing dependent packages to switch between using the
Compiler.jl stdlib or the previous `Core.Compiler`. While this is a
somewhat hacky solution, it should resolve the issue for now.
  • Loading branch information
aviatesk committed Nov 14, 2024
1 parent aa05c98 commit 92d6adc
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 11 deletions.
17 changes: 15 additions & 2 deletions Compiler/src/Compiler.jl
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
# This file is a part of Julia. License is MIT: https://julialang.org/license

if isdefined(Base, :end_base_include) && isdefined(Base, :Compiler)

# Define a dummy `Compiler` module to make it installable even on Julia versions where
# Compiler.jl is not available as a standard library.
@eval module Compiler
function __init__()
println("""
The `Compiler` standard library is not available for this version of Julia.
Use Julia version `v"1.12.0-DEV.1581"` or later.
""")
end
end

# When generating an incremental precompile file, we first check whether we
# already have a copy of this *exact* code in the system image. If so, we
# simply generates a pkgimage that has the dependency edges we recorded in
# the system image and simply returns that copy of the compiler. If not,
# we proceed to load/precompile this as an ordinary package.
if isdefined(Base, :generating_output) && Base.generating_output(true) &&
elseif (isdefined(Base, :generating_output) && Base.generating_output(true) &&
Base.samefile(joinpath(Sys.BINDIR, Base.DATAROOTDIR, Base._compiler_require_dependencies[1][2]), @eval @__FILE__) &&
!Base.any_includes_stale(
map(Base.compiler_chi, Base._compiler_require_dependencies),
"sysimg", nothing)
"sysimg", nothing))

Base.prepare_compiler_stub_image!()
append!(Base._require_dependencies, map(Base.expand_compiler_path, Base._compiler_require_dependencies))
Expand Down
9 changes: 9 additions & 0 deletions Compiler/src/ssair/show.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1135,3 +1135,12 @@ function Base.show(io::IO, tinf::Timings.Timing)
end

@specialize

const __debuginfo = Dict{Symbol, Any}(
# :full => src -> statementidx_lineinfo_printer(src), # and add variable slot information
:source => src -> statementidx_lineinfo_printer(src),
# :oneliner => src -> statementidx_lineinfo_printer(PartialLineInfoPrinter, src),
:none => src -> lineinfo_disabled,
)
const default_debuginfo = Ref{Symbol}(:none)
debuginfo(sym) = sym === :default ? default_debuginfo[] : sym
9 changes: 0 additions & 9 deletions base/show.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2824,15 +2824,6 @@ end
module IRShow
using ..Compiler: Compiler
Base.include(IRShow, Base.strcat(Base.BUILDROOT, "../usr/share/julia/Compiler/src/ssair/show.jl"))

const __debuginfo = Dict{Symbol, Any}(
# :full => src -> statementidx_lineinfo_printer(src), # and add variable slot information
:source => src -> statementidx_lineinfo_printer(src),
# :oneliner => src -> statementidx_lineinfo_printer(PartialLineInfoPrinter, src),
:none => src -> lineinfo_disabled,
)
const default_debuginfo = Ref{Symbol}(:none)
debuginfo(sym) = sym === :default ? default_debuginfo[] : sym
end

function show(io::IO, src::CodeInfo; debuginfo::Symbol=:source)
Expand Down

0 comments on commit 92d6adc

Please sign in to comment.