1ff0cc061SDimitry Andric //===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
2ff0cc061SDimitry Andric //
3ff0cc061SDimitry Andric // The LLVM Compiler Infrastructure
4ff0cc061SDimitry Andric //
5ff0cc061SDimitry Andric // This file is distributed under the University of Illinois Open Source
6ff0cc061SDimitry Andric // License. See LICENSE.TXT for details.
7ff0cc061SDimitry Andric //
8ff0cc061SDimitry Andric //===----------------------------------------------------------------------===//
9ff0cc061SDimitry Andric //
10ff0cc061SDimitry Andric // This file implements the TargetLibraryInfo class.
11ff0cc061SDimitry Andric //
12ff0cc061SDimitry Andric //===----------------------------------------------------------------------===//
13ff0cc061SDimitry Andric
14ff0cc061SDimitry Andric #include "llvm/Analysis/TargetLibraryInfo.h"
15ff0cc061SDimitry Andric #include "llvm/ADT/Triple.h"
16d8866befSDimitry Andric #include "llvm/IR/Constants.h"
17ff0cc061SDimitry Andric #include "llvm/Support/CommandLine.h"
18ff0cc061SDimitry Andric using namespace llvm;
19ff0cc061SDimitry Andric
20ff0cc061SDimitry Andric static cl::opt<TargetLibraryInfoImpl::VectorLibrary> ClVectorLibrary(
21ff0cc061SDimitry Andric "vector-library", cl::Hidden, cl::desc("Vector functions library"),
22ff0cc061SDimitry Andric cl::init(TargetLibraryInfoImpl::NoLibrary),
23ff0cc061SDimitry Andric cl::values(clEnumValN(TargetLibraryInfoImpl::NoLibrary, "none",
24ff0cc061SDimitry Andric "No vector functions library"),
25ff0cc061SDimitry Andric clEnumValN(TargetLibraryInfoImpl::Accelerate, "Accelerate",
26ff0cc061SDimitry Andric "Accelerate framework"),
27d88c1a5aSDimitry Andric clEnumValN(TargetLibraryInfoImpl::SVML, "SVML",
28d88c1a5aSDimitry Andric "Intel SVML library")));
29ff0cc061SDimitry Andric
30d88c1a5aSDimitry Andric StringRef const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] = {
31ff0cc061SDimitry Andric #define TLI_DEFINE_STRING
32ff0cc061SDimitry Andric #include "llvm/Analysis/TargetLibraryInfo.def"
33ff0cc061SDimitry Andric };
34ff0cc061SDimitry Andric
hasSinCosPiStret(const Triple & T)35ff0cc061SDimitry Andric static bool hasSinCosPiStret(const Triple &T) {
36ff0cc061SDimitry Andric // Only Darwin variants have _stret versions of combined trig functions.
37ff0cc061SDimitry Andric if (!T.isOSDarwin())
38ff0cc061SDimitry Andric return false;
39ff0cc061SDimitry Andric
40ff0cc061SDimitry Andric // The ABI is rather complicated on x86, so don't do anything special there.
41ff0cc061SDimitry Andric if (T.getArch() == Triple::x86)
42ff0cc061SDimitry Andric return false;
43ff0cc061SDimitry Andric
44ff0cc061SDimitry Andric if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
45ff0cc061SDimitry Andric return false;
46ff0cc061SDimitry Andric
47ff0cc061SDimitry Andric if (T.isiOS() && T.isOSVersionLT(7, 0))
48ff0cc061SDimitry Andric return false;
49ff0cc061SDimitry Andric
50ff0cc061SDimitry Andric return true;
51ff0cc061SDimitry Andric }
52ff0cc061SDimitry Andric
532cab237bSDimitry Andric /// Initialize the set of available library functions based on the specified
542cab237bSDimitry Andric /// target triple. This should be carefully written so that a missing target
552cab237bSDimitry Andric /// triple gets a sane set of defaults.
initialize(TargetLibraryInfoImpl & TLI,const Triple & T,ArrayRef<StringRef> StandardNames)56ff0cc061SDimitry Andric static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
57d88c1a5aSDimitry Andric ArrayRef<StringRef> StandardNames) {
58ff0cc061SDimitry Andric // Verify that the StandardNames array is in alphabetical order.
594d0b32cdSDimitry Andric assert(std::is_sorted(StandardNames.begin(), StandardNames.end(),
60d88c1a5aSDimitry Andric [](StringRef LHS, StringRef RHS) {
61d88c1a5aSDimitry Andric return LHS < RHS;
624d0b32cdSDimitry Andric }) &&
634d0b32cdSDimitry Andric "TargetLibraryInfoImpl function names must be sorted");
64ff0cc061SDimitry Andric
654ba319b5SDimitry Andric // Set IO unlocked variants as unavailable
664ba319b5SDimitry Andric // Set them as available per system below
674ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_getchar_unlocked);
684ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_putc_unlocked);
694ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_putchar_unlocked);
704ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_fputc_unlocked);
714ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_fgetc_unlocked);
724ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_fread_unlocked);
734ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_fwrite_unlocked);
744ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_fputs_unlocked);
754ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_fgets_unlocked);
764ba319b5SDimitry Andric
77d88c1a5aSDimitry Andric bool ShouldExtI32Param = false, ShouldExtI32Return = false,
78d88c1a5aSDimitry Andric ShouldSignExtI32Param = false;
79d88c1a5aSDimitry Andric // PowerPC64, Sparc64, SystemZ need signext/zeroext on i32 parameters and
80d88c1a5aSDimitry Andric // returns corresponding to C-level ints and unsigned ints.
81d88c1a5aSDimitry Andric if (T.getArch() == Triple::ppc64 || T.getArch() == Triple::ppc64le ||
82d88c1a5aSDimitry Andric T.getArch() == Triple::sparcv9 || T.getArch() == Triple::systemz) {
83d88c1a5aSDimitry Andric ShouldExtI32Param = true;
84d88c1a5aSDimitry Andric ShouldExtI32Return = true;
85d88c1a5aSDimitry Andric }
86d88c1a5aSDimitry Andric // Mips, on the other hand, needs signext on i32 parameters corresponding
87d88c1a5aSDimitry Andric // to both signed and unsigned ints.
884ba319b5SDimitry Andric if (T.isMIPS()) {
89d88c1a5aSDimitry Andric ShouldSignExtI32Param = true;
90d88c1a5aSDimitry Andric }
91d88c1a5aSDimitry Andric TLI.setShouldExtI32Param(ShouldExtI32Param);
92d88c1a5aSDimitry Andric TLI.setShouldExtI32Return(ShouldExtI32Return);
93d88c1a5aSDimitry Andric TLI.setShouldSignExtI32Param(ShouldSignExtI32Param);
94d88c1a5aSDimitry Andric
957d523365SDimitry Andric if (T.getArch() == Triple::r600 ||
967d523365SDimitry Andric T.getArch() == Triple::amdgcn) {
977a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ldexp);
987a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ldexpf);
997a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ldexpl);
1007a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10);
1017a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10f);
1027a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10l);
1037a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_log10);
1047a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_log10f);
1057a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_log10l);
1067d523365SDimitry Andric }
1077d523365SDimitry Andric
108ff0cc061SDimitry Andric // There are no library implementations of mempcy and memset for AMD gpus and
109ff0cc061SDimitry Andric // these can be difficult to lower in the backend.
110ff0cc061SDimitry Andric if (T.getArch() == Triple::r600 ||
1113ca95b02SDimitry Andric T.getArch() == Triple::amdgcn) {
1127a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memcpy);
1137a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memset);
1147a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memset_pattern16);
115ff0cc061SDimitry Andric return;
116ff0cc061SDimitry Andric }
117ff0cc061SDimitry Andric
118ff0cc061SDimitry Andric // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later.
1197d523365SDimitry Andric // All versions of watchOS support it.
120ff0cc061SDimitry Andric if (T.isMacOSX()) {
1214ba319b5SDimitry Andric // available IO unlocked variants on Mac OS X
1224ba319b5SDimitry Andric TLI.setAvailable(LibFunc_getc_unlocked);
1234ba319b5SDimitry Andric TLI.setAvailable(LibFunc_getchar_unlocked);
1244ba319b5SDimitry Andric TLI.setAvailable(LibFunc_putc_unlocked);
1254ba319b5SDimitry Andric TLI.setAvailable(LibFunc_putchar_unlocked);
1264ba319b5SDimitry Andric
127ff0cc061SDimitry Andric if (T.isMacOSXVersionLT(10, 5))
1287a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memset_pattern16);
129ff0cc061SDimitry Andric } else if (T.isiOS()) {
130ff0cc061SDimitry Andric if (T.isOSVersionLT(3, 0))
1317a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memset_pattern16);
1327d523365SDimitry Andric } else if (!T.isWatchOS()) {
1337a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memset_pattern16);
134ff0cc061SDimitry Andric }
135ff0cc061SDimitry Andric
136ff0cc061SDimitry Andric if (!hasSinCosPiStret(T)) {
1377a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_sinpi);
1387a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_sinpif);
1397a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_cospi);
1407a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_cospif);
1417a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_sincospi_stret);
1427a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_sincospif_stret);
143ff0cc061SDimitry Andric }
144ff0cc061SDimitry Andric
145ff0cc061SDimitry Andric if (T.isMacOSX() && T.getArch() == Triple::x86 &&
146ff0cc061SDimitry Andric !T.isMacOSXVersionLT(10, 7)) {
147ff0cc061SDimitry Andric // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
148ff0cc061SDimitry Andric // we don't care about) have two versions; on recent OSX, the one we want
149ff0cc061SDimitry Andric // has a $UNIX2003 suffix. The two implementations are identical except
150ff0cc061SDimitry Andric // for the return value in some edge cases. However, we don't want to
151ff0cc061SDimitry Andric // generate code that depends on the old symbols.
1527a7e6055SDimitry Andric TLI.setAvailableWithName(LibFunc_fwrite, "fwrite$UNIX2003");
1537a7e6055SDimitry Andric TLI.setAvailableWithName(LibFunc_fputs, "fputs$UNIX2003");
154ff0cc061SDimitry Andric }
155ff0cc061SDimitry Andric
156ff0cc061SDimitry Andric // iprintf and friends are only available on XCore and TCE.
157ff0cc061SDimitry Andric if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
1587a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_iprintf);
1597a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_siprintf);
1607a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fiprintf);
161ff0cc061SDimitry Andric }
162ff0cc061SDimitry Andric
163ff0cc061SDimitry Andric if (T.isOSWindows() && !T.isOSCygMing()) {
164*b5893f02SDimitry Andric // XXX: The earliest documentation available at the moment is for VS2015/VC19:
165*b5893f02SDimitry Andric // https://docs.microsoft.com/en-us/cpp/c-runtime-library/floating-point-support?view=vs-2015
166*b5893f02SDimitry Andric // XXX: In order to use an MSVCRT older than VC19,
167*b5893f02SDimitry Andric // the specific library version must be explicit in the target triple,
168*b5893f02SDimitry Andric // e.g., x86_64-pc-windows-msvc18.
169*b5893f02SDimitry Andric bool hasPartialC99 = true;
170*b5893f02SDimitry Andric if (T.isKnownWindowsMSVCEnvironment()) {
171*b5893f02SDimitry Andric unsigned Major, Minor, Micro;
172*b5893f02SDimitry Andric T.getEnvironmentVersion(Major, Minor, Micro);
173*b5893f02SDimitry Andric hasPartialC99 = (Major == 0 || Major >= 19);
174*b5893f02SDimitry Andric }
175*b5893f02SDimitry Andric
176*b5893f02SDimitry Andric // Latest targets support C89 math functions, in part.
177*b5893f02SDimitry Andric bool isARM = (T.getArch() == Triple::aarch64 ||
178*b5893f02SDimitry Andric T.getArch() == Triple::arm);
179*b5893f02SDimitry Andric bool hasPartialFloat = (isARM ||
180*b5893f02SDimitry Andric T.getArch() == Triple::x86_64);
181*b5893f02SDimitry Andric
182*b5893f02SDimitry Andric // Win32 does not support float C89 math functions, in general.
183*b5893f02SDimitry Andric if (!hasPartialFloat) {
184*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_acosf);
185*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_asinf);
186*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_atan2f);
187*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_atanf);
188*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_ceilf);
189*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_cosf);
190*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_coshf);
191*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_expf);
192*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_floorf);
193*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fmodf);
194*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_log10f);
195*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_logf);
196*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_modff);
197*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_powf);
198*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_sinf);
199*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_sinhf);
200*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_sqrtf);
201*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_tanf);
202*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_tanhf);
203*b5893f02SDimitry Andric }
204*b5893f02SDimitry Andric if (!isARM)
205*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fabsf);
206*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_frexpf);
207*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_ldexpf);
208*b5893f02SDimitry Andric
209*b5893f02SDimitry Andric // Win32 does not support long double C89 math functions.
2107a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_acosl);
2117a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_asinl);
2127a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_atan2l);
213*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_atanl);
2147a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ceill);
2157a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_cosl);
2167a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_coshl);
2177a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_expl);
2187a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fabsl);
2197a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_floorl);
2207a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fmodl);
2217a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_frexpl);
2227a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ldexpl);
223*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_log10l);
2247a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_logl);
2257a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_modfl);
2267a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_powl);
2277a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_sinl);
2287a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_sinhl);
2297a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_sqrtl);
2307a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_tanl);
2317a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_tanhl);
232ff0cc061SDimitry Andric
233*b5893f02SDimitry Andric // Win32 does not fully support C99 math functions.
234*b5893f02SDimitry Andric if (!hasPartialC99) {
2357a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_acosh);
2367a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_acoshf);
2377a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_asinh);
2387a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_asinhf);
2397a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_atanh);
2407a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_atanhf);
241*b5893f02SDimitry Andric TLI.setAvailableWithName(LibFunc_cabs, "_cabs");
2422cab237bSDimitry Andric TLI.setUnavailable(LibFunc_cabsf);
2437a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_cbrt);
2447a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_cbrtf);
245*b5893f02SDimitry Andric TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
246*b5893f02SDimitry Andric TLI.setAvailableWithName(LibFunc_copysignf, "_copysignf");
2477a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp2);
2487a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp2f);
2497a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_expm1);
2507a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_expm1f);
251*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fmax);
252*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fmaxf);
253*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fmin);
254*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fminf);
2557a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_log1p);
2567a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_log1pf);
257*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_log2);
258*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_log2f);
259*b5893f02SDimitry Andric TLI.setAvailableWithName(LibFunc_logb, "_logb");
260*b5893f02SDimitry Andric if (hasPartialFloat)
261*b5893f02SDimitry Andric TLI.setAvailableWithName(LibFunc_logbf, "_logbf");
262*b5893f02SDimitry Andric else
2637a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_logbf);
2647a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_rint);
2657a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_rintf);
2667a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_round);
2677a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_roundf);
2687a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_trunc);
2697a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_truncf);
270ff0cc061SDimitry Andric }
271ff0cc061SDimitry Andric
272*b5893f02SDimitry Andric // Win32 does not support long double C99 math functions.
273*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_acoshl);
274*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_asinhl);
275*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_atanhl);
276*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_cabsl);
277*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_cbrtl);
278*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_copysignl);
279*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_exp2l);
280*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_expm1l);
281*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fmaxl);
282*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_fminl);
283*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_log1pl);
284*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_log2l);
285*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_logbl);
286*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_nearbyintl);
287*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_rintl);
288*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_roundl);
289*b5893f02SDimitry Andric TLI.setUnavailable(LibFunc_truncl);
290*b5893f02SDimitry Andric
291*b5893f02SDimitry Andric // Win32 does not support these functions, but
292*b5893f02SDimitry Andric // they are generally available on POSIX-compliant systems.
2937a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_access);
2947a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_bcmp);
2957a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_bcopy);
2967a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_bzero);
2977a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_chmod);
2987a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_chown);
2997a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_closedir);
3007a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ctermid);
3017a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fdopen);
3027a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ffs);
3037a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fileno);
3047a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_flockfile);
3057a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fseeko);
3067a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fstat);
3077a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fstatvfs);
3087a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ftello);
3097a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ftrylockfile);
3107a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_funlockfile);
3117a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_getitimer);
3127a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_getlogin_r);
3137a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_getpwnam);
3147a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_gettimeofday);
3157a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_htonl);
3167a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_htons);
3177a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_lchown);
3187a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_lstat);
3197a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memccpy);
3207a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_mkdir);
3217a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ntohl);
3227a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ntohs);
3237a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_open);
3247a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_opendir);
3257a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_pclose);
3267a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_popen);
3277a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_pread);
3287a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_pwrite);
3297a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_read);
3307a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_readlink);
3317a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_realpath);
3327a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_rmdir);
3337a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_setitimer);
3347a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_stat);
3357a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_statvfs);
3367a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_stpcpy);
3377a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_stpncpy);
3387a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_strcasecmp);
3397a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_strncasecmp);
3407a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_times);
3417a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_uname);
3427a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_unlink);
3437a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_unsetenv);
3447a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_utime);
3457a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_utimes);
3467a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_write);
347ff0cc061SDimitry Andric }
348ff0cc061SDimitry Andric
349ff0cc061SDimitry Andric switch (T.getOS()) {
350ff0cc061SDimitry Andric case Triple::MacOSX:
351ff0cc061SDimitry Andric // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
352ff0cc061SDimitry Andric // and their names are __exp10 and __exp10f. exp10l is not available on
353ff0cc061SDimitry Andric // OS X or iOS.
3547a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10l);
355ff0cc061SDimitry Andric if (T.isMacOSXVersionLT(10, 9)) {
3567a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10);
3577a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10f);
358ff0cc061SDimitry Andric } else {
3597a7e6055SDimitry Andric TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
3607a7e6055SDimitry Andric TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
361ff0cc061SDimitry Andric }
362ff0cc061SDimitry Andric break;
363ff0cc061SDimitry Andric case Triple::IOS:
3647d523365SDimitry Andric case Triple::TvOS:
3657d523365SDimitry Andric case Triple::WatchOS:
3667a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10l);
3677d523365SDimitry Andric if (!T.isWatchOS() && (T.isOSVersionLT(7, 0) ||
3687d523365SDimitry Andric (T.isOSVersionLT(9, 0) &&
3697d523365SDimitry Andric (T.getArch() == Triple::x86 ||
3707d523365SDimitry Andric T.getArch() == Triple::x86_64)))) {
3717a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10);
3727a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10f);
373ff0cc061SDimitry Andric } else {
3747a7e6055SDimitry Andric TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
3757a7e6055SDimitry Andric TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
376ff0cc061SDimitry Andric }
377ff0cc061SDimitry Andric break;
378ff0cc061SDimitry Andric case Triple::Linux:
379ff0cc061SDimitry Andric // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
380ff0cc061SDimitry Andric // buggy prior to glibc version 2.18. Until this version is widely deployed
381ff0cc061SDimitry Andric // or we have a reasonable detection strategy, we cannot use exp10 reliably
382ff0cc061SDimitry Andric // on Linux.
383ff0cc061SDimitry Andric //
384ff0cc061SDimitry Andric // Fall through to disable all of them.
385d88c1a5aSDimitry Andric LLVM_FALLTHROUGH;
386ff0cc061SDimitry Andric default:
3877a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10);
3887a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10f);
3897a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_exp10l);
390ff0cc061SDimitry Andric }
391ff0cc061SDimitry Andric
392ff0cc061SDimitry Andric // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
393ff0cc061SDimitry Andric // Linux (GLIBC):
394ff0cc061SDimitry Andric // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
3957d523365SDimitry Andric // http://svn.freebsd.org/base/head/lib/libc/string/ffsl.c
396ff0cc061SDimitry Andric // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
397ff0cc061SDimitry Andric switch (T.getOS()) {
398ff0cc061SDimitry Andric case Triple::Darwin:
399ff0cc061SDimitry Andric case Triple::MacOSX:
400ff0cc061SDimitry Andric case Triple::IOS:
4017d523365SDimitry Andric case Triple::TvOS:
4027d523365SDimitry Andric case Triple::WatchOS:
403ff0cc061SDimitry Andric case Triple::FreeBSD:
404ff0cc061SDimitry Andric case Triple::Linux:
405ff0cc061SDimitry Andric break;
406ff0cc061SDimitry Andric default:
4077a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ffsl);
408ff0cc061SDimitry Andric }
409ff0cc061SDimitry Andric
410ff0cc061SDimitry Andric // ffsll is available on at least FreeBSD and Linux (GLIBC):
4117d523365SDimitry Andric // http://svn.freebsd.org/base/head/lib/libc/string/ffsll.c
412ff0cc061SDimitry Andric // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
413ff0cc061SDimitry Andric switch (T.getOS()) {
4147d523365SDimitry Andric case Triple::Darwin:
4157d523365SDimitry Andric case Triple::MacOSX:
4167d523365SDimitry Andric case Triple::IOS:
4177d523365SDimitry Andric case Triple::TvOS:
4187d523365SDimitry Andric case Triple::WatchOS:
419ff0cc061SDimitry Andric case Triple::FreeBSD:
420ff0cc061SDimitry Andric case Triple::Linux:
421ff0cc061SDimitry Andric break;
422ff0cc061SDimitry Andric default:
4237a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ffsll);
424ff0cc061SDimitry Andric }
425ff0cc061SDimitry Andric
4267d523365SDimitry Andric // The following functions are available on at least FreeBSD:
4277d523365SDimitry Andric // http://svn.freebsd.org/base/head/lib/libc/string/fls.c
4287d523365SDimitry Andric // http://svn.freebsd.org/base/head/lib/libc/string/flsl.c
4297d523365SDimitry Andric // http://svn.freebsd.org/base/head/lib/libc/string/flsll.c
4307d523365SDimitry Andric if (!T.isOSFreeBSD()) {
4317a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fls);
4327a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_flsl);
4337a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_flsll);
4347d523365SDimitry Andric }
4357d523365SDimitry Andric
436*b5893f02SDimitry Andric // The following functions are only available on GNU/Linux (using glibc).
437*b5893f02SDimitry Andric // Linux variants without glibc (eg: bionic, musl) may have some subset.
438*b5893f02SDimitry Andric if (!T.isOSLinux() || !T.isGNUEnvironment()) {
4397a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_dunder_strdup);
4407a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_dunder_strtok_r);
4417a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_dunder_isoc99_scanf);
4427a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_dunder_isoc99_sscanf);
4437a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_under_IO_getc);
4447a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_under_IO_putc);
445*b5893f02SDimitry Andric // But, Android and musl have memalign.
446*b5893f02SDimitry Andric if (!T.isAndroid() && !T.isMusl())
4477a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_memalign);
4487a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fopen64);
4497a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fseeko64);
4507a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fstat64);
4517a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_fstatvfs64);
4527a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_ftello64);
4537a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_lstat64);
4547a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_open64);
4557a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_stat64);
4567a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_statvfs64);
4577a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_tmpfile64);
4584ba319b5SDimitry Andric
4594ba319b5SDimitry Andric // Relaxed math functions are included in math-finite.h on Linux (GLIBC).
4604ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_acos_finite);
4614ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_acosf_finite);
4624ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_acosl_finite);
4634ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_acosh_finite);
4644ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_acoshf_finite);
4654ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_acoshl_finite);
4664ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_asin_finite);
4674ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_asinf_finite);
4684ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_asinl_finite);
4694ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_atan2_finite);
4704ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_atan2f_finite);
4714ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_atan2l_finite);
4724ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_atanh_finite);
4734ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_atanhf_finite);
4744ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_atanhl_finite);
4754ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_cosh_finite);
4764ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_coshf_finite);
4774ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_coshl_finite);
4784ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_exp10_finite);
4794ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_exp10f_finite);
4804ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_exp10l_finite);
4814ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_exp2_finite);
4824ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_exp2f_finite);
4834ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_exp2l_finite);
4844ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_exp_finite);
4854ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_expf_finite);
4864ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_expl_finite);
4874ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_log10_finite);
4884ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_log10f_finite);
4894ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_log10l_finite);
4904ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_log2_finite);
4914ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_log2f_finite);
4924ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_log2l_finite);
4934ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_log_finite);
4944ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_logf_finite);
4954ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_logl_finite);
4964ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_pow_finite);
4974ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_powf_finite);
4984ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_powl_finite);
4994ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_sinh_finite);
5004ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_sinhf_finite);
5014ba319b5SDimitry Andric TLI.setUnavailable(LibFunc_sinhl_finite);
5024ba319b5SDimitry Andric }
5034ba319b5SDimitry Andric
5044ba319b5SDimitry Andric if ((T.isOSLinux() && T.isGNUEnvironment()) ||
5054ba319b5SDimitry Andric (T.isAndroid() && !T.isAndroidVersionLT(28))) {
5064ba319b5SDimitry Andric // available IO unlocked variants on GNU/Linux and Android P or later
5074ba319b5SDimitry Andric TLI.setAvailable(LibFunc_getc_unlocked);
5084ba319b5SDimitry Andric TLI.setAvailable(LibFunc_getchar_unlocked);
5094ba319b5SDimitry Andric TLI.setAvailable(LibFunc_putc_unlocked);
5104ba319b5SDimitry Andric TLI.setAvailable(LibFunc_putchar_unlocked);
5114ba319b5SDimitry Andric TLI.setAvailable(LibFunc_fputc_unlocked);
5124ba319b5SDimitry Andric TLI.setAvailable(LibFunc_fgetc_unlocked);
5134ba319b5SDimitry Andric TLI.setAvailable(LibFunc_fread_unlocked);
5144ba319b5SDimitry Andric TLI.setAvailable(LibFunc_fwrite_unlocked);
5154ba319b5SDimitry Andric TLI.setAvailable(LibFunc_fputs_unlocked);
5164ba319b5SDimitry Andric TLI.setAvailable(LibFunc_fgets_unlocked);
517ff0cc061SDimitry Andric }
518ff0cc061SDimitry Andric
5193ca95b02SDimitry Andric // As currently implemented in clang, NVPTX code has no standard library to
5203ca95b02SDimitry Andric // speak of. Headers provide a standard-ish library implementation, but many
5213ca95b02SDimitry Andric // of the signatures are wrong -- for example, many libm functions are not
5223ca95b02SDimitry Andric // extern "C".
5233ca95b02SDimitry Andric //
5243ca95b02SDimitry Andric // libdevice, an IR library provided by nvidia, is linked in by the front-end,
5253ca95b02SDimitry Andric // but only used functions are provided to llvm. Moreover, most of the
5263ca95b02SDimitry Andric // functions in libdevice don't map precisely to standard library functions.
5273ca95b02SDimitry Andric //
5283ca95b02SDimitry Andric // FIXME: Having no standard library prevents e.g. many fastmath
5293ca95b02SDimitry Andric // optimizations, so this situation should be fixed.
5303ca95b02SDimitry Andric if (T.isNVPTX()) {
5313ca95b02SDimitry Andric TLI.disableAllFunctions();
5327a7e6055SDimitry Andric TLI.setAvailable(LibFunc_nvvm_reflect);
5333ca95b02SDimitry Andric } else {
5347a7e6055SDimitry Andric TLI.setUnavailable(LibFunc_nvvm_reflect);
5353ca95b02SDimitry Andric }
5363ca95b02SDimitry Andric
537ff0cc061SDimitry Andric TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary);
538ff0cc061SDimitry Andric }
539ff0cc061SDimitry Andric
TargetLibraryInfoImpl()540ff0cc061SDimitry Andric TargetLibraryInfoImpl::TargetLibraryInfoImpl() {
541ff0cc061SDimitry Andric // Default to everything being available.
542ff0cc061SDimitry Andric memset(AvailableArray, -1, sizeof(AvailableArray));
543ff0cc061SDimitry Andric
544ff0cc061SDimitry Andric initialize(*this, Triple(), StandardNames);
545ff0cc061SDimitry Andric }
546ff0cc061SDimitry Andric
TargetLibraryInfoImpl(const Triple & T)547ff0cc061SDimitry Andric TargetLibraryInfoImpl::TargetLibraryInfoImpl(const Triple &T) {
548ff0cc061SDimitry Andric // Default to everything being available.
549ff0cc061SDimitry Andric memset(AvailableArray, -1, sizeof(AvailableArray));
550ff0cc061SDimitry Andric
551ff0cc061SDimitry Andric initialize(*this, T, StandardNames);
552ff0cc061SDimitry Andric }
553ff0cc061SDimitry Andric
TargetLibraryInfoImpl(const TargetLibraryInfoImpl & TLI)554ff0cc061SDimitry Andric TargetLibraryInfoImpl::TargetLibraryInfoImpl(const TargetLibraryInfoImpl &TLI)
555d88c1a5aSDimitry Andric : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
556d88c1a5aSDimitry Andric ShouldExtI32Return(TLI.ShouldExtI32Return),
557d88c1a5aSDimitry Andric ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) {
558ff0cc061SDimitry Andric memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
559ff0cc061SDimitry Andric VectorDescs = TLI.VectorDescs;
560ff0cc061SDimitry Andric ScalarDescs = TLI.ScalarDescs;
561ff0cc061SDimitry Andric }
562ff0cc061SDimitry Andric
TargetLibraryInfoImpl(TargetLibraryInfoImpl && TLI)563ff0cc061SDimitry Andric TargetLibraryInfoImpl::TargetLibraryInfoImpl(TargetLibraryInfoImpl &&TLI)
564d88c1a5aSDimitry Andric : CustomNames(std::move(TLI.CustomNames)),
565d88c1a5aSDimitry Andric ShouldExtI32Param(TLI.ShouldExtI32Param),
566d88c1a5aSDimitry Andric ShouldExtI32Return(TLI.ShouldExtI32Return),
567d88c1a5aSDimitry Andric ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) {
568ff0cc061SDimitry Andric std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
569ff0cc061SDimitry Andric AvailableArray);
570ff0cc061SDimitry Andric VectorDescs = TLI.VectorDescs;
571ff0cc061SDimitry Andric ScalarDescs = TLI.ScalarDescs;
572ff0cc061SDimitry Andric }
573ff0cc061SDimitry Andric
operator =(const TargetLibraryInfoImpl & TLI)574ff0cc061SDimitry Andric TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(const TargetLibraryInfoImpl &TLI) {
575ff0cc061SDimitry Andric CustomNames = TLI.CustomNames;
576d88c1a5aSDimitry Andric ShouldExtI32Param = TLI.ShouldExtI32Param;
577d88c1a5aSDimitry Andric ShouldExtI32Return = TLI.ShouldExtI32Return;
578d88c1a5aSDimitry Andric ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
579ff0cc061SDimitry Andric memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
580ff0cc061SDimitry Andric return *this;
581ff0cc061SDimitry Andric }
582ff0cc061SDimitry Andric
operator =(TargetLibraryInfoImpl && TLI)583ff0cc061SDimitry Andric TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(TargetLibraryInfoImpl &&TLI) {
584ff0cc061SDimitry Andric CustomNames = std::move(TLI.CustomNames);
585d88c1a5aSDimitry Andric ShouldExtI32Param = TLI.ShouldExtI32Param;
586d88c1a5aSDimitry Andric ShouldExtI32Return = TLI.ShouldExtI32Return;
587d88c1a5aSDimitry Andric ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
588ff0cc061SDimitry Andric std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
589ff0cc061SDimitry Andric AvailableArray);
590ff0cc061SDimitry Andric return *this;
591ff0cc061SDimitry Andric }
592ff0cc061SDimitry Andric
sanitizeFunctionName(StringRef funcName)593ff0cc061SDimitry Andric static StringRef sanitizeFunctionName(StringRef funcName) {
594ff0cc061SDimitry Andric // Filter out empty names and names containing null bytes, those can't be in
595ff0cc061SDimitry Andric // our table.
596ff0cc061SDimitry Andric if (funcName.empty() || funcName.find('\0') != StringRef::npos)
597ff0cc061SDimitry Andric return StringRef();
598ff0cc061SDimitry Andric
599ff0cc061SDimitry Andric // Check for \01 prefix that is used to mangle __asm declarations and
600ff0cc061SDimitry Andric // strip it if present.
6015517e702SDimitry Andric return GlobalValue::dropLLVMManglingEscape(funcName);
602ff0cc061SDimitry Andric }
603ff0cc061SDimitry Andric
getLibFunc(StringRef funcName,LibFunc & F) const604ff0cc061SDimitry Andric bool TargetLibraryInfoImpl::getLibFunc(StringRef funcName,
6057a7e6055SDimitry Andric LibFunc &F) const {
606d88c1a5aSDimitry Andric StringRef const *Start = &StandardNames[0];
6077a7e6055SDimitry Andric StringRef const *End = &StandardNames[NumLibFuncs];
608ff0cc061SDimitry Andric
609ff0cc061SDimitry Andric funcName = sanitizeFunctionName(funcName);
610ff0cc061SDimitry Andric if (funcName.empty())
611ff0cc061SDimitry Andric return false;
612ff0cc061SDimitry Andric
613d88c1a5aSDimitry Andric StringRef const *I = std::lower_bound(
614d88c1a5aSDimitry Andric Start, End, funcName, [](StringRef LHS, StringRef RHS) {
615d88c1a5aSDimitry Andric return LHS < RHS;
616ff0cc061SDimitry Andric });
617ff0cc061SDimitry Andric if (I != End && *I == funcName) {
6187a7e6055SDimitry Andric F = (LibFunc)(I - Start);
619ff0cc061SDimitry Andric return true;
620ff0cc061SDimitry Andric }
621ff0cc061SDimitry Andric return false;
622ff0cc061SDimitry Andric }
623ff0cc061SDimitry Andric
isValidProtoForLibFunc(const FunctionType & FTy,LibFunc F,const DataLayout * DL) const6243ca95b02SDimitry Andric bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
6257a7e6055SDimitry Andric LibFunc F,
6263ca95b02SDimitry Andric const DataLayout *DL) const {
6273ca95b02SDimitry Andric LLVMContext &Ctx = FTy.getContext();
6283ca95b02SDimitry Andric Type *PCharTy = Type::getInt8PtrTy(Ctx);
6293ca95b02SDimitry Andric Type *SizeTTy = DL ? DL->getIntPtrType(Ctx, /*AS=*/0) : nullptr;
6303ca95b02SDimitry Andric auto IsSizeTTy = [SizeTTy](Type *Ty) {
6313ca95b02SDimitry Andric return SizeTTy ? Ty == SizeTTy : Ty->isIntegerTy();
6323ca95b02SDimitry Andric };
6333ca95b02SDimitry Andric unsigned NumParams = FTy.getNumParams();
6343ca95b02SDimitry Andric
6353ca95b02SDimitry Andric switch (F) {
636*b5893f02SDimitry Andric case LibFunc_execl:
637*b5893f02SDimitry Andric case LibFunc_execlp:
638*b5893f02SDimitry Andric case LibFunc_execle:
639*b5893f02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
640*b5893f02SDimitry Andric FTy.getParamType(1)->isPointerTy() &&
641*b5893f02SDimitry Andric FTy.getReturnType()->isIntegerTy(32));
642*b5893f02SDimitry Andric case LibFunc_execv:
643*b5893f02SDimitry Andric case LibFunc_execvp:
644*b5893f02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
645*b5893f02SDimitry Andric FTy.getParamType(1)->isPointerTy() &&
646*b5893f02SDimitry Andric FTy.getReturnType()->isIntegerTy(32));
647*b5893f02SDimitry Andric case LibFunc_execvP:
648*b5893f02SDimitry Andric case LibFunc_execvpe:
649*b5893f02SDimitry Andric case LibFunc_execve:
650*b5893f02SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
651*b5893f02SDimitry Andric FTy.getParamType(1)->isPointerTy() &&
652*b5893f02SDimitry Andric FTy.getParamType(2)->isPointerTy() &&
653*b5893f02SDimitry Andric FTy.getReturnType()->isIntegerTy(32));
6547a7e6055SDimitry Andric case LibFunc_strlen:
6553ca95b02SDimitry Andric return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
6563ca95b02SDimitry Andric FTy.getReturnType()->isIntegerTy());
6573ca95b02SDimitry Andric
6587a7e6055SDimitry Andric case LibFunc_strchr:
6597a7e6055SDimitry Andric case LibFunc_strrchr:
6603ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
6613ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getReturnType() &&
6623ca95b02SDimitry Andric FTy.getParamType(1)->isIntegerTy());
6633ca95b02SDimitry Andric
6647a7e6055SDimitry Andric case LibFunc_strtol:
6657a7e6055SDimitry Andric case LibFunc_strtod:
6667a7e6055SDimitry Andric case LibFunc_strtof:
6677a7e6055SDimitry Andric case LibFunc_strtoul:
6687a7e6055SDimitry Andric case LibFunc_strtoll:
6697a7e6055SDimitry Andric case LibFunc_strtold:
6707a7e6055SDimitry Andric case LibFunc_strtoull:
6713ca95b02SDimitry Andric return ((NumParams == 2 || NumParams == 3) &&
6723ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
6733ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
6747a7e6055SDimitry Andric case LibFunc_strcat:
6753ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
6763ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getReturnType() &&
6773ca95b02SDimitry Andric FTy.getParamType(1) == FTy.getReturnType());
6783ca95b02SDimitry Andric
6797a7e6055SDimitry Andric case LibFunc_strncat:
6803ca95b02SDimitry Andric return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
6813ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getReturnType() &&
6823ca95b02SDimitry Andric FTy.getParamType(1) == FTy.getReturnType() &&
6832cab237bSDimitry Andric IsSizeTTy(FTy.getParamType(2)));
6843ca95b02SDimitry Andric
6857a7e6055SDimitry Andric case LibFunc_strcpy_chk:
6867a7e6055SDimitry Andric case LibFunc_stpcpy_chk:
6873ca95b02SDimitry Andric --NumParams;
6883ca95b02SDimitry Andric if (!IsSizeTTy(FTy.getParamType(NumParams)))
6893ca95b02SDimitry Andric return false;
690d88c1a5aSDimitry Andric LLVM_FALLTHROUGH;
6917a7e6055SDimitry Andric case LibFunc_strcpy:
6927a7e6055SDimitry Andric case LibFunc_stpcpy:
6933ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(0) &&
6943ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getParamType(1) &&
6953ca95b02SDimitry Andric FTy.getParamType(0) == PCharTy);
6963ca95b02SDimitry Andric
6977a7e6055SDimitry Andric case LibFunc_strncpy_chk:
6987a7e6055SDimitry Andric case LibFunc_stpncpy_chk:
6993ca95b02SDimitry Andric --NumParams;
7003ca95b02SDimitry Andric if (!IsSizeTTy(FTy.getParamType(NumParams)))
7013ca95b02SDimitry Andric return false;
702d88c1a5aSDimitry Andric LLVM_FALLTHROUGH;
7037a7e6055SDimitry Andric case LibFunc_strncpy:
7047a7e6055SDimitry Andric case LibFunc_stpncpy:
7053ca95b02SDimitry Andric return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
7063ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getParamType(1) &&
7073ca95b02SDimitry Andric FTy.getParamType(0) == PCharTy &&
7082cab237bSDimitry Andric IsSizeTTy(FTy.getParamType(2)));
7093ca95b02SDimitry Andric
7107a7e6055SDimitry Andric case LibFunc_strxfrm:
7113ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
7123ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
7133ca95b02SDimitry Andric
7147a7e6055SDimitry Andric case LibFunc_strcmp:
7153ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isIntegerTy(32) &&
7163ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
7173ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getParamType(1));
7183ca95b02SDimitry Andric
7197a7e6055SDimitry Andric case LibFunc_strncmp:
7203ca95b02SDimitry Andric return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
7213ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
7223ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getParamType(1) &&
7232cab237bSDimitry Andric IsSizeTTy(FTy.getParamType(2)));
7243ca95b02SDimitry Andric
7257a7e6055SDimitry Andric case LibFunc_strspn:
7267a7e6055SDimitry Andric case LibFunc_strcspn:
7273ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
7283ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getParamType(1) &&
7293ca95b02SDimitry Andric FTy.getReturnType()->isIntegerTy());
7303ca95b02SDimitry Andric
7317a7e6055SDimitry Andric case LibFunc_strcoll:
7327a7e6055SDimitry Andric case LibFunc_strcasecmp:
7337a7e6055SDimitry Andric case LibFunc_strncasecmp:
7343ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
7353ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
7363ca95b02SDimitry Andric
7377a7e6055SDimitry Andric case LibFunc_strstr:
7383ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
7393ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
7403ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
7413ca95b02SDimitry Andric
7427a7e6055SDimitry Andric case LibFunc_strpbrk:
7433ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
7443ca95b02SDimitry Andric FTy.getReturnType() == FTy.getParamType(0) &&
7453ca95b02SDimitry Andric FTy.getParamType(0) == FTy.getParamType(1));
7463ca95b02SDimitry Andric
7477a7e6055SDimitry Andric case LibFunc_strtok:
7487a7e6055SDimitry Andric case LibFunc_strtok_r:
7493ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
7507a7e6055SDimitry Andric case LibFunc_scanf:
7517a7e6055SDimitry Andric case LibFunc_setbuf:
7527a7e6055SDimitry Andric case LibFunc_setvbuf:
7533ca95b02SDimitry Andric return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
7547a7e6055SDimitry Andric case LibFunc_strdup:
7557a7e6055SDimitry Andric case LibFunc_strndup:
7563ca95b02SDimitry Andric return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
7573ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy());
7587a7e6055SDimitry Andric case LibFunc_sscanf:
7597a7e6055SDimitry Andric case LibFunc_stat:
7607a7e6055SDimitry Andric case LibFunc_statvfs:
7617a7e6055SDimitry Andric case LibFunc_siprintf:
7627a7e6055SDimitry Andric case LibFunc_sprintf:
7633ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
7644ba319b5SDimitry Andric FTy.getParamType(1)->isPointerTy() &&
7654ba319b5SDimitry Andric FTy.getReturnType()->isIntegerTy(32));
7667a7e6055SDimitry Andric case LibFunc_snprintf:
7673ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
7684ba319b5SDimitry Andric FTy.getParamType(2)->isPointerTy() &&
7694ba319b5SDimitry Andric FTy.getReturnType()->isIntegerTy(32));
7707a7e6055SDimitry Andric case LibFunc_setitimer:
7713ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
7723ca95b02SDimitry Andric FTy.getParamType(2)->isPointerTy());
7737a7e6055SDimitry Andric case LibFunc_system:
7743ca95b02SDimitry Andric return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
7757a7e6055SDimitry Andric case LibFunc_malloc:
7763ca95b02SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
7777a7e6055SDimitry Andric case LibFunc_memcmp:
7787a7e6055SDimitry Andric return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
7797a7e6055SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
7807a7e6055SDimitry Andric FTy.getParamType(1)->isPointerTy());
7813ca95b02SDimitry Andric
7827a7e6055SDimitry Andric case LibFunc_memchr:
7837a7e6055SDimitry Andric case LibFunc_memrchr:
7847a7e6055SDimitry Andric return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
7857a7e6055SDimitry Andric FTy.getReturnType() == FTy.getParamType(0) &&
7863ca95b02SDimitry Andric FTy.getParamType(1)->isIntegerTy(32) &&
7877a7e6055SDimitry Andric IsSizeTTy(FTy.getParamType(2)));
7887a7e6055SDimitry Andric case LibFunc_modf:
7897a7e6055SDimitry Andric case LibFunc_modff:
7907a7e6055SDimitry Andric case LibFunc_modfl:
7913ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
7923ca95b02SDimitry Andric
7937a7e6055SDimitry Andric case LibFunc_memcpy_chk:
7947a7e6055SDimitry Andric case LibFunc_memmove_chk:
7953ca95b02SDimitry Andric --NumParams;
7963ca95b02SDimitry Andric if (!IsSizeTTy(FTy.getParamType(NumParams)))
7973ca95b02SDimitry Andric return false;
798d88c1a5aSDimitry Andric LLVM_FALLTHROUGH;
7997a7e6055SDimitry Andric case LibFunc_memcpy:
8007a7e6055SDimitry Andric case LibFunc_mempcpy:
8017a7e6055SDimitry Andric case LibFunc_memmove:
8023ca95b02SDimitry Andric return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
8033ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
8043ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy() &&
8053ca95b02SDimitry Andric IsSizeTTy(FTy.getParamType(2)));
8063ca95b02SDimitry Andric
8077a7e6055SDimitry Andric case LibFunc_memset_chk:
8083ca95b02SDimitry Andric --NumParams;
8093ca95b02SDimitry Andric if (!IsSizeTTy(FTy.getParamType(NumParams)))
8103ca95b02SDimitry Andric return false;
811d88c1a5aSDimitry Andric LLVM_FALLTHROUGH;
8127a7e6055SDimitry Andric case LibFunc_memset:
8133ca95b02SDimitry Andric return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
8143ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
8153ca95b02SDimitry Andric FTy.getParamType(1)->isIntegerTy() &&
8163ca95b02SDimitry Andric IsSizeTTy(FTy.getParamType(2)));
8173ca95b02SDimitry Andric
8187a7e6055SDimitry Andric case LibFunc_memccpy:
8193ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
8207a7e6055SDimitry Andric case LibFunc_memalign:
8213ca95b02SDimitry Andric return (FTy.getReturnType()->isPointerTy());
8227a7e6055SDimitry Andric case LibFunc_realloc:
8237a7e6055SDimitry Andric case LibFunc_reallocf:
8247a7e6055SDimitry Andric return (NumParams == 2 && FTy.getReturnType() == PCharTy &&
8257a7e6055SDimitry Andric FTy.getParamType(0) == FTy.getReturnType() &&
8267a7e6055SDimitry Andric IsSizeTTy(FTy.getParamType(1)));
8277a7e6055SDimitry Andric case LibFunc_read:
8283ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
8297a7e6055SDimitry Andric case LibFunc_rewind:
8307a7e6055SDimitry Andric case LibFunc_rmdir:
8317a7e6055SDimitry Andric case LibFunc_remove:
8327a7e6055SDimitry Andric case LibFunc_realpath:
8333ca95b02SDimitry Andric return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
8347a7e6055SDimitry Andric case LibFunc_rename:
8353ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
8363ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
8377a7e6055SDimitry Andric case LibFunc_readlink:
8383ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
8393ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
8407a7e6055SDimitry Andric case LibFunc_write:
8413ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
8427a7e6055SDimitry Andric case LibFunc_bcopy:
8437a7e6055SDimitry Andric case LibFunc_bcmp:
8443ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
8453ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
8467a7e6055SDimitry Andric case LibFunc_bzero:
8473ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
8487a7e6055SDimitry Andric case LibFunc_calloc:
8493ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
8503ca95b02SDimitry Andric
8517a7e6055SDimitry Andric case LibFunc_atof:
8527a7e6055SDimitry Andric case LibFunc_atoi:
8537a7e6055SDimitry Andric case LibFunc_atol:
8547a7e6055SDimitry Andric case LibFunc_atoll:
8557a7e6055SDimitry Andric case LibFunc_ferror:
8567a7e6055SDimitry Andric case LibFunc_getenv:
8577a7e6055SDimitry Andric case LibFunc_getpwnam:
8587a7e6055SDimitry Andric case LibFunc_iprintf:
8597a7e6055SDimitry Andric case LibFunc_pclose:
8607a7e6055SDimitry Andric case LibFunc_perror:
8617a7e6055SDimitry Andric case LibFunc_printf:
8627a7e6055SDimitry Andric case LibFunc_puts:
8637a7e6055SDimitry Andric case LibFunc_uname:
8647a7e6055SDimitry Andric case LibFunc_under_IO_getc:
8657a7e6055SDimitry Andric case LibFunc_unlink:
8667a7e6055SDimitry Andric case LibFunc_unsetenv:
8673ca95b02SDimitry Andric return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
8683ca95b02SDimitry Andric
8697a7e6055SDimitry Andric case LibFunc_access:
8707a7e6055SDimitry Andric case LibFunc_chmod:
8717a7e6055SDimitry Andric case LibFunc_chown:
8727a7e6055SDimitry Andric case LibFunc_clearerr:
8737a7e6055SDimitry Andric case LibFunc_closedir:
8747a7e6055SDimitry Andric case LibFunc_ctermid:
8757a7e6055SDimitry Andric case LibFunc_fclose:
8767a7e6055SDimitry Andric case LibFunc_feof:
8777a7e6055SDimitry Andric case LibFunc_fflush:
8787a7e6055SDimitry Andric case LibFunc_fgetc:
8794ba319b5SDimitry Andric case LibFunc_fgetc_unlocked:
8807a7e6055SDimitry Andric case LibFunc_fileno:
8817a7e6055SDimitry Andric case LibFunc_flockfile:
8827a7e6055SDimitry Andric case LibFunc_free:
8837a7e6055SDimitry Andric case LibFunc_fseek:
8847a7e6055SDimitry Andric case LibFunc_fseeko64:
8857a7e6055SDimitry Andric case LibFunc_fseeko:
8867a7e6055SDimitry Andric case LibFunc_fsetpos:
8877a7e6055SDimitry Andric case LibFunc_ftell:
8887a7e6055SDimitry Andric case LibFunc_ftello64:
8897a7e6055SDimitry Andric case LibFunc_ftello:
8907a7e6055SDimitry Andric case LibFunc_ftrylockfile:
8917a7e6055SDimitry Andric case LibFunc_funlockfile:
8927a7e6055SDimitry Andric case LibFunc_getc:
8937a7e6055SDimitry Andric case LibFunc_getc_unlocked:
8947a7e6055SDimitry Andric case LibFunc_getlogin_r:
8957a7e6055SDimitry Andric case LibFunc_mkdir:
8967a7e6055SDimitry Andric case LibFunc_mktime:
8977a7e6055SDimitry Andric case LibFunc_times:
8983ca95b02SDimitry Andric return (NumParams != 0 && FTy.getParamType(0)->isPointerTy());
8993ca95b02SDimitry Andric
9007a7e6055SDimitry Andric case LibFunc_fopen:
9013ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
9023ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
9033ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
904*b5893f02SDimitry Andric case LibFunc_fork:
905*b5893f02SDimitry Andric return (NumParams == 0 && FTy.getReturnType()->isIntegerTy(32));
9067a7e6055SDimitry Andric case LibFunc_fdopen:
9073ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
9083ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
9097a7e6055SDimitry Andric case LibFunc_fputc:
9104ba319b5SDimitry Andric case LibFunc_fputc_unlocked:
9117a7e6055SDimitry Andric case LibFunc_fstat:
9127a7e6055SDimitry Andric case LibFunc_frexp:
9137a7e6055SDimitry Andric case LibFunc_frexpf:
9147a7e6055SDimitry Andric case LibFunc_frexpl:
9157a7e6055SDimitry Andric case LibFunc_fstatvfs:
9163ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
9177a7e6055SDimitry Andric case LibFunc_fgets:
9184ba319b5SDimitry Andric case LibFunc_fgets_unlocked:
9193ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
9203ca95b02SDimitry Andric FTy.getParamType(2)->isPointerTy());
9217a7e6055SDimitry Andric case LibFunc_fread:
9224ba319b5SDimitry Andric case LibFunc_fread_unlocked:
9233ca95b02SDimitry Andric return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
9243ca95b02SDimitry Andric FTy.getParamType(3)->isPointerTy());
9257a7e6055SDimitry Andric case LibFunc_fwrite:
9264ba319b5SDimitry Andric case LibFunc_fwrite_unlocked:
9273ca95b02SDimitry Andric return (NumParams == 4 && FTy.getReturnType()->isIntegerTy() &&
9283ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
9293ca95b02SDimitry Andric FTy.getParamType(1)->isIntegerTy() &&
9303ca95b02SDimitry Andric FTy.getParamType(2)->isIntegerTy() &&
9313ca95b02SDimitry Andric FTy.getParamType(3)->isPointerTy());
9327a7e6055SDimitry Andric case LibFunc_fputs:
9334ba319b5SDimitry Andric case LibFunc_fputs_unlocked:
9343ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
9353ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
9367a7e6055SDimitry Andric case LibFunc_fscanf:
9377a7e6055SDimitry Andric case LibFunc_fiprintf:
9387a7e6055SDimitry Andric case LibFunc_fprintf:
9397a7e6055SDimitry Andric return (NumParams >= 2 && FTy.getReturnType()->isIntegerTy() &&
9407a7e6055SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
9417a7e6055SDimitry Andric FTy.getParamType(1)->isPointerTy());
9427a7e6055SDimitry Andric case LibFunc_fgetpos:
9433ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
9443ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
9457a7e6055SDimitry Andric case LibFunc_getchar:
9464ba319b5SDimitry Andric case LibFunc_getchar_unlocked:
9477a7e6055SDimitry Andric return (NumParams == 0 && FTy.getReturnType()->isIntegerTy());
9487a7e6055SDimitry Andric case LibFunc_gets:
9497a7e6055SDimitry Andric return (NumParams == 1 && FTy.getParamType(0) == PCharTy);
9507a7e6055SDimitry Andric case LibFunc_getitimer:
9513ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
9527a7e6055SDimitry Andric case LibFunc_ungetc:
9533ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
9547a7e6055SDimitry Andric case LibFunc_utime:
9557a7e6055SDimitry Andric case LibFunc_utimes:
9563ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
9573ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
9587a7e6055SDimitry Andric case LibFunc_putc:
9594ba319b5SDimitry Andric case LibFunc_putc_unlocked:
9603ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
9617a7e6055SDimitry Andric case LibFunc_pread:
9627a7e6055SDimitry Andric case LibFunc_pwrite:
9633ca95b02SDimitry Andric return (NumParams == 4 && FTy.getParamType(1)->isPointerTy());
9647a7e6055SDimitry Andric case LibFunc_popen:
9653ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
9663ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
9673ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
9687a7e6055SDimitry Andric case LibFunc_vscanf:
9693ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
9707a7e6055SDimitry Andric case LibFunc_vsscanf:
9713ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
9723ca95b02SDimitry Andric FTy.getParamType(2)->isPointerTy());
9737a7e6055SDimitry Andric case LibFunc_vfscanf:
9743ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
9753ca95b02SDimitry Andric FTy.getParamType(2)->isPointerTy());
9767a7e6055SDimitry Andric case LibFunc_valloc:
9773ca95b02SDimitry Andric return (FTy.getReturnType()->isPointerTy());
9787a7e6055SDimitry Andric case LibFunc_vprintf:
9793ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
9807a7e6055SDimitry Andric case LibFunc_vfprintf:
9817a7e6055SDimitry Andric case LibFunc_vsprintf:
9823ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
9833ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
9847a7e6055SDimitry Andric case LibFunc_vsnprintf:
9853ca95b02SDimitry Andric return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
9863ca95b02SDimitry Andric FTy.getParamType(2)->isPointerTy());
9877a7e6055SDimitry Andric case LibFunc_open:
9883ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
9897a7e6055SDimitry Andric case LibFunc_opendir:
9903ca95b02SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isPointerTy() &&
9913ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy());
9927a7e6055SDimitry Andric case LibFunc_tmpfile:
9933ca95b02SDimitry Andric return (FTy.getReturnType()->isPointerTy());
9947a7e6055SDimitry Andric case LibFunc_htonl:
9957a7e6055SDimitry Andric case LibFunc_ntohl:
9967a7e6055SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
9977a7e6055SDimitry Andric FTy.getReturnType() == FTy.getParamType(0));
9987a7e6055SDimitry Andric case LibFunc_htons:
9997a7e6055SDimitry Andric case LibFunc_ntohs:
10007a7e6055SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(16) &&
10017a7e6055SDimitry Andric FTy.getReturnType() == FTy.getParamType(0));
10027a7e6055SDimitry Andric case LibFunc_lstat:
10033ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
10043ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
10057a7e6055SDimitry Andric case LibFunc_lchown:
10063ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
10077a7e6055SDimitry Andric case LibFunc_qsort:
10083ca95b02SDimitry Andric return (NumParams == 4 && FTy.getParamType(3)->isPointerTy());
10097a7e6055SDimitry Andric case LibFunc_dunder_strdup:
10107a7e6055SDimitry Andric case LibFunc_dunder_strndup:
10113ca95b02SDimitry Andric return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
10123ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy());
10137a7e6055SDimitry Andric case LibFunc_dunder_strtok_r:
10143ca95b02SDimitry Andric return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
10157a7e6055SDimitry Andric case LibFunc_under_IO_putc:
10163ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
10177a7e6055SDimitry Andric case LibFunc_dunder_isoc99_scanf:
10183ca95b02SDimitry Andric return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
10197a7e6055SDimitry Andric case LibFunc_stat64:
10207a7e6055SDimitry Andric case LibFunc_lstat64:
10217a7e6055SDimitry Andric case LibFunc_statvfs64:
1022d88c1a5aSDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
10233ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
10247a7e6055SDimitry Andric case LibFunc_dunder_isoc99_sscanf:
1025d88c1a5aSDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
10263ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
10277a7e6055SDimitry Andric case LibFunc_fopen64:
10283ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
10293ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
10303ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
10317a7e6055SDimitry Andric case LibFunc_tmpfile64:
10323ca95b02SDimitry Andric return (FTy.getReturnType()->isPointerTy());
10337a7e6055SDimitry Andric case LibFunc_fstat64:
10347a7e6055SDimitry Andric case LibFunc_fstatvfs64:
10353ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
10367a7e6055SDimitry Andric case LibFunc_open64:
10373ca95b02SDimitry Andric return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
10387a7e6055SDimitry Andric case LibFunc_gettimeofday:
10393ca95b02SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
10403ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy());
10413ca95b02SDimitry Andric
10427a7e6055SDimitry Andric // new(unsigned int);
10437a7e6055SDimitry Andric case LibFunc_Znwj:
10447a7e6055SDimitry Andric // new(unsigned long);
10457a7e6055SDimitry Andric case LibFunc_Znwm:
10467a7e6055SDimitry Andric // new[](unsigned int);
10477a7e6055SDimitry Andric case LibFunc_Znaj:
10487a7e6055SDimitry Andric // new[](unsigned long);
10497a7e6055SDimitry Andric case LibFunc_Znam:
10507a7e6055SDimitry Andric // new(unsigned int);
10517a7e6055SDimitry Andric case LibFunc_msvc_new_int:
10527a7e6055SDimitry Andric // new(unsigned long long);
10537a7e6055SDimitry Andric case LibFunc_msvc_new_longlong:
10547a7e6055SDimitry Andric // new[](unsigned int);
10557a7e6055SDimitry Andric case LibFunc_msvc_new_array_int:
10567a7e6055SDimitry Andric // new[](unsigned long long);
10577a7e6055SDimitry Andric case LibFunc_msvc_new_array_longlong:
10587a7e6055SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
10593ca95b02SDimitry Andric
10607a7e6055SDimitry Andric // new(unsigned int, nothrow);
10617a7e6055SDimitry Andric case LibFunc_ZnwjRKSt9nothrow_t:
10627a7e6055SDimitry Andric // new(unsigned long, nothrow);
10637a7e6055SDimitry Andric case LibFunc_ZnwmRKSt9nothrow_t:
10647a7e6055SDimitry Andric // new[](unsigned int, nothrow);
10657a7e6055SDimitry Andric case LibFunc_ZnajRKSt9nothrow_t:
10667a7e6055SDimitry Andric // new[](unsigned long, nothrow);
10677a7e6055SDimitry Andric case LibFunc_ZnamRKSt9nothrow_t:
10687a7e6055SDimitry Andric // new(unsigned int, nothrow);
10697a7e6055SDimitry Andric case LibFunc_msvc_new_int_nothrow:
10707a7e6055SDimitry Andric // new(unsigned long long, nothrow);
10717a7e6055SDimitry Andric case LibFunc_msvc_new_longlong_nothrow:
10727a7e6055SDimitry Andric // new[](unsigned int, nothrow);
10737a7e6055SDimitry Andric case LibFunc_msvc_new_array_int_nothrow:
10747a7e6055SDimitry Andric // new[](unsigned long long, nothrow);
10757a7e6055SDimitry Andric case LibFunc_msvc_new_array_longlong_nothrow:
10764ba319b5SDimitry Andric // new(unsigned int, align_val_t)
10774ba319b5SDimitry Andric case LibFunc_ZnwjSt11align_val_t:
10784ba319b5SDimitry Andric // new(unsigned long, align_val_t)
10794ba319b5SDimitry Andric case LibFunc_ZnwmSt11align_val_t:
10804ba319b5SDimitry Andric // new[](unsigned int, align_val_t)
10814ba319b5SDimitry Andric case LibFunc_ZnajSt11align_val_t:
10824ba319b5SDimitry Andric // new[](unsigned long, align_val_t)
10834ba319b5SDimitry Andric case LibFunc_ZnamSt11align_val_t:
10847a7e6055SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
10857a7e6055SDimitry Andric
10864ba319b5SDimitry Andric // new(unsigned int, align_val_t, nothrow)
10874ba319b5SDimitry Andric case LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t:
10884ba319b5SDimitry Andric // new(unsigned long, align_val_t, nothrow)
10894ba319b5SDimitry Andric case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
10904ba319b5SDimitry Andric // new[](unsigned int, align_val_t, nothrow)
10914ba319b5SDimitry Andric case LibFunc_ZnajSt11align_val_tRKSt9nothrow_t:
10924ba319b5SDimitry Andric // new[](unsigned long, align_val_t, nothrow)
10934ba319b5SDimitry Andric case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
10944ba319b5SDimitry Andric return (NumParams == 3 && FTy.getReturnType()->isPointerTy());
10954ba319b5SDimitry Andric
10967a7e6055SDimitry Andric // void operator delete[](void*);
10977a7e6055SDimitry Andric case LibFunc_ZdaPv:
10987a7e6055SDimitry Andric // void operator delete(void*);
10997a7e6055SDimitry Andric case LibFunc_ZdlPv:
11007a7e6055SDimitry Andric // void operator delete[](void*);
11017a7e6055SDimitry Andric case LibFunc_msvc_delete_array_ptr32:
11027a7e6055SDimitry Andric // void operator delete[](void*);
11037a7e6055SDimitry Andric case LibFunc_msvc_delete_array_ptr64:
11047a7e6055SDimitry Andric // void operator delete(void*);
11057a7e6055SDimitry Andric case LibFunc_msvc_delete_ptr32:
11067a7e6055SDimitry Andric // void operator delete(void*);
11077a7e6055SDimitry Andric case LibFunc_msvc_delete_ptr64:
11087a7e6055SDimitry Andric return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
11097a7e6055SDimitry Andric
11107a7e6055SDimitry Andric // void operator delete[](void*, nothrow);
11117a7e6055SDimitry Andric case LibFunc_ZdaPvRKSt9nothrow_t:
11127a7e6055SDimitry Andric // void operator delete[](void*, unsigned int);
11137a7e6055SDimitry Andric case LibFunc_ZdaPvj:
11147a7e6055SDimitry Andric // void operator delete[](void*, unsigned long);
11157a7e6055SDimitry Andric case LibFunc_ZdaPvm:
11167a7e6055SDimitry Andric // void operator delete(void*, nothrow);
11177a7e6055SDimitry Andric case LibFunc_ZdlPvRKSt9nothrow_t:
11187a7e6055SDimitry Andric // void operator delete(void*, unsigned int);
11197a7e6055SDimitry Andric case LibFunc_ZdlPvj:
11207a7e6055SDimitry Andric // void operator delete(void*, unsigned long);
11217a7e6055SDimitry Andric case LibFunc_ZdlPvm:
11224ba319b5SDimitry Andric // void operator delete(void*, align_val_t)
11234ba319b5SDimitry Andric case LibFunc_ZdlPvSt11align_val_t:
11244ba319b5SDimitry Andric // void operator delete[](void*, align_val_t)
11254ba319b5SDimitry Andric case LibFunc_ZdaPvSt11align_val_t:
11267a7e6055SDimitry Andric // void operator delete[](void*, unsigned int);
11277a7e6055SDimitry Andric case LibFunc_msvc_delete_array_ptr32_int:
11287a7e6055SDimitry Andric // void operator delete[](void*, nothrow);
11297a7e6055SDimitry Andric case LibFunc_msvc_delete_array_ptr32_nothrow:
11307a7e6055SDimitry Andric // void operator delete[](void*, unsigned long long);
11317a7e6055SDimitry Andric case LibFunc_msvc_delete_array_ptr64_longlong:
11327a7e6055SDimitry Andric // void operator delete[](void*, nothrow);
11337a7e6055SDimitry Andric case LibFunc_msvc_delete_array_ptr64_nothrow:
11347a7e6055SDimitry Andric // void operator delete(void*, unsigned int);
11357a7e6055SDimitry Andric case LibFunc_msvc_delete_ptr32_int:
11367a7e6055SDimitry Andric // void operator delete(void*, nothrow);
11377a7e6055SDimitry Andric case LibFunc_msvc_delete_ptr32_nothrow:
11387a7e6055SDimitry Andric // void operator delete(void*, unsigned long long);
11397a7e6055SDimitry Andric case LibFunc_msvc_delete_ptr64_longlong:
11407a7e6055SDimitry Andric // void operator delete(void*, nothrow);
11417a7e6055SDimitry Andric case LibFunc_msvc_delete_ptr64_nothrow:
11427a7e6055SDimitry Andric return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
11437a7e6055SDimitry Andric
11444ba319b5SDimitry Andric // void operator delete(void*, align_val_t, nothrow)
11454ba319b5SDimitry Andric case LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t:
11464ba319b5SDimitry Andric // void operator delete[](void*, align_val_t, nothrow)
11474ba319b5SDimitry Andric case LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t:
11484ba319b5SDimitry Andric return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
11494ba319b5SDimitry Andric
11507a7e6055SDimitry Andric case LibFunc_memset_pattern16:
11513ca95b02SDimitry Andric return (!FTy.isVarArg() && NumParams == 3 &&
11527a7e6055SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
11537a7e6055SDimitry Andric FTy.getParamType(1)->isPointerTy() &&
11547a7e6055SDimitry Andric FTy.getParamType(2)->isIntegerTy());
11553ca95b02SDimitry Andric
11567a7e6055SDimitry Andric case LibFunc_cxa_guard_abort:
11577a7e6055SDimitry Andric case LibFunc_cxa_guard_acquire:
11587a7e6055SDimitry Andric case LibFunc_cxa_guard_release:
11597a7e6055SDimitry Andric case LibFunc_nvvm_reflect:
11607a7e6055SDimitry Andric return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
11613ca95b02SDimitry Andric
11627a7e6055SDimitry Andric case LibFunc_sincospi_stret:
11637a7e6055SDimitry Andric case LibFunc_sincospif_stret:
11647a7e6055SDimitry Andric return (NumParams == 1 && FTy.getParamType(0)->isFloatingPointTy());
11657a7e6055SDimitry Andric
11667a7e6055SDimitry Andric case LibFunc_acos:
11675517e702SDimitry Andric case LibFunc_acos_finite:
11687a7e6055SDimitry Andric case LibFunc_acosf:
11695517e702SDimitry Andric case LibFunc_acosf_finite:
11707a7e6055SDimitry Andric case LibFunc_acosh:
11715517e702SDimitry Andric case LibFunc_acosh_finite:
11727a7e6055SDimitry Andric case LibFunc_acoshf:
11735517e702SDimitry Andric case LibFunc_acoshf_finite:
11747a7e6055SDimitry Andric case LibFunc_acoshl:
11755517e702SDimitry Andric case LibFunc_acoshl_finite:
11767a7e6055SDimitry Andric case LibFunc_acosl:
11775517e702SDimitry Andric case LibFunc_acosl_finite:
11787a7e6055SDimitry Andric case LibFunc_asin:
11795517e702SDimitry Andric case LibFunc_asin_finite:
11807a7e6055SDimitry Andric case LibFunc_asinf:
11815517e702SDimitry Andric case LibFunc_asinf_finite:
11827a7e6055SDimitry Andric case LibFunc_asinh:
11837a7e6055SDimitry Andric case LibFunc_asinhf:
11847a7e6055SDimitry Andric case LibFunc_asinhl:
11857a7e6055SDimitry Andric case LibFunc_asinl:
11865517e702SDimitry Andric case LibFunc_asinl_finite:
11877a7e6055SDimitry Andric case LibFunc_atan:
11887a7e6055SDimitry Andric case LibFunc_atanf:
11897a7e6055SDimitry Andric case LibFunc_atanh:
11905517e702SDimitry Andric case LibFunc_atanh_finite:
11917a7e6055SDimitry Andric case LibFunc_atanhf:
11925517e702SDimitry Andric case LibFunc_atanhf_finite:
11937a7e6055SDimitry Andric case LibFunc_atanhl:
11945517e702SDimitry Andric case LibFunc_atanhl_finite:
11957a7e6055SDimitry Andric case LibFunc_atanl:
11967a7e6055SDimitry Andric case LibFunc_cbrt:
11977a7e6055SDimitry Andric case LibFunc_cbrtf:
11987a7e6055SDimitry Andric case LibFunc_cbrtl:
11997a7e6055SDimitry Andric case LibFunc_ceil:
12007a7e6055SDimitry Andric case LibFunc_ceilf:
12017a7e6055SDimitry Andric case LibFunc_ceill:
12027a7e6055SDimitry Andric case LibFunc_cos:
12037a7e6055SDimitry Andric case LibFunc_cosf:
12047a7e6055SDimitry Andric case LibFunc_cosh:
12055517e702SDimitry Andric case LibFunc_cosh_finite:
12067a7e6055SDimitry Andric case LibFunc_coshf:
12075517e702SDimitry Andric case LibFunc_coshf_finite:
12087a7e6055SDimitry Andric case LibFunc_coshl:
12095517e702SDimitry Andric case LibFunc_coshl_finite:
12107a7e6055SDimitry Andric case LibFunc_cosl:
12117a7e6055SDimitry Andric case LibFunc_exp10:
12125517e702SDimitry Andric case LibFunc_exp10_finite:
12137a7e6055SDimitry Andric case LibFunc_exp10f:
12145517e702SDimitry Andric case LibFunc_exp10f_finite:
12157a7e6055SDimitry Andric case LibFunc_exp10l:
12165517e702SDimitry Andric case LibFunc_exp10l_finite:
12177a7e6055SDimitry Andric case LibFunc_exp2:
12185517e702SDimitry Andric case LibFunc_exp2_finite:
12197a7e6055SDimitry Andric case LibFunc_exp2f:
12205517e702SDimitry Andric case LibFunc_exp2f_finite:
12217a7e6055SDimitry Andric case LibFunc_exp2l:
12225517e702SDimitry Andric case LibFunc_exp2l_finite:
12237a7e6055SDimitry Andric case LibFunc_exp:
12245517e702SDimitry Andric case LibFunc_exp_finite:
12257a7e6055SDimitry Andric case LibFunc_expf:
12265517e702SDimitry Andric case LibFunc_expf_finite:
12277a7e6055SDimitry Andric case LibFunc_expl:
12285517e702SDimitry Andric case LibFunc_expl_finite:
12297a7e6055SDimitry Andric case LibFunc_expm1:
12307a7e6055SDimitry Andric case LibFunc_expm1f:
12317a7e6055SDimitry Andric case LibFunc_expm1l:
12327a7e6055SDimitry Andric case LibFunc_fabs:
12337a7e6055SDimitry Andric case LibFunc_fabsf:
12347a7e6055SDimitry Andric case LibFunc_fabsl:
12357a7e6055SDimitry Andric case LibFunc_floor:
12367a7e6055SDimitry Andric case LibFunc_floorf:
12377a7e6055SDimitry Andric case LibFunc_floorl:
12387a7e6055SDimitry Andric case LibFunc_log10:
12395517e702SDimitry Andric case LibFunc_log10_finite:
12407a7e6055SDimitry Andric case LibFunc_log10f:
12415517e702SDimitry Andric case LibFunc_log10f_finite:
12427a7e6055SDimitry Andric case LibFunc_log10l:
12435517e702SDimitry Andric case LibFunc_log10l_finite:
12447a7e6055SDimitry Andric case LibFunc_log1p:
12457a7e6055SDimitry Andric case LibFunc_log1pf:
12467a7e6055SDimitry Andric case LibFunc_log1pl:
12477a7e6055SDimitry Andric case LibFunc_log2:
12485517e702SDimitry Andric case LibFunc_log2_finite:
12497a7e6055SDimitry Andric case LibFunc_log2f:
12505517e702SDimitry Andric case LibFunc_log2f_finite:
12517a7e6055SDimitry Andric case LibFunc_log2l:
12525517e702SDimitry Andric case LibFunc_log2l_finite:
12537a7e6055SDimitry Andric case LibFunc_log:
12545517e702SDimitry Andric case LibFunc_log_finite:
12557a7e6055SDimitry Andric case LibFunc_logb:
12567a7e6055SDimitry Andric case LibFunc_logbf:
12577a7e6055SDimitry Andric case LibFunc_logbl:
12587a7e6055SDimitry Andric case LibFunc_logf:
12595517e702SDimitry Andric case LibFunc_logf_finite:
12607a7e6055SDimitry Andric case LibFunc_logl:
12615517e702SDimitry Andric case LibFunc_logl_finite:
12627a7e6055SDimitry Andric case LibFunc_nearbyint:
12637a7e6055SDimitry Andric case LibFunc_nearbyintf:
12647a7e6055SDimitry Andric case LibFunc_nearbyintl:
12657a7e6055SDimitry Andric case LibFunc_rint:
12667a7e6055SDimitry Andric case LibFunc_rintf:
12677a7e6055SDimitry Andric case LibFunc_rintl:
12687a7e6055SDimitry Andric case LibFunc_round:
12697a7e6055SDimitry Andric case LibFunc_roundf:
12707a7e6055SDimitry Andric case LibFunc_roundl:
12717a7e6055SDimitry Andric case LibFunc_sin:
12727a7e6055SDimitry Andric case LibFunc_sinf:
12737a7e6055SDimitry Andric case LibFunc_sinh:
12745517e702SDimitry Andric case LibFunc_sinh_finite:
12757a7e6055SDimitry Andric case LibFunc_sinhf:
12765517e702SDimitry Andric case LibFunc_sinhf_finite:
12777a7e6055SDimitry Andric case LibFunc_sinhl:
12785517e702SDimitry Andric case LibFunc_sinhl_finite:
12797a7e6055SDimitry Andric case LibFunc_sinl:
12807a7e6055SDimitry Andric case LibFunc_sqrt:
12817a7e6055SDimitry Andric case LibFunc_sqrt_finite:
12827a7e6055SDimitry Andric case LibFunc_sqrtf:
12837a7e6055SDimitry Andric case LibFunc_sqrtf_finite:
12847a7e6055SDimitry Andric case LibFunc_sqrtl:
12857a7e6055SDimitry Andric case LibFunc_sqrtl_finite:
12867a7e6055SDimitry Andric case LibFunc_tan:
12877a7e6055SDimitry Andric case LibFunc_tanf:
12887a7e6055SDimitry Andric case LibFunc_tanh:
12897a7e6055SDimitry Andric case LibFunc_tanhf:
12907a7e6055SDimitry Andric case LibFunc_tanhl:
12917a7e6055SDimitry Andric case LibFunc_tanl:
12927a7e6055SDimitry Andric case LibFunc_trunc:
12937a7e6055SDimitry Andric case LibFunc_truncf:
12947a7e6055SDimitry Andric case LibFunc_truncl:
12953ca95b02SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isFloatingPointTy() &&
12963ca95b02SDimitry Andric FTy.getReturnType() == FTy.getParamType(0));
12973ca95b02SDimitry Andric
12987a7e6055SDimitry Andric case LibFunc_atan2:
12995517e702SDimitry Andric case LibFunc_atan2_finite:
13007a7e6055SDimitry Andric case LibFunc_atan2f:
13015517e702SDimitry Andric case LibFunc_atan2f_finite:
13027a7e6055SDimitry Andric case LibFunc_atan2l:
13035517e702SDimitry Andric case LibFunc_atan2l_finite:
13047a7e6055SDimitry Andric case LibFunc_fmin:
13057a7e6055SDimitry Andric case LibFunc_fminf:
13067a7e6055SDimitry Andric case LibFunc_fminl:
13077a7e6055SDimitry Andric case LibFunc_fmax:
13087a7e6055SDimitry Andric case LibFunc_fmaxf:
13097a7e6055SDimitry Andric case LibFunc_fmaxl:
13107a7e6055SDimitry Andric case LibFunc_fmod:
13117a7e6055SDimitry Andric case LibFunc_fmodf:
13127a7e6055SDimitry Andric case LibFunc_fmodl:
13137a7e6055SDimitry Andric case LibFunc_copysign:
13147a7e6055SDimitry Andric case LibFunc_copysignf:
13157a7e6055SDimitry Andric case LibFunc_copysignl:
13167a7e6055SDimitry Andric case LibFunc_pow:
13175517e702SDimitry Andric case LibFunc_pow_finite:
13187a7e6055SDimitry Andric case LibFunc_powf:
13195517e702SDimitry Andric case LibFunc_powf_finite:
13207a7e6055SDimitry Andric case LibFunc_powl:
13215517e702SDimitry Andric case LibFunc_powl_finite:
13223ca95b02SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
13233ca95b02SDimitry Andric FTy.getReturnType() == FTy.getParamType(0) &&
13243ca95b02SDimitry Andric FTy.getReturnType() == FTy.getParamType(1));
13253ca95b02SDimitry Andric
13267a7e6055SDimitry Andric case LibFunc_ldexp:
13277a7e6055SDimitry Andric case LibFunc_ldexpf:
13287a7e6055SDimitry Andric case LibFunc_ldexpl:
13297a7e6055SDimitry Andric return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
13307a7e6055SDimitry Andric FTy.getReturnType() == FTy.getParamType(0) &&
13317a7e6055SDimitry Andric FTy.getParamType(1)->isIntegerTy(32));
13327a7e6055SDimitry Andric
13337a7e6055SDimitry Andric case LibFunc_ffs:
13347a7e6055SDimitry Andric case LibFunc_ffsl:
13357a7e6055SDimitry Andric case LibFunc_ffsll:
13367a7e6055SDimitry Andric case LibFunc_fls:
13377a7e6055SDimitry Andric case LibFunc_flsl:
13387a7e6055SDimitry Andric case LibFunc_flsll:
1339d88c1a5aSDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
1340d88c1a5aSDimitry Andric FTy.getParamType(0)->isIntegerTy());
1341d88c1a5aSDimitry Andric
13427a7e6055SDimitry Andric case LibFunc_isdigit:
13437a7e6055SDimitry Andric case LibFunc_isascii:
13447a7e6055SDimitry Andric case LibFunc_toascii:
13457a7e6055SDimitry Andric case LibFunc_putchar:
13464ba319b5SDimitry Andric case LibFunc_putchar_unlocked:
13473ca95b02SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
1348d88c1a5aSDimitry Andric FTy.getReturnType() == FTy.getParamType(0));
13493ca95b02SDimitry Andric
13507a7e6055SDimitry Andric case LibFunc_abs:
13517a7e6055SDimitry Andric case LibFunc_labs:
13527a7e6055SDimitry Andric case LibFunc_llabs:
13533ca95b02SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isIntegerTy() &&
13543ca95b02SDimitry Andric FTy.getReturnType() == FTy.getParamType(0));
13553ca95b02SDimitry Andric
13567a7e6055SDimitry Andric case LibFunc_cxa_atexit:
13573ca95b02SDimitry Andric return (NumParams == 3 && FTy.getReturnType()->isIntegerTy() &&
13583ca95b02SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
13593ca95b02SDimitry Andric FTy.getParamType(1)->isPointerTy() &&
13603ca95b02SDimitry Andric FTy.getParamType(2)->isPointerTy());
13613ca95b02SDimitry Andric
13627a7e6055SDimitry Andric case LibFunc_sinpi:
13637a7e6055SDimitry Andric case LibFunc_cospi:
13643ca95b02SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isDoubleTy() &&
13653ca95b02SDimitry Andric FTy.getReturnType() == FTy.getParamType(0));
13663ca95b02SDimitry Andric
13677a7e6055SDimitry Andric case LibFunc_sinpif:
13687a7e6055SDimitry Andric case LibFunc_cospif:
13693ca95b02SDimitry Andric return (NumParams == 1 && FTy.getReturnType()->isFloatTy() &&
13703ca95b02SDimitry Andric FTy.getReturnType() == FTy.getParamType(0));
13713ca95b02SDimitry Andric
13727a7e6055SDimitry Andric case LibFunc_strnlen:
13737a7e6055SDimitry Andric return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(1) &&
13747a7e6055SDimitry Andric FTy.getParamType(0) == PCharTy &&
13757a7e6055SDimitry Andric FTy.getParamType(1) == SizeTTy);
13767a7e6055SDimitry Andric
13777a7e6055SDimitry Andric case LibFunc_posix_memalign:
13787a7e6055SDimitry Andric return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
13797a7e6055SDimitry Andric FTy.getParamType(0)->isPointerTy() &&
13807a7e6055SDimitry Andric FTy.getParamType(1) == SizeTTy && FTy.getParamType(2) == SizeTTy);
13817a7e6055SDimitry Andric
13820f5676f4SDimitry Andric case LibFunc_wcslen:
13830f5676f4SDimitry Andric return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
13840f5676f4SDimitry Andric FTy.getReturnType()->isIntegerTy());
13850f5676f4SDimitry Andric
13862cab237bSDimitry Andric case LibFunc_cabs:
13872cab237bSDimitry Andric case LibFunc_cabsf:
13882cab237bSDimitry Andric case LibFunc_cabsl: {
13892cab237bSDimitry Andric Type* RetTy = FTy.getReturnType();
13902cab237bSDimitry Andric if (!RetTy->isFloatingPointTy())
13912cab237bSDimitry Andric return false;
13922cab237bSDimitry Andric
13932cab237bSDimitry Andric // NOTE: These prototypes are target specific and currently support
13942cab237bSDimitry Andric // "complex" passed as an array or discrete real & imaginary parameters.
13952cab237bSDimitry Andric // Add other calling conventions to enable libcall optimizations.
13962cab237bSDimitry Andric if (NumParams == 1)
13972cab237bSDimitry Andric return (FTy.getParamType(0)->isArrayTy() &&
13982cab237bSDimitry Andric FTy.getParamType(0)->getArrayNumElements() == 2 &&
13992cab237bSDimitry Andric FTy.getParamType(0)->getArrayElementType() == RetTy);
14002cab237bSDimitry Andric else if (NumParams == 2)
14012cab237bSDimitry Andric return (FTy.getParamType(0) == RetTy && FTy.getParamType(1) == RetTy);
14022cab237bSDimitry Andric else
14032cab237bSDimitry Andric return false;
14042cab237bSDimitry Andric }
14057a7e6055SDimitry Andric case LibFunc::NumLibFuncs:
14067a7e6055SDimitry Andric break;
14073ca95b02SDimitry Andric }
14087a7e6055SDimitry Andric
14097a7e6055SDimitry Andric llvm_unreachable("Invalid libfunc");
14103ca95b02SDimitry Andric }
14113ca95b02SDimitry Andric
getLibFunc(const Function & FDecl,LibFunc & F) const14123ca95b02SDimitry Andric bool TargetLibraryInfoImpl::getLibFunc(const Function &FDecl,
14137a7e6055SDimitry Andric LibFunc &F) const {
14143ca95b02SDimitry Andric const DataLayout *DL =
14153ca95b02SDimitry Andric FDecl.getParent() ? &FDecl.getParent()->getDataLayout() : nullptr;
14163ca95b02SDimitry Andric return getLibFunc(FDecl.getName(), F) &&
14173ca95b02SDimitry Andric isValidProtoForLibFunc(*FDecl.getFunctionType(), F, DL);
14183ca95b02SDimitry Andric }
14193ca95b02SDimitry Andric
disableAllFunctions()1420ff0cc061SDimitry Andric void TargetLibraryInfoImpl::disableAllFunctions() {
1421ff0cc061SDimitry Andric memset(AvailableArray, 0, sizeof(AvailableArray));
1422ff0cc061SDimitry Andric }
1423ff0cc061SDimitry Andric
compareByScalarFnName(const VecDesc & LHS,const VecDesc & RHS)1424ff0cc061SDimitry Andric static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS) {
1425d88c1a5aSDimitry Andric return LHS.ScalarFnName < RHS.ScalarFnName;
1426ff0cc061SDimitry Andric }
1427ff0cc061SDimitry Andric
compareByVectorFnName(const VecDesc & LHS,const VecDesc & RHS)1428ff0cc061SDimitry Andric static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS) {
1429d88c1a5aSDimitry Andric return LHS.VectorFnName < RHS.VectorFnName;
1430ff0cc061SDimitry Andric }
1431ff0cc061SDimitry Andric
compareWithScalarFnName(const VecDesc & LHS,StringRef S)1432ff0cc061SDimitry Andric static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S) {
1433d88c1a5aSDimitry Andric return LHS.ScalarFnName < S;
1434ff0cc061SDimitry Andric }
1435ff0cc061SDimitry Andric
compareWithVectorFnName(const VecDesc & LHS,StringRef S)1436ff0cc061SDimitry Andric static bool compareWithVectorFnName(const VecDesc &LHS, StringRef S) {
1437d88c1a5aSDimitry Andric return LHS.VectorFnName < S;
1438ff0cc061SDimitry Andric }
1439ff0cc061SDimitry Andric
addVectorizableFunctions(ArrayRef<VecDesc> Fns)1440ff0cc061SDimitry Andric void TargetLibraryInfoImpl::addVectorizableFunctions(ArrayRef<VecDesc> Fns) {
1441ff0cc061SDimitry Andric VectorDescs.insert(VectorDescs.end(), Fns.begin(), Fns.end());
1442*b5893f02SDimitry Andric llvm::sort(VectorDescs, compareByScalarFnName);
1443ff0cc061SDimitry Andric
1444ff0cc061SDimitry Andric ScalarDescs.insert(ScalarDescs.end(), Fns.begin(), Fns.end());
1445*b5893f02SDimitry Andric llvm::sort(ScalarDescs, compareByVectorFnName);
1446ff0cc061SDimitry Andric }
1447ff0cc061SDimitry Andric
addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib)1448ff0cc061SDimitry Andric void TargetLibraryInfoImpl::addVectorizableFunctionsFromVecLib(
1449ff0cc061SDimitry Andric enum VectorLibrary VecLib) {
1450ff0cc061SDimitry Andric switch (VecLib) {
1451ff0cc061SDimitry Andric case Accelerate: {
1452ff0cc061SDimitry Andric const VecDesc VecFuncs[] = {
1453ff0cc061SDimitry Andric // Floating-Point Arithmetic and Auxiliary Functions
1454ff0cc061SDimitry Andric {"ceilf", "vceilf", 4},
1455ff0cc061SDimitry Andric {"fabsf", "vfabsf", 4},
1456ff0cc061SDimitry Andric {"llvm.fabs.f32", "vfabsf", 4},
1457ff0cc061SDimitry Andric {"floorf", "vfloorf", 4},
1458ff0cc061SDimitry Andric {"sqrtf", "vsqrtf", 4},
1459ff0cc061SDimitry Andric {"llvm.sqrt.f32", "vsqrtf", 4},
1460ff0cc061SDimitry Andric
1461ff0cc061SDimitry Andric // Exponential and Logarithmic Functions
1462ff0cc061SDimitry Andric {"expf", "vexpf", 4},
1463ff0cc061SDimitry Andric {"llvm.exp.f32", "vexpf", 4},
1464ff0cc061SDimitry Andric {"expm1f", "vexpm1f", 4},
1465ff0cc061SDimitry Andric {"logf", "vlogf", 4},
1466ff0cc061SDimitry Andric {"llvm.log.f32", "vlogf", 4},
1467ff0cc061SDimitry Andric {"log1pf", "vlog1pf", 4},
1468ff0cc061SDimitry Andric {"log10f", "vlog10f", 4},
1469ff0cc061SDimitry Andric {"llvm.log10.f32", "vlog10f", 4},
1470ff0cc061SDimitry Andric {"logbf", "vlogbf", 4},
1471ff0cc061SDimitry Andric
1472ff0cc061SDimitry Andric // Trigonometric Functions
1473ff0cc061SDimitry Andric {"sinf", "vsinf", 4},
1474ff0cc061SDimitry Andric {"llvm.sin.f32", "vsinf", 4},
1475ff0cc061SDimitry Andric {"cosf", "vcosf", 4},
1476ff0cc061SDimitry Andric {"llvm.cos.f32", "vcosf", 4},
1477ff0cc061SDimitry Andric {"tanf", "vtanf", 4},
1478ff0cc061SDimitry Andric {"asinf", "vasinf", 4},
1479ff0cc061SDimitry Andric {"acosf", "vacosf", 4},
1480ff0cc061SDimitry Andric {"atanf", "vatanf", 4},
1481ff0cc061SDimitry Andric
1482ff0cc061SDimitry Andric // Hyperbolic Functions
1483ff0cc061SDimitry Andric {"sinhf", "vsinhf", 4},
1484ff0cc061SDimitry Andric {"coshf", "vcoshf", 4},
1485ff0cc061SDimitry Andric {"tanhf", "vtanhf", 4},
1486ff0cc061SDimitry Andric {"asinhf", "vasinhf", 4},
1487ff0cc061SDimitry Andric {"acoshf", "vacoshf", 4},
1488ff0cc061SDimitry Andric {"atanhf", "vatanhf", 4},
1489ff0cc061SDimitry Andric };
1490ff0cc061SDimitry Andric addVectorizableFunctions(VecFuncs);
1491ff0cc061SDimitry Andric break;
1492ff0cc061SDimitry Andric }
1493d88c1a5aSDimitry Andric case SVML: {
1494d88c1a5aSDimitry Andric const VecDesc VecFuncs[] = {
1495d88c1a5aSDimitry Andric {"sin", "__svml_sin2", 2},
1496d88c1a5aSDimitry Andric {"sin", "__svml_sin4", 4},
1497d88c1a5aSDimitry Andric {"sin", "__svml_sin8", 8},
1498d88c1a5aSDimitry Andric
1499d88c1a5aSDimitry Andric {"sinf", "__svml_sinf4", 4},
1500d88c1a5aSDimitry Andric {"sinf", "__svml_sinf8", 8},
1501d88c1a5aSDimitry Andric {"sinf", "__svml_sinf16", 16},
1502d88c1a5aSDimitry Andric
15034ba319b5SDimitry Andric {"llvm.sin.f64", "__svml_sin2", 2},
15044ba319b5SDimitry Andric {"llvm.sin.f64", "__svml_sin4", 4},
15054ba319b5SDimitry Andric {"llvm.sin.f64", "__svml_sin8", 8},
15064ba319b5SDimitry Andric
15074ba319b5SDimitry Andric {"llvm.sin.f32", "__svml_sinf4", 4},
15084ba319b5SDimitry Andric {"llvm.sin.f32", "__svml_sinf8", 8},
15094ba319b5SDimitry Andric {"llvm.sin.f32", "__svml_sinf16", 16},
15104ba319b5SDimitry Andric
1511d88c1a5aSDimitry Andric {"cos", "__svml_cos2", 2},
1512d88c1a5aSDimitry Andric {"cos", "__svml_cos4", 4},
1513d88c1a5aSDimitry Andric {"cos", "__svml_cos8", 8},
1514d88c1a5aSDimitry Andric
1515d88c1a5aSDimitry Andric {"cosf", "__svml_cosf4", 4},
1516d88c1a5aSDimitry Andric {"cosf", "__svml_cosf8", 8},
1517d88c1a5aSDimitry Andric {"cosf", "__svml_cosf16", 16},
1518d88c1a5aSDimitry Andric
15194ba319b5SDimitry Andric {"llvm.cos.f64", "__svml_cos2", 2},
15204ba319b5SDimitry Andric {"llvm.cos.f64", "__svml_cos4", 4},
15214ba319b5SDimitry Andric {"llvm.cos.f64", "__svml_cos8", 8},
15224ba319b5SDimitry Andric
15234ba319b5SDimitry Andric {"llvm.cos.f32", "__svml_cosf4", 4},
15244ba319b5SDimitry Andric {"llvm.cos.f32", "__svml_cosf8", 8},
15254ba319b5SDimitry Andric {"llvm.cos.f32", "__svml_cosf16", 16},
15264ba319b5SDimitry Andric
1527d88c1a5aSDimitry Andric {"pow", "__svml_pow2", 2},
1528d88c1a5aSDimitry Andric {"pow", "__svml_pow4", 4},
1529d88c1a5aSDimitry Andric {"pow", "__svml_pow8", 8},
1530d88c1a5aSDimitry Andric
1531d88c1a5aSDimitry Andric {"powf", "__svml_powf4", 4},
1532d88c1a5aSDimitry Andric {"powf", "__svml_powf8", 8},
1533d88c1a5aSDimitry Andric {"powf", "__svml_powf16", 16},
1534d88c1a5aSDimitry Andric
15355517e702SDimitry Andric { "__pow_finite", "__svml_pow2", 2 },
15365517e702SDimitry Andric { "__pow_finite", "__svml_pow4", 4 },
15375517e702SDimitry Andric { "__pow_finite", "__svml_pow8", 8 },
15385517e702SDimitry Andric
15395517e702SDimitry Andric { "__powf_finite", "__svml_powf4", 4 },
15405517e702SDimitry Andric { "__powf_finite", "__svml_powf8", 8 },
15415517e702SDimitry Andric { "__powf_finite", "__svml_powf16", 16 },
15425517e702SDimitry Andric
1543d88c1a5aSDimitry Andric {"llvm.pow.f64", "__svml_pow2", 2},
1544d88c1a5aSDimitry Andric {"llvm.pow.f64", "__svml_pow4", 4},
1545d88c1a5aSDimitry Andric {"llvm.pow.f64", "__svml_pow8", 8},
1546d88c1a5aSDimitry Andric
1547d88c1a5aSDimitry Andric {"llvm.pow.f32", "__svml_powf4", 4},
1548d88c1a5aSDimitry Andric {"llvm.pow.f32", "__svml_powf8", 8},
1549d88c1a5aSDimitry Andric {"llvm.pow.f32", "__svml_powf16", 16},
1550d88c1a5aSDimitry Andric
1551d88c1a5aSDimitry Andric {"exp", "__svml_exp2", 2},
1552d88c1a5aSDimitry Andric {"exp", "__svml_exp4", 4},
1553d88c1a5aSDimitry Andric {"exp", "__svml_exp8", 8},
1554d88c1a5aSDimitry Andric
1555d88c1a5aSDimitry Andric {"expf", "__svml_expf4", 4},
1556d88c1a5aSDimitry Andric {"expf", "__svml_expf8", 8},
1557d88c1a5aSDimitry Andric {"expf", "__svml_expf16", 16},
1558d88c1a5aSDimitry Andric
15595517e702SDimitry Andric { "__exp_finite", "__svml_exp2", 2 },
15605517e702SDimitry Andric { "__exp_finite", "__svml_exp4", 4 },
15615517e702SDimitry Andric { "__exp_finite", "__svml_exp8", 8 },
15625517e702SDimitry Andric
15635517e702SDimitry Andric { "__expf_finite", "__svml_expf4", 4 },
15645517e702SDimitry Andric { "__expf_finite", "__svml_expf8", 8 },
15655517e702SDimitry Andric { "__expf_finite", "__svml_expf16", 16 },
15665517e702SDimitry Andric
1567d88c1a5aSDimitry Andric {"llvm.exp.f64", "__svml_exp2", 2},
1568d88c1a5aSDimitry Andric {"llvm.exp.f64", "__svml_exp4", 4},
1569d88c1a5aSDimitry Andric {"llvm.exp.f64", "__svml_exp8", 8},
1570d88c1a5aSDimitry Andric
1571d88c1a5aSDimitry Andric {"llvm.exp.f32", "__svml_expf4", 4},
1572d88c1a5aSDimitry Andric {"llvm.exp.f32", "__svml_expf8", 8},
1573d88c1a5aSDimitry Andric {"llvm.exp.f32", "__svml_expf16", 16},
1574d88c1a5aSDimitry Andric
1575d88c1a5aSDimitry Andric {"log", "__svml_log2", 2},
1576d88c1a5aSDimitry Andric {"log", "__svml_log4", 4},
1577d88c1a5aSDimitry Andric {"log", "__svml_log8", 8},
1578d88c1a5aSDimitry Andric
1579d88c1a5aSDimitry Andric {"logf", "__svml_logf4", 4},
1580d88c1a5aSDimitry Andric {"logf", "__svml_logf8", 8},
1581d88c1a5aSDimitry Andric {"logf", "__svml_logf16", 16},
1582d88c1a5aSDimitry Andric
15835517e702SDimitry Andric { "__log_finite", "__svml_log2", 2 },
15845517e702SDimitry Andric { "__log_finite", "__svml_log4", 4 },
15855517e702SDimitry Andric { "__log_finite", "__svml_log8", 8 },
15865517e702SDimitry Andric
15875517e702SDimitry Andric { "__logf_finite", "__svml_logf4", 4 },
15885517e702SDimitry Andric { "__logf_finite", "__svml_logf8", 8 },
15895517e702SDimitry Andric { "__logf_finite", "__svml_logf16", 16 },
15905517e702SDimitry Andric
1591d88c1a5aSDimitry Andric {"llvm.log.f64", "__svml_log2", 2},
1592d88c1a5aSDimitry Andric {"llvm.log.f64", "__svml_log4", 4},
1593d88c1a5aSDimitry Andric {"llvm.log.f64", "__svml_log8", 8},
1594d88c1a5aSDimitry Andric
1595d88c1a5aSDimitry Andric {"llvm.log.f32", "__svml_logf4", 4},
1596d88c1a5aSDimitry Andric {"llvm.log.f32", "__svml_logf8", 8},
1597d88c1a5aSDimitry Andric {"llvm.log.f32", "__svml_logf16", 16},
1598d88c1a5aSDimitry Andric };
1599d88c1a5aSDimitry Andric addVectorizableFunctions(VecFuncs);
1600d88c1a5aSDimitry Andric break;
1601d88c1a5aSDimitry Andric }
1602ff0cc061SDimitry Andric case NoLibrary:
1603ff0cc061SDimitry Andric break;
1604ff0cc061SDimitry Andric }
1605ff0cc061SDimitry Andric }
1606ff0cc061SDimitry Andric
isFunctionVectorizable(StringRef funcName) const1607ff0cc061SDimitry Andric bool TargetLibraryInfoImpl::isFunctionVectorizable(StringRef funcName) const {
1608ff0cc061SDimitry Andric funcName = sanitizeFunctionName(funcName);
1609ff0cc061SDimitry Andric if (funcName.empty())
1610ff0cc061SDimitry Andric return false;
1611ff0cc061SDimitry Andric
1612ff0cc061SDimitry Andric std::vector<VecDesc>::const_iterator I = std::lower_bound(
1613ff0cc061SDimitry Andric VectorDescs.begin(), VectorDescs.end(), funcName,
1614ff0cc061SDimitry Andric compareWithScalarFnName);
1615ff0cc061SDimitry Andric return I != VectorDescs.end() && StringRef(I->ScalarFnName) == funcName;
1616ff0cc061SDimitry Andric }
1617ff0cc061SDimitry Andric
getVectorizedFunction(StringRef F,unsigned VF) const1618ff0cc061SDimitry Andric StringRef TargetLibraryInfoImpl::getVectorizedFunction(StringRef F,
1619ff0cc061SDimitry Andric unsigned VF) const {
1620ff0cc061SDimitry Andric F = sanitizeFunctionName(F);
1621ff0cc061SDimitry Andric if (F.empty())
1622ff0cc061SDimitry Andric return F;
1623ff0cc061SDimitry Andric std::vector<VecDesc>::const_iterator I = std::lower_bound(
1624ff0cc061SDimitry Andric VectorDescs.begin(), VectorDescs.end(), F, compareWithScalarFnName);
1625ff0cc061SDimitry Andric while (I != VectorDescs.end() && StringRef(I->ScalarFnName) == F) {
1626ff0cc061SDimitry Andric if (I->VectorizationFactor == VF)
1627ff0cc061SDimitry Andric return I->VectorFnName;
1628ff0cc061SDimitry Andric ++I;
1629ff0cc061SDimitry Andric }
1630ff0cc061SDimitry Andric return StringRef();
1631ff0cc061SDimitry Andric }
1632ff0cc061SDimitry Andric
getScalarizedFunction(StringRef F,unsigned & VF) const1633ff0cc061SDimitry Andric StringRef TargetLibraryInfoImpl::getScalarizedFunction(StringRef F,
1634ff0cc061SDimitry Andric unsigned &VF) const {
1635ff0cc061SDimitry Andric F = sanitizeFunctionName(F);
1636ff0cc061SDimitry Andric if (F.empty())
1637ff0cc061SDimitry Andric return F;
1638ff0cc061SDimitry Andric
1639ff0cc061SDimitry Andric std::vector<VecDesc>::const_iterator I = std::lower_bound(
1640ff0cc061SDimitry Andric ScalarDescs.begin(), ScalarDescs.end(), F, compareWithVectorFnName);
1641ff0cc061SDimitry Andric if (I == VectorDescs.end() || StringRef(I->VectorFnName) != F)
1642ff0cc061SDimitry Andric return StringRef();
1643ff0cc061SDimitry Andric VF = I->VectorizationFactor;
1644ff0cc061SDimitry Andric return I->ScalarFnName;
1645ff0cc061SDimitry Andric }
1646ff0cc061SDimitry Andric
run(Module & M,ModuleAnalysisManager &)16473ca95b02SDimitry Andric TargetLibraryInfo TargetLibraryAnalysis::run(Module &M,
16483ca95b02SDimitry Andric ModuleAnalysisManager &) {
1649ff0cc061SDimitry Andric if (PresetInfoImpl)
1650ff0cc061SDimitry Andric return TargetLibraryInfo(*PresetInfoImpl);
1651ff0cc061SDimitry Andric
1652ff0cc061SDimitry Andric return TargetLibraryInfo(lookupInfoImpl(Triple(M.getTargetTriple())));
1653ff0cc061SDimitry Andric }
1654ff0cc061SDimitry Andric
run(Function & F,FunctionAnalysisManager &)16553ca95b02SDimitry Andric TargetLibraryInfo TargetLibraryAnalysis::run(Function &F,
16563ca95b02SDimitry Andric FunctionAnalysisManager &) {
1657ff0cc061SDimitry Andric if (PresetInfoImpl)
1658ff0cc061SDimitry Andric return TargetLibraryInfo(*PresetInfoImpl);
1659ff0cc061SDimitry Andric
1660ff0cc061SDimitry Andric return TargetLibraryInfo(
1661ff0cc061SDimitry Andric lookupInfoImpl(Triple(F.getParent()->getTargetTriple())));
1662ff0cc061SDimitry Andric }
1663ff0cc061SDimitry Andric
lookupInfoImpl(const Triple & T)16643ca95b02SDimitry Andric TargetLibraryInfoImpl &TargetLibraryAnalysis::lookupInfoImpl(const Triple &T) {
1665ff0cc061SDimitry Andric std::unique_ptr<TargetLibraryInfoImpl> &Impl =
1666ff0cc061SDimitry Andric Impls[T.normalize()];
1667ff0cc061SDimitry Andric if (!Impl)
1668ff0cc061SDimitry Andric Impl.reset(new TargetLibraryInfoImpl(T));
1669ff0cc061SDimitry Andric
1670ff0cc061SDimitry Andric return *Impl;
1671ff0cc061SDimitry Andric }
1672ff0cc061SDimitry Andric
getWCharSize(const Module & M) const1673d8866befSDimitry Andric unsigned TargetLibraryInfoImpl::getWCharSize(const Module &M) const {
1674d8866befSDimitry Andric if (auto *ShortWChar = cast_or_null<ConstantAsMetadata>(
1675d8866befSDimitry Andric M.getModuleFlag("wchar_size")))
1676d8866befSDimitry Andric return cast<ConstantInt>(ShortWChar->getValue())->getZExtValue();
16772cab237bSDimitry Andric return 0;
1678d8866befSDimitry Andric }
1679ff0cc061SDimitry Andric
TargetLibraryInfoWrapperPass()1680ff0cc061SDimitry Andric TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass()
1681ff0cc061SDimitry Andric : ImmutablePass(ID), TLIImpl(), TLI(TLIImpl) {
1682ff0cc061SDimitry Andric initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1683ff0cc061SDimitry Andric }
1684ff0cc061SDimitry Andric
TargetLibraryInfoWrapperPass(const Triple & T)1685ff0cc061SDimitry Andric TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(const Triple &T)
1686ff0cc061SDimitry Andric : ImmutablePass(ID), TLIImpl(T), TLI(TLIImpl) {
1687ff0cc061SDimitry Andric initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1688ff0cc061SDimitry Andric }
1689ff0cc061SDimitry Andric
TargetLibraryInfoWrapperPass(const TargetLibraryInfoImpl & TLIImpl)1690ff0cc061SDimitry Andric TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(
1691ff0cc061SDimitry Andric const TargetLibraryInfoImpl &TLIImpl)
1692ff0cc061SDimitry Andric : ImmutablePass(ID), TLIImpl(TLIImpl), TLI(this->TLIImpl) {
1693ff0cc061SDimitry Andric initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1694ff0cc061SDimitry Andric }
1695ff0cc061SDimitry Andric
1696d88c1a5aSDimitry Andric AnalysisKey TargetLibraryAnalysis::Key;
1697ff0cc061SDimitry Andric
1698ff0cc061SDimitry Andric // Register the basic pass.
1699ff0cc061SDimitry Andric INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
1700ff0cc061SDimitry Andric "Target Library Information", false, true)
1701ff0cc061SDimitry Andric char TargetLibraryInfoWrapperPass::ID = 0;
1702ff0cc061SDimitry Andric
anchor()1703ff0cc061SDimitry Andric void TargetLibraryInfoWrapperPass::anchor() {}
1704