diff --git a/Makefile b/Makefile index ba20b70194ec8..05b08bed94a49 100644 --- a/Makefile +++ b/Makefile @@ -323,6 +323,7 @@ $(eval $(call std_dll,gcc_s_seh-1)) endif $(eval $(call std_dll,ssp-0)) $(eval $(call std_dll,winpthread-1)) +$(eval $(call std_dll,atomic-1)) endif define stringreplace $(build_depsbindir)/stringreplace $$(strings -t x - $1 | grep '$2' | awk '{print $$1;}') '$3' 255 "$(call cygpath_w,$1)" diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index b816e3a6f2c56..defab5b11d16a 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -316,12 +316,17 @@ void NotifyDebugger(jit_code_entry *JITCodeEntry) } // ------------------------ END OF TEMPORARY COPY FROM LLVM ----------------- -#if defined(_OS_LINUX_) +#if defined(_OS_LINUX_) || defined(_OS_WINDOWS_) // Resolve non-lock free atomic functions in the libatomic library. // This is the library that provides support for c11/c++11 atomic operations. static uint64_t resolve_atomic(const char *name) { - static void *atomic_hdl = jl_load_dynamic_library_e("libatomic", +#if defined(_OS_LINUX_) + static const char *const libatomic = "libatomic"; +#elif defined(_OS_WINDOWS_) + static const char *const libatomic = "libatomic-1"; +#endif + static void *atomic_hdl = jl_load_dynamic_library_e(libatomic, JL_RTLD_LOCAL); static const char *const atomic_prefix = "__atomic_"; if (!atomic_hdl) @@ -534,7 +539,7 @@ void JuliaOJIT::addModule(std::unique_ptr M) // Step 2: Search the program symbols if (uint64_t addr = SectionMemoryManager::getSymbolAddressInProcess(Name)) return JL_SymbolInfo(addr, JITSymbolFlags::Exported); -#if defined(_OS_LINUX_) +#if defined(_OS_LINUX_) || defined(_OS_WINDOWS_) if (uint64_t addr = resolve_atomic(Name.c_str())) return JL_SymbolInfo(addr, JITSymbolFlags::Exported); #endif diff --git a/src/julia_internal.h b/src/julia_internal.h index ac1eaa09a2b50..6b7fc807112a8 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -155,12 +155,9 @@ void gc_sweep_sysimg(void); static const int jl_gc_sizeclasses[JL_GC_N_POOLS] = { #ifdef _P64 8, -#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) || defined(_CPU_X86_) +#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) // ARM and PowerPC have max alignment of 8, // make sure allocation of size 8 has that alignment. - // for x86 alignment is important for atomic ops and - // the corresponding platform ABI. Once we can use - // libatomic on Windows this is no longer necessary. 4, 8, #else 4, 8, 12, @@ -196,7 +193,7 @@ STATIC_INLINE int jl_gc_alignment(size_t sz) #ifdef _P64 (void)sz; return 16; -#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) || defined(_CPU_X86_) +#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) return sz <= 4 ? 8 : 16; #else // szclass 8 @@ -217,7 +214,7 @@ STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass(size_t sz) if (sz <= 8) return 0; const int N = 0; -#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) || defined(_CPU_X86_) +#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) if (sz <= 8) return (sz + 3) / 4 - 1; const int N = 1; diff --git a/src/julia_threads.h b/src/julia_threads.h index 1051d740c8b85..cc4fd2479e2ae 100644 --- a/src/julia_threads.h +++ b/src/julia_threads.h @@ -62,7 +62,7 @@ typedef struct { // variables for allocating objects from pools #ifdef _P64 # define JL_GC_N_POOLS 41 -#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) || defined(_CPU_X86_) +#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) # define JL_GC_N_POOLS 42 #else # define JL_GC_N_POOLS 43