Skip to content

Commit a8054ed

Browse files
vchuravyararslan
authored andcommitted
turn on libatomic for FreeBSD (#23901)
1 parent 7708eb1 commit a8054ed

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

src/jitlayers.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,12 +335,12 @@ void NotifyDebugger(jit_code_entry *JITCodeEntry)
335335
}
336336
// ------------------------ END OF TEMPORARY COPY FROM LLVM -----------------
337337

338-
#if defined(_OS_LINUX_) || defined(_OS_WINDOWS_)
338+
#if defined(_OS_LINUX_) || defined(_OS_WINDOWS_) || defined(_OS_FREEBSD_)
339339
// Resolve non-lock free atomic functions in the libatomic library.
340340
// This is the library that provides support for c11/c++11 atomic operations.
341341
static uint64_t resolve_atomic(const char *name)
342342
{
343-
#if defined(_OS_LINUX_)
343+
#if defined(_OS_LINUX_) || defined(_OS_FREEBSD_)
344344
static const char *const libatomic = "libatomic";
345345
#elif defined(_OS_WINDOWS_)
346346
static const char *const libatomic = "libatomic-1";
@@ -579,7 +579,7 @@ void JuliaOJIT::addModule(std::unique_ptr<Module> M)
579579
// Step 2: Search the program symbols
580580
if (uint64_t addr = SectionMemoryManager::getSymbolAddressInProcess(Name))
581581
return JL_SymbolInfo(addr, JITSymbolFlags::Exported);
582-
#if defined(_OS_LINUX_) || defined(_OS_WINDOWS_)
582+
#if defined(_OS_LINUX_) || defined(_OS_WINDOWS_) || defined(_OS_FREEBSD_)
583583
if (uint64_t addr = resolve_atomic(Name.c_str()))
584584
return JL_SymbolInfo(addr, JITSymbolFlags::Exported);
585585
#endif

test/threads.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,3 +451,30 @@ function test_nested_loops()
451451
end
452452
end
453453
test_nested_loops()
454+
455+
@testset "libatomic" begin
456+
prog = """
457+
using Base.Threads
458+
function unaligned_setindex!(x::Atomic{UInt128}, v::UInt128)
459+
Base.llvmcall(\"\"\"
460+
%ptr = inttoptr i$(Sys.WORD_SIZE) %0 to i128*
461+
store atomic i128 %1, i128* %ptr release, align 8
462+
ret void
463+
\"\"\", Void, Tuple{Ptr{UInt128}, UInt128}, unsafe_convert(Ptr{UInt128}, x), v)
464+
end
465+
code_native(STDOUT, unaligned_setindex!, Tuple{Atomic{UInt128}, UInt128})
466+
"""
467+
468+
mktempdir() do dir
469+
file = joinpath(dir, "test23901.jl")
470+
write(file, prog)
471+
run(pipeline(ignorestatus(`$(Base.julia_cmd()) --startup-file=no $file`),
472+
stdout=joinpath(dir, "out.txt"),
473+
stderr=joinpath(dir, "err.txt"),
474+
append=false))
475+
out = readchomp(joinpath(dir, "out.txt"))
476+
err = readchomp(joinpath(dir, "err.txt"))
477+
@test contains(out, "libat_store") || contains(out, "atomic_store")
478+
@test !contains(err, "__atomic_store")
479+
end
480+
end

0 commit comments

Comments
 (0)