162d4215bSChandler Carruth //===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
262d4215bSChandler Carruth //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
662d4215bSChandler Carruth //
762d4215bSChandler Carruth //===----------------------------------------------------------------------===//
862d4215bSChandler Carruth //
962d4215bSChandler Carruth // This file implements the TargetLibraryInfo class.
1062d4215bSChandler Carruth //
1162d4215bSChandler Carruth //===----------------------------------------------------------------------===//
1262d4215bSChandler Carruth
1362d4215bSChandler Carruth #include "llvm/Analysis/TargetLibraryInfo.h"
1462d4215bSChandler Carruth #include "llvm/ADT/Triple.h"
1550ec0b5dSMatthias Braun #include "llvm/IR/Constants.h"
1605da2fe5SReid Kleckner #include "llvm/InitializePasses.h"
176d8a2aa9SMichael Zolotukhin #include "llvm/Support/CommandLine.h"
1862d4215bSChandler Carruth using namespace llvm;
1962d4215bSChandler Carruth
206d8a2aa9SMichael Zolotukhin static cl::opt<TargetLibraryInfoImpl::VectorLibrary> ClVectorLibrary(
216d8a2aa9SMichael Zolotukhin "vector-library", cl::Hidden, cl::desc("Vector functions library"),
226d8a2aa9SMichael Zolotukhin cl::init(TargetLibraryInfoImpl::NoLibrary),
236d8a2aa9SMichael Zolotukhin cl::values(clEnumValN(TargetLibraryInfoImpl::NoLibrary, "none",
246d8a2aa9SMichael Zolotukhin "No vector functions library"),
256d8a2aa9SMichael Zolotukhin clEnumValN(TargetLibraryInfoImpl::Accelerate, "Accelerate",
266d8a2aa9SMichael Zolotukhin "Accelerate framework"),
2793a9a8a8SFlorian Hahn clEnumValN(TargetLibraryInfoImpl::DarwinLibSystemM,
2893a9a8a8SFlorian Hahn "Darwin_libsystem_m", "Darwin libsystem_m"),
2957cdc52cSVenkataramanan Kumar clEnumValN(TargetLibraryInfoImpl::LIBMVEC_X86, "LIBMVEC-X86",
3057cdc52cSVenkataramanan Kumar "GLIBC Vector Math library"),
31fe97754aSNemanja Ivanovic clEnumValN(TargetLibraryInfoImpl::MASSV, "MASSV",
32fe97754aSNemanja Ivanovic "IBM MASS vector library"),
33a6669a1eSMatt Masten clEnumValN(TargetLibraryInfoImpl::SVML, "SVML",
347459398aSJoel Jones "Intel SVML library")));
356d8a2aa9SMichael Zolotukhin
3670434770SBenjamin Kramer StringLiteral const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] =
3770434770SBenjamin Kramer {
38cd3d25a2SJan Wen Voung #define TLI_DEFINE_STRING
39cd3d25a2SJan Wen Voung #include "llvm/Analysis/TargetLibraryInfo.def"
4062d4215bSChandler Carruth };
4162d4215bSChandler Carruth
hasSinCosPiStret(const Triple & T)4262d4215bSChandler Carruth static bool hasSinCosPiStret(const Triple &T) {
4362d4215bSChandler Carruth // Only Darwin variants have _stret versions of combined trig functions.
4462d4215bSChandler Carruth if (!T.isOSDarwin())
4562d4215bSChandler Carruth return false;
4662d4215bSChandler Carruth
4762d4215bSChandler Carruth // The ABI is rather complicated on x86, so don't do anything special there.
4862d4215bSChandler Carruth if (T.getArch() == Triple::x86)
4962d4215bSChandler Carruth return false;
5062d4215bSChandler Carruth
5162d4215bSChandler Carruth if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
5262d4215bSChandler Carruth return false;
5362d4215bSChandler Carruth
5462d4215bSChandler Carruth if (T.isiOS() && T.isOSVersionLT(7, 0))
5562d4215bSChandler Carruth return false;
5662d4215bSChandler Carruth
5762d4215bSChandler Carruth return true;
5862d4215bSChandler Carruth }
5962d4215bSChandler Carruth
hasBcmp(const Triple & TT)608e16d733SClement Courbet static bool hasBcmp(const Triple &TT) {
618e16d733SClement Courbet // Posix removed support from bcmp() in 2001, but the glibc and several
628e16d733SClement Courbet // implementations of the libc still have it.
638e16d733SClement Courbet if (TT.isOSLinux())
648e16d733SClement Courbet return TT.isGNUEnvironment() || TT.isMusl();
658e16d733SClement Courbet // Both NetBSD and OpenBSD are planning to remove the function. Windows does
668e16d733SClement Courbet // not have it.
678d5c2803SAlex Lorenz return TT.isOSFreeBSD() || TT.isOSSolaris();
688e16d733SClement Courbet }
698e16d733SClement Courbet
isCallingConvCCompatible(CallingConv::ID CC,StringRef TT,FunctionType * FuncTy)70c5fda0e6SYuanfang Chen static bool isCallingConvCCompatible(CallingConv::ID CC, StringRef TT,
71c5fda0e6SYuanfang Chen FunctionType *FuncTy) {
72c5fda0e6SYuanfang Chen switch (CC) {
73c5fda0e6SYuanfang Chen default:
74c5fda0e6SYuanfang Chen return false;
75c5fda0e6SYuanfang Chen case llvm::CallingConv::C:
76c5fda0e6SYuanfang Chen return true;
77c5fda0e6SYuanfang Chen case llvm::CallingConv::ARM_APCS:
78c5fda0e6SYuanfang Chen case llvm::CallingConv::ARM_AAPCS:
79c5fda0e6SYuanfang Chen case llvm::CallingConv::ARM_AAPCS_VFP: {
80c5fda0e6SYuanfang Chen
81c5fda0e6SYuanfang Chen // The iOS ABI diverges from the standard in some cases, so for now don't
82c5fda0e6SYuanfang Chen // try to simplify those calls.
83c5fda0e6SYuanfang Chen if (Triple(TT).isiOS())
84c5fda0e6SYuanfang Chen return false;
85c5fda0e6SYuanfang Chen
86c5fda0e6SYuanfang Chen if (!FuncTy->getReturnType()->isPointerTy() &&
87c5fda0e6SYuanfang Chen !FuncTy->getReturnType()->isIntegerTy() &&
88c5fda0e6SYuanfang Chen !FuncTy->getReturnType()->isVoidTy())
89c5fda0e6SYuanfang Chen return false;
90c5fda0e6SYuanfang Chen
91c5fda0e6SYuanfang Chen for (auto *Param : FuncTy->params()) {
92c5fda0e6SYuanfang Chen if (!Param->isPointerTy() && !Param->isIntegerTy())
93c5fda0e6SYuanfang Chen return false;
94c5fda0e6SYuanfang Chen }
95c5fda0e6SYuanfang Chen return true;
96c5fda0e6SYuanfang Chen }
97c5fda0e6SYuanfang Chen }
98c5fda0e6SYuanfang Chen return false;
99c5fda0e6SYuanfang Chen }
100c5fda0e6SYuanfang Chen
isCallingConvCCompatible(CallBase * CI)101c5fda0e6SYuanfang Chen bool TargetLibraryInfoImpl::isCallingConvCCompatible(CallBase *CI) {
102c5fda0e6SYuanfang Chen return ::isCallingConvCCompatible(CI->getCallingConv(),
103c5fda0e6SYuanfang Chen CI->getModule()->getTargetTriple(),
104c5fda0e6SYuanfang Chen CI->getFunctionType());
105c5fda0e6SYuanfang Chen }
106c5fda0e6SYuanfang Chen
isCallingConvCCompatible(Function * F)107c5fda0e6SYuanfang Chen bool TargetLibraryInfoImpl::isCallingConvCCompatible(Function *F) {
108c5fda0e6SYuanfang Chen return ::isCallingConvCCompatible(F->getCallingConv(),
109c5fda0e6SYuanfang Chen F->getParent()->getTargetTriple(),
110c5fda0e6SYuanfang Chen F->getFunctionType());
111c5fda0e6SYuanfang Chen }
112c5fda0e6SYuanfang Chen
113600d24b4SSanjay Patel /// Initialize the set of available library functions based on the specified
114600d24b4SSanjay Patel /// target triple. This should be carefully written so that a missing target
115600d24b4SSanjay Patel /// triple gets a sane set of defaults.
initialize(TargetLibraryInfoImpl & TLI,const Triple & T,ArrayRef<StringLiteral> StandardNames)116c0291865SChandler Carruth static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
11770434770SBenjamin Kramer ArrayRef<StringLiteral> StandardNames) {
11862d4215bSChandler Carruth // Verify that the StandardNames array is in alphabetical order.
1191647ff6eSGeorgii Rymar assert(
1201647ff6eSGeorgii Rymar llvm::is_sorted(StandardNames,
1211647ff6eSGeorgii Rymar [](StringRef LHS, StringRef RHS) { return LHS < RHS; }) &&
122e30b8ca1SCraig Topper "TargetLibraryInfoImpl function names must be sorted");
12362d4215bSChandler Carruth
124ca22d427SDavid Bolvansky // Set IO unlocked variants as unavailable
125ca22d427SDavid Bolvansky // Set them as available per system below
126623cf3dfSRyan Prichard TLI.setUnavailable(LibFunc_getc_unlocked);
127ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_getchar_unlocked);
128ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_putc_unlocked);
129ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_putchar_unlocked);
130ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_fputc_unlocked);
131ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_fgetc_unlocked);
132ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_fread_unlocked);
133ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_fwrite_unlocked);
134ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_fputs_unlocked);
135ca22d427SDavid Bolvansky TLI.setUnavailable(LibFunc_fgets_unlocked);
136ca22d427SDavid Bolvansky
1376af8e6c3SMarcin Koscielnicki bool ShouldExtI32Param = false, ShouldExtI32Return = false,
1386af8e6c3SMarcin Koscielnicki ShouldSignExtI32Param = false;
1396af8e6c3SMarcin Koscielnicki // PowerPC64, Sparc64, SystemZ need signext/zeroext on i32 parameters and
1406af8e6c3SMarcin Koscielnicki // returns corresponding to C-level ints and unsigned ints.
1413e92df3eSFangrui Song if (T.isPPC64() || T.getArch() == Triple::sparcv9 ||
1423e92df3eSFangrui Song T.getArch() == Triple::systemz) {
1436af8e6c3SMarcin Koscielnicki ShouldExtI32Param = true;
1446af8e6c3SMarcin Koscielnicki ShouldExtI32Return = true;
1456af8e6c3SMarcin Koscielnicki }
1466af8e6c3SMarcin Koscielnicki // Mips, on the other hand, needs signext on i32 parameters corresponding
1476af8e6c3SMarcin Koscielnicki // to both signed and unsigned ints.
14885e200e9SAlexander Richardson if (T.isMIPS()) {
1496af8e6c3SMarcin Koscielnicki ShouldSignExtI32Param = true;
1506af8e6c3SMarcin Koscielnicki }
1516af8e6c3SMarcin Koscielnicki TLI.setShouldExtI32Param(ShouldExtI32Param);
1526af8e6c3SMarcin Koscielnicki TLI.setShouldExtI32Return(ShouldExtI32Return);
1536af8e6c3SMarcin Koscielnicki TLI.setShouldSignExtI32Param(ShouldSignExtI32Param);
1546af8e6c3SMarcin Koscielnicki
1559c54ee43SBjorn Pettersson // Let's assume by default that the size of int is 32 bits, unless the target
1569c54ee43SBjorn Pettersson // is a 16-bit architecture because then it most likely is 16 bits. If that
1579c54ee43SBjorn Pettersson // isn't true for a target those defaults should be overridden below.
1589c54ee43SBjorn Pettersson TLI.setIntSize(T.isArch16Bit() ? 16 : 32);
1599c54ee43SBjorn Pettersson
1601376ae90SPaul Robinson // There is really no runtime library on AMDGPU, apart from
1611376ae90SPaul Robinson // __kmpc_alloc/free_shared.
162314deab9SYaxun (Sam) Liu if (T.isAMDGPU()) {
1631376ae90SPaul Robinson TLI.disableAllFunctions();
1642662351eSJoseph Huber TLI.setAvailable(llvm::LibFunc___kmpc_alloc_shared);
1652662351eSJoseph Huber TLI.setAvailable(llvm::LibFunc___kmpc_free_shared);
16662d4215bSChandler Carruth return;
16762d4215bSChandler Carruth }
16862d4215bSChandler Carruth
169ad88a37cSFlorian Hahn // memset_pattern{4,8,16} is only available on iOS 3.0 and Mac OS X 10.5 and
170ad88a37cSFlorian Hahn // later. All versions of watchOS support it.
17162d4215bSChandler Carruth if (T.isMacOSX()) {
172ca22d427SDavid Bolvansky // available IO unlocked variants on Mac OS X
173ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_getc_unlocked);
174ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_getchar_unlocked);
175ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_putc_unlocked);
176ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_putchar_unlocked);
177ca22d427SDavid Bolvansky
178ad88a37cSFlorian Hahn if (T.isMacOSXVersionLT(10, 5)) {
179ad88a37cSFlorian Hahn TLI.setUnavailable(LibFunc_memset_pattern4);
180ad88a37cSFlorian Hahn TLI.setUnavailable(LibFunc_memset_pattern8);
181d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_memset_pattern16);
182ad88a37cSFlorian Hahn }
18362d4215bSChandler Carruth } else if (T.isiOS()) {
184ad88a37cSFlorian Hahn if (T.isOSVersionLT(3, 0)) {
185ad88a37cSFlorian Hahn TLI.setUnavailable(LibFunc_memset_pattern4);
186ad88a37cSFlorian Hahn TLI.setUnavailable(LibFunc_memset_pattern8);
187d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_memset_pattern16);
188ad88a37cSFlorian Hahn }
1898b40366bSTim Northover } else if (!T.isWatchOS()) {
190ad88a37cSFlorian Hahn TLI.setUnavailable(LibFunc_memset_pattern4);
191ad88a37cSFlorian Hahn TLI.setUnavailable(LibFunc_memset_pattern8);
192d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_memset_pattern16);
19362d4215bSChandler Carruth }
19462d4215bSChandler Carruth
19562d4215bSChandler Carruth if (!hasSinCosPiStret(T)) {
196d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_sinpi);
197d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_sinpif);
198d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_cospi);
199d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_cospif);
200d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_sincospi_stret);
201d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_sincospif_stret);
20262d4215bSChandler Carruth }
20362d4215bSChandler Carruth
2048e16d733SClement Courbet if (!hasBcmp(T))
2058e16d733SClement Courbet TLI.setUnavailable(LibFunc_bcmp);
2068e16d733SClement Courbet
20762d4215bSChandler Carruth if (T.isMacOSX() && T.getArch() == Triple::x86 &&
20862d4215bSChandler Carruth !T.isMacOSXVersionLT(10, 7)) {
20962d4215bSChandler Carruth // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
21062d4215bSChandler Carruth // we don't care about) have two versions; on recent OSX, the one we want
21162d4215bSChandler Carruth // has a $UNIX2003 suffix. The two implementations are identical except
21262d4215bSChandler Carruth // for the return value in some edge cases. However, we don't want to
21362d4215bSChandler Carruth // generate code that depends on the old symbols.
214d21529faSDavid L. Jones TLI.setAvailableWithName(LibFunc_fwrite, "fwrite$UNIX2003");
215d21529faSDavid L. Jones TLI.setAvailableWithName(LibFunc_fputs, "fputs$UNIX2003");
21662d4215bSChandler Carruth }
21762d4215bSChandler Carruth
218b4f9991fSAlon Zakai // iprintf and friends are only available on XCore, TCE, and Emscripten.
219b4f9991fSAlon Zakai if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce &&
220b4f9991fSAlon Zakai T.getOS() != Triple::Emscripten) {
221d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_iprintf);
222d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_siprintf);
223d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_fiprintf);
22462d4215bSChandler Carruth }
22562d4215bSChandler Carruth
226b4f9991fSAlon Zakai // __small_printf and friends are only available on Emscripten.
227b4f9991fSAlon Zakai if (T.getOS() != Triple::Emscripten) {
228b4f9991fSAlon Zakai TLI.setUnavailable(LibFunc_small_printf);
229b4f9991fSAlon Zakai TLI.setUnavailable(LibFunc_small_sprintf);
230b4f9991fSAlon Zakai TLI.setUnavailable(LibFunc_small_fprintf);
231b4f9991fSAlon Zakai }
232b4f9991fSAlon Zakai
23362d4215bSChandler Carruth if (T.isOSWindows() && !T.isOSCygMing()) {
2344b86c474SEvandro Menezes // XXX: The earliest documentation available at the moment is for VS2015/VC19:
2354b86c474SEvandro Menezes // https://docs.microsoft.com/en-us/cpp/c-runtime-library/floating-point-support?view=vs-2015
2364b86c474SEvandro Menezes // XXX: In order to use an MSVCRT older than VC19,
2374b86c474SEvandro Menezes // the specific library version must be explicit in the target triple,
2384b86c474SEvandro Menezes // e.g., x86_64-pc-windows-msvc18.
2394b86c474SEvandro Menezes bool hasPartialC99 = true;
2404b86c474SEvandro Menezes if (T.isKnownWindowsMSVCEnvironment()) {
241219672b8SJames Farrell VersionTuple Version = T.getEnvironmentVersion();
242219672b8SJames Farrell hasPartialC99 = (Version.getMajor() == 0 || Version.getMajor() >= 19);
2434b86c474SEvandro Menezes }
2444b86c474SEvandro Menezes
245f4a36959SEvandro Menezes // Latest targets support C89 math functions, in part.
246f4a36959SEvandro Menezes bool isARM = (T.getArch() == Triple::aarch64 ||
247f4a36959SEvandro Menezes T.getArch() == Triple::arm);
248f4a36959SEvandro Menezes bool hasPartialFloat = (isARM ||
2494b86c474SEvandro Menezes T.getArch() == Triple::x86_64);
2504b86c474SEvandro Menezes
251f4a36959SEvandro Menezes // Win32 does not support float C89 math functions, in general.
2524b86c474SEvandro Menezes if (!hasPartialFloat) {
253e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_acosf);
254e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_asinf);
255e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_atan2f);
256f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_atanf);
257e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_ceilf);
258e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_cosf);
259e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_coshf);
260e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_expf);
261e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_floorf);
262e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_fmodf);
263e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_log10f);
264f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_logf);
265e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_modff);
266e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_powf);
2672470d298SEhud Katz TLI.setUnavailable(LibFunc_remainderf);
268e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_sinf);
269e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_sinhf);
270e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_sqrtf);
271e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_tanf);
272e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_tanhf);
273e5bb58b1SEvandro Menezes }
274f4a36959SEvandro Menezes if (!isARM)
2754b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_fabsf);
276e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_frexpf);
277e5bb58b1SEvandro Menezes TLI.setUnavailable(LibFunc_ldexpf);
278e5bb58b1SEvandro Menezes
279f4a36959SEvandro Menezes // Win32 does not support long double C89 math functions.
28098f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_acosl);
28198f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_asinl);
28298f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_atan2l);
283f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_atanl);
28498f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_ceill);
28598f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_cosl);
28698f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_coshl);
28798f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_expl);
28898f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_fabsl);
28998f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_floorl);
29098f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_fmodl);
29198f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_frexpl);
29298f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_ldexpl);
2934b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_log10l);
294f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_logl);
29598f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_modfl);
29698f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_powl);
2972470d298SEhud Katz TLI.setUnavailable(LibFunc_remainderl);
29898f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_sinl);
29998f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_sinhl);
30098f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_sqrtl);
30198f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_tanl);
30298f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_tanhl);
30362d4215bSChandler Carruth
304e5bb58b1SEvandro Menezes // Win32 does not fully support C99 math functions.
3054b86c474SEvandro Menezes if (!hasPartialC99) {
30698f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_acosh);
3074b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_acoshf);
308f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_asinh);
3094b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_asinhf);
310f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_atanh);
3114b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_atanhf);
312f4a36959SEvandro Menezes TLI.setAvailableWithName(LibFunc_cabs, "_cabs");
3134b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_cabsf);
314f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_cbrt);
3154b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_cbrtf);
316f4a36959SEvandro Menezes TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
317f4a36959SEvandro Menezes TLI.setAvailableWithName(LibFunc_copysignf, "_copysignf");
318f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_exp2);
3194b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_exp2f);
320f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_expm1);
3214b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_expm1f);
322f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_fmax);
323f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_fmaxf);
324f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_fmin);
325f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_fminf);
326f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_log1p);
3274b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_log1pf);
328f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_log2);
3294b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_log2f);
330f4a36959SEvandro Menezes TLI.setAvailableWithName(LibFunc_logb, "_logb");
331f4a36959SEvandro Menezes if (hasPartialFloat)
332f4a36959SEvandro Menezes TLI.setAvailableWithName(LibFunc_logbf, "_logbf");
333f4a36959SEvandro Menezes else
3344b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_logbf);
335f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_rint);
3364b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_rintf);
337f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_round);
3384b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_roundf);
339f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_trunc);
34098f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_truncf);
341f4a36959SEvandro Menezes }
3424b86c474SEvandro Menezes
3434b86c474SEvandro Menezes // Win32 does not support long double C99 math functions.
3444b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_acoshl);
3454b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_asinhl);
3464b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_atanhl);
3474b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_cabsl);
3484b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_cbrtl);
349f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_copysignl);
3504b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_exp2l);
3514b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_expm1l);
352f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_fmaxl);
353f4a36959SEvandro Menezes TLI.setUnavailable(LibFunc_fminl);
3544b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_log1pl);
3554b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_log2l);
3564b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_logbl);
3574b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_nearbyintl);
3584b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_rintl);
3594b86c474SEvandro Menezes TLI.setUnavailable(LibFunc_roundl);
36098f356cdSEvandro Menezes TLI.setUnavailable(LibFunc_truncl);
36198f356cdSEvandro Menezes
362e5bb58b1SEvandro Menezes // Win32 does not support these functions, but
363e5bb58b1SEvandro Menezes // they are generally available on POSIX-compliant systems.
364d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_access);
365c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_chmod);
366c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_closedir);
367c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_fdopen);
368c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_fileno);
369c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_fseeko);
370c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_fstat);
371c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_ftello);
372c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_gettimeofday);
373c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_memccpy);
374c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_mkdir);
375c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_open);
376c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_opendir);
377c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_pclose);
378c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_popen);
379c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_read);
380c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_rmdir);
381c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_stat);
382c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_strcasecmp);
383c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_strncasecmp);
384c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_unlink);
385c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_utime);
386c5638a71SMartin Storsjö TLI.setUnavailable(LibFunc_write);
387c5638a71SMartin Storsjö }
388c5638a71SMartin Storsjö
389c5638a71SMartin Storsjö if (T.isOSWindows() && !T.isWindowsCygwinEnvironment()) {
390c5638a71SMartin Storsjö // These functions aren't available in either MSVC or MinGW environments.
391d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_bcmp);
392d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_bcopy);
393d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_bzero);
394d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_chown);
395d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ctermid);
396d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ffs);
397d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_flockfile);
398d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_fstatvfs);
399d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ftrylockfile);
400d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_funlockfile);
401d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_getitimer);
402d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_getlogin_r);
403d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_getpwnam);
404d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_htonl);
405d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_htons);
406d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_lchown);
407d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_lstat);
408d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ntohl);
409d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ntohs);
410d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_pread);
411d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_pwrite);
412d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_readlink);
413d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_realpath);
414d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_setitimer);
415d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_statvfs);
416d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_stpcpy);
417d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_stpncpy);
418d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_times);
419d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_uname);
420d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_unsetenv);
421d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_utimes);
42262d4215bSChandler Carruth }
42362d4215bSChandler Carruth
42456e681afSPaul Robinson // Pick just one set of new/delete variants.
42556e681afSPaul Robinson if (T.isOSMSVCRT()) {
42656e681afSPaul Robinson // MSVC, doesn't have the Itanium new/delete.
42756e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPv);
42856e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvRKSt9nothrow_t);
42956e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_t);
43056e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t);
43156e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvj);
43256e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
43356e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvm);
43456e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvmSt11align_val_t);
43556e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPv);
43656e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvRKSt9nothrow_t);
43756e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_t);
43856e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t);
43956e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvj);
44056e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
44156e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvm);
44256e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvmSt11align_val_t);
44356e681afSPaul Robinson TLI.setUnavailable(LibFunc_Znaj);
44456e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
44556e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
44656e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
44756e681afSPaul Robinson TLI.setUnavailable(LibFunc_Znam);
44856e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnamRKSt9nothrow_t);
44956e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnamSt11align_val_t);
45056e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnamSt11align_val_tRKSt9nothrow_t);
45156e681afSPaul Robinson TLI.setUnavailable(LibFunc_Znwj);
45256e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
45356e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
45456e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
45556e681afSPaul Robinson TLI.setUnavailable(LibFunc_Znwm);
45656e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnwmRKSt9nothrow_t);
45756e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnwmSt11align_val_t);
45856e681afSPaul Robinson TLI.setUnavailable(LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t);
45956e681afSPaul Robinson } else {
46056e681afSPaul Robinson // Not MSVC, assume it's Itanium.
46156e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_int);
46256e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_int_nothrow);
46356e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_longlong);
46456e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_longlong_nothrow);
46556e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_ptr32);
46656e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_ptr32_nothrow);
46756e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_ptr32_int);
46856e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_ptr64);
46956e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_ptr64_nothrow);
47056e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_ptr64_longlong);
47156e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_array_int);
47256e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_array_int_nothrow);
47356e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_array_longlong);
47456e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_new_array_longlong_nothrow);
47556e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32);
47656e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_nothrow);
47756e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_int);
47856e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64);
47956e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_nothrow);
48056e681afSPaul Robinson TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_longlong);
48156e681afSPaul Robinson }
48256e681afSPaul Robinson
48362d4215bSChandler Carruth switch (T.getOS()) {
48462d4215bSChandler Carruth case Triple::MacOSX:
48562d4215bSChandler Carruth // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
48662d4215bSChandler Carruth // and their names are __exp10 and __exp10f. exp10l is not available on
48762d4215bSChandler Carruth // OS X or iOS.
488d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10l);
48962d4215bSChandler Carruth if (T.isMacOSXVersionLT(10, 9)) {
490d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10);
491d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10f);
49262d4215bSChandler Carruth } else {
493d21529faSDavid L. Jones TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
494d21529faSDavid L. Jones TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
49562d4215bSChandler Carruth }
49662d4215bSChandler Carruth break;
49762d4215bSChandler Carruth case Triple::IOS:
49889a6eefeSTim Northover case Triple::TvOS:
4998b40366bSTim Northover case Triple::WatchOS:
500d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10l);
501ab1bcda8SJim Lin if (!T.isWatchOS() &&
502ab1bcda8SJim Lin (T.isOSVersionLT(7, 0) || (T.isOSVersionLT(9, 0) && T.isX86()))) {
503d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10);
504d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10f);
50562d4215bSChandler Carruth } else {
506d21529faSDavid L. Jones TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
507d21529faSDavid L. Jones TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
50862d4215bSChandler Carruth }
50962d4215bSChandler Carruth break;
51062d4215bSChandler Carruth case Triple::Linux:
51162d4215bSChandler Carruth // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
51262d4215bSChandler Carruth // buggy prior to glibc version 2.18. Until this version is widely deployed
51362d4215bSChandler Carruth // or we have a reasonable detection strategy, we cannot use exp10 reliably
51462d4215bSChandler Carruth // on Linux.
51562d4215bSChandler Carruth //
51662d4215bSChandler Carruth // Fall through to disable all of them.
517cd1d5aafSJustin Bogner LLVM_FALLTHROUGH;
51862d4215bSChandler Carruth default:
519d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10);
520d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10f);
521d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_exp10l);
52262d4215bSChandler Carruth }
52362d4215bSChandler Carruth
52462d4215bSChandler Carruth // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
52562d4215bSChandler Carruth // Linux (GLIBC):
52662d4215bSChandler Carruth // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
52783b34816SDavide Italiano // http://svn.freebsd.org/base/head/lib/libc/string/ffsl.c
52862d4215bSChandler Carruth // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
52962d4215bSChandler Carruth switch (T.getOS()) {
53062d4215bSChandler Carruth case Triple::Darwin:
53162d4215bSChandler Carruth case Triple::MacOSX:
53262d4215bSChandler Carruth case Triple::IOS:
53389a6eefeSTim Northover case Triple::TvOS:
5348b40366bSTim Northover case Triple::WatchOS:
53562d4215bSChandler Carruth case Triple::FreeBSD:
53662d4215bSChandler Carruth case Triple::Linux:
53762d4215bSChandler Carruth break;
53862d4215bSChandler Carruth default:
539d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ffsl);
54062d4215bSChandler Carruth }
54162d4215bSChandler Carruth
54262d4215bSChandler Carruth // ffsll is available on at least FreeBSD and Linux (GLIBC):
54383b34816SDavide Italiano // http://svn.freebsd.org/base/head/lib/libc/string/ffsll.c
54462d4215bSChandler Carruth // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
54562d4215bSChandler Carruth switch (T.getOS()) {
54689a6eefeSTim Northover case Triple::Darwin:
54789a6eefeSTim Northover case Triple::MacOSX:
54889a6eefeSTim Northover case Triple::IOS:
54989a6eefeSTim Northover case Triple::TvOS:
55089a6eefeSTim Northover case Triple::WatchOS:
55162d4215bSChandler Carruth case Triple::FreeBSD:
55262d4215bSChandler Carruth case Triple::Linux:
55362d4215bSChandler Carruth break;
55462d4215bSChandler Carruth default:
555d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ffsll);
55662d4215bSChandler Carruth }
55762d4215bSChandler Carruth
558bfd3082eSDavide Italiano // The following functions are available on at least FreeBSD:
559bfd3082eSDavide Italiano // http://svn.freebsd.org/base/head/lib/libc/string/fls.c
560bfd3082eSDavide Italiano // http://svn.freebsd.org/base/head/lib/libc/string/flsl.c
561bfd3082eSDavide Italiano // http://svn.freebsd.org/base/head/lib/libc/string/flsll.c
562bfd3082eSDavide Italiano if (!T.isOSFreeBSD()) {
563d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_fls);
564d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_flsl);
565d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_flsll);
566bfd3082eSDavide Italiano }
567bfd3082eSDavide Italiano
568e3a5fc6dSEli Friedman // The following functions are only available on GNU/Linux (using glibc).
569e3a5fc6dSEli Friedman // Linux variants without glibc (eg: bionic, musl) may have some subset.
570e3a5fc6dSEli Friedman if (!T.isOSLinux() || !T.isGNUEnvironment()) {
571d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_dunder_strdup);
572d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_dunder_strtok_r);
573d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_dunder_isoc99_scanf);
574d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_dunder_isoc99_sscanf);
575d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_under_IO_getc);
576d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_under_IO_putc);
577e3a5fc6dSEli Friedman // But, Android and musl have memalign.
578e3a5fc6dSEli Friedman if (!T.isAndroid() && !T.isMusl())
579d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_memalign);
580d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_fopen64);
581d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_fseeko64);
582d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_fstat64);
583d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_fstatvfs64);
584d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_ftello64);
585d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_lstat64);
586d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_open64);
587d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_stat64);
588d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_statvfs64);
589d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_tmpfile64);
59052149f03SSanjay Patel
59152149f03SSanjay Patel // Relaxed math functions are included in math-finite.h on Linux (GLIBC).
5926d15c4deSserge-sans-paille // Note that math-finite.h is no longer supported by top-of-tree GLIBC,
5936d15c4deSserge-sans-paille // so we keep these functions around just so that they're recognized by
5946d15c4deSserge-sans-paille // the ConstantFolder.
59552149f03SSanjay Patel TLI.setUnavailable(LibFunc_acos_finite);
59652149f03SSanjay Patel TLI.setUnavailable(LibFunc_acosf_finite);
59752149f03SSanjay Patel TLI.setUnavailable(LibFunc_acosl_finite);
59852149f03SSanjay Patel TLI.setUnavailable(LibFunc_acosh_finite);
59952149f03SSanjay Patel TLI.setUnavailable(LibFunc_acoshf_finite);
60052149f03SSanjay Patel TLI.setUnavailable(LibFunc_acoshl_finite);
60152149f03SSanjay Patel TLI.setUnavailable(LibFunc_asin_finite);
60252149f03SSanjay Patel TLI.setUnavailable(LibFunc_asinf_finite);
60352149f03SSanjay Patel TLI.setUnavailable(LibFunc_asinl_finite);
60452149f03SSanjay Patel TLI.setUnavailable(LibFunc_atan2_finite);
60552149f03SSanjay Patel TLI.setUnavailable(LibFunc_atan2f_finite);
60652149f03SSanjay Patel TLI.setUnavailable(LibFunc_atan2l_finite);
60752149f03SSanjay Patel TLI.setUnavailable(LibFunc_atanh_finite);
60852149f03SSanjay Patel TLI.setUnavailable(LibFunc_atanhf_finite);
60952149f03SSanjay Patel TLI.setUnavailable(LibFunc_atanhl_finite);
61052149f03SSanjay Patel TLI.setUnavailable(LibFunc_cosh_finite);
61152149f03SSanjay Patel TLI.setUnavailable(LibFunc_coshf_finite);
61252149f03SSanjay Patel TLI.setUnavailable(LibFunc_coshl_finite);
61352149f03SSanjay Patel TLI.setUnavailable(LibFunc_exp10_finite);
61452149f03SSanjay Patel TLI.setUnavailable(LibFunc_exp10f_finite);
61552149f03SSanjay Patel TLI.setUnavailable(LibFunc_exp10l_finite);
61652149f03SSanjay Patel TLI.setUnavailable(LibFunc_exp2_finite);
61752149f03SSanjay Patel TLI.setUnavailable(LibFunc_exp2f_finite);
61852149f03SSanjay Patel TLI.setUnavailable(LibFunc_exp2l_finite);
61952149f03SSanjay Patel TLI.setUnavailable(LibFunc_exp_finite);
62052149f03SSanjay Patel TLI.setUnavailable(LibFunc_expf_finite);
62152149f03SSanjay Patel TLI.setUnavailable(LibFunc_expl_finite);
62252149f03SSanjay Patel TLI.setUnavailable(LibFunc_log10_finite);
62352149f03SSanjay Patel TLI.setUnavailable(LibFunc_log10f_finite);
62452149f03SSanjay Patel TLI.setUnavailable(LibFunc_log10l_finite);
62552149f03SSanjay Patel TLI.setUnavailable(LibFunc_log2_finite);
62652149f03SSanjay Patel TLI.setUnavailable(LibFunc_log2f_finite);
62752149f03SSanjay Patel TLI.setUnavailable(LibFunc_log2l_finite);
62852149f03SSanjay Patel TLI.setUnavailable(LibFunc_log_finite);
62952149f03SSanjay Patel TLI.setUnavailable(LibFunc_logf_finite);
63052149f03SSanjay Patel TLI.setUnavailable(LibFunc_logl_finite);
63152149f03SSanjay Patel TLI.setUnavailable(LibFunc_pow_finite);
63252149f03SSanjay Patel TLI.setUnavailable(LibFunc_powf_finite);
63352149f03SSanjay Patel TLI.setUnavailable(LibFunc_powl_finite);
63452149f03SSanjay Patel TLI.setUnavailable(LibFunc_sinh_finite);
63552149f03SSanjay Patel TLI.setUnavailable(LibFunc_sinhf_finite);
63652149f03SSanjay Patel TLI.setUnavailable(LibFunc_sinhl_finite);
6376185ad03SPaul Robinson TLI.setUnavailable(LibFunc_sqrt_finite);
6386185ad03SPaul Robinson TLI.setUnavailable(LibFunc_sqrtf_finite);
6396185ad03SPaul Robinson TLI.setUnavailable(LibFunc_sqrtl_finite);
64062d4215bSChandler Carruth }
6416d8a2aa9SMichael Zolotukhin
642c1078872SMartin Storsjo if ((T.isOSLinux() && T.isGNUEnvironment()) ||
643c1078872SMartin Storsjo (T.isAndroid() && !T.isAndroidVersionLT(28))) {
644ca22d427SDavid Bolvansky // available IO unlocked variants on GNU/Linux and Android P or later
645ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_getc_unlocked);
646ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_getchar_unlocked);
647ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_putc_unlocked);
648ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_putchar_unlocked);
649ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_fputc_unlocked);
650ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_fgetc_unlocked);
651ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_fread_unlocked);
652ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_fwrite_unlocked);
653ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_fputs_unlocked);
654ca22d427SDavid Bolvansky TLI.setAvailable(LibFunc_fgets_unlocked);
655ca22d427SDavid Bolvansky }
656ca22d427SDavid Bolvansky
65758481663SNathan Lanza if (T.isAndroid() && T.isAndroidVersionLT(21)) {
65858481663SNathan Lanza TLI.setUnavailable(LibFunc_stpcpy);
65958481663SNathan Lanza TLI.setUnavailable(LibFunc_stpncpy);
66058481663SNathan Lanza }
66158481663SNathan Lanza
662*10affe74SPaul Robinson if (T.isPS()) {
663*10affe74SPaul Robinson // PS4/PS5 do have memalign.
664aec66f89SPaul Robinson TLI.setAvailable(LibFunc_memalign);
665aec66f89SPaul Robinson
666*10affe74SPaul Robinson // PS4/PS5 do not have new/delete with "unsigned int" size parameter;
667*10affe74SPaul Robinson // they only have the "unsigned long" versions.
668aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvj);
669aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
670aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvj);
671aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
672aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_Znaj);
673aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
674aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
675aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
676aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_Znwj);
677aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
678aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
679aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
680aec66f89SPaul Robinson
681aec66f89SPaul Robinson // None of the *_chk functions.
682aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_memccpy_chk);
683aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_memcpy_chk);
684aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_memmove_chk);
685aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_mempcpy_chk);
686aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_memset_chk);
687aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_snprintf_chk);
688aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_sprintf_chk);
689aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_stpcpy_chk);
690aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_stpncpy_chk);
691aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strcat_chk);
692aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strcpy_chk);
693aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strlcat_chk);
694aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strlcpy_chk);
695aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strlen_chk);
696aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strncat_chk);
697aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strncpy_chk);
698aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_vsnprintf_chk);
699aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_vsprintf_chk);
700aec66f89SPaul Robinson
701aec66f89SPaul Robinson // Various Posix system functions.
702aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_access);
703aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_chmod);
704aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_chown);
705aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_closedir);
706aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ctermid);
707aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execl);
708aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execle);
709aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execlp);
710aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execv);
711aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execvP);
712aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execve);
713aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execvp);
714aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_execvpe);
715aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_fork);
716aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_fstat);
717aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_fstatvfs);
718aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_getenv);
719aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_getitimer);
720aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_getlogin_r);
721aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_getpwnam);
722aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_gettimeofday);
723aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_lchown);
724aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_lstat);
725aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_mkdir);
726aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_open);
727aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_opendir);
728aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_pclose);
729aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_popen);
730aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_pread);
731aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_pwrite);
732aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_read);
733aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_readlink);
734aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_realpath);
735aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_rename);
736aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_rmdir);
737aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_setitimer);
738aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_stat);
739aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_statvfs);
740aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_system);
741aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_times);
742aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_tmpfile);
743aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_unlink);
744aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_uname);
745aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_unsetenv);
746aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_utime);
747aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_utimes);
748aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_valloc);
749aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_write);
750aec66f89SPaul Robinson
751aec66f89SPaul Robinson // Miscellaneous other functions not provided.
752aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_atomic_load);
753aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_atomic_store);
754aec66f89SPaul Robinson TLI.setUnavailable(LibFunc___kmpc_alloc_shared);
755aec66f89SPaul Robinson TLI.setUnavailable(LibFunc___kmpc_free_shared);
756aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_dunder_strndup);
757aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_bcmp);
758aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_bcopy);
759aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_bzero);
760aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_cabs);
761aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_cabsf);
762aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_cabsl);
763aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ffs);
764aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_flockfile);
765aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_fseeko);
766aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ftello);
767aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ftrylockfile);
768aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_funlockfile);
769aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_htonl);
770aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_htons);
771aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_isascii);
772aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_memccpy);
773aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_mempcpy);
774aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_memrchr);
775aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ntohl);
776aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_ntohs);
777aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_reallocf);
778aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_roundeven);
779aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_roundevenf);
780aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_roundevenl);
78194b4598dSPaul Robinson TLI.setUnavailable(LibFunc_stpcpy);
78294b4598dSPaul Robinson TLI.setUnavailable(LibFunc_stpncpy);
783aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strlcat);
784aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strlcpy);
785aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strndup);
786aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_strnlen);
787aec66f89SPaul Robinson TLI.setUnavailable(LibFunc_toascii);
78894b4598dSPaul Robinson }
78994b4598dSPaul Robinson
79051132881SJustin Lebar // As currently implemented in clang, NVPTX code has no standard library to
79151132881SJustin Lebar // speak of. Headers provide a standard-ish library implementation, but many
79251132881SJustin Lebar // of the signatures are wrong -- for example, many libm functions are not
79351132881SJustin Lebar // extern "C".
79451132881SJustin Lebar //
79551132881SJustin Lebar // libdevice, an IR library provided by nvidia, is linked in by the front-end,
79651132881SJustin Lebar // but only used functions are provided to llvm. Moreover, most of the
79751132881SJustin Lebar // functions in libdevice don't map precisely to standard library functions.
79851132881SJustin Lebar //
79951132881SJustin Lebar // FIXME: Having no standard library prevents e.g. many fastmath
80051132881SJustin Lebar // optimizations, so this situation should be fixed.
801ae272d71SDavid Majnemer if (T.isNVPTX()) {
80251132881SJustin Lebar TLI.disableAllFunctions();
803d21529faSDavid L. Jones TLI.setAvailable(LibFunc_nvvm_reflect);
804f40a2c3bSJohannes Doerfert TLI.setAvailable(llvm::LibFunc_malloc);
805f40a2c3bSJohannes Doerfert TLI.setAvailable(llvm::LibFunc_free);
806f40a2c3bSJohannes Doerfert
807f40a2c3bSJohannes Doerfert // TODO: We could enable the following two according to [0] but we haven't
808f40a2c3bSJohannes Doerfert // done an evaluation wrt. the performance implications.
809f40a2c3bSJohannes Doerfert // [0]
810f40a2c3bSJohannes Doerfert // https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#dynamic-global-memory-allocation-and-operations
811f40a2c3bSJohannes Doerfert //
812f40a2c3bSJohannes Doerfert // TLI.setAvailable(llvm::LibFunc_memcpy);
813f40a2c3bSJohannes Doerfert // TLI.setAvailable(llvm::LibFunc_memset);
814f40a2c3bSJohannes Doerfert
8152662351eSJoseph Huber TLI.setAvailable(llvm::LibFunc___kmpc_alloc_shared);
8162662351eSJoseph Huber TLI.setAvailable(llvm::LibFunc___kmpc_free_shared);
817ae272d71SDavid Majnemer } else {
818d21529faSDavid L. Jones TLI.setUnavailable(LibFunc_nvvm_reflect);
819ae272d71SDavid Majnemer }
82051132881SJustin Lebar
82199a0aa07SShimin Cui // These vec_malloc/free routines are only available on AIX.
82299a0aa07SShimin Cui if (!T.isOSAIX()) {
82399a0aa07SShimin Cui TLI.setUnavailable(LibFunc_vec_calloc);
82499a0aa07SShimin Cui TLI.setUnavailable(LibFunc_vec_malloc);
82599a0aa07SShimin Cui TLI.setUnavailable(LibFunc_vec_realloc);
82699a0aa07SShimin Cui TLI.setUnavailable(LibFunc_vec_free);
82799a0aa07SShimin Cui }
82899a0aa07SShimin Cui
829ed03d948SMehdi Amini TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary);
83062d4215bSChandler Carruth }
83162d4215bSChandler Carruth
TargetLibraryInfoImpl()832c0291865SChandler Carruth TargetLibraryInfoImpl::TargetLibraryInfoImpl() {
83362d4215bSChandler Carruth // Default to everything being available.
83462d4215bSChandler Carruth memset(AvailableArray, -1, sizeof(AvailableArray));
83562d4215bSChandler Carruth
83662d4215bSChandler Carruth initialize(*this, Triple(), StandardNames);
83762d4215bSChandler Carruth }
83862d4215bSChandler Carruth
TargetLibraryInfoImpl(const Triple & T)8397459398aSJoel Jones TargetLibraryInfoImpl::TargetLibraryInfoImpl(const Triple &T) {
84062d4215bSChandler Carruth // Default to everything being available.
84162d4215bSChandler Carruth memset(AvailableArray, -1, sizeof(AvailableArray));
84262d4215bSChandler Carruth
84362d4215bSChandler Carruth initialize(*this, T, StandardNames);
84462d4215bSChandler Carruth }
84562d4215bSChandler Carruth
TargetLibraryInfoImpl(const TargetLibraryInfoImpl & TLI)846c0291865SChandler Carruth TargetLibraryInfoImpl::TargetLibraryInfoImpl(const TargetLibraryInfoImpl &TLI)
8477459398aSJoel Jones : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
8485ae2c526SMarcin Koscielnicki ShouldExtI32Return(TLI.ShouldExtI32Return),
8499c54ee43SBjorn Pettersson ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
8509c54ee43SBjorn Pettersson SizeOfInt(TLI.SizeOfInt) {
85162d4215bSChandler Carruth memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
852ed03d948SMehdi Amini VectorDescs = TLI.VectorDescs;
853ed03d948SMehdi Amini ScalarDescs = TLI.ScalarDescs;
8548ca43224SChandler Carruth }
8558ca43224SChandler Carruth
TargetLibraryInfoImpl(TargetLibraryInfoImpl && TLI)856c0291865SChandler Carruth TargetLibraryInfoImpl::TargetLibraryInfoImpl(TargetLibraryInfoImpl &&TLI)
8577459398aSJoel Jones : CustomNames(std::move(TLI.CustomNames)),
8585ae2c526SMarcin Koscielnicki ShouldExtI32Param(TLI.ShouldExtI32Param),
8595ae2c526SMarcin Koscielnicki ShouldExtI32Return(TLI.ShouldExtI32Return),
8609c54ee43SBjorn Pettersson ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
8619c54ee43SBjorn Pettersson SizeOfInt(TLI.SizeOfInt) {
8628ca43224SChandler Carruth std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
8638ca43224SChandler Carruth AvailableArray);
864ed03d948SMehdi Amini VectorDescs = TLI.VectorDescs;
865ed03d948SMehdi Amini ScalarDescs = TLI.ScalarDescs;
8668ca43224SChandler Carruth }
8678ca43224SChandler Carruth
operator =(const TargetLibraryInfoImpl & TLI)868c0291865SChandler Carruth TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(const TargetLibraryInfoImpl &TLI) {
86962d4215bSChandler Carruth CustomNames = TLI.CustomNames;
8705ae2c526SMarcin Koscielnicki ShouldExtI32Param = TLI.ShouldExtI32Param;
8715ae2c526SMarcin Koscielnicki ShouldExtI32Return = TLI.ShouldExtI32Return;
8725ae2c526SMarcin Koscielnicki ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
8739c54ee43SBjorn Pettersson SizeOfInt = TLI.SizeOfInt;
8748ca43224SChandler Carruth memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
8758ca43224SChandler Carruth return *this;
8768ca43224SChandler Carruth }
8778ca43224SChandler Carruth
operator =(TargetLibraryInfoImpl && TLI)878c0291865SChandler Carruth TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(TargetLibraryInfoImpl &&TLI) {
8798ca43224SChandler Carruth CustomNames = std::move(TLI.CustomNames);
8805ae2c526SMarcin Koscielnicki ShouldExtI32Param = TLI.ShouldExtI32Param;
8815ae2c526SMarcin Koscielnicki ShouldExtI32Return = TLI.ShouldExtI32Return;
8825ae2c526SMarcin Koscielnicki ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
8839c54ee43SBjorn Pettersson SizeOfInt = TLI.SizeOfInt;
8848ca43224SChandler Carruth std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
8858ca43224SChandler Carruth AvailableArray);
8868ca43224SChandler Carruth return *this;
88762d4215bSChandler Carruth }
88862d4215bSChandler Carruth
sanitizeFunctionName(StringRef funcName)88921abdf98SMichael Zolotukhin static StringRef sanitizeFunctionName(StringRef funcName) {
89062d4215bSChandler Carruth // Filter out empty names and names containing null bytes, those can't be in
89162d4215bSChandler Carruth // our table.
892d14d7068SKazu Hirata if (funcName.empty() || funcName.contains('\0'))
89321abdf98SMichael Zolotukhin return StringRef();
89462d4215bSChandler Carruth
89562d4215bSChandler Carruth // Check for \01 prefix that is used to mangle __asm declarations and
89662d4215bSChandler Carruth // strip it if present.
8976f0ecca3SPeter Collingbourne return GlobalValue::dropLLVMManglingEscape(funcName);
89821abdf98SMichael Zolotukhin }
89921abdf98SMichael Zolotukhin
getLibFunc(StringRef funcName,LibFunc & F) const900d5e60669SBenjamin Kramer bool TargetLibraryInfoImpl::getLibFunc(StringRef funcName, LibFunc &F) const {
90121abdf98SMichael Zolotukhin funcName = sanitizeFunctionName(funcName);
90221abdf98SMichael Zolotukhin if (funcName.empty())
90321abdf98SMichael Zolotukhin return false;
90421abdf98SMichael Zolotukhin
905d5e60669SBenjamin Kramer const auto *Start = std::begin(StandardNames);
906d5e60669SBenjamin Kramer const auto *End = std::end(StandardNames);
907d5e60669SBenjamin Kramer const auto *I = std::lower_bound(Start, End, funcName);
90862d4215bSChandler Carruth if (I != End && *I == funcName) {
909d21529faSDavid L. Jones F = (LibFunc)(I - Start);
91062d4215bSChandler Carruth return true;
91162d4215bSChandler Carruth }
91262d4215bSChandler Carruth return false;
91362d4215bSChandler Carruth }
91462d4215bSChandler Carruth
isValidProtoForLibFunc(const FunctionType & FTy,LibFunc F,const Module & M) const915d765a82bSAhmed Bougacha bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
916d21529faSDavid L. Jones LibFunc F,
9177f84fa4aSBjorn Pettersson const Module &M) const {
9181f5ea14bSBjorn Pettersson // FIXME: There is really no guarantee that sizeof(size_t) is equal to
9191f5ea14bSBjorn Pettersson // sizeof(int*) for every target. So the assumption used here to derive the
9207f84fa4aSBjorn Pettersson // SizeTBits based on the size of an integer pointer in address space zero
9217f84fa4aSBjorn Pettersson // isn't always valid.
9227f84fa4aSBjorn Pettersson unsigned SizeTBits = M.getDataLayout().getPointerSizeInBits(/*AddrSpace=*/0);
923d765a82bSAhmed Bougacha unsigned NumParams = FTy.getNumParams();
924d765a82bSAhmed Bougacha
925d765a82bSAhmed Bougacha switch (F) {
926c3bed1e8SCalixte Denizet case LibFunc_execl:
927c3bed1e8SCalixte Denizet case LibFunc_execlp:
9288f07efc7SCalixte Denizet case LibFunc_execle:
929c3bed1e8SCalixte Denizet return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
930c3bed1e8SCalixte Denizet FTy.getParamType(1)->isPointerTy() &&
931c3bed1e8SCalixte Denizet FTy.getReturnType()->isIntegerTy(32));
932c3bed1e8SCalixte Denizet case LibFunc_execv:
933c3bed1e8SCalixte Denizet case LibFunc_execvp:
934c3bed1e8SCalixte Denizet return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
935c3bed1e8SCalixte Denizet FTy.getParamType(1)->isPointerTy() &&
936c3bed1e8SCalixte Denizet FTy.getReturnType()->isIntegerTy(32));
937c3bed1e8SCalixte Denizet case LibFunc_execvP:
938c3bed1e8SCalixte Denizet case LibFunc_execvpe:
939c3bed1e8SCalixte Denizet case LibFunc_execve:
940c3bed1e8SCalixte Denizet return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
941c3bed1e8SCalixte Denizet FTy.getParamType(1)->isPointerTy() &&
942c3bed1e8SCalixte Denizet FTy.getParamType(2)->isPointerTy() &&
943c3bed1e8SCalixte Denizet FTy.getReturnType()->isIntegerTy(32));
944f8c9ceb1SGeorge Burgess IV case LibFunc_strlen_chk:
945f8c9ceb1SGeorge Burgess IV --NumParams;
9467f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
947f8c9ceb1SGeorge Burgess IV return false;
948f8c9ceb1SGeorge Burgess IV LLVM_FALLTHROUGH;
949d21529faSDavid L. Jones case LibFunc_strlen:
950c240169fSSanjay Patel return NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
9517f84fa4aSBjorn Pettersson FTy.getReturnType()->isIntegerTy(SizeTBits);
952d765a82bSAhmed Bougacha
953d21529faSDavid L. Jones case LibFunc_strchr:
954d21529faSDavid L. Jones case LibFunc_strrchr:
955d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
956d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getReturnType() &&
957d765a82bSAhmed Bougacha FTy.getParamType(1)->isIntegerTy());
958d765a82bSAhmed Bougacha
959d21529faSDavid L. Jones case LibFunc_strtol:
960d21529faSDavid L. Jones case LibFunc_strtod:
961d21529faSDavid L. Jones case LibFunc_strtof:
962d21529faSDavid L. Jones case LibFunc_strtoul:
963d21529faSDavid L. Jones case LibFunc_strtoll:
964d21529faSDavid L. Jones case LibFunc_strtold:
965d21529faSDavid L. Jones case LibFunc_strtoull:
966d765a82bSAhmed Bougacha return ((NumParams == 2 || NumParams == 3) &&
967d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
968d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
969abb2a93cSErik Pilkington case LibFunc_strcat_chk:
970abb2a93cSErik Pilkington --NumParams;
9717f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
972abb2a93cSErik Pilkington return false;
973abb2a93cSErik Pilkington LLVM_FALLTHROUGH;
974d21529faSDavid L. Jones case LibFunc_strcat:
975d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
976d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getReturnType() &&
977d765a82bSAhmed Bougacha FTy.getParamType(1) == FTy.getReturnType());
978d765a82bSAhmed Bougacha
979abb2a93cSErik Pilkington case LibFunc_strncat_chk:
980abb2a93cSErik Pilkington --NumParams;
9817f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
982abb2a93cSErik Pilkington return false;
983abb2a93cSErik Pilkington LLVM_FALLTHROUGH;
984d21529faSDavid L. Jones case LibFunc_strncat:
985d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
986d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getReturnType() &&
987d765a82bSAhmed Bougacha FTy.getParamType(1) == FTy.getReturnType() &&
9887f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits));
989d765a82bSAhmed Bougacha
990d21529faSDavid L. Jones case LibFunc_strcpy_chk:
991d21529faSDavid L. Jones case LibFunc_stpcpy_chk:
992d765a82bSAhmed Bougacha --NumParams;
9937f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
994d765a82bSAhmed Bougacha return false;
995b03fd12cSJustin Bogner LLVM_FALLTHROUGH;
996d21529faSDavid L. Jones case LibFunc_strcpy:
997d21529faSDavid L. Jones case LibFunc_stpcpy:
998d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(0) &&
999d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getParamType(1) &&
1000b26d6758SAlex Richardson FTy.getParamType(0)->isPointerTy());
1001d765a82bSAhmed Bougacha
1002abb2a93cSErik Pilkington case LibFunc_strlcat_chk:
1003abb2a93cSErik Pilkington case LibFunc_strlcpy_chk:
1004abb2a93cSErik Pilkington --NumParams;
10057f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
1006abb2a93cSErik Pilkington return false;
1007abb2a93cSErik Pilkington LLVM_FALLTHROUGH;
1008abb2a93cSErik Pilkington case LibFunc_strlcat:
1009abb2a93cSErik Pilkington case LibFunc_strlcpy:
10107f84fa4aSBjorn Pettersson return NumParams == 3 && FTy.getReturnType()->isIntegerTy(SizeTBits) &&
1011abb2a93cSErik Pilkington FTy.getParamType(0)->isPointerTy() &&
1012abb2a93cSErik Pilkington FTy.getParamType(1)->isPointerTy() &&
10137f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits);
1014abb2a93cSErik Pilkington
1015d21529faSDavid L. Jones case LibFunc_strncpy_chk:
1016d21529faSDavid L. Jones case LibFunc_stpncpy_chk:
1017d765a82bSAhmed Bougacha --NumParams;
10187f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
1019d765a82bSAhmed Bougacha return false;
1020b03fd12cSJustin Bogner LLVM_FALLTHROUGH;
1021d21529faSDavid L. Jones case LibFunc_strncpy:
1022d21529faSDavid L. Jones case LibFunc_stpncpy:
1023d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
1024d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getParamType(1) &&
1025b26d6758SAlex Richardson FTy.getParamType(0)->isPointerTy() &&
10267f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits));
1027d765a82bSAhmed Bougacha
1028d21529faSDavid L. Jones case LibFunc_strxfrm:
1029d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
1030d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1031d765a82bSAhmed Bougacha
1032d21529faSDavid L. Jones case LibFunc_strcmp:
1033d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isIntegerTy(32) &&
1034d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1035d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getParamType(1));
1036d765a82bSAhmed Bougacha
1037d21529faSDavid L. Jones case LibFunc_strncmp:
1038d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
1039d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1040d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getParamType(1) &&
10417f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits));
1042d765a82bSAhmed Bougacha
1043d21529faSDavid L. Jones case LibFunc_strspn:
1044d21529faSDavid L. Jones case LibFunc_strcspn:
1045d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1046d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getParamType(1) &&
1047d765a82bSAhmed Bougacha FTy.getReturnType()->isIntegerTy());
1048d765a82bSAhmed Bougacha
1049d21529faSDavid L. Jones case LibFunc_strcoll:
1050d21529faSDavid L. Jones case LibFunc_strcasecmp:
1051d21529faSDavid L. Jones case LibFunc_strncasecmp:
1052d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1053d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1054d765a82bSAhmed Bougacha
1055d21529faSDavid L. Jones case LibFunc_strstr:
1056d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
1057d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1058d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1059d765a82bSAhmed Bougacha
1060d21529faSDavid L. Jones case LibFunc_strpbrk:
1061d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1062d765a82bSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0) &&
1063d765a82bSAhmed Bougacha FTy.getParamType(0) == FTy.getParamType(1));
1064d765a82bSAhmed Bougacha
1065d21529faSDavid L. Jones case LibFunc_strtok:
1066d21529faSDavid L. Jones case LibFunc_strtok_r:
1067d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
1068d21529faSDavid L. Jones case LibFunc_scanf:
1069d21529faSDavid L. Jones case LibFunc_setbuf:
1070d21529faSDavid L. Jones case LibFunc_setvbuf:
1071d765a82bSAhmed Bougacha return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
1072d21529faSDavid L. Jones case LibFunc_strdup:
1073d21529faSDavid L. Jones case LibFunc_strndup:
1074d765a82bSAhmed Bougacha return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
1075d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy());
1076d21529faSDavid L. Jones case LibFunc_sscanf:
1077d21529faSDavid L. Jones case LibFunc_stat:
1078d21529faSDavid L. Jones case LibFunc_statvfs:
1079d21529faSDavid L. Jones case LibFunc_siprintf:
1080b4f9991fSAlon Zakai case LibFunc_small_sprintf:
1081d21529faSDavid L. Jones case LibFunc_sprintf:
1082d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
10830d7c3775SMartin Storsjo FTy.getParamType(1)->isPointerTy() &&
10840d7c3775SMartin Storsjo FTy.getReturnType()->isIntegerTy(32));
1085abb2a93cSErik Pilkington
1086abb2a93cSErik Pilkington case LibFunc_sprintf_chk:
1087abb2a93cSErik Pilkington return NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
1088abb2a93cSErik Pilkington FTy.getParamType(1)->isIntegerTy(32) &&
10897f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits) &&
1090abb2a93cSErik Pilkington FTy.getParamType(3)->isPointerTy() &&
1091abb2a93cSErik Pilkington FTy.getReturnType()->isIntegerTy(32);
1092abb2a93cSErik Pilkington
1093d21529faSDavid L. Jones case LibFunc_snprintf:
10947f555577SSanjay Patel return NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
10957f84fa4aSBjorn Pettersson FTy.getParamType(1)->isIntegerTy(SizeTBits) &&
10960d7c3775SMartin Storsjo FTy.getParamType(2)->isPointerTy() &&
10977f555577SSanjay Patel FTy.getReturnType()->isIntegerTy(32);
1098abb2a93cSErik Pilkington
1099abb2a93cSErik Pilkington case LibFunc_snprintf_chk:
1100abb2a93cSErik Pilkington return NumParams == 5 && FTy.getParamType(0)->isPointerTy() &&
11017f84fa4aSBjorn Pettersson FTy.getParamType(1)->isIntegerTy(SizeTBits) &&
1102abb2a93cSErik Pilkington FTy.getParamType(2)->isIntegerTy(32) &&
11037f84fa4aSBjorn Pettersson FTy.getParamType(3)->isIntegerTy(SizeTBits) &&
1104abb2a93cSErik Pilkington FTy.getParamType(4)->isPointerTy() &&
1105abb2a93cSErik Pilkington FTy.getReturnType()->isIntegerTy(32);
1106abb2a93cSErik Pilkington
1107d21529faSDavid L. Jones case LibFunc_setitimer:
1108d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
1109d765a82bSAhmed Bougacha FTy.getParamType(2)->isPointerTy());
1110d21529faSDavid L. Jones case LibFunc_system:
1111d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
11122662351eSJoseph Huber case LibFunc___kmpc_alloc_shared:
111304b717c4SNikita Popov return NumParams == 1 && FTy.getReturnType()->isPointerTy();
1114d21529faSDavid L. Jones case LibFunc_malloc:
111599a0aa07SShimin Cui case LibFunc_vec_malloc:
111604b717c4SNikita Popov return NumParams == 1 && FTy.getParamType(0)->isIntegerTy(SizeTBits) &&
111704b717c4SNikita Popov FTy.getReturnType()->isPointerTy();
1118d21529faSDavid L. Jones case LibFunc_memcmp:
1119ca637014SSanjay Patel return NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
11206b9be1dbSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
11217f84fa4aSBjorn Pettersson FTy.getParamType(1)->isPointerTy() &&
11227f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits);
1123d765a82bSAhmed Bougacha
1124d21529faSDavid L. Jones case LibFunc_memchr:
1125d21529faSDavid L. Jones case LibFunc_memrchr:
11266b9be1dbSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
11276b9be1dbSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0) &&
1128d765a82bSAhmed Bougacha FTy.getParamType(1)->isIntegerTy(32) &&
11297f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits));
1130d21529faSDavid L. Jones case LibFunc_modf:
1131d21529faSDavid L. Jones case LibFunc_modff:
1132d21529faSDavid L. Jones case LibFunc_modfl:
1133d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
1134d765a82bSAhmed Bougacha
1135d21529faSDavid L. Jones case LibFunc_memcpy_chk:
113686429c4eSDávid Bolvanský case LibFunc_mempcpy_chk:
1137d21529faSDavid L. Jones case LibFunc_memmove_chk:
1138d765a82bSAhmed Bougacha --NumParams;
11397f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
1140d765a82bSAhmed Bougacha return false;
1141b03fd12cSJustin Bogner LLVM_FALLTHROUGH;
1142d21529faSDavid L. Jones case LibFunc_memcpy:
1143d21529faSDavid L. Jones case LibFunc_mempcpy:
1144d21529faSDavid L. Jones case LibFunc_memmove:
1145d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
1146d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1147d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy() &&
11487f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits));
1149d765a82bSAhmed Bougacha
1150d21529faSDavid L. Jones case LibFunc_memset_chk:
1151d765a82bSAhmed Bougacha --NumParams;
11527f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
1153d765a82bSAhmed Bougacha return false;
1154b03fd12cSJustin Bogner LLVM_FALLTHROUGH;
1155d21529faSDavid L. Jones case LibFunc_memset:
1156d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
1157d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1158d765a82bSAhmed Bougacha FTy.getParamType(1)->isIntegerTy() &&
11597f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits));
1160d765a82bSAhmed Bougacha
1161abb2a93cSErik Pilkington case LibFunc_memccpy_chk:
1162abb2a93cSErik Pilkington --NumParams;
11637f84fa4aSBjorn Pettersson if (!FTy.getParamType(NumParams)->isIntegerTy(SizeTBits))
1164abb2a93cSErik Pilkington return false;
1165abb2a93cSErik Pilkington LLVM_FALLTHROUGH;
1166d21529faSDavid L. Jones case LibFunc_memccpy:
1167d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
1168d21529faSDavid L. Jones case LibFunc_memalign:
1169d765a82bSAhmed Bougacha return (FTy.getReturnType()->isPointerTy());
1170d21529faSDavid L. Jones case LibFunc_realloc:
1171d21529faSDavid L. Jones case LibFunc_reallocf:
117299a0aa07SShimin Cui case LibFunc_vec_realloc:
1173b26d6758SAlex Richardson return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
11746b9be1dbSAhmed Bougacha FTy.getParamType(0) == FTy.getReturnType() &&
11757f84fa4aSBjorn Pettersson FTy.getParamType(1)->isIntegerTy(SizeTBits));
1176d21529faSDavid L. Jones case LibFunc_read:
1177d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
1178d21529faSDavid L. Jones case LibFunc_rewind:
1179d21529faSDavid L. Jones case LibFunc_rmdir:
1180d21529faSDavid L. Jones case LibFunc_remove:
1181d21529faSDavid L. Jones case LibFunc_realpath:
1182d765a82bSAhmed Bougacha return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
1183d21529faSDavid L. Jones case LibFunc_rename:
1184d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1185d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1186d21529faSDavid L. Jones case LibFunc_readlink:
1187d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1188d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1189d21529faSDavid L. Jones case LibFunc_write:
1190d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
1191c0955edfSUday Bondhugula case LibFunc_aligned_alloc:
1192c0955edfSUday Bondhugula return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
1193d21529faSDavid L. Jones case LibFunc_bcopy:
1194d21529faSDavid L. Jones case LibFunc_bcmp:
1195d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
1196d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1197d21529faSDavid L. Jones case LibFunc_bzero:
1198d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
1199d21529faSDavid L. Jones case LibFunc_calloc:
120099a0aa07SShimin Cui case LibFunc_vec_calloc:
12017414bbebSSanjay Patel return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
12027414bbebSSanjay Patel FTy.getParamType(0) == FTy.getParamType(1));
12031fe3f1caSAhmed Bougacha
1204d21529faSDavid L. Jones case LibFunc_atof:
1205d21529faSDavid L. Jones case LibFunc_atoi:
1206d21529faSDavid L. Jones case LibFunc_atol:
1207d21529faSDavid L. Jones case LibFunc_atoll:
1208d21529faSDavid L. Jones case LibFunc_ferror:
1209d21529faSDavid L. Jones case LibFunc_getenv:
1210d21529faSDavid L. Jones case LibFunc_getpwnam:
1211d21529faSDavid L. Jones case LibFunc_iprintf:
1212b4f9991fSAlon Zakai case LibFunc_small_printf:
1213d21529faSDavid L. Jones case LibFunc_pclose:
1214d21529faSDavid L. Jones case LibFunc_perror:
1215d21529faSDavid L. Jones case LibFunc_printf:
1216d21529faSDavid L. Jones case LibFunc_puts:
1217d21529faSDavid L. Jones case LibFunc_uname:
1218d21529faSDavid L. Jones case LibFunc_under_IO_getc:
1219d21529faSDavid L. Jones case LibFunc_unlink:
1220d21529faSDavid L. Jones case LibFunc_unsetenv:
1221d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
12221fe3f1caSAhmed Bougacha
1223d21529faSDavid L. Jones case LibFunc_access:
1224d21529faSDavid L. Jones case LibFunc_chmod:
1225d21529faSDavid L. Jones case LibFunc_chown:
1226d21529faSDavid L. Jones case LibFunc_clearerr:
1227d21529faSDavid L. Jones case LibFunc_closedir:
1228d21529faSDavid L. Jones case LibFunc_ctermid:
1229d21529faSDavid L. Jones case LibFunc_fclose:
1230d21529faSDavid L. Jones case LibFunc_feof:
1231d21529faSDavid L. Jones case LibFunc_fflush:
1232d21529faSDavid L. Jones case LibFunc_fgetc:
1233ca22d427SDavid Bolvansky case LibFunc_fgetc_unlocked:
1234d21529faSDavid L. Jones case LibFunc_fileno:
1235d21529faSDavid L. Jones case LibFunc_flockfile:
1236d21529faSDavid L. Jones case LibFunc_free:
1237d21529faSDavid L. Jones case LibFunc_fseek:
1238d21529faSDavid L. Jones case LibFunc_fseeko64:
1239d21529faSDavid L. Jones case LibFunc_fseeko:
1240d21529faSDavid L. Jones case LibFunc_fsetpos:
1241d21529faSDavid L. Jones case LibFunc_ftell:
1242d21529faSDavid L. Jones case LibFunc_ftello64:
1243d21529faSDavid L. Jones case LibFunc_ftello:
1244d21529faSDavid L. Jones case LibFunc_ftrylockfile:
1245d21529faSDavid L. Jones case LibFunc_funlockfile:
1246d21529faSDavid L. Jones case LibFunc_getc:
1247d21529faSDavid L. Jones case LibFunc_getc_unlocked:
1248d21529faSDavid L. Jones case LibFunc_getlogin_r:
1249d21529faSDavid L. Jones case LibFunc_mkdir:
1250d21529faSDavid L. Jones case LibFunc_mktime:
1251d21529faSDavid L. Jones case LibFunc_times:
125299a0aa07SShimin Cui case LibFunc_vec_free:
12531fe3f1caSAhmed Bougacha return (NumParams != 0 && FTy.getParamType(0)->isPointerTy());
1254754eb1c2SJoseph Huber case LibFunc___kmpc_free_shared:
1255754eb1c2SJoseph Huber return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
12567f84fa4aSBjorn Pettersson FTy.getParamType(1)->isIntegerTy(SizeTBits));
12571fe3f1caSAhmed Bougacha
1258d21529faSDavid L. Jones case LibFunc_fopen:
1259d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
1260d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1261d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1262c3bed1e8SCalixte Denizet case LibFunc_fork:
1263c3bed1e8SCalixte Denizet return (NumParams == 0 && FTy.getReturnType()->isIntegerTy(32));
1264d21529faSDavid L. Jones case LibFunc_fdopen:
1265d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
1266d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1267d21529faSDavid L. Jones case LibFunc_fputc:
1268ca22d427SDavid Bolvansky case LibFunc_fputc_unlocked:
1269d21529faSDavid L. Jones case LibFunc_fstat:
1270d21529faSDavid L. Jones case LibFunc_frexp:
1271d21529faSDavid L. Jones case LibFunc_frexpf:
1272d21529faSDavid L. Jones case LibFunc_frexpl:
1273d21529faSDavid L. Jones case LibFunc_fstatvfs:
1274d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1275d21529faSDavid L. Jones case LibFunc_fgets:
1276ca22d427SDavid Bolvansky case LibFunc_fgets_unlocked:
1277d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
1278d765a82bSAhmed Bougacha FTy.getParamType(2)->isPointerTy());
1279d21529faSDavid L. Jones case LibFunc_fread:
1280ca22d427SDavid Bolvansky case LibFunc_fread_unlocked:
1281d765a82bSAhmed Bougacha return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
1282d765a82bSAhmed Bougacha FTy.getParamType(3)->isPointerTy());
1283d21529faSDavid L. Jones case LibFunc_fwrite:
1284ca22d427SDavid Bolvansky case LibFunc_fwrite_unlocked:
1285d765a82bSAhmed Bougacha return (NumParams == 4 && FTy.getReturnType()->isIntegerTy() &&
1286d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1287d765a82bSAhmed Bougacha FTy.getParamType(1)->isIntegerTy() &&
1288d765a82bSAhmed Bougacha FTy.getParamType(2)->isIntegerTy() &&
1289d765a82bSAhmed Bougacha FTy.getParamType(3)->isPointerTy());
1290d21529faSDavid L. Jones case LibFunc_fputs:
1291ca22d427SDavid Bolvansky case LibFunc_fputs_unlocked:
1292d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1293d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1294d21529faSDavid L. Jones case LibFunc_fscanf:
1295d21529faSDavid L. Jones case LibFunc_fiprintf:
1296b4f9991fSAlon Zakai case LibFunc_small_fprintf:
1297d21529faSDavid L. Jones case LibFunc_fprintf:
12986b9be1dbSAhmed Bougacha return (NumParams >= 2 && FTy.getReturnType()->isIntegerTy() &&
12996b9be1dbSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1300d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1301d21529faSDavid L. Jones case LibFunc_fgetpos:
1302d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1303d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1304d21529faSDavid L. Jones case LibFunc_getchar:
1305ca22d427SDavid Bolvansky case LibFunc_getchar_unlocked:
13066b9be1dbSAhmed Bougacha return (NumParams == 0 && FTy.getReturnType()->isIntegerTy());
1307d21529faSDavid L. Jones case LibFunc_gets:
1308b26d6758SAlex Richardson return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
1309d21529faSDavid L. Jones case LibFunc_getitimer:
1310d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1311d21529faSDavid L. Jones case LibFunc_ungetc:
1312d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1313d21529faSDavid L. Jones case LibFunc_utime:
1314d21529faSDavid L. Jones case LibFunc_utimes:
1315d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1316d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1317d21529faSDavid L. Jones case LibFunc_putc:
1318ca22d427SDavid Bolvansky case LibFunc_putc_unlocked:
1319d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1320d21529faSDavid L. Jones case LibFunc_pread:
1321d21529faSDavid L. Jones case LibFunc_pwrite:
1322d765a82bSAhmed Bougacha return (NumParams == 4 && FTy.getParamType(1)->isPointerTy());
1323d21529faSDavid L. Jones case LibFunc_popen:
1324d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
1325d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1326d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1327d21529faSDavid L. Jones case LibFunc_vscanf:
1328d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1329d21529faSDavid L. Jones case LibFunc_vsscanf:
1330d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
1331d765a82bSAhmed Bougacha FTy.getParamType(2)->isPointerTy());
1332d21529faSDavid L. Jones case LibFunc_vfscanf:
1333d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
1334d765a82bSAhmed Bougacha FTy.getParamType(2)->isPointerTy());
1335d21529faSDavid L. Jones case LibFunc_valloc:
1336d765a82bSAhmed Bougacha return (FTy.getReturnType()->isPointerTy());
1337d21529faSDavid L. Jones case LibFunc_vprintf:
1338d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
1339d21529faSDavid L. Jones case LibFunc_vfprintf:
1340d21529faSDavid L. Jones case LibFunc_vsprintf:
1341d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
1342d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1343abb2a93cSErik Pilkington case LibFunc_vsprintf_chk:
1344abb2a93cSErik Pilkington return NumParams == 5 && FTy.getParamType(0)->isPointerTy() &&
1345abb2a93cSErik Pilkington FTy.getParamType(1)->isIntegerTy(32) &&
13467f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits) && FTy.getParamType(3)->isPointerTy();
1347d21529faSDavid L. Jones case LibFunc_vsnprintf:
1348d765a82bSAhmed Bougacha return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
1349d765a82bSAhmed Bougacha FTy.getParamType(2)->isPointerTy());
1350abb2a93cSErik Pilkington case LibFunc_vsnprintf_chk:
1351abb2a93cSErik Pilkington return NumParams == 6 && FTy.getParamType(0)->isPointerTy() &&
1352abb2a93cSErik Pilkington FTy.getParamType(2)->isIntegerTy(32) &&
13537f84fa4aSBjorn Pettersson FTy.getParamType(3)->isIntegerTy(SizeTBits) && FTy.getParamType(4)->isPointerTy();
1354d21529faSDavid L. Jones case LibFunc_open:
1355d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
1356d21529faSDavid L. Jones case LibFunc_opendir:
1357d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isPointerTy() &&
1358d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy());
1359d21529faSDavid L. Jones case LibFunc_tmpfile:
1360d765a82bSAhmed Bougacha return (FTy.getReturnType()->isPointerTy());
1361d21529faSDavid L. Jones case LibFunc_htonl:
1362d21529faSDavid L. Jones case LibFunc_ntohl:
13636b9be1dbSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
13646b9be1dbSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0));
1365d21529faSDavid L. Jones case LibFunc_htons:
1366d21529faSDavid L. Jones case LibFunc_ntohs:
13676b9be1dbSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(16) &&
13686b9be1dbSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0));
1369d21529faSDavid L. Jones case LibFunc_lstat:
1370d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1371d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1372d21529faSDavid L. Jones case LibFunc_lchown:
1373d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
1374d21529faSDavid L. Jones case LibFunc_qsort:
1375d765a82bSAhmed Bougacha return (NumParams == 4 && FTy.getParamType(3)->isPointerTy());
1376d21529faSDavid L. Jones case LibFunc_dunder_strdup:
1377d21529faSDavid L. Jones case LibFunc_dunder_strndup:
1378d765a82bSAhmed Bougacha return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
1379d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy());
1380d21529faSDavid L. Jones case LibFunc_dunder_strtok_r:
1381d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
1382d21529faSDavid L. Jones case LibFunc_under_IO_putc:
1383d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1384d21529faSDavid L. Jones case LibFunc_dunder_isoc99_scanf:
1385d765a82bSAhmed Bougacha return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
1386d21529faSDavid L. Jones case LibFunc_stat64:
1387d21529faSDavid L. Jones case LibFunc_lstat64:
1388d21529faSDavid L. Jones case LibFunc_statvfs64:
138979dcc274SMichael Kuperstein return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1390d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1391d21529faSDavid L. Jones case LibFunc_dunder_isoc99_sscanf:
139279dcc274SMichael Kuperstein return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1393d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1394d21529faSDavid L. Jones case LibFunc_fopen64:
1395d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
1396d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1397d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1398d21529faSDavid L. Jones case LibFunc_tmpfile64:
1399d765a82bSAhmed Bougacha return (FTy.getReturnType()->isPointerTy());
1400d21529faSDavid L. Jones case LibFunc_fstat64:
1401d21529faSDavid L. Jones case LibFunc_fstatvfs64:
1402d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1403d21529faSDavid L. Jones case LibFunc_open64:
1404d765a82bSAhmed Bougacha return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
1405d21529faSDavid L. Jones case LibFunc_gettimeofday:
1406d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1407d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy());
1408d765a82bSAhmed Bougacha
14096b9be1dbSAhmed Bougacha // new(unsigned int);
1410d21529faSDavid L. Jones case LibFunc_Znwj:
14116b9be1dbSAhmed Bougacha // new(unsigned long);
1412d21529faSDavid L. Jones case LibFunc_Znwm:
14136b9be1dbSAhmed Bougacha // new[](unsigned int);
1414d21529faSDavid L. Jones case LibFunc_Znaj:
14156b9be1dbSAhmed Bougacha // new[](unsigned long);
1416d21529faSDavid L. Jones case LibFunc_Znam:
14176b9be1dbSAhmed Bougacha // new(unsigned int);
1418d21529faSDavid L. Jones case LibFunc_msvc_new_int:
14196b9be1dbSAhmed Bougacha // new(unsigned long long);
1420d21529faSDavid L. Jones case LibFunc_msvc_new_longlong:
14216b9be1dbSAhmed Bougacha // new[](unsigned int);
1422d21529faSDavid L. Jones case LibFunc_msvc_new_array_int:
14236b9be1dbSAhmed Bougacha // new[](unsigned long long);
1424d21529faSDavid L. Jones case LibFunc_msvc_new_array_longlong:
14256b9be1dbSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
14266b9be1dbSAhmed Bougacha
14276b9be1dbSAhmed Bougacha // new(unsigned int, nothrow);
1428d21529faSDavid L. Jones case LibFunc_ZnwjRKSt9nothrow_t:
14296b9be1dbSAhmed Bougacha // new(unsigned long, nothrow);
1430d21529faSDavid L. Jones case LibFunc_ZnwmRKSt9nothrow_t:
14316b9be1dbSAhmed Bougacha // new[](unsigned int, nothrow);
1432d21529faSDavid L. Jones case LibFunc_ZnajRKSt9nothrow_t:
14336b9be1dbSAhmed Bougacha // new[](unsigned long, nothrow);
1434d21529faSDavid L. Jones case LibFunc_ZnamRKSt9nothrow_t:
14356b9be1dbSAhmed Bougacha // new(unsigned int, nothrow);
1436d21529faSDavid L. Jones case LibFunc_msvc_new_int_nothrow:
14376b9be1dbSAhmed Bougacha // new(unsigned long long, nothrow);
1438d21529faSDavid L. Jones case LibFunc_msvc_new_longlong_nothrow:
14396b9be1dbSAhmed Bougacha // new[](unsigned int, nothrow);
1440d21529faSDavid L. Jones case LibFunc_msvc_new_array_int_nothrow:
14416b9be1dbSAhmed Bougacha // new[](unsigned long long, nothrow);
1442d21529faSDavid L. Jones case LibFunc_msvc_new_array_longlong_nothrow:
144396bbec79SEric Fiselier // new(unsigned int, align_val_t)
144496bbec79SEric Fiselier case LibFunc_ZnwjSt11align_val_t:
144596bbec79SEric Fiselier // new(unsigned long, align_val_t)
144696bbec79SEric Fiselier case LibFunc_ZnwmSt11align_val_t:
144796bbec79SEric Fiselier // new[](unsigned int, align_val_t)
144896bbec79SEric Fiselier case LibFunc_ZnajSt11align_val_t:
144996bbec79SEric Fiselier // new[](unsigned long, align_val_t)
145096bbec79SEric Fiselier case LibFunc_ZnamSt11align_val_t:
14516b9be1dbSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
14526b9be1dbSAhmed Bougacha
145396bbec79SEric Fiselier // new(unsigned int, align_val_t, nothrow)
145496bbec79SEric Fiselier case LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t:
145596bbec79SEric Fiselier // new(unsigned long, align_val_t, nothrow)
145696bbec79SEric Fiselier case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
145796bbec79SEric Fiselier // new[](unsigned int, align_val_t, nothrow)
145896bbec79SEric Fiselier case LibFunc_ZnajSt11align_val_tRKSt9nothrow_t:
145996bbec79SEric Fiselier // new[](unsigned long, align_val_t, nothrow)
146096bbec79SEric Fiselier case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
146196bbec79SEric Fiselier return (NumParams == 3 && FTy.getReturnType()->isPointerTy());
146296bbec79SEric Fiselier
14636b9be1dbSAhmed Bougacha // void operator delete[](void*);
1464d21529faSDavid L. Jones case LibFunc_ZdaPv:
14656b9be1dbSAhmed Bougacha // void operator delete(void*);
1466d21529faSDavid L. Jones case LibFunc_ZdlPv:
14676b9be1dbSAhmed Bougacha // void operator delete[](void*);
1468d21529faSDavid L. Jones case LibFunc_msvc_delete_array_ptr32:
14696b9be1dbSAhmed Bougacha // void operator delete[](void*);
1470d21529faSDavid L. Jones case LibFunc_msvc_delete_array_ptr64:
14716b9be1dbSAhmed Bougacha // void operator delete(void*);
1472d21529faSDavid L. Jones case LibFunc_msvc_delete_ptr32:
14736b9be1dbSAhmed Bougacha // void operator delete(void*);
1474d21529faSDavid L. Jones case LibFunc_msvc_delete_ptr64:
14756b9be1dbSAhmed Bougacha return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
14766b9be1dbSAhmed Bougacha
14776b9be1dbSAhmed Bougacha // void operator delete[](void*, nothrow);
1478d21529faSDavid L. Jones case LibFunc_ZdaPvRKSt9nothrow_t:
14796b9be1dbSAhmed Bougacha // void operator delete[](void*, unsigned int);
1480d21529faSDavid L. Jones case LibFunc_ZdaPvj:
14816b9be1dbSAhmed Bougacha // void operator delete[](void*, unsigned long);
1482d21529faSDavid L. Jones case LibFunc_ZdaPvm:
14836b9be1dbSAhmed Bougacha // void operator delete(void*, nothrow);
1484d21529faSDavid L. Jones case LibFunc_ZdlPvRKSt9nothrow_t:
14856b9be1dbSAhmed Bougacha // void operator delete(void*, unsigned int);
1486d21529faSDavid L. Jones case LibFunc_ZdlPvj:
14876b9be1dbSAhmed Bougacha // void operator delete(void*, unsigned long);
1488d21529faSDavid L. Jones case LibFunc_ZdlPvm:
148996bbec79SEric Fiselier // void operator delete(void*, align_val_t)
149096bbec79SEric Fiselier case LibFunc_ZdlPvSt11align_val_t:
149196bbec79SEric Fiselier // void operator delete[](void*, align_val_t)
149296bbec79SEric Fiselier case LibFunc_ZdaPvSt11align_val_t:
14936b9be1dbSAhmed Bougacha // void operator delete[](void*, unsigned int);
1494d21529faSDavid L. Jones case LibFunc_msvc_delete_array_ptr32_int:
14956b9be1dbSAhmed Bougacha // void operator delete[](void*, nothrow);
1496d21529faSDavid L. Jones case LibFunc_msvc_delete_array_ptr32_nothrow:
14976b9be1dbSAhmed Bougacha // void operator delete[](void*, unsigned long long);
1498d21529faSDavid L. Jones case LibFunc_msvc_delete_array_ptr64_longlong:
14996b9be1dbSAhmed Bougacha // void operator delete[](void*, nothrow);
1500d21529faSDavid L. Jones case LibFunc_msvc_delete_array_ptr64_nothrow:
15016b9be1dbSAhmed Bougacha // void operator delete(void*, unsigned int);
1502d21529faSDavid L. Jones case LibFunc_msvc_delete_ptr32_int:
15036b9be1dbSAhmed Bougacha // void operator delete(void*, nothrow);
1504d21529faSDavid L. Jones case LibFunc_msvc_delete_ptr32_nothrow:
15056b9be1dbSAhmed Bougacha // void operator delete(void*, unsigned long long);
1506d21529faSDavid L. Jones case LibFunc_msvc_delete_ptr64_longlong:
15076b9be1dbSAhmed Bougacha // void operator delete(void*, nothrow);
1508d21529faSDavid L. Jones case LibFunc_msvc_delete_ptr64_nothrow:
15096b9be1dbSAhmed Bougacha return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
1510d765a82bSAhmed Bougacha
151196bbec79SEric Fiselier // void operator delete(void*, align_val_t, nothrow)
151296bbec79SEric Fiselier case LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t:
151396bbec79SEric Fiselier // void operator delete[](void*, align_val_t, nothrow)
151496bbec79SEric Fiselier case LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t:
15156bc2b042SHiroshi Yamauchi // void operator delete(void*, unsigned int, align_val_t)
15166bc2b042SHiroshi Yamauchi case LibFunc_ZdlPvjSt11align_val_t:
15176bc2b042SHiroshi Yamauchi // void operator delete(void*, unsigned long, align_val_t)
15186bc2b042SHiroshi Yamauchi case LibFunc_ZdlPvmSt11align_val_t:
15196bc2b042SHiroshi Yamauchi // void operator delete[](void*, unsigned int, align_val_t);
15206bc2b042SHiroshi Yamauchi case LibFunc_ZdaPvjSt11align_val_t:
15216bc2b042SHiroshi Yamauchi // void operator delete[](void*, unsigned long, align_val_t);
15226bc2b042SHiroshi Yamauchi case LibFunc_ZdaPvmSt11align_val_t:
152396bbec79SEric Fiselier return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
152496bbec79SEric Fiselier
1525c4250941SGui Andrade // void __atomic_load(size_t, void *, void *, int)
1526c4250941SGui Andrade case LibFunc_atomic_load:
1527c4250941SGui Andrade // void __atomic_store(size_t, void *, void *, int)
1528c4250941SGui Andrade case LibFunc_atomic_store:
1529c4250941SGui Andrade return (NumParams == 4 && FTy.getParamType(0)->isIntegerTy() &&
1530c4250941SGui Andrade FTy.getParamType(1)->isPointerTy() &&
1531c4250941SGui Andrade FTy.getParamType(2)->isPointerTy() &&
1532c4250941SGui Andrade FTy.getParamType(3)->isIntegerTy());
1533c4250941SGui Andrade
1534ad88a37cSFlorian Hahn case LibFunc_memset_pattern4:
1535ad88a37cSFlorian Hahn case LibFunc_memset_pattern8:
1536d21529faSDavid L. Jones case LibFunc_memset_pattern16:
1537d765a82bSAhmed Bougacha return (!FTy.isVarArg() && NumParams == 3 &&
15386b9be1dbSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
15396b9be1dbSAhmed Bougacha FTy.getParamType(1)->isPointerTy() &&
15406b9be1dbSAhmed Bougacha FTy.getParamType(2)->isIntegerTy());
1541d765a82bSAhmed Bougacha
1542d21529faSDavid L. Jones case LibFunc_cxa_guard_abort:
1543d21529faSDavid L. Jones case LibFunc_cxa_guard_acquire:
1544d21529faSDavid L. Jones case LibFunc_cxa_guard_release:
1545d21529faSDavid L. Jones case LibFunc_nvvm_reflect:
15466b9be1dbSAhmed Bougacha return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
1547d765a82bSAhmed Bougacha
1548d21529faSDavid L. Jones case LibFunc_sincospi_stret:
1549d21529faSDavid L. Jones case LibFunc_sincospif_stret:
15506b9be1dbSAhmed Bougacha return (NumParams == 1 && FTy.getParamType(0)->isFloatingPointTy());
15516b9be1dbSAhmed Bougacha
1552d21529faSDavid L. Jones case LibFunc_acos:
15533cd8c16dSAndrew Kaylor case LibFunc_acos_finite:
1554d21529faSDavid L. Jones case LibFunc_acosf:
15553cd8c16dSAndrew Kaylor case LibFunc_acosf_finite:
1556d21529faSDavid L. Jones case LibFunc_acosh:
15573cd8c16dSAndrew Kaylor case LibFunc_acosh_finite:
1558d21529faSDavid L. Jones case LibFunc_acoshf:
15593cd8c16dSAndrew Kaylor case LibFunc_acoshf_finite:
1560d21529faSDavid L. Jones case LibFunc_acoshl:
15613cd8c16dSAndrew Kaylor case LibFunc_acoshl_finite:
1562d21529faSDavid L. Jones case LibFunc_acosl:
15633cd8c16dSAndrew Kaylor case LibFunc_acosl_finite:
1564d21529faSDavid L. Jones case LibFunc_asin:
15653cd8c16dSAndrew Kaylor case LibFunc_asin_finite:
1566d21529faSDavid L. Jones case LibFunc_asinf:
15673cd8c16dSAndrew Kaylor case LibFunc_asinf_finite:
1568d21529faSDavid L. Jones case LibFunc_asinh:
1569d21529faSDavid L. Jones case LibFunc_asinhf:
1570d21529faSDavid L. Jones case LibFunc_asinhl:
1571d21529faSDavid L. Jones case LibFunc_asinl:
15723cd8c16dSAndrew Kaylor case LibFunc_asinl_finite:
1573d21529faSDavid L. Jones case LibFunc_atan:
1574d21529faSDavid L. Jones case LibFunc_atanf:
1575d21529faSDavid L. Jones case LibFunc_atanh:
15763cd8c16dSAndrew Kaylor case LibFunc_atanh_finite:
1577d21529faSDavid L. Jones case LibFunc_atanhf:
15783cd8c16dSAndrew Kaylor case LibFunc_atanhf_finite:
1579d21529faSDavid L. Jones case LibFunc_atanhl:
15803cd8c16dSAndrew Kaylor case LibFunc_atanhl_finite:
1581d21529faSDavid L. Jones case LibFunc_atanl:
1582d21529faSDavid L. Jones case LibFunc_cbrt:
1583d21529faSDavid L. Jones case LibFunc_cbrtf:
1584d21529faSDavid L. Jones case LibFunc_cbrtl:
1585d21529faSDavid L. Jones case LibFunc_ceil:
1586d21529faSDavid L. Jones case LibFunc_ceilf:
1587d21529faSDavid L. Jones case LibFunc_ceill:
1588d21529faSDavid L. Jones case LibFunc_cos:
1589d21529faSDavid L. Jones case LibFunc_cosf:
1590d21529faSDavid L. Jones case LibFunc_cosh:
15913cd8c16dSAndrew Kaylor case LibFunc_cosh_finite:
1592d21529faSDavid L. Jones case LibFunc_coshf:
15933cd8c16dSAndrew Kaylor case LibFunc_coshf_finite:
1594d21529faSDavid L. Jones case LibFunc_coshl:
15953cd8c16dSAndrew Kaylor case LibFunc_coshl_finite:
1596d21529faSDavid L. Jones case LibFunc_cosl:
1597d21529faSDavid L. Jones case LibFunc_exp10:
15983cd8c16dSAndrew Kaylor case LibFunc_exp10_finite:
1599d21529faSDavid L. Jones case LibFunc_exp10f:
16003cd8c16dSAndrew Kaylor case LibFunc_exp10f_finite:
1601d21529faSDavid L. Jones case LibFunc_exp10l:
16023cd8c16dSAndrew Kaylor case LibFunc_exp10l_finite:
1603d21529faSDavid L. Jones case LibFunc_exp2:
16043cd8c16dSAndrew Kaylor case LibFunc_exp2_finite:
1605d21529faSDavid L. Jones case LibFunc_exp2f:
16063cd8c16dSAndrew Kaylor case LibFunc_exp2f_finite:
1607d21529faSDavid L. Jones case LibFunc_exp2l:
16083cd8c16dSAndrew Kaylor case LibFunc_exp2l_finite:
1609d21529faSDavid L. Jones case LibFunc_exp:
16103cd8c16dSAndrew Kaylor case LibFunc_exp_finite:
1611d21529faSDavid L. Jones case LibFunc_expf:
16123cd8c16dSAndrew Kaylor case LibFunc_expf_finite:
1613d21529faSDavid L. Jones case LibFunc_expl:
16143cd8c16dSAndrew Kaylor case LibFunc_expl_finite:
1615d21529faSDavid L. Jones case LibFunc_expm1:
1616d21529faSDavid L. Jones case LibFunc_expm1f:
1617d21529faSDavid L. Jones case LibFunc_expm1l:
1618d21529faSDavid L. Jones case LibFunc_fabs:
1619d21529faSDavid L. Jones case LibFunc_fabsf:
1620d21529faSDavid L. Jones case LibFunc_fabsl:
1621d21529faSDavid L. Jones case LibFunc_floor:
1622d21529faSDavid L. Jones case LibFunc_floorf:
1623d21529faSDavid L. Jones case LibFunc_floorl:
1624d21529faSDavid L. Jones case LibFunc_log10:
16253cd8c16dSAndrew Kaylor case LibFunc_log10_finite:
1626d21529faSDavid L. Jones case LibFunc_log10f:
16273cd8c16dSAndrew Kaylor case LibFunc_log10f_finite:
1628d21529faSDavid L. Jones case LibFunc_log10l:
16293cd8c16dSAndrew Kaylor case LibFunc_log10l_finite:
1630d21529faSDavid L. Jones case LibFunc_log1p:
1631d21529faSDavid L. Jones case LibFunc_log1pf:
1632d21529faSDavid L. Jones case LibFunc_log1pl:
1633d21529faSDavid L. Jones case LibFunc_log2:
16343cd8c16dSAndrew Kaylor case LibFunc_log2_finite:
1635d21529faSDavid L. Jones case LibFunc_log2f:
16363cd8c16dSAndrew Kaylor case LibFunc_log2f_finite:
1637d21529faSDavid L. Jones case LibFunc_log2l:
16383cd8c16dSAndrew Kaylor case LibFunc_log2l_finite:
1639d21529faSDavid L. Jones case LibFunc_log:
16403cd8c16dSAndrew Kaylor case LibFunc_log_finite:
1641d21529faSDavid L. Jones case LibFunc_logb:
1642d21529faSDavid L. Jones case LibFunc_logbf:
1643d21529faSDavid L. Jones case LibFunc_logbl:
1644d21529faSDavid L. Jones case LibFunc_logf:
16453cd8c16dSAndrew Kaylor case LibFunc_logf_finite:
1646d21529faSDavid L. Jones case LibFunc_logl:
16473cd8c16dSAndrew Kaylor case LibFunc_logl_finite:
1648d21529faSDavid L. Jones case LibFunc_nearbyint:
1649d21529faSDavid L. Jones case LibFunc_nearbyintf:
1650d21529faSDavid L. Jones case LibFunc_nearbyintl:
1651d21529faSDavid L. Jones case LibFunc_rint:
1652d21529faSDavid L. Jones case LibFunc_rintf:
1653d21529faSDavid L. Jones case LibFunc_rintl:
1654d21529faSDavid L. Jones case LibFunc_round:
1655d21529faSDavid L. Jones case LibFunc_roundf:
1656d21529faSDavid L. Jones case LibFunc_roundl:
16574d20e31fSSerge Pavlov case LibFunc_roundeven:
16584d20e31fSSerge Pavlov case LibFunc_roundevenf:
16594d20e31fSSerge Pavlov case LibFunc_roundevenl:
1660d21529faSDavid L. Jones case LibFunc_sin:
1661d21529faSDavid L. Jones case LibFunc_sinf:
1662d21529faSDavid L. Jones case LibFunc_sinh:
16633cd8c16dSAndrew Kaylor case LibFunc_sinh_finite:
1664d21529faSDavid L. Jones case LibFunc_sinhf:
16653cd8c16dSAndrew Kaylor case LibFunc_sinhf_finite:
1666d21529faSDavid L. Jones case LibFunc_sinhl:
16673cd8c16dSAndrew Kaylor case LibFunc_sinhl_finite:
1668d21529faSDavid L. Jones case LibFunc_sinl:
1669d21529faSDavid L. Jones case LibFunc_sqrt:
1670d21529faSDavid L. Jones case LibFunc_sqrt_finite:
1671d21529faSDavid L. Jones case LibFunc_sqrtf:
1672d21529faSDavid L. Jones case LibFunc_sqrtf_finite:
1673d21529faSDavid L. Jones case LibFunc_sqrtl:
1674d21529faSDavid L. Jones case LibFunc_sqrtl_finite:
1675d21529faSDavid L. Jones case LibFunc_tan:
1676d21529faSDavid L. Jones case LibFunc_tanf:
1677d21529faSDavid L. Jones case LibFunc_tanh:
1678d21529faSDavid L. Jones case LibFunc_tanhf:
1679d21529faSDavid L. Jones case LibFunc_tanhl:
1680d21529faSDavid L. Jones case LibFunc_tanl:
1681d21529faSDavid L. Jones case LibFunc_trunc:
1682d21529faSDavid L. Jones case LibFunc_truncf:
1683d21529faSDavid L. Jones case LibFunc_truncl:
1684d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isFloatingPointTy() &&
1685d765a82bSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0));
1686d765a82bSAhmed Bougacha
1687d21529faSDavid L. Jones case LibFunc_atan2:
16883cd8c16dSAndrew Kaylor case LibFunc_atan2_finite:
1689d21529faSDavid L. Jones case LibFunc_atan2f:
16903cd8c16dSAndrew Kaylor case LibFunc_atan2f_finite:
1691d21529faSDavid L. Jones case LibFunc_atan2l:
16923cd8c16dSAndrew Kaylor case LibFunc_atan2l_finite:
1693d21529faSDavid L. Jones case LibFunc_fmin:
1694d21529faSDavid L. Jones case LibFunc_fminf:
1695d21529faSDavid L. Jones case LibFunc_fminl:
1696d21529faSDavid L. Jones case LibFunc_fmax:
1697d21529faSDavid L. Jones case LibFunc_fmaxf:
1698d21529faSDavid L. Jones case LibFunc_fmaxl:
1699d21529faSDavid L. Jones case LibFunc_fmod:
1700d21529faSDavid L. Jones case LibFunc_fmodf:
1701d21529faSDavid L. Jones case LibFunc_fmodl:
17022470d298SEhud Katz case LibFunc_remainder:
17032470d298SEhud Katz case LibFunc_remainderf:
17042470d298SEhud Katz case LibFunc_remainderl:
1705d21529faSDavid L. Jones case LibFunc_copysign:
1706d21529faSDavid L. Jones case LibFunc_copysignf:
1707d21529faSDavid L. Jones case LibFunc_copysignl:
1708d21529faSDavid L. Jones case LibFunc_pow:
17093cd8c16dSAndrew Kaylor case LibFunc_pow_finite:
1710d21529faSDavid L. Jones case LibFunc_powf:
17113cd8c16dSAndrew Kaylor case LibFunc_powf_finite:
1712d21529faSDavid L. Jones case LibFunc_powl:
17133cd8c16dSAndrew Kaylor case LibFunc_powl_finite:
1714d765a82bSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
1715d765a82bSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0) &&
1716d765a82bSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(1));
1717d765a82bSAhmed Bougacha
1718d21529faSDavid L. Jones case LibFunc_ldexp:
1719d21529faSDavid L. Jones case LibFunc_ldexpf:
1720d21529faSDavid L. Jones case LibFunc_ldexpl:
17216b9be1dbSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
17226b9be1dbSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0) &&
17239c54ee43SBjorn Pettersson FTy.getParamType(1)->isIntegerTy(getIntSize()));
17246b9be1dbSAhmed Bougacha
1725d21529faSDavid L. Jones case LibFunc_ffs:
1726d21529faSDavid L. Jones case LibFunc_ffsl:
1727d21529faSDavid L. Jones case LibFunc_ffsll:
1728d21529faSDavid L. Jones case LibFunc_fls:
1729d21529faSDavid L. Jones case LibFunc_flsl:
1730d21529faSDavid L. Jones case LibFunc_flsll:
173104949fafSSanjay Patel return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
173204949fafSSanjay Patel FTy.getParamType(0)->isIntegerTy());
173304949fafSSanjay Patel
1734d21529faSDavid L. Jones case LibFunc_isdigit:
1735d21529faSDavid L. Jones case LibFunc_isascii:
1736d21529faSDavid L. Jones case LibFunc_toascii:
1737d21529faSDavid L. Jones case LibFunc_putchar:
1738ca22d427SDavid Bolvansky case LibFunc_putchar_unlocked:
1739d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
174004949fafSSanjay Patel FTy.getReturnType() == FTy.getParamType(0));
1741d765a82bSAhmed Bougacha
1742d21529faSDavid L. Jones case LibFunc_abs:
1743d21529faSDavid L. Jones case LibFunc_labs:
1744d21529faSDavid L. Jones case LibFunc_llabs:
1745d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isIntegerTy() &&
1746d765a82bSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0));
1747d765a82bSAhmed Bougacha
1748d21529faSDavid L. Jones case LibFunc_cxa_atexit:
1749d765a82bSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType()->isIntegerTy() &&
1750d765a82bSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
1751d765a82bSAhmed Bougacha FTy.getParamType(1)->isPointerTy() &&
1752d765a82bSAhmed Bougacha FTy.getParamType(2)->isPointerTy());
1753d765a82bSAhmed Bougacha
1754d21529faSDavid L. Jones case LibFunc_sinpi:
1755d21529faSDavid L. Jones case LibFunc_cospi:
1756d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isDoubleTy() &&
1757d765a82bSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0));
1758d765a82bSAhmed Bougacha
1759d21529faSDavid L. Jones case LibFunc_sinpif:
1760d21529faSDavid L. Jones case LibFunc_cospif:
1761d765a82bSAhmed Bougacha return (NumParams == 1 && FTy.getReturnType()->isFloatTy() &&
1762d765a82bSAhmed Bougacha FTy.getReturnType() == FTy.getParamType(0));
1763d765a82bSAhmed Bougacha
1764d21529faSDavid L. Jones case LibFunc_strnlen:
17656b9be1dbSAhmed Bougacha return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(1) &&
1766b26d6758SAlex Richardson FTy.getParamType(0)->isPointerTy() &&
17677f84fa4aSBjorn Pettersson FTy.getParamType(1)->isIntegerTy(SizeTBits));
17686b9be1dbSAhmed Bougacha
1769d21529faSDavid L. Jones case LibFunc_posix_memalign:
17706b9be1dbSAhmed Bougacha return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
17716b9be1dbSAhmed Bougacha FTy.getParamType(0)->isPointerTy() &&
17727f84fa4aSBjorn Pettersson FTy.getParamType(1)->isIntegerTy(SizeTBits) &&
17737f84fa4aSBjorn Pettersson FTy.getParamType(2)->isIntegerTy(SizeTBits));
17746b9be1dbSAhmed Bougacha
177560b40b8fSMatthias Braun case LibFunc_wcslen:
177660b40b8fSMatthias Braun return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
177760b40b8fSMatthias Braun FTy.getReturnType()->isIntegerTy());
177860b40b8fSMatthias Braun
17792ff24731SHal Finkel case LibFunc_cabs:
17802ff24731SHal Finkel case LibFunc_cabsf:
17812ff24731SHal Finkel case LibFunc_cabsl: {
17822ff24731SHal Finkel Type* RetTy = FTy.getReturnType();
17832ff24731SHal Finkel if (!RetTy->isFloatingPointTy())
17842ff24731SHal Finkel return false;
17852ff24731SHal Finkel
17862ff24731SHal Finkel // NOTE: These prototypes are target specific and currently support
17872ff24731SHal Finkel // "complex" passed as an array or discrete real & imaginary parameters.
17882ff24731SHal Finkel // Add other calling conventions to enable libcall optimizations.
17892ff24731SHal Finkel if (NumParams == 1)
17902ff24731SHal Finkel return (FTy.getParamType(0)->isArrayTy() &&
17912ff24731SHal Finkel FTy.getParamType(0)->getArrayNumElements() == 2 &&
17922ff24731SHal Finkel FTy.getParamType(0)->getArrayElementType() == RetTy);
17932ff24731SHal Finkel else if (NumParams == 2)
17942ff24731SHal Finkel return (FTy.getParamType(0) == RetTy && FTy.getParamType(1) == RetTy);
17952ff24731SHal Finkel else
17962ff24731SHal Finkel return false;
17972ff24731SHal Finkel }
17986b9be1dbSAhmed Bougacha case LibFunc::NumLibFuncs:
17993b705ef7SEvandro Menezes case LibFunc::NotLibFunc:
180086b680a3SAhmed Bougacha break;
1801d765a82bSAhmed Bougacha }
18026b9be1dbSAhmed Bougacha
180386b680a3SAhmed Bougacha llvm_unreachable("Invalid libfunc");
1804d765a82bSAhmed Bougacha }
1805d765a82bSAhmed Bougacha
getLibFunc(const Function & FDecl,LibFunc & F) const1806d765a82bSAhmed Bougacha bool TargetLibraryInfoImpl::getLibFunc(const Function &FDecl,
1807d21529faSDavid L. Jones LibFunc &F) const {
180876ea748dSPhilip Reames // Intrinsics don't overlap w/libcalls; if our module has a large number of
180976ea748dSPhilip Reames // intrinsics, this ends up being an interesting compile time win since we
181076ea748dSPhilip Reames // avoid string normalization and comparison.
181176ea748dSPhilip Reames if (FDecl.isIntrinsic()) return false;
181276ea748dSPhilip Reames
1813460efc1fSBjorn Pettersson const Module *M = FDecl.getParent();
1814460efc1fSBjorn Pettersson assert(M && "Expecting FDecl to be connected to a Module.");
1815460efc1fSBjorn Pettersson
1816d765a82bSAhmed Bougacha return getLibFunc(FDecl.getName(), F) &&
18177f84fa4aSBjorn Pettersson isValidProtoForLibFunc(*FDecl.getFunctionType(), F, *M);
1818d765a82bSAhmed Bougacha }
1819d765a82bSAhmed Bougacha
disableAllFunctions()1820c0291865SChandler Carruth void TargetLibraryInfoImpl::disableAllFunctions() {
182162d4215bSChandler Carruth memset(AvailableArray, 0, sizeof(AvailableArray));
182262d4215bSChandler Carruth }
1823b98f63dbSChandler Carruth
compareByScalarFnName(const VecDesc & LHS,const VecDesc & RHS)1824e8f2551fSMichael Zolotukhin static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS) {
18259a72cd7bSMehdi Amini return LHS.ScalarFnName < RHS.ScalarFnName;
1826e8f2551fSMichael Zolotukhin }
1827e8f2551fSMichael Zolotukhin
compareByVectorFnName(const VecDesc & LHS,const VecDesc & RHS)1828e8f2551fSMichael Zolotukhin static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS) {
18299a72cd7bSMehdi Amini return LHS.VectorFnName < RHS.VectorFnName;
1830e8f2551fSMichael Zolotukhin }
1831e8f2551fSMichael Zolotukhin
compareWithScalarFnName(const VecDesc & LHS,StringRef S)1832e8f2551fSMichael Zolotukhin static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S) {
18339a72cd7bSMehdi Amini return LHS.ScalarFnName < S;
1834e8f2551fSMichael Zolotukhin }
1835e8f2551fSMichael Zolotukhin
addVectorizableFunctions(ArrayRef<VecDesc> Fns)1836ed03d948SMehdi Amini void TargetLibraryInfoImpl::addVectorizableFunctions(ArrayRef<VecDesc> Fns) {
1837f76e83bfSKazu Hirata llvm::append_range(VectorDescs, Fns);
18380cac726aSFangrui Song llvm::sort(VectorDescs, compareByScalarFnName);
1839e8f2551fSMichael Zolotukhin
1840f76e83bfSKazu Hirata llvm::append_range(ScalarDescs, Fns);
18410cac726aSFangrui Song llvm::sort(ScalarDescs, compareByVectorFnName);
1842e8f2551fSMichael Zolotukhin }
1843e8f2551fSMichael Zolotukhin
addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib)18446d8a2aa9SMichael Zolotukhin void TargetLibraryInfoImpl::addVectorizableFunctionsFromVecLib(
1845ed03d948SMehdi Amini enum VectorLibrary VecLib) {
18466d8a2aa9SMichael Zolotukhin switch (VecLib) {
18476d8a2aa9SMichael Zolotukhin case Accelerate: {
18486d8a2aa9SMichael Zolotukhin const VecDesc VecFuncs[] = {
1849820b9031SNemanja Ivanovic #define TLI_DEFINE_ACCELERATE_VECFUNCS
1850820b9031SNemanja Ivanovic #include "llvm/Analysis/VecFuncs.def"
18516d8a2aa9SMichael Zolotukhin };
1852ed03d948SMehdi Amini addVectorizableFunctions(VecFuncs);
18536d8a2aa9SMichael Zolotukhin break;
18546d8a2aa9SMichael Zolotukhin }
185593a9a8a8SFlorian Hahn case DarwinLibSystemM: {
185693a9a8a8SFlorian Hahn const VecDesc VecFuncs[] = {
185793a9a8a8SFlorian Hahn #define TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
185893a9a8a8SFlorian Hahn #include "llvm/Analysis/VecFuncs.def"
185993a9a8a8SFlorian Hahn };
186093a9a8a8SFlorian Hahn addVectorizableFunctions(VecFuncs);
186193a9a8a8SFlorian Hahn break;
186293a9a8a8SFlorian Hahn }
186357cdc52cSVenkataramanan Kumar case LIBMVEC_X86: {
186457cdc52cSVenkataramanan Kumar const VecDesc VecFuncs[] = {
186557cdc52cSVenkataramanan Kumar #define TLI_DEFINE_LIBMVEC_X86_VECFUNCS
186657cdc52cSVenkataramanan Kumar #include "llvm/Analysis/VecFuncs.def"
186757cdc52cSVenkataramanan Kumar };
186857cdc52cSVenkataramanan Kumar addVectorizableFunctions(VecFuncs);
186957cdc52cSVenkataramanan Kumar break;
187057cdc52cSVenkataramanan Kumar }
1871fe97754aSNemanja Ivanovic case MASSV: {
1872fe97754aSNemanja Ivanovic const VecDesc VecFuncs[] = {
1873fe97754aSNemanja Ivanovic #define TLI_DEFINE_MASSV_VECFUNCS
1874fe97754aSNemanja Ivanovic #include "llvm/Analysis/VecFuncs.def"
1875fe97754aSNemanja Ivanovic };
1876ed03d948SMehdi Amini addVectorizableFunctions(VecFuncs);
1877fe97754aSNemanja Ivanovic break;
1878fe97754aSNemanja Ivanovic }
1879a6669a1eSMatt Masten case SVML: {
1880a6669a1eSMatt Masten const VecDesc VecFuncs[] = {
1881820b9031SNemanja Ivanovic #define TLI_DEFINE_SVML_VECFUNCS
1882820b9031SNemanja Ivanovic #include "llvm/Analysis/VecFuncs.def"
1883a6669a1eSMatt Masten };
1884ed03d948SMehdi Amini addVectorizableFunctions(VecFuncs);
1885a6669a1eSMatt Masten break;
1886a6669a1eSMatt Masten }
1887ed03d948SMehdi Amini case NoLibrary:
18886d8a2aa9SMichael Zolotukhin break;
18896d8a2aa9SMichael Zolotukhin }
18906d8a2aa9SMichael Zolotukhin }
18916d8a2aa9SMichael Zolotukhin
isFunctionVectorizable(StringRef funcName) const1892ed03d948SMehdi Amini bool TargetLibraryInfoImpl::isFunctionVectorizable(StringRef funcName) const {
1893e8f2551fSMichael Zolotukhin funcName = sanitizeFunctionName(funcName);
1894ed03d948SMehdi Amini if (funcName.empty())
1895e8f2551fSMichael Zolotukhin return false;
1896e8f2551fSMichael Zolotukhin
1897cecc4352SFangrui Song std::vector<VecDesc>::const_iterator I =
1898cecc4352SFangrui Song llvm::lower_bound(VectorDescs, funcName, compareWithScalarFnName);
1899e8f2551fSMichael Zolotukhin return I != VectorDescs.end() && StringRef(I->ScalarFnName) == funcName;
1900e8f2551fSMichael Zolotukhin }
1901e8f2551fSMichael Zolotukhin
190201b87444SDavid Sherwood StringRef
getVectorizedFunction(StringRef F,const ElementCount & VF) const190301b87444SDavid Sherwood TargetLibraryInfoImpl::getVectorizedFunction(StringRef F,
190401b87444SDavid Sherwood const ElementCount &VF) const {
1905e8f2551fSMichael Zolotukhin F = sanitizeFunctionName(F);
1906ed03d948SMehdi Amini if (F.empty())
1907e8f2551fSMichael Zolotukhin return F;
1908cecc4352SFangrui Song std::vector<VecDesc>::const_iterator I =
1909cecc4352SFangrui Song llvm::lower_bound(VectorDescs, F, compareWithScalarFnName);
1910e8f2551fSMichael Zolotukhin while (I != VectorDescs.end() && StringRef(I->ScalarFnName) == F) {
1911e8f2551fSMichael Zolotukhin if (I->VectorizationFactor == VF)
1912e8f2551fSMichael Zolotukhin return I->VectorFnName;
1913e8f2551fSMichael Zolotukhin ++I;
1914e8f2551fSMichael Zolotukhin }
1915e8f2551fSMichael Zolotukhin return StringRef();
1916e8f2551fSMichael Zolotukhin }
1917e8f2551fSMichael Zolotukhin
run(const Function & F,FunctionAnalysisManager &)1918878ab6dfSTeresa Johnson TargetLibraryInfo TargetLibraryAnalysis::run(const Function &F,
1919164a2aa6SChandler Carruth FunctionAnalysisManager &) {
1920878ab6dfSTeresa Johnson if (!BaselineInfoImpl)
1921878ab6dfSTeresa Johnson BaselineInfoImpl =
1922878ab6dfSTeresa Johnson TargetLibraryInfoImpl(Triple(F.getParent()->getTargetTriple()));
1923878ab6dfSTeresa Johnson return TargetLibraryInfo(*BaselineInfoImpl, &F);
1924c0291865SChandler Carruth }
1925c0291865SChandler Carruth
getWCharSize(const Module & M) const192650ec0b5dSMatthias Braun unsigned TargetLibraryInfoImpl::getWCharSize(const Module &M) const {
192750ec0b5dSMatthias Braun if (auto *ShortWChar = cast_or_null<ConstantAsMetadata>(
192850ec0b5dSMatthias Braun M.getModuleFlag("wchar_size")))
192950ec0b5dSMatthias Braun return cast<ConstantInt>(ShortWChar->getValue())->getZExtValue();
1930cc603ee3SMatthias Braun return 0;
193150ec0b5dSMatthias Braun }
1932c0291865SChandler Carruth
TargetLibraryInfoWrapperPass()1933b98f63dbSChandler Carruth TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass()
1934878ab6dfSTeresa Johnson : ImmutablePass(ID), TLA(TargetLibraryInfoImpl()) {
1935b98f63dbSChandler Carruth initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1936b98f63dbSChandler Carruth }
1937b98f63dbSChandler Carruth
TargetLibraryInfoWrapperPass(const Triple & T)1938b98f63dbSChandler Carruth TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(const Triple &T)
1939878ab6dfSTeresa Johnson : ImmutablePass(ID), TLA(TargetLibraryInfoImpl(T)) {
1940b98f63dbSChandler Carruth initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1941b98f63dbSChandler Carruth }
1942b98f63dbSChandler Carruth
TargetLibraryInfoWrapperPass(const TargetLibraryInfoImpl & TLIImpl)1943b98f63dbSChandler Carruth TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(
1944c0291865SChandler Carruth const TargetLibraryInfoImpl &TLIImpl)
1945878ab6dfSTeresa Johnson : ImmutablePass(ID), TLA(TLIImpl) {
1946b98f63dbSChandler Carruth initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1947b98f63dbSChandler Carruth }
1948b98f63dbSChandler Carruth
1949dab4eae2SChandler Carruth AnalysisKey TargetLibraryAnalysis::Key;
1950df0cd726SNAKAMURA Takumi
1951b98f63dbSChandler Carruth // Register the basic pass.
1952b98f63dbSChandler Carruth INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
1953b98f63dbSChandler Carruth "Target Library Information", false, true)
1954b98f63dbSChandler Carruth char TargetLibraryInfoWrapperPass::ID = 0;
1955b98f63dbSChandler Carruth
anchor()1956b98f63dbSChandler Carruth void TargetLibraryInfoWrapperPass::anchor() {}
1957d6de5f12SFrancesco Petrogalli
getWidestVF(StringRef ScalarF,ElementCount & FixedVF,ElementCount & ScalableVF) const195801b87444SDavid Sherwood void TargetLibraryInfoImpl::getWidestVF(StringRef ScalarF,
195901b87444SDavid Sherwood ElementCount &FixedVF,
196001b87444SDavid Sherwood ElementCount &ScalableVF) const {
1961d6de5f12SFrancesco Petrogalli ScalarF = sanitizeFunctionName(ScalarF);
196201b87444SDavid Sherwood // Use '0' here because a type of the form <vscale x 1 x ElTy> is not the
196301b87444SDavid Sherwood // same as a scalar.
196401b87444SDavid Sherwood ScalableVF = ElementCount::getScalable(0);
196501b87444SDavid Sherwood FixedVF = ElementCount::getFixed(1);
1966ed03d948SMehdi Amini if (ScalarF.empty())
196701b87444SDavid Sherwood return;
1968d6de5f12SFrancesco Petrogalli
1969d6de5f12SFrancesco Petrogalli std::vector<VecDesc>::const_iterator I =
1970d6de5f12SFrancesco Petrogalli llvm::lower_bound(VectorDescs, ScalarF, compareWithScalarFnName);
1971d6de5f12SFrancesco Petrogalli while (I != VectorDescs.end() && StringRef(I->ScalarFnName) == ScalarF) {
197201b87444SDavid Sherwood ElementCount *VF =
197301b87444SDavid Sherwood I->VectorizationFactor.isScalable() ? &ScalableVF : &FixedVF;
197401b87444SDavid Sherwood if (ElementCount::isKnownGT(I->VectorizationFactor, *VF))
197501b87444SDavid Sherwood *VF = I->VectorizationFactor;
1976d6de5f12SFrancesco Petrogalli ++I;
1977d6de5f12SFrancesco Petrogalli }
1978d6de5f12SFrancesco Petrogalli }
1979