Skip to content

Commit dbc38d6

Browse files
authored
Bump LLVM to v20 (#58142)
1 parent 2c2114c commit dbc38d6

19 files changed

+572
-542
lines changed

contrib/refresh_checksums.mk

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ checksum-$(1)-$(2)-$(3): clean-$(1)
5858
# Add this guy to his project target
5959
checksum-$(1): checksum-$(1)-$(2)-$(3)
6060

61-
# Add a dependency to the pack target
62-
# TODO: can we make this so it only adds an ordering but not a dependency?
63-
pack-checksum-$(1): | checksum-$(1)
64-
6561
# Add this guy to the `checksum` and `pack-checksum` default targets (e.g. `make -f contrib/refresh_checksums.mk openblas`)
6662
checksum: checksum-$1
6763
$1 pack-checksum: pack-checksum-$1
@@ -100,7 +96,7 @@ checksum-doc-unicodedata:
10096
all: checksum-doc-unicodedata
10197
.PHONY: checksum-doc-unicodedata
10298

103-
# merge substring project names to avoid races
99+
# merge substring project names (llvm and llvm-tools, libsuitesparse and suitesparse) to avoid races
104100
pack-checksum-llvm-tools: | pack-checksum-llvm
105101
@# nothing to do but disable the prefix rule
106102
pack-checksum-llvm: | checksum-llvm-tools
@@ -110,18 +106,21 @@ pack-checksum-compilersupportlibraries: | checksum-csl
110106
pack-checksum-libsuitesparse: | pack-checksum-suitesparse
111107
@# nothing to do but disable the prefix rule
112108
pack-checksum-suitesparse: | checksum-libsuitesparse
113-
# This is a bit tricky: we want llvmunwind to be separate from unwind and llvm,
109+
# This is a bit tricky: we want llvmunwind, clang, and lld to be separate from unwind and llvm,
114110
# so we add a rule to process those first
115111
pack-checksum-llvm pack-checksum-unwind: | pack-checksum-llvmunwind
116-
# and the name for LLVMLibUnwind is awkward, so handle that with a regex
117-
pack-checksum-llvmunwind: | pack-checksum-llvm.*unwind
112+
pack-checksum-llvm: | pack-checksum-clang pack-checksum-lld
113+
# and the name for LLVMLibUnwind is awkward, so handle that packing with a regex
114+
checksum-llvm.*unwind: checksum-llvmunwind
115+
@# nothing to do but disable the prefix rule
116+
pack-checksum-llvmunwind: | pack-checksum-llvm.*unwind # override general rule below
118117
cd "$(JULIAHOME)/deps/checksums" && mv 'llvm.*unwind' llvmunwind
119118

120119
clean-%: FORCE
121120
-rm "$(JULIAHOME)/deps/checksums"/'$*'
122121

123122
# define how to pack parallel checksums into a single file format
124-
pack-checksum-%: FORCE
123+
pack-checksum-%: FORCE | checksum-%
125124
@echo making "$(JULIAHOME)/deps/checksums/"'$*'
126125
@cd "$(JULIAHOME)/deps/checksums" && \
127126
for each in $$(ls | grep -i '$*'); do \

deps/checksums/clang

Lines changed: 120 additions & 0 deletions
Large diffs are not rendered by default.

deps/checksums/lld

Lines changed: 120 additions & 0 deletions
Large diffs are not rendered by default.

deps/checksums/llvm

Lines changed: 244 additions & 482 deletions
Large diffs are not rendered by default.

deps/clang.version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
## jll artifact
44
# Clang (paired with LLVM, only here as a JLL download)
55
CLANG_JLL_NAME := Clang
6-
CLANG_JLL_VER := 19.1.7+1
6+
CLANG_JLL_VER := 20.1.2+0

deps/lld.version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
## jll artifact
44
LLD_JLL_NAME := LLD
5-
LLD_JLL_VER := 19.1.7+1
5+
LLD_JLL_VER := 20.1.2+0

deps/llvm-tools.version

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
## jll artifact
44
# LLVM_tools (downloads LLVM_jll to get things like `lit` and `opt`)
55
LLVM_TOOLS_JLL_NAME := LLVM
6-
LLVM_TOOLS_JLL_VER := 19.1.7+1
7-
LLVM_TOOLS_ASSERT_JLL_VER := 19.1.7+1
6+
LLVM_TOOLS_JLL_VER := 20.1.2+0
7+
LLVM_TOOLS_ASSERT_JLL_VER := 20.1.2+0

deps/llvm.version

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
## jll artifact
44
LLVM_JLL_NAME := libLLVM
5-
LLVM_ASSERT_JLL_VER := 19.1.7+2
5+
LLVM_ASSERT_JLL_VER := 20.1.2+0
66
## source build
77
# Version number of LLVM
8-
LLVM_VER := 19.1.7
8+
LLVM_VER := 20.1.2
99
# Git branch name in `LLVM_GIT_URL` repository
10-
LLVM_BRANCH=julia-19.1.7-2
10+
LLVM_BRANCH=julia-20.1.2-0
1111
# Git ref in `LLVM_GIT_URL` repository
12-
LLVM_SHA1=julia-19.1.7-2
12+
LLVM_SHA1=julia-20.1.2-0
1313

1414
## Following options are used to automatically fetch patchset from Julia's fork. This is
1515
## useful if you want to build an external LLVM while still applying Julia's patches.
@@ -18,6 +18,6 @@ LLVM_APPLY_JULIA_PATCHES := 0
1818
# GitHub repository to use for fetching the Julia patches to apply to LLVM source code.
1919
LLVM_JULIA_DIFF_GITHUB_REPO := https://github.com/llvm/llvm-project
2020
# Base GitHub ref for generating the diff.
21-
LLVM_BASE_REF := llvm:llvmorg-19.1.7
21+
LLVM_BASE_REF := llvm:llvmorg-20.1.2
2222
# Julia fork's GitHub ref for generating the diff.
23-
LLVM_JULIA_REF := JuliaLang:julia-19.1.7-2
23+
LLVM_JULIA_REF := JuliaLang:julia-20.1.2-0

src/Makefile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ endif
2929
JCFLAGS += -Wold-style-definition -Wstrict-prototypes -Wc++-compat
3030

3131
ifeq ($(USECLANG),1)
32-
FLAGS += -Wno-return-type-c-linkage -Wno-atomic-alignment
32+
FLAGS += -Wno-return-type-c-linkage -Wno-atomic-alignment -Wno-nullability-extension -Wno-nullability-completeness # required to be allowed to use nullability extension and not be required to annotate all of everything
3333
endif
3434

3535
ifeq (${USE_THIRD_PARTY_GC},mmtk)
@@ -226,6 +226,12 @@ DEBUGFLAGS_GCC += $(FLAGS) $(ADDL_DEBUGFLAGS)
226226
SHIPFLAGS_CLANG += $(FLAGS) $(ADDL_SHIPFLAGS)
227227
DEBUGFLAGS_CLANG += $(FLAGS) $(ADDL_DEBUGFLAGS)
228228

229+
DEBUGFLAGS_CLANG += -Wno-nullability-extension -Wno-nullability-completeness # required to be allowed to use nullability extension and not be required to annotate all of everything
230+
ifeq ($(USEGCC),1) # TODO: we currently set flags incorrectly for clang analyze, but mostly it works out okay
231+
DEBUGFLAGS_CLANG += -Wno-unknown-warning-option
232+
endif
233+
DEBUGFLAGS_CLANG += -Wno-return-type-c-linkage # TODO: do we care about fixing this instead? (it is not a bug, just a nuisance)
234+
229235
ifeq ($(USE_CROSS_FLISP), 1)
230236
FLISPDIR := $(BUILDDIR)/flisp/host
231237
FLISP_EXECUTABLE_debug := $(FLISPDIR)/flisp-debug$(BUILD_EXE)

src/genericmemory.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jl_genericmemory_t *_new_genericmemory_(jl_value_t *mtype, size_t nel, int8_t is
5656
{
5757
if (nel == 0) // zero-sized allocation optimization
5858
return (jl_genericmemory_t*)((jl_datatype_t*)mtype)->instance;
59-
size_t nbytes;
59+
size_t nbytes = 0; // initialized to workaround clang sa bug on v20: https://github.com/llvm/llvm-project/issues/136292
6060
int overflow = __builtin_mul_overflow(nel, elsz, &nbytes);
6161
if (isunion) {
6262
// an extra byte for each isbits union memory element, stored at m->ptr + m->length
@@ -152,7 +152,7 @@ JL_DLLEXPORT jl_genericmemory_t *jl_ptr_to_genericmemory(jl_value_t *mtype, void
152152
if (((uintptr_t)data) & ((align > JL_HEAP_ALIGNMENT ? JL_HEAP_ALIGNMENT : align) - 1))
153153
jl_exceptionf(jl_argumenterror_type,
154154
"unsafe_wrap: pointer %p is not properly aligned to %u bytes", data, align);
155-
size_t nbytes;
155+
size_t nbytes = 0; // initialized to workaround clang sa bug on v20: https://github.com/llvm/llvm-project/issues/136292
156156
int overflow = __builtin_mul_overflow(nel, elsz, &nbytes);
157157
if (isunion) {
158158
// an extra byte for each isbits union memory element, stored at m->ptr + m->length
@@ -283,6 +283,9 @@ JL_DLLEXPORT jl_genericmemory_t *jl_genericmemory_copy_slice(jl_genericmemory_t
283283
memcpy(jl_genericmemory_typetagdata(new_mem), jl_genericmemory_typetagdata(mem) + (size_t)data, len);
284284
}
285285
else if (layout->first_ptr != -1) {
286+
if (data == NULL) {
287+
assert(len * elsz / sizeof(void*) == 0); // make static analyzer happy
288+
}
286289
memmove_refs((_Atomic(void*)*)new_mem->ptr, (_Atomic(void*)*)data, len * elsz / sizeof(void*));
287290
}
288291
else if (data != NULL) {

src/jitlayers.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,17 +2008,14 @@ JuliaOJIT::JuliaOJIT()
20082008
reinterpret_cast<void *>(static_cast<uintptr_t>(msan_workaround::MSanTLS::origin))), JITSymbolFlags::Exported};
20092009
cantFail(GlobalJD.define(orc::absoluteSymbols(msan_crt)));
20102010
#endif
2011-
#if JL_LLVM_VERSION < 200000
20122011
#ifdef _COMPILER_ASAN_ENABLED_
20132012
// this is a hack to work around a bad assertion:
20142013
// /workspace/srcdir/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:3028: llvm::Error llvm::orc::ExecutionSession::OL_notifyResolved(llvm::orc::MaterializationResponsibility&, const SymbolMap&): Assertion `(KV.second.getFlags() & ~JITSymbolFlags::Common) == (I->second & ~JITSymbolFlags::Common) && "Resolving symbol with incorrect flags"' failed.
2015-
// hopefully fixed upstream by e7698a13e319a9919af04d3d693a6f6ea7168a44
20162014
static int64_t jl___asan_globals_registered;
20172015
orc::SymbolMap asan_crt;
20182016
asan_crt[mangle("___asan_globals_registered")] = {ExecutorAddr::fromPtr(&jl___asan_globals_registered), JITSymbolFlags::Common | JITSymbolFlags::Exported};
20192017
cantFail(JD.define(orc::absoluteSymbols(asan_crt)));
20202018
#endif
2021-
#endif
20222019
}
20232020

20242021
JuliaOJIT::~JuliaOJIT() = default;

src/julia.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -489,17 +489,17 @@ typedef struct _jl_abi_override_t {
489489

490490
typedef struct {
491491
JL_DATA_TYPE
492-
jl_sym_t *name;
493-
jl_value_t *lb; // lower bound
494-
jl_value_t *ub; // upper bound
492+
jl_sym_t *JL_NONNULL name;
493+
jl_value_t *JL_NONNULL lb; // lower bound
494+
jl_value_t *JL_NONNULL ub; // upper bound
495495
} jl_tvar_t;
496496

497497
// UnionAll type (iterated union over all values of a variable in certain bounds)
498498
// written `body where lb<:var<:ub`
499499
typedef struct {
500500
JL_DATA_TYPE
501-
jl_tvar_t *var;
502-
jl_value_t *body;
501+
jl_tvar_t *JL_NONNULL var;
502+
jl_value_t *JL_NONNULL body;
503503
} jl_unionall_t;
504504

505505
// represents the "name" part of a DataType, describing the syntactic structure
@@ -534,8 +534,8 @@ typedef struct {
534534

535535
typedef struct {
536536
JL_DATA_TYPE
537-
jl_value_t *a;
538-
jl_value_t *b;
537+
jl_value_t *JL_NONNULL a;
538+
jl_value_t *JL_NONNULL b;
539539
} jl_uniontype_t;
540540

541541
// in little-endian, isptr is always the first bit, avoiding the need for a branch in computing isptr

src/llvm-expand-atomic-modify.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <llvm/IR/InstIterator.h>
1818
#include <llvm/IR/Instructions.h>
1919
#include <llvm/IR/IntrinsicInst.h>
20+
#include "llvm/IR/MemoryModelRelaxationAnnotations.h"
2021
#include <llvm/IR/Module.h>
2122
#include <llvm/IR/Operator.h>
2223
#include <llvm/IR/PassManager.h>
@@ -141,12 +142,28 @@ std::pair<Value *, Value *> insertRMWCmpXchgLoop(
141142
}
142143

143144
// from AtomicExpandImpl
144-
struct ReplacementIRBuilder : IRBuilder<InstSimplifyFolder> {
145+
// IRBuilder to be used for replacement atomic instructions.
146+
struct ReplacementIRBuilder
147+
: IRBuilder<InstSimplifyFolder, IRBuilderCallbackInserter> {
148+
MDNode *MMRAMD = nullptr;
149+
145150
// Preserves the DebugLoc from I, and preserves still valid metadata.
151+
// Enable StrictFP builder mode when appropriate.
146152
explicit ReplacementIRBuilder(Instruction *I, const DataLayout &DL)
147-
: IRBuilder(I->getContext(), DL) {
153+
: IRBuilder(I->getContext(), InstSimplifyFolder(DL),
154+
IRBuilderCallbackInserter(
155+
[this](Instruction *I) { addMMRAMD(I); })) {
148156
SetInsertPoint(I);
149157
this->CollectMetadataToCopy(I, {LLVMContext::MD_pcsections});
158+
if (BB->getParent()->getAttributes().hasFnAttr(Attribute::StrictFP))
159+
this->setIsFPConstrained(true);
160+
161+
MMRAMD = I->getMetadata(LLVMContext::MD_mmra);
162+
}
163+
164+
void addMMRAMD(Instruction *I) {
165+
if (canInstructionHaveMMRAs(*I))
166+
I->setMetadata(LLVMContext::MD_mmra, MMRAMD);
150167
}
151168
};
152169

@@ -321,7 +338,6 @@ void expandAtomicModifyToCmpXchg(CallInst &Modify,
321338
Type *Ty = Modify.getFunctionType()->getReturnType()->getStructElementType(0);
322339

323340
ReplacementIRBuilder Builder(&Modify, Modify.getModule()->getDataLayout());
324-
Builder.setIsFPConstrained(Modify.hasFnAttr(Attribute::StrictFP));
325341

326342
CallInst *ModifyOp;
327343
{
@@ -366,7 +382,7 @@ void expandAtomicModifyToCmpXchg(CallInst &Modify,
366382
ModifyOp = cast<CallInst>(ValOp->getUser());
367383
LoadedOp = ValOp;
368384
assert(LoadedOp->get() == RMW);
369-
RMW->moveBefore(ModifyOp); // NewValInst is a user of RMW, and RMW has no other dependants (per patternMatchAtomicRMWOp)
385+
RMW->moveBeforePreserving(ModifyOp->getIterator()); // NewValInst is a user of RMW, and RMW has no other dependants (per patternMatchAtomicRMWOp)
370386
BinOp = false;
371387
if (++attempts > 3)
372388
break;
@@ -383,7 +399,7 @@ void expandAtomicModifyToCmpXchg(CallInst &Modify,
383399
assert(isa<UndefValue>(RMW->getOperand(1))); // RMW was previously being used as the placeholder for Val
384400
Value *Val;
385401
if (ValOp != nullptr) {
386-
RMW->moveBefore(cast<Instruction>(ValOp->getUser())); // ValOp is a user of RMW, and RMW has no other dependants (per patternMatchAtomicRMWOp)
402+
RMW->moveBeforePreserving(cast<Instruction>(ValOp->getUser())->getIterator()); // ValOp is a user of RMW, and RMW has no other dependants (per patternMatchAtomicRMWOp)
387403
Val = ValOp->get();
388404
} else if (RMWOp == AtomicRMWInst::Xchg) {
389405
Val = NewVal;
@@ -411,7 +427,7 @@ void expandAtomicModifyToCmpXchg(CallInst &Modify,
411427
Builder, Ty, Ptr, *Alignment, Ordering, SSID, Modify,
412428
[&](IRBuilderBase &Builder, Value *Loaded) JL_NOTSAFEPOINT {
413429
LoadedOp->set(Loaded);
414-
ModifyOp->moveBefore(*Builder.GetInsertBlock(), Builder.GetInsertPoint());
430+
ModifyOp->moveBeforePreserving(*Builder.GetInsertBlock(), Builder.GetInsertPoint());
415431
return ModifyOp;
416432
},
417433
CreateWeakCmpXchg);

src/stackwalk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,11 @@ static void decode_backtrace(jl_bt_element_t *bt_data, size_t bt_size,
326326
bt = *btout = jl_alloc_array_1d(array_ptr_void_type, bt_size);
327327
static_assert(sizeof(jl_bt_element_t) == sizeof(void*),
328328
"jl_bt_element_t is presented as Ptr{Cvoid} on julia side");
329-
memcpy(jl_array_data(bt, jl_bt_element_t), bt_data, bt_size * sizeof(jl_bt_element_t));
329+
if (bt_data != NULL) {
330+
memcpy(jl_array_data(bt, jl_bt_element_t), bt_data, bt_size * sizeof(jl_bt_element_t));
331+
} else {
332+
assert(bt_size == 0);
333+
}
330334
bt2 = *bt2out = jl_alloc_array_1d(jl_array_any_type, 0);
331335
// Scan the backtrace buffer for any gc-managed values
332336
for (size_t i = 0; i < bt_size; i += jl_bt_entry_size(bt_data + i)) {

src/subtype.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ typedef struct {
6565
// Most of the complexity is due to the "diagonal rule", requiring us to
6666
// identify which type vars range over only concrete types.
6767
typedef struct jl_varbinding_t {
68-
jl_tvar_t *var;
69-
jl_value_t *lb;
70-
jl_value_t *ub;
68+
jl_tvar_t *var; // store NULL to "delete" this from env (temporarily)
69+
jl_value_t *JL_NONNULL lb;
70+
jl_value_t *JL_NONNULL ub;
7171
int8_t right; // whether this variable came from the right side of `A <: B`
7272
int8_t occurs_inv; // occurs in invariant position
7373
int8_t occurs_cov; // # of occurrences in covariant position
@@ -356,7 +356,7 @@ static void free_stenv(jl_stenv_t *e) JL_NOTSAFEPOINT
356356

357357
static void restore_env(jl_stenv_t *e, jl_savedenv_t *se, int root) JL_NOTSAFEPOINT
358358
{
359-
jl_value_t **roots = NULL;
359+
jl_value_t *JL_NONNULL *roots = NULL;
360360
int nroots = 0;
361361
if (root) {
362362
if (se->gcframe.nroots == JL_GC_ENCODE_PUSHARGS(1)) {
@@ -1182,12 +1182,14 @@ static int subtype_tuple_varargs(
11821182
if (bxp1) {
11831183
if (bxp1->intvalued == 0)
11841184
bxp1->intvalued = 1;
1185+
assert(bxp1->lb); // make static analyzer happy
11851186
if (jl_is_long(bxp1->lb))
11861187
xp1 = bxp1->lb;
11871188
}
11881189
if (byp1) {
11891190
if (byp1->intvalued == 0)
11901191
byp1->intvalued = 1;
1192+
assert(byp1->lb); // make static analyzer happy
11911193
if (jl_is_long(byp1->lb))
11921194
yp1 = byp1->lb;
11931195
}

src/typemap.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -286,20 +286,20 @@ static _Atomic(jl_value_t*) *mtcache_hash_lookup_bp(jl_genericmemory_t *cache JL
286286
return pml;
287287
}
288288

289-
static void mtcache_hash_insert(_Atomic(jl_genericmemory_t*) *cache, jl_value_t *parent, jl_value_t *key, jl_typemap_t *val)
289+
static void mtcache_hash_insert(_Atomic(jl_genericmemory_t*) *pcache, jl_value_t *parent, jl_value_t *key, jl_typemap_t *val)
290290
{
291291
int inserted = 0;
292-
jl_genericmemory_t *a = jl_atomic_load_relaxed(cache);
292+
jl_genericmemory_t *a = jl_atomic_load_relaxed(pcache);
293293
if (a == (jl_genericmemory_t*)jl_an_empty_memory_any) {
294294
a = jl_alloc_memory_any(16);
295-
jl_atomic_store_release(cache, a);
295+
jl_atomic_store_release(pcache, a);
296296
if (parent)
297297
jl_gc_wb(parent, a);
298298
}
299299
a = jl_eqtable_put(a, key, val, &inserted);
300300
assert(inserted);
301-
if (a != jl_atomic_load_relaxed(cache)) {
302-
jl_atomic_store_release(cache, a);
301+
if (a != jl_atomic_load_relaxed(pcache)) {
302+
jl_atomic_store_release(pcache, a);
303303
if (parent)
304304
jl_gc_wb(parent, a);
305305
}
@@ -1293,9 +1293,10 @@ static void jl_typemap_memory_insert_(
12931293
static jl_value_t *jl_method_convert_list_to_cache(
12941294
jl_typemap_t *map, jl_typemap_entry_t *ml, int8_t tparam, int8_t offs, int8_t doublesplit)
12951295
{
1296-
jl_value_t *cache = doublesplit ? jl_an_empty_memory_any : (jl_value_t*)jl_new_typemap_level();
1296+
_Atomic(jl_genericmemory_t*) dblcache = (jl_genericmemory_t*)jl_an_empty_memory_any;
1297+
jl_typemap_level_t *cache = doublesplit ? NULL : jl_new_typemap_level();
12971298
jl_typemap_entry_t *next = NULL;
1298-
JL_GC_PUSH3(&cache, &next, &ml);
1299+
JL_GC_PUSH4(&cache, &dblcache, &next, &ml);
12991300
while (ml != (void*)jl_nothing) {
13001301
next = jl_atomic_load_relaxed(&ml->next);
13011302
jl_atomic_store_relaxed(&ml->next, (jl_typemap_entry_t*)jl_nothing);
@@ -1316,14 +1317,14 @@ static jl_value_t *jl_method_convert_list_to_cache(
13161317
assert(jl_is_type_type(key));
13171318
key = jl_tparam0(key);
13181319
}
1319-
jl_typemap_memory_insert_(map, (_Atomic(jl_genericmemory_t*)*)&cache, key, ml, NULL, 0, offs, NULL);
1320+
jl_typemap_memory_insert_(map, &dblcache, key, ml, NULL, 0, offs, NULL);
13201321
}
13211322
else
1322-
jl_typemap_level_insert_(map, (jl_typemap_level_t*)cache, ml, offs);
1323+
jl_typemap_level_insert_(map, cache, ml, offs);
13231324
ml = next;
13241325
}
13251326
JL_GC_POP();
1326-
return cache;
1327+
return doublesplit ? (jl_value_t*)jl_atomic_load_relaxed(&dblcache) : (jl_value_t*)cache;
13271328
}
13281329

13291330
static void jl_typemap_list_insert_(

stdlib/LLD_jll/Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "LLD_jll"
22
uuid = "d55e3150-da41-5e91-b323-ecfd1eec6109"
3-
version = "19.1.7+1"
3+
version = "20.1.2+0"
44

55
[deps]
66
Zlib_jll = "83775a58-1f1d-513f-b197-d71354ab007a"
@@ -10,7 +10,7 @@ Artifacts = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
1010

1111
[compat]
1212
julia = "1.13"
13-
libLLVM_jll = "19.1.7"
13+
libLLVM_jll = "20.1.2"
1414

1515
[extras]
1616
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

0 commit comments

Comments
 (0)