diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h index 26c085031a48a..89e466ee5933d 100644 --- a/llvm/include/llvm/IR/RuntimeLibcalls.h +++ b/llvm/include/llvm/IR/RuntimeLibcalls.h @@ -15,6 +15,7 @@ #define LLVM_IR_RUNTIME_LIBCALLS_H #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/Sequence.h" #include "llvm/IR/CallingConv.h" #include "llvm/Support/AtomicOrdering.h" #include "llvm/Support/Compiler.h" @@ -36,6 +37,18 @@ enum Libcall { #include "llvm/IR/RuntimeLibcalls.def" #undef HANDLE_LIBCALL }; +} // namespace RTLIB + +template <> struct enum_iteration_traits { + static constexpr bool is_iterable = true; +}; + +namespace RTLIB { + +// Return an iterator over all Libcall values. +static inline auto libcalls() { + return enum_seq(static_cast(0), RTLIB::UNKNOWN_LIBCALL); +} /// A simple container for information about the supported runtime calls. struct RuntimeLibcallsInfo { diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp index ca45cd4b7b13c..0936c7cc64f37 100644 --- a/llvm/lib/IR/RuntimeLibcalls.cpp +++ b/llvm/lib/IR/RuntimeLibcalls.cpp @@ -208,21 +208,14 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) { setLibcallName(RTLIB::FREXP_PPCF128, nullptr); } - // Disable most libcalls on AMDGPU. - if (TT.isAMDGPU()) { - for (int I = 0; I < RTLIB::UNKNOWN_LIBCALL; ++I) { - if (I < RTLIB::ATOMIC_LOAD || I > RTLIB::ATOMIC_FETCH_NAND_16) - setLibcallName(static_cast(I), nullptr); + // Disable most libcalls on AMDGPU and NVPTX. + if (TT.isAMDGPU() || TT.isNVPTX()) { + for (RTLIB::Libcall LC : RTLIB::libcalls()) { + if (LC < RTLIB::ATOMIC_LOAD || LC > RTLIB::ATOMIC_FETCH_NAND_16) + setLibcallName(LC, nullptr); } } - // Disable most libcalls on NVPTX. - if (TT.isNVPTX()) { - for (int I = 0; I < RTLIB::UNKNOWN_LIBCALL; ++I) - if (I < RTLIB::ATOMIC_LOAD || I > RTLIB::ATOMIC_FETCH_NAND_16) - setLibcallName(static_cast(I), nullptr); - } - if (TT.isOSMSVCRT()) { // MSVCRT doesn't have powi; fall back to pow setLibcallName(RTLIB::POWI_F32, nullptr); diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index d156851d7e214..574281d12e3cb 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -511,10 +511,11 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM, if (!Subtarget->isTargetDarwin() && !Subtarget->isTargetIOS() && !Subtarget->isTargetWatchOS() && !Subtarget->isTargetDriverKit()) { bool IsHFTarget = TM.Options.FloatABIType == FloatABI::Hard; - for (int LCID = 0; LCID < RTLIB::UNKNOWN_LIBCALL; ++LCID) - setLibcallCallingConv(static_cast(LCID), - IsHFTarget ? CallingConv::ARM_AAPCS_VFP - : CallingConv::ARM_AAPCS); + + for (RTLIB::Libcall LC : RTLIB::libcalls()) { + setLibcallCallingConv(LC, IsHFTarget ? CallingConv::ARM_AAPCS_VFP + : CallingConv::ARM_AAPCS); + } } if (Subtarget->isTargetMachO()) { diff --git a/llvm/lib/Target/Lanai/LanaiISelLowering.cpp b/llvm/lib/Target/Lanai/LanaiISelLowering.cpp index 8b50eb2678af6..7781817aef71a 100644 --- a/llvm/lib/Target/Lanai/LanaiISelLowering.cpp +++ b/llvm/lib/Target/Lanai/LanaiISelLowering.cpp @@ -151,9 +151,8 @@ LanaiTargetLowering::LanaiTargetLowering(const TargetMachine &TM, setMinimumJumpTableEntries(100); // Use fast calling convention for library functions. - for (int I = 0; I < RTLIB::UNKNOWN_LIBCALL; ++I) { - setLibcallCallingConv(static_cast(I), CallingConv::Fast); - } + for (RTLIB::Libcall LC : RTLIB::libcalls()) + setLibcallCallingConv(LC, CallingConv::Fast); MaxStoresPerMemset = 16; // For @llvm.memset -> sequence of stores MaxStoresPerMemsetOptSize = 8;