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