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 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
