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