[llvm-branch-commits] [llvm] RuntimeLibcalls: Split __atomic_* into a separate libatomic library (PR #233571)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Oct 19 13:46:59 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

The __atomic_* functions are not part of libgcc or the default
compiler-rt builtins. GCC ships them in libatomic, and compiler-rt in the
optional clang_rt.atomic. Every system that uses compiler-rt also lists
libatomic, so the available functions are unchanged.

Co-authored-by: Claude Opus 5.5 <noreply@<!-- -->anthropic.com>

---
Full diff: https://github.com/llvm/llvm-project/pull/233571.diff


2 Files Affected:

- (modified) llvm/include/llvm/IR/RuntimeLibcalls.td (+51-20) 
- (modified) llvm/unittests/IR/RuntimeLibcallsTest.cpp (+11-9) 


``````````diff
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td
index dd6348f3b3a50..2523d11d35f87 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.td
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.td
@@ -1391,11 +1391,6 @@ foreach lc = LibCalls__sync in {
   def __#!tolower(!cast<string>(lc)) : RuntimeLibcallImpl<lc>;
 }
 
-// Atomic `__atomic_*' libcalls.
-foreach lc = LibCalls__atomic in {
-  def __#!tolower(!cast<string>(lc)) : RuntimeLibcallImpl<lc>;
-}
-
 // Deoptimization
 def __llvm_deoptimize : RuntimeLibcallImpl<DEOPTIMIZE>;
 
@@ -1403,6 +1398,16 @@ def __llvm_deoptimize : RuntimeLibcallImpl<DEOPTIMIZE>;
 def __clear_cache : RuntimeLibcallImpl<CLEAR_CACHE>;
 } // End defset CompilerRtLibgccImpls
 
+// libatomic
+//--------------------------------------------------------------------
+
+// Atomic `__atomic_*' libcalls.
+defset list<RuntimeLibcallImpl> LibatomicImpls = {
+  foreach lc = LibCalls__atomic in {
+    def __#!tolower(!cast<string>(lc)) : RuntimeLibcallImpl<lc>;
+  }
+}
+
 //--------------------------------------------------------------------
 // libm
 //--------------------------------------------------------------------
@@ -2214,6 +2219,9 @@ def CompilerRtLibgcc : LibcallLibrary<"compiler-rt",
        LibcallImpls<(add CompilerRtLibgccImpls_ppcf128), isLongDoublePPCF128>,
        LibcallImpls<(add Int128RTLibcalls), isArch64Bit>)>;
 
+// The `__atomic_*' runtime: GCC's libatomic, or compiler-rt's clang_rt.atomic.
+def Libatomic : LibcallLibrary<"libatomic", (add LibatomicImpls)>;
+
 def Libc : LibcallLibrary<"libc", (add LibcCoreImpls)>;
 
 // PPC and SPARC provide their own stack protector, and XCore has none.
@@ -2356,7 +2364,7 @@ def AArch64OutlineAtomics : LibcallLibrary<"compiler-rt",
   isAArch64_ExceptArm64EC>;
 
 def AArch64SystemLibrary : SystemRuntimeLibrary<isAArch64_ExceptArm64EC,
-  ["compiler-rt", "libm", "libc", "unwind", "sme"]>;
+  ["compiler-rt", "libatomic", "libm", "libc", "unwind", "sme"]>;
 
 // The Windows runtime lacks the f32 and f64 powi helpers, and frexpf/ldexpf.
 defvar Arm64ECCompilerRtImpls =
@@ -2376,6 +2384,12 @@ defset list<RuntimeLibcallImpl> WinArm64ECDefaultRuntimeLibcallImpls = {
   }
 }
 
+defset list<RuntimeLibcallImpl> WinArm64ECLibatomicImpls = {
+  foreach libcall = LibatomicImpls in {
+    def arm64ec_#libcall : DuplicateLibcallImplWithPrefix<libcall, "#">;
+  }
+}
+
 def arm64ec___stack_chk_fail : DuplicateLibcallImplWithPrefix<__stack_chk_fail, "#">;
 
 defset list<RuntimeLibcallImpl> WinArm64ECDefaultExceptionHandlingLibcalls = {
@@ -2423,9 +2437,14 @@ def Arm64ECRuntime : LibcallLibrary<"compiler-rt",
   let Isolated = true;
 }
 
+def Arm64ECLibatomic : LibcallLibrary<"libatomic",
+  (add WinArm64ECLibatomicImpls), isWindowsArm64EC> {
+  let Isolated = true;
+}
+
 def WindowsARM64ECSystemLibrary
     : SystemRuntimeLibrary<isWindowsArm64EC,
-                           ["compiler-rt", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libc", "unwind"]>;
 
 //===----------------------------------------------------------------------===//
 // AMDGPU Runtime Libcalls
@@ -2910,7 +2929,7 @@ def ARMLibm : LibcallLibrary<"libm",
 
 def ARMSystemLibrary
     : SystemRuntimeLibrary<isARMOrThumb,
-      ["compiler-rt", "libm", "libc", "unwind"]> {
+      ["compiler-rt", "libatomic", "libm", "libc", "unwind"]> {
   let DefaultLibcallCallingConv = LibcallCallingConv<[{
      TT.isOSDarwin() ? CallingConv::C :
         (FloatABI == FloatABI::Hard ? CallingConv::ARM_AAPCS_VFP
@@ -2960,7 +2979,8 @@ defvar AVRCompilerRtOptOut = [
 defvar AVRLibmOptOut = [sin, cos, sinf, cosf, sincos, sincosf];
 
 def AVRSystemLibrary
-    : SystemRuntimeLibrary<isAVR, ["compiler-rt", "libm", "libc", "unwind"]>;
+    : SystemRuntimeLibrary<isAVR, ["compiler-rt", "libatomic", "libm",
+                                   "libc", "unwind"]>;
 
 def : LibraryExclusion<"compiler-rt", isAVR, AVRCompilerRtOptOut>;
 def : LibraryExclusion<"libm", isAVR, AVRLibmOptOut>;
@@ -3026,7 +3046,8 @@ def HexagonCompilerRt
 
 def HexagonSystemLibrary
     : SystemRuntimeLibrary<isHexagon,
-                           ["compiler-rt", "libm", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]>;
 
 //===----------------------------------------------------------------------===//
 // Lanai Runtime Libcalls
@@ -3037,7 +3058,8 @@ def isLanai : RuntimeLibcallAvailability<(all_of IsLanai)>;
 // Use fast calling convention for library functions.
 def LanaiSystemLibrary
     : SystemRuntimeLibrary<isLanai,
-                           ["compiler-rt", "libm", "libc", "unwind"]> {
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]> {
   let DefaultLibcallCallingConv = FASTCC;
 }
 
@@ -3310,7 +3332,8 @@ def MSP430CompilerRt : LibcallLibrary<"compiler-rt", (add
 
 def MSP430SystemLibrary
     : SystemRuntimeLibrary<isMSP430,
-                           ["compiler-rt", "libm", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]>;
 
 def : LibraryExclusion<"compiler-rt", isMSP430, MSP430DefaultOptOut>;
 def : LibraryExclusion<"libm", isMSP430, [sincos, sincosf]>;
@@ -3433,7 +3456,8 @@ defvar PPCReplacedCompilerRtF128 = [
     __powitf2_f128, __trunctfhf2_f128];
 
 def PPCSystemLibrary
-    : SystemRuntimeLibrary<isPPC, ["compiler-rt", "libc", "libm", "unwind"]>;
+    : SystemRuntimeLibrary<isPPC, ["compiler-rt", "libatomic", "libc",
+                                   "libm", "unwind"]>;
 
 def : LibraryExclusion<"compiler-rt", isPPC, PPCReplacedCompilerRtF128>;
 def : LibraryExclusion<"libc", isPPC, [memcpy]>;
@@ -3449,7 +3473,8 @@ def RISCVLibc : LibcallLibrary<"libc", (add __riscv_flush_icache), isRISCV>;
 
 def RISCVSystemLibrary
     : SystemRuntimeLibrary<isRISCV,
-                           ["compiler-rt", "libm", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]>;
 
 //===----------------------------------------------------------------------===//
 // SPARC Runtime Libcalls
@@ -3523,7 +3548,8 @@ def SPARCStackProtectorLibc : LibcallLibrary<"libc",
 
 def SPARCSystemLibrary
     : SystemRuntimeLibrary<isSPARC,
-                           ["compiler-rt", "libm", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]>;
 
 def : LibraryExclusion<"compiler-rt", isSPARC, SPARC64_MulDivCalls>;
 
@@ -3621,7 +3647,8 @@ def X86Libm : LibcallLibrary<"libm",
        LibcallImpls<(add frexpl_f128, ldexpl_f128), isLongDoubleF128>), isX86>;
 
 def X86SystemLibrary
-    : SystemRuntimeLibrary<isX86, ["compiler-rt", "libm", "libc", "unwind"]>;
+    : SystemRuntimeLibrary<isX86, ["compiler-rt", "libatomic", "libm",
+                                   "libc", "unwind"]>;
 
 def : LibraryExclusion<"compiler-rt", isX86,
   !listconcat(WindowsDivRemMulLibcallOverrides, [__powitf2_f128])>;
@@ -3647,7 +3674,8 @@ def XCoreLibm : LibcallLibrary<"libm",
 
 def XCoreSystemLibrary
     : SystemRuntimeLibrary<isXCore,
-                           ["compiler-rt", "libm", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]>;
 
 def : LibraryExclusion<"libm", isXCore, [sincos, sincosf]>;
 
@@ -3769,7 +3797,8 @@ def ZOSLibc : LibcallLibrary<"libc", (add ZOSRuntimeLibcalls), isSystemZZOS>;
 
 def SystemZZOSSystemLibrary
     : SystemRuntimeLibrary<isSystemZZOS,
-                           ["compiler-rt", "libm", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]>;
 
 //===----------------------------------------------------------------------===//
 // WebAssembly Runtime Libcalls
@@ -3800,7 +3829,8 @@ def WasmExceptionRuntime : LibcallLibrary<"unwind",
   (add _Unwind_GetWasmLPadContext), isWasm>;
 
 def WasmSystemLibrary
-    : SystemRuntimeLibrary<isWasm, ["compiler-rt", "libm", "libc", "unwind"]>;
+    : SystemRuntimeLibrary<isWasm, ["compiler-rt", "libatomic", "libm",
+                                    "libc", "unwind"]>;
 
 def : LibraryExclusion<"libm", isWasm, [sincos, sincosf, sincosl_f128]>;
 
@@ -3816,7 +3846,8 @@ def isDefaultLibcallArch : RuntimeLibcallAvailability<
 
 def LegacyDefaultSystemLibrary
     : SystemRuntimeLibrary<isDefaultLibcallArch,
-                           ["compiler-rt", "libm", "libc", "unwind"]>;
+                           ["compiler-rt", "libatomic", "libm",
+                            "libc", "unwind"]>;
 
 //===----------------------------------------------------------------------===//
 // Vector math libraries
diff --git a/llvm/unittests/IR/RuntimeLibcallsTest.cpp b/llvm/unittests/IR/RuntimeLibcallsTest.cpp
index 012310e9b1de8..43836ae9bd68c 100644
--- a/llvm/unittests/IR/RuntimeLibcallsTest.cpp
+++ b/llvm/unittests/IR/RuntimeLibcallsTest.cpp
@@ -67,18 +67,20 @@ TEST(RuntimeLibcallsTest, LibcallImplByName) {
 TEST(RuntimeLibcallsTest, DefaultRuntimeLibraries) {
   using Info = RTLIB::RuntimeLibcallsInfo;
   const RTLIB::RuntimeLibrary X86Libs[] = {
-      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libc,
-      RTLIB::RuntimeLibrary::libm, RTLIB::RuntimeLibrary::unwind};
-  const RTLIB::RuntimeLibrary AArch64Libs[] = {
-      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libc,
-      RTLIB::RuntimeLibrary::libm, RTLIB::RuntimeLibrary::sme,
+      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libatomic,
+      RTLIB::RuntimeLibrary::libc, RTLIB::RuntimeLibrary::libm,
       RTLIB::RuntimeLibrary::unwind};
+  const RTLIB::RuntimeLibrary AArch64Libs[] = {
+      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libatomic,
+      RTLIB::RuntimeLibrary::libc,        RTLIB::RuntimeLibrary::libm,
+      RTLIB::RuntimeLibrary::sme,         RTLIB::RuntimeLibrary::unwind};
   const RTLIB::RuntimeLibrary Arm64ECLibs[] = {
-      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libc,
-      RTLIB::RuntimeLibrary::unwind};
+      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libatomic,
+      RTLIB::RuntimeLibrary::libc, RTLIB::RuntimeLibrary::unwind};
   const RTLIB::RuntimeLibrary PPCLibs[] = {
-      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libc,
-      RTLIB::RuntimeLibrary::libm, RTLIB::RuntimeLibrary::unwind};
+      RTLIB::RuntimeLibrary::compiler_rt, RTLIB::RuntimeLibrary::libatomic,
+      RTLIB::RuntimeLibrary::libc, RTLIB::RuntimeLibrary::libm,
+      RTLIB::RuntimeLibrary::unwind};
   const RTLIB::RuntimeLibrary AMDGPULibs[] = {
       RTLIB::RuntimeLibrary::compiler_rt_profile};
   const RTLIB::RuntimeLibrary SPIRVLibs[] = {RTLIB::RuntimeLibrary::libc};

``````````

</details>


https://github.com/llvm/llvm-project/pull/233571


More information about the llvm-branch-commits mailing list