[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