blob: c476e9503e9f6411388b330188aeb8ec82fa7e40 [file] [edit]
// RUN: llvm-tblgen -gen-runtime-libcalls -I %p/../../include %s | FileCheck %s
include "llvm/IR/RuntimeLibcallsImpl.td"
def SHL_I32 : RuntimeLibcall;
def SRL_I64 : RuntimeLibcall;
def SQRT_F128 : RuntimeLibcall<LDbl, [LDbl]>;
def SQRT_F80 : RuntimeLibcall;
def BZERO : RuntimeLibcall<Void, [Ptr, SizeT]>;
def MEMCPY : RuntimeLibcall<Ptr, [Ptr, Ptr, SizeT]>;
def MEMSET : RuntimeLibcall<Ptr, [Ptr, Int, SizeT]>;
def CALLOC : RuntimeLibcall<Ptr, [SizeT, SizeT]>;
def __ashlsi3 : RuntimeLibcallImpl<SHL_I32>;
def __lshrdi3 : RuntimeLibcallImpl<SRL_I64>;
def sqrtl_f128 : RuntimeLibcallImpl<SQRT_F128, "sqrtl">;
def sqrtl_f80 : RuntimeLibcallImpl<SQRT_F80, "sqrtl">;
// Ignore non-default in initDefaultLibCallNames.
def bzero : RuntimeLibcallImpl<BZERO>;
def ___memset : RuntimeLibcallImpl<MEMSET, "___memset">;
def ___memcpy : RuntimeLibcallImpl<MEMCPY, "___memcpy">;
def calloc : RuntimeLibcallImpl<CALLOC, "calloc">;
def CompilerRTLibcalls : LibcallImpls<(add __ashlsi3, __lshrdi3)>;
def LibmLibcalls : LibcallImpls<(add sqrtl_f80)>;
def IsSimpleArch : LibcallPredicate<[{TT.getArch() == Triple::simple}]>;
def IsFooArch : LibcallPredicate<[{TT.getArch() == Triple::foo}]>;
def IsZOS : LibcallPredicate<[{TT.getOS() == Triple::zos}]>;
def IsPPCLeaf : LibcallPredicate<[{TT.getArch().isPPC()}]>;
def IsPPC64Leaf : LibcallPredicate<[{TT.getArch().isPPC64()}]>;
def IsFoo : LibcallPredicate<[{isFOO()}]>;
def IsBarOS : LibcallPredicate<[{TT.getOS() == Triple::bar}]>;
def IsBuzzArch : LibcallPredicate<[{TT.getArch() == Triple::buzz}]>;
def IsBlahArch : LibcallPredicate<[{TT.getArch() == Triple::blah}]>;
def HasCompilerRT : LibcallPredicate<[{TT.hasCompilerRT()}]>;
def isSimpleArch : RuntimeLibcallAvailability<(all_of IsSimpleArch)>;
def isFooArch : RuntimeLibcallAvailability<(all_of IsFooArch)>;
def isZOS : RuntimeLibcallAvailability<(all_of IsZOS)>;
def isPPC : RuntimeLibcallAvailability<(all_of IsPPCLeaf)>;
def isPPC64 : RuntimeLibcallAvailability<(all_of IsPPC64Leaf)>;
def isFoo : RuntimeLibcallAvailability<(all_of IsFoo)>;
def isBarOS : RuntimeLibcallAvailability<(all_of IsBarOS)>;
def isBuzzArch : RuntimeLibcallAvailability<(all_of IsBuzzArch)>;
def isBlahArch : RuntimeLibcallAvailability<(all_of IsBlahArch)>;
def hasCompilerRT : RuntimeLibcallAvailability<(all_of HasCompilerRT)>;
def SimpleLibc : LibcallLibrary<"libc",
(add LibmLibcalls, calloc, CompilerRTLibcalls), isSimpleArch>;
def SimpleLibrary : SystemRuntimeLibrary<isSimpleArch, (add SimpleLibc)>;
def LibraryWithConditionalFunc : LibcallImpls<(add sqrtl_f128, bzero, AvailableIf<___memset, isBarOS>)>;
def FooLibc : LibcallLibrary<"libc", (add LibraryWithConditionalFunc), isFooArch>;
def FooLibrary : SystemRuntimeLibrary<isFooArch, (add FooLibc)>;
def BuzzLibc : LibcallLibrary<"libc", (add sqrtl_f80, CompilerRTLibcalls),
isBuzzArch>;
def BuzzLibrary : SystemRuntimeLibrary<isBuzzArch, (add BuzzLibc)>;
def LibraryWithConditionalSet : LibcallImpls<(add sqrtl_f128, bzero,
LibcallImpls<(add CompilerRTLibcalls), hasCompilerRT>)>;
def BlahLibc : LibcallLibrary<"libc",
(add calloc, LibraryWithConditionalSet, AvailableIf<___memset, isBarOS>),
isBlahArch>;
def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add BlahLibc)>;
// All entries should be emitted in Libcall enum.
// CHECK: #ifdef GET_RUNTIME_LIBCALL_ENUM
// CHECK-NEXT: #undef GET_RUNTIME_LIBCALL_ENUM
// CHECK-EMPTY:
// CHECK-NEXT: namespace llvm {
// CHECK-NEXT: namespace RTLIB {
// CHECK-NEXT: enum Libcall : unsigned short {
// CHECK-NEXT: BZERO = 0,
// CHECK-NEXT: CALLOC = 1,
// CHECK-NEXT: MEMCPY = 2,
// CHECK-NEXT: MEMSET = 3,
// CHECK-NEXT: SHL_I32 = 4,
// CHECK-NEXT: SQRT_F80 = 5,
// CHECK-NEXT: SQRT_F128 = 6,
// CHECK-NEXT: SRL_I64 = 7,
// CHECK-NEXT: UNKNOWN_LIBCALL = 8
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT:enum LibcallImpl : unsigned short {
// CHECK-NEXT: Unsupported = 0,
// CHECK-NEXT: impl____memcpy = 1, // ___memcpy
// CHECK-NEXT: impl____memset = 2, // ___memset
// CHECK-NEXT: impl___ashlsi3 = 3, // __ashlsi3
// CHECK-NEXT: impl___lshrdi3 = 4, // __lshrdi3
// CHECK-NEXT: bzero = 5, // bzero
// CHECK-NEXT: calloc = 6, // calloc
// CHECK-NEXT: sqrtl_f128 = 7, // sqrtl
// CHECK-NEXT: sqrtl_f80 = 8, // sqrtl
// CHECK-NEXT: };
// CHECK-NEXT: constexpr size_t NumLibcallImpls = 9;
// CHECK-EMPTY:
// CHECK-NEXT:enum FuncArgTypeID : char {
// CHECK-NEXT: NoFuncArgType = 0,
// CHECK-NEXT: Bool,
// CHECK-NEXT: Dbl,
// CHECK-NEXT: Ellip,
// CHECK-NEXT: Floating,
// CHECK-NEXT: Flt,
// CHECK-NEXT: Int,
// CHECK-NEXT: Int16,
// CHECK-NEXT: Int32,
// CHECK-NEXT: Int64,
// CHECK-NEXT: IntPlus,
// CHECK-NEXT: IntX,
// CHECK-NEXT: LDbl,
// CHECK-NEXT: LLong,
// CHECK-NEXT: Long,
// CHECK-NEXT: NXV2F64,
// CHECK-NEXT: NXV2I1,
// CHECK-NEXT: NXV2I32,
// CHECK-NEXT: NXV4F32,
// CHECK-NEXT: NXV4I1,
// CHECK-NEXT: NXV4I32,
// CHECK-NEXT: Ptr,
// CHECK-NEXT: SSizeT,
// CHECK-NEXT: Same,
// CHECK-NEXT: SizeT,
// CHECK-NEXT: Struct,
// CHECK-NEXT: UInt,
// CHECK-NEXT: UInt16,
// CHECK-NEXT: UInt32,
// CHECK-NEXT: UInt64,
// CHECK-NEXT: UIntPlus,
// CHECK-NEXT: UIntX,
// CHECK-NEXT: ULLong,
// CHECK-NEXT: ULong,
// CHECK-NEXT: V2F32,
// CHECK-NEXT: V2F64,
// CHECK-NEXT: V2I32,
// CHECK-NEXT: V4F32,
// CHECK-NEXT: V4F64,
// CHECK-NEXT: V4I32,
// CHECK-NEXT: V8F32,
// CHECK-NEXT: V8F64,
// CHECK-NEXT: V8I32,
// CHECK-NEXT: V16F32,
// CHECK-NEXT: V16I32,
// 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:
// CHECK-NEXT: #endif // GET_RUNTIME_LIBCALL_ENUM
// CHECK: #ifdef GET_INIT_RUNTIME_LIBCALL_NAMES
// CHECK-NEXT: #undef GET_INIT_RUNTIME_LIBCALL_NAMES
// CHECK-EMPTY:
// CHECK-EMPTY:
// CHECK-NEXT: #ifdef __GNUC__
// CHECK-NEXT: #pragma GCC diagnostic push
// CHECK-NEXT: #pragma GCC diagnostic ignored "-Woverlength-strings"
// CHECK-NEXT: #endif
// CHECK-NEXT: constexpr char RTLIB::RuntimeLibcallsInfo::RuntimeLibcallImplNameTableStorage[] =
// CHECK-NEXT: "\0"
// CHECK-NEXT: "___memcpy\0"
// CHECK-NEXT: "___memset\0"
// CHECK-NEXT: "__ashlsi3\0"
// CHECK-NEXT: "__lshrdi3\0"
// CHECK-NEXT: "bzero\0"
// CHECK-NEXT: "calloc\0"
// CHECK-NEXT: "sqrtl\0"
// CHECK-NEXT: ;
// CHECK-NEXT: #ifdef __GNUC__
// CHECK-NEXT: #pragma GCC diagnostic pop
// CHECK-NEXT: #endif
// CHECK-EMPTY:
// CHECK-NEXT: const llvm::StringTable
// CHECK-NEXT: RTLIB::RuntimeLibcallsInfo::RuntimeLibcallImplNameTable = RuntimeLibcallImplNameTableStorage;
// CHECK-EMPTY:
// CHECK-NEXT: const uint16_t RTLIB::RuntimeLibcallsInfo::RuntimeLibcallNameOffsetTable[] = {
// CHECK-NEXT: 0, //
// CHECK-NEXT: 1, // ___memcpy
// CHECK-NEXT: 11, // ___memset
// CHECK-NEXT: 21, // __ashlsi3
// CHECK-NEXT: 31, // __lshrdi3
// CHECK-NEXT: 41, // bzero
// CHECK-NEXT: 47, // calloc
// CHECK-NEXT: 54, // sqrtl
// CHECK-NEXT: 54, // sqrtl
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: const uint8_t RTLIB::RuntimeLibcallsInfo::RuntimeLibcallNameSizeTable[] = {
// CHECK-NEXT: 0,
// CHECK-NEXT: 9,
// CHECK-NEXT: 9,
// CHECK-NEXT: 9,
// CHECK-NEXT: 9,
// CHECK-NEXT: 5,
// CHECK-NEXT: 6,
// CHECK-NEXT: 5,
// CHECK-NEXT: 5,
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: const RTLIB::Libcall llvm::RTLIB::RuntimeLibcallsInfo::ImplToLibcall[RTLIB::NumLibcallImpls] = {
// CHECK-NEXT: RTLIB::UNKNOWN_LIBCALL, // RTLIB::Unsupported
// CHECK-NEXT: RTLIB::MEMCPY, // RTLIB::impl____memcpy
// CHECK-NEXT: RTLIB::MEMSET, // RTLIB::impl____memset
// CHECK-NEXT: RTLIB::SHL_I32, // RTLIB::impl___ashlsi3
// CHECK-NEXT: RTLIB::SRL_I64, // RTLIB::impl___lshrdi3
// CHECK-NEXT: RTLIB::BZERO, // RTLIB::impl_bzero
// CHECK-NEXT: RTLIB::CALLOC, // RTLIB::impl_calloc
// CHECK-NEXT: RTLIB::SQRT_F128, // RTLIB::impl_sqrtl_f128
// CHECK-NEXT: RTLIB::SQRT_F80, // RTLIB::impl_sqrtl_f80
// CHECK-NEXT: };
// CHECK: #ifdef GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
// CHECK-NEXT: #undef GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
// CHECK-EMPTY:
// CHECK-NEXT: size_t Size = Name.size();
// CHECK-NEXT: if (Size == 0 || Size > 9)
// CHECK-NEXT: return enum_seq(RTLIB::Unsupported, RTLIB::Unsupported);
// CHECK-NEXT: return lookupLibcallImplNameImpl(Name);
// CHECK-EMPTY:
// CHECK-NEXT: #endif // GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
// CHECK: #ifdef DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME
// CHECK-NEXT: #undef DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME
// CHECK-EMPTY:
// CHECK-NEXT: static inline uint64_t hash(StringRef Str) {
// CHECK-NEXT: return static_cast<uint32_t>(xxh3_64bits(Str));
// CHECK-NEXT: }
// CHECK: iota_range<RTLIB::LibcallImpl> RTLIB::RuntimeLibcallsInfo::lookupLibcallImplNameImpl(StringRef Name) {
// CHECK: static constexpr uint16_t HashTableNameToEnum[16] = {
// CHECK: 2,
// CHECK: 0,
// CHECK: 6,
// CHECK: 0,
// CHECK: };
// CHECK: unsigned Idx = (hash(Name) % 8) * 2;
// CHECK: for (int I = 0; I != 2; ++I) {
// CHECK: return libcallImplNameHit(Entry, StrOffset);
// CHECK: return enum_seq(RTLIB::Unsupported, RTLIB::Unsupported);
// CHECK-NEXT: }
// CHECK:#ifdef GET_INIT_RUNTIME_LIBCALL_SIGNATURES
// CHECK-NEXT:#undef GET_INIT_RUNTIME_LIBCALL_SIGNATURES
// CHECK-EMPTY:
// CHECK-EMPTY:
// CHECK-NEXT:const FuncArgTypeID RTLIB::RuntimeLibcallsInfo::SignatureTable[] = {
// CHECK-NEXT: /* 0 */ LDbl, LDbl, NoFuncArgType,
// CHECK-NEXT: /* 3 */ Ptr, Ptr, Int, SizeT, NoFuncArgType,
// CHECK-NEXT: /* 8 */ Ptr, Ptr, Ptr, SizeT, NoFuncArgType,
// CHECK-NEXT: /* 13 */ Void, Ptr, SizeT, NoFuncArgType,
// CHECK-NEXT: /* 17 */ Ptr, SizeT, SizeT, NoFuncArgType,
// CHECK-NEXT:};
// CHECK-EMPTY:
// CHECK-NEXT:const uint16_t RTLIB::RuntimeLibcallsInfo::SignatureOffset[] = {
// CHECK-NEXT: 13, // BZERO
// CHECK-NEXT: 17, // CALLOC
// CHECK-NEXT: 8, // MEMCPY
// CHECK-NEXT: 3, // MEMSET
// CHECK-NEXT: 2, // SHL_I32
// CHECK-NEXT: 2, // SQRT_F80
// CHECK-NEXT: 0, // SQRT_F128
// CHECK-NEXT: 2, // SRL_I64
// CHECK-NEXT:};
// CHECK-EMPTY:
// CHECK-NEXT:#endif // GET_INIT_RUNTIME_LIBCALL_SIGNATURES
// CHECK: RTLIB::Libcall RTLIB::RuntimeLibcallsInfo::getUnmaskedVectorLibcall(RTLIB::Libcall LC) {
// CHECK-NEXT: switch (LC) {
// CHECK-NEXT: default:
// CHECK-NEXT: return RTLIB::UNKNOWN_LIBCALL;
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: RTLIB::Libcall RTLIB::RuntimeLibcallsInfo::getMaskedVectorLibcall(RTLIB::Libcall LC) {
// CHECK-NEXT: switch (LC) {
// CHECK-NEXT: default:
// CHECK-NEXT: return RTLIB::UNKNOWN_LIBCALL;
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setAvailableLibFuncs_libc(const llvm::Triple &TT, ExceptionHandling ExceptionModel, FloatABI::ABIType FloatABI, StringRef ABIName, LongDoubleFormat LongDoubleFormat, CallingConv::ID DefaultCC) {
// CHECK-NEXT: if (TT.getArch() == Triple::blah) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls[] = {
// CHECK-NEXT: RTLIB::impl_bzero, // bzero
// CHECK-NEXT: RTLIB::impl_calloc, // calloc
// CHECK-NEXT: RTLIB::impl_sqrtl_f128, // sqrtl
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.hasCompilerRT()) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls_hasCompilerRT[] = {
// CHECK-NEXT: RTLIB::impl___ashlsi3, // __ashlsi3
// CHECK-NEXT: RTLIB::impl___lshrdi3, // __lshrdi3
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls_hasCompilerRT) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls_isBarOS[] = {
// CHECK-NEXT: RTLIB::impl____memset, // ___memset
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls_isBarOS) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-NEXT: if (TT.getArch() == Triple::buzz) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls[] = {
// CHECK-NEXT: RTLIB::impl___ashlsi3, // __ashlsi3
// CHECK-NEXT: RTLIB::impl_sqrtl_f80, // sqrtl
// CHECK-NEXT: RTLIB::impl___lshrdi3, // __lshrdi3
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-NEXT: if (TT.getArch() == Triple::foo) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls[] = {
// CHECK-NEXT: RTLIB::impl_bzero, // bzero
// CHECK-NEXT: RTLIB::impl_sqrtl_f128, // sqrtl
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls_isBarOS[] = {
// CHECK-NEXT: RTLIB::impl____memset, // ___memset
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls_isBarOS) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-NEXT: if (TT.getArch() == Triple::simple) {
// CHECK-NEXT: static const RTLIB::LibcallImpl LibraryCalls[] = {
// CHECK-NEXT: RTLIB::impl_calloc, // calloc
// CHECK-NEXT: RTLIB::impl___ashlsi3, // __ashlsi3
// CHECK-NEXT: RTLIB::impl_sqrtl_f80, // sqrtl
// CHECK-NEXT: RTLIB::impl___lshrdi3, // __lshrdi3
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: for (const RTLIB::LibcallImpl Impl : LibraryCalls) {
// CHECK-NEXT: setAvailable(Impl);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-NEXT: }
// 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(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(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(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(RTLIB::RuntimeLibrary::libc))
// CHECK-NEXT: setAvailableLibFuncs_libc(TT, ExceptionModel, FloatABI, ABIName, LongDoubleFormat, CallingConv::C);
// CHECK-EMPTY:
// CHECK-NEXT: return;
// CHECK-NEXT: }
// CHECK-NEXT: LLVM_DEBUG(dbgs() << "no system runtime library applied to target \'" << TT.str() << "\'\n");
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK: #endif