1 //===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the TargetLibraryInfo class.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Analysis/TargetLibraryInfo.h"
15 #include "llvm/ADT/Triple.h"
16 #include "llvm/IR/Constants.h"
17 #include "llvm/Support/CommandLine.h"
20 static cl::opt<TargetLibraryInfoImpl::VectorLibrary> ClVectorLibrary(
21 "vector-library", cl::Hidden, cl::desc("Vector functions library"),
22 cl::init(TargetLibraryInfoImpl::NoLibrary),
23 cl::values(clEnumValN(TargetLibraryInfoImpl::NoLibrary, "none",
24 "No vector functions library"),
25 clEnumValN(TargetLibraryInfoImpl::Accelerate, "Accelerate",
26 "Accelerate framework"),
27 clEnumValN(TargetLibraryInfoImpl::SVML, "SVML",
28 "Intel SVML library")));
30 StringRef const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] = {
31 #define TLI_DEFINE_STRING
32 #include "llvm/Analysis/TargetLibraryInfo.def"
35 static bool hasSinCosPiStret(const Triple &T) {
36 // Only Darwin variants have _stret versions of combined trig functions.
40 // The ABI is rather complicated on x86, so don't do anything special there.
41 if (T.getArch() == Triple::x86)
44 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
47 if (T.isiOS() && T.isOSVersionLT(7, 0))
53 /// Initialize the set of available library functions based on the specified
54 /// target triple. This should be carefully written so that a missing target
55 /// triple gets a sane set of defaults.
56 static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
57 ArrayRef<StringRef> StandardNames) {
58 // Verify that the StandardNames array is in alphabetical order.
59 assert(std::is_sorted(StandardNames.begin(), StandardNames.end(),
60 [](StringRef LHS, StringRef RHS) {
63 "TargetLibraryInfoImpl function names must be sorted");
65 // Set IO unlocked variants as unavailable
66 // Set them as available per system below
67 TLI.setUnavailable(LibFunc_getchar_unlocked);
68 TLI.setUnavailable(LibFunc_putc_unlocked);
69 TLI.setUnavailable(LibFunc_putchar_unlocked);
70 TLI.setUnavailable(LibFunc_fputc_unlocked);
71 TLI.setUnavailable(LibFunc_fgetc_unlocked);
72 TLI.setUnavailable(LibFunc_fread_unlocked);
73 TLI.setUnavailable(LibFunc_fwrite_unlocked);
74 TLI.setUnavailable(LibFunc_fputs_unlocked);
75 TLI.setUnavailable(LibFunc_fgets_unlocked);
77 bool ShouldExtI32Param = false, ShouldExtI32Return = false,
78 ShouldSignExtI32Param = false;
79 // PowerPC64, Sparc64, SystemZ need signext/zeroext on i32 parameters and
80 // returns corresponding to C-level ints and unsigned ints.
81 if (T.getArch() == Triple::ppc64 || T.getArch() == Triple::ppc64le ||
82 T.getArch() == Triple::sparcv9 || T.getArch() == Triple::systemz) {
83 ShouldExtI32Param = true;
84 ShouldExtI32Return = true;
86 // Mips, on the other hand, needs signext on i32 parameters corresponding
87 // to both signed and unsigned ints.
89 ShouldSignExtI32Param = true;
91 TLI.setShouldExtI32Param(ShouldExtI32Param);
92 TLI.setShouldExtI32Return(ShouldExtI32Return);
93 TLI.setShouldSignExtI32Param(ShouldSignExtI32Param);
95 if (T.getArch() == Triple::r600 ||
96 T.getArch() == Triple::amdgcn) {
97 TLI.setUnavailable(LibFunc_ldexp);
98 TLI.setUnavailable(LibFunc_ldexpf);
99 TLI.setUnavailable(LibFunc_ldexpl);
100 TLI.setUnavailable(LibFunc_exp10);
101 TLI.setUnavailable(LibFunc_exp10f);
102 TLI.setUnavailable(LibFunc_exp10l);
103 TLI.setUnavailable(LibFunc_log10);
104 TLI.setUnavailable(LibFunc_log10f);
105 TLI.setUnavailable(LibFunc_log10l);
108 // There are no library implementations of mempcy and memset for AMD gpus and
109 // these can be difficult to lower in the backend.
110 if (T.getArch() == Triple::r600 ||
111 T.getArch() == Triple::amdgcn) {
112 TLI.setUnavailable(LibFunc_memcpy);
113 TLI.setUnavailable(LibFunc_memset);
114 TLI.setUnavailable(LibFunc_memset_pattern16);
118 // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later.
119 // All versions of watchOS support it.
121 // available IO unlocked variants on Mac OS X
122 TLI.setAvailable(LibFunc_getc_unlocked);
123 TLI.setAvailable(LibFunc_getchar_unlocked);
124 TLI.setAvailable(LibFunc_putc_unlocked);
125 TLI.setAvailable(LibFunc_putchar_unlocked);
127 if (T.isMacOSXVersionLT(10, 5))
128 TLI.setUnavailable(LibFunc_memset_pattern16);
129 } else if (T.isiOS()) {
130 if (T.isOSVersionLT(3, 0))
131 TLI.setUnavailable(LibFunc_memset_pattern16);
132 } else if (!T.isWatchOS()) {
133 TLI.setUnavailable(LibFunc_memset_pattern16);
136 if (!hasSinCosPiStret(T)) {
137 TLI.setUnavailable(LibFunc_sinpi);
138 TLI.setUnavailable(LibFunc_sinpif);
139 TLI.setUnavailable(LibFunc_cospi);
140 TLI.setUnavailable(LibFunc_cospif);
141 TLI.setUnavailable(LibFunc_sincospi_stret);
142 TLI.setUnavailable(LibFunc_sincospif_stret);
145 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
146 !T.isMacOSXVersionLT(10, 7)) {
147 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
148 // we don't care about) have two versions; on recent OSX, the one we want
149 // has a $UNIX2003 suffix. The two implementations are identical except
150 // for the return value in some edge cases. However, we don't want to
151 // generate code that depends on the old symbols.
152 TLI.setAvailableWithName(LibFunc_fwrite, "fwrite$UNIX2003");
153 TLI.setAvailableWithName(LibFunc_fputs, "fputs$UNIX2003");
156 // iprintf and friends are only available on XCore and TCE.
157 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
158 TLI.setUnavailable(LibFunc_iprintf);
159 TLI.setUnavailable(LibFunc_siprintf);
160 TLI.setUnavailable(LibFunc_fiprintf);
163 if (T.isOSWindows() && !T.isOSCygMing()) {
164 // XXX: The earliest documentation available at the moment is for VS2015/VC19:
165 // https://docs.microsoft.com/en-us/cpp/c-runtime-library/floating-point-support?view=vs-2015
166 // XXX: In order to use an MSVCRT older than VC19,
167 // the specific library version must be explicit in the target triple,
168 // e.g., x86_64-pc-windows-msvc18.
169 bool hasPartialC99 = true;
170 if (T.isKnownWindowsMSVCEnvironment()) {
171 unsigned Major, Minor, Micro;
172 T.getEnvironmentVersion(Major, Minor, Micro);
173 hasPartialC99 = (Major == 0 || Major >= 19);
176 // Latest targets support C89 math functions, in part.
177 bool isARM = (T.getArch() == Triple::aarch64 ||
178 T.getArch() == Triple::arm);
179 bool hasPartialFloat = (isARM ||
180 T.getArch() == Triple::x86_64);
182 // Win32 does not support float C89 math functions, in general.
183 if (!hasPartialFloat) {
184 TLI.setUnavailable(LibFunc_acosf);
185 TLI.setUnavailable(LibFunc_asinf);
186 TLI.setUnavailable(LibFunc_atan2f);
187 TLI.setUnavailable(LibFunc_atanf);
188 TLI.setUnavailable(LibFunc_ceilf);
189 TLI.setUnavailable(LibFunc_cosf);
190 TLI.setUnavailable(LibFunc_coshf);
191 TLI.setUnavailable(LibFunc_expf);
192 TLI.setUnavailable(LibFunc_floorf);
193 TLI.setUnavailable(LibFunc_fmodf);
194 TLI.setUnavailable(LibFunc_log10f);
195 TLI.setUnavailable(LibFunc_logf);
196 TLI.setUnavailable(LibFunc_modff);
197 TLI.setUnavailable(LibFunc_powf);
198 TLI.setUnavailable(LibFunc_sinf);
199 TLI.setUnavailable(LibFunc_sinhf);
200 TLI.setUnavailable(LibFunc_sqrtf);
201 TLI.setUnavailable(LibFunc_tanf);
202 TLI.setUnavailable(LibFunc_tanhf);
205 TLI.setUnavailable(LibFunc_fabsf);
206 TLI.setUnavailable(LibFunc_frexpf);
207 TLI.setUnavailable(LibFunc_ldexpf);
209 // Win32 does not support long double C89 math functions.
210 TLI.setUnavailable(LibFunc_acosl);
211 TLI.setUnavailable(LibFunc_asinl);
212 TLI.setUnavailable(LibFunc_atan2l);
213 TLI.setUnavailable(LibFunc_atanl);
214 TLI.setUnavailable(LibFunc_ceill);
215 TLI.setUnavailable(LibFunc_cosl);
216 TLI.setUnavailable(LibFunc_coshl);
217 TLI.setUnavailable(LibFunc_expl);
218 TLI.setUnavailable(LibFunc_fabsl);
219 TLI.setUnavailable(LibFunc_floorl);
220 TLI.setUnavailable(LibFunc_fmodl);
221 TLI.setUnavailable(LibFunc_frexpl);
222 TLI.setUnavailable(LibFunc_ldexpl);
223 TLI.setUnavailable(LibFunc_log10l);
224 TLI.setUnavailable(LibFunc_logl);
225 TLI.setUnavailable(LibFunc_modfl);
226 TLI.setUnavailable(LibFunc_powl);
227 TLI.setUnavailable(LibFunc_sinl);
228 TLI.setUnavailable(LibFunc_sinhl);
229 TLI.setUnavailable(LibFunc_sqrtl);
230 TLI.setUnavailable(LibFunc_tanl);
231 TLI.setUnavailable(LibFunc_tanhl);
233 // Win32 does not fully support C99 math functions.
234 if (!hasPartialC99) {
235 TLI.setUnavailable(LibFunc_acosh);
236 TLI.setUnavailable(LibFunc_acoshf);
237 TLI.setUnavailable(LibFunc_asinh);
238 TLI.setUnavailable(LibFunc_asinhf);
239 TLI.setUnavailable(LibFunc_atanh);
240 TLI.setUnavailable(LibFunc_atanhf);
241 TLI.setAvailableWithName(LibFunc_cabs, "_cabs");
242 TLI.setUnavailable(LibFunc_cabsf);
243 TLI.setUnavailable(LibFunc_cbrt);
244 TLI.setUnavailable(LibFunc_cbrtf);
245 TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
246 TLI.setAvailableWithName(LibFunc_copysignf, "_copysignf");
247 TLI.setUnavailable(LibFunc_exp2);
248 TLI.setUnavailable(LibFunc_exp2f);
249 TLI.setUnavailable(LibFunc_expm1);
250 TLI.setUnavailable(LibFunc_expm1f);
251 TLI.setUnavailable(LibFunc_fmax);
252 TLI.setUnavailable(LibFunc_fmaxf);
253 TLI.setUnavailable(LibFunc_fmin);
254 TLI.setUnavailable(LibFunc_fminf);
255 TLI.setUnavailable(LibFunc_log1p);
256 TLI.setUnavailable(LibFunc_log1pf);
257 TLI.setUnavailable(LibFunc_log2);
258 TLI.setUnavailable(LibFunc_log2f);
259 TLI.setAvailableWithName(LibFunc_logb, "_logb");
261 TLI.setAvailableWithName(LibFunc_logbf, "_logbf");
263 TLI.setUnavailable(LibFunc_logbf);
264 TLI.setUnavailable(LibFunc_rint);
265 TLI.setUnavailable(LibFunc_rintf);
266 TLI.setUnavailable(LibFunc_round);
267 TLI.setUnavailable(LibFunc_roundf);
268 TLI.setUnavailable(LibFunc_trunc);
269 TLI.setUnavailable(LibFunc_truncf);
272 // Win32 does not support long double C99 math functions.
273 TLI.setUnavailable(LibFunc_acoshl);
274 TLI.setUnavailable(LibFunc_asinhl);
275 TLI.setUnavailable(LibFunc_atanhl);
276 TLI.setUnavailable(LibFunc_cabsl);
277 TLI.setUnavailable(LibFunc_cbrtl);
278 TLI.setUnavailable(LibFunc_copysignl);
279 TLI.setUnavailable(LibFunc_exp2l);
280 TLI.setUnavailable(LibFunc_expm1l);
281 TLI.setUnavailable(LibFunc_fmaxl);
282 TLI.setUnavailable(LibFunc_fminl);
283 TLI.setUnavailable(LibFunc_log1pl);
284 TLI.setUnavailable(LibFunc_log2l);
285 TLI.setUnavailable(LibFunc_logbl);
286 TLI.setUnavailable(LibFunc_nearbyintl);
287 TLI.setUnavailable(LibFunc_rintl);
288 TLI.setUnavailable(LibFunc_roundl);
289 TLI.setUnavailable(LibFunc_truncl);
291 // Win32 does not support these functions, but
292 // they are generally available on POSIX-compliant systems.
293 TLI.setUnavailable(LibFunc_access);
294 TLI.setUnavailable(LibFunc_bcmp);
295 TLI.setUnavailable(LibFunc_bcopy);
296 TLI.setUnavailable(LibFunc_bzero);
297 TLI.setUnavailable(LibFunc_chmod);
298 TLI.setUnavailable(LibFunc_chown);
299 TLI.setUnavailable(LibFunc_closedir);
300 TLI.setUnavailable(LibFunc_ctermid);
301 TLI.setUnavailable(LibFunc_fdopen);
302 TLI.setUnavailable(LibFunc_ffs);
303 TLI.setUnavailable(LibFunc_fileno);
304 TLI.setUnavailable(LibFunc_flockfile);
305 TLI.setUnavailable(LibFunc_fseeko);
306 TLI.setUnavailable(LibFunc_fstat);
307 TLI.setUnavailable(LibFunc_fstatvfs);
308 TLI.setUnavailable(LibFunc_ftello);
309 TLI.setUnavailable(LibFunc_ftrylockfile);
310 TLI.setUnavailable(LibFunc_funlockfile);
311 TLI.setUnavailable(LibFunc_getitimer);
312 TLI.setUnavailable(LibFunc_getlogin_r);
313 TLI.setUnavailable(LibFunc_getpwnam);
314 TLI.setUnavailable(LibFunc_gettimeofday);
315 TLI.setUnavailable(LibFunc_htonl);
316 TLI.setUnavailable(LibFunc_htons);
317 TLI.setUnavailable(LibFunc_lchown);
318 TLI.setUnavailable(LibFunc_lstat);
319 TLI.setUnavailable(LibFunc_memccpy);
320 TLI.setUnavailable(LibFunc_mkdir);
321 TLI.setUnavailable(LibFunc_ntohl);
322 TLI.setUnavailable(LibFunc_ntohs);
323 TLI.setUnavailable(LibFunc_open);
324 TLI.setUnavailable(LibFunc_opendir);
325 TLI.setUnavailable(LibFunc_pclose);
326 TLI.setUnavailable(LibFunc_popen);
327 TLI.setUnavailable(LibFunc_pread);
328 TLI.setUnavailable(LibFunc_pwrite);
329 TLI.setUnavailable(LibFunc_read);
330 TLI.setUnavailable(LibFunc_readlink);
331 TLI.setUnavailable(LibFunc_realpath);
332 TLI.setUnavailable(LibFunc_rmdir);
333 TLI.setUnavailable(LibFunc_setitimer);
334 TLI.setUnavailable(LibFunc_stat);
335 TLI.setUnavailable(LibFunc_statvfs);
336 TLI.setUnavailable(LibFunc_stpcpy);
337 TLI.setUnavailable(LibFunc_stpncpy);
338 TLI.setUnavailable(LibFunc_strcasecmp);
339 TLI.setUnavailable(LibFunc_strncasecmp);
340 TLI.setUnavailable(LibFunc_times);
341 TLI.setUnavailable(LibFunc_uname);
342 TLI.setUnavailable(LibFunc_unlink);
343 TLI.setUnavailable(LibFunc_unsetenv);
344 TLI.setUnavailable(LibFunc_utime);
345 TLI.setUnavailable(LibFunc_utimes);
346 TLI.setUnavailable(LibFunc_write);
351 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
352 // and their names are __exp10 and __exp10f. exp10l is not available on
354 TLI.setUnavailable(LibFunc_exp10l);
355 if (T.isMacOSXVersionLT(10, 9)) {
356 TLI.setUnavailable(LibFunc_exp10);
357 TLI.setUnavailable(LibFunc_exp10f);
359 TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
360 TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
365 case Triple::WatchOS:
366 TLI.setUnavailable(LibFunc_exp10l);
367 if (!T.isWatchOS() && (T.isOSVersionLT(7, 0) ||
368 (T.isOSVersionLT(9, 0) &&
369 (T.getArch() == Triple::x86 ||
370 T.getArch() == Triple::x86_64)))) {
371 TLI.setUnavailable(LibFunc_exp10);
372 TLI.setUnavailable(LibFunc_exp10f);
374 TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
375 TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
379 // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
380 // buggy prior to glibc version 2.18. Until this version is widely deployed
381 // or we have a reasonable detection strategy, we cannot use exp10 reliably
384 // Fall through to disable all of them.
387 TLI.setUnavailable(LibFunc_exp10);
388 TLI.setUnavailable(LibFunc_exp10f);
389 TLI.setUnavailable(LibFunc_exp10l);
392 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
394 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
395 // http://svn.freebsd.org/base/head/lib/libc/string/ffsl.c
396 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
402 case Triple::WatchOS:
403 case Triple::FreeBSD:
407 TLI.setUnavailable(LibFunc_ffsl);
410 // ffsll is available on at least FreeBSD and Linux (GLIBC):
411 // http://svn.freebsd.org/base/head/lib/libc/string/ffsll.c
412 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
418 case Triple::WatchOS:
419 case Triple::FreeBSD:
423 TLI.setUnavailable(LibFunc_ffsll);
426 // The following functions are available on at least FreeBSD:
427 // http://svn.freebsd.org/base/head/lib/libc/string/fls.c
428 // http://svn.freebsd.org/base/head/lib/libc/string/flsl.c
429 // http://svn.freebsd.org/base/head/lib/libc/string/flsll.c
430 if (!T.isOSFreeBSD()) {
431 TLI.setUnavailable(LibFunc_fls);
432 TLI.setUnavailable(LibFunc_flsl);
433 TLI.setUnavailable(LibFunc_flsll);
436 // The following functions are only available on GNU/Linux (using glibc).
437 // Linux variants without glibc (eg: bionic, musl) may have some subset.
438 if (!T.isOSLinux() || !T.isGNUEnvironment()) {
439 TLI.setUnavailable(LibFunc_dunder_strdup);
440 TLI.setUnavailable(LibFunc_dunder_strtok_r);
441 TLI.setUnavailable(LibFunc_dunder_isoc99_scanf);
442 TLI.setUnavailable(LibFunc_dunder_isoc99_sscanf);
443 TLI.setUnavailable(LibFunc_under_IO_getc);
444 TLI.setUnavailable(LibFunc_under_IO_putc);
445 // But, Android and musl have memalign.
446 if (!T.isAndroid() && !T.isMusl())
447 TLI.setUnavailable(LibFunc_memalign);
448 TLI.setUnavailable(LibFunc_fopen64);
449 TLI.setUnavailable(LibFunc_fseeko64);
450 TLI.setUnavailable(LibFunc_fstat64);
451 TLI.setUnavailable(LibFunc_fstatvfs64);
452 TLI.setUnavailable(LibFunc_ftello64);
453 TLI.setUnavailable(LibFunc_lstat64);
454 TLI.setUnavailable(LibFunc_open64);
455 TLI.setUnavailable(LibFunc_stat64);
456 TLI.setUnavailable(LibFunc_statvfs64);
457 TLI.setUnavailable(LibFunc_tmpfile64);
459 // Relaxed math functions are included in math-finite.h on Linux (GLIBC).
460 TLI.setUnavailable(LibFunc_acos_finite);
461 TLI.setUnavailable(LibFunc_acosf_finite);
462 TLI.setUnavailable(LibFunc_acosl_finite);
463 TLI.setUnavailable(LibFunc_acosh_finite);
464 TLI.setUnavailable(LibFunc_acoshf_finite);
465 TLI.setUnavailable(LibFunc_acoshl_finite);
466 TLI.setUnavailable(LibFunc_asin_finite);
467 TLI.setUnavailable(LibFunc_asinf_finite);
468 TLI.setUnavailable(LibFunc_asinl_finite);
469 TLI.setUnavailable(LibFunc_atan2_finite);
470 TLI.setUnavailable(LibFunc_atan2f_finite);
471 TLI.setUnavailable(LibFunc_atan2l_finite);
472 TLI.setUnavailable(LibFunc_atanh_finite);
473 TLI.setUnavailable(LibFunc_atanhf_finite);
474 TLI.setUnavailable(LibFunc_atanhl_finite);
475 TLI.setUnavailable(LibFunc_cosh_finite);
476 TLI.setUnavailable(LibFunc_coshf_finite);
477 TLI.setUnavailable(LibFunc_coshl_finite);
478 TLI.setUnavailable(LibFunc_exp10_finite);
479 TLI.setUnavailable(LibFunc_exp10f_finite);
480 TLI.setUnavailable(LibFunc_exp10l_finite);
481 TLI.setUnavailable(LibFunc_exp2_finite);
482 TLI.setUnavailable(LibFunc_exp2f_finite);
483 TLI.setUnavailable(LibFunc_exp2l_finite);
484 TLI.setUnavailable(LibFunc_exp_finite);
485 TLI.setUnavailable(LibFunc_expf_finite);
486 TLI.setUnavailable(LibFunc_expl_finite);
487 TLI.setUnavailable(LibFunc_log10_finite);
488 TLI.setUnavailable(LibFunc_log10f_finite);
489 TLI.setUnavailable(LibFunc_log10l_finite);
490 TLI.setUnavailable(LibFunc_log2_finite);
491 TLI.setUnavailable(LibFunc_log2f_finite);
492 TLI.setUnavailable(LibFunc_log2l_finite);
493 TLI.setUnavailable(LibFunc_log_finite);
494 TLI.setUnavailable(LibFunc_logf_finite);
495 TLI.setUnavailable(LibFunc_logl_finite);
496 TLI.setUnavailable(LibFunc_pow_finite);
497 TLI.setUnavailable(LibFunc_powf_finite);
498 TLI.setUnavailable(LibFunc_powl_finite);
499 TLI.setUnavailable(LibFunc_sinh_finite);
500 TLI.setUnavailable(LibFunc_sinhf_finite);
501 TLI.setUnavailable(LibFunc_sinhl_finite);
504 if ((T.isOSLinux() && T.isGNUEnvironment()) ||
505 (T.isAndroid() && !T.isAndroidVersionLT(28))) {
506 // available IO unlocked variants on GNU/Linux and Android P or later
507 TLI.setAvailable(LibFunc_getc_unlocked);
508 TLI.setAvailable(LibFunc_getchar_unlocked);
509 TLI.setAvailable(LibFunc_putc_unlocked);
510 TLI.setAvailable(LibFunc_putchar_unlocked);
511 TLI.setAvailable(LibFunc_fputc_unlocked);
512 TLI.setAvailable(LibFunc_fgetc_unlocked);
513 TLI.setAvailable(LibFunc_fread_unlocked);
514 TLI.setAvailable(LibFunc_fwrite_unlocked);
515 TLI.setAvailable(LibFunc_fputs_unlocked);
516 TLI.setAvailable(LibFunc_fgets_unlocked);
519 // As currently implemented in clang, NVPTX code has no standard library to
520 // speak of. Headers provide a standard-ish library implementation, but many
521 // of the signatures are wrong -- for example, many libm functions are not
524 // libdevice, an IR library provided by nvidia, is linked in by the front-end,
525 // but only used functions are provided to llvm. Moreover, most of the
526 // functions in libdevice don't map precisely to standard library functions.
528 // FIXME: Having no standard library prevents e.g. many fastmath
529 // optimizations, so this situation should be fixed.
531 TLI.disableAllFunctions();
532 TLI.setAvailable(LibFunc_nvvm_reflect);
534 TLI.setUnavailable(LibFunc_nvvm_reflect);
537 TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary);
540 TargetLibraryInfoImpl::TargetLibraryInfoImpl() {
541 // Default to everything being available.
542 memset(AvailableArray, -1, sizeof(AvailableArray));
544 initialize(*this, Triple(), StandardNames);
547 TargetLibraryInfoImpl::TargetLibraryInfoImpl(const Triple &T) {
548 // Default to everything being available.
549 memset(AvailableArray, -1, sizeof(AvailableArray));
551 initialize(*this, T, StandardNames);
554 TargetLibraryInfoImpl::TargetLibraryInfoImpl(const TargetLibraryInfoImpl &TLI)
555 : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
556 ShouldExtI32Return(TLI.ShouldExtI32Return),
557 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) {
558 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
559 VectorDescs = TLI.VectorDescs;
560 ScalarDescs = TLI.ScalarDescs;
563 TargetLibraryInfoImpl::TargetLibraryInfoImpl(TargetLibraryInfoImpl &&TLI)
564 : CustomNames(std::move(TLI.CustomNames)),
565 ShouldExtI32Param(TLI.ShouldExtI32Param),
566 ShouldExtI32Return(TLI.ShouldExtI32Return),
567 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) {
568 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
570 VectorDescs = TLI.VectorDescs;
571 ScalarDescs = TLI.ScalarDescs;
574 TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(const TargetLibraryInfoImpl &TLI) {
575 CustomNames = TLI.CustomNames;
576 ShouldExtI32Param = TLI.ShouldExtI32Param;
577 ShouldExtI32Return = TLI.ShouldExtI32Return;
578 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
579 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
583 TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(TargetLibraryInfoImpl &&TLI) {
584 CustomNames = std::move(TLI.CustomNames);
585 ShouldExtI32Param = TLI.ShouldExtI32Param;
586 ShouldExtI32Return = TLI.ShouldExtI32Return;
587 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
588 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
593 static StringRef sanitizeFunctionName(StringRef funcName) {
594 // Filter out empty names and names containing null bytes, those can't be in
596 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
599 // Check for \01 prefix that is used to mangle __asm declarations and
600 // strip it if present.
601 return GlobalValue::dropLLVMManglingEscape(funcName);
604 bool TargetLibraryInfoImpl::getLibFunc(StringRef funcName,
606 StringRef const *Start = &StandardNames[0];
607 StringRef const *End = &StandardNames[NumLibFuncs];
609 funcName = sanitizeFunctionName(funcName);
610 if (funcName.empty())
613 StringRef const *I = std::lower_bound(
614 Start, End, funcName, [](StringRef LHS, StringRef RHS) {
617 if (I != End && *I == funcName) {
618 F = (LibFunc)(I - Start);
624 bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
626 const DataLayout *DL) const {
627 LLVMContext &Ctx = FTy.getContext();
628 Type *PCharTy = Type::getInt8PtrTy(Ctx);
629 Type *SizeTTy = DL ? DL->getIntPtrType(Ctx, /*AS=*/0) : nullptr;
630 auto IsSizeTTy = [SizeTTy](Type *Ty) {
631 return SizeTTy ? Ty == SizeTTy : Ty->isIntegerTy();
633 unsigned NumParams = FTy.getNumParams();
639 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
640 FTy.getParamType(1)->isPointerTy() &&
641 FTy.getReturnType()->isIntegerTy(32));
644 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
645 FTy.getParamType(1)->isPointerTy() &&
646 FTy.getReturnType()->isIntegerTy(32));
648 case LibFunc_execvpe:
650 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
651 FTy.getParamType(1)->isPointerTy() &&
652 FTy.getParamType(2)->isPointerTy() &&
653 FTy.getReturnType()->isIntegerTy(32));
655 return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
656 FTy.getReturnType()->isIntegerTy());
659 case LibFunc_strrchr:
660 return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
661 FTy.getParamType(0) == FTy.getReturnType() &&
662 FTy.getParamType(1)->isIntegerTy());
667 case LibFunc_strtoul:
668 case LibFunc_strtoll:
669 case LibFunc_strtold:
670 case LibFunc_strtoull:
671 return ((NumParams == 2 || NumParams == 3) &&
672 FTy.getParamType(0)->isPointerTy() &&
673 FTy.getParamType(1)->isPointerTy());
675 return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
676 FTy.getParamType(0) == FTy.getReturnType() &&
677 FTy.getParamType(1) == FTy.getReturnType());
679 case LibFunc_strncat:
680 return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
681 FTy.getParamType(0) == FTy.getReturnType() &&
682 FTy.getParamType(1) == FTy.getReturnType() &&
683 IsSizeTTy(FTy.getParamType(2)));
685 case LibFunc_strcpy_chk:
686 case LibFunc_stpcpy_chk:
688 if (!IsSizeTTy(FTy.getParamType(NumParams)))
693 return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(0) &&
694 FTy.getParamType(0) == FTy.getParamType(1) &&
695 FTy.getParamType(0) == PCharTy);
697 case LibFunc_strncpy_chk:
698 case LibFunc_stpncpy_chk:
700 if (!IsSizeTTy(FTy.getParamType(NumParams)))
703 case LibFunc_strncpy:
704 case LibFunc_stpncpy:
705 return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
706 FTy.getParamType(0) == FTy.getParamType(1) &&
707 FTy.getParamType(0) == PCharTy &&
708 IsSizeTTy(FTy.getParamType(2)));
710 case LibFunc_strxfrm:
711 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
712 FTy.getParamType(1)->isPointerTy());
715 return (NumParams == 2 && FTy.getReturnType()->isIntegerTy(32) &&
716 FTy.getParamType(0)->isPointerTy() &&
717 FTy.getParamType(0) == FTy.getParamType(1));
719 case LibFunc_strncmp:
720 return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
721 FTy.getParamType(0)->isPointerTy() &&
722 FTy.getParamType(0) == FTy.getParamType(1) &&
723 IsSizeTTy(FTy.getParamType(2)));
726 case LibFunc_strcspn:
727 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
728 FTy.getParamType(0) == FTy.getParamType(1) &&
729 FTy.getReturnType()->isIntegerTy());
731 case LibFunc_strcoll:
732 case LibFunc_strcasecmp:
733 case LibFunc_strncasecmp:
734 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
735 FTy.getParamType(1)->isPointerTy());
738 return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
739 FTy.getParamType(0)->isPointerTy() &&
740 FTy.getParamType(1)->isPointerTy());
742 case LibFunc_strpbrk:
743 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
744 FTy.getReturnType() == FTy.getParamType(0) &&
745 FTy.getParamType(0) == FTy.getParamType(1));
748 case LibFunc_strtok_r:
749 return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
752 case LibFunc_setvbuf:
753 return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
755 case LibFunc_strndup:
756 return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
757 FTy.getParamType(0)->isPointerTy());
760 case LibFunc_statvfs:
761 case LibFunc_siprintf:
762 case LibFunc_sprintf:
763 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
764 FTy.getParamType(1)->isPointerTy() &&
765 FTy.getReturnType()->isIntegerTy(32));
766 case LibFunc_snprintf:
767 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
768 FTy.getParamType(2)->isPointerTy() &&
769 FTy.getReturnType()->isIntegerTy(32));
770 case LibFunc_setitimer:
771 return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
772 FTy.getParamType(2)->isPointerTy());
774 return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
776 return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
778 return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
779 FTy.getParamType(0)->isPointerTy() &&
780 FTy.getParamType(1)->isPointerTy());
783 case LibFunc_memrchr:
784 return (NumParams == 3 && FTy.getReturnType()->isPointerTy() &&
785 FTy.getReturnType() == FTy.getParamType(0) &&
786 FTy.getParamType(1)->isIntegerTy(32) &&
787 IsSizeTTy(FTy.getParamType(2)));
791 return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
793 case LibFunc_memcpy_chk:
794 case LibFunc_memmove_chk:
796 if (!IsSizeTTy(FTy.getParamType(NumParams)))
800 case LibFunc_mempcpy:
801 case LibFunc_memmove:
802 return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
803 FTy.getParamType(0)->isPointerTy() &&
804 FTy.getParamType(1)->isPointerTy() &&
805 IsSizeTTy(FTy.getParamType(2)));
807 case LibFunc_memset_chk:
809 if (!IsSizeTTy(FTy.getParamType(NumParams)))
813 return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) &&
814 FTy.getParamType(0)->isPointerTy() &&
815 FTy.getParamType(1)->isIntegerTy() &&
816 IsSizeTTy(FTy.getParamType(2)));
818 case LibFunc_memccpy:
819 return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
820 case LibFunc_memalign:
821 return (FTy.getReturnType()->isPointerTy());
822 case LibFunc_realloc:
823 case LibFunc_reallocf:
824 return (NumParams == 2 && FTy.getReturnType() == PCharTy &&
825 FTy.getParamType(0) == FTy.getReturnType() &&
826 IsSizeTTy(FTy.getParamType(1)));
828 return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
832 case LibFunc_realpath:
833 return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
835 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
836 FTy.getParamType(1)->isPointerTy());
837 case LibFunc_readlink:
838 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
839 FTy.getParamType(1)->isPointerTy());
841 return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
844 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
845 FTy.getParamType(1)->isPointerTy());
847 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
849 return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
857 case LibFunc_getpwnam:
858 case LibFunc_iprintf:
864 case LibFunc_under_IO_getc:
866 case LibFunc_unsetenv:
867 return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
872 case LibFunc_clearerr:
873 case LibFunc_closedir:
874 case LibFunc_ctermid:
879 case LibFunc_fgetc_unlocked:
881 case LibFunc_flockfile:
884 case LibFunc_fseeko64:
886 case LibFunc_fsetpos:
888 case LibFunc_ftello64:
890 case LibFunc_ftrylockfile:
891 case LibFunc_funlockfile:
893 case LibFunc_getc_unlocked:
894 case LibFunc_getlogin_r:
898 return (NumParams != 0 && FTy.getParamType(0)->isPointerTy());
901 return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
902 FTy.getParamType(0)->isPointerTy() &&
903 FTy.getParamType(1)->isPointerTy());
905 return (NumParams == 0 && FTy.getReturnType()->isIntegerTy(32));
907 return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
908 FTy.getParamType(1)->isPointerTy());
910 case LibFunc_fputc_unlocked:
915 case LibFunc_fstatvfs:
916 return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
918 case LibFunc_fgets_unlocked:
919 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
920 FTy.getParamType(2)->isPointerTy());
922 case LibFunc_fread_unlocked:
923 return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
924 FTy.getParamType(3)->isPointerTy());
926 case LibFunc_fwrite_unlocked:
927 return (NumParams == 4 && FTy.getReturnType()->isIntegerTy() &&
928 FTy.getParamType(0)->isPointerTy() &&
929 FTy.getParamType(1)->isIntegerTy() &&
930 FTy.getParamType(2)->isIntegerTy() &&
931 FTy.getParamType(3)->isPointerTy());
933 case LibFunc_fputs_unlocked:
934 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
935 FTy.getParamType(1)->isPointerTy());
937 case LibFunc_fiprintf:
938 case LibFunc_fprintf:
939 return (NumParams >= 2 && FTy.getReturnType()->isIntegerTy() &&
940 FTy.getParamType(0)->isPointerTy() &&
941 FTy.getParamType(1)->isPointerTy());
942 case LibFunc_fgetpos:
943 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
944 FTy.getParamType(1)->isPointerTy());
945 case LibFunc_getchar:
946 case LibFunc_getchar_unlocked:
947 return (NumParams == 0 && FTy.getReturnType()->isIntegerTy());
949 return (NumParams == 1 && FTy.getParamType(0) == PCharTy);
950 case LibFunc_getitimer:
951 return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
953 return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
956 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
957 FTy.getParamType(1)->isPointerTy());
959 case LibFunc_putc_unlocked:
960 return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
963 return (NumParams == 4 && FTy.getParamType(1)->isPointerTy());
965 return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
966 FTy.getParamType(0)->isPointerTy() &&
967 FTy.getParamType(1)->isPointerTy());
969 return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
970 case LibFunc_vsscanf:
971 return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
972 FTy.getParamType(2)->isPointerTy());
973 case LibFunc_vfscanf:
974 return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
975 FTy.getParamType(2)->isPointerTy());
977 return (FTy.getReturnType()->isPointerTy());
978 case LibFunc_vprintf:
979 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
980 case LibFunc_vfprintf:
981 case LibFunc_vsprintf:
982 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
983 FTy.getParamType(1)->isPointerTy());
984 case LibFunc_vsnprintf:
985 return (NumParams == 4 && FTy.getParamType(0)->isPointerTy() &&
986 FTy.getParamType(2)->isPointerTy());
988 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
989 case LibFunc_opendir:
990 return (NumParams == 1 && FTy.getReturnType()->isPointerTy() &&
991 FTy.getParamType(0)->isPointerTy());
992 case LibFunc_tmpfile:
993 return (FTy.getReturnType()->isPointerTy());
996 return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
997 FTy.getReturnType() == FTy.getParamType(0));
1000 return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(16) &&
1001 FTy.getReturnType() == FTy.getParamType(0));
1003 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1004 FTy.getParamType(1)->isPointerTy());
1005 case LibFunc_lchown:
1006 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
1008 return (NumParams == 4 && FTy.getParamType(3)->isPointerTy());
1009 case LibFunc_dunder_strdup:
1010 case LibFunc_dunder_strndup:
1011 return (NumParams >= 1 && FTy.getReturnType()->isPointerTy() &&
1012 FTy.getParamType(0)->isPointerTy());
1013 case LibFunc_dunder_strtok_r:
1014 return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
1015 case LibFunc_under_IO_putc:
1016 return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1017 case LibFunc_dunder_isoc99_scanf:
1018 return (NumParams >= 1 && FTy.getParamType(0)->isPointerTy());
1019 case LibFunc_stat64:
1020 case LibFunc_lstat64:
1021 case LibFunc_statvfs64:
1022 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1023 FTy.getParamType(1)->isPointerTy());
1024 case LibFunc_dunder_isoc99_sscanf:
1025 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
1026 FTy.getParamType(1)->isPointerTy());
1027 case LibFunc_fopen64:
1028 return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
1029 FTy.getParamType(0)->isPointerTy() &&
1030 FTy.getParamType(1)->isPointerTy());
1031 case LibFunc_tmpfile64:
1032 return (FTy.getReturnType()->isPointerTy());
1033 case LibFunc_fstat64:
1034 case LibFunc_fstatvfs64:
1035 return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
1036 case LibFunc_open64:
1037 return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy());
1038 case LibFunc_gettimeofday:
1039 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
1040 FTy.getParamType(1)->isPointerTy());
1042 // new(unsigned int);
1044 // new(unsigned long);
1046 // new[](unsigned int);
1048 // new[](unsigned long);
1050 // new(unsigned int);
1051 case LibFunc_msvc_new_int:
1052 // new(unsigned long long);
1053 case LibFunc_msvc_new_longlong:
1054 // new[](unsigned int);
1055 case LibFunc_msvc_new_array_int:
1056 // new[](unsigned long long);
1057 case LibFunc_msvc_new_array_longlong:
1058 return (NumParams == 1 && FTy.getReturnType()->isPointerTy());
1060 // new(unsigned int, nothrow);
1061 case LibFunc_ZnwjRKSt9nothrow_t:
1062 // new(unsigned long, nothrow);
1063 case LibFunc_ZnwmRKSt9nothrow_t:
1064 // new[](unsigned int, nothrow);
1065 case LibFunc_ZnajRKSt9nothrow_t:
1066 // new[](unsigned long, nothrow);
1067 case LibFunc_ZnamRKSt9nothrow_t:
1068 // new(unsigned int, nothrow);
1069 case LibFunc_msvc_new_int_nothrow:
1070 // new(unsigned long long, nothrow);
1071 case LibFunc_msvc_new_longlong_nothrow:
1072 // new[](unsigned int, nothrow);
1073 case LibFunc_msvc_new_array_int_nothrow:
1074 // new[](unsigned long long, nothrow);
1075 case LibFunc_msvc_new_array_longlong_nothrow:
1076 // new(unsigned int, align_val_t)
1077 case LibFunc_ZnwjSt11align_val_t:
1078 // new(unsigned long, align_val_t)
1079 case LibFunc_ZnwmSt11align_val_t:
1080 // new[](unsigned int, align_val_t)
1081 case LibFunc_ZnajSt11align_val_t:
1082 // new[](unsigned long, align_val_t)
1083 case LibFunc_ZnamSt11align_val_t:
1084 return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
1086 // new(unsigned int, align_val_t, nothrow)
1087 case LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t:
1088 // new(unsigned long, align_val_t, nothrow)
1089 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1090 // new[](unsigned int, align_val_t, nothrow)
1091 case LibFunc_ZnajSt11align_val_tRKSt9nothrow_t:
1092 // new[](unsigned long, align_val_t, nothrow)
1093 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1094 return (NumParams == 3 && FTy.getReturnType()->isPointerTy());
1096 // void operator delete[](void*);
1098 // void operator delete(void*);
1100 // void operator delete[](void*);
1101 case LibFunc_msvc_delete_array_ptr32:
1102 // void operator delete[](void*);
1103 case LibFunc_msvc_delete_array_ptr64:
1104 // void operator delete(void*);
1105 case LibFunc_msvc_delete_ptr32:
1106 // void operator delete(void*);
1107 case LibFunc_msvc_delete_ptr64:
1108 return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
1110 // void operator delete[](void*, nothrow);
1111 case LibFunc_ZdaPvRKSt9nothrow_t:
1112 // void operator delete[](void*, unsigned int);
1113 case LibFunc_ZdaPvj:
1114 // void operator delete[](void*, unsigned long);
1115 case LibFunc_ZdaPvm:
1116 // void operator delete(void*, nothrow);
1117 case LibFunc_ZdlPvRKSt9nothrow_t:
1118 // void operator delete(void*, unsigned int);
1119 case LibFunc_ZdlPvj:
1120 // void operator delete(void*, unsigned long);
1121 case LibFunc_ZdlPvm:
1122 // void operator delete(void*, align_val_t)
1123 case LibFunc_ZdlPvSt11align_val_t:
1124 // void operator delete[](void*, align_val_t)
1125 case LibFunc_ZdaPvSt11align_val_t:
1126 // void operator delete[](void*, unsigned int);
1127 case LibFunc_msvc_delete_array_ptr32_int:
1128 // void operator delete[](void*, nothrow);
1129 case LibFunc_msvc_delete_array_ptr32_nothrow:
1130 // void operator delete[](void*, unsigned long long);
1131 case LibFunc_msvc_delete_array_ptr64_longlong:
1132 // void operator delete[](void*, nothrow);
1133 case LibFunc_msvc_delete_array_ptr64_nothrow:
1134 // void operator delete(void*, unsigned int);
1135 case LibFunc_msvc_delete_ptr32_int:
1136 // void operator delete(void*, nothrow);
1137 case LibFunc_msvc_delete_ptr32_nothrow:
1138 // void operator delete(void*, unsigned long long);
1139 case LibFunc_msvc_delete_ptr64_longlong:
1140 // void operator delete(void*, nothrow);
1141 case LibFunc_msvc_delete_ptr64_nothrow:
1142 return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
1144 // void operator delete(void*, align_val_t, nothrow)
1145 case LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t:
1146 // void operator delete[](void*, align_val_t, nothrow)
1147 case LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t:
1148 return (NumParams == 3 && FTy.getParamType(0)->isPointerTy());
1150 case LibFunc_memset_pattern16:
1151 return (!FTy.isVarArg() && NumParams == 3 &&
1152 FTy.getParamType(0)->isPointerTy() &&
1153 FTy.getParamType(1)->isPointerTy() &&
1154 FTy.getParamType(2)->isIntegerTy());
1156 case LibFunc_cxa_guard_abort:
1157 case LibFunc_cxa_guard_acquire:
1158 case LibFunc_cxa_guard_release:
1159 case LibFunc_nvvm_reflect:
1160 return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
1162 case LibFunc_sincospi_stret:
1163 case LibFunc_sincospif_stret:
1164 return (NumParams == 1 && FTy.getParamType(0)->isFloatingPointTy());
1167 case LibFunc_acos_finite:
1169 case LibFunc_acosf_finite:
1171 case LibFunc_acosh_finite:
1172 case LibFunc_acoshf:
1173 case LibFunc_acoshf_finite:
1174 case LibFunc_acoshl:
1175 case LibFunc_acoshl_finite:
1177 case LibFunc_acosl_finite:
1179 case LibFunc_asin_finite:
1181 case LibFunc_asinf_finite:
1183 case LibFunc_asinhf:
1184 case LibFunc_asinhl:
1186 case LibFunc_asinl_finite:
1190 case LibFunc_atanh_finite:
1191 case LibFunc_atanhf:
1192 case LibFunc_atanhf_finite:
1193 case LibFunc_atanhl:
1194 case LibFunc_atanhl_finite:
1205 case LibFunc_cosh_finite:
1207 case LibFunc_coshf_finite:
1209 case LibFunc_coshl_finite:
1212 case LibFunc_exp10_finite:
1213 case LibFunc_exp10f:
1214 case LibFunc_exp10f_finite:
1215 case LibFunc_exp10l:
1216 case LibFunc_exp10l_finite:
1218 case LibFunc_exp2_finite:
1220 case LibFunc_exp2f_finite:
1222 case LibFunc_exp2l_finite:
1224 case LibFunc_exp_finite:
1226 case LibFunc_expf_finite:
1228 case LibFunc_expl_finite:
1230 case LibFunc_expm1f:
1231 case LibFunc_expm1l:
1236 case LibFunc_floorf:
1237 case LibFunc_floorl:
1239 case LibFunc_log10_finite:
1240 case LibFunc_log10f:
1241 case LibFunc_log10f_finite:
1242 case LibFunc_log10l:
1243 case LibFunc_log10l_finite:
1245 case LibFunc_log1pf:
1246 case LibFunc_log1pl:
1248 case LibFunc_log2_finite:
1250 case LibFunc_log2f_finite:
1252 case LibFunc_log2l_finite:
1254 case LibFunc_log_finite:
1259 case LibFunc_logf_finite:
1261 case LibFunc_logl_finite:
1262 case LibFunc_nearbyint:
1263 case LibFunc_nearbyintf:
1264 case LibFunc_nearbyintl:
1269 case LibFunc_roundf:
1270 case LibFunc_roundl:
1274 case LibFunc_sinh_finite:
1276 case LibFunc_sinhf_finite:
1278 case LibFunc_sinhl_finite:
1281 case LibFunc_sqrt_finite:
1283 case LibFunc_sqrtf_finite:
1285 case LibFunc_sqrtl_finite:
1293 case LibFunc_truncf:
1294 case LibFunc_truncl:
1295 return (NumParams == 1 && FTy.getReturnType()->isFloatingPointTy() &&
1296 FTy.getReturnType() == FTy.getParamType(0));
1299 case LibFunc_atan2_finite:
1300 case LibFunc_atan2f:
1301 case LibFunc_atan2f_finite:
1302 case LibFunc_atan2l:
1303 case LibFunc_atan2l_finite:
1313 case LibFunc_copysign:
1314 case LibFunc_copysignf:
1315 case LibFunc_copysignl:
1317 case LibFunc_pow_finite:
1319 case LibFunc_powf_finite:
1321 case LibFunc_powl_finite:
1322 return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
1323 FTy.getReturnType() == FTy.getParamType(0) &&
1324 FTy.getReturnType() == FTy.getParamType(1));
1327 case LibFunc_ldexpf:
1328 case LibFunc_ldexpl:
1329 return (NumParams == 2 && FTy.getReturnType()->isFloatingPointTy() &&
1330 FTy.getReturnType() == FTy.getParamType(0) &&
1331 FTy.getParamType(1)->isIntegerTy(32));
1339 return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
1340 FTy.getParamType(0)->isIntegerTy());
1342 case LibFunc_isdigit:
1343 case LibFunc_isascii:
1344 case LibFunc_toascii:
1345 case LibFunc_putchar:
1346 case LibFunc_putchar_unlocked:
1347 return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
1348 FTy.getReturnType() == FTy.getParamType(0));
1353 return (NumParams == 1 && FTy.getReturnType()->isIntegerTy() &&
1354 FTy.getReturnType() == FTy.getParamType(0));
1356 case LibFunc_cxa_atexit:
1357 return (NumParams == 3 && FTy.getReturnType()->isIntegerTy() &&
1358 FTy.getParamType(0)->isPointerTy() &&
1359 FTy.getParamType(1)->isPointerTy() &&
1360 FTy.getParamType(2)->isPointerTy());
1364 return (NumParams == 1 && FTy.getReturnType()->isDoubleTy() &&
1365 FTy.getReturnType() == FTy.getParamType(0));
1367 case LibFunc_sinpif:
1368 case LibFunc_cospif:
1369 return (NumParams == 1 && FTy.getReturnType()->isFloatTy() &&
1370 FTy.getReturnType() == FTy.getParamType(0));
1372 case LibFunc_strnlen:
1373 return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(1) &&
1374 FTy.getParamType(0) == PCharTy &&
1375 FTy.getParamType(1) == SizeTTy);
1377 case LibFunc_posix_memalign:
1378 return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) &&
1379 FTy.getParamType(0)->isPointerTy() &&
1380 FTy.getParamType(1) == SizeTTy && FTy.getParamType(2) == SizeTTy);
1382 case LibFunc_wcslen:
1383 return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() &&
1384 FTy.getReturnType()->isIntegerTy());
1388 case LibFunc_cabsl: {
1389 Type* RetTy = FTy.getReturnType();
1390 if (!RetTy->isFloatingPointTy())
1393 // NOTE: These prototypes are target specific and currently support
1394 // "complex" passed as an array or discrete real & imaginary parameters.
1395 // Add other calling conventions to enable libcall optimizations.
1397 return (FTy.getParamType(0)->isArrayTy() &&
1398 FTy.getParamType(0)->getArrayNumElements() == 2 &&
1399 FTy.getParamType(0)->getArrayElementType() == RetTy);
1400 else if (NumParams == 2)
1401 return (FTy.getParamType(0) == RetTy && FTy.getParamType(1) == RetTy);
1405 case LibFunc::NumLibFuncs:
1409 llvm_unreachable("Invalid libfunc");
1412 bool TargetLibraryInfoImpl::getLibFunc(const Function &FDecl,
1414 const DataLayout *DL =
1415 FDecl.getParent() ? &FDecl.getParent()->getDataLayout() : nullptr;
1416 return getLibFunc(FDecl.getName(), F) &&
1417 isValidProtoForLibFunc(*FDecl.getFunctionType(), F, DL);
1420 void TargetLibraryInfoImpl::disableAllFunctions() {
1421 memset(AvailableArray, 0, sizeof(AvailableArray));
1424 static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS) {
1425 return LHS.ScalarFnName < RHS.ScalarFnName;
1428 static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS) {
1429 return LHS.VectorFnName < RHS.VectorFnName;
1432 static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S) {
1433 return LHS.ScalarFnName < S;
1436 static bool compareWithVectorFnName(const VecDesc &LHS, StringRef S) {
1437 return LHS.VectorFnName < S;
1440 void TargetLibraryInfoImpl::addVectorizableFunctions(ArrayRef<VecDesc> Fns) {
1441 VectorDescs.insert(VectorDescs.end(), Fns.begin(), Fns.end());
1442 llvm::sort(VectorDescs, compareByScalarFnName);
1444 ScalarDescs.insert(ScalarDescs.end(), Fns.begin(), Fns.end());
1445 llvm::sort(ScalarDescs, compareByVectorFnName);
1448 void TargetLibraryInfoImpl::addVectorizableFunctionsFromVecLib(
1449 enum VectorLibrary VecLib) {
1452 const VecDesc VecFuncs[] = {
1453 // Floating-Point Arithmetic and Auxiliary Functions
1454 {"ceilf", "vceilf", 4},
1455 {"fabsf", "vfabsf", 4},
1456 {"llvm.fabs.f32", "vfabsf", 4},
1457 {"floorf", "vfloorf", 4},
1458 {"sqrtf", "vsqrtf", 4},
1459 {"llvm.sqrt.f32", "vsqrtf", 4},
1461 // Exponential and Logarithmic Functions
1462 {"expf", "vexpf", 4},
1463 {"llvm.exp.f32", "vexpf", 4},
1464 {"expm1f", "vexpm1f", 4},
1465 {"logf", "vlogf", 4},
1466 {"llvm.log.f32", "vlogf", 4},
1467 {"log1pf", "vlog1pf", 4},
1468 {"log10f", "vlog10f", 4},
1469 {"llvm.log10.f32", "vlog10f", 4},
1470 {"logbf", "vlogbf", 4},
1472 // Trigonometric Functions
1473 {"sinf", "vsinf", 4},
1474 {"llvm.sin.f32", "vsinf", 4},
1475 {"cosf", "vcosf", 4},
1476 {"llvm.cos.f32", "vcosf", 4},
1477 {"tanf", "vtanf", 4},
1478 {"asinf", "vasinf", 4},
1479 {"acosf", "vacosf", 4},
1480 {"atanf", "vatanf", 4},
1482 // Hyperbolic Functions
1483 {"sinhf", "vsinhf", 4},
1484 {"coshf", "vcoshf", 4},
1485 {"tanhf", "vtanhf", 4},
1486 {"asinhf", "vasinhf", 4},
1487 {"acoshf", "vacoshf", 4},
1488 {"atanhf", "vatanhf", 4},
1490 addVectorizableFunctions(VecFuncs);
1494 const VecDesc VecFuncs[] = {
1495 {"sin", "__svml_sin2", 2},
1496 {"sin", "__svml_sin4", 4},
1497 {"sin", "__svml_sin8", 8},
1499 {"sinf", "__svml_sinf4", 4},
1500 {"sinf", "__svml_sinf8", 8},
1501 {"sinf", "__svml_sinf16", 16},
1503 {"llvm.sin.f64", "__svml_sin2", 2},
1504 {"llvm.sin.f64", "__svml_sin4", 4},
1505 {"llvm.sin.f64", "__svml_sin8", 8},
1507 {"llvm.sin.f32", "__svml_sinf4", 4},
1508 {"llvm.sin.f32", "__svml_sinf8", 8},
1509 {"llvm.sin.f32", "__svml_sinf16", 16},
1511 {"cos", "__svml_cos2", 2},
1512 {"cos", "__svml_cos4", 4},
1513 {"cos", "__svml_cos8", 8},
1515 {"cosf", "__svml_cosf4", 4},
1516 {"cosf", "__svml_cosf8", 8},
1517 {"cosf", "__svml_cosf16", 16},
1519 {"llvm.cos.f64", "__svml_cos2", 2},
1520 {"llvm.cos.f64", "__svml_cos4", 4},
1521 {"llvm.cos.f64", "__svml_cos8", 8},
1523 {"llvm.cos.f32", "__svml_cosf4", 4},
1524 {"llvm.cos.f32", "__svml_cosf8", 8},
1525 {"llvm.cos.f32", "__svml_cosf16", 16},
1527 {"pow", "__svml_pow2", 2},
1528 {"pow", "__svml_pow4", 4},
1529 {"pow", "__svml_pow8", 8},
1531 {"powf", "__svml_powf4", 4},
1532 {"powf", "__svml_powf8", 8},
1533 {"powf", "__svml_powf16", 16},
1535 { "__pow_finite", "__svml_pow2", 2 },
1536 { "__pow_finite", "__svml_pow4", 4 },
1537 { "__pow_finite", "__svml_pow8", 8 },
1539 { "__powf_finite", "__svml_powf4", 4 },
1540 { "__powf_finite", "__svml_powf8", 8 },
1541 { "__powf_finite", "__svml_powf16", 16 },
1543 {"llvm.pow.f64", "__svml_pow2", 2},
1544 {"llvm.pow.f64", "__svml_pow4", 4},
1545 {"llvm.pow.f64", "__svml_pow8", 8},
1547 {"llvm.pow.f32", "__svml_powf4", 4},
1548 {"llvm.pow.f32", "__svml_powf8", 8},
1549 {"llvm.pow.f32", "__svml_powf16", 16},
1551 {"exp", "__svml_exp2", 2},
1552 {"exp", "__svml_exp4", 4},
1553 {"exp", "__svml_exp8", 8},
1555 {"expf", "__svml_expf4", 4},
1556 {"expf", "__svml_expf8", 8},
1557 {"expf", "__svml_expf16", 16},
1559 { "__exp_finite", "__svml_exp2", 2 },
1560 { "__exp_finite", "__svml_exp4", 4 },
1561 { "__exp_finite", "__svml_exp8", 8 },
1563 { "__expf_finite", "__svml_expf4", 4 },
1564 { "__expf_finite", "__svml_expf8", 8 },
1565 { "__expf_finite", "__svml_expf16", 16 },
1567 {"llvm.exp.f64", "__svml_exp2", 2},
1568 {"llvm.exp.f64", "__svml_exp4", 4},
1569 {"llvm.exp.f64", "__svml_exp8", 8},
1571 {"llvm.exp.f32", "__svml_expf4", 4},
1572 {"llvm.exp.f32", "__svml_expf8", 8},
1573 {"llvm.exp.f32", "__svml_expf16", 16},
1575 {"log", "__svml_log2", 2},
1576 {"log", "__svml_log4", 4},
1577 {"log", "__svml_log8", 8},
1579 {"logf", "__svml_logf4", 4},
1580 {"logf", "__svml_logf8", 8},
1581 {"logf", "__svml_logf16", 16},
1583 { "__log_finite", "__svml_log2", 2 },
1584 { "__log_finite", "__svml_log4", 4 },
1585 { "__log_finite", "__svml_log8", 8 },
1587 { "__logf_finite", "__svml_logf4", 4 },
1588 { "__logf_finite", "__svml_logf8", 8 },
1589 { "__logf_finite", "__svml_logf16", 16 },
1591 {"llvm.log.f64", "__svml_log2", 2},
1592 {"llvm.log.f64", "__svml_log4", 4},
1593 {"llvm.log.f64", "__svml_log8", 8},
1595 {"llvm.log.f32", "__svml_logf4", 4},
1596 {"llvm.log.f32", "__svml_logf8", 8},
1597 {"llvm.log.f32", "__svml_logf16", 16},
1599 addVectorizableFunctions(VecFuncs);
1607 bool TargetLibraryInfoImpl::isFunctionVectorizable(StringRef funcName) const {
1608 funcName = sanitizeFunctionName(funcName);
1609 if (funcName.empty())
1612 std::vector<VecDesc>::const_iterator I = std::lower_bound(
1613 VectorDescs.begin(), VectorDescs.end(), funcName,
1614 compareWithScalarFnName);
1615 return I != VectorDescs.end() && StringRef(I->ScalarFnName) == funcName;
1618 StringRef TargetLibraryInfoImpl::getVectorizedFunction(StringRef F,
1619 unsigned VF) const {
1620 F = sanitizeFunctionName(F);
1623 std::vector<VecDesc>::const_iterator I = std::lower_bound(
1624 VectorDescs.begin(), VectorDescs.end(), F, compareWithScalarFnName);
1625 while (I != VectorDescs.end() && StringRef(I->ScalarFnName) == F) {
1626 if (I->VectorizationFactor == VF)
1627 return I->VectorFnName;
1633 StringRef TargetLibraryInfoImpl::getScalarizedFunction(StringRef F,
1634 unsigned &VF) const {
1635 F = sanitizeFunctionName(F);
1639 std::vector<VecDesc>::const_iterator I = std::lower_bound(
1640 ScalarDescs.begin(), ScalarDescs.end(), F, compareWithVectorFnName);
1641 if (I == VectorDescs.end() || StringRef(I->VectorFnName) != F)
1643 VF = I->VectorizationFactor;
1644 return I->ScalarFnName;
1647 TargetLibraryInfo TargetLibraryAnalysis::run(Module &M,
1648 ModuleAnalysisManager &) {
1650 return TargetLibraryInfo(*PresetInfoImpl);
1652 return TargetLibraryInfo(lookupInfoImpl(Triple(M.getTargetTriple())));
1655 TargetLibraryInfo TargetLibraryAnalysis::run(Function &F,
1656 FunctionAnalysisManager &) {
1658 return TargetLibraryInfo(*PresetInfoImpl);
1660 return TargetLibraryInfo(
1661 lookupInfoImpl(Triple(F.getParent()->getTargetTriple())));
1664 TargetLibraryInfoImpl &TargetLibraryAnalysis::lookupInfoImpl(const Triple &T) {
1665 std::unique_ptr<TargetLibraryInfoImpl> &Impl =
1666 Impls[T.normalize()];
1668 Impl.reset(new TargetLibraryInfoImpl(T));
1673 unsigned TargetLibraryInfoImpl::getWCharSize(const Module &M) const {
1674 if (auto *ShortWChar = cast_or_null<ConstantAsMetadata>(
1675 M.getModuleFlag("wchar_size")))
1676 return cast<ConstantInt>(ShortWChar->getValue())->getZExtValue();
1680 TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass()
1681 : ImmutablePass(ID), TLIImpl(), TLI(TLIImpl) {
1682 initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1685 TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(const Triple &T)
1686 : ImmutablePass(ID), TLIImpl(T), TLI(TLIImpl) {
1687 initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1690 TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(
1691 const TargetLibraryInfoImpl &TLIImpl)
1692 : ImmutablePass(ID), TLIImpl(TLIImpl), TLI(this->TLIImpl) {
1693 initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
1696 AnalysisKey TargetLibraryAnalysis::Key;
1698 // Register the basic pass.
1699 INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
1700 "Target Library Information", false, true)
1701 char TargetLibraryInfoWrapperPass::ID = 0;
1703 void TargetLibraryInfoWrapperPass::anchor() {}