LLVM  9.0.0svn
TargetLibraryInfo.cpp
Go to the documentation of this file.
1 //===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the TargetLibraryInfo class.
10 //
11 //===----------------------------------------------------------------------===//
12 
14 #include "llvm/ADT/Triple.h"
15 #include "llvm/IR/Constants.h"
17 using namespace llvm;
18 
20  "vector-library", cl::Hidden, cl::desc("Vector functions library"),
23  "No vector functions library"),
25  "Accelerate framework"),
27  "Intel SVML library")));
28 
29 StringRef const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] = {
30 #define TLI_DEFINE_STRING
31 #include "llvm/Analysis/TargetLibraryInfo.def"
32 };
33 
34 static bool hasSinCosPiStret(const Triple &T) {
35  // Only Darwin variants have _stret versions of combined trig functions.
36  if (!T.isOSDarwin())
37  return false;
38 
39  // The ABI is rather complicated on x86, so don't do anything special there.
40  if (T.getArch() == Triple::x86)
41  return false;
42 
43  if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
44  return false;
45 
46  if (T.isiOS() && T.isOSVersionLT(7, 0))
47  return false;
48 
49  return true;
50 }
51 
52 /// Initialize the set of available library functions based on the specified
53 /// target triple. This should be carefully written so that a missing target
54 /// triple gets a sane set of defaults.
55 static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
56  ArrayRef<StringRef> StandardNames) {
57  // Verify that the StandardNames array is in alphabetical order.
58  assert(std::is_sorted(StandardNames.begin(), StandardNames.end(),
59  [](StringRef LHS, StringRef RHS) {
60  return LHS < RHS;
61  }) &&
62  "TargetLibraryInfoImpl function names must be sorted");
63 
64  // Set IO unlocked variants as unavailable
65  // Set them as available per system below
66  TLI.setUnavailable(LibFunc_getchar_unlocked);
67  TLI.setUnavailable(LibFunc_putc_unlocked);
68  TLI.setUnavailable(LibFunc_putchar_unlocked);
69  TLI.setUnavailable(LibFunc_fputc_unlocked);
70  TLI.setUnavailable(LibFunc_fgetc_unlocked);
71  TLI.setUnavailable(LibFunc_fread_unlocked);
72  TLI.setUnavailable(LibFunc_fwrite_unlocked);
73  TLI.setUnavailable(LibFunc_fputs_unlocked);
74  TLI.setUnavailable(LibFunc_fgets_unlocked);
75 
76  bool ShouldExtI32Param = false, ShouldExtI32Return = false,
77  ShouldSignExtI32Param = false;
78  // PowerPC64, Sparc64, SystemZ need signext/zeroext on i32 parameters and
79  // returns corresponding to C-level ints and unsigned ints.
80  if (T.getArch() == Triple::ppc64 || T.getArch() == Triple::ppc64le ||
82  ShouldExtI32Param = true;
83  ShouldExtI32Return = true;
84  }
85  // Mips, on the other hand, needs signext on i32 parameters corresponding
86  // to both signed and unsigned ints.
87  if (T.isMIPS()) {
88  ShouldSignExtI32Param = true;
89  }
90  TLI.setShouldExtI32Param(ShouldExtI32Param);
91  TLI.setShouldExtI32Return(ShouldExtI32Return);
92  TLI.setShouldSignExtI32Param(ShouldSignExtI32Param);
93 
94  if (T.getArch() == Triple::r600 ||
95  T.getArch() == Triple::amdgcn) {
96  TLI.setUnavailable(LibFunc_ldexp);
97  TLI.setUnavailable(LibFunc_ldexpf);
98  TLI.setUnavailable(LibFunc_ldexpl);
99  TLI.setUnavailable(LibFunc_exp10);
100  TLI.setUnavailable(LibFunc_exp10f);
101  TLI.setUnavailable(LibFunc_exp10l);
102  TLI.setUnavailable(LibFunc_log10);
103  TLI.setUnavailable(LibFunc_log10f);
104  TLI.setUnavailable(LibFunc_log10l);
105  }
106 
107  // There are no library implementations of mempcy and memset for AMD gpus and
108  // these can be difficult to lower in the backend.
109  if (T.getArch() == Triple::r600 ||
110  T.getArch() == Triple::amdgcn) {
111  TLI.setUnavailable(LibFunc_memcpy);
112  TLI.setUnavailable(LibFunc_memset);
113  TLI.setUnavailable(LibFunc_memset_pattern16);
114  return;
115  }
116 
117  // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later.
118  // All versions of watchOS support it.
119  if (T.isMacOSX()) {
120  // available IO unlocked variants on Mac OS X
121  TLI.setAvailable(LibFunc_getc_unlocked);
122  TLI.setAvailable(LibFunc_getchar_unlocked);
123  TLI.setAvailable(LibFunc_putc_unlocked);
124  TLI.setAvailable(LibFunc_putchar_unlocked);
125 
126  if (T.isMacOSXVersionLT(10, 5))
127  TLI.setUnavailable(LibFunc_memset_pattern16);
128  } else if (T.isiOS()) {
129  if (T.isOSVersionLT(3, 0))
130  TLI.setUnavailable(LibFunc_memset_pattern16);
131  } else if (!T.isWatchOS()) {
132  TLI.setUnavailable(LibFunc_memset_pattern16);
133  }
134 
135  if (!hasSinCosPiStret(T)) {
136  TLI.setUnavailable(LibFunc_sinpi);
137  TLI.setUnavailable(LibFunc_sinpif);
138  TLI.setUnavailable(LibFunc_cospi);
139  TLI.setUnavailable(LibFunc_cospif);
140  TLI.setUnavailable(LibFunc_sincospi_stret);
141  TLI.setUnavailable(LibFunc_sincospif_stret);
142  }
143 
144  if (T.isMacOSX() && T.getArch() == Triple::x86 &&
145  !T.isMacOSXVersionLT(10, 7)) {
146  // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
147  // we don't care about) have two versions; on recent OSX, the one we want
148  // has a $UNIX2003 suffix. The two implementations are identical except
149  // for the return value in some edge cases. However, we don't want to
150  // generate code that depends on the old symbols.
151  TLI.setAvailableWithName(LibFunc_fwrite, "fwrite$UNIX2003");
152  TLI.setAvailableWithName(LibFunc_fputs, "fputs$UNIX2003");
153  }
154 
155  // iprintf and friends are only available on XCore and TCE.
156  if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
157  TLI.setUnavailable(LibFunc_iprintf);
158  TLI.setUnavailable(LibFunc_siprintf);
159  TLI.setUnavailable(LibFunc_fiprintf);
160  }
161 
162  if (T.isOSWindows() && !T.isOSCygMing()) {
163  // XXX: The earliest documentation available at the moment is for VS2015/VC19:
164  // https://docs.microsoft.com/en-us/cpp/c-runtime-library/floating-point-support?view=vs-2015
165  // XXX: In order to use an MSVCRT older than VC19,
166  // the specific library version must be explicit in the target triple,
167  // e.g., x86_64-pc-windows-msvc18.
168  bool hasPartialC99 = true;
170  unsigned Major, Minor, Micro;
171  T.getEnvironmentVersion(Major, Minor, Micro);
172  hasPartialC99 = (Major == 0 || Major >= 19);
173  }
174 
175  // Latest targets support C89 math functions, in part.
176  bool isARM = (T.getArch() == Triple::aarch64 ||
177  T.getArch() == Triple::arm);
178  bool hasPartialFloat = (isARM ||
179  T.getArch() == Triple::x86_64);
180 
181  // Win32 does not support float C89 math functions, in general.
182  if (!hasPartialFloat) {
183  TLI.setUnavailable(LibFunc_acosf);
184  TLI.setUnavailable(LibFunc_asinf);
185  TLI.setUnavailable(LibFunc_atan2f);
186  TLI.setUnavailable(LibFunc_atanf);
187  TLI.setUnavailable(LibFunc_ceilf);
188  TLI.setUnavailable(LibFunc_cosf);
189  TLI.setUnavailable(LibFunc_coshf);
190  TLI.setUnavailable(LibFunc_expf);
191  TLI.setUnavailable(LibFunc_floorf);
192  TLI.setUnavailable(LibFunc_fmodf);
193  TLI.setUnavailable(LibFunc_log10f);
194  TLI.setUnavailable(LibFunc_logf);
195  TLI.setUnavailable(LibFunc_modff);
196  TLI.setUnavailable(LibFunc_powf);
197  TLI.setUnavailable(LibFunc_sinf);
198  TLI.setUnavailable(LibFunc_sinhf);
199  TLI.setUnavailable(LibFunc_sqrtf);
200  TLI.setUnavailable(LibFunc_tanf);
201  TLI.setUnavailable(LibFunc_tanhf);
202  }
203  if (!isARM)
204  TLI.setUnavailable(LibFunc_fabsf);
205  TLI.setUnavailable(LibFunc_frexpf);
206  TLI.setUnavailable(LibFunc_ldexpf);
207 
208  // Win32 does not support long double C89 math functions.
209  TLI.setUnavailable(LibFunc_acosl);
210  TLI.setUnavailable(LibFunc_asinl);
211  TLI.setUnavailable(LibFunc_atan2l);
212  TLI.setUnavailable(LibFunc_atanl);
213  TLI.setUnavailable(LibFunc_ceill);
214  TLI.setUnavailable(LibFunc_cosl);
215  TLI.setUnavailable(LibFunc_coshl);
216  TLI.setUnavailable(LibFunc_expl);
217  TLI.setUnavailable(LibFunc_fabsl);
218  TLI.setUnavailable(LibFunc_floorl);
219  TLI.setUnavailable(LibFunc_fmodl);
220  TLI.setUnavailable(LibFunc_frexpl);
221  TLI.setUnavailable(LibFunc_ldexpl);
222  TLI.setUnavailable(LibFunc_log10l);
223  TLI.setUnavailable(LibFunc_logl);
224  TLI.setUnavailable(LibFunc_modfl);
225  TLI.setUnavailable(LibFunc_powl);
226  TLI.setUnavailable(LibFunc_sinl);
227  TLI.setUnavailable(LibFunc_sinhl);
228  TLI.setUnavailable(LibFunc_sqrtl);
229  TLI.setUnavailable(LibFunc_tanl);
230  TLI.setUnavailable(LibFunc_tanhl);
231 
232  // Win32 does not fully support C99 math functions.
233  if (!hasPartialC99) {
234  TLI.setUnavailable(LibFunc_acosh);
235  TLI.setUnavailable(LibFunc_acoshf);
236  TLI.setUnavailable(LibFunc_asinh);
237  TLI.setUnavailable(LibFunc_asinhf);
238  TLI.setUnavailable(LibFunc_atanh);
239  TLI.setUnavailable(LibFunc_atanhf);
240  TLI.setAvailableWithName(LibFunc_cabs, "_cabs");
241  TLI.setUnavailable(LibFunc_cabsf);
242  TLI.setUnavailable(LibFunc_cbrt);
243  TLI.setUnavailable(LibFunc_cbrtf);
244  TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
245  TLI.setAvailableWithName(LibFunc_copysignf, "_copysignf");
246  TLI.setUnavailable(LibFunc_exp2);
247  TLI.setUnavailable(LibFunc_exp2f);
248  TLI.setUnavailable(LibFunc_expm1);
249  TLI.setUnavailable(LibFunc_expm1f);
250  TLI.setUnavailable(LibFunc_fmax);
251  TLI.setUnavailable(LibFunc_fmaxf);
252  TLI.setUnavailable(LibFunc_fmin);
253  TLI.setUnavailable(LibFunc_fminf);
254  TLI.setUnavailable(LibFunc_log1p);
255  TLI.setUnavailable(LibFunc_log1pf);
256  TLI.setUnavailable(LibFunc_log2);
257  TLI.setUnavailable(LibFunc_log2f);
258  TLI.setAvailableWithName(LibFunc_logb, "_logb");
259  if (hasPartialFloat)
260  TLI.setAvailableWithName(LibFunc_logbf, "_logbf");
261  else
262  TLI.setUnavailable(LibFunc_logbf);
263  TLI.setUnavailable(LibFunc_rint);
264  TLI.setUnavailable(LibFunc_rintf);
265  TLI.setUnavailable(LibFunc_round);
266  TLI.setUnavailable(LibFunc_roundf);
267  TLI.setUnavailable(LibFunc_trunc);
268  TLI.setUnavailable(LibFunc_truncf);
269  }
270 
271  // Win32 does not support long double C99 math functions.
272  TLI.setUnavailable(LibFunc_acoshl);
273  TLI.setUnavailable(LibFunc_asinhl);
274  TLI.setUnavailable(LibFunc_atanhl);
275  TLI.setUnavailable(LibFunc_cabsl);
276  TLI.setUnavailable(LibFunc_cbrtl);
277  TLI.setUnavailable(LibFunc_copysignl);
278  TLI.setUnavailable(LibFunc_exp2l);
279  TLI.setUnavailable(LibFunc_expm1l);
280  TLI.setUnavailable(LibFunc_fmaxl);
281  TLI.setUnavailable(LibFunc_fminl);
282  TLI.setUnavailable(LibFunc_log1pl);
283  TLI.setUnavailable(LibFunc_log2l);
284  TLI.setUnavailable(LibFunc_logbl);
285  TLI.setUnavailable(LibFunc_nearbyintl);
286  TLI.setUnavailable(LibFunc_rintl);
287  TLI.setUnavailable(LibFunc_roundl);
288  TLI.setUnavailable(LibFunc_truncl);
289 
290  // Win32 does not support these functions, but
291  // they are generally available on POSIX-compliant systems.
292  TLI.setUnavailable(LibFunc_access);
293  TLI.setUnavailable(LibFunc_bcmp);
294  TLI.setUnavailable(LibFunc_bcopy);
295  TLI.setUnavailable(LibFunc_bzero);
296  TLI.setUnavailable(LibFunc_chmod);
297  TLI.setUnavailable(LibFunc_chown);
298  TLI.setUnavailable(LibFunc_closedir);
299  TLI.setUnavailable(LibFunc_ctermid);
300  TLI.setUnavailable(LibFunc_fdopen);
301  TLI.setUnavailable(LibFunc_ffs);
302  TLI.setUnavailable(LibFunc_fileno);
303  TLI.setUnavailable(LibFunc_flockfile);
304  TLI.setUnavailable(LibFunc_fseeko);
305  TLI.setUnavailable(LibFunc_fstat);
306  TLI.setUnavailable(LibFunc_fstatvfs);
307  TLI.setUnavailable(LibFunc_ftello);
308  TLI.setUnavailable(LibFunc_ftrylockfile);
309  TLI.setUnavailable(LibFunc_funlockfile);
310  TLI.setUnavailable(LibFunc_getitimer);
311  TLI.setUnavailable(LibFunc_getlogin_r);
312  TLI.setUnavailable(LibFunc_getpwnam);
313  TLI.setUnavailable(LibFunc_gettimeofday);
314  TLI.setUnavailable(LibFunc_htonl);
315  TLI.setUnavailable(LibFunc_htons);
316  TLI.setUnavailable(LibFunc_lchown);
317  TLI.setUnavailable(LibFunc_lstat);
318  TLI.setUnavailable(LibFunc_memccpy);
319  TLI.setUnavailable(LibFunc_mkdir);
320  TLI.setUnavailable(LibFunc_ntohl);
321  TLI.setUnavailable(LibFunc_ntohs);
322  TLI.setUnavailable(LibFunc_open);
323  TLI.setUnavailable(LibFunc_opendir);
324  TLI.setUnavailable(LibFunc_pclose);
325  TLI.setUnavailable(LibFunc_popen);
326  TLI.setUnavailable(LibFunc_pread);
327  TLI.setUnavailable(LibFunc_pwrite);
328  TLI.setUnavailable(LibFunc_read);
329  TLI.setUnavailable(LibFunc_readlink);
330  TLI.setUnavailable(LibFunc_realpath);
331  TLI.setUnavailable(LibFunc_rmdir);
332  TLI.setUnavailable(LibFunc_setitimer);
333  TLI.setUnavailable(LibFunc_stat);
334  TLI.setUnavailable(LibFunc_statvfs);
335  TLI.setUnavailable(LibFunc_stpcpy);
336  TLI.setUnavailable(LibFunc_stpncpy);
337  TLI.setUnavailable(LibFunc_strcasecmp);
338  TLI.setUnavailable(LibFunc_strncasecmp);
339  TLI.setUnavailable(LibFunc_times);
340  TLI.setUnavailable(LibFunc_uname);
341  TLI.setUnavailable(LibFunc_unlink);
342  TLI.setUnavailable(LibFunc_unsetenv);
343  TLI.setUnavailable(LibFunc_utime);
344  TLI.setUnavailable(LibFunc_utimes);
345  TLI.setUnavailable(LibFunc_write);
346  }
347 
348  switch (T.getOS()) {
349  case Triple::MacOSX:
350  // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
351  // and their names are __exp10 and __exp10f. exp10l is not available on
352  // OS X or iOS.
353  TLI.setUnavailable(LibFunc_exp10l);
354  if (T.isMacOSXVersionLT(10, 9)) {
355  TLI.setUnavailable(LibFunc_exp10);
356  TLI.setUnavailable(LibFunc_exp10f);
357  } else {
358  TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
359  TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
360  }
361  break;
362  case Triple::IOS:
363  case Triple::TvOS:
364  case Triple::WatchOS:
365  TLI.setUnavailable(LibFunc_exp10l);
366  if (!T.isWatchOS() && (T.isOSVersionLT(7, 0) ||
367  (T.isOSVersionLT(9, 0) &&
368  (T.getArch() == Triple::x86 ||
369  T.getArch() == Triple::x86_64)))) {
370  TLI.setUnavailable(LibFunc_exp10);
371  TLI.setUnavailable(LibFunc_exp10f);
372  } else {
373  TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
374  TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
375  }
376  break;
377  case Triple::Linux:
378  // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
379  // buggy prior to glibc version 2.18. Until this version is widely deployed
380  // or we have a reasonable detection strategy, we cannot use exp10 reliably
381  // on Linux.
382  //
383  // Fall through to disable all of them.
385  default:
386  TLI.setUnavailable(LibFunc_exp10);
387  TLI.setUnavailable(LibFunc_exp10f);
388  TLI.setUnavailable(LibFunc_exp10l);
389  }
390 
391  // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
392  // Linux (GLIBC):
393  // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
394  // http://svn.freebsd.org/base/head/lib/libc/string/ffsl.c
395  // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
396  switch (T.getOS()) {
397  case Triple::Darwin:
398  case Triple::MacOSX:
399  case Triple::IOS:
400  case Triple::TvOS:
401  case Triple::WatchOS:
402  case Triple::FreeBSD:
403  case Triple::Linux:
404  break;
405  default:
406  TLI.setUnavailable(LibFunc_ffsl);
407  }
408 
409  // ffsll is available on at least FreeBSD and Linux (GLIBC):
410  // http://svn.freebsd.org/base/head/lib/libc/string/ffsll.c
411  // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
412  switch (T.getOS()) {
413  case Triple::Darwin:
414  case Triple::MacOSX:
415  case Triple::IOS:
416  case Triple::TvOS:
417  case Triple::WatchOS:
418  case Triple::FreeBSD:
419  case Triple::Linux:
420  break;
421  default:
422  TLI.setUnavailable(LibFunc_ffsll);
423  }
424 
425  // The following functions are available on at least FreeBSD:
426  // http://svn.freebsd.org/base/head/lib/libc/string/fls.c
427  // http://svn.freebsd.org/base/head/lib/libc/string/flsl.c
428  // http://svn.freebsd.org/base/head/lib/libc/string/flsll.c
429  if (!T.isOSFreeBSD()) {
430  TLI.setUnavailable(LibFunc_fls);
431  TLI.setUnavailable(LibFunc_flsl);
432  TLI.setUnavailable(LibFunc_flsll);
433  }
434 
435  // The following functions are only available on GNU/Linux (using glibc).
436  // Linux variants without glibc (eg: bionic, musl) may have some subset.
437  if (!T.isOSLinux() || !T.isGNUEnvironment()) {
438  TLI.setUnavailable(LibFunc_dunder_strdup);
439  TLI.setUnavailable(LibFunc_dunder_strtok_r);
440  TLI.setUnavailable(LibFunc_dunder_isoc99_scanf);
441  TLI.setUnavailable(LibFunc_dunder_isoc99_sscanf);
442  TLI.setUnavailable(LibFunc_under_IO_getc);
443  TLI.setUnavailable(LibFunc_under_IO_putc);
444  // But, Android and musl have memalign.
445  if (!T.isAndroid() && !T.isMusl())
446  TLI.setUnavailable(LibFunc_memalign);
447  TLI.setUnavailable(LibFunc_fopen64);
448  TLI.setUnavailable(LibFunc_fseeko64);
449  TLI.setUnavailable(LibFunc_fstat64);
450  TLI.setUnavailable(LibFunc_fstatvfs64);
451  TLI.setUnavailable(LibFunc_ftello64);
452  TLI.setUnavailable(LibFunc_lstat64);
453  TLI.setUnavailable(LibFunc_open64);
454  TLI.setUnavailable(LibFunc_stat64);
455  TLI.setUnavailable(LibFunc_statvfs64);
456  TLI.setUnavailable(LibFunc_tmpfile64);
457 
458  // Relaxed math functions are included in math-finite.h on Linux (GLIBC).
459  TLI.setUnavailable(LibFunc_acos_finite);
460  TLI.setUnavailable(LibFunc_acosf_finite);
461  TLI.setUnavailable(LibFunc_acosl_finite);
462  TLI.setUnavailable(LibFunc_acosh_finite);
463  TLI.setUnavailable(LibFunc_acoshf_finite);
464  TLI.setUnavailable(LibFunc_acoshl_finite);
465  TLI.setUnavailable(LibFunc_asin_finite);
466  TLI.setUnavailable(LibFunc_asinf_finite);
467  TLI.setUnavailable(LibFunc_asinl_finite);
468  TLI.setUnavailable(LibFunc_atan2_finite);
469  TLI.setUnavailable(LibFunc_atan2f_finite);
470  TLI.setUnavailable(LibFunc_atan2l_finite);
471  TLI.setUnavailable(LibFunc_atanh_finite);
472  TLI.setUnavailable(LibFunc_atanhf_finite);
473  TLI.setUnavailable(LibFunc_atanhl_finite);
474  TLI.setUnavailable(LibFunc_cosh_finite);
475  TLI.setUnavailable(LibFunc_coshf_finite);
476  TLI.setUnavailable(LibFunc_coshl_finite);
477  TLI.setUnavailable(LibFunc_exp10_finite);
478  TLI.setUnavailable(LibFunc_exp10f_finite);
479  TLI.setUnavailable(LibFunc_exp10l_finite);
480  TLI.setUnavailable(LibFunc_exp2_finite);
481  TLI.setUnavailable(LibFunc_exp2f_finite);
482  TLI.setUnavailable(LibFunc_exp2l_finite);
483  TLI.setUnavailable(LibFunc_exp_finite);
484  TLI.setUnavailable(LibFunc_expf_finite);
485  TLI.setUnavailable(LibFunc_expl_finite);
486  TLI.setUnavailable(LibFunc_log10_finite);
487  TLI.setUnavailable(LibFunc_log10f_finite);
488  TLI.setUnavailable(LibFunc_log10l_finite);
489  TLI.setUnavailable(LibFunc_log2_finite);
490  TLI.setUnavailable(LibFunc_log2f_finite);
491  TLI.setUnavailable(LibFunc_log2l_finite);
492  TLI.setUnavailable(LibFunc_log_finite);
493  TLI.setUnavailable(LibFunc_logf_finite);
494  TLI.setUnavailable(LibFunc_logl_finite);
495  TLI.setUnavailable(LibFunc_pow_finite);
496  TLI.setUnavailable(LibFunc_powf_finite);
497  TLI.setUnavailable(LibFunc_powl_finite);
498  TLI.setUnavailable(LibFunc_sinh_finite);
499  TLI.setUnavailable(LibFunc_sinhf_finite);
500  TLI.setUnavailable(LibFunc_sinhl_finite);
501  }
502 
503  if ((T.isOSLinux() && T.isGNUEnvironment()) ||
504  (T.isAndroid() && !T.isAndroidVersionLT(28))) {
505  // available IO unlocked variants on GNU/Linux and Android P or later
506  TLI.setAvailable(LibFunc_getc_unlocked);
507  TLI.setAvailable(LibFunc_getchar_unlocked);
508  TLI.setAvailable(LibFunc_putc_unlocked);
509  TLI.setAvailable(LibFunc_putchar_unlocked);
510  TLI.setAvailable(LibFunc_fputc_unlocked);
511  TLI.setAvailable(LibFunc_fgetc_unlocked);
512  TLI.setAvailable(LibFunc_fread_unlocked);
513  TLI.setAvailable(LibFunc_fwrite_unlocked);
514  TLI.setAvailable(LibFunc_fputs_unlocked);
515  TLI.setAvailable(LibFunc_fgets_unlocked);
516  }
517 
518  // As currently implemented in clang, NVPTX code has no standard library to
519  // speak of. Headers provide a standard-ish library implementation, but many
520  // of the signatures are wrong -- for example, many libm functions are not
521  // extern "C".
522  //
523  // libdevice, an IR library provided by nvidia, is linked in by the front-end,
524  // but only used functions are provided to llvm. Moreover, most of the
525  // functions in libdevice don't map precisely to standard library functions.
526  //
527  // FIXME: Having no standard library prevents e.g. many fastmath
528  // optimizations, so this situation should be fixed.
529  if (T.isNVPTX()) {
530  TLI.disableAllFunctions();
531  TLI.setAvailable(LibFunc_nvvm_reflect);
532  } else {
533  TLI.setUnavailable(LibFunc_nvvm_reflect);
534  }
535 
537 }
538 
540  // Default to everything being available.
541  memset(AvailableArray, -1, sizeof(AvailableArray));
542 
543  initialize(*this, Triple(), StandardNames);
544 }
545 
547  // Default to everything being available.
548  memset(AvailableArray, -1, sizeof(AvailableArray));
549 
550  initialize(*this, T, StandardNames);
551 }
552 
554  : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
555  ShouldExtI32Return(TLI.ShouldExtI32Return),
556  ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) {
557  memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
558  VectorDescs = TLI.VectorDescs;
559  ScalarDescs = TLI.ScalarDescs;
560 }
561 
563  : CustomNames(std::move(TLI.CustomNames)),
564  ShouldExtI32Param(TLI.ShouldExtI32Param),
565  ShouldExtI32Return(TLI.ShouldExtI32Return),
566  ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) {
567  std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
568  AvailableArray);
569  VectorDescs = TLI.VectorDescs;
570  ScalarDescs = TLI.ScalarDescs;
571 }
572 
574  CustomNames = TLI.CustomNames;
575  ShouldExtI32Param = TLI.ShouldExtI32Param;
576  ShouldExtI32Return = TLI.ShouldExtI32Return;
577  ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
578  memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
579  return *this;
580 }
581 
583  CustomNames = std::move(TLI.CustomNames);
584  ShouldExtI32Param = TLI.ShouldExtI32Param;
585  ShouldExtI32Return = TLI.ShouldExtI32Return;
586  ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
587  std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
588  AvailableArray);
589  return *this;
590 }
591 
593  // Filter out empty names and names containing null bytes, those can't be in
594  // our table.
595  if (funcName.empty() || funcName.find('\0') != StringRef::npos)
596  return StringRef();
597 
598  // Check for \01 prefix that is used to mangle __asm declarations and
599  // strip it if present.
600  return GlobalValue::dropLLVMManglingEscape(funcName);
601 }
602 
604  LibFunc &F) const {
605  StringRef const *Start = &StandardNames[0];
606  StringRef const *End = &StandardNames[NumLibFuncs];
607 
608  funcName = sanitizeFunctionName(funcName);
609  if (funcName.empty())
610  return false;
611 
612  StringRef const *I = std::lower_bound(
613  Start, End, funcName, [](StringRef LHS, StringRef RHS) {
614  return LHS < RHS;
615  });
616  if (I != End && *I == funcName) {
617  F = (LibFunc)(I - Start);
618  return true;
619  }
620  return false;
621 }
622 
623 bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
624  LibFunc F,
625  const DataLayout *DL) const {
626  LLVMContext &Ctx = FTy.getContext();
627  Type *PCharTy = Type::getInt8PtrTy(Ctx);
628  Type *SizeTTy = DL ? DL->getIntPtrType(Ctx, /*AS=*/0) : nullptr;
629  auto IsSizeTTy = [SizeTTy](Type *Ty) {
630  return SizeTTy ? Ty == SizeTTy : Ty->isIntegerTy();
631  };
632  unsigned NumParams = FTy.getNumParams();
633 
634  switch (F) {
635  case LibFunc_execl:
636  case LibFunc_execlp:
637  case LibFunc_execle:
638  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
639  FTy.getParamType(1)->isPointerTy() &&
640  FTy.getReturnType()->isIntegerTy(32));
641  case LibFunc_execv:
642  case LibFunc_execvp:
643  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
644  FTy.getParamType(1)->isPointerTy() &&
645  FTy.getReturnType()->isIntegerTy(32));
646  case LibFunc_execvP:
647  case LibFunc_execvpe:
648  case LibFunc_execve:
649  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
650  FTy.getParamType(1)->isPointerTy() &&
651  FTy.getParamType(2)->isPointerTy() &&
652  FTy.getReturnType()->isIntegerTy(32));
653  case LibFunc_strlen:
654  return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
655  FTy.getReturnType()->isIntegerTy());
656 
657  case LibFunc_strchr:
658  case LibFunc_strrchr:
659  return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
660  FTy.getParamType(0) == FTy.getReturnType() &&
661  FTy.getParamType(1)->isIntegerTy());
662 
663  case LibFunc_strtol:
664  case LibFunc_strtod:
665  case LibFunc_strtof:
666  case LibFunc_strtoul:
667  case LibFunc_strtoll:
668  case LibFunc_strtold:
669  case LibFunc_strtoull:
670  return ((NumParams == 2 || NumParams == 3) &&
671  FTy.getParamType(0)->isPointerTy() &&
672  FTy.getParamType(1)->isPointerTy());
673  case LibFunc_strcat:
674  return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
675  FTy.getParamType(0) == FTy.getReturnType() &&
676  FTy.getParamType(1) == FTy.getReturnType());
677 
678  case LibFunc_strncat:
679  return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
680  FTy.getParamType(0) == FTy.getReturnType() &&
681  FTy.getParamType(1) == FTy.getReturnType() &&
682  IsSizeTTy(FTy.getParamType(2)));
683 
684  case LibFunc_strcpy_chk:
685  case LibFunc_stpcpy_chk:
686  --NumParams;
687  if (!IsSizeTTy(FTy.getParamType(NumParams)))
688  return false;
690  case LibFunc_strcpy:
691  case LibFunc_stpcpy:
692  return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(0) &&
693  FTy.getParamType(0) == FTy.getParamType(1) &&
694  FTy.getParamType(0) == PCharTy);
695 
696  case LibFunc_strncpy_chk:
697  case LibFunc_stpncpy_chk:
698  --NumParams;
699  if (!IsSizeTTy(FTy.getParamType(NumParams)))
700  return false;
702  case LibFunc_strncpy:
703  case LibFunc_stpncpy:
704  return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
705  FTy.getParamType(0) == FTy.getParamType(1) &&
706  FTy.getParamType(0) == PCharTy &&
707  IsSizeTTy(FTy.getParamType(2)));
708 
709  case LibFunc_strxfrm:
710  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
711  FTy.getParamType(1)->isPointerTy());
712 
713  case LibFunc_strcmp:
714  return (NumParams == 2 && FTy.getReturnType()->isIntegerTy(32) &&
715  FTy.getParamType(0)->isPointerTy() &&
716  FTy.getParamType(0) == FTy.getParamType(1));
717 
718  case LibFunc_strncmp:
719  return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
720  FTy.getParamType(0)->isPointerTy() &&
721  FTy.getParamType(0) == FTy.getParamType(1) &&
722  IsSizeTTy(FTy.getParamType(2)));
723 
724  case LibFunc_strspn:
725  case LibFunc_strcspn:
726  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
727  FTy.getParamType(0) == FTy.getParamType(1) &&
728  FTy.getReturnType()->isIntegerTy());
729 
730  case LibFunc_strcoll:
731  case LibFunc_strcasecmp:
732  case LibFunc_strncasecmp:
733  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
734  FTy.getParamType(1)->isPointerTy());
735 
736  case LibFunc_strstr:
737  return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
738  FTy.getParamType(0)->isPointerTy() &&
739  FTy.getParamType(1)->isPointerTy());
740 
741  case LibFunc_strpbrk:
742  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
743  FTy.getReturnType() == FTy.getParamType(0) &&
744  FTy.getParamType(0) == FTy.getParamType(1));
745 
746  case LibFunc_strtok:
747  case LibFunc_strtok_r:
748  return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
749  case LibFunc_scanf:
750  case LibFunc_setbuf:
751  case LibFunc_setvbuf:
752  return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
753  case LibFunc_strdup:
754  case LibFunc_strndup:
755  return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
756  FTy.getParamType(0)->isPointerTy());
757  case LibFunc_sscanf:
758  case LibFunc_stat:
759  case LibFunc_statvfs:
760  case LibFunc_siprintf:
761  case LibFunc_sprintf:
762  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
763  FTy.getParamType(1)->isPointerTy() &&
764  FTy.getReturnType()->isIntegerTy(32));
765  case LibFunc_snprintf:
766  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
767  FTy.getParamType(2)->isPointerTy() &&
768  FTy.getReturnType()->isIntegerTy(32));
769  case LibFunc_setitimer:
770  return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
771  FTy.getParamType(2)->isPointerTy());
772  case LibFunc_system:
773  return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
774  case LibFunc_malloc:
775  return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
776  case LibFunc_memcmp:
777  return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
778  FTy.getParamType(0)->isPointerTy() &&
779  FTy.getParamType(1)->isPointerTy());
780 
781  case LibFunc_memchr:
782  case LibFunc_memrchr:
783  return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
784  FTy.getReturnType() == FTy.getParamType(0) &&
785  FTy.getParamType(1)->isIntegerTy(32) &&
786  IsSizeTTy(FTy.getParamType(2)));
787  case LibFunc_modf:
788  case LibFunc_modff:
789  case LibFunc_modfl:
790  return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
791 
792  case LibFunc_memcpy_chk:
793  case LibFunc_memmove_chk:
794  --NumParams;
795  if (!IsSizeTTy(FTy.getParamType(NumParams)))
796  return false;
798  case LibFunc_memcpy:
799  case LibFunc_mempcpy:
800  case LibFunc_memmove:
801  return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
802  FTy.getParamType(0)->isPointerTy() &&
803  FTy.getParamType(1)->isPointerTy() &&
804  IsSizeTTy(FTy.getParamType(2)));
805 
806  case LibFunc_memset_chk:
807  --NumParams;
808  if (!IsSizeTTy(FTy.getParamType(NumParams)))
809  return false;
811  case LibFunc_memset:
812  return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
813  FTy.getParamType(0)->isPointerTy() &&
814  FTy.getParamType(1)->isIntegerTy() &&
815  IsSizeTTy(FTy.getParamType(2)));
816 
817  case LibFunc_memccpy:
818  return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
819  case LibFunc_memalign:
820  return (FTy.getReturnType()->isPointerTy());
821  case LibFunc_realloc:
822  case LibFunc_reallocf:
823  return (NumParams == 2 && FTy.getReturnType() == PCharTy &&
824  FTy.getParamType(0) == FTy.getReturnType() &&
825  IsSizeTTy(FTy.getParamType(1)));
826  case LibFunc_read:
827  return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
828  case LibFunc_rewind:
829  case LibFunc_rmdir:
830  case LibFunc_remove:
831  case LibFunc_realpath:
832  return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
833  case LibFunc_rename:
834  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
835  FTy.getParamType(1)->isPointerTy());
836  case LibFunc_readlink:
837  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
838  FTy.getParamType(1)->isPointerTy());
839  case LibFunc_write:
840  return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
841  case LibFunc_bcopy:
842  case LibFunc_bcmp:
843  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
844  FTy.getParamType(1)->isPointerTy());
845  case LibFunc_bzero:
846  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
847  case LibFunc_calloc:
848  return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
849 
850  case LibFunc_atof:
851  case LibFunc_atoi:
852  case LibFunc_atol:
853  case LibFunc_atoll:
854  case LibFunc_ferror:
855  case LibFunc_getenv:
856  case LibFunc_getpwnam:
857  case LibFunc_iprintf:
858  case LibFunc_pclose:
859  case LibFunc_perror:
860  case LibFunc_printf:
861  case LibFunc_puts:
862  case LibFunc_uname:
863  case LibFunc_under_IO_getc:
864  case LibFunc_unlink:
865  case LibFunc_unsetenv:
866  return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
867 
868  case LibFunc_access:
869  case LibFunc_chmod:
870  case LibFunc_chown:
871  case LibFunc_clearerr:
872  case LibFunc_closedir:
873  case LibFunc_ctermid:
874  case LibFunc_fclose:
875  case LibFunc_feof:
876  case LibFunc_fflush:
877  case LibFunc_fgetc:
878  case LibFunc_fgetc_unlocked:
879  case LibFunc_fileno:
880  case LibFunc_flockfile:
881  case LibFunc_free:
882  case LibFunc_fseek:
883  case LibFunc_fseeko64:
884  case LibFunc_fseeko:
885  case LibFunc_fsetpos:
886  case LibFunc_ftell:
887  case LibFunc_ftello64:
888  case LibFunc_ftello:
889  case LibFunc_ftrylockfile:
890  case LibFunc_funlockfile:
891  case LibFunc_getc:
892  case LibFunc_getc_unlocked:
893  case LibFunc_getlogin_r:
894  case LibFunc_mkdir:
895  case LibFunc_mktime:
896  case LibFunc_times:
897  return (NumParams != 0 && FTy.getParamType(0)->isPointerTy());
898 
899  case LibFunc_fopen:
900  return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
901  FTy.getParamType(0)->isPointerTy() &&
902  FTy.getParamType(1)->isPointerTy());
903  case LibFunc_fork:
904  return (NumParams == 0 && FTy.getReturnType()->isIntegerTy(32));
905  case LibFunc_fdopen:
906  return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
907  FTy.getParamType(1)->isPointerTy());
908  case LibFunc_fputc:
909  case LibFunc_fputc_unlocked:
910  case LibFunc_fstat:
911  case LibFunc_frexp:
912  case LibFunc_frexpf:
913  case LibFunc_frexpl:
914  case LibFunc_fstatvfs:
915  return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
916  case LibFunc_fgets:
917  case LibFunc_fgets_unlocked:
918  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
919  FTy.getParamType(2)->isPointerTy());
920  case LibFunc_fread:
921  case LibFunc_fread_unlocked:
922  return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
923  FTy.getParamType(3)->isPointerTy());
924  case LibFunc_fwrite:
925  case LibFunc_fwrite_unlocked:
926  return (NumParams == 4 && FTy.getReturnType()->isIntegerTy() &&
927  FTy.getParamType(0)->isPointerTy() &&
928  FTy.getParamType(1)->isIntegerTy() &&
929  FTy.getParamType(2)->isIntegerTy() &&
930  FTy.getParamType(3)->isPointerTy());
931  case LibFunc_fputs:
932  case LibFunc_fputs_unlocked:
933  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
934  FTy.getParamType(1)->isPointerTy());
935  case LibFunc_fscanf:
936  case LibFunc_fiprintf:
937  case LibFunc_fprintf:
938  return (NumParams >= 2 && FTy.getReturnType()->isIntegerTy() &&
939  FTy.getParamType(0)->isPointerTy() &&
940  FTy.getParamType(1)->isPointerTy());
941  case LibFunc_fgetpos:
942  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
943  FTy.getParamType(1)->isPointerTy());
944  case LibFunc_getchar:
945  case LibFunc_getchar_unlocked:
946  return (NumParams == 0 && FTy.getReturnType()->isIntegerTy());
947  case LibFunc_gets:
948  return (NumParams == 1 && FTy.getParamType(0) == PCharTy);
949  case LibFunc_getitimer:
950  return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
951  case LibFunc_ungetc:
952  return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
953  case LibFunc_utime:
954  case LibFunc_utimes:
955  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
956  FTy.getParamType(1)->isPointerTy());
957  case LibFunc_putc:
958  case LibFunc_putc_unlocked:
959  return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
960  case LibFunc_pread:
961  case LibFunc_pwrite:
962  return (NumParams == 4 && FTy.getParamType(1)->isPointerTy());
963  case LibFunc_popen:
964  return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
965  FTy.getParamType(0)->isPointerTy() &&
966  FTy.getParamType(1)->isPointerTy());
967  case LibFunc_vscanf:
968  return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
969  case LibFunc_vsscanf:
970  return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
971  FTy.getParamType(2)->isPointerTy());
972  case LibFunc_vfscanf:
973  return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
974  FTy.getParamType(2)->isPointerTy());
975  case LibFunc_valloc:
976  return (FTy.getReturnType()->isPointerTy());
977  case LibFunc_vprintf:
978  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
979  case LibFunc_vfprintf:
980  case LibFunc_vsprintf:
981  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
982  FTy.getParamType(1)->isPointerTy());
983  case LibFunc_vsnprintf:
984  return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
985  FTy.getParamType(2)->isPointerTy());
986  case LibFunc_open:
987  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
988  case LibFunc_opendir:
989  return (NumParams == 1 && FTy.getReturnType()->isPointerTy() &&
990  FTy.getParamType(0)->isPointerTy());
991  case LibFunc_tmpfile:
992  return (FTy.getReturnType()->isPointerTy());
993  case LibFunc_htonl:
994  case LibFunc_ntohl:
995  return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
996  FTy.getReturnType() == FTy.getParamType(0));
997  case LibFunc_htons:
998  case LibFunc_ntohs:
999  return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(16) &&
1000  FTy.getReturnType() == FTy.getParamType(0));
1001  case LibFunc_lstat:
1002  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1003  FTy.getParamType(1)->isPointerTy());
1004  case LibFunc_lchown:
1005  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
1006  case LibFunc_qsort:
1007  return (NumParams == 4 && FTy.getParamType(3)->isPointerTy());
1008  case LibFunc_dunder_strdup:
1009  case LibFunc_dunder_strndup:
1010  return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
1011  FTy.getParamType(0)->isPointerTy());
1012  case LibFunc_dunder_strtok_r:
1013  return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
1014  case LibFunc_under_IO_putc:
1015  return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1016  case LibFunc_dunder_isoc99_scanf:
1017  return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
1018  case LibFunc_stat64:
1019  case LibFunc_lstat64:
1020  case LibFunc_statvfs64:
1021  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1022  FTy.getParamType(1)->isPointerTy());
1023  case LibFunc_dunder_isoc99_sscanf:
1024  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1025  FTy.getParamType(1)->isPointerTy());
1026  case LibFunc_fopen64:
1027  return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
1028  FTy.getParamType(0)->isPointerTy() &&
1029  FTy.getParamType(1)->isPointerTy());
1030  case LibFunc_tmpfile64:
1031  return (FTy.getReturnType()->isPointerTy());
1032  case LibFunc_fstat64:
1033  case LibFunc_fstatvfs64:
1034  return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1035  case LibFunc_open64:
1036  return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
1037  case LibFunc_gettimeofday:
1038  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1039  FTy.getParamType(1)->isPointerTy());
1040 
1041  // new(unsigned int);
1042  case LibFunc_Znwj:
1043  // new(unsigned long);
1044  case LibFunc_Znwm:
1045  // new[](unsigned int);
1046  case LibFunc_Znaj:
1047  // new[](unsigned long);
1048  case LibFunc_Znam:
1049  // new(unsigned int);
1050  case LibFunc_msvc_new_int:
1051  // new(unsigned long long);
1052  case LibFunc_msvc_new_longlong:
1053  // new[](unsigned int);
1054  case LibFunc_msvc_new_array_int:
1055  // new[](unsigned long long);
1056  case LibFunc_msvc_new_array_longlong:
1057  return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
1058 
1059  // new(unsigned int, nothrow);
1060  case LibFunc_ZnwjRKSt9nothrow_t:
1061  // new(unsigned long, nothrow);
1062  case LibFunc_ZnwmRKSt9nothrow_t:
1063  // new[](unsigned int, nothrow);
1064  case LibFunc_ZnajRKSt9nothrow_t:
1065  // new[](unsigned long, nothrow);
1066  case LibFunc_ZnamRKSt9nothrow_t:
1067  // new(unsigned int, nothrow);
1068  case LibFunc_msvc_new_int_nothrow:
1069  // new(unsigned long long, nothrow);
1070  case LibFunc_msvc_new_longlong_nothrow:
1071  // new[](unsigned int, nothrow);
1072  case LibFunc_msvc_new_array_int_nothrow:
1073  // new[](unsigned long long, nothrow);
1074  case LibFunc_msvc_new_array_longlong_nothrow:
1075  // new(unsigned int, align_val_t)
1076  case LibFunc_ZnwjSt11align_val_t:
1077  // new(unsigned long, align_val_t)
1078  case LibFunc_ZnwmSt11align_val_t:
1079  // new[](unsigned int, align_val_t)
1080  case LibFunc_ZnajSt11align_val_t:
1081  // new[](unsigned long, align_val_t)
1082  case LibFunc_ZnamSt11align_val_t:
1083  return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
1084 
1085  // new(unsigned int, align_val_t, nothrow)
1086  case LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t:
1087  // new(unsigned long, align_val_t, nothrow)
1088  case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1089  // new[](unsigned int, align_val_t, nothrow)
1090  case LibFunc_ZnajSt11align_val_tRKSt9nothrow_t:
1091  // new[](unsigned long, align_val_t, nothrow)
1092  case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1093  return (NumParams == 3 && FTy.getReturnType()->isPointerTy());
1094 
1095  // void operator delete[](void*);
1096  case LibFunc_ZdaPv:
1097  // void operator delete(void*);
1098  case LibFunc_ZdlPv:
1099  // void operator delete[](void*);
1100  case LibFunc_msvc_delete_array_ptr32:
1101  // void operator delete[](void*);
1102  case LibFunc_msvc_delete_array_ptr64:
1103  // void operator delete(void*);
1104  case LibFunc_msvc_delete_ptr32:
1105  // void operator delete(void*);
1106  case LibFunc_msvc_delete_ptr64:
1107  return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
1108 
1109  // void operator delete[](void*, nothrow);
1110  case LibFunc_ZdaPvRKSt9nothrow_t:
1111  // void operator delete[](void*, unsigned int);
1112  case LibFunc_ZdaPvj:
1113  // void operator delete[](void*, unsigned long);
1114  case LibFunc_ZdaPvm:
1115  // void operator delete(void*, nothrow);
1116  case LibFunc_ZdlPvRKSt9nothrow_t:
1117  // void operator delete(void*, unsigned int);
1118  case LibFunc_ZdlPvj:
1119  // void operator delete(void*, unsigned long);
1120  case LibFunc_ZdlPvm:
1121  // void operator delete(void*, align_val_t)
1122  case LibFunc_ZdlPvSt11align_val_t:
1123  // void operator delete[](void*, align_val_t)
1124  case LibFunc_ZdaPvSt11align_val_t:
1125  // void operator delete[](void*, unsigned int);
1126  case LibFunc_msvc_delete_array_ptr32_int:
1127  // void operator delete[](void*, nothrow);
1128  case LibFunc_msvc_delete_array_ptr32_nothrow:
1129  // void operator delete[](void*, unsigned long long);
1130  case LibFunc_msvc_delete_array_ptr64_longlong:
1131  // void operator delete[](void*, nothrow);
1132  case LibFunc_msvc_delete_array_ptr64_nothrow:
1133  // void operator delete(void*, unsigned int);
1134  case LibFunc_msvc_delete_ptr32_int:
1135  // void operator delete(void*, nothrow);
1136  case LibFunc_msvc_delete_ptr32_nothrow:
1137  // void operator delete(void*, unsigned long long);
1138  case LibFunc_msvc_delete_ptr64_longlong:
1139  // void operator delete(void*, nothrow);
1140  case LibFunc_msvc_delete_ptr64_nothrow:
1141  return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
1142 
1143  // void operator delete(void*, align_val_t, nothrow)
1144  case LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t:
1145  // void operator delete[](void*, align_val_t, nothrow)
1146  case LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t:
1147  return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
1148 
1149  case LibFunc_memset_pattern16:
1150  return (!FTy.isVarArg() && NumParams == 3 &&
1151  FTy.getParamType(0)->isPointerTy() &&
1152  FTy.getParamType(1)->isPointerTy() &&
1153  FTy.getParamType(2)->isIntegerTy());
1154 
1155  case LibFunc_cxa_guard_abort:
1156  case LibFunc_cxa_guard_acquire:
1157  case LibFunc_cxa_guard_release:
1158  case LibFunc_nvvm_reflect:
1159  return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
1160 
1161  case LibFunc_sincospi_stret:
1162  case LibFunc_sincospif_stret:
1163  return (NumParams == 1 && FTy.getParamType(0)->isFloatingPointTy());
1164 
1165  case LibFunc_acos:
1166  case LibFunc_acos_finite:
1167  case LibFunc_acosf:
1168  case LibFunc_acosf_finite:
1169  case LibFunc_acosh:
1170  case LibFunc_acosh_finite:
1171  case LibFunc_acoshf:
1172  case LibFunc_acoshf_finite:
1173  case LibFunc_acoshl:
1174  case LibFunc_acoshl_finite:
1175  case LibFunc_acosl:
1176  case LibFunc_acosl_finite:
1177  case LibFunc_asin:
1178  case LibFunc_asin_finite:
1179  case LibFunc_asinf:
1180  case LibFunc_asinf_finite:
1181  case LibFunc_asinh:
1182  case LibFunc_asinhf:
1183  case LibFunc_asinhl:
1184  case LibFunc_asinl:
1185  case LibFunc_asinl_finite:
1186  case LibFunc_atan:
1187  case LibFunc_atanf:
1188  case LibFunc_atanh:
1189  case LibFunc_atanh_finite:
1190  case LibFunc_atanhf:
1191  case LibFunc_atanhf_finite:
1192  case LibFunc_atanhl:
1193  case LibFunc_atanhl_finite:
1194  case LibFunc_atanl:
1195  case LibFunc_cbrt:
1196  case LibFunc_cbrtf:
1197  case LibFunc_cbrtl:
1198  case LibFunc_ceil:
1199  case LibFunc_ceilf:
1200  case LibFunc_ceill:
1201  case LibFunc_cos:
1202  case LibFunc_cosf:
1203  case LibFunc_cosh:
1204  case LibFunc_cosh_finite:
1205  case LibFunc_coshf:
1206  case LibFunc_coshf_finite:
1207  case LibFunc_coshl:
1208  case LibFunc_coshl_finite:
1209  case LibFunc_cosl:
1210  case LibFunc_exp10:
1211  case LibFunc_exp10_finite:
1212  case LibFunc_exp10f:
1213  case LibFunc_exp10f_finite:
1214  case LibFunc_exp10l:
1215  case LibFunc_exp10l_finite:
1216  case LibFunc_exp2:
1217  case LibFunc_exp2_finite:
1218  case LibFunc_exp2f:
1219  case LibFunc_exp2f_finite:
1220  case LibFunc_exp2l:
1221  case LibFunc_exp2l_finite:
1222  case LibFunc_exp:
1223  case LibFunc_exp_finite:
1224  case LibFunc_expf:
1225  case LibFunc_expf_finite:
1226  case LibFunc_expl:
1227  case LibFunc_expl_finite:
1228  case LibFunc_expm1:
1229  case LibFunc_expm1f:
1230  case LibFunc_expm1l:
1231  case LibFunc_fabs:
1232  case LibFunc_fabsf:
1233  case LibFunc_fabsl:
1234  case LibFunc_floor:
1235  case LibFunc_floorf:
1236  case LibFunc_floorl:
1237  case LibFunc_log10:
1238  case LibFunc_log10_finite:
1239  case LibFunc_log10f:
1240  case LibFunc_log10f_finite:
1241  case LibFunc_log10l:
1242  case LibFunc_log10l_finite:
1243  case LibFunc_log1p:
1244  case LibFunc_log1pf:
1245  case LibFunc_log1pl:
1246  case LibFunc_log2:
1247  case LibFunc_log2_finite:
1248  case LibFunc_log2f:
1249  case LibFunc_log2f_finite:
1250  case LibFunc_log2l:
1251  case LibFunc_log2l_finite:
1252  case LibFunc_log:
1253  case LibFunc_log_finite:
1254  case LibFunc_logb:
1255  case LibFunc_logbf:
1256  case LibFunc_logbl:
1257  case LibFunc_logf:
1258  case LibFunc_logf_finite:
1259  case LibFunc_logl:
1260  case LibFunc_logl_finite:
1261  case LibFunc_nearbyint:
1262  case LibFunc_nearbyintf:
1263  case LibFunc_nearbyintl:
1264  case LibFunc_rint:
1265  case LibFunc_rintf:
1266  case LibFunc_rintl:
1267  case LibFunc_round:
1268  case LibFunc_roundf:
1269  case LibFunc_roundl:
1270  case LibFunc_sin:
1271  case LibFunc_sinf:
1272  case LibFunc_sinh:
1273  case LibFunc_sinh_finite:
1274  case LibFunc_sinhf:
1275  case LibFunc_sinhf_finite:
1276  case LibFunc_sinhl:
1277  case LibFunc_sinhl_finite:
1278  case LibFunc_sinl:
1279  case LibFunc_sqrt:
1280  case LibFunc_sqrt_finite:
1281  case LibFunc_sqrtf:
1282  case LibFunc_sqrtf_finite:
1283  case LibFunc_sqrtl:
1284  case LibFunc_sqrtl_finite:
1285  case LibFunc_tan:
1286  case LibFunc_tanf:
1287  case LibFunc_tanh:
1288  case LibFunc_tanhf:
1289  case LibFunc_tanhl:
1290  case LibFunc_tanl:
1291  case LibFunc_trunc:
1292  case LibFunc_truncf:
1293  case LibFunc_truncl:
1294  return (NumParams == 1 && FTy.getReturnType()->isFloatingPointTy() &&
1295  FTy.getReturnType() == FTy.getParamType(0));
1296 
1297  case LibFunc_atan2:
1298  case LibFunc_atan2_finite:
1299  case LibFunc_atan2f:
1300  case LibFunc_atan2f_finite:
1301  case LibFunc_atan2l:
1302  case LibFunc_atan2l_finite:
1303  case LibFunc_fmin:
1304  case LibFunc_fminf:
1305  case LibFunc_fminl:
1306  case LibFunc_fmax:
1307  case LibFunc_fmaxf:
1308  case LibFunc_fmaxl:
1309  case LibFunc_fmod:
1310  case LibFunc_fmodf:
1311  case LibFunc_fmodl:
1312  case LibFunc_copysign:
1313  case LibFunc_copysignf:
1314  case LibFunc_copysignl:
1315  case LibFunc_pow:
1316  case LibFunc_pow_finite:
1317  case LibFunc_powf:
1318  case LibFunc_powf_finite:
1319  case LibFunc_powl:
1320  case LibFunc_powl_finite:
1321  return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
1322  FTy.getReturnType() == FTy.getParamType(0) &&
1323  FTy.getReturnType() == FTy.getParamType(1));
1324 
1325  case LibFunc_ldexp:
1326  case LibFunc_ldexpf:
1327  case LibFunc_ldexpl:
1328  return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
1329  FTy.getReturnType() == FTy.getParamType(0) &&
1330  FTy.getParamType(1)->isIntegerTy(32));
1331 
1332  case LibFunc_ffs:
1333  case LibFunc_ffsl:
1334  case LibFunc_ffsll:
1335  case LibFunc_fls:
1336  case LibFunc_flsl:
1337  case LibFunc_flsll:
1338  return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
1339  FTy.getParamType(0)->isIntegerTy());
1340 
1341  case LibFunc_isdigit:
1342  case LibFunc_isascii:
1343  case LibFunc_toascii:
1344  case LibFunc_putchar:
1345  case LibFunc_putchar_unlocked:
1346  return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
1347  FTy.getReturnType() == FTy.getParamType(0));
1348 
1349  case LibFunc_abs:
1350  case LibFunc_labs:
1351  case LibFunc_llabs:
1352  return (NumParams == 1 && FTy.getReturnType()->isIntegerTy() &&
1353  FTy.getReturnType() == FTy.getParamType(0));
1354 
1355  case LibFunc_cxa_atexit:
1356  return (NumParams == 3 && FTy.getReturnType()->isIntegerTy() &&
1357  FTy.getParamType(0)->isPointerTy() &&
1358  FTy.getParamType(1)->isPointerTy() &&
1359  FTy.getParamType(2)->isPointerTy());
1360 
1361  case LibFunc_sinpi:
1362  case LibFunc_cospi:
1363  return (NumParams == 1 && FTy.getReturnType()->isDoubleTy() &&
1364  FTy.getReturnType() == FTy.getParamType(0));
1365 
1366  case LibFunc_sinpif:
1367  case LibFunc_cospif:
1368  return (NumParams == 1 && FTy.getReturnType()->isFloatTy() &&
1369  FTy.getReturnType() == FTy.getParamType(0));
1370 
1371  case LibFunc_strnlen:
1372  return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(1) &&
1373  FTy.getParamType(0) == PCharTy &&
1374  FTy.getParamType(1) == SizeTTy);
1375 
1376  case LibFunc_posix_memalign:
1377  return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
1378  FTy.getParamType(0)->isPointerTy() &&
1379  FTy.getParamType(1) == SizeTTy && FTy.getParamType(2) == SizeTTy);
1380 
1381  case LibFunc_wcslen:
1382  return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
1383  FTy.getReturnType()->isIntegerTy());
1384 
1385  case LibFunc_cabs:
1386  case LibFunc_cabsf:
1387  case LibFunc_cabsl: {
1388  Type* RetTy = FTy.getReturnType();
1389  if (!RetTy->isFloatingPointTy())
1390  return false;
1391 
1392  // NOTE: These prototypes are target specific and currently support
1393  // "complex" passed as an array or discrete real & imaginary parameters.
1394  // Add other calling conventions to enable libcall optimizations.
1395  if (NumParams == 1)
1396  return (FTy.getParamType(0)->isArrayTy() &&
1397  FTy.getParamType(0)->getArrayNumElements() == 2 &&
1398  FTy.getParamType(0)->getArrayElementType() == RetTy);
1399  else if (NumParams == 2)
1400  return (FTy.getParamType(0) == RetTy && FTy.getParamType(1) == RetTy);
1401  else
1402  return false;
1403  }
1404  case LibFunc::NumLibFuncs:
1405  break;
1406  }
1407 
1408  llvm_unreachable("Invalid libfunc");
1409 }
1410 
1412  LibFunc &F) const {
1413  const DataLayout *DL =
1414  FDecl.getParent() ? &FDecl.getParent()->getDataLayout() : nullptr;
1415  return getLibFunc(FDecl.getName(), F) &&
1416  isValidProtoForLibFunc(*FDecl.getFunctionType(), F, DL);
1417 }
1418 
1420  memset(AvailableArray, 0, sizeof(AvailableArray));
1421 }
1422 
1423 static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS) {
1424  return LHS.ScalarFnName < RHS.ScalarFnName;
1425 }
1426 
1427 static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS) {
1428  return LHS.VectorFnName < RHS.VectorFnName;
1429 }
1430 
1431 static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S) {
1432  return LHS.ScalarFnName < S;
1433 }
1434 
1435 static bool compareWithVectorFnName(const VecDesc &LHS, StringRef S) {
1436  return LHS.VectorFnName < S;
1437 }
1438 
1440  VectorDescs.insert(VectorDescs.end(), Fns.begin(), Fns.end());
1441  llvm::sort(VectorDescs, compareByScalarFnName);
1442 
1443  ScalarDescs.insert(ScalarDescs.end(), Fns.begin(), Fns.end());
1444  llvm::sort(ScalarDescs, compareByVectorFnName);
1445 }
1446 
1448  enum VectorLibrary VecLib) {
1449  switch (VecLib) {
1450  case Accelerate: {
1451  const VecDesc VecFuncs[] = {
1452  // Floating-Point Arithmetic and Auxiliary Functions
1453  {"ceilf", "vceilf", 4},
1454  {"fabsf", "vfabsf", 4},
1455  {"llvm.fabs.f32", "vfabsf", 4},
1456  {"floorf", "vfloorf", 4},
1457  {"sqrtf", "vsqrtf", 4},
1458  {"llvm.sqrt.f32", "vsqrtf", 4},
1459 
1460  // Exponential and Logarithmic Functions
1461  {"expf", "vexpf", 4},
1462  {"llvm.exp.f32", "vexpf", 4},
1463  {"expm1f", "vexpm1f", 4},
1464  {"logf", "vlogf", 4},
1465  {"llvm.log.f32", "vlogf", 4},
1466  {"log1pf", "vlog1pf", 4},
1467  {"log10f", "vlog10f", 4},
1468  {"llvm.log10.f32", "vlog10f", 4},
1469  {"logbf", "vlogbf", 4},
1470 
1471  // Trigonometric Functions
1472  {"sinf", "vsinf", 4},
1473  {"llvm.sin.f32", "vsinf", 4},
1474  {"cosf", "vcosf", 4},
1475  {"llvm.cos.f32", "vcosf", 4},
1476  {"tanf", "vtanf", 4},
1477  {"asinf", "vasinf", 4},
1478  {"acosf", "vacosf", 4},
1479  {"atanf", "vatanf", 4},
1480 
1481  // Hyperbolic Functions
1482  {"sinhf", "vsinhf", 4},
1483  {"coshf", "vcoshf", 4},
1484  {"tanhf", "vtanhf", 4},
1485  {"asinhf", "vasinhf", 4},
1486  {"acoshf", "vacoshf", 4},
1487  {"atanhf", "vatanhf", 4},
1488  };
1489  addVectorizableFunctions(VecFuncs);
1490  break;
1491  }
1492  case SVML: {
1493  const VecDesc VecFuncs[] = {
1494  {"sin", "__svml_sin2", 2},
1495  {"sin", "__svml_sin4", 4},
1496  {"sin", "__svml_sin8", 8},
1497 
1498  {"sinf", "__svml_sinf4", 4},
1499  {"sinf", "__svml_sinf8", 8},
1500  {"sinf", "__svml_sinf16", 16},
1501 
1502  {"llvm.sin.f64", "__svml_sin2", 2},
1503  {"llvm.sin.f64", "__svml_sin4", 4},
1504  {"llvm.sin.f64", "__svml_sin8", 8},
1505 
1506  {"llvm.sin.f32", "__svml_sinf4", 4},
1507  {"llvm.sin.f32", "__svml_sinf8", 8},
1508  {"llvm.sin.f32", "__svml_sinf16", 16},
1509 
1510  {"cos", "__svml_cos2", 2},
1511  {"cos", "__svml_cos4", 4},
1512  {"cos", "__svml_cos8", 8},
1513 
1514  {"cosf", "__svml_cosf4", 4},
1515  {"cosf", "__svml_cosf8", 8},
1516  {"cosf", "__svml_cosf16", 16},
1517 
1518  {"llvm.cos.f64", "__svml_cos2", 2},
1519  {"llvm.cos.f64", "__svml_cos4", 4},
1520  {"llvm.cos.f64", "__svml_cos8", 8},
1521 
1522  {"llvm.cos.f32", "__svml_cosf4", 4},
1523  {"llvm.cos.f32", "__svml_cosf8", 8},
1524  {"llvm.cos.f32", "__svml_cosf16", 16},
1525 
1526  {"pow", "__svml_pow2", 2},
1527  {"pow", "__svml_pow4", 4},
1528  {"pow", "__svml_pow8", 8},
1529 
1530  {"powf", "__svml_powf4", 4},
1531  {"powf", "__svml_powf8", 8},
1532  {"powf", "__svml_powf16", 16},
1533 
1534  { "__pow_finite", "__svml_pow2", 2 },
1535  { "__pow_finite", "__svml_pow4", 4 },
1536  { "__pow_finite", "__svml_pow8", 8 },
1537 
1538  { "__powf_finite", "__svml_powf4", 4 },
1539  { "__powf_finite", "__svml_powf8", 8 },
1540  { "__powf_finite", "__svml_powf16", 16 },
1541 
1542  {"llvm.pow.f64", "__svml_pow2", 2},
1543  {"llvm.pow.f64", "__svml_pow4", 4},
1544  {"llvm.pow.f64", "__svml_pow8", 8},
1545 
1546  {"llvm.pow.f32", "__svml_powf4", 4},
1547  {"llvm.pow.f32", "__svml_powf8", 8},
1548  {"llvm.pow.f32", "__svml_powf16", 16},
1549 
1550  {"exp", "__svml_exp2", 2},
1551  {"exp", "__svml_exp4", 4},
1552  {"exp", "__svml_exp8", 8},
1553 
1554  {"expf", "__svml_expf4", 4},
1555  {"expf", "__svml_expf8", 8},
1556  {"expf", "__svml_expf16", 16},
1557 
1558  { "__exp_finite", "__svml_exp2", 2 },
1559  { "__exp_finite", "__svml_exp4", 4 },
1560  { "__exp_finite", "__svml_exp8", 8 },
1561 
1562  { "__expf_finite", "__svml_expf4", 4 },
1563  { "__expf_finite", "__svml_expf8", 8 },
1564  { "__expf_finite", "__svml_expf16", 16 },
1565 
1566  {"llvm.exp.f64", "__svml_exp2", 2},
1567  {"llvm.exp.f64", "__svml_exp4", 4},
1568  {"llvm.exp.f64", "__svml_exp8", 8},
1569 
1570  {"llvm.exp.f32", "__svml_expf4", 4},
1571  {"llvm.exp.f32", "__svml_expf8", 8},
1572  {"llvm.exp.f32", "__svml_expf16", 16},
1573 
1574  {"log", "__svml_log2", 2},
1575  {"log", "__svml_log4", 4},
1576  {"log", "__svml_log8", 8},
1577 
1578  {"logf", "__svml_logf4", 4},
1579  {"logf", "__svml_logf8", 8},
1580  {"logf", "__svml_logf16", 16},
1581 
1582  { "__log_finite", "__svml_log2", 2 },
1583  { "__log_finite", "__svml_log4", 4 },
1584  { "__log_finite", "__svml_log8", 8 },
1585 
1586  { "__logf_finite", "__svml_logf4", 4 },
1587  { "__logf_finite", "__svml_logf8", 8 },
1588  { "__logf_finite", "__svml_logf16", 16 },
1589 
1590  {"llvm.log.f64", "__svml_log2", 2},
1591  {"llvm.log.f64", "__svml_log4", 4},
1592  {"llvm.log.f64", "__svml_log8", 8},
1593 
1594  {"llvm.log.f32", "__svml_logf4", 4},
1595  {"llvm.log.f32", "__svml_logf8", 8},
1596  {"llvm.log.f32", "__svml_logf16", 16},
1597  };
1598  addVectorizableFunctions(VecFuncs);
1599  break;
1600  }
1601  case NoLibrary:
1602  break;
1603  }
1604 }
1605 
1607  funcName = sanitizeFunctionName(funcName);
1608  if (funcName.empty())
1609  return false;
1610 
1611  std::vector<VecDesc>::const_iterator I = std::lower_bound(
1612  VectorDescs.begin(), VectorDescs.end(), funcName,
1614  return I != VectorDescs.end() && StringRef(I->ScalarFnName) == funcName;
1615 }
1616 
1618  unsigned VF) const {
1619  F = sanitizeFunctionName(F);
1620  if (F.empty())
1621  return F;
1622  std::vector<VecDesc>::const_iterator I = std::lower_bound(
1623  VectorDescs.begin(), VectorDescs.end(), F, compareWithScalarFnName);
1624  while (I != VectorDescs.end() && StringRef(I->ScalarFnName) == F) {
1625  if (I->VectorizationFactor == VF)
1626  return I->VectorFnName;
1627  ++I;
1628  }
1629  return StringRef();
1630 }
1631 
1633  unsigned &VF) const {
1634  F = sanitizeFunctionName(F);
1635  if (F.empty())
1636  return F;
1637 
1638  std::vector<VecDesc>::const_iterator I = std::lower_bound(
1639  ScalarDescs.begin(), ScalarDescs.end(), F, compareWithVectorFnName);
1640  if (I == VectorDescs.end() || StringRef(I->VectorFnName) != F)
1641  return StringRef();
1642  VF = I->VectorizationFactor;
1643  return I->ScalarFnName;
1644 }
1645 
1648  if (PresetInfoImpl)
1649  return TargetLibraryInfo(*PresetInfoImpl);
1650 
1651  return TargetLibraryInfo(lookupInfoImpl(Triple(M.getTargetTriple())));
1652 }
1653 
1656  if (PresetInfoImpl)
1657  return TargetLibraryInfo(*PresetInfoImpl);
1658 
1659  return TargetLibraryInfo(
1660  lookupInfoImpl(Triple(F.getParent()->getTargetTriple())));
1661 }
1662 
1663 TargetLibraryInfoImpl &TargetLibraryAnalysis::lookupInfoImpl(const Triple &T) {
1664  std::unique_ptr<TargetLibraryInfoImpl> &Impl =
1665  Impls[T.normalize()];
1666  if (!Impl)
1667  Impl.reset(new TargetLibraryInfoImpl(T));
1668 
1669  return *Impl;
1670 }
1671 
1673  if (auto *ShortWChar = cast_or_null<ConstantAsMetadata>(
1674  M.getModuleFlag("wchar_size")))
1675  return cast<ConstantInt>(ShortWChar->getValue())->getZExtValue();
1676  return 0;
1677 }
1678 
1680  : ImmutablePass(ID), TLIImpl(), TLI(TLIImpl) {
1682 }
1683 
1685  : ImmutablePass(ID), TLIImpl(T), TLI(TLIImpl) {
1687 }
1688 
1690  const TargetLibraryInfoImpl &TLIImpl)
1691  : ImmutablePass(ID), TLIImpl(TLIImpl), TLI(this->TLIImpl) {
1693 }
1694 
1695 AnalysisKey TargetLibraryAnalysis::Key;
1696 
1697 // Register the basic pass.
1699  "Target Library Information", false, true)
1701 
1702 void TargetLibraryInfoWrapperPass::anchor() {}
bool isOSDarwin() const
isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS).
Definition: Triple.h:474
A parsed version of the target data layout string in and methods for querying it. ...
Definition: DataLayout.h:110
const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:258
const std::string & getTargetTriple() const
Get the target triple which is a string describing the target host.
Definition: Module.h:239
static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS)
static std::string normalize(StringRef Str)
normalize - Turn an arbitrary machine specification into the canonical triple form (or something sens...
Definition: Triple.cpp:771
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
Definition: Path.cpp:249
This class represents lattice values for constants.
Definition: AllocatorList.h:23
bool isMacOSX() const
isMacOSX - Is this a Mac OS X triple.
Definition: Triple.h:446
Type * getParamType(unsigned i) const
Parameter type accessors.
Definition: DerivedTypes.h:134
void setShouldExtI32Return(bool Val)
Set to true iff i32 results from library functions should have signext or zeroext attributes if they ...
void addVectorizableFunctions(ArrayRef< VecDesc > Fns)
Add a set of scalar -> vector mappings, queryable via getVectorizedFunction and getScalarizedFunction...
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:64
iterator begin() const
Definition: ArrayRef.h:136
static StringRef sanitizeFunctionName(StringRef funcName)
VectorLibrary
List of known vector-functions libraries.
OSType getOS() const
getOS - Get the parsed operating system type of this triple.
Definition: Triple.h:298
void initializeTargetLibraryInfoWrapperPassPass(PassRegistry &)
StringRef VectorFnName
void setShouldExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext or zeroext attributes if they...
void disableAllFunctions()
Disables all builtins.
bool isWatchOS() const
Is this an Apple watchOS triple.
Definition: Triple.h:465
Implementation of the target library information.
F(f)
void getEnvironmentVersion(unsigned &Major, unsigned &Minor, unsigned &Micro) const
Parse the version number from the OS name component of the triple, if present.
Definition: Triple.cpp:1027
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition: Type.h:129
StringRef ScalarFnName
Definition: BitVector.h:937
const DataLayout & getDataLayout() const
Get the data layout for the module&#39;s target platform.
Definition: Module.cpp:369
bool isFloatingPointTy() const
Return true if this is one of the six floating-point types.
Definition: Type.h:161
uint64_t getArrayNumElements() const
Definition: DerivedTypes.h:419
bool isKnownWindowsMSVCEnvironment() const
Checks if the environment is MSVC.
Definition: Triple.h:532
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:196
LLVM_NODISCARD bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:126
Class to represent function types.
Definition: DerivedTypes.h:102
ArchType getArch() const
getArch - Get the parsed architecture type of this triple.
Definition: Triple.h:289
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
bool isVarArg() const
Definition: DerivedTypes.h:122
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: APInt.h:32
auto lower_bound(R &&Range, ForwardIt I) -> decltype(adl_begin(Range))
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition: STLExtras.h:1281
bool isiOS() const
Is this an iOS triple.
Definition: Triple.h:455
void setShouldSignExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext attribute if they correspond ...
TargetLibraryInfo run(Module &M, ModuleAnalysisManager &)
void setUnavailable(LibFunc F)
Forces a function to be marked as unavailable.
bool isOSWindows() const
Tests whether the OS is Windows.
Definition: Triple.h:527
bool isFloatTy() const
Return true if this is &#39;float&#39;, a 32-bit IEEE fp type.
Definition: Type.h:146
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space...
Definition: DataLayout.cpp:749
StringRef getScalarizedFunction(StringRef F, unsigned &VF) const
Return the name of the equivalent of F, scalarized.
bool isMusl() const
Tests whether the environment is musl-libc.
Definition: Triple.h:651
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:422
bool isFunctionVectorizable(StringRef F, unsigned VF) const
Return true if the function F has a vector equivalent with vectorization factor VF.
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:45
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition: Module.cpp:310
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:642
This file contains the declarations for the subclasses of Constant, which represent the different fla...
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:223
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Definition: DerivedTypes.h:138
static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS)
LLVM_NODISCARD size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Definition: StringRef.h:285
bool isAndroidVersionLT(unsigned Major) const
Definition: Triple.h:637
static PointerType * getInt8PtrTy(LLVMContext &C, unsigned AS=0)
Definition: Type.cpp:219
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:43
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:33
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1115
static cl::opt< TargetLibraryInfoImpl::VectorLibrary > ClVectorLibrary("vector-library", cl::Hidden, cl::desc("Vector functions library"), cl::init(TargetLibraryInfoImpl::NoLibrary), cl::values(clEnumValN(TargetLibraryInfoImpl::NoLibrary, "none", "No vector functions library"), clEnumValN(TargetLibraryInfoImpl::Accelerate, "Accelerate", "Accelerate framework"), clEnumValN(TargetLibraryInfoImpl::SVML, "SVML", "Intel SVML library")))
static bool hasSinCosPiStret(const Triple &T)
ImmutablePass class - This class is used to provide information that does not need to be run...
Definition: Pass.h:255
Describes a possible vectorization of a function.
Provides information about what library functions are available for the current target.
StringRef getVectorizedFunction(StringRef F, unsigned VF) const
Return the name of the equivalent of F, vectorized with factor VF.
iterator end() const
Definition: ArrayRef.h:137
bool isOSLinux() const
Tests whether the OS is Linux.
Definition: Triple.h:575
TargetLibraryInfoImpl & operator=(const TargetLibraryInfoImpl &TLI)
Type * getReturnType() const
Definition: DerivedTypes.h:123
bool isOSFreeBSD() const
Definition: Triple.h:490
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition: Function.h:163
void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib)
Calls addVectorizableFunctions with a known preset of functions for the given vector library...
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character &#39;\1&#39;, drop it.
Definition: GlobalValue.h:471
bool isMIPS() const
Tests whether the target is MIPS (little and big endian, 32- or 64-bit).
Definition: Triple.h:688
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringRef > StandardNames)
Initialize the set of available library functions based on the specified target triple.
bool isOSCygMing() const
Tests for either Cygwin or MinGW OS.
Definition: Triple.h:559
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:617
static const size_t npos
Definition: StringRef.h:50
StringRef getName() const
Return a constant reference to the value&#39;s name.
Definition: Value.cpp:214
#define I(x, y, z)
Definition: MD5.cpp:58
static bool compareWithVectorFnName(const VecDesc &LHS, StringRef S)
bool isGNUEnvironment() const
Definition: Triple.h:510
bool isMacOSXVersionLT(unsigned Major, unsigned Minor=0, unsigned Micro=0) const
isMacOSXVersionLT - Comparison function for checking OS X version compatibility, which handles suppor...
Definition: Triple.h:431
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:565
void setAvailableWithName(LibFunc F, StringRef Name)
Forces a function to be marked as available and provide an alternate name that must be used...
#define LLVM_FALLTHROUGH
LLVM_FALLTHROUGH - Mark fallthrough cases in switch statements.
Definition: Compiler.h:250
bool isAndroid() const
Tests whether the target is Android.
Definition: Triple.h:635
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition: Triple.h:658
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
A container for analyses that lazily runs them and caches their results.
bool isOSVersionLT(unsigned Major, unsigned Minor=0, unsigned Micro=0) const
isOSVersionLT - Helper function for doing comparisons against version numbers included in the target ...
Definition: Triple.h:407
Type * getArrayElementType() const
Definition: Type.h:364
void setAvailable(LibFunc F)
Forces a function to be marked as available.
bool isDoubleTy() const
Return true if this is &#39;double&#39;, a 64-bit IEEE fp type.
Definition: Type.h:149
unsigned getWCharSize(const Module &M) const
Returns the size of the wchar_t type in bytes or 0 if the size is unknown.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: PassManager.h:70
static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S)
bool isArrayTy() const
True if this is an instance of ArrayType.
Definition: Type.h:220