Skip to content

[NFC] RuntimeLibcalls: Prefix the impls with 'Impl_' and use an enum class #153850

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

dpaoliello
Copy link
Contributor

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.

@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]

@@ -157,7 +157,7 @@ class RuntimeLibcallImpl {

const Record *getDef() const { return TheDef; }

StringRef getName() const { return TheDef->getName(); }
Twine getName() const { return Twine("Impl_") + TheDef->getName(); }
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

@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.

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