Skip to content

Commit f47523c

Browse files
committed
Merge branch 'master' into merging-master-into-dev
2 parents bda40bd + e65af91 commit f47523c

File tree

22 files changed

+178
-204
lines changed

22 files changed

+178
-204
lines changed

Compiler/test/abioverride.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ let world = Base.tls_world_age()
4646
global new_ci = Core.CodeInstance(Core.ABIOverride(Tuple{typeof(myplus), Int}, mi),
4747
#=owner=#SecondArgConstOverride(1), new_source.rettype, Any#=new_source.exctype is missing=#,
4848
#=inferred_const=#nothing, #=code=#nothing, #=const_flags=#Int32(0),
49-
new_source.min_world, new_source.max_world, #=new_source.ipo_purity_bits is missing=#UInt32(0),
49+
new_source.min_world, typemax(UInt), #=new_source.ipo_purity_bits is missing=#UInt32(0),
5050
#=analysis_results=#nothing, new_source.debuginfo, new_source.edges)
5151

5252
# Poke the CI into the global cache

base/docs/Docs.jl

+11-6
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,23 @@ const META = gensym(:meta)
7575
const METAType = IdDict{Any,Any}
7676

7777
function meta(m::Module; autoinit::Bool=true)
78-
if !isdefined(m, META) || getfield(m, META) === nothing
79-
autoinit ? initmeta(m) : return nothing
78+
if !isdefinedglobal(m, META)
79+
return autoinit ? invokelatest(initmeta, m) : nothing
8080
end
81-
return getfield(m, META)::METAType
81+
# TODO: This `invokelatest` is not technically required, but because
82+
# of the automatic constant backdating is currently required to avoid
83+
# a warning.
84+
return invokelatest(getglobal, m, META)::METAType
8285
end
8386

8487
function initmeta(m::Module)
85-
if !isdefined(m, META) || getfield(m, META) === nothing
86-
Core.eval(m, :($META = $(METAType())))
88+
if !isdefinedglobal(m, META)
89+
val = METAType()
90+
Core.eval(m, :(const $META = $val))
8791
push!(modules, m)
92+
return val
8893
end
89-
nothing
94+
return getglobal(m, META)
9095
end
9196

9297
function signature!(tv::Vector{Any}, expr::Expr)

base/exports.jl

+1
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,7 @@ export
818818
@invoke,
819819
invokelatest,
820820
@invokelatest,
821+
@world,
821822

822823
# loading source files
823824
__precompile__,

base/loading.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -1389,7 +1389,7 @@ function register_restored_modules(sv::SimpleVector, pkg::PkgId, path::String)
13891389
restored = sv[1]::Vector{Any}
13901390
for M in restored
13911391
M = M::Module
1392-
if isdefined(M, Base.Docs.META) && getfield(M, Base.Docs.META) !== nothing
1392+
if isdefinedglobal(M, Base.Docs.META)
13931393
push!(Base.Docs.modules, M)
13941394
end
13951395
if is_root_module(M)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
26699bf323c07c7491d3c106219de6da
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1466dca4e49800b94d65ce59c3e2c75308545282a00720c964b34e0cde5e06aced80361c236a9ada81d35ebcc2692f8e6e84db507342d8055ba501fc1291c0a2

deps/checksums/Pkg-bc9fb21b1f2d72038491eff938673fc5fbc99445.tar.gz/md5

-1
This file was deleted.

deps/checksums/Pkg-bc9fb21b1f2d72038491eff938673fc5fbc99445.tar.gz/sha512

-1
This file was deleted.

src/builtins.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -1406,7 +1406,7 @@ JL_CALLABLE(jl_f_setglobal)
14061406
jl_atomic_error("setglobal!: module binding cannot be written non-atomically");
14071407
else if (order >= jl_memory_order_seq_cst)
14081408
jl_fence();
1409-
jl_binding_t *b = jl_get_binding_wr(mod, var, 0);
1409+
jl_binding_t *b = jl_get_binding_wr(mod, var);
14101410
jl_checked_assignment(b, mod, var, args[2]); // release store
14111411
if (order >= jl_memory_order_seq_cst)
14121412
jl_fence();
@@ -1441,7 +1441,7 @@ JL_CALLABLE(jl_f_swapglobal)
14411441
if (order == jl_memory_order_notatomic)
14421442
jl_atomic_error("swapglobal!: module binding cannot be written non-atomically");
14431443
// is seq_cst already, no fence needed
1444-
jl_binding_t *b = jl_get_binding_wr(mod, var, 0);
1444+
jl_binding_t *b = jl_get_binding_wr(mod, var);
14451445
return jl_checked_swap(b, mod, var, args[2]);
14461446
}
14471447

@@ -1459,7 +1459,7 @@ JL_CALLABLE(jl_f_modifyglobal)
14591459
JL_TYPECHK(modifyglobal!, symbol, (jl_value_t*)var);
14601460
if (order == jl_memory_order_notatomic)
14611461
jl_atomic_error("modifyglobal!: module binding cannot be written non-atomically");
1462-
jl_binding_t *b = jl_get_binding_wr(mod, var, 0);
1462+
jl_binding_t *b = jl_get_binding_wr(mod, var);
14631463
// is seq_cst already, no fence needed
14641464
return jl_checked_modify(b, mod, var, args[2], args[3]);
14651465
}
@@ -1488,7 +1488,7 @@ JL_CALLABLE(jl_f_replaceglobal)
14881488
jl_atomic_error("replaceglobal!: module binding cannot be written non-atomically");
14891489
if (failure_order == jl_memory_order_notatomic)
14901490
jl_atomic_error("replaceglobal!: module binding cannot be accessed non-atomically");
1491-
jl_binding_t *b = jl_get_binding_wr(mod, var, 0);
1491+
jl_binding_t *b = jl_get_binding_wr(mod, var);
14921492
// is seq_cst already, no fence needed
14931493
return jl_checked_replace(b, mod, var, args[2], args[3]);
14941494
}
@@ -1517,7 +1517,7 @@ JL_CALLABLE(jl_f_setglobalonce)
15171517
jl_atomic_error("setglobalonce!: module binding cannot be written non-atomically");
15181518
if (failure_order == jl_memory_order_notatomic)
15191519
jl_atomic_error("setglobalonce!: module binding cannot be accessed non-atomically");
1520-
jl_binding_t *b = jl_get_binding_wr(mod, var, 0);
1520+
jl_binding_t *b = jl_get_binding_wr(mod, var);
15211521
// is seq_cst already, no fence needed
15221522
jl_value_t *old = jl_checked_assignonce(b, mod, var, args[2]);
15231523
return old == NULL ? jl_true : jl_false;

src/codegen.cpp

+11-92
Original file line numberDiff line numberDiff line change
@@ -930,12 +930,12 @@ static const auto jlgetbindingorerror_func = new JuliaFunction<>{
930930
},
931931
nullptr,
932932
};
933-
static const auto jlgetbindingwrorerror_func = new JuliaFunction<>{
934-
XSTR(jl_get_binding_wr),
933+
static const auto jlcheckbpwritable_func = new JuliaFunction<>{
934+
XSTR(jl_check_binding_currently_writable),
935935
[](LLVMContext &C) {
936936
auto T_pjlvalue = JuliaType::get_pjlvalue_ty(C);
937-
return FunctionType::get(T_pjlvalue,
938-
{T_pjlvalue, T_pjlvalue, getInt32Ty(C)}, false);
937+
return FunctionType::get(getVoidTy(C),
938+
{T_pjlvalue, T_pjlvalue, T_pjlvalue}, false);
939939
},
940940
nullptr,
941941
};
@@ -2098,8 +2098,6 @@ static Type *julia_type_to_llvm(jl_codectx_t &ctx, jl_value_t *jt, bool *isboxed
20982098
static jl_returninfo_t get_specsig_function(jl_codectx_t &ctx, Module *M, Value *fval, StringRef name, jl_value_t *sig, jl_value_t *jlrettype, bool is_opaque_closure, bool gcstack_arg,
20992099
ArrayRef<const char*> ArgNames=None, unsigned nreq=0);
21002100
static jl_cgval_t emit_expr(jl_codectx_t &ctx, jl_value_t *expr, ssize_t ssaval = -1);
2101-
static Value *global_binding_pointer(jl_codectx_t &ctx, jl_module_t *m, jl_sym_t *s,
2102-
jl_binding_t **pbnd, bool assign, bool alloc);
21032101
static jl_cgval_t emit_checked_var(jl_codectx_t &ctx, Value *bp, jl_sym_t *name, jl_value_t *scope, bool isvol, MDNode *tbaa);
21042102
static jl_cgval_t emit_sparam(jl_codectx_t &ctx, size_t i);
21052103
static Value *emit_condition(jl_codectx_t &ctx, const jl_cgval_t &condV, const Twine &msg);
@@ -3498,19 +3496,17 @@ static jl_cgval_t emit_globalop(jl_codectx_t &ctx, jl_module_t *mod, jl_sym_t *s
34983496
bool issetglobal, bool isreplaceglobal, bool isswapglobal, bool ismodifyglobal, bool issetglobalonce,
34993497
const jl_cgval_t *modifyop, bool alloc)
35003498
{
3501-
jl_binding_t *bnd = NULL;
3502-
Value *bp = global_binding_pointer(ctx, mod, sym, &bnd, true, alloc);
3499+
jl_binding_t *bnd = jl_get_module_binding(mod, sym, 1);
35033500
jl_binding_partition_t *bpart = jl_get_binding_partition_all(bnd, ctx.min_world, ctx.max_world);
3504-
if (bp == NULL)
3505-
return jl_cgval_t();
3501+
Value *bp = julia_binding_gv(ctx, bnd);
35063502
if (bpart) {
35073503
jl_ptr_kind_union_t pku = jl_atomic_load_relaxed(&bpart->restriction);
3508-
if (!jl_bkind_is_some_constant(decode_restriction_kind(pku))) {
3504+
if (decode_restriction_kind(pku) == BINDING_KIND_GLOBAL) {
35093505
jl_value_t *ty = decode_restriction_value(pku);
35103506
if (ty != nullptr) {
35113507
const std::string fname = issetglobal ? "setglobal!" : isreplaceglobal ? "replaceglobal!" : isswapglobal ? "swapglobal!" : ismodifyglobal ? "modifyglobal!" : "setglobalonce!";
35123508
if (!ismodifyglobal) {
3513-
// TODO: use typeassert in jl_check_binding_wr too
3509+
// TODO: use typeassert in jl_check_binding_assign_value too
35143510
emit_typecheck(ctx, rval, ty, "typeassert");
35153511
rval = update_julia_type(ctx, rval, ty);
35163512
if (rval.typ == jl_bottom_type)
@@ -3545,6 +3541,8 @@ static jl_cgval_t emit_globalop(jl_codectx_t &ctx, jl_module_t *mod, jl_sym_t *s
35453541
}
35463542
Value *m = literal_pointer_val(ctx, (jl_value_t*)mod);
35473543
Value *s = literal_pointer_val(ctx, (jl_value_t*)sym);
3544+
ctx.builder.CreateCall(prepare_call(jlcheckbpwritable_func),
3545+
{ bp, m, s });
35483546
if (issetglobal) {
35493547
ctx.builder.CreateCall(prepare_call(jlcheckassign_func),
35503548
{ bp, m, s, mark_callee_rooted(ctx, boxed(ctx, rval)) });
@@ -5991,85 +5989,6 @@ static void emit_hasnofield_error_ifnot(jl_codectx_t &ctx, Value *ok, jl_datatyp
59915989
ctx.builder.SetInsertPoint(ifok);
59925990
}
59935991

5994-
// returns a jl_ppvalue_t location for the global variable m.s
5995-
// if the reference currently bound or assign == true,
5996-
// pbnd will also be assigned with the binding address
5997-
static Value *global_binding_pointer(jl_codectx_t &ctx, jl_module_t *m, jl_sym_t *s,
5998-
jl_binding_t **pbnd, bool assign, bool alloc)
5999-
{
6000-
jl_binding_t *b = jl_get_module_binding(m, s, 1);
6001-
jl_binding_partition_t *bpart = jl_get_binding_partition_all(b, ctx.min_world, ctx.max_world);
6002-
jl_ptr_kind_union_t pku = jl_atomic_load_relaxed(&bpart->restriction);
6003-
if (assign) {
6004-
if (jl_bkind_is_some_guard(decode_restriction_kind(pku)))
6005-
// not yet declared
6006-
b = NULL;
6007-
}
6008-
else {
6009-
if (jl_bkind_is_some_guard(decode_restriction_kind(pku))) {
6010-
// try to look this up now
6011-
b = jl_get_binding(m, s);
6012-
bpart = jl_get_binding_partition_all(b, ctx.min_world, ctx.max_world);
6013-
}
6014-
pku = jl_walk_binding_inplace_all(&b, &bpart, ctx.min_world, ctx.max_world);
6015-
}
6016-
if (!b || !bpart) {
6017-
// var not found. switch to delayed lookup.
6018-
Constant *initnul = Constant::getNullValue(ctx.types().T_pjlvalue);
6019-
GlobalVariable *bindinggv = new GlobalVariable(*ctx.f->getParent(), ctx.types().T_pjlvalue,
6020-
false, GlobalVariable::PrivateLinkage, initnul, "jl_binding_ptr"); // LLVM has bugs with nameless globals
6021-
LoadInst *cachedval = ctx.builder.CreateAlignedLoad(ctx.types().T_pjlvalue, bindinggv, Align(sizeof(void*)));
6022-
setName(ctx.emission_context, cachedval, jl_symbol_name(m->name) + StringRef(".") + jl_symbol_name(s) + ".cached");
6023-
cachedval->setOrdering(AtomicOrdering::Unordered);
6024-
BasicBlock *have_val = BasicBlock::Create(ctx.builder.getContext(), "found");
6025-
BasicBlock *not_found = BasicBlock::Create(ctx.builder.getContext(), "notfound");
6026-
BasicBlock *currentbb = ctx.builder.GetInsertBlock();
6027-
auto iscached = ctx.builder.CreateICmpNE(cachedval, initnul);
6028-
setName(ctx.emission_context, iscached, "iscached");
6029-
ctx.builder.CreateCondBr(iscached, have_val, not_found);
6030-
not_found->insertInto(ctx.f);
6031-
ctx.builder.SetInsertPoint(not_found);
6032-
Value *bval = nullptr;
6033-
if (assign) {
6034-
bval = ctx.builder.CreateCall(prepare_call(jlgetbindingwrorerror_func),
6035-
{ literal_pointer_val(ctx, (jl_value_t*)m),
6036-
literal_pointer_val(ctx, (jl_value_t*)s),
6037-
ConstantInt::get(getInt32Ty(ctx.builder.getContext()), alloc)});
6038-
} else {
6039-
bval = ctx.builder.CreateCall(prepare_call(jlgetbindingorerror_func),
6040-
{ literal_pointer_val(ctx, (jl_value_t*)m),
6041-
literal_pointer_val(ctx, (jl_value_t*)s)});
6042-
}
6043-
setName(ctx.emission_context, bval, jl_symbol_name(m->name) + StringRef(".") + jl_symbol_name(s) + ".found");
6044-
ctx.builder.CreateAlignedStore(bval, bindinggv, Align(sizeof(void*)))->setOrdering(AtomicOrdering::Release);
6045-
ctx.builder.CreateBr(have_val);
6046-
have_val->insertInto(ctx.f);
6047-
ctx.builder.SetInsertPoint(have_val);
6048-
PHINode *p = ctx.builder.CreatePHI(ctx.types().T_pjlvalue, 2);
6049-
p->addIncoming(cachedval, currentbb);
6050-
p->addIncoming(bval, not_found);
6051-
setName(ctx.emission_context, p, jl_symbol_name(m->name) + StringRef(".") + jl_symbol_name(s));
6052-
return p;
6053-
}
6054-
if (assign) {
6055-
if (decode_restriction_kind(pku) != BINDING_KIND_GLOBAL && !jl_bkind_is_some_guard(decode_restriction_kind(pku))) {
6056-
// this will fail at runtime, so defer to the runtime to create the error
6057-
ctx.builder.CreateCall(prepare_call(jlgetbindingwrorerror_func),
6058-
{ literal_pointer_val(ctx, (jl_value_t*)m),
6059-
literal_pointer_val(ctx, (jl_value_t*)s),
6060-
ConstantInt::get(getInt32Ty(ctx.builder.getContext()), alloc) });
6061-
CreateTrap(ctx.builder);
6062-
return NULL;
6063-
}
6064-
}
6065-
else {
6066-
if (b->deprecated)
6067-
cg_bdw(ctx, s, b);
6068-
}
6069-
*pbnd = b;
6070-
return julia_binding_gv(ctx, b);
6071-
}
6072-
60735992
static jl_cgval_t emit_checked_var(jl_codectx_t &ctx, Value *bp, jl_sym_t *name, jl_value_t *scope, bool isvol, MDNode *tbaa)
60745993
{
60755994
LoadInst *v = ctx.builder.CreateAlignedLoad(ctx.types().T_prjlvalue, bp, Align(sizeof(void*)));
@@ -10184,7 +10103,7 @@ static void init_jit_functions(void)
1018410103
add_named_global(jltypeerror_func, &jl_type_error);
1018510104
add_named_global(jlcheckassign_func, &jl_checked_assignment);
1018610105
add_named_global(jlgetbindingorerror_func, &jl_get_binding_or_error);
10187-
add_named_global(jlgetbindingwrorerror_func, &jl_get_binding_wr);
10106+
add_named_global(jlcheckbpwritable_func, &jl_check_binding_currently_writable);
1018810107
add_named_global(jlboundp_func, &jl_boundp);
1018910108
for (auto it : builtin_func_map())
1019010109
add_named_global(it.second, it.first);

src/jl_exported_funcs.inc

+1
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@
202202
XX(jl_get_binding_for_method_def) \
203203
XX(jl_get_binding_or_error) \
204204
XX(jl_get_binding_wr) \
205+
XX(jl_check_binding_currently_writable) \
205206
XX(jl_get_cpu_name) \
206207
XX(jl_get_cpu_features) \
207208
XX(jl_cpu_has_fma) \

src/julia-syntax.scm

+8-3
Original file line numberDiff line numberDiff line change
@@ -4626,6 +4626,8 @@ f(x) = yt(x)
46264626
(if (globalref? lhs)
46274627
(begin
46284628
(emit `(global ,lhs))
4629+
(if (null? (cadr lam))
4630+
(emit `(latestworld)))
46294631
(emit `(call (top setglobal!) ,(cadr lhs) (inert ,(caddr lhs)) ,rhs)))
46304632
(emit `(= ,lhs ,rhs))))
46314633
(define (emit-assignment lhs rhs)
@@ -4944,13 +4946,16 @@ f(x) = yt(x)
49444946
#f))
49454947
((global) ; keep global declarations as statements
49464948
(if value (error "misplaced \"global\" declaration"))
4947-
(emit e))
4949+
(emit e)
4950+
(if (null? (cadr lam))
4951+
(emit `(latestworld))))
49484952
((globaldecl)
49494953
(if value (error "misplaced \"global\" declaration"))
4950-
(if (atom? (caddr e)) (emit e)
4954+
(if (atom? (caddr e)) (begin (emit e) (emit `(latestworld)))
49514955
(let ((rr (make-ssavalue)))
49524956
(emit `(= ,rr ,(caddr e)))
4953-
(emit `(globaldecl ,(cadr e) ,rr)))))
4957+
(emit `(globaldecl ,(cadr e) ,rr))
4958+
(emit `(latestworld)))))
49544959
((local-def) #f)
49554960
((local) #f)
49564961
((moved-local)

src/julia.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -2061,7 +2061,8 @@ JL_DLLEXPORT jl_binding_t *jl_get_binding_or_error(jl_module_t *m, jl_sym_t *var
20612061
JL_DLLEXPORT jl_value_t *jl_module_globalref(jl_module_t *m, jl_sym_t *var);
20622062
JL_DLLEXPORT jl_value_t *jl_get_binding_type(jl_module_t *m, jl_sym_t *var);
20632063
// get binding for assignment
2064-
JL_DLLEXPORT jl_binding_t *jl_get_binding_wr(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t *var, int alloc);
2064+
JL_DLLEXPORT void jl_check_binding_currently_writable(jl_binding_t *b, jl_module_t *m, jl_sym_t *s);
2065+
JL_DLLEXPORT jl_binding_t *jl_get_binding_wr(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t *var);
20652066
JL_DLLEXPORT jl_binding_t *jl_get_binding_for_method_def(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t *var);
20662067
JL_DLLEXPORT int jl_boundp(jl_module_t *m, jl_sym_t *var, int allow_import);
20672068
JL_DLLEXPORT int jl_defines_or_exports_p(jl_module_t *m, jl_sym_t *var);

0 commit comments

Comments
 (0)