| // RUN: llvm-tblgen -gen-runtime-libcalls -I %p/../../include %s | FileCheck %s |
| |
| // Check that a SystemRuntimeLibrary naming LibcallLibrary defs dispatches to |
| // their setAvailableLibFuncs_<name> functions under an isLibraryAvailable guard, |
| // inside the target's triple block, while bare (non-library) members are still |
| // emitted inline via the flat path. |
| |
| include "llvm/IR/RuntimeLibcallsImpl.td" |
| |
| def MEMCPY : RuntimeLibcall; |
| def SQRT_F64 : RuntimeLibcall; |
| def EXTRA : RuntimeLibcall; |
| |
| def memcpy : RuntimeLibcallImpl<MEMCPY>; |
| def sqrt : RuntimeLibcallImpl<SQRT_F64, "sqrt">; |
| def extra : RuntimeLibcallImpl<EXTRA>; |
| |
| def IsX86 : LibcallPredicate<[{TT.isX86()}]>; |
| def isX86 : RuntimeLibcallAvailability<(all_of IsX86)>; |
| |
| def Libc : LibcallLibrary<"libc", (add memcpy)>; |
| def Libm : LibcallLibrary<"libm", (add sqrt)>; |
| |
| // Pulls two named libraries plus one bare inline member. |
| def X86System : SystemRuntimeLibrary<isX86, (add Libc, Libm, extra)>; |
| |
| // The named libraries still get their standalone implementation functions. |
| |
| // CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setAvailableLibFuncs_libc( |
| // CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setAvailableLibFuncs_libm( |
| |
| // The driver dispatches to each named library under its presence guard, then |
| // emits the bare member (extra) inline. |
| |
| // 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: static constexpr LibcallImplBitset SystemAvailableImpls({ |
| // CHECK: AvailableLibcallImpls = SystemAvailableImpls; |
| // CHECK-EMPTY: |
| // CHECK-NEXT: if (isLibraryAvailable("libc")) |
| // CHECK-NEXT: setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat); |
| // CHECK-NEXT: if (isLibraryAvailable("libm")) |
| // CHECK-NEXT: setAvailableLibFuncs_libm(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat); |
| // CHECK-EMPTY: |
| // CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls[] = { |
| // CHECK-NEXT: RTLIB::impl_extra, // extra |
| // CHECK-NEXT: }; |
| // CHECK: for (const RTLIB::LibcallImpl Impl : LibraryCalls) { |
| // CHECK-NEXT: setAvailable(Impl); |
| // CHECK-NEXT: } |
| // CHECK: return; |
| // CHECK-NEXT: } |