blob: e5cad3206a430f8ed9870763dc4c55dff67e8a42 [file] [edit]
// RUN: llvm-tblgen -gen-runtime-libcalls -I %p/../../include %s | FileCheck %s
// Check that each LibcallLibrary emits a standalone implementation function
// (suffixed by the library name) that makes the library's members available,
// with per-member triple predicates nested inside.
include "llvm/IR/RuntimeLibcallsImpl.td"
def MEMCPY : RuntimeLibcall;
def MEMSET : RuntimeLibcall;
def SQRT_F64 : RuntimeLibcall;
def SINCOS_F64 : RuntimeLibcall;
def memcpy : RuntimeLibcallImpl<MEMCPY>;
def memset_pattern : RuntimeLibcallImpl<MEMSET, "memset_pattern">;
def sqrt : RuntimeLibcallImpl<SQRT_F64, "sqrt">;
def sincos : RuntimeLibcallImpl<SINCOS_F64, "sincos">;
def IsDarwin : LibcallPredicate<[{TT.isOSDarwin()}]>;
def IsX86 : LibcallPredicate<[{TT.isX86()}]>;
def isDarwin : RuntimeLibcallAvailability<(all_of IsDarwin)>;
def isX86 : RuntimeLibcallAvailability<(all_of IsX86)>;
// libc: memcpy is universal; memset_pattern only on Darwin.
def Libc : LibcallLibrary<"libc", (add memcpy,
LibcallImpls<(add memset_pattern), isDarwin>)>;
// libm: sqrt is universal; sincos only on x86.
def Libm : LibcallLibrary<"libm", (add sqrt,
LibcallImpls<(add sincos), isX86>)>;
// One standalone implementation function is emitted per LibcallLibrary.
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setAvailableLibFuncs_libc(const llvm::Triple &TT, ExceptionHandling ExceptionModel, FloatABI::ABIType FloatABI, StringRef ABIName, LongDoubleFormat LongDoubleFormat) {
// CHECK-NEXT: {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls[] = {
// CHECK-NEXT: RTLIB::impl_memcpy, // memcpy
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.isOSDarwin()) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls_isDarwin[] = {
// CHECK-NEXT: RTLIB::impl_memset_pattern, // memset_pattern
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls_isDarwin) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setAvailableLibFuncs_libm(const llvm::Triple &TT, ExceptionHandling ExceptionModel, FloatABI::ABIType FloatABI, StringRef ABIName, LongDoubleFormat LongDoubleFormat) {
// CHECK-NEXT: {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls[] = {
// CHECK-NEXT: RTLIB::impl_sqrt, // sqrt
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.isX86()) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls_isX86[] = {
// CHECK-NEXT: RTLIB::impl_sincos, // sincos
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls_isX86) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-NEXT: }