LLVM 22.0.0git
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/DenseMap.h"
16#include "llvm/IR/Constants.h"
17#include "llvm/IR/Module.h"
21using namespace llvm;
22
24 "vector-library", cl::Hidden, cl::desc("Vector functions library"),
27 "No vector functions library"),
29 "Accelerate framework"),
31 "Darwin_libsystem_m", "Darwin libsystem_m"),
33 "GLIBC Vector Math library"),
35 "IBM MASS vector library"),
37 "Intel SVML library"),
39 "SIMD Library for Evaluating Elementary Functions"),
41 "Arm Performance Libraries"),
43 "AMD vector math library")));
44
45StringLiteral const TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] =
46 {
47#define TLI_DEFINE_STRING
48#include "llvm/Analysis/TargetLibraryInfo.def"
49};
50
52 assert(!VectorFnName.empty() && "Vector function name must not be empty.");
53 SmallString<256> Buffer;
54 llvm::raw_svector_ostream Out(Buffer);
55 Out << VABIPrefix << "_" << ScalarFnName << "(" << VectorFnName << ")";
56 return std::string(Out.str());
57}
58
59// Recognized types of library function arguments and return types.
60enum FuncArgTypeID : char {
61 Void = 0, // Must be zero.
62 Bool, // 8 bits on all targets
66 IntPlus, // Int or bigger.
67 Long, // Either 32 or 64 bits.
68 IntX, // Any integer type.
70 LLong, // 64 bits on all targets.
71 SizeT, // size_t.
72 SSizeT, // POSIX ssize_t.
73 Flt, // IEEE float.
74 Dbl, // IEEE double.
75 LDbl, // Any floating type (TODO: tighten this up).
76 Floating, // Any floating type.
77 Ptr, // Any pointer type.
78 Struct, // Any struct type.
79 Ellip, // The ellipsis (...).
80 Same, // Same argument type as the previous one.
81};
82
83typedef std::array<FuncArgTypeID, 8> FuncProtoTy;
84
85static const FuncProtoTy Signatures[] = {
86#define TLI_DEFINE_SIG
87#include "llvm/Analysis/TargetLibraryInfo.def"
88};
89
90static_assert(sizeof Signatures / sizeof *Signatures == LibFunc::NumLibFuncs,
91 "Missing library function signatures");
92
93static bool hasSinCosPiStret(const Triple &T) {
94 // Only Darwin variants have _stret versions of combined trig functions.
95 if (!T.isOSDarwin())
96 return false;
97
98 // The ABI is rather complicated on x86, so don't do anything special there.
99 if (T.getArch() == Triple::x86)
100 return false;
101
102 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
103 return false;
104
105 if (T.isiOS() && T.isOSVersionLT(7, 0))
106 return false;
107
108 return true;
109}
110
111static bool hasBcmp(const Triple &TT) {
112 // Posix removed support from bcmp() in 2001, but the glibc and several
113 // implementations of the libc still have it.
114 if (TT.isOSLinux())
115 return TT.isGNUEnvironment() || TT.isMusl();
116 // Both NetBSD and OpenBSD are planning to remove the function. Windows does
117 // not have it.
118 return TT.isOSFreeBSD() || TT.isOSSolaris();
119}
120
122 FunctionType *FuncTy) {
123 switch (CC) {
124 default:
125 return false;
127 return true;
131
132 // The iOS ABI diverges from the standard in some cases, so for now don't
133 // try to simplify those calls.
134 if (TT.isiOS())
135 return false;
136
137 if (!FuncTy->getReturnType()->isPointerTy() &&
138 !FuncTy->getReturnType()->isIntegerTy() &&
139 !FuncTy->getReturnType()->isVoidTy())
140 return false;
141
142 for (auto *Param : FuncTy->params()) {
143 if (!Param->isPointerTy() && !Param->isIntegerTy())
144 return false;
145 }
146 return true;
147 }
148 }
149 return false;
150}
151
153 return ::isCallingConvCCompatible(CI->getCallingConv(),
154 CI->getModule()->getTargetTriple(),
155 CI->getFunctionType());
156}
157
159 return ::isCallingConvCCompatible(F->getCallingConv(),
160 F->getParent()->getTargetTriple(),
161 F->getFunctionType());
162}
163
164static void initializeBase(TargetLibraryInfoImpl &TLI, const Triple &T) {
165 bool ShouldExtI32Param, ShouldExtI32Return;
166 bool ShouldSignExtI32Param, ShouldSignExtI32Return;
168 ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param,
169 ShouldSignExtI32Return, T);
170 TLI.setShouldExtI32Param(ShouldExtI32Param);
171 TLI.setShouldExtI32Return(ShouldExtI32Return);
172 TLI.setShouldSignExtI32Param(ShouldSignExtI32Param);
173 TLI.setShouldSignExtI32Return(ShouldSignExtI32Return);
174
175 // Let's assume by default that the size of int is 32 bits, unless the target
176 // is a 16-bit architecture because then it most likely is 16 bits. If that
177 // isn't true for a target those defaults should be overridden below.
178 TLI.setIntSize(T.isArch16Bit() ? 16 : 32);
179}
180
181/// Initialize the set of available library functions based on the specified
182/// target triple. This should be carefully written so that a missing target
183/// triple gets a sane set of defaults.
185 ArrayRef<StringLiteral> StandardNames) {
186 // Set IO unlocked variants as unavailable
187 // Set them as available per system below
188 TLI.setUnavailable(LibFunc_getc_unlocked);
189 TLI.setUnavailable(LibFunc_getchar_unlocked);
190 TLI.setUnavailable(LibFunc_putc_unlocked);
191 TLI.setUnavailable(LibFunc_putchar_unlocked);
192 TLI.setUnavailable(LibFunc_fputc_unlocked);
193 TLI.setUnavailable(LibFunc_fgetc_unlocked);
194 TLI.setUnavailable(LibFunc_fread_unlocked);
195 TLI.setUnavailable(LibFunc_fwrite_unlocked);
196 TLI.setUnavailable(LibFunc_fputs_unlocked);
197 TLI.setUnavailable(LibFunc_fgets_unlocked);
198
199 // There is really no runtime library on AMDGPU, apart from
200 // __kmpc_alloc/free_shared.
201 if (T.isAMDGPU()) {
203 TLI.setAvailable(llvm::LibFunc___kmpc_alloc_shared);
204 TLI.setAvailable(llvm::LibFunc___kmpc_free_shared);
205 return;
206 }
207
208 // DXIL does not support libcalls, and disabling them here prevents a number
209 // of passes from introducing libcalls into DXIL which would otherwise
210 // complicate lowering/legalization
211 if (T.isDXIL()) {
213 return;
214 }
215
216 // memset_pattern{4,8,16} is only available on iOS 3.0 and Mac OS X 10.5 and
217 // later. All versions of watchOS support it.
218 if (T.isMacOSX()) {
219 // available IO unlocked variants on Mac OS X
220 TLI.setAvailable(LibFunc_getc_unlocked);
221 TLI.setAvailable(LibFunc_getchar_unlocked);
222 TLI.setAvailable(LibFunc_putc_unlocked);
223 TLI.setAvailable(LibFunc_putchar_unlocked);
224 TLI.setUnavailable(LibFunc_memrchr);
225
226 if (T.isMacOSXVersionLT(10, 5)) {
227 TLI.setUnavailable(LibFunc_memset_pattern4);
228 TLI.setUnavailable(LibFunc_memset_pattern8);
229 TLI.setUnavailable(LibFunc_memset_pattern16);
230 }
231 } else if (T.isiOS()) {
232 if (T.isOSVersionLT(3, 0)) {
233 TLI.setUnavailable(LibFunc_memset_pattern4);
234 TLI.setUnavailable(LibFunc_memset_pattern8);
235 TLI.setUnavailable(LibFunc_memset_pattern16);
236 }
237 } else if (!T.isWatchOS()) {
238 TLI.setUnavailable(LibFunc_memset_pattern4);
239 TLI.setUnavailable(LibFunc_memset_pattern8);
240 TLI.setUnavailable(LibFunc_memset_pattern16);
241 }
242
243 if (!hasSinCosPiStret(T)) {
244 TLI.setUnavailable(LibFunc_sinpi);
245 TLI.setUnavailable(LibFunc_sinpif);
246 TLI.setUnavailable(LibFunc_cospi);
247 TLI.setUnavailable(LibFunc_cospif);
248 TLI.setUnavailable(LibFunc_sincospi_stret);
249 TLI.setUnavailable(LibFunc_sincospif_stret);
250 }
251
252 if (!hasBcmp(T))
253 TLI.setUnavailable(LibFunc_bcmp);
254
255 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
256 !T.isMacOSXVersionLT(10, 7)) {
257 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
258 // we don't care about) have two versions; on recent OSX, the one we want
259 // has a $UNIX2003 suffix. The two implementations are identical except
260 // for the return value in some edge cases. However, we don't want to
261 // generate code that depends on the old symbols.
262 TLI.setAvailableWithName(LibFunc_fwrite, "fwrite$UNIX2003");
263 TLI.setAvailableWithName(LibFunc_fputs, "fputs$UNIX2003");
264 }
265
266 // iprintf and friends are only available on XCore, TCE, and Emscripten.
267 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce &&
268 T.getOS() != Triple::Emscripten) {
269 TLI.setUnavailable(LibFunc_iprintf);
270 TLI.setUnavailable(LibFunc_siprintf);
271 TLI.setUnavailable(LibFunc_fiprintf);
272 }
273
274 // __small_printf and friends are only available on Emscripten.
275 if (T.getOS() != Triple::Emscripten) {
276 TLI.setUnavailable(LibFunc_small_printf);
277 TLI.setUnavailable(LibFunc_small_sprintf);
278 TLI.setUnavailable(LibFunc_small_fprintf);
279 }
280
281 if (T.isOSWindows() && !T.isOSCygMing()) {
282 // XXX: The earliest documentation available at the moment is for VS2015/VC19:
283 // https://docs.microsoft.com/en-us/cpp/c-runtime-library/floating-point-support?view=vs-2015
284 // XXX: In order to use an MSVCRT older than VC19,
285 // the specific library version must be explicit in the target triple,
286 // e.g., x86_64-pc-windows-msvc18.
287 bool hasPartialC99 = true;
288 if (T.isKnownWindowsMSVCEnvironment()) {
289 VersionTuple Version = T.getEnvironmentVersion();
290 hasPartialC99 = (Version.getMajor() == 0 || Version.getMajor() >= 19);
291 }
292
293 // Latest targets support C89 math functions, in part.
294 bool isARM = (T.getArch() == Triple::aarch64 ||
295 T.getArch() == Triple::arm);
296 bool hasPartialFloat = (isARM ||
297 T.getArch() == Triple::x86_64);
298
299 // Win32 does not support float C89 math functions, in general.
300 if (!hasPartialFloat) {
301 TLI.setUnavailable(LibFunc_acosf);
302 TLI.setUnavailable(LibFunc_asinf);
303 TLI.setUnavailable(LibFunc_atan2f);
304 TLI.setUnavailable(LibFunc_atanf);
305 TLI.setUnavailable(LibFunc_ceilf);
306 TLI.setUnavailable(LibFunc_cosf);
307 TLI.setUnavailable(LibFunc_coshf);
308 TLI.setUnavailable(LibFunc_expf);
309 TLI.setUnavailable(LibFunc_floorf);
310 TLI.setUnavailable(LibFunc_fmodf);
311 TLI.setUnavailable(LibFunc_hypotf);
312 TLI.setUnavailable(LibFunc_log10f);
313 TLI.setUnavailable(LibFunc_logf);
314 TLI.setUnavailable(LibFunc_modff);
315 TLI.setUnavailable(LibFunc_powf);
316 TLI.setUnavailable(LibFunc_remainderf);
317 TLI.setUnavailable(LibFunc_remquof);
318 TLI.setUnavailable(LibFunc_fdimf);
319 TLI.setUnavailable(LibFunc_sinf);
320 TLI.setUnavailable(LibFunc_sinhf);
321 TLI.setUnavailable(LibFunc_sqrtf);
322 TLI.setUnavailable(LibFunc_tanf);
323 TLI.setUnavailable(LibFunc_tanhf);
324 }
325 if (!isARM)
326 TLI.setUnavailable(LibFunc_fabsf);
327 TLI.setUnavailable(LibFunc_frexpf);
328 TLI.setUnavailable(LibFunc_ldexpf);
329
330 // Win32 does not support long double C89 math functions.
331 TLI.setUnavailable(LibFunc_acosl);
332 TLI.setUnavailable(LibFunc_asinl);
333 TLI.setUnavailable(LibFunc_atan2l);
334 TLI.setUnavailable(LibFunc_atanl);
335 TLI.setUnavailable(LibFunc_ceill);
336 TLI.setUnavailable(LibFunc_cosl);
337 TLI.setUnavailable(LibFunc_coshl);
338 TLI.setUnavailable(LibFunc_expl);
339 TLI.setUnavailable(LibFunc_fabsl);
340 TLI.setUnavailable(LibFunc_floorl);
341 TLI.setUnavailable(LibFunc_fmodl);
342 TLI.setUnavailable(LibFunc_frexpl);
343 TLI.setUnavailable(LibFunc_hypotl);
344 TLI.setUnavailable(LibFunc_ldexpl);
345 TLI.setUnavailable(LibFunc_log10l);
346 TLI.setUnavailable(LibFunc_logl);
347 TLI.setUnavailable(LibFunc_modfl);
348 TLI.setUnavailable(LibFunc_powl);
349 TLI.setUnavailable(LibFunc_remainderl);
350 TLI.setUnavailable(LibFunc_remquol);
351 TLI.setUnavailable(LibFunc_fdiml);
352 TLI.setUnavailable(LibFunc_sinl);
353 TLI.setUnavailable(LibFunc_sinhl);
354 TLI.setUnavailable(LibFunc_sqrtl);
355 TLI.setUnavailable(LibFunc_tanl);
356 TLI.setUnavailable(LibFunc_tanhl);
357
358 // Win32 does not fully support C99 math functions.
359 if (!hasPartialC99) {
360 TLI.setUnavailable(LibFunc_acosh);
361 TLI.setUnavailable(LibFunc_acoshf);
362 TLI.setUnavailable(LibFunc_asinh);
363 TLI.setUnavailable(LibFunc_asinhf);
364 TLI.setUnavailable(LibFunc_atanh);
365 TLI.setUnavailable(LibFunc_atanhf);
366 TLI.setAvailableWithName(LibFunc_cabs, "_cabs");
367 TLI.setUnavailable(LibFunc_cabsf);
368 TLI.setUnavailable(LibFunc_cbrt);
369 TLI.setUnavailable(LibFunc_cbrtf);
370 TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
371 TLI.setAvailableWithName(LibFunc_copysignf, "_copysignf");
372 TLI.setUnavailable(LibFunc_exp2);
373 TLI.setUnavailable(LibFunc_exp2f);
374 TLI.setUnavailable(LibFunc_expm1);
375 TLI.setUnavailable(LibFunc_expm1f);
376 TLI.setUnavailable(LibFunc_fmax);
377 TLI.setUnavailable(LibFunc_fmaxf);
378 TLI.setUnavailable(LibFunc_fmin);
379 TLI.setUnavailable(LibFunc_fminf);
380 TLI.setUnavailable(LibFunc_log1p);
381 TLI.setUnavailable(LibFunc_log1pf);
382 TLI.setUnavailable(LibFunc_log2);
383 TLI.setUnavailable(LibFunc_log2f);
384 TLI.setAvailableWithName(LibFunc_logb, "_logb");
385 TLI.setUnavailable(LibFunc_ilogb);
386 TLI.setUnavailable(LibFunc_ilogbf);
387 if (hasPartialFloat)
388 TLI.setAvailableWithName(LibFunc_logbf, "_logbf");
389 else
390 TLI.setUnavailable(LibFunc_logbf);
391 TLI.setUnavailable(LibFunc_rint);
392 TLI.setUnavailable(LibFunc_rintf);
393 TLI.setUnavailable(LibFunc_round);
394 TLI.setUnavailable(LibFunc_roundf);
395 TLI.setUnavailable(LibFunc_scalbln);
396 TLI.setUnavailable(LibFunc_scalblnf);
397 TLI.setUnavailable(LibFunc_scalblnl);
398 TLI.setUnavailable(LibFunc_scalbn);
399 TLI.setUnavailable(LibFunc_scalbnf);
400 TLI.setUnavailable(LibFunc_scalbnl);
401 TLI.setUnavailable(LibFunc_trunc);
402 TLI.setUnavailable(LibFunc_truncf);
403 }
404
405 // Win32 does not support long double C99 math functions.
406 TLI.setUnavailable(LibFunc_acoshl);
407 TLI.setUnavailable(LibFunc_asinhl);
408 TLI.setUnavailable(LibFunc_atanhl);
409 TLI.setUnavailable(LibFunc_cabsl);
410 TLI.setUnavailable(LibFunc_cbrtl);
411 TLI.setUnavailable(LibFunc_copysignl);
412 TLI.setUnavailable(LibFunc_exp2l);
413 TLI.setUnavailable(LibFunc_expm1l);
414 TLI.setUnavailable(LibFunc_fmaxl);
415 TLI.setUnavailable(LibFunc_fminl);
416 TLI.setUnavailable(LibFunc_log1pl);
417 TLI.setUnavailable(LibFunc_log2l);
418 TLI.setUnavailable(LibFunc_logbl);
419 TLI.setUnavailable(LibFunc_ilogbl);
420 TLI.setUnavailable(LibFunc_nearbyintl);
421 TLI.setUnavailable(LibFunc_rintl);
422 TLI.setUnavailable(LibFunc_roundl);
423 TLI.setUnavailable(LibFunc_scalblnl);
424 TLI.setUnavailable(LibFunc_scalbnl);
425 TLI.setUnavailable(LibFunc_truncl);
426
427 // Win32 does not support these functions, but
428 // they are generally available on POSIX-compliant systems.
429 TLI.setUnavailable(LibFunc_access);
430 TLI.setUnavailable(LibFunc_chmod);
431 TLI.setUnavailable(LibFunc_closedir);
432 TLI.setUnavailable(LibFunc_fdopen);
433 TLI.setUnavailable(LibFunc_fileno);
434 TLI.setUnavailable(LibFunc_fseeko);
435 TLI.setUnavailable(LibFunc_fstat);
436 TLI.setUnavailable(LibFunc_ftello);
437 TLI.setUnavailable(LibFunc_gettimeofday);
438 TLI.setUnavailable(LibFunc_memccpy);
439 TLI.setUnavailable(LibFunc_mkdir);
440 TLI.setUnavailable(LibFunc_open);
441 TLI.setUnavailable(LibFunc_opendir);
442 TLI.setUnavailable(LibFunc_pclose);
443 TLI.setUnavailable(LibFunc_popen);
444 TLI.setUnavailable(LibFunc_read);
445 TLI.setUnavailable(LibFunc_rmdir);
446 TLI.setUnavailable(LibFunc_stat);
447 TLI.setUnavailable(LibFunc_strcasecmp);
448 TLI.setUnavailable(LibFunc_strncasecmp);
449 TLI.setUnavailable(LibFunc_unlink);
450 TLI.setUnavailable(LibFunc_utime);
451 TLI.setUnavailable(LibFunc_write);
452 }
453
454 if (T.isOSWindows() && !T.isWindowsCygwinEnvironment()) {
455 // These functions aren't available in either MSVC or MinGW environments.
456 TLI.setUnavailable(LibFunc_bcmp);
457 TLI.setUnavailable(LibFunc_bcopy);
458 TLI.setUnavailable(LibFunc_bzero);
459 TLI.setUnavailable(LibFunc_chown);
460 TLI.setUnavailable(LibFunc_ctermid);
461 TLI.setUnavailable(LibFunc_ffs);
462 TLI.setUnavailable(LibFunc_flockfile);
463 TLI.setUnavailable(LibFunc_fstatvfs);
464 TLI.setUnavailable(LibFunc_ftrylockfile);
465 TLI.setUnavailable(LibFunc_funlockfile);
466 TLI.setUnavailable(LibFunc_getitimer);
467 TLI.setUnavailable(LibFunc_getlogin_r);
468 TLI.setUnavailable(LibFunc_getpwnam);
469 TLI.setUnavailable(LibFunc_htonl);
470 TLI.setUnavailable(LibFunc_htons);
471 TLI.setUnavailable(LibFunc_lchown);
472 TLI.setUnavailable(LibFunc_lstat);
473 TLI.setUnavailable(LibFunc_memrchr);
474 TLI.setUnavailable(LibFunc_ntohl);
475 TLI.setUnavailable(LibFunc_ntohs);
476 TLI.setUnavailable(LibFunc_pread);
477 TLI.setUnavailable(LibFunc_pwrite);
478 TLI.setUnavailable(LibFunc_readlink);
479 TLI.setUnavailable(LibFunc_realpath);
480 TLI.setUnavailable(LibFunc_setitimer);
481 TLI.setUnavailable(LibFunc_statvfs);
482 TLI.setUnavailable(LibFunc_stpcpy);
483 TLI.setUnavailable(LibFunc_stpncpy);
484 TLI.setUnavailable(LibFunc_times);
485 TLI.setUnavailable(LibFunc_uname);
486 TLI.setUnavailable(LibFunc_unsetenv);
487 TLI.setUnavailable(LibFunc_utimes);
488
489 // MinGW does have ldexpf, but it is a plain wrapper over regular ldexp.
490 // Therefore it's not beneficial to transform code to use it, i.e.
491 // just pretend that the function is not available.
492 TLI.setUnavailable(LibFunc_ldexpf);
493 }
494
495 // Pick just one set of new/delete variants.
496 if (T.isOSMSVCRT()) {
497 // MSVC, doesn't have the Itanium new/delete.
498 TLI.setUnavailable(LibFunc_ZdaPv);
499 TLI.setUnavailable(LibFunc_ZdaPvRKSt9nothrow_t);
500 TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_t);
501 TLI.setUnavailable(LibFunc_ZdaPvSt11align_val_tRKSt9nothrow_t);
502 TLI.setUnavailable(LibFunc_ZdaPvj);
503 TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
504 TLI.setUnavailable(LibFunc_ZdaPvm);
505 TLI.setUnavailable(LibFunc_ZdaPvmSt11align_val_t);
506 TLI.setUnavailable(LibFunc_ZdlPv);
507 TLI.setUnavailable(LibFunc_ZdlPvRKSt9nothrow_t);
508 TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_t);
509 TLI.setUnavailable(LibFunc_ZdlPvSt11align_val_tRKSt9nothrow_t);
510 TLI.setUnavailable(LibFunc_ZdlPvj);
511 TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
512 TLI.setUnavailable(LibFunc_ZdlPvm);
513 TLI.setUnavailable(LibFunc_ZdlPvmSt11align_val_t);
514 TLI.setUnavailable(LibFunc_Znaj);
515 TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
516 TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
517 TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
518 TLI.setUnavailable(LibFunc_Znam);
519 TLI.setUnavailable(LibFunc_ZnamRKSt9nothrow_t);
520 TLI.setUnavailable(LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t);
521 TLI.setUnavailable(LibFunc_ZnamSt11align_val_t);
522 TLI.setUnavailable(LibFunc_ZnamSt11align_val_tRKSt9nothrow_t);
523 TLI.setUnavailable(LibFunc_Znwj);
524 TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
525 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
526 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
527 TLI.setUnavailable(LibFunc_Znwm);
528 TLI.setUnavailable(LibFunc_ZnwmRKSt9nothrow_t);
529 TLI.setUnavailable(LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t);
530 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_t);
531 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t);
532 TLI.setUnavailable(LibFunc_Znwm12__hot_cold_t);
533 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_t12__hot_cold_t);
534 TLI.setUnavailable(LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t);
535 TLI.setUnavailable(LibFunc_Znam12__hot_cold_t);
536 TLI.setUnavailable(LibFunc_ZnamSt11align_val_t12__hot_cold_t);
537 TLI.setUnavailable(LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t);
538 TLI.setUnavailable(LibFunc_size_returning_new);
539 TLI.setUnavailable(LibFunc_size_returning_new_hot_cold);
540 TLI.setUnavailable(LibFunc_size_returning_new_aligned);
541 TLI.setUnavailable(LibFunc_size_returning_new_aligned_hot_cold);
542 } else {
543 // Not MSVC, assume it's Itanium.
544 TLI.setUnavailable(LibFunc_msvc_new_int);
545 TLI.setUnavailable(LibFunc_msvc_new_int_nothrow);
546 TLI.setUnavailable(LibFunc_msvc_new_longlong);
547 TLI.setUnavailable(LibFunc_msvc_new_longlong_nothrow);
548 TLI.setUnavailable(LibFunc_msvc_delete_ptr32);
549 TLI.setUnavailable(LibFunc_msvc_delete_ptr32_nothrow);
550 TLI.setUnavailable(LibFunc_msvc_delete_ptr32_int);
551 TLI.setUnavailable(LibFunc_msvc_delete_ptr64);
552 TLI.setUnavailable(LibFunc_msvc_delete_ptr64_nothrow);
553 TLI.setUnavailable(LibFunc_msvc_delete_ptr64_longlong);
554 TLI.setUnavailable(LibFunc_msvc_new_array_int);
555 TLI.setUnavailable(LibFunc_msvc_new_array_int_nothrow);
556 TLI.setUnavailable(LibFunc_msvc_new_array_longlong);
557 TLI.setUnavailable(LibFunc_msvc_new_array_longlong_nothrow);
558 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32);
559 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_nothrow);
560 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr32_int);
561 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64);
562 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_nothrow);
563 TLI.setUnavailable(LibFunc_msvc_delete_array_ptr64_longlong);
564 }
565
566 switch (T.getOS()) {
567 case Triple::MacOSX:
568 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
569 // and their names are __exp10 and __exp10f. exp10l is not available on
570 // OS X or iOS.
571 TLI.setUnavailable(LibFunc_exp10l);
572 if (T.isMacOSXVersionLT(10, 9)) {
573 TLI.setUnavailable(LibFunc_exp10);
574 TLI.setUnavailable(LibFunc_exp10f);
575 } else {
576 TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
577 TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
578 }
579 break;
580 case Triple::IOS:
581 case Triple::TvOS:
582 case Triple::WatchOS:
583 case Triple::XROS:
584 TLI.setUnavailable(LibFunc_exp10l);
585 if (!T.isWatchOS() &&
586 (T.isOSVersionLT(7, 0) || (T.isOSVersionLT(9, 0) && T.isX86()))) {
587 TLI.setUnavailable(LibFunc_exp10);
588 TLI.setUnavailable(LibFunc_exp10f);
589 } else {
590 TLI.setAvailableWithName(LibFunc_exp10, "__exp10");
591 TLI.setAvailableWithName(LibFunc_exp10f, "__exp10f");
592 }
593 break;
594 case Triple::Linux:
595 // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
596 // buggy prior to glibc version 2.18. Until this version is widely deployed
597 // or we have a reasonable detection strategy, we cannot use exp10 reliably
598 // on Linux.
599 //
600 // Fall through to disable all of them.
601 [[fallthrough]];
602 default:
603 TLI.setUnavailable(LibFunc_exp10);
604 TLI.setUnavailable(LibFunc_exp10f);
605 TLI.setUnavailable(LibFunc_exp10l);
606 }
607
608 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
609 // Linux (GLIBC):
610 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
611 // http://svn.freebsd.org/base/head/lib/libc/string/ffsl.c
612 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
613 switch (T.getOS()) {
614 case Triple::Darwin:
615 case Triple::MacOSX:
616 case Triple::IOS:
617 case Triple::TvOS:
618 case Triple::WatchOS:
619 case Triple::XROS:
620 case Triple::FreeBSD:
621 case Triple::Linux:
622 break;
623 default:
624 TLI.setUnavailable(LibFunc_ffsl);
625 }
626
627 // ffsll is available on at least FreeBSD and Linux (GLIBC):
628 // http://svn.freebsd.org/base/head/lib/libc/string/ffsll.c
629 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
630 switch (T.getOS()) {
631 case Triple::Darwin:
632 case Triple::MacOSX:
633 case Triple::IOS:
634 case Triple::TvOS:
635 case Triple::WatchOS:
636 case Triple::XROS:
637 case Triple::FreeBSD:
638 case Triple::Linux:
639 break;
640 default:
641 TLI.setUnavailable(LibFunc_ffsll);
642 }
643
644 // The following functions are available on at least FreeBSD:
645 // http://svn.freebsd.org/base/head/lib/libc/string/fls.c
646 // http://svn.freebsd.org/base/head/lib/libc/string/flsl.c
647 // http://svn.freebsd.org/base/head/lib/libc/string/flsll.c
648 if (!T.isOSFreeBSD()) {
649 TLI.setUnavailable(LibFunc_fls);
650 TLI.setUnavailable(LibFunc_flsl);
651 TLI.setUnavailable(LibFunc_flsll);
652 }
653
654 // The following functions are only available on GNU/Linux (using glibc).
655 // Linux variants without glibc (eg: bionic, musl) may have some subset.
656 if (!T.isOSLinux() || !T.isGNUEnvironment()) {
657 TLI.setUnavailable(LibFunc_dunder_strdup);
658 TLI.setUnavailable(LibFunc_dunder_strtok_r);
659 TLI.setUnavailable(LibFunc_dunder_isoc99_scanf);
660 TLI.setUnavailable(LibFunc_dunder_isoc99_sscanf);
661 TLI.setUnavailable(LibFunc_under_IO_getc);
662 TLI.setUnavailable(LibFunc_under_IO_putc);
663 // But, Android and musl have memalign.
664 if (!T.isAndroid() && !T.isMusl())
665 TLI.setUnavailable(LibFunc_memalign);
666 TLI.setUnavailable(LibFunc_fopen64);
667 TLI.setUnavailable(LibFunc_fseeko64);
668 TLI.setUnavailable(LibFunc_fstat64);
669 TLI.setUnavailable(LibFunc_fstatvfs64);
670 TLI.setUnavailable(LibFunc_ftello64);
671 TLI.setUnavailable(LibFunc_lstat64);
672 TLI.setUnavailable(LibFunc_open64);
673 TLI.setUnavailable(LibFunc_stat64);
674 TLI.setUnavailable(LibFunc_statvfs64);
675 TLI.setUnavailable(LibFunc_tmpfile64);
676
677 // Relaxed math functions are included in math-finite.h on Linux (GLIBC).
678 // Note that math-finite.h is no longer supported by top-of-tree GLIBC,
679 // so we keep these functions around just so that they're recognized by
680 // the ConstantFolder.
681 TLI.setUnavailable(LibFunc_acos_finite);
682 TLI.setUnavailable(LibFunc_acosf_finite);
683 TLI.setUnavailable(LibFunc_acosl_finite);
684 TLI.setUnavailable(LibFunc_acosh_finite);
685 TLI.setUnavailable(LibFunc_acoshf_finite);
686 TLI.setUnavailable(LibFunc_acoshl_finite);
687 TLI.setUnavailable(LibFunc_asin_finite);
688 TLI.setUnavailable(LibFunc_asinf_finite);
689 TLI.setUnavailable(LibFunc_asinl_finite);
690 TLI.setUnavailable(LibFunc_atan2_finite);
691 TLI.setUnavailable(LibFunc_atan2f_finite);
692 TLI.setUnavailable(LibFunc_atan2l_finite);
693 TLI.setUnavailable(LibFunc_atanh_finite);
694 TLI.setUnavailable(LibFunc_atanhf_finite);
695 TLI.setUnavailable(LibFunc_atanhl_finite);
696 TLI.setUnavailable(LibFunc_cosh_finite);
697 TLI.setUnavailable(LibFunc_coshf_finite);
698 TLI.setUnavailable(LibFunc_coshl_finite);
699 TLI.setUnavailable(LibFunc_exp10_finite);
700 TLI.setUnavailable(LibFunc_exp10f_finite);
701 TLI.setUnavailable(LibFunc_exp10l_finite);
702 TLI.setUnavailable(LibFunc_exp2_finite);
703 TLI.setUnavailable(LibFunc_exp2f_finite);
704 TLI.setUnavailable(LibFunc_exp2l_finite);
705 TLI.setUnavailable(LibFunc_exp_finite);
706 TLI.setUnavailable(LibFunc_expf_finite);
707 TLI.setUnavailable(LibFunc_expl_finite);
708 TLI.setUnavailable(LibFunc_log10_finite);
709 TLI.setUnavailable(LibFunc_log10f_finite);
710 TLI.setUnavailable(LibFunc_log10l_finite);
711 TLI.setUnavailable(LibFunc_log2_finite);
712 TLI.setUnavailable(LibFunc_log2f_finite);
713 TLI.setUnavailable(LibFunc_log2l_finite);
714 TLI.setUnavailable(LibFunc_log_finite);
715 TLI.setUnavailable(LibFunc_logf_finite);
716 TLI.setUnavailable(LibFunc_logl_finite);
717 TLI.setUnavailable(LibFunc_pow_finite);
718 TLI.setUnavailable(LibFunc_powf_finite);
719 TLI.setUnavailable(LibFunc_powl_finite);
720 TLI.setUnavailable(LibFunc_sinh_finite);
721 TLI.setUnavailable(LibFunc_sinhf_finite);
722 TLI.setUnavailable(LibFunc_sinhl_finite);
723 TLI.setUnavailable(LibFunc_sqrt_finite);
724 TLI.setUnavailable(LibFunc_sqrtf_finite);
725 TLI.setUnavailable(LibFunc_sqrtl_finite);
726 }
727
728 if ((T.isOSLinux() && T.isGNUEnvironment()) ||
729 (T.isAndroid() && !T.isAndroidVersionLT(28))) {
730 // available IO unlocked variants on GNU/Linux and Android P or later
731 TLI.setAvailable(LibFunc_getc_unlocked);
732 TLI.setAvailable(LibFunc_getchar_unlocked);
733 TLI.setAvailable(LibFunc_putc_unlocked);
734 TLI.setAvailable(LibFunc_putchar_unlocked);
735 TLI.setAvailable(LibFunc_fputc_unlocked);
736 TLI.setAvailable(LibFunc_fgetc_unlocked);
737 TLI.setAvailable(LibFunc_fread_unlocked);
738 TLI.setAvailable(LibFunc_fwrite_unlocked);
739 TLI.setAvailable(LibFunc_fputs_unlocked);
740 TLI.setAvailable(LibFunc_fgets_unlocked);
741 }
742
743 if (T.isAndroid() && T.isAndroidVersionLT(21)) {
744 TLI.setUnavailable(LibFunc_stpcpy);
745 TLI.setUnavailable(LibFunc_stpncpy);
746 }
747
748 if (T.isPS()) {
749 // PS4/PS5 do have memalign.
750 TLI.setAvailable(LibFunc_memalign);
751
752 // PS4/PS5 do not have new/delete with "unsigned int" size parameter;
753 // they only have the "unsigned long" versions.
754 TLI.setUnavailable(LibFunc_ZdaPvj);
755 TLI.setUnavailable(LibFunc_ZdaPvjSt11align_val_t);
756 TLI.setUnavailable(LibFunc_ZdlPvj);
757 TLI.setUnavailable(LibFunc_ZdlPvjSt11align_val_t);
758 TLI.setUnavailable(LibFunc_Znaj);
759 TLI.setUnavailable(LibFunc_ZnajRKSt9nothrow_t);
760 TLI.setUnavailable(LibFunc_ZnajSt11align_val_t);
761 TLI.setUnavailable(LibFunc_ZnajSt11align_val_tRKSt9nothrow_t);
762 TLI.setUnavailable(LibFunc_Znwj);
763 TLI.setUnavailable(LibFunc_ZnwjRKSt9nothrow_t);
764 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_t);
765 TLI.setUnavailable(LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t);
766
767 // None of the *_chk functions.
768 TLI.setUnavailable(LibFunc_memccpy_chk);
769 TLI.setUnavailable(LibFunc_memcpy_chk);
770 TLI.setUnavailable(LibFunc_memmove_chk);
771 TLI.setUnavailable(LibFunc_mempcpy_chk);
772 TLI.setUnavailable(LibFunc_memset_chk);
773 TLI.setUnavailable(LibFunc_snprintf_chk);
774 TLI.setUnavailable(LibFunc_sprintf_chk);
775 TLI.setUnavailable(LibFunc_stpcpy_chk);
776 TLI.setUnavailable(LibFunc_stpncpy_chk);
777 TLI.setUnavailable(LibFunc_strcat_chk);
778 TLI.setUnavailable(LibFunc_strcpy_chk);
779 TLI.setUnavailable(LibFunc_strlcat_chk);
780 TLI.setUnavailable(LibFunc_strlcpy_chk);
781 TLI.setUnavailable(LibFunc_strlen_chk);
782 TLI.setUnavailable(LibFunc_strncat_chk);
783 TLI.setUnavailable(LibFunc_strncpy_chk);
784 TLI.setUnavailable(LibFunc_vsnprintf_chk);
785 TLI.setUnavailable(LibFunc_vsprintf_chk);
786
787 // Various Posix system functions.
788 TLI.setUnavailable(LibFunc_access);
789 TLI.setUnavailable(LibFunc_chmod);
790 TLI.setUnavailable(LibFunc_chown);
791 TLI.setUnavailable(LibFunc_closedir);
792 TLI.setUnavailable(LibFunc_ctermid);
793 TLI.setUnavailable(LibFunc_execl);
794 TLI.setUnavailable(LibFunc_execle);
795 TLI.setUnavailable(LibFunc_execlp);
796 TLI.setUnavailable(LibFunc_execv);
797 TLI.setUnavailable(LibFunc_execvP);
798 TLI.setUnavailable(LibFunc_execve);
799 TLI.setUnavailable(LibFunc_execvp);
800 TLI.setUnavailable(LibFunc_execvpe);
801 TLI.setUnavailable(LibFunc_fork);
802 TLI.setUnavailable(LibFunc_fstat);
803 TLI.setUnavailable(LibFunc_fstatvfs);
804 TLI.setUnavailable(LibFunc_getenv);
805 TLI.setUnavailable(LibFunc_getitimer);
806 TLI.setUnavailable(LibFunc_getlogin_r);
807 TLI.setUnavailable(LibFunc_getpwnam);
808 TLI.setUnavailable(LibFunc_gettimeofday);
809 TLI.setUnavailable(LibFunc_lchown);
810 TLI.setUnavailable(LibFunc_lstat);
811 TLI.setUnavailable(LibFunc_mkdir);
812 TLI.setUnavailable(LibFunc_open);
813 TLI.setUnavailable(LibFunc_opendir);
814 TLI.setUnavailable(LibFunc_pclose);
815 TLI.setUnavailable(LibFunc_popen);
816 TLI.setUnavailable(LibFunc_pread);
817 TLI.setUnavailable(LibFunc_pvalloc);
818 TLI.setUnavailable(LibFunc_pwrite);
819 TLI.setUnavailable(LibFunc_read);
820 TLI.setUnavailable(LibFunc_readlink);
821 TLI.setUnavailable(LibFunc_realpath);
822 TLI.setUnavailable(LibFunc_rename);
823 TLI.setUnavailable(LibFunc_rmdir);
824 TLI.setUnavailable(LibFunc_setitimer);
825 TLI.setUnavailable(LibFunc_stat);
826 TLI.setUnavailable(LibFunc_statvfs);
827 TLI.setUnavailable(LibFunc_system);
828 TLI.setUnavailable(LibFunc_times);
829 TLI.setUnavailable(LibFunc_tmpfile);
830 TLI.setUnavailable(LibFunc_unlink);
831 TLI.setUnavailable(LibFunc_uname);
832 TLI.setUnavailable(LibFunc_unsetenv);
833 TLI.setUnavailable(LibFunc_utime);
834 TLI.setUnavailable(LibFunc_utimes);
835 TLI.setUnavailable(LibFunc_valloc);
836 TLI.setUnavailable(LibFunc_write);
837
838 // Miscellaneous other functions not provided.
839 TLI.setUnavailable(LibFunc_atomic_load);
840 TLI.setUnavailable(LibFunc_atomic_store);
841 TLI.setUnavailable(LibFunc___kmpc_alloc_shared);
842 TLI.setUnavailable(LibFunc___kmpc_free_shared);
843 TLI.setUnavailable(LibFunc_dunder_strndup);
844 TLI.setUnavailable(LibFunc_bcmp);
845 TLI.setUnavailable(LibFunc_bcopy);
846 TLI.setUnavailable(LibFunc_bzero);
847 TLI.setUnavailable(LibFunc_cabs);
848 TLI.setUnavailable(LibFunc_cabsf);
849 TLI.setUnavailable(LibFunc_cabsl);
850 TLI.setUnavailable(LibFunc_ffs);
851 TLI.setUnavailable(LibFunc_flockfile);
852 TLI.setUnavailable(LibFunc_fseeko);
853 TLI.setUnavailable(LibFunc_ftello);
854 TLI.setUnavailable(LibFunc_ftrylockfile);
855 TLI.setUnavailable(LibFunc_funlockfile);
856 TLI.setUnavailable(LibFunc_htonl);
857 TLI.setUnavailable(LibFunc_htons);
858 TLI.setUnavailable(LibFunc_isascii);
859 TLI.setUnavailable(LibFunc_memccpy);
860 TLI.setUnavailable(LibFunc_mempcpy);
861 TLI.setUnavailable(LibFunc_memrchr);
862 TLI.setUnavailable(LibFunc_ntohl);
863 TLI.setUnavailable(LibFunc_ntohs);
864 TLI.setUnavailable(LibFunc_reallocarray);
865 TLI.setUnavailable(LibFunc_reallocf);
866 TLI.setUnavailable(LibFunc_roundeven);
867 TLI.setUnavailable(LibFunc_roundevenf);
868 TLI.setUnavailable(LibFunc_roundevenl);
869 TLI.setUnavailable(LibFunc_stpcpy);
870 TLI.setUnavailable(LibFunc_stpncpy);
871 TLI.setUnavailable(LibFunc_strlcat);
872 TLI.setUnavailable(LibFunc_strlcpy);
873 TLI.setUnavailable(LibFunc_strndup);
874 TLI.setUnavailable(LibFunc_strnlen);
875 TLI.setUnavailable(LibFunc_toascii);
876 }
877
878 if (T.isOSFreeBSD()) {
879 TLI.setAvailable(LibFunc_dunder_strtok_r);
880 TLI.setAvailable(LibFunc_memalign);
881 TLI.setAvailable(LibFunc_fputc_unlocked);
882 TLI.setAvailable(LibFunc_fputs_unlocked);
883 TLI.setAvailable(LibFunc_fread_unlocked);
884 TLI.setAvailable(LibFunc_fwrite_unlocked);
885 TLI.setAvailable(LibFunc_getc_unlocked);
886 TLI.setAvailable(LibFunc_getchar_unlocked);
887 TLI.setAvailable(LibFunc_putc_unlocked);
888 TLI.setAvailable(LibFunc_putchar_unlocked);
889
890 TLI.setUnavailable(LibFunc___kmpc_alloc_shared);
891 TLI.setUnavailable(LibFunc___kmpc_free_shared);
892 TLI.setUnavailable(LibFunc_dunder_strndup);
893 TLI.setUnavailable(LibFunc_memccpy_chk);
894 TLI.setUnavailable(LibFunc_strlen_chk);
895 TLI.setUnavailable(LibFunc_fmaximum_num);
896 TLI.setUnavailable(LibFunc_fmaximum_numf);
897 TLI.setUnavailable(LibFunc_fmaximum_numl);
898 TLI.setUnavailable(LibFunc_fminimum_num);
899 TLI.setUnavailable(LibFunc_fminimum_numf);
900 TLI.setUnavailable(LibFunc_fminimum_numl);
901 TLI.setUnavailable(LibFunc_roundeven);
902 TLI.setUnavailable(LibFunc_roundevenf);
903 TLI.setUnavailable(LibFunc_roundevenl);
904 }
905
906 // As currently implemented in clang, NVPTX code has no standard library to
907 // speak of. Headers provide a standard-ish library implementation, but many
908 // of the signatures are wrong -- for example, many libm functions are not
909 // extern "C".
910 //
911 // libdevice, an IR library provided by nvidia, is linked in by the front-end,
912 // but only used functions are provided to llvm. Moreover, most of the
913 // functions in libdevice don't map precisely to standard library functions.
914 //
915 // FIXME: Having no standard library prevents e.g. many fastmath
916 // optimizations, so this situation should be fixed.
917 if (T.isNVPTX()) {
919 TLI.setAvailable(LibFunc_nvvm_reflect);
920 TLI.setAvailable(llvm::LibFunc_malloc);
921 TLI.setAvailable(llvm::LibFunc_free);
922
923 // TODO: We could enable the following two according to [0] but we haven't
924 // done an evaluation wrt. the performance implications.
925 // [0]
926 // https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#dynamic-global-memory-allocation-and-operations
927 //
928 // TLI.setAvailable(llvm::LibFunc_memcpy);
929 // TLI.setAvailable(llvm::LibFunc_memset);
930
931 TLI.setAvailable(llvm::LibFunc___kmpc_alloc_shared);
932 TLI.setAvailable(llvm::LibFunc___kmpc_free_shared);
933 } else {
934 TLI.setUnavailable(LibFunc_nvvm_reflect);
935 }
936
937 // These vec_malloc/free routines are only available on AIX.
938 if (!T.isOSAIX()) {
939 TLI.setUnavailable(LibFunc_vec_calloc);
940 TLI.setUnavailable(LibFunc_vec_malloc);
941 TLI.setUnavailable(LibFunc_vec_realloc);
942 TLI.setUnavailable(LibFunc_vec_free);
943 }
944
945 if (T.isOSAIX())
946 TLI.setUnavailable(LibFunc_memrchr);
947
949}
950
951/// Initialize the set of available library functions based on the specified
952/// target triple. This should be carefully written so that a missing target
953/// triple gets a sane set of defaults.
954static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
955 ArrayRef<StringLiteral> StandardNames) {
956 initializeBase(TLI, T);
957 initializeLibCalls(TLI, T, StandardNames);
958}
959
961 // Default to everything being available.
962 memset(AvailableArray, -1, sizeof(AvailableArray));
963
964 initialize(*this, T, StandardNames);
965}
966
968 : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
969 ShouldExtI32Return(TLI.ShouldExtI32Return),
970 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
971 ShouldSignExtI32Return(TLI.ShouldSignExtI32Return),
972 SizeOfInt(TLI.SizeOfInt) {
973 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
974 VectorDescs = TLI.VectorDescs;
975 ScalarDescs = TLI.ScalarDescs;
976}
977
979 : CustomNames(std::move(TLI.CustomNames)),
980 ShouldExtI32Param(TLI.ShouldExtI32Param),
981 ShouldExtI32Return(TLI.ShouldExtI32Return),
982 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
983 ShouldSignExtI32Return(TLI.ShouldSignExtI32Return),
984 SizeOfInt(TLI.SizeOfInt) {
985 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
986 AvailableArray);
987 VectorDescs = TLI.VectorDescs;
988 ScalarDescs = TLI.ScalarDescs;
989}
990
992 CustomNames = TLI.CustomNames;
993 ShouldExtI32Param = TLI.ShouldExtI32Param;
994 ShouldExtI32Return = TLI.ShouldExtI32Return;
995 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
996 ShouldSignExtI32Return = TLI.ShouldSignExtI32Return;
997 SizeOfInt = TLI.SizeOfInt;
998 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
999 return *this;
1000}
1001
1003 CustomNames = std::move(TLI.CustomNames);
1004 ShouldExtI32Param = TLI.ShouldExtI32Param;
1005 ShouldExtI32Return = TLI.ShouldExtI32Return;
1006 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
1007 ShouldSignExtI32Return = TLI.ShouldSignExtI32Return;
1008 SizeOfInt = TLI.SizeOfInt;
1009 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
1010 AvailableArray);
1011 return *this;
1012}
1013
1015 // Filter out empty names and names containing null bytes, those can't be in
1016 // our table.
1017 if (funcName.empty() || funcName.contains('\0'))
1018 return StringRef();
1019
1020 // Check for \01 prefix that is used to mangle __asm declarations and
1021 // strip it if present.
1022 return GlobalValue::dropLLVMManglingEscape(funcName);
1023}
1024
1028 unsigned Idx = 0;
1030 for (const auto &Func : StandardNames)
1031 Indices[Func] = static_cast<LibFunc>(Idx++);
1032 return Indices;
1033}
1034
1036 funcName = sanitizeFunctionName(funcName);
1037 if (funcName.empty())
1038 return false;
1039
1040 static const DenseMap<StringRef, LibFunc> Indices =
1041 buildIndexMap(StandardNames);
1042
1043 if (auto Loc = Indices.find(funcName); Loc != Indices.end()) {
1044 F = Loc->second;
1045 return true;
1046 }
1047 return false;
1048}
1049
1050// Return true if ArgTy matches Ty.
1051
1052static bool matchType(FuncArgTypeID ArgTy, const Type *Ty, unsigned IntBits,
1053 unsigned SizeTBits) {
1054 switch (ArgTy) {
1055 case Void:
1056 return Ty->isVoidTy();
1057 case Bool:
1058 return Ty->isIntegerTy(8);
1059 case Int16:
1060 return Ty->isIntegerTy(16);
1061 case Int32:
1062 return Ty->isIntegerTy(32);
1063 case Int:
1064 return Ty->isIntegerTy(IntBits);
1065 case IntPlus:
1066 return Ty->isIntegerTy() && Ty->getPrimitiveSizeInBits() >= IntBits;
1067 case IntX:
1068 return Ty->isIntegerTy();
1069 case Long:
1070 // TODO: Figure out and use long size.
1071 return Ty->isIntegerTy() && Ty->getPrimitiveSizeInBits() >= IntBits;
1072 case Int64:
1073 return Ty->isIntegerTy(64);
1074 case LLong:
1075 return Ty->isIntegerTy(64);
1076 case SizeT:
1077 case SSizeT:
1078 return Ty->isIntegerTy(SizeTBits);
1079 case Flt:
1080 return Ty->isFloatTy();
1081 case Dbl:
1082 return Ty->isDoubleTy();
1083 // TODO: Tighten this up.
1084 case LDbl:
1085 return Ty->isFloatingPointTy();
1086 case Floating:
1087 return Ty->isFloatingPointTy();
1088 case Ptr:
1089 return Ty->isPointerTy();
1090 case Struct:
1091 return Ty->isStructTy();
1092 default:
1093 break;
1094 }
1095
1096 llvm_unreachable("Invalid type");
1097}
1098
1100 const Module &M,
1101 int SizeTSizeBits) {
1102 switch (F) {
1103 case LibFunc_size_returning_new: {
1104 if (FTy.getNumParams() != 1 ||
1105 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits)) {
1106 return false;
1107 }
1108 } break;
1109 case LibFunc_size_returning_new_hot_cold: {
1110 if (FTy.getNumParams() != 2 ||
1111 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1112 !FTy.getParamType(1)->isIntegerTy(8)) {
1113 return false;
1114 }
1115 } break;
1116 case LibFunc_size_returning_new_aligned: {
1117 if (FTy.getNumParams() != 2 ||
1118 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1119 !FTy.getParamType(1)->isIntegerTy(SizeTSizeBits)) {
1120 return false;
1121 }
1122 } break;
1123 case LibFunc_size_returning_new_aligned_hot_cold:
1124 if (FTy.getNumParams() != 3 ||
1125 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1126 !FTy.getParamType(1)->isIntegerTy(SizeTSizeBits) ||
1127 !FTy.getParamType(2)->isIntegerTy(8)) {
1128 return false;
1129 }
1130 break;
1131 default:
1132 return false;
1133 }
1134
1135 auto &Context = M.getContext();
1137 StructType *SizedPtrTy = StructType::get(
1138 Context, {PtrTy, Type::getIntNTy(Context, SizeTSizeBits)});
1139 return FTy.getReturnType() == SizedPtrTy;
1140}
1141
1142bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
1143 LibFunc F,
1144 const Module &M) const {
1145 unsigned NumParams = FTy.getNumParams();
1146
1147 switch (F) {
1148 // Special handling for <complex.h> functions:
1149 case LibFunc_cabs:
1150 case LibFunc_cabsf:
1151 case LibFunc_cabsl: {
1152 Type *RetTy = FTy.getReturnType();
1153 if (!RetTy->isFloatingPointTy() || NumParams == 0)
1154 return false;
1155
1156 Type *ParamTy = FTy.getParamType(0);
1157 // NOTE: These prototypes are target specific and currently support
1158 // "complex" passed as an array or discrete real & imaginary parameters.
1159 // Add other calling conventions to enable libcall optimizations.
1160 if (NumParams == 1)
1161 return (ParamTy->isArrayTy() && ParamTy->getArrayNumElements() == 2 &&
1162 ParamTy->getArrayElementType() == RetTy);
1163 else if (NumParams == 2)
1164 return ParamTy == RetTy && FTy.getParamType(1) == RetTy;
1165
1166 return false;
1167 }
1168 // Special handling for the sincospi functions that return either
1169 // a struct or vector:
1170 case LibFunc_sincospi_stret:
1171 case LibFunc_sincospif_stret: {
1172 if (NumParams != 1)
1173 return false;
1174
1175 Type *RetTy = FTy.getReturnType();
1176 Type *ParamTy = FTy.getParamType(0);
1177 if (auto *Ty = dyn_cast<StructType>(RetTy)) {
1178 if (Ty->getNumElements() != 2)
1179 return false;
1180 return (Ty->getElementType(0) == ParamTy &&
1181 Ty->getElementType(1) == ParamTy);
1182 }
1183
1184 if (auto *Ty = dyn_cast<FixedVectorType>(RetTy)) {
1185 if (Ty->getNumElements() != 2)
1186 return false;
1187 return Ty->getElementType() == ParamTy;
1188 }
1189
1190 return false;
1191 }
1192 // Special handling of __size_returning_new functions that return a struct
1193 // of type {void*, size_t}.
1194 case LibFunc_size_returning_new:
1195 case LibFunc_size_returning_new_hot_cold:
1196 case LibFunc_size_returning_new_aligned:
1197 case LibFunc_size_returning_new_aligned_hot_cold:
1199 default:
1200 break;
1201 }
1202
1203 unsigned IntBits = getIntSize();
1204 unsigned SizeTBits = getSizeTSize(M);
1205 unsigned Idx = 0;
1206
1207 // Iterate over the type ids in the function prototype, matching each
1208 // against the function's type FTy, starting with its return type.
1209 // Return true if both match in number and kind, inclduing the ellipsis.
1210 Type *Ty = FTy.getReturnType(), *LastTy = Ty;
1211 const auto &ProtoTypes = Signatures[F];
1212 for (auto TyID : ProtoTypes) {
1213 if (Idx && TyID == Void)
1214 // Except in the first position where it designates the function's
1215 // return type Void ends the argument list.
1216 break;
1217
1218 if (TyID == Ellip) {
1219 // The ellipsis ends the protoype list but is not a part of FTy's
1220 // argument list. Except when it's last it must be followed by
1221 // Void.
1222 assert(Idx == ProtoTypes.size() - 1 || ProtoTypes[Idx + 1] == Void);
1223 return FTy.isFunctionVarArg();
1224 }
1225
1226 if (TyID == Same) {
1227 assert(Idx != 0 && "Type ID 'Same' must not be first!");
1228 if (Ty != LastTy)
1229 return false;
1230 } else {
1231 if (!Ty || !matchType(TyID, Ty, IntBits, SizeTBits))
1232 return false;
1233 LastTy = Ty;
1234 }
1235
1236 if (Idx == NumParams) {
1237 // There's at least one and at most two more type ids than there are
1238 // arguments in FTy's argument list.
1239 Ty = nullptr;
1240 ++Idx;
1241 continue;
1242 }
1243
1244 Ty = FTy.getParamType(Idx++);
1245 }
1246
1247 // Return success only if all entries on both lists have been processed
1248 // and the function is not a variadic one.
1249 return Idx == NumParams + 1 && !FTy.isFunctionVarArg();
1250}
1251
1253 LibFunc &F) const {
1254 // Intrinsics don't overlap w/libcalls; if our module has a large number of
1255 // intrinsics, this ends up being an interesting compile time win since we
1256 // avoid string normalization and comparison.
1257 if (FDecl.isIntrinsic()) return false;
1258
1259 const Module *M = FDecl.getParent();
1260 assert(M && "Expecting FDecl to be connected to a Module.");
1261
1262 if (FDecl.LibFuncCache == Function::UnknownLibFunc)
1263 if (!getLibFunc(FDecl.getName(), FDecl.LibFuncCache))
1264 FDecl.LibFuncCache = NotLibFunc;
1265
1266 if (FDecl.LibFuncCache == NotLibFunc)
1267 return false;
1268
1269 F = FDecl.LibFuncCache;
1270 return isValidProtoForLibFunc(*FDecl.getFunctionType(), F, *M);
1271}
1272
1273bool TargetLibraryInfoImpl::getLibFunc(unsigned int Opcode, Type *Ty,
1274 LibFunc &F) const {
1275 // Must be a frem instruction with float or double arguments.
1276 if (Opcode != Instruction::FRem || (!Ty->isDoubleTy() && !Ty->isFloatTy()))
1277 return false;
1278
1279 F = Ty->isDoubleTy() ? LibFunc_fmod : LibFunc_fmodf;
1280 return true;
1281}
1282
1284 memset(AvailableArray, 0, sizeof(AvailableArray));
1285}
1286
1287static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS) {
1288 return LHS.getScalarFnName() < RHS.getScalarFnName();
1289}
1290
1291static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS) {
1292 return LHS.getVectorFnName() < RHS.getVectorFnName();
1293}
1294
1295static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S) {
1296 return LHS.getScalarFnName() < S;
1297}
1298
1300 llvm::append_range(VectorDescs, Fns);
1301 llvm::sort(VectorDescs, compareByScalarFnName);
1302
1303 llvm::append_range(ScalarDescs, Fns);
1304 llvm::sort(ScalarDescs, compareByVectorFnName);
1305}
1306
1308#define TLI_DEFINE_ACCELERATE_VECFUNCS
1309#include "llvm/Analysis/VecFuncs.def"
1310#undef TLI_DEFINE_ACCELERATE_VECFUNCS
1311};
1312
1314#define TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
1315#include "llvm/Analysis/VecFuncs.def"
1316#undef TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
1317};
1318
1320#define TLI_DEFINE_LIBMVEC_X86_VECFUNCS
1321#include "llvm/Analysis/VecFuncs.def"
1322#undef TLI_DEFINE_LIBMVEC_X86_VECFUNCS
1323};
1324
1326#define TLI_DEFINE_LIBMVEC_AARCH64_VECFUNCS
1327#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX, CC) \
1328 {SCAL, VEC, VF, MASK, VABI_PREFIX, CC},
1329#include "llvm/Analysis/VecFuncs.def"
1330#undef TLI_DEFINE_LIBMVEC_AARCH64_VECFUNCS
1331};
1332
1333static const VecDesc VecFuncs_MASSV[] = {
1334#define TLI_DEFINE_MASSV_VECFUNCS
1335#include "llvm/Analysis/VecFuncs.def"
1336#undef TLI_DEFINE_MASSV_VECFUNCS
1337};
1338
1339static const VecDesc VecFuncs_SVML[] = {
1340#define TLI_DEFINE_SVML_VECFUNCS
1341#include "llvm/Analysis/VecFuncs.def"
1342#undef TLI_DEFINE_SVML_VECFUNCS
1343};
1344
1346#define TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
1347#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, VABI_PREFIX) \
1348 {SCAL, VEC, VF, /* MASK = */ false, VABI_PREFIX, /* CC = */ std::nullopt},
1349#include "llvm/Analysis/VecFuncs.def"
1350#undef TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
1351};
1353#define TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
1354#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, VABI_PREFIX) \
1355 {SCAL, VEC, VF, /* MASK = */ false, VABI_PREFIX, /* CC = */ std::nullopt},
1356#include "llvm/Analysis/VecFuncs.def"
1357#undef TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
1358};
1360#define TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS
1361#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1362 {SCAL, VEC, VF, MASK, VABI_PREFIX, /* CC = */ std::nullopt},
1363#include "llvm/Analysis/VecFuncs.def"
1364#undef TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS
1365};
1366
1368#define TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS_RISCV
1369#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1370 {SCAL, VEC, VF, MASK, VABI_PREFIX, /* CC = */ std::nullopt},
1371#include "llvm/Analysis/VecFuncs.def"
1372#undef TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS_RISCV
1373};
1374
1375static const VecDesc VecFuncs_ArmPL[] = {
1376#define TLI_DEFINE_ARMPL_VECFUNCS
1377#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX, CC) \
1378 {SCAL, VEC, VF, MASK, VABI_PREFIX, CC},
1379#include "llvm/Analysis/VecFuncs.def"
1380#undef TLI_DEFINE_ARMPL_VECFUNCS
1381};
1382
1384#define TLI_DEFINE_AMDLIBM_VECFUNCS
1385#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1386 {SCAL, VEC, VF, MASK, VABI_PREFIX, /* CC = */ std::nullopt},
1387#include "llvm/Analysis/VecFuncs.def"
1388#undef TLI_DEFINE_AMDLIBM_VECFUNCS
1389};
1390
1392 enum VectorLibrary VecLib, const llvm::Triple &TargetTriple) {
1393 switch (VecLib) {
1394 case Accelerate: {
1396 break;
1397 }
1398 case DarwinLibSystemM: {
1400 break;
1401 }
1402 case LIBMVEC: {
1403 switch (TargetTriple.getArch()) {
1404 default:
1405 break;
1406 case llvm::Triple::x86:
1409 break;
1413 break;
1414 }
1415 break;
1416 }
1417 case MASSV: {
1419 break;
1420 }
1421 case SVML: {
1423 break;
1424 }
1425 case SLEEFGNUABI: {
1426 switch (TargetTriple.getArch()) {
1427 default:
1428 break;
1434 break;
1437 break;
1438 }
1439 break;
1440 }
1441 case ArmPL: {
1442 switch (TargetTriple.getArch()) {
1443 default:
1444 break;
1448 break;
1449 }
1450 break;
1451 }
1452 case AMDLIBM: {
1454 break;
1455 }
1456 case NoLibrary:
1457 break;
1458 }
1459}
1460
1462 funcName = sanitizeFunctionName(funcName);
1463 if (funcName.empty())
1464 return false;
1465
1466 std::vector<VecDesc>::const_iterator I =
1467 llvm::lower_bound(VectorDescs, funcName, compareWithScalarFnName);
1468 return I != VectorDescs.end() && StringRef(I->getScalarFnName()) == funcName;
1469}
1470
1472 const ElementCount &VF,
1473 bool Masked) const {
1474 const VecDesc *VD = getVectorMappingInfo(F, VF, Masked);
1475 if (VD)
1476 return VD->getVectorFnName();
1477 return StringRef();
1478}
1479
1480const VecDesc *
1482 bool Masked) const {
1484 if (F.empty())
1485 return nullptr;
1486 std::vector<VecDesc>::const_iterator I =
1488 while (I != VectorDescs.end() && StringRef(I->getScalarFnName()) == F) {
1489 if ((I->getVectorizationFactor() == VF) && (I->isMasked() == Masked))
1490 return &(*I);
1491 ++I;
1492 }
1493 return nullptr;
1494}
1495
1498 if (!BaselineInfoImpl)
1499 BaselineInfoImpl = TargetLibraryInfoImpl(F.getParent()->getTargetTriple());
1500 return TargetLibraryInfo(*BaselineInfoImpl, &F);
1501}
1502
1504 if (auto *ShortWChar = cast_or_null<ConstantAsMetadata>(
1505 M.getModuleFlag("wchar_size")))
1506 return cast<ConstantInt>(ShortWChar->getValue())->getZExtValue();
1507 return 0;
1508}
1509
1511 // There is really no guarantee that sizeof(size_t) is equal to the index
1512 // size of the default address space. If that isn't true then it should be
1513 // possible to derive the SizeTTy from the target triple here instead and do
1514 // an early return.
1515
1516 // Hard coding address space zero may seem unfortunate, but a number of
1517 // configurations of common targets (i386, x86-64 x32, aarch64 x32, possibly
1518 // others) have larger-than-size_t index sizes on non-default address spaces,
1519 // making this the best default.
1520 return M.getDataLayout().getIndexSizeInBits(/*AddressSpace=*/0);
1521}
1522
1525
1528
1530 const TargetLibraryInfoImpl &TLIImpl)
1531 : ImmutablePass(ID), TLA(TLIImpl) {}
1532
1534 const TargetLibraryInfo &TLIOther)
1535 : TargetLibraryInfoWrapperPass(*TLIOther.Impl) {}
1536
1537AnalysisKey TargetLibraryAnalysis::Key;
1538
1539// Register the basic pass.
1541 "Target Library Information", false, true)
1543
1544void TargetLibraryInfoWrapperPass::anchor() {}
1545
1547 ElementCount &FixedVF,
1548 ElementCount &ScalableVF) const {
1549 ScalarF = sanitizeFunctionName(ScalarF);
1550 // Use '0' here because a type of the form <vscale x 1 x ElTy> is not the
1551 // same as a scalar.
1552 ScalableVF = ElementCount::getScalable(0);
1553 FixedVF = ElementCount::getFixed(1);
1554 if (ScalarF.empty())
1555 return;
1556
1557 std::vector<VecDesc>::const_iterator I =
1558 llvm::lower_bound(VectorDescs, ScalarF, compareWithScalarFnName);
1559 while (I != VectorDescs.end() && StringRef(I->getScalarFnName()) == ScalarF) {
1560 ElementCount *VF =
1561 I->getVectorizationFactor().isScalable() ? &ScalableVF : &FixedVF;
1562 if (ElementCount::isKnownGT(I->getVectorizationFactor(), *VF))
1563 *VF = I->getVectorizationFactor();
1564 ++I;
1565 }
1566}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:687
This file contains the declarations for the subclasses of Constant, which represent the different fla...
return RetTy
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:56
This file defines the SmallString class.
static bool hasSinCosPiStret(const Triple &T)
static bool isCallingConvCCompatible(CallingConv::ID CC, const Triple &TT, FunctionType *FuncTy)
static StringRef sanitizeFunctionName(StringRef funcName)
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames)
Initialize the set of available library functions based on the specified target triple.
static const VecDesc VecFuncs_MASSV[]
static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames)
Initialize the set of available library functions based on the specified target triple.
static bool matchType(FuncArgTypeID ArgTy, const Type *Ty, unsigned IntBits, unsigned SizeTBits)
static bool hasBcmp(const Triple &TT)
static const VecDesc VecFuncs_SLEEFGNUABI_VF2[]
static void initializeBase(TargetLibraryInfoImpl &TLI, const Triple &T)
static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS)
static const VecDesc VecFuncs_LIBMVEC_AARCH64[]
static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS)
static const VecDesc VecFuncs_SLEEFGNUABI_VF4[]
static const FuncProtoTy Signatures[]
static const VecDesc VecFuncs_ArmPL[]
const VecDesc VecFuncs_AMDLIBM[]
static bool isValidProtoForSizeReturningNew(const FunctionType &FTy, LibFunc F, const Module &M, int SizeTSizeBits)
static const VecDesc VecFuncs_LIBMVEC_X86[]
FuncArgTypeID
@ IntPlus
@ Floating
@ Struct
@ SSizeT
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::DarwinLibSystemM, "Darwin_libsystem_m", "Darwin libsystem_m"), clEnumValN(TargetLibraryInfoImpl::LIBMVEC, "LIBMVEC", "GLIBC Vector Math library"), clEnumValN(TargetLibraryInfoImpl::MASSV, "MASSV", "IBM MASS vector library"), clEnumValN(TargetLibraryInfoImpl::SVML, "SVML", "Intel SVML library"), clEnumValN(TargetLibraryInfoImpl::SLEEFGNUABI, "sleefgnuabi", "SIMD Library for Evaluating Elementary Functions"), clEnumValN(TargetLibraryInfoImpl::ArmPL, "ArmPL", "Arm Performance Libraries"), clEnumValN(TargetLibraryInfoImpl::AMDLIBM, "AMDLIBM", "AMD vector math library")))
static const VecDesc VecFuncs_DarwinLibSystemM[]
static const VecDesc VecFuncs_SVML[]
std::array< FuncArgTypeID, 8 > FuncProtoTy
static const VecDesc VecFuncs_SLEEFGNUABI_VFScalable[]
static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S)
static const VecDesc VecFuncs_Accelerate[]
static const VecDesc VecFuncs_SLEEFGNUABI_VFScalableRISCV[]
static DenseMap< StringRef, LibFunc > buildIndexMap(ArrayRef< StringLiteral > StandardNames)
Value * RHS
Value * LHS
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
CallingConv::ID getCallingConv() const
Definition: InstrTypes.h:1406
FunctionType * getFunctionType() const
Definition: InstrTypes.h:1205
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
iterator end()
Definition: DenseMap.h:87
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition: DenseMap.h:124
static constexpr ElementCount getScalable(ScalarTy MinVal)
Definition: TypeSize.h:315
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition: TypeSize.h:312
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition: Function.h:209
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition: Function.h:249
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
Definition: GlobalValue.h:569
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:663
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition: Pass.h:285
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
Definition: Instruction.cpp:78
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Definition: Module.h:281
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Definition: StringRef.h:862
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:151
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition: StringRef.h:434
Class to represent struct types.
Definition: DerivedTypes.h:218
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition: Type.cpp:414
LLVM_ABI TargetLibraryInfo run(const Function &F, FunctionAnalysisManager &)
Implementation of the target library information.
void setShouldExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext or zeroext attributes if they...
void setShouldExtI32Return(bool Val)
Set to true iff i32 results from library functions should have signext or zeroext attributes if they ...
LLVM_ABI unsigned getWCharSize(const Module &M) const
Returns the size of the wchar_t type in bytes or 0 if the size is unknown.
LLVM_ABI bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
LLVM_ABI void getWidestVF(StringRef ScalarF, ElementCount &FixedVF, ElementCount &Scalable) const
Returns the largest vectorization factor used in the list of vector functions.
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
Return true if the function F has a vector equivalent with vectorization factor VF.
void setShouldSignExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext attribute if they correspond ...
void setAvailableWithName(LibFunc F, StringRef Name)
Forces a function to be marked as available and provide an alternate name that must be used.
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
LLVM_ABI void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib, const llvm::Triple &TargetTriple)
Calls addVectorizableFunctions with a known preset of functions for the given vector library.
void setIntSize(unsigned Bits)
Initialize the C-level size of an integer.
LLVM_ABI unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
LLVM_ABI void addVectorizableFunctions(ArrayRef< VecDesc > Fns)
Add a set of scalar -> vector mappings, queryable via getVectorizedFunction and getScalarizedFunction...
LLVM_ABI const VecDesc * getVectorMappingInfo(StringRef F, const ElementCount &VF, bool Masked) const
Return a pointer to a VecDesc object holding all info for scalar to vector mappings in TLI for the eq...
static LLVM_ABI bool isCallingConvCCompatible(CallBase *CI)
Returns true if call site / callee has cdecl-compatible calling conventions.
void setShouldSignExtI32Return(bool Val)
Set to true iff i32 results from library functions should have signext attribute if they correspond t...
LLVM_ABI TargetLibraryInfoImpl & operator=(const TargetLibraryInfoImpl &TLI)
LLVM_ABI void disableAllFunctions()
Disables all builtins.
VectorLibrary
List of known vector-functions libraries.
void setUnavailable(LibFunc F)
Forces a function to be marked as unavailable.
LLVM_ABI StringRef getVectorizedFunction(StringRef F, const ElementCount &VF, bool Masked) const
Return the name of the equivalent of F, vectorized with factor VF.
void setAvailable(LibFunc F)
Forces a function to be marked as available.
TargetLibraryInfoWrapperPass()
The default constructor should not be used and is only for pass manager initialization purposes.
Provides information about what library functions are available for the current target.
static void initExtensionsForTriple(bool &ShouldExtI32Param, bool &ShouldExtI32Return, bool &ShouldSignExtI32Param, bool &ShouldSignExtI32Return, const Triple &T)
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:47
@ Emscripten
Definition: Triple.h:243
@ aarch64_be
Definition: Triple.h:55
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition: Triple.h:408
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isArrayTy() const
True if this is an instance of ArrayType.
Definition: Type.h:264
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:267
Type * getArrayElementType() const
Definition: Type.h:408
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:153
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
bool isStructTy() const
True if this is an instance of StructType.
Definition: Type.h:261
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition: Type.h:156
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition: Type.h:184
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:240
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:139
LLVM_ABI uint64_t getArrayNumElements() const
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:322
Provides info so a possible vectorization of a function can be computed.
LLVM_ABI std::string getVectorFunctionABIVariantString() const
Returns a vector function ABI variant string on the form: ZGV<isa><mask><vlen><vparams><scalarname>(<...
StringRef getVectorFnName() const
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:30
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:226
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:692
StringRef str() const
Return a StringRef for the vector contents.
Definition: raw_ostream.h:721
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
Definition: CallingConv.h:107
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
Definition: CallingConv.h:111
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
Definition: CallingConv.h:114
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:712
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2155
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1669
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition: STLExtras.h:2013
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1886
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:856
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:29