Skip to content

Conversation

@dpaoliello
Copy link
Contributor

@dpaoliello dpaoliello commented Aug 15, 2025

As noted in #153256, TableGen is generating reserved names for RuntimeLibcalls, which resulted in a build failure for Arm64EC since vcruntime.h defines __security_check_cookie as a macro.

To avoid using reserved names, all impl names will now be prefixed with Impl_.

NumLibcallImpls was lifted out as a constexpr size_t instead of being an enum field.

While I was churning the dependent code, I also removed the TODO to move the impl enum into its own namespace and use an enum class: I experimented with using an enum class and adding a namespace, but we decided it was too verbose so it was dropped.

@llvmbot
Copy link
Member

llvmbot commented Aug 15, 2025

@llvm/pr-subscribers-backend-msp430
@llvm/pr-subscribers-backend-sparc

@llvm/pr-subscribers-llvm-ir

Author: Daniel Paoliello (dpaoliello)

Changes

As noted in #153256, TableGen is generating reserved names for RuntimeLibcalls, which resulted in a build failure for Arm64EC since vcruntime.h defines __security_check_cookie as a macro.

To avoid using reserved names, all impl names will now be prefixed with Impl_.

While I was churning the dependent code, I also paid back the TODO to move the impl enum into its own namespace and use an enum class: I opted to only use an enum class as the namespace + enum class resulted in very verbose names.

NumLibcallImpls was lifted out as a constexpr size_t instead of being an enum field.

I added a constexpr for RTLIB::Unsupported since it is heavily used, but I'm not sure if folks would prefer to change uses to RTLIB::LibcallImpl::Unsupported instead.


Patch is 45.96 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/153850.diff

12 Files Affected:

  • (modified) llvm/include/llvm/IR/RuntimeLibcalls.h (+12-9)
  • (modified) llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp (+38-27)
  • (modified) llvm/lib/CodeGen/TargetLoweringBase.cpp (+13-13)
  • (modified) llvm/lib/IR/RuntimeLibcalls.cpp (+18-12)
  • (modified) llvm/lib/Target/ARM/ARMISelLowering.cpp (+32-32)
  • (modified) llvm/lib/Target/MSP430/MSP430ISelLowering.cpp (+12-12)
  • (modified) llvm/lib/Target/Mips/Mips16ISelLowering.cpp (+48-34)
  • (modified) llvm/lib/Target/Sparc/SparcISelLowering.cpp (+44-30)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td (+9-9)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td (+6-6)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter.td (+31-30)
  • (modified) llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp (+8-6)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h
index 308be543de2bd..43a91f88752e6 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.h
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.h
@@ -50,7 +50,8 @@ static inline auto libcalls() {
 }
 
 static inline auto libcall_impls() {
-  return enum_seq(static_cast<RTLIB::LibcallImpl>(1), RTLIB::NumLibcallImpls);
+  return enum_seq(static_cast<RTLIB::LibcallImpl>(1),
+                  static_cast<RTLIB::LibcallImpl>(RTLIB::NumLibcallImpls));
 }
 
 /// A simple container for information about the supported runtime calls.
@@ -85,9 +86,10 @@ struct RuntimeLibcallsInfo {
   static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl) {
     if (CallImpl == RTLIB::Unsupported)
       return StringRef();
-    return StringRef(RuntimeLibcallImplNameTable.getCString(
-                         RuntimeLibcallNameOffsetTable[CallImpl]),
-                     RuntimeLibcallNameSizeTable[CallImpl]);
+    return StringRef(
+        RuntimeLibcallImplNameTable.getCString(
+            RuntimeLibcallNameOffsetTable[static_cast<size_t>(CallImpl)]),
+        RuntimeLibcallNameSizeTable[static_cast<size_t>(CallImpl)]);
   }
 
   /// Return the lowering's selection of implementation call for \p Call
@@ -98,18 +100,18 @@ struct RuntimeLibcallsInfo {
   /// Set the CallingConv that should be used for the specified libcall
   /// implementation
   void setLibcallImplCallingConv(RTLIB::LibcallImpl Call, CallingConv::ID CC) {
-    LibcallImplCallingConvs[Call] = CC;
+    LibcallImplCallingConvs[static_cast<size_t>(Call)] = CC;
   }
 
   // FIXME: Remove this wrapper in favor of directly using
   // getLibcallImplCallingConv
   CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const {
-    return LibcallImplCallingConvs[LibcallImpls[Call]];
+    return LibcallImplCallingConvs[static_cast<size_t>(LibcallImpls[Call])];
   }
 
   /// Get the CallingConv that should be used for the specified libcall.
   CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const {
-    return LibcallImplCallingConvs[Call];
+    return LibcallImplCallingConvs[static_cast<size_t>(Call)];
   }
 
   ArrayRef<RTLIB::LibcallImpl> getLibcallImpls() const {
@@ -130,7 +132,7 @@ struct RuntimeLibcallsInfo {
 
   /// Return the libcall provided by \p Impl
   static RTLIB::Libcall getLibcallFromImpl(RTLIB::LibcallImpl Impl) {
-    return ImplToLibcall[Impl];
+    return ImplToLibcall[static_cast<size_t>(Impl)];
   }
 
   /// Check if a function name is a recognized runtime call of any kind. This
@@ -156,7 +158,8 @@ struct RuntimeLibcallsInfo {
     for (RTLIB::LibcallImpl Impl : lookupLibcallImplName(FuncName)) {
       // FIXME: This should not depend on looking up ImplToLibcall, only the
       // list of libcalls for the module.
-      RTLIB::LibcallImpl Recognized = LibcallImpls[ImplToLibcall[Impl]];
+      RTLIB::LibcallImpl Recognized =
+          LibcallImpls[ImplToLibcall[static_cast<size_t>(Impl)]];
       if (Recognized != RTLIB::Unsupported)
         return Recognized;
     }
diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
index 96c9cde622b45..b0e3c6b759427 100644
--- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
+++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
@@ -507,83 +507,94 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const {
       });
       break;
     case Intrinsic::objc_autorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autorelease);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autorelease);
       break;
     case Intrinsic::objc_autoreleasePoolPop:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPop);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autoreleasePoolPop);
       break;
     case Intrinsic::objc_autoreleasePoolPush:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPush);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autoreleasePoolPush);
       break;
     case Intrinsic::objc_autoreleaseReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleaseReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_autoreleaseReturnValue);
       break;
     case Intrinsic::objc_copyWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_copyWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_copyWeak);
       break;
     case Intrinsic::objc_destroyWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_destroyWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_destroyWeak);
       break;
     case Intrinsic::objc_initWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_initWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_initWeak);
       break;
     case Intrinsic::objc_loadWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_loadWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_loadWeak);
       break;
     case Intrinsic::objc_loadWeakRetained:
-      Changed |= lowerObjCCall(F, RTLIB::objc_loadWeakRetained);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_loadWeakRetained);
       break;
     case Intrinsic::objc_moveWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_moveWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_moveWeak);
       break;
     case Intrinsic::objc_release:
-      Changed |= lowerObjCCall(F, RTLIB::objc_release, true);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_release, true);
       break;
     case Intrinsic::objc_retain:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retain, true);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retain, true);
       break;
     case Intrinsic::objc_retainAutorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutorelease);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainAutorelease);
       break;
     case Intrinsic::objc_retainAutoreleaseReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleaseReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_retainAutoreleaseReturnValue);
       break;
     case Intrinsic::objc_retainAutoreleasedReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_retainAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_claimAutoreleasedReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_claimAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_claimAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_retainBlock:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainBlock);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainBlock);
       break;
     case Intrinsic::objc_storeStrong:
-      Changed |= lowerObjCCall(F, RTLIB::objc_storeStrong);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_storeStrong);
       break;
     case Intrinsic::objc_storeWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_storeWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_storeWeak);
       break;
     case Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
-      Changed |=
-          lowerObjCCall(F, RTLIB::objc_unsafeClaimAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_unsafeClaimAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_retainedObject:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainedObject);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainedObject);
       break;
     case Intrinsic::objc_unretainedObject:
-      Changed |= lowerObjCCall(F, RTLIB::objc_unretainedObject);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_unretainedObject);
       break;
     case Intrinsic::objc_unretainedPointer:
-      Changed |= lowerObjCCall(F, RTLIB::objc_unretainedPointer);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_unretainedPointer);
       break;
     case Intrinsic::objc_retain_autorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retain_autorelease);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retain_autorelease);
       break;
     case Intrinsic::objc_sync_enter:
-      Changed |= lowerObjCCall(F, RTLIB::objc_sync_enter);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_sync_enter);
       break;
     case Intrinsic::objc_sync_exit:
-      Changed |= lowerObjCCall(F, RTLIB::objc_sync_exit);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_sync_exit);
       break;
     case Intrinsic::exp:
     case Intrinsic::exp2:
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 350948a92a3ae..bd7994a2e669a 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -612,23 +612,23 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
 ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate(
     RTLIB::LibcallImpl Impl) const {
   switch (Impl) {
-  case RTLIB::__aeabi_dcmpeq__une:
-  case RTLIB::__aeabi_fcmpeq__une:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpeq__une:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpeq__une:
     // Usage in the eq case, so we have to invert the comparison.
     return ISD::SETEQ;
-  case RTLIB::__aeabi_dcmpeq__oeq:
-  case RTLIB::__aeabi_fcmpeq__oeq:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpeq__oeq:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpeq__oeq:
     // Normal comparison to boolean value.
     return ISD::SETNE;
-  case RTLIB::__aeabi_dcmplt:
-  case RTLIB::__aeabi_dcmple:
-  case RTLIB::__aeabi_dcmpge:
-  case RTLIB::__aeabi_dcmpgt:
-  case RTLIB::__aeabi_dcmpun:
-  case RTLIB::__aeabi_fcmplt:
-  case RTLIB::__aeabi_fcmple:
-  case RTLIB::__aeabi_fcmpge:
-  case RTLIB::__aeabi_fcmpgt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmplt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmple:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpge:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpgt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpun:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmplt:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmple:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpge:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpgt:
     /// The AEABI versions return a typical boolean value, so we can compare
     /// against the integer result as simply != 0.
     return ISD::SETNE;
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index 88cb192c08781..09f6b053eb942 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -34,7 +34,8 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
   setTargetRuntimeLibcallSets(TT, FloatABI, EABIVersion, ABIName);
 
   if (ExceptionModel == ExceptionHandling::SjLj)
-    setLibcallImpl(RTLIB::UNWIND_RESUME, RTLIB::_Unwind_SjLj_Resume);
+    setLibcallImpl(RTLIB::UNWIND_RESUME,
+                   RTLIB::LibcallImpl::Impl__Unwind_SjLj_Resume);
 
   if (TT.isARM() || TT.isThumb()) {
     // The half <-> float conversion functions are always soft-float on
@@ -42,13 +43,19 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
     // hard-float calling convention by default.
     if (!TT.isWatchABI()) {
       if (isAAPCS_ABI(TT, ABIName)) {
-        setLibcallImplCallingConv(RTLIB::__truncsfhf2, CallingConv::ARM_AAPCS);
-        setLibcallImplCallingConv(RTLIB::__truncdfhf2, CallingConv::ARM_AAPCS);
-        setLibcallImplCallingConv(RTLIB::__extendhfsf2, CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncsfhf2,
+                                  CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncdfhf2,
+                                  CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___extendhfsf2,
+                                  CallingConv::ARM_AAPCS);
       } else {
-        setLibcallImplCallingConv(RTLIB::__truncsfhf2, CallingConv::ARM_APCS);
-        setLibcallImplCallingConv(RTLIB::__truncdfhf2, CallingConv::ARM_APCS);
-        setLibcallImplCallingConv(RTLIB::__extendhfsf2, CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncsfhf2,
+                                  CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncdfhf2,
+                                  CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___extendhfsf2,
+                                  CallingConv::ARM_APCS);
       }
     }
 
@@ -56,7 +63,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
   }
 
   if (TT.getArch() == Triple::ArchType::msp430) {
-    setLibcallImplCallingConv(RTLIB::__mspabi_mpyll,
+    setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___mspabi_mpyll,
                               CallingConv::MSP430_BUILTIN);
   }
 }
@@ -73,10 +80,9 @@ RuntimeLibcallsInfo::libcallImplNameHit(uint16_t NameOffsetEntry,
     ++NumAliases;
   }
 
-  RTLIB::LibcallImpl ImplStart = static_cast<RTLIB::LibcallImpl>(
-      &RuntimeLibcallNameOffsetTable[NameOffsetEntry] -
-      &RuntimeLibcallNameOffsetTable[0]);
-  return enum_seq(ImplStart,
+  size_t ImplStart = &RuntimeLibcallNameOffsetTable[NameOffsetEntry] -
+                     &RuntimeLibcallNameOffsetTable[0];
+  return enum_seq(static_cast<RTLIB::LibcallImpl>(ImplStart),
                   static_cast<RTLIB::LibcallImpl>(ImplStart + NumAliases));
 }
 
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 830156359e9e8..3a90e8ddf8f65 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -529,56 +529,56 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
         const RTLIB::LibcallImpl Impl;
       } LibraryCalls[] = {
         // Single-precision floating-point arithmetic.
-        { RTLIB::ADD_F32, RTLIB::__addsf3vfp },
-        { RTLIB::SUB_F32, RTLIB::__subsf3vfp },
-        { RTLIB::MUL_F32, RTLIB::__mulsf3vfp },
-        { RTLIB::DIV_F32, RTLIB::__divsf3vfp },
+        { RTLIB::ADD_F32, RTLIB::LibcallImpl::Impl___addsf3vfp },
+        { RTLIB::SUB_F32, RTLIB::LibcallImpl::Impl___subsf3vfp },
+        { RTLIB::MUL_F32, RTLIB::LibcallImpl::Impl___mulsf3vfp },
+        { RTLIB::DIV_F32, RTLIB::LibcallImpl::Impl___divsf3vfp },
 
         // Double-precision floating-point arithmetic.
-        { RTLIB::ADD_F64, RTLIB::__adddf3vfp },
-        { RTLIB::SUB_F64, RTLIB::__subdf3vfp },
-        { RTLIB::MUL_F64, RTLIB::__muldf3vfp },
-        { RTLIB::DIV_F64, RTLIB::__divdf3vfp },
+        { RTLIB::ADD_F64, RTLIB::LibcallImpl::Impl___adddf3vfp },
+        { RTLIB::SUB_F64, RTLIB::LibcallImpl::Impl___subdf3vfp },
+        { RTLIB::MUL_F64, RTLIB::LibcallImpl::Impl___muldf3vfp },
+        { RTLIB::DIV_F64, RTLIB::LibcallImpl::Impl___divdf3vfp },
 
         // Single-precision comparisons.
-        { RTLIB::OEQ_F32, RTLIB::__eqsf2vfp },
-        { RTLIB::UNE_F32, RTLIB::__nesf2vfp },
-        { RTLIB::OLT_F32, RTLIB::__ltsf2vfp },
-        { RTLIB::OLE_F32, RTLIB::__lesf2vfp },
-        { RTLIB::OGE_F32, RTLIB::__gesf2vfp },
-        { RTLIB::OGT_F32, RTLIB::__gtsf2vfp },
-        { RTLIB::UO_F32,  RTLIB::__unordsf2vfp },
+        { RTLIB::OEQ_F32, RTLIB::LibcallImpl::Impl___eqsf2vfp },
+        { RTLIB::UNE_F32, RTLIB::LibcallImpl::Impl___nesf2vfp },
+        { RTLIB::OLT_F32, RTLIB::LibcallImpl::Impl___ltsf2vfp },
+        { RTLIB::OLE_F32, RTLIB::LibcallImpl::Impl___lesf2vfp },
+        { RTLIB::OGE_F32, RTLIB::LibcallImpl::Impl___gesf2vfp },
+        { RTLIB::OGT_F32, RTLIB::LibcallImpl::Impl___gtsf2vfp },
+        { RTLIB::UO_F32,  RTLIB::LibcallImpl::Impl___unordsf2vfp },
 
         // Double-precision comparisons.
-        { RTLIB::OEQ_F64, RTLIB::__eqdf2vfp },
-        { RTLIB::UNE_F64, RTLIB::__nedf2vfp },
-        { RTLIB::OLT_F64, RTLIB::__ltdf2vfp },
-        { RTLIB::OLE_F64, RTLIB::__ledf2vfp },
-        { RTLIB::OGE_F64, RTLIB::__gedf2vfp },
-        { RTLIB::OGT_F64, RTLIB::__gtdf2vfp },
-        { RTLIB::UO_F64,  RTLIB::__unorddf2vfp },
+        { RTLIB::OEQ_F64, RTLIB::LibcallImpl::Impl___eqdf2vfp },
+        { RTLIB::UNE_F64, RTLIB::LibcallImpl::Impl___nedf2vfp },
+        { RTLIB::OLT_F64, RTLIB::LibcallImpl::Impl___ltdf2vfp },
+        { RTLIB::OLE_F64, RTLIB::LibcallImpl::Impl___ledf2vfp },
+        { RTLIB::OGE_F64, RTLIB::LibcallImpl::Impl___gedf2vfp },
+        { RTLIB::OGT_F64, RTLIB::LibcallImpl::Impl___gtdf2vfp },
+        { RTLIB::UO_F64,  RTLIB::LibcallImpl::Impl___unorddf2vfp },
 
         // Floating-point to integer conversions.
         // i64 conversions are done via library routines even when generating VFP
         // instructions, so use the same ones.
-        { RTLIB::FPTOSINT_F64_I32, RTLIB::__fixdfsivfp },
-        { RTLIB::FPTOUINT_F64_I32, RTLIB::__fixunsdfsivfp },
-        { RTLIB::FPTOSINT_F32_I32, RTLIB::__fixsfsivfp },
-        { RTLIB::FPTOUINT_F32_I32, RTLIB::__fixunssfsivfp },
+        { RTLIB::FPTOSINT_F64_I32, RTLIB::LibcallImpl::Impl___fixdfsivfp },
+        { RTLIB::FPTOUINT_F64_I32, RTLIB::LibcallImpl::Impl___fixunsdfsivfp },
+        { RTLIB::FPTOSINT_F32_I32, RTLIB::LibcallImpl::Impl___fixsfsivfp },
+        { RTLIB::FPTOUINT_F32_I32, RTLIB::LibcallImpl::Impl___fixunssfsivfp },
 
         // Conversions between floating types.
-        { RTLIB::FPROUND_F64_F32, RTLIB::__truncdfsf2vfp },
-        { RTLIB::FPEXT_F32_F64,   RTLIB::__extendsfdf2vfp },
+        { RTLIB::FPROUND_F64_F32, RTLIB::LibcallImpl::Impl___truncdfsf2vfp },
+        { RTLIB::FPEXT_F32_F64,   RTLIB::LibcallImpl::Impl___extendsfdf2vfp },
 
         // Integer to floating-point conversions.
         // i64 conversions are done via library routines even when generating VFP
         // instructions, so use the same ones.
         // FIXME: There appears to be some naming inconsistency in ARM libgcc:
         // e.g., __floatunsidf vs. __floatunssidfvfp.
-        { RTLIB::SINTTOFP_I32_F64, RTLIB::__floatsidfvfp },
-        { RTLIB::UINTTOFP_I32_F64, RTLIB::__floatunssidfvfp },
-        { RTLIB::SINTTOFP_I32_F32, RTLIB::__floatsisfvfp },
-        { RTLIB::UINTTOFP_I32_F32, RTLIB::__floatunssisfvfp },
+        { RTLIB::SINTTOFP_I32_F64, RTLIB::LibcallImpl::Impl___floatsidfvfp },
+        { RTLIB::UINTTOFP_I32_F64, RTLIB::LibcallImpl::Impl___floatunssidfvfp },
+        { RTLIB::SINTTOFP_I32_F32, RTLIB::LibcallImpl::Impl___floatsisfvfp },
+        { RTLIB::UINTTOFP_I32_F32, RTLIB::LibcallImpl::Impl___floatunssisfvfp },
       };
       // clang-format on
 
diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
index 6da5e66be4ad8..cae82635610ed 100644
--- a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
+++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
@@ -154,9 +154,9 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
       const RTLIB::LibcallImpl Impl;
     } LibraryCalls[] = {
         // Integer Multiply - EABI Table 9
-        {RTLIB::MUL_I16, RTLIB::__mspabi_mpyi_hw},
-        {RTLIB::MUL_I32, RTLIB::__mspabi_mpyl_hw},
-        {RTLIB::MUL_I64, RTLIB::__mspabi_mpyll_hw},
+        {RTLIB::MUL_I16, RTLIB::LibcallImpl::Impl___mspabi_mpyi_hw},
+        {RTLIB::MUL_I32, RTLIB::LibcallImpl::Impl___mspabi_mpyl_hw},
+        {RTLIB::MUL_I64, RTLIB::LibcallImpl::Impl___mspabi_mpyll_hw},
         // TODO The __mspabi_mpysl*_hw functions ARE implemented in libgcc
         // TODO The __mspabi_mpyul*_hw functions ARE implemented in libgcc
     };
@@ -169,9 +169,9 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
       const RTLIB::LibcallImpl Impl;
     } LibraryCalls[] = {
         // Integer Multiply - EABI Table 9
-        {RTLIB::MUL_I16, RTLIB::__mspabi_mpyi_hw},
-        {RTLIB::MUL_I32, RTLIB::__mspabi_mpyl_hw32},
-        {RTLIB::MUL_I64, RTLIB::__mspabi_mpyll_hw32},
+        {RTLIB::MUL_I16, RTLIB::LibcallI...
[truncated]

@llvmbot
Copy link
Member

llvmbot commented Aug 15, 2025

@llvm/pr-subscribers-tablegen

Author: Daniel Paoliello (dpaoliello)

Changes

As noted in #153256, TableGen is generating reserved names for RuntimeLibcalls, which resulted in a build failure for Arm64EC since vcruntime.h defines __security_check_cookie as a macro.

To avoid using reserved names, all impl names will now be prefixed with Impl_.

While I was churning the dependent code, I also paid back the TODO to move the impl enum into its own namespace and use an enum class: I opted to only use an enum class as the namespace + enum class resulted in very verbose names.

NumLibcallImpls was lifted out as a constexpr size_t instead of being an enum field.

I added a constexpr for RTLIB::Unsupported since it is heavily used, but I'm not sure if folks would prefer to change uses to RTLIB::LibcallImpl::Unsupported instead.


Patch is 45.96 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/153850.diff

12 Files Affected:

  • (modified) llvm/include/llvm/IR/RuntimeLibcalls.h (+12-9)
  • (modified) llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp (+38-27)
  • (modified) llvm/lib/CodeGen/TargetLoweringBase.cpp (+13-13)
  • (modified) llvm/lib/IR/RuntimeLibcalls.cpp (+18-12)
  • (modified) llvm/lib/Target/ARM/ARMISelLowering.cpp (+32-32)
  • (modified) llvm/lib/Target/MSP430/MSP430ISelLowering.cpp (+12-12)
  • (modified) llvm/lib/Target/Mips/Mips16ISelLowering.cpp (+48-34)
  • (modified) llvm/lib/Target/Sparc/SparcISelLowering.cpp (+44-30)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td (+9-9)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td (+6-6)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter.td (+31-30)
  • (modified) llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp (+8-6)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h
index 308be543de2bd..43a91f88752e6 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.h
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.h
@@ -50,7 +50,8 @@ static inline auto libcalls() {
 }
 
 static inline auto libcall_impls() {
-  return enum_seq(static_cast<RTLIB::LibcallImpl>(1), RTLIB::NumLibcallImpls);
+  return enum_seq(static_cast<RTLIB::LibcallImpl>(1),
+                  static_cast<RTLIB::LibcallImpl>(RTLIB::NumLibcallImpls));
 }
 
 /// A simple container for information about the supported runtime calls.
@@ -85,9 +86,10 @@ struct RuntimeLibcallsInfo {
   static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl) {
     if (CallImpl == RTLIB::Unsupported)
       return StringRef();
-    return StringRef(RuntimeLibcallImplNameTable.getCString(
-                         RuntimeLibcallNameOffsetTable[CallImpl]),
-                     RuntimeLibcallNameSizeTable[CallImpl]);
+    return StringRef(
+        RuntimeLibcallImplNameTable.getCString(
+            RuntimeLibcallNameOffsetTable[static_cast<size_t>(CallImpl)]),
+        RuntimeLibcallNameSizeTable[static_cast<size_t>(CallImpl)]);
   }
 
   /// Return the lowering's selection of implementation call for \p Call
@@ -98,18 +100,18 @@ struct RuntimeLibcallsInfo {
   /// Set the CallingConv that should be used for the specified libcall
   /// implementation
   void setLibcallImplCallingConv(RTLIB::LibcallImpl Call, CallingConv::ID CC) {
-    LibcallImplCallingConvs[Call] = CC;
+    LibcallImplCallingConvs[static_cast<size_t>(Call)] = CC;
   }
 
   // FIXME: Remove this wrapper in favor of directly using
   // getLibcallImplCallingConv
   CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const {
-    return LibcallImplCallingConvs[LibcallImpls[Call]];
+    return LibcallImplCallingConvs[static_cast<size_t>(LibcallImpls[Call])];
   }
 
   /// Get the CallingConv that should be used for the specified libcall.
   CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const {
-    return LibcallImplCallingConvs[Call];
+    return LibcallImplCallingConvs[static_cast<size_t>(Call)];
   }
 
   ArrayRef<RTLIB::LibcallImpl> getLibcallImpls() const {
@@ -130,7 +132,7 @@ struct RuntimeLibcallsInfo {
 
   /// Return the libcall provided by \p Impl
   static RTLIB::Libcall getLibcallFromImpl(RTLIB::LibcallImpl Impl) {
-    return ImplToLibcall[Impl];
+    return ImplToLibcall[static_cast<size_t>(Impl)];
   }
 
   /// Check if a function name is a recognized runtime call of any kind. This
@@ -156,7 +158,8 @@ struct RuntimeLibcallsInfo {
     for (RTLIB::LibcallImpl Impl : lookupLibcallImplName(FuncName)) {
       // FIXME: This should not depend on looking up ImplToLibcall, only the
       // list of libcalls for the module.
-      RTLIB::LibcallImpl Recognized = LibcallImpls[ImplToLibcall[Impl]];
+      RTLIB::LibcallImpl Recognized =
+          LibcallImpls[ImplToLibcall[static_cast<size_t>(Impl)]];
       if (Recognized != RTLIB::Unsupported)
         return Recognized;
     }
diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
index 96c9cde622b45..b0e3c6b759427 100644
--- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
+++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
@@ -507,83 +507,94 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const {
       });
       break;
     case Intrinsic::objc_autorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autorelease);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autorelease);
       break;
     case Intrinsic::objc_autoreleasePoolPop:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPop);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autoreleasePoolPop);
       break;
     case Intrinsic::objc_autoreleasePoolPush:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPush);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autoreleasePoolPush);
       break;
     case Intrinsic::objc_autoreleaseReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleaseReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_autoreleaseReturnValue);
       break;
     case Intrinsic::objc_copyWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_copyWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_copyWeak);
       break;
     case Intrinsic::objc_destroyWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_destroyWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_destroyWeak);
       break;
     case Intrinsic::objc_initWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_initWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_initWeak);
       break;
     case Intrinsic::objc_loadWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_loadWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_loadWeak);
       break;
     case Intrinsic::objc_loadWeakRetained:
-      Changed |= lowerObjCCall(F, RTLIB::objc_loadWeakRetained);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_loadWeakRetained);
       break;
     case Intrinsic::objc_moveWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_moveWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_moveWeak);
       break;
     case Intrinsic::objc_release:
-      Changed |= lowerObjCCall(F, RTLIB::objc_release, true);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_release, true);
       break;
     case Intrinsic::objc_retain:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retain, true);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retain, true);
       break;
     case Intrinsic::objc_retainAutorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutorelease);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainAutorelease);
       break;
     case Intrinsic::objc_retainAutoreleaseReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleaseReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_retainAutoreleaseReturnValue);
       break;
     case Intrinsic::objc_retainAutoreleasedReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_retainAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_claimAutoreleasedReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_claimAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_claimAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_retainBlock:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainBlock);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainBlock);
       break;
     case Intrinsic::objc_storeStrong:
-      Changed |= lowerObjCCall(F, RTLIB::objc_storeStrong);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_storeStrong);
       break;
     case Intrinsic::objc_storeWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_storeWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_storeWeak);
       break;
     case Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
-      Changed |=
-          lowerObjCCall(F, RTLIB::objc_unsafeClaimAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_unsafeClaimAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_retainedObject:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainedObject);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainedObject);
       break;
     case Intrinsic::objc_unretainedObject:
-      Changed |= lowerObjCCall(F, RTLIB::objc_unretainedObject);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_unretainedObject);
       break;
     case Intrinsic::objc_unretainedPointer:
-      Changed |= lowerObjCCall(F, RTLIB::objc_unretainedPointer);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_unretainedPointer);
       break;
     case Intrinsic::objc_retain_autorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retain_autorelease);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retain_autorelease);
       break;
     case Intrinsic::objc_sync_enter:
-      Changed |= lowerObjCCall(F, RTLIB::objc_sync_enter);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_sync_enter);
       break;
     case Intrinsic::objc_sync_exit:
-      Changed |= lowerObjCCall(F, RTLIB::objc_sync_exit);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_sync_exit);
       break;
     case Intrinsic::exp:
     case Intrinsic::exp2:
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 350948a92a3ae..bd7994a2e669a 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -612,23 +612,23 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
 ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate(
     RTLIB::LibcallImpl Impl) const {
   switch (Impl) {
-  case RTLIB::__aeabi_dcmpeq__une:
-  case RTLIB::__aeabi_fcmpeq__une:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpeq__une:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpeq__une:
     // Usage in the eq case, so we have to invert the comparison.
     return ISD::SETEQ;
-  case RTLIB::__aeabi_dcmpeq__oeq:
-  case RTLIB::__aeabi_fcmpeq__oeq:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpeq__oeq:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpeq__oeq:
     // Normal comparison to boolean value.
     return ISD::SETNE;
-  case RTLIB::__aeabi_dcmplt:
-  case RTLIB::__aeabi_dcmple:
-  case RTLIB::__aeabi_dcmpge:
-  case RTLIB::__aeabi_dcmpgt:
-  case RTLIB::__aeabi_dcmpun:
-  case RTLIB::__aeabi_fcmplt:
-  case RTLIB::__aeabi_fcmple:
-  case RTLIB::__aeabi_fcmpge:
-  case RTLIB::__aeabi_fcmpgt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmplt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmple:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpge:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpgt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpun:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmplt:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmple:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpge:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpgt:
     /// The AEABI versions return a typical boolean value, so we can compare
     /// against the integer result as simply != 0.
     return ISD::SETNE;
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index 88cb192c08781..09f6b053eb942 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -34,7 +34,8 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
   setTargetRuntimeLibcallSets(TT, FloatABI, EABIVersion, ABIName);
 
   if (ExceptionModel == ExceptionHandling::SjLj)
-    setLibcallImpl(RTLIB::UNWIND_RESUME, RTLIB::_Unwind_SjLj_Resume);
+    setLibcallImpl(RTLIB::UNWIND_RESUME,
+                   RTLIB::LibcallImpl::Impl__Unwind_SjLj_Resume);
 
   if (TT.isARM() || TT.isThumb()) {
     // The half <-> float conversion functions are always soft-float on
@@ -42,13 +43,19 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
     // hard-float calling convention by default.
     if (!TT.isWatchABI()) {
       if (isAAPCS_ABI(TT, ABIName)) {
-        setLibcallImplCallingConv(RTLIB::__truncsfhf2, CallingConv::ARM_AAPCS);
-        setLibcallImplCallingConv(RTLIB::__truncdfhf2, CallingConv::ARM_AAPCS);
-        setLibcallImplCallingConv(RTLIB::__extendhfsf2, CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncsfhf2,
+                                  CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncdfhf2,
+                                  CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___extendhfsf2,
+                                  CallingConv::ARM_AAPCS);
       } else {
-        setLibcallImplCallingConv(RTLIB::__truncsfhf2, CallingConv::ARM_APCS);
-        setLibcallImplCallingConv(RTLIB::__truncdfhf2, CallingConv::ARM_APCS);
-        setLibcallImplCallingConv(RTLIB::__extendhfsf2, CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncsfhf2,
+                                  CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncdfhf2,
+                                  CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___extendhfsf2,
+                                  CallingConv::ARM_APCS);
       }
     }
 
@@ -56,7 +63,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
   }
 
   if (TT.getArch() == Triple::ArchType::msp430) {
-    setLibcallImplCallingConv(RTLIB::__mspabi_mpyll,
+    setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___mspabi_mpyll,
                               CallingConv::MSP430_BUILTIN);
   }
 }
@@ -73,10 +80,9 @@ RuntimeLibcallsInfo::libcallImplNameHit(uint16_t NameOffsetEntry,
     ++NumAliases;
   }
 
-  RTLIB::LibcallImpl ImplStart = static_cast<RTLIB::LibcallImpl>(
-      &RuntimeLibcallNameOffsetTable[NameOffsetEntry] -
-      &RuntimeLibcallNameOffsetTable[0]);
-  return enum_seq(ImplStart,
+  size_t ImplStart = &RuntimeLibcallNameOffsetTable[NameOffsetEntry] -
+                     &RuntimeLibcallNameOffsetTable[0];
+  return enum_seq(static_cast<RTLIB::LibcallImpl>(ImplStart),
                   static_cast<RTLIB::LibcallImpl>(ImplStart + NumAliases));
 }
 
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 830156359e9e8..3a90e8ddf8f65 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -529,56 +529,56 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
         const RTLIB::LibcallImpl Impl;
       } LibraryCalls[] = {
         // Single-precision floating-point arithmetic.
-        { RTLIB::ADD_F32, RTLIB::__addsf3vfp },
-        { RTLIB::SUB_F32, RTLIB::__subsf3vfp },
-        { RTLIB::MUL_F32, RTLIB::__mulsf3vfp },
-        { RTLIB::DIV_F32, RTLIB::__divsf3vfp },
+        { RTLIB::ADD_F32, RTLIB::LibcallImpl::Impl___addsf3vfp },
+        { RTLIB::SUB_F32, RTLIB::LibcallImpl::Impl___subsf3vfp },
+        { RTLIB::MUL_F32, RTLIB::LibcallImpl::Impl___mulsf3vfp },
+        { RTLIB::DIV_F32, RTLIB::LibcallImpl::Impl___divsf3vfp },
 
         // Double-precision floating-point arithmetic.
-        { RTLIB::ADD_F64, RTLIB::__adddf3vfp },
-        { RTLIB::SUB_F64, RTLIB::__subdf3vfp },
-        { RTLIB::MUL_F64, RTLIB::__muldf3vfp },
-        { RTLIB::DIV_F64, RTLIB::__divdf3vfp },
+        { RTLIB::ADD_F64, RTLIB::LibcallImpl::Impl___adddf3vfp },
+        { RTLIB::SUB_F64, RTLIB::LibcallImpl::Impl___subdf3vfp },
+        { RTLIB::MUL_F64, RTLIB::LibcallImpl::Impl___muldf3vfp },
+        { RTLIB::DIV_F64, RTLIB::LibcallImpl::Impl___divdf3vfp },
 
         // Single-precision comparisons.
-        { RTLIB::OEQ_F32, RTLIB::__eqsf2vfp },
-        { RTLIB::UNE_F32, RTLIB::__nesf2vfp },
-        { RTLIB::OLT_F32, RTLIB::__ltsf2vfp },
-        { RTLIB::OLE_F32, RTLIB::__lesf2vfp },
-        { RTLIB::OGE_F32, RTLIB::__gesf2vfp },
-        { RTLIB::OGT_F32, RTLIB::__gtsf2vfp },
-        { RTLIB::UO_F32,  RTLIB::__unordsf2vfp },
+        { RTLIB::OEQ_F32, RTLIB::LibcallImpl::Impl___eqsf2vfp },
+        { RTLIB::UNE_F32, RTLIB::LibcallImpl::Impl___nesf2vfp },
+        { RTLIB::OLT_F32, RTLIB::LibcallImpl::Impl___ltsf2vfp },
+        { RTLIB::OLE_F32, RTLIB::LibcallImpl::Impl___lesf2vfp },
+        { RTLIB::OGE_F32, RTLIB::LibcallImpl::Impl___gesf2vfp },
+        { RTLIB::OGT_F32, RTLIB::LibcallImpl::Impl___gtsf2vfp },
+        { RTLIB::UO_F32,  RTLIB::LibcallImpl::Impl___unordsf2vfp },
 
         // Double-precision comparisons.
-        { RTLIB::OEQ_F64, RTLIB::__eqdf2vfp },
-        { RTLIB::UNE_F64, RTLIB::__nedf2vfp },
-        { RTLIB::OLT_F64, RTLIB::__ltdf2vfp },
-        { RTLIB::OLE_F64, RTLIB::__ledf2vfp },
-        { RTLIB::OGE_F64, RTLIB::__gedf2vfp },
-        { RTLIB::OGT_F64, RTLIB::__gtdf2vfp },
-        { RTLIB::UO_F64,  RTLIB::__unorddf2vfp },
+        { RTLIB::OEQ_F64, RTLIB::LibcallImpl::Impl___eqdf2vfp },
+        { RTLIB::UNE_F64, RTLIB::LibcallImpl::Impl___nedf2vfp },
+        { RTLIB::OLT_F64, RTLIB::LibcallImpl::Impl___ltdf2vfp },
+        { RTLIB::OLE_F64, RTLIB::LibcallImpl::Impl___ledf2vfp },
+        { RTLIB::OGE_F64, RTLIB::LibcallImpl::Impl___gedf2vfp },
+        { RTLIB::OGT_F64, RTLIB::LibcallImpl::Impl___gtdf2vfp },
+        { RTLIB::UO_F64,  RTLIB::LibcallImpl::Impl___unorddf2vfp },
 
         // Floating-point to integer conversions.
         // i64 conversions are done via library routines even when generating VFP
         // instructions, so use the same ones.
-        { RTLIB::FPTOSINT_F64_I32, RTLIB::__fixdfsivfp },
-        { RTLIB::FPTOUINT_F64_I32, RTLIB::__fixunsdfsivfp },
-        { RTLIB::FPTOSINT_F32_I32, RTLIB::__fixsfsivfp },
-        { RTLIB::FPTOUINT_F32_I32, RTLIB::__fixunssfsivfp },
+        { RTLIB::FPTOSINT_F64_I32, RTLIB::LibcallImpl::Impl___fixdfsivfp },
+        { RTLIB::FPTOUINT_F64_I32, RTLIB::LibcallImpl::Impl___fixunsdfsivfp },
+        { RTLIB::FPTOSINT_F32_I32, RTLIB::LibcallImpl::Impl___fixsfsivfp },
+        { RTLIB::FPTOUINT_F32_I32, RTLIB::LibcallImpl::Impl___fixunssfsivfp },
 
         // Conversions between floating types.
-        { RTLIB::FPROUND_F64_F32, RTLIB::__truncdfsf2vfp },
-        { RTLIB::FPEXT_F32_F64,   RTLIB::__extendsfdf2vfp },
+        { RTLIB::FPROUND_F64_F32, RTLIB::LibcallImpl::Impl___truncdfsf2vfp },
+        { RTLIB::FPEXT_F32_F64,   RTLIB::LibcallImpl::Impl___extendsfdf2vfp },
 
         // Integer to floating-point conversions.
         // i64 conversions are done via library routines even when generating VFP
         // instructions, so use the same ones.
         // FIXME: There appears to be some naming inconsistency in ARM libgcc:
         // e.g., __floatunsidf vs. __floatunssidfvfp.
-        { RTLIB::SINTTOFP_I32_F64, RTLIB::__floatsidfvfp },
-        { RTLIB::UINTTOFP_I32_F64, RTLIB::__floatunssidfvfp },
-        { RTLIB::SINTTOFP_I32_F32, RTLIB::__floatsisfvfp },
-        { RTLIB::UINTTOFP_I32_F32, RTLIB::__floatunssisfvfp },
+        { RTLIB::SINTTOFP_I32_F64, RTLIB::LibcallImpl::Impl___floatsidfvfp },
+        { RTLIB::UINTTOFP_I32_F64, RTLIB::LibcallImpl::Impl___floatunssidfvfp },
+        { RTLIB::SINTTOFP_I32_F32, RTLIB::LibcallImpl::Impl___floatsisfvfp },
+        { RTLIB::UINTTOFP_I32_F32, RTLIB::LibcallImpl::Impl___floatunssisfvfp },
       };
       // clang-format on
 
diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
index 6da5e66be4ad8..cae82635610ed 100644
--- a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
+++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
@@ -154,9 +154,9 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
       const RTLIB::LibcallImpl Impl;
     } LibraryCalls[] = {
         // Integer Multiply - EABI Table 9
-        {RTLIB::MUL_I16, RTLIB::__mspabi_mpyi_hw},
-        {RTLIB::MUL_I32, RTLIB::__mspabi_mpyl_hw},
-        {RTLIB::MUL_I64, RTLIB::__mspabi_mpyll_hw},
+        {RTLIB::MUL_I16, RTLIB::LibcallImpl::Impl___mspabi_mpyi_hw},
+        {RTLIB::MUL_I32, RTLIB::LibcallImpl::Impl___mspabi_mpyl_hw},
+        {RTLIB::MUL_I64, RTLIB::LibcallImpl::Impl___mspabi_mpyll_hw},
         // TODO The __mspabi_mpysl*_hw functions ARE implemented in libgcc
         // TODO The __mspabi_mpyul*_hw functions ARE implemented in libgcc
     };
@@ -169,9 +169,9 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
       const RTLIB::LibcallImpl Impl;
     } LibraryCalls[] = {
         // Integer Multiply - EABI Table 9
-        {RTLIB::MUL_I16, RTLIB::__mspabi_mpyi_hw},
-        {RTLIB::MUL_I32, RTLIB::__mspabi_mpyl_hw32},
-        {RTLIB::MUL_I64, RTLIB::__mspabi_mpyll_hw32},
+        {RTLIB::MUL_I16, RTLIB::LibcallI...
[truncated]

@llvmbot
Copy link
Member

llvmbot commented Aug 15, 2025

@llvm/pr-subscribers-backend-arm

Author: Daniel Paoliello (dpaoliello)

Changes

As noted in #153256, TableGen is generating reserved names for RuntimeLibcalls, which resulted in a build failure for Arm64EC since vcruntime.h defines __security_check_cookie as a macro.

To avoid using reserved names, all impl names will now be prefixed with Impl_.

While I was churning the dependent code, I also paid back the TODO to move the impl enum into its own namespace and use an enum class: I opted to only use an enum class as the namespace + enum class resulted in very verbose names.

NumLibcallImpls was lifted out as a constexpr size_t instead of being an enum field.

I added a constexpr for RTLIB::Unsupported since it is heavily used, but I'm not sure if folks would prefer to change uses to RTLIB::LibcallImpl::Unsupported instead.


Patch is 45.96 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/153850.diff

12 Files Affected:

  • (modified) llvm/include/llvm/IR/RuntimeLibcalls.h (+12-9)
  • (modified) llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp (+38-27)
  • (modified) llvm/lib/CodeGen/TargetLoweringBase.cpp (+13-13)
  • (modified) llvm/lib/IR/RuntimeLibcalls.cpp (+18-12)
  • (modified) llvm/lib/Target/ARM/ARMISelLowering.cpp (+32-32)
  • (modified) llvm/lib/Target/MSP430/MSP430ISelLowering.cpp (+12-12)
  • (modified) llvm/lib/Target/Mips/Mips16ISelLowering.cpp (+48-34)
  • (modified) llvm/lib/Target/Sparc/SparcISelLowering.cpp (+44-30)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td (+9-9)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td (+6-6)
  • (modified) llvm/test/TableGen/RuntimeLibcallEmitter.td (+31-30)
  • (modified) llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp (+8-6)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h
index 308be543de2bd..43a91f88752e6 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.h
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.h
@@ -50,7 +50,8 @@ static inline auto libcalls() {
 }
 
 static inline auto libcall_impls() {
-  return enum_seq(static_cast<RTLIB::LibcallImpl>(1), RTLIB::NumLibcallImpls);
+  return enum_seq(static_cast<RTLIB::LibcallImpl>(1),
+                  static_cast<RTLIB::LibcallImpl>(RTLIB::NumLibcallImpls));
 }
 
 /// A simple container for information about the supported runtime calls.
@@ -85,9 +86,10 @@ struct RuntimeLibcallsInfo {
   static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl) {
     if (CallImpl == RTLIB::Unsupported)
       return StringRef();
-    return StringRef(RuntimeLibcallImplNameTable.getCString(
-                         RuntimeLibcallNameOffsetTable[CallImpl]),
-                     RuntimeLibcallNameSizeTable[CallImpl]);
+    return StringRef(
+        RuntimeLibcallImplNameTable.getCString(
+            RuntimeLibcallNameOffsetTable[static_cast<size_t>(CallImpl)]),
+        RuntimeLibcallNameSizeTable[static_cast<size_t>(CallImpl)]);
   }
 
   /// Return the lowering's selection of implementation call for \p Call
@@ -98,18 +100,18 @@ struct RuntimeLibcallsInfo {
   /// Set the CallingConv that should be used for the specified libcall
   /// implementation
   void setLibcallImplCallingConv(RTLIB::LibcallImpl Call, CallingConv::ID CC) {
-    LibcallImplCallingConvs[Call] = CC;
+    LibcallImplCallingConvs[static_cast<size_t>(Call)] = CC;
   }
 
   // FIXME: Remove this wrapper in favor of directly using
   // getLibcallImplCallingConv
   CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const {
-    return LibcallImplCallingConvs[LibcallImpls[Call]];
+    return LibcallImplCallingConvs[static_cast<size_t>(LibcallImpls[Call])];
   }
 
   /// Get the CallingConv that should be used for the specified libcall.
   CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const {
-    return LibcallImplCallingConvs[Call];
+    return LibcallImplCallingConvs[static_cast<size_t>(Call)];
   }
 
   ArrayRef<RTLIB::LibcallImpl> getLibcallImpls() const {
@@ -130,7 +132,7 @@ struct RuntimeLibcallsInfo {
 
   /// Return the libcall provided by \p Impl
   static RTLIB::Libcall getLibcallFromImpl(RTLIB::LibcallImpl Impl) {
-    return ImplToLibcall[Impl];
+    return ImplToLibcall[static_cast<size_t>(Impl)];
   }
 
   /// Check if a function name is a recognized runtime call of any kind. This
@@ -156,7 +158,8 @@ struct RuntimeLibcallsInfo {
     for (RTLIB::LibcallImpl Impl : lookupLibcallImplName(FuncName)) {
       // FIXME: This should not depend on looking up ImplToLibcall, only the
       // list of libcalls for the module.
-      RTLIB::LibcallImpl Recognized = LibcallImpls[ImplToLibcall[Impl]];
+      RTLIB::LibcallImpl Recognized =
+          LibcallImpls[ImplToLibcall[static_cast<size_t>(Impl)]];
       if (Recognized != RTLIB::Unsupported)
         return Recognized;
     }
diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
index 96c9cde622b45..b0e3c6b759427 100644
--- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
+++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
@@ -507,83 +507,94 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const {
       });
       break;
     case Intrinsic::objc_autorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autorelease);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autorelease);
       break;
     case Intrinsic::objc_autoreleasePoolPop:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPop);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autoreleasePoolPop);
       break;
     case Intrinsic::objc_autoreleasePoolPush:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPush);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_autoreleasePoolPush);
       break;
     case Intrinsic::objc_autoreleaseReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_autoreleaseReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_autoreleaseReturnValue);
       break;
     case Intrinsic::objc_copyWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_copyWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_copyWeak);
       break;
     case Intrinsic::objc_destroyWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_destroyWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_destroyWeak);
       break;
     case Intrinsic::objc_initWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_initWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_initWeak);
       break;
     case Intrinsic::objc_loadWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_loadWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_loadWeak);
       break;
     case Intrinsic::objc_loadWeakRetained:
-      Changed |= lowerObjCCall(F, RTLIB::objc_loadWeakRetained);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_loadWeakRetained);
       break;
     case Intrinsic::objc_moveWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_moveWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_moveWeak);
       break;
     case Intrinsic::objc_release:
-      Changed |= lowerObjCCall(F, RTLIB::objc_release, true);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_release, true);
       break;
     case Intrinsic::objc_retain:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retain, true);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retain, true);
       break;
     case Intrinsic::objc_retainAutorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutorelease);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainAutorelease);
       break;
     case Intrinsic::objc_retainAutoreleaseReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleaseReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_retainAutoreleaseReturnValue);
       break;
     case Intrinsic::objc_retainAutoreleasedReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_retainAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_claimAutoreleasedReturnValue:
-      Changed |= lowerObjCCall(F, RTLIB::objc_claimAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_claimAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_retainBlock:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainBlock);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainBlock);
       break;
     case Intrinsic::objc_storeStrong:
-      Changed |= lowerObjCCall(F, RTLIB::objc_storeStrong);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_storeStrong);
       break;
     case Intrinsic::objc_storeWeak:
-      Changed |= lowerObjCCall(F, RTLIB::objc_storeWeak);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_storeWeak);
       break;
     case Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
-      Changed |=
-          lowerObjCCall(F, RTLIB::objc_unsafeClaimAutoreleasedReturnValue);
+      Changed |= lowerObjCCall(
+          F, RTLIB::LibcallImpl::Impl_objc_unsafeClaimAutoreleasedReturnValue);
       break;
     case Intrinsic::objc_retainedObject:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retainedObject);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retainedObject);
       break;
     case Intrinsic::objc_unretainedObject:
-      Changed |= lowerObjCCall(F, RTLIB::objc_unretainedObject);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_unretainedObject);
       break;
     case Intrinsic::objc_unretainedPointer:
-      Changed |= lowerObjCCall(F, RTLIB::objc_unretainedPointer);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_unretainedPointer);
       break;
     case Intrinsic::objc_retain_autorelease:
-      Changed |= lowerObjCCall(F, RTLIB::objc_retain_autorelease);
+      Changed |=
+          lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_retain_autorelease);
       break;
     case Intrinsic::objc_sync_enter:
-      Changed |= lowerObjCCall(F, RTLIB::objc_sync_enter);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_sync_enter);
       break;
     case Intrinsic::objc_sync_exit:
-      Changed |= lowerObjCCall(F, RTLIB::objc_sync_exit);
+      Changed |= lowerObjCCall(F, RTLIB::LibcallImpl::Impl_objc_sync_exit);
       break;
     case Intrinsic::exp:
     case Intrinsic::exp2:
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 350948a92a3ae..bd7994a2e669a 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -612,23 +612,23 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
 ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate(
     RTLIB::LibcallImpl Impl) const {
   switch (Impl) {
-  case RTLIB::__aeabi_dcmpeq__une:
-  case RTLIB::__aeabi_fcmpeq__une:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpeq__une:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpeq__une:
     // Usage in the eq case, so we have to invert the comparison.
     return ISD::SETEQ;
-  case RTLIB::__aeabi_dcmpeq__oeq:
-  case RTLIB::__aeabi_fcmpeq__oeq:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpeq__oeq:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpeq__oeq:
     // Normal comparison to boolean value.
     return ISD::SETNE;
-  case RTLIB::__aeabi_dcmplt:
-  case RTLIB::__aeabi_dcmple:
-  case RTLIB::__aeabi_dcmpge:
-  case RTLIB::__aeabi_dcmpgt:
-  case RTLIB::__aeabi_dcmpun:
-  case RTLIB::__aeabi_fcmplt:
-  case RTLIB::__aeabi_fcmple:
-  case RTLIB::__aeabi_fcmpge:
-  case RTLIB::__aeabi_fcmpgt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmplt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmple:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpge:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpgt:
+  case RTLIB::LibcallImpl::Impl___aeabi_dcmpun:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmplt:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmple:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpge:
+  case RTLIB::LibcallImpl::Impl___aeabi_fcmpgt:
     /// The AEABI versions return a typical boolean value, so we can compare
     /// against the integer result as simply != 0.
     return ISD::SETNE;
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index 88cb192c08781..09f6b053eb942 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -34,7 +34,8 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
   setTargetRuntimeLibcallSets(TT, FloatABI, EABIVersion, ABIName);
 
   if (ExceptionModel == ExceptionHandling::SjLj)
-    setLibcallImpl(RTLIB::UNWIND_RESUME, RTLIB::_Unwind_SjLj_Resume);
+    setLibcallImpl(RTLIB::UNWIND_RESUME,
+                   RTLIB::LibcallImpl::Impl__Unwind_SjLj_Resume);
 
   if (TT.isARM() || TT.isThumb()) {
     // The half <-> float conversion functions are always soft-float on
@@ -42,13 +43,19 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
     // hard-float calling convention by default.
     if (!TT.isWatchABI()) {
       if (isAAPCS_ABI(TT, ABIName)) {
-        setLibcallImplCallingConv(RTLIB::__truncsfhf2, CallingConv::ARM_AAPCS);
-        setLibcallImplCallingConv(RTLIB::__truncdfhf2, CallingConv::ARM_AAPCS);
-        setLibcallImplCallingConv(RTLIB::__extendhfsf2, CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncsfhf2,
+                                  CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncdfhf2,
+                                  CallingConv::ARM_AAPCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___extendhfsf2,
+                                  CallingConv::ARM_AAPCS);
       } else {
-        setLibcallImplCallingConv(RTLIB::__truncsfhf2, CallingConv::ARM_APCS);
-        setLibcallImplCallingConv(RTLIB::__truncdfhf2, CallingConv::ARM_APCS);
-        setLibcallImplCallingConv(RTLIB::__extendhfsf2, CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncsfhf2,
+                                  CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___truncdfhf2,
+                                  CallingConv::ARM_APCS);
+        setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___extendhfsf2,
+                                  CallingConv::ARM_APCS);
       }
     }
 
@@ -56,7 +63,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
   }
 
   if (TT.getArch() == Triple::ArchType::msp430) {
-    setLibcallImplCallingConv(RTLIB::__mspabi_mpyll,
+    setLibcallImplCallingConv(RTLIB::LibcallImpl::Impl___mspabi_mpyll,
                               CallingConv::MSP430_BUILTIN);
   }
 }
@@ -73,10 +80,9 @@ RuntimeLibcallsInfo::libcallImplNameHit(uint16_t NameOffsetEntry,
     ++NumAliases;
   }
 
-  RTLIB::LibcallImpl ImplStart = static_cast<RTLIB::LibcallImpl>(
-      &RuntimeLibcallNameOffsetTable[NameOffsetEntry] -
-      &RuntimeLibcallNameOffsetTable[0]);
-  return enum_seq(ImplStart,
+  size_t ImplStart = &RuntimeLibcallNameOffsetTable[NameOffsetEntry] -
+                     &RuntimeLibcallNameOffsetTable[0];
+  return enum_seq(static_cast<RTLIB::LibcallImpl>(ImplStart),
                   static_cast<RTLIB::LibcallImpl>(ImplStart + NumAliases));
 }
 
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 830156359e9e8..3a90e8ddf8f65 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -529,56 +529,56 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
         const RTLIB::LibcallImpl Impl;
       } LibraryCalls[] = {
         // Single-precision floating-point arithmetic.
-        { RTLIB::ADD_F32, RTLIB::__addsf3vfp },
-        { RTLIB::SUB_F32, RTLIB::__subsf3vfp },
-        { RTLIB::MUL_F32, RTLIB::__mulsf3vfp },
-        { RTLIB::DIV_F32, RTLIB::__divsf3vfp },
+        { RTLIB::ADD_F32, RTLIB::LibcallImpl::Impl___addsf3vfp },
+        { RTLIB::SUB_F32, RTLIB::LibcallImpl::Impl___subsf3vfp },
+        { RTLIB::MUL_F32, RTLIB::LibcallImpl::Impl___mulsf3vfp },
+        { RTLIB::DIV_F32, RTLIB::LibcallImpl::Impl___divsf3vfp },
 
         // Double-precision floating-point arithmetic.
-        { RTLIB::ADD_F64, RTLIB::__adddf3vfp },
-        { RTLIB::SUB_F64, RTLIB::__subdf3vfp },
-        { RTLIB::MUL_F64, RTLIB::__muldf3vfp },
-        { RTLIB::DIV_F64, RTLIB::__divdf3vfp },
+        { RTLIB::ADD_F64, RTLIB::LibcallImpl::Impl___adddf3vfp },
+        { RTLIB::SUB_F64, RTLIB::LibcallImpl::Impl___subdf3vfp },
+        { RTLIB::MUL_F64, RTLIB::LibcallImpl::Impl___muldf3vfp },
+        { RTLIB::DIV_F64, RTLIB::LibcallImpl::Impl___divdf3vfp },
 
         // Single-precision comparisons.
-        { RTLIB::OEQ_F32, RTLIB::__eqsf2vfp },
-        { RTLIB::UNE_F32, RTLIB::__nesf2vfp },
-        { RTLIB::OLT_F32, RTLIB::__ltsf2vfp },
-        { RTLIB::OLE_F32, RTLIB::__lesf2vfp },
-        { RTLIB::OGE_F32, RTLIB::__gesf2vfp },
-        { RTLIB::OGT_F32, RTLIB::__gtsf2vfp },
-        { RTLIB::UO_F32,  RTLIB::__unordsf2vfp },
+        { RTLIB::OEQ_F32, RTLIB::LibcallImpl::Impl___eqsf2vfp },
+        { RTLIB::UNE_F32, RTLIB::LibcallImpl::Impl___nesf2vfp },
+        { RTLIB::OLT_F32, RTLIB::LibcallImpl::Impl___ltsf2vfp },
+        { RTLIB::OLE_F32, RTLIB::LibcallImpl::Impl___lesf2vfp },
+        { RTLIB::OGE_F32, RTLIB::LibcallImpl::Impl___gesf2vfp },
+        { RTLIB::OGT_F32, RTLIB::LibcallImpl::Impl___gtsf2vfp },
+        { RTLIB::UO_F32,  RTLIB::LibcallImpl::Impl___unordsf2vfp },
 
         // Double-precision comparisons.
-        { RTLIB::OEQ_F64, RTLIB::__eqdf2vfp },
-        { RTLIB::UNE_F64, RTLIB::__nedf2vfp },
-        { RTLIB::OLT_F64, RTLIB::__ltdf2vfp },
-        { RTLIB::OLE_F64, RTLIB::__ledf2vfp },
-        { RTLIB::OGE_F64, RTLIB::__gedf2vfp },
-        { RTLIB::OGT_F64, RTLIB::__gtdf2vfp },
-        { RTLIB::UO_F64,  RTLIB::__unorddf2vfp },
+        { RTLIB::OEQ_F64, RTLIB::LibcallImpl::Impl___eqdf2vfp },
+        { RTLIB::UNE_F64, RTLIB::LibcallImpl::Impl___nedf2vfp },
+        { RTLIB::OLT_F64, RTLIB::LibcallImpl::Impl___ltdf2vfp },
+        { RTLIB::OLE_F64, RTLIB::LibcallImpl::Impl___ledf2vfp },
+        { RTLIB::OGE_F64, RTLIB::LibcallImpl::Impl___gedf2vfp },
+        { RTLIB::OGT_F64, RTLIB::LibcallImpl::Impl___gtdf2vfp },
+        { RTLIB::UO_F64,  RTLIB::LibcallImpl::Impl___unorddf2vfp },
 
         // Floating-point to integer conversions.
         // i64 conversions are done via library routines even when generating VFP
         // instructions, so use the same ones.
-        { RTLIB::FPTOSINT_F64_I32, RTLIB::__fixdfsivfp },
-        { RTLIB::FPTOUINT_F64_I32, RTLIB::__fixunsdfsivfp },
-        { RTLIB::FPTOSINT_F32_I32, RTLIB::__fixsfsivfp },
-        { RTLIB::FPTOUINT_F32_I32, RTLIB::__fixunssfsivfp },
+        { RTLIB::FPTOSINT_F64_I32, RTLIB::LibcallImpl::Impl___fixdfsivfp },
+        { RTLIB::FPTOUINT_F64_I32, RTLIB::LibcallImpl::Impl___fixunsdfsivfp },
+        { RTLIB::FPTOSINT_F32_I32, RTLIB::LibcallImpl::Impl___fixsfsivfp },
+        { RTLIB::FPTOUINT_F32_I32, RTLIB::LibcallImpl::Impl___fixunssfsivfp },
 
         // Conversions between floating types.
-        { RTLIB::FPROUND_F64_F32, RTLIB::__truncdfsf2vfp },
-        { RTLIB::FPEXT_F32_F64,   RTLIB::__extendsfdf2vfp },
+        { RTLIB::FPROUND_F64_F32, RTLIB::LibcallImpl::Impl___truncdfsf2vfp },
+        { RTLIB::FPEXT_F32_F64,   RTLIB::LibcallImpl::Impl___extendsfdf2vfp },
 
         // Integer to floating-point conversions.
         // i64 conversions are done via library routines even when generating VFP
         // instructions, so use the same ones.
         // FIXME: There appears to be some naming inconsistency in ARM libgcc:
         // e.g., __floatunsidf vs. __floatunssidfvfp.
-        { RTLIB::SINTTOFP_I32_F64, RTLIB::__floatsidfvfp },
-        { RTLIB::UINTTOFP_I32_F64, RTLIB::__floatunssidfvfp },
-        { RTLIB::SINTTOFP_I32_F32, RTLIB::__floatsisfvfp },
-        { RTLIB::UINTTOFP_I32_F32, RTLIB::__floatunssisfvfp },
+        { RTLIB::SINTTOFP_I32_F64, RTLIB::LibcallImpl::Impl___floatsidfvfp },
+        { RTLIB::UINTTOFP_I32_F64, RTLIB::LibcallImpl::Impl___floatunssidfvfp },
+        { RTLIB::SINTTOFP_I32_F32, RTLIB::LibcallImpl::Impl___floatsisfvfp },
+        { RTLIB::UINTTOFP_I32_F32, RTLIB::LibcallImpl::Impl___floatunssisfvfp },
       };
       // clang-format on
 
diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
index 6da5e66be4ad8..cae82635610ed 100644
--- a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
+++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp
@@ -154,9 +154,9 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
       const RTLIB::LibcallImpl Impl;
     } LibraryCalls[] = {
         // Integer Multiply - EABI Table 9
-        {RTLIB::MUL_I16, RTLIB::__mspabi_mpyi_hw},
-        {RTLIB::MUL_I32, RTLIB::__mspabi_mpyl_hw},
-        {RTLIB::MUL_I64, RTLIB::__mspabi_mpyll_hw},
+        {RTLIB::MUL_I16, RTLIB::LibcallImpl::Impl___mspabi_mpyi_hw},
+        {RTLIB::MUL_I32, RTLIB::LibcallImpl::Impl___mspabi_mpyl_hw},
+        {RTLIB::MUL_I64, RTLIB::LibcallImpl::Impl___mspabi_mpyll_hw},
         // TODO The __mspabi_mpysl*_hw functions ARE implemented in libgcc
         // TODO The __mspabi_mpyul*_hw functions ARE implemented in libgcc
     };
@@ -169,9 +169,9 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
       const RTLIB::LibcallImpl Impl;
     } LibraryCalls[] = {
         // Integer Multiply - EABI Table 9
-        {RTLIB::MUL_I16, RTLIB::__mspabi_mpyi_hw},
-        {RTLIB::MUL_I32, RTLIB::__mspabi_mpyl_hw32},
-        {RTLIB::MUL_I64, RTLIB::__mspabi_mpyll_hw32},
+        {RTLIB::MUL_I16, RTLIB::LibcallI...
[truncated]

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Twine should not be returned by value like this. Should keep this returning the original StringRef, and add the prefix at the emission time.

I think the prefix should not be Impl, it's pretty ugly and you end up with multiple adjacent "Impls" in the name.

How about "RTLIB_", "lc_", "libcall_"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair enough, I'll go with lci_ for LibCallImpl

Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you're giving this an Impl_ prefix, I'm not sure it makes sense to also use enum class. That double-namespaces all symbols.

@dpaoliello
Copy link
Contributor Author

If you're giving this an Impl_ prefix, I'm not sure it makes sense to also use enum class. That double-namespaces all symbols.

@arsenm thoughts? We need to have a prefix to avoid conflicting with reserved names, but would you be ok with not having an enum class/namespace for the impls?

@arsenm
Copy link
Contributor

arsenm commented Aug 20, 2025

If you're giving this an Impl_ prefix, I'm not sure it makes sense to also use enum class. That double-namespaces all symbols.

@arsenm thoughts? We need to have a prefix to avoid conflicting with reserved names, but would you be ok with not having an enum class/namespace for the impls?

Yes, I don't think the enum class is necessary. RTLIB was preexisting, we could pull everything out if it if desired.

@dpaoliello
Copy link
Contributor Author

@arsenm ping...

Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR title and description are out of date with the implementation.

TBH I liked your original Impl_ prefix more than lci_. RTLIB::Impl_ is more obvious than RTLIB::lci_ if you're not very familiar with this code and know that lci is short for LibCallImpl.

@dpaoliello
Copy link
Contributor Author

Ok, executive decision, I'm going with RTLIB::impl_, it makes it clear for the code outside of RuntimeLibcalls what these enum values are. Within RuntimeLibcalls, there is a lot of "impl" next to "impl", but I don't think it's a bad thing: it makes it clear that the two are related (e.g., a function and this enum).

@dpaoliello dpaoliello requested a review from nikic August 29, 2025 20:59
Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but description / title still need an update as this doesn't use enum class.

@dpaoliello dpaoliello changed the title [NFC] RuntimeLibcalls: Prefix the impls with 'Impl_' and use an enum class [NFC] RuntimeLibcalls: Prefix the impls with 'Impl_' Sep 2, 2025
@dpaoliello dpaoliello merged commit f99b0f3 into llvm:main Sep 2, 2025
9 checks passed
@dpaoliello dpaoliello deleted the enumclassimpl branch September 2, 2025 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants