[llvm-branch-commits] [llvm] RuntimeLibcalls: Generate an enum for runtime library names (PR #230780)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Sat Oct 10 03:53:46 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

Emit an RTLIB::RuntimeLibrary enumerator for each distinct LibraryName,
and use it instead of a string for isLibraryAvailable.

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

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


10 Files Affected:

- (modified) llvm/include/llvm/IR/RuntimeLibcalls.h (+2-2) 
- (modified) llvm/lib/IR/RuntimeLibcalls.cpp (+1-1) 
- (modified) llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td (+6-6) 
- (modified) llvm/test/TableGen/RuntimeLibcallEmitter-library-default-cc.td (+1-1) 
- (modified) llvm/test/TableGen/RuntimeLibcallEmitter-library-dispatch.td (+2-2) 
- (modified) llvm/test/TableGen/RuntimeLibcallEmitter-library-isolated.td (+1-1) 
- (modified) llvm/test/TableGen/RuntimeLibcallEmitter-library-ref.td (+2-2) 
- (modified) llvm/test/TableGen/RuntimeLibcallEmitter-library-unreferenced.td (+1-1) 
- (modified) llvm/test/TableGen/RuntimeLibcallEmitter.td (+9-4) 
- (modified) llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp (+36-9) 


``````````diff
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h
index 1ba3f456183b8..2059ae99108d2 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.h
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.h
@@ -257,9 +257,9 @@ struct RuntimeLibcallsInfo {
   LLVM_READONLY
   static bool isAAPCS_ABI(const Triple &TT, StringRef ABIName);
 
-  /// Return whether the runtime library \p LibraryName is available for the
+  /// Return whether the runtime library \p Library is available for the
   /// current module.
-  bool isLibraryAvailable(StringRef LibraryName) const;
+  bool isLibraryAvailable(RTLIB::RuntimeLibrary Library) const;
 
   /// Generated by tablegen.
   void setTargetRuntimeLibcallSets(const Triple &TT,
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index b920fa80535e3..9fee17c1d3915 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -107,7 +107,7 @@ RuntimeLibcallsInfo::RuntimeLibcallsInfo(const Module &M, StringRef ABIName,
     : RuntimeLibcallsInfo(M.getTargetTriple(), M.getExceptionModel(),
                           M.getFloatABI(), ABIName, VecLib) {}
 
-bool RuntimeLibcallsInfo::isLibraryAvailable(StringRef LibraryName) const {
+bool RuntimeLibcallsInfo::isLibraryAvailable(RuntimeLibrary Library) const {
   // TODO: Drive this from module-level state (e.g. the linked runtime). For now
   // every named library is reported as available.
   return true;
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td b/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td
index 20a28aeac183d..41d0b779a3c80 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td
@@ -111,27 +111,27 @@ def MSP430LibraryWithCondCC : SystemRuntimeLibrary<isMSP430,
 // CHECK-NEXT:       Entry = DefaultCC;
 // CHECK-NEXT:     }
 // CHECK-EMPTY:
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, DefaultCC);
-// CHECK-NEXT:     if (isLibraryAvailable("compiler-rt"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::compiler_rt))
 // CHECK-NEXT:       setAvailableLibFuncs_compiler_rt(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, DefaultCC);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
 // CHECK-NEXT:   }
 // CHECK-EMPTY:
 // CHECK-NEXT:   if (TT.getArch() == Triple::avr) {
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
-// CHECK-NEXT:     if (isLibraryAvailable("compiler-rt"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::compiler_rt))
 // CHECK-NEXT:       setAvailableLibFuncs_compiler_rt(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
 // CHECK-NEXT:   }
 // CHECK-EMPTY:
 // CHECK-NEXT:   if (TT.getArch() == Triple::msp430) {
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
-// CHECK-NEXT:     if (isLibraryAvailable("compiler-rt"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::compiler_rt))
 // CHECK-NEXT:       setAvailableLibFuncs_compiler_rt(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-library-default-cc.td b/llvm/test/TableGen/RuntimeLibcallEmitter-library-default-cc.td
index 1ded6f85361ea..eb096e6672dde 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-library-default-cc.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-library-default-cc.td
@@ -44,5 +44,5 @@ def FooSystem : SystemRuntimeLibrary<isFoo, (add FooLib)> {
 
 // CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(
 // CHECK: const CallingConv::ID DefaultCC = FloatABI == FloatABI::Hard ? CallingConv::ARM_AAPCS_VFP : CallingConv::ARM_AAPCS;
-// CHECK: if (isLibraryAvailable("foo"))
+// CHECK: if (isLibraryAvailable(RTLIB::RuntimeLibrary::foo))
 // CHECK-NEXT: setAvailableLibFuncs_foo(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, DefaultCC);
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-library-dispatch.td b/llvm/test/TableGen/RuntimeLibcallEmitter-library-dispatch.td
index ae0db2f7e741e..d4a8febd72b61 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-library-dispatch.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-library-dispatch.td
@@ -25,9 +25,9 @@ def X86System : SystemRuntimeLibrary<isX86, (add Libc, Libm)>;
 
 // CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT, ExceptionHandling ExceptionModel, FloatABI::ABIType FloatABI, StringRef ABIName, LongDoubleFormat LongDoubleFormat) {
 // CHECK:   if (TT.isX86()) {
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
-// CHECK-NEXT:     if (isLibraryAvailable("libm"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libm))
 // CHECK-NEXT:       setAvailableLibFuncs_libm(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-library-isolated.td b/llvm/test/TableGen/RuntimeLibcallEmitter-library-isolated.td
index 38523893ab9fa..fc373bdef1819 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-library-isolated.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-library-isolated.td
@@ -70,5 +70,5 @@ def SPIRVSystemLibrary : SystemRuntimeLibrary<isSPIRV, (add SPIRVLibc)>;
 
 // CHECK-LABEL: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(
 // CHECK: if (TT.isSPIRV()) {
-// CHECK: if (isLibraryAvailable("libc"))
+// CHECK: if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT: setAvailableLibFuncs_SPIRVLibc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-library-ref.td b/llvm/test/TableGen/RuntimeLibcallEmitter-library-ref.td
index 9a6a42c94f679..aded738751d4f 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-library-ref.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-library-ref.td
@@ -44,8 +44,8 @@ def X86System : SystemRuntimeLibrary<isX86,
 // The dispatcher is a plain call for both libraries; no setUnavailable here.
 // CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(
 // CHECK:   if (TT.isX86()) {
-// CHECK-NEXT:     if (isLibraryAvailable("compiler-rt"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::compiler_rt))
 // CHECK-NEXT:       setAvailableLibFuncs_compiler_rt(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
-// CHECK-NEXT:     if (isLibraryAvailable("libm"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libm))
 // CHECK-NEXT:       setAvailableLibFuncs_libm(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-NOT:   setUnavailable
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-library-unreferenced.td b/llvm/test/TableGen/RuntimeLibcallEmitter-library-unreferenced.td
index 179c2528db300..f479fb8a0331a 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-library-unreferenced.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-library-unreferenced.td
@@ -31,6 +31,6 @@ def X86System : SystemRuntimeLibrary<isX86, (add Libc)>;
 // Only the referenced library is dispatched.
 
 // CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(
-// CHECK: if (isLibraryAvailable("libc"))
+// CHECK: if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT: setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-NOT: setAvailableLibFuncs_ext(
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter.td b/llvm/test/TableGen/RuntimeLibcallEmitter.td
index 1de89119e8908..1b4989802b5ae 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter.td
@@ -148,6 +148,11 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add BlahLibc)>;
 // CHECK-NEXT:  ULong,
 // CHECK-NEXT:  Void,
 // CHECK-NEXT:};
+// CHECK-EMPTY:
+// CHECK-NEXT: enum class RuntimeLibrary : unsigned char {
+// CHECK-NEXT:   UnknownLibrary = 0,
+// CHECK-NEXT:   libc,
+// CHECK-NEXT: };
 // CHECK-NEXT: } // End namespace RTLIB
 // CHECK-NEXT: } // End namespace llvm
 // CHECK-EMPTY:
@@ -359,28 +364,28 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add BlahLibc)>;
 // CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT, ExceptionHandling ExceptionModel, FloatABI::ABIType FloatABI, StringRef ABIName, LongDoubleFormat LongDoubleFormat) {
 // CHECK-EMPTY:
 // CHECK-NEXT:   if (TT.getArch() == Triple::blah) {
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
 // CHECK-NEXT:   }
 // CHECK-EMPTY:
 // CHECK-NEXT:   if (TT.getArch() == Triple::buzz) {
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
 // CHECK-NEXT:   }
 // CHECK-EMPTY:
 // CHECK-NEXT:   if (TT.getArch() == Triple::foo) {
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
 // CHECK-NEXT:   }
 // CHECK-EMPTY:
 // CHECK-NEXT:   if (TT.getArch() == Triple::simple) {
-// CHECK-NEXT:     if (isLibraryAvailable("libc"))
+// CHECK-NEXT:     if (isLibraryAvailable(RTLIB::RuntimeLibrary::libc))
 // CHECK-NEXT:       setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
 // CHECK-EMPTY:
 // CHECK-NEXT:     return;
diff --git a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
index 7389db859428f..00bd583b8cd03 100644
--- a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
@@ -137,6 +137,9 @@ class RuntimeLibcallEmitter {
   MapVector<StringRef, std::vector<const Record *>>
   collectLibrariesByName() const;
 
+  // Get the sorted, unique list of every defined LibraryName.
+  std::vector<StringRef> collectLibraryNames() const;
+
   void emitRuntimeLibcallsInfoMemberDecls(raw_ostream &OS) const;
 
   void emitSystemRuntimeLibrarySetCalls(raw_ostream &OS) const;
@@ -166,6 +169,18 @@ class RuntimeLibcallEmitter {
 
 } // End anonymous namespace.
 
+// Emit the linker name \p Name as a C++ identifier suffix, replacing characters
+// invalid in an identifier (e.g. the '-' in "compiler-rt") with '_'.
+static void emitLibFuncSuffix(raw_ostream &OS, StringRef Name) {
+  for (char C : Name)
+    OS << (isAlnum(C) || C == '_' ? C : '_');
+}
+
+static void emitRuntimeLibraryEnumerator(raw_ostream &OS, StringRef Name) {
+  OS << "RTLIB::RuntimeLibrary::";
+  emitLibFuncSuffix(OS, Name);
+}
+
 void RuntimeLibcallEmitter::emitGetRuntimeLibcallEnum(raw_ostream &OS) const {
   IfDefEmitter IfDef(OS, "GET_RUNTIME_LIBCALL_ENUM");
 
@@ -202,6 +217,15 @@ void RuntimeLibcallEmitter::emitGetRuntimeLibcallEnum(raw_ostream &OS) const {
     OS << "  " << R->getName() << ",\n";
   }
 
+  OS << "};\n\n"
+        "enum class RuntimeLibrary : unsigned char {\n"
+        "  UnknownLibrary = 0,\n";
+  for (StringRef Name : collectLibraryNames()) {
+    OS << "  ";
+    emitLibFuncSuffix(OS, Name);
+    OS << ",\n";
+  }
+
   OS << "};\n"
         "} // End namespace RTLIB\n"
         "} // End namespace llvm\n";
@@ -565,13 +589,6 @@ void RuntimeLibcallEmitter::emitPredicateGroups(
   }
 }
 
-// Emit the linker name \p Name as a C++ identifier suffix, replacing characters
-// invalid in an identifier (e.g. the '-' in "compiler-rt") with '_'.
-static void emitLibFuncSuffix(raw_ostream &OS, StringRef Name) {
-  for (char C : Name)
-    OS << (isAlnum(C) || C == '_' ? C : '_');
-}
-
 void RuntimeLibcallEmitter::emitLibraryVariant(raw_ostream &OS,
                                                ExpandedLibrary &EL) const {
   AvailabilityPredicate LibPred(EL.Lib->getValueAsDef("Pred"));
@@ -752,6 +769,15 @@ RuntimeLibcallEmitter::collectLibrariesByName() const {
   return LibsByName;
 }
 
+std::vector<StringRef> RuntimeLibcallEmitter::collectLibraryNames() const {
+  std::vector<StringRef> Names;
+  for (const Record *Lib : Records.getAllDerivedDefinitions("LibcallLibrary"))
+    Names.push_back(Lib->getValueAsString("LibraryName"));
+  llvm::sort(Names);
+  Names.erase(llvm::unique(Names), Names.end());
+  return Names;
+}
+
 void RuntimeLibcallEmitter::emitRuntimeLibcallsInfoMemberDecls(
     raw_ostream &OS) const {
   IfDefEmitter IfDef(OS, "GET_RUNTIME_LIBCALLS_INFO_MEMBER_DECLS");
@@ -850,8 +876,9 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
     }
 
     for (auto [Name, FuncSuffix] : DispatchLibs) {
-      OS << indent(4) << "if (isLibraryAvailable(\"" << Name << "\"))\n"
-         << indent(6) << "setAvailableLibFuncs_";
+      OS << indent(4) << "if (isLibraryAvailable(";
+      emitRuntimeLibraryEnumerator(OS, Name);
+      OS << "))\n" << indent(6) << "setAvailableLibFuncs_";
       emitLibFuncSuffix(OS, FuncSuffix);
       OS << "(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, "
          << DefaultCCArg << ");\n";

``````````

</details>


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


More information about the llvm-branch-commits mailing list