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