Skip to content

Commit 81383ed

Browse files
authored
Merge branch 'master' into llvm-20-initial
2 parents 878fb19 + 5343130 commit 81383ed

File tree

19 files changed

+90
-72
lines changed

19 files changed

+90
-72
lines changed

Compiler/src/tfuncs.jl

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,17 +1073,15 @@ end
10731073
end
10741074

10751075
@nospecs function getfield_tfunc(𝕃::AbstractLattice, s00, name, boundscheck_or_order)
1076-
t = isvarargtype(boundscheck_or_order) ? unwrapva(boundscheck_or_order) :
1077-
widenconst(boundscheck_or_order)
1078-
hasintersect(t, Symbol) || hasintersect(t, Bool) || return Bottom
1076+
if !isvarargtype(boundscheck_or_order)
1077+
t = widenconst(boundscheck_or_order)
1078+
hasintersect(t, Symbol) || hasintersect(t, Bool) || return Bottom
1079+
end
10791080
return getfield_tfunc(𝕃, s00, name)
10801081
end
10811082
@nospecs function getfield_tfunc(𝕃::AbstractLattice, s00, name, order, boundscheck)
10821083
hasintersect(widenconst(order), Symbol) || return Bottom
1083-
if isvarargtype(boundscheck)
1084-
t = unwrapva(boundscheck)
1085-
hasintersect(t, Symbol) || hasintersect(t, Bool) || return Bottom
1086-
else
1084+
if !isvarargtype(boundscheck)
10871085
hasintersect(widenconst(boundscheck), Bool) || return Bottom
10881086
end
10891087
return getfield_tfunc(𝕃, s00, name)

Compiler/test/inference.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6188,3 +6188,9 @@ end == Union{Float64,DomainError}
61886188
@test Compiler.argtypes_to_type(Any[ Int, UnitRange{Int}, Vararg{Pair{Any, Union{}}}, Float64 ]) === Tuple{Int, UnitRange{Int}, Float64}
61896189
@test Compiler.argtypes_to_type(Any[ Int, UnitRange{Int}, Vararg{Pair{Any, Union{}}}, Float64, Memory{2} ]) === Union{}
61906190
@test Base.return_types(Tuple{Tuple{Int, Vararg{Pair{Any, Union{}}}}},) do x; Returns(true)(x...); end |> only === Bool
6191+
6192+
# issue #57292
6193+
f57292(xs::Union{Tuple{String}, Int}...) = getfield(xs...)
6194+
g57292(xs::String...) = getfield(("abc",), 1, :not_atomic, xs...)
6195+
@test Base.infer_return_type(f57292) == String
6196+
@test Base.infer_return_type(g57292) == String

base/lock.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ julia> procstate === fetch(@async global_state())
693693
true
694694
```
695695
"""
696-
mutable struct OncePerProcess{T, F}
696+
mutable struct OncePerProcess{T, F} <: Function
697697
value::Union{Nothing,T}
698698
@atomic state::UInt8 # 0=initial, 1=hasrun, 2=error
699699
@atomic allow_compile_time::Bool
@@ -801,7 +801,7 @@ julia> threadvec === thread_state[Threads.threadid()]
801801
true
802802
```
803803
"""
804-
mutable struct OncePerThread{T, F}
804+
mutable struct OncePerThread{T, F} <: Function
805805
@atomic xs::AtomicMemory{T} # values
806806
@atomic ss::AtomicMemory{UInt8} # states: 0=initial, 1=hasrun, 2=error, 3==concurrent
807807
const initializer::F
@@ -926,7 +926,7 @@ Making lazy task value...done.
926926
false
927927
```
928928
"""
929-
mutable struct OncePerTask{T, F}
929+
mutable struct OncePerTask{T, F} <: Function
930930
const initializer::F
931931

932932
OncePerTask{T}(initializer::F) where {T, F} = new{T,F}(initializer)

deps/patches/llvm7-symver-jlprefix.patch

Lines changed: 0 additions & 18 deletions
This file was deleted.

doc/src/devdocs/build/build.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,6 @@ For packaging Julia with LLVM, we recommend either:
250250
- bundling a Julia-only LLVM library inside the Julia package, or
251251
- adding the patches to the LLVM package of the distribution.
252252
* A complete list of patches is available in on [Github](https://github.com/JuliaLang/llvm-project) see the `julia-release/18.x` branch.
253-
* The only Julia-specific patch is the lib renaming (`llvm7-symver-jlprefix.patch`), which should _not_ be applied to a system LLVM.
254253
* The remaining patches are all upstream bug fixes, and have been contributed into upstream LLVM.
255254

256255
Using an unpatched or different version of LLVM will result in errors and/or poor performance.

src/codegen.cpp

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ static const auto jlgenericfunction_func = new JuliaFunction<>{
10061006
auto T_jlvalue = JuliaType::get_jlvalue_ty(C);
10071007
auto T_pjlvalue = PointerType::get(T_jlvalue, 0);
10081008
auto T_prjlvalue = PointerType::get(T_jlvalue, AddressSpace::Tracked);
1009-
return FunctionType::get(T_prjlvalue, {T_pjlvalue, T_pjlvalue, T_pjlvalue}, false);
1009+
return FunctionType::get(T_prjlvalue, {T_pjlvalue, T_pjlvalue}, false);
10101010
},
10111011
nullptr,
10121012
};
@@ -6866,8 +6866,6 @@ static jl_cgval_t emit_expr(jl_codectx_t &ctx, jl_value_t *expr, ssize_t ssaidx_
68666866
jl_value_t *mn = args[0];
68676867
assert(jl_is_symbol(mn) || jl_is_slotnumber(mn) || jl_is_globalref(mn));
68686868

6869-
Value *bp = NULL, *name;
6870-
jl_binding_t *bnd = NULL;
68716869
bool issym = jl_is_symbol(mn);
68726870
bool isglobalref = !issym && jl_is_globalref(mn);
68736871
jl_module_t *mod = ctx.module;
@@ -6876,26 +6874,11 @@ static jl_cgval_t emit_expr(jl_codectx_t &ctx, jl_value_t *expr, ssize_t ssaidx_
68766874
mod = jl_globalref_mod(mn);
68776875
mn = (jl_value_t*)jl_globalref_name(mn);
68786876
}
6879-
JL_TRY {
6880-
if (jl_symbol_name((jl_sym_t*)mn)[0] == '@')
6881-
jl_errorf("macro definition not allowed inside a local scope");
6882-
name = literal_pointer_val(ctx, mn);
6883-
bnd = jl_get_binding_for_method_def(mod, (jl_sym_t*)mn);
6884-
}
6885-
JL_CATCH {
6886-
jl_value_t *e = jl_current_exception(jl_current_task);
6887-
// errors. boo. :(
6888-
JL_GC_PUSH1(&e);
6889-
e = jl_as_global_root(e, 1);
6890-
JL_GC_POP();
6891-
raise_exception(ctx, literal_pointer_val(ctx, e));
6892-
return ghostValue(ctx, jl_nothing_type);
6893-
}
6894-
bp = julia_binding_gv(ctx, bnd);
68956877
jl_cgval_t gf = mark_julia_type(
68966878
ctx,
6897-
ctx.builder.CreateCall(prepare_call(jlgenericfunction_func), { bp,
6898-
literal_pointer_val(ctx, (jl_value_t*)mod), name
6879+
ctx.builder.CreateCall(prepare_call(jlgenericfunction_func), {
6880+
literal_pointer_val(ctx, (jl_value_t*)mod),
6881+
literal_pointer_val(ctx, (jl_value_t*)mn)
68996882
}),
69006883
true,
69016884
jl_function_type);

src/interpreter.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ static jl_value_t *eval_methoddef(jl_expr_t *ex, interpreter_state *s)
9393
if (!jl_is_symbol(fname)) {
9494
jl_error("method: invalid declaration");
9595
}
96-
jl_binding_t *b = jl_get_binding_for_method_def(modu, fname);
97-
return jl_declare_const_gf(b, modu, fname);
96+
return jl_declare_const_gf(modu, fname);
9897
}
9998

10099
jl_value_t *atypes = NULL, *meth = NULL, *fname = NULL;

src/julia.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,6 +1475,13 @@ STATIC_INLINE char *jl_symbol_name_(jl_sym_t *s) JL_NOTSAFEPOINT
14751475
}
14761476
#define jl_symbol_name(s) jl_symbol_name_(s)
14771477

1478+
STATIC_INLINE const char *jl_module_debug_name(jl_module_t *mod) JL_NOTSAFEPOINT
1479+
{
1480+
if (!mod)
1481+
return "<null>";
1482+
return jl_symbol_name(mod->name);
1483+
}
1484+
14781485
static inline uint32_t jl_fielddesc_size(int8_t fielddesc_type) JL_NOTSAFEPOINT
14791486
{
14801487
assert(fielddesc_type >= 0 && fielddesc_type <= 2);
@@ -1901,7 +1908,7 @@ JL_DLLEXPORT jl_value_t *jl_get_binding_value(jl_binding_t *b JL_PROPAGATES_ROOT
19011908
JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_const(jl_binding_t *b JL_PROPAGATES_ROOT);
19021909
JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_resolved(jl_binding_t *b JL_PROPAGATES_ROOT) JL_NOTSAFEPOINT;
19031910
JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_resolved_and_const(jl_binding_t *b JL_PROPAGATES_ROOT) JL_NOTSAFEPOINT;
1904-
JL_DLLEXPORT jl_value_t *jl_declare_const_gf(jl_binding_t *b, jl_module_t *mod, jl_sym_t *name);
1911+
JL_DLLEXPORT jl_value_t *jl_declare_const_gf(jl_module_t *mod, jl_sym_t *name);
19051912
JL_DLLEXPORT jl_method_t *jl_method_def(jl_svec_t *argdata, jl_methtable_t *mt, jl_code_info_t *f, jl_module_t *module);
19061913
JL_DLLEXPORT jl_code_info_t *jl_code_for_staged(jl_method_instance_t *linfo, size_t world, jl_code_instance_t **cache);
19071914
JL_DLLEXPORT jl_code_info_t *jl_copy_code_info(jl_code_info_t *src);
@@ -2051,7 +2058,7 @@ JL_DLLEXPORT jl_value_t *jl_get_binding_type(jl_module_t *m, jl_sym_t *var);
20512058
// get binding for assignment
20522059
JL_DLLEXPORT void jl_check_binding_currently_writable(jl_binding_t *b, jl_module_t *m, jl_sym_t *s);
20532060
JL_DLLEXPORT jl_binding_t *jl_get_binding_wr(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t *var);
2054-
JL_DLLEXPORT jl_binding_t *jl_get_binding_for_method_def(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t *var);
2061+
JL_DLLEXPORT jl_binding_t *jl_get_binding_for_method_def(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t *var, size_t new_world);
20552062
JL_DLLEXPORT int jl_boundp(jl_module_t *m, jl_sym_t *var, int allow_import);
20562063
JL_DLLEXPORT int jl_defines_or_exports_p(jl_module_t *m, jl_sym_t *var);
20572064
JL_DLLEXPORT int jl_is_const(jl_module_t *m, jl_sym_t *var);

src/julia_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,7 @@ STATIC_INLINE size_t module_usings_max(jl_module_t *m) JL_NOTSAFEPOINT {
876876
return m->usings.max/3;
877877
}
878878

879+
JL_DLLEXPORT jl_sym_t *jl_module_name(jl_module_t *m) JL_NOTSAFEPOINT;
879880
jl_value_t *jl_eval_global_var(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t *e);
880881
jl_value_t *jl_interpret_opaque_closure(jl_opaque_closure_t *clos, jl_value_t **args, size_t nargs);
881882
jl_value_t *jl_interpret_toplevel_thunk(jl_module_t *m, jl_code_info_t *src);

src/method.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1050,10 +1050,11 @@ JL_DLLEXPORT void jl_check_gf(jl_value_t *gf, jl_sym_t *name)
10501050
jl_errorf("cannot define function %s; it already has a value", jl_symbol_name(name));
10511051
}
10521052

1053-
JL_DLLEXPORT jl_value_t *jl_declare_const_gf(jl_binding_t *b, jl_module_t *mod, jl_sym_t *name)
1053+
JL_DLLEXPORT jl_value_t *jl_declare_const_gf(jl_module_t *mod, jl_sym_t *name)
10541054
{
10551055
JL_LOCK(&world_counter_lock);
10561056
size_t new_world = jl_atomic_load_relaxed(&jl_world_counter) + 1;
1057+
jl_binding_t *b = jl_get_binding_for_method_def(mod, name, new_world);
10571058
jl_binding_partition_t *bpart = jl_get_binding_partition(b, new_world);
10581059
jl_ptr_kind_union_t pku = jl_atomic_load_relaxed(&bpart->restriction);
10591060
jl_value_t *gf = NULL;

0 commit comments

Comments
 (0)