blob: ecb38198551d7890ceccab2e40fb68aae4b89f19 [file] [log] [blame]
Chris Lattner0e125bb2011-02-18 21:50:34 +00001//===-- 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/Target/TargetLibraryInfo.h"
15#include "llvm/ADT/Triple.h"
16using namespace llvm;
17
18// Register the default implementation.
19INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20 "Target Library Information", false, true)
21char TargetLibraryInfo::ID = 0;
22
David Blaikiea379b1812011-12-20 02:50:00 +000023void TargetLibraryInfo::anchor() { }
24
Eli Friedman489c0ff2011-11-17 01:27:36 +000025const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
26 {
Meador Ingeb904e6e2013-03-05 21:47:40 +000027 "_IO_getc",
28 "_IO_putc",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000029 "_ZdaPv",
Richard Smith70523c72013-07-21 23:11:42 +000030 "_ZdaPvRKSt9nothrow_t",
Richard Smith1ed42292014-10-03 20:17:06 +000031 "_ZdaPvj",
32 "_ZdaPvm",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000033 "_ZdlPv",
Richard Smith70523c72013-07-21 23:11:42 +000034 "_ZdlPvRKSt9nothrow_t",
Richard Smith1ed42292014-10-03 20:17:06 +000035 "_ZdlPvj",
36 "_ZdlPvm",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000037 "_Znaj",
38 "_ZnajRKSt9nothrow_t",
39 "_Znam",
40 "_ZnamRKSt9nothrow_t",
41 "_Znwj",
42 "_ZnwjRKSt9nothrow_t",
43 "_Znwm",
44 "_ZnwmRKSt9nothrow_t",
Bob Wilsond8d92d92013-11-03 06:48:38 +000045 "__cospi",
46 "__cospif",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000047 "__cxa_atexit",
48 "__cxa_guard_abort",
49 "__cxa_guard_acquire",
50 "__cxa_guard_release",
Meador Ingeb904e6e2013-03-05 21:47:40 +000051 "__isoc99_scanf",
52 "__isoc99_sscanf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000053 "__memcpy_chk",
Bob Wilsond8d92d92013-11-03 06:48:38 +000054 "__sincospi_stret",
Tim Northover103e6482014-02-04 16:28:20 +000055 "__sincospif_stret",
Bob Wilsond8d92d92013-11-03 06:48:38 +000056 "__sinpi",
57 "__sinpif",
Preston Gurd048f99d2013-05-27 15:44:35 +000058 "__sqrt_finite",
59 "__sqrtf_finite",
60 "__sqrtl_finite",
Meador Ingeb904e6e2013-03-05 21:47:40 +000061 "__strdup",
62 "__strndup",
63 "__strtok_r",
Meador Inge780a1862012-11-22 15:36:42 +000064 "abs",
Meador Ingeb904e6e2013-03-05 21:47:40 +000065 "access",
Chad Rosier738da252011-11-30 19:19:00 +000066 "acos",
Chad Rosier738da252011-11-30 19:19:00 +000067 "acosf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000068 "acosh",
69 "acoshf",
70 "acoshl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000071 "acosl",
Chad Rosier738da252011-11-30 19:19:00 +000072 "asin",
Chad Rosier738da252011-11-30 19:19:00 +000073 "asinf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000074 "asinh",
75 "asinhf",
76 "asinhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000077 "asinl",
Chad Rosier738da252011-11-30 19:19:00 +000078 "atan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000079 "atan2",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000080 "atan2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000081 "atan2l",
82 "atanf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000083 "atanh",
84 "atanhf",
85 "atanhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000086 "atanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +000087 "atof",
88 "atoi",
89 "atol",
90 "atoll",
91 "bcmp",
92 "bcopy",
93 "bzero",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000094 "calloc",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000095 "cbrt",
96 "cbrtf",
97 "cbrtl",
Chad Rosier738da252011-11-30 19:19:00 +000098 "ceil",
Chad Rosier738da252011-11-30 19:19:00 +000099 "ceilf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000100 "ceill",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000101 "chmod",
102 "chown",
103 "clearerr",
104 "closedir",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000105 "copysign",
106 "copysignf",
107 "copysignl",
Chad Rosier738da252011-11-30 19:19:00 +0000108 "cos",
Chad Rosier738da252011-11-30 19:19:00 +0000109 "cosf",
110 "cosh",
Chad Rosier738da252011-11-30 19:19:00 +0000111 "coshf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000112 "coshl",
113 "cosl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000114 "ctermid",
Chad Rosier738da252011-11-30 19:19:00 +0000115 "exp",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000116 "exp10",
117 "exp10f",
118 "exp10l",
Chad Rosier738da252011-11-30 19:19:00 +0000119 "exp2",
Chad Rosier738da252011-11-30 19:19:00 +0000120 "exp2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000121 "exp2l",
122 "expf",
123 "expl",
Chad Rosier738da252011-11-30 19:19:00 +0000124 "expm1",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000125 "expm1f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000126 "expm1l",
Chad Rosier738da252011-11-30 19:19:00 +0000127 "fabs",
Chad Rosier738da252011-11-30 19:19:00 +0000128 "fabsf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000129 "fabsl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000130 "fclose",
131 "fdopen",
132 "feof",
133 "ferror",
134 "fflush",
Meador Inge780a1862012-11-22 15:36:42 +0000135 "ffs",
136 "ffsl",
137 "ffsll",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000138 "fgetc",
139 "fgetpos",
140 "fgets",
141 "fileno",
Chad Rosierabba0942011-11-30 01:51:49 +0000142 "fiprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000143 "flockfile",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000144 "floor",
145 "floorf",
146 "floorl",
Yi Jiang6ab044e2013-12-16 22:42:40 +0000147 "fmax",
148 "fmaxf",
149 "fmaxl",
150 "fmin",
151 "fminf",
152 "fminl",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000153 "fmod",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000154 "fmodf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000155 "fmodl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000156 "fopen",
157 "fopen64",
Meador Inge780a1862012-11-22 15:36:42 +0000158 "fprintf",
Nuno Lopes342cf782012-07-24 21:00:36 +0000159 "fputc",
Chad Rosierabba0942011-11-30 01:51:49 +0000160 "fputs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000161 "fread",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000162 "free",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000163 "frexp",
164 "frexpf",
165 "frexpl",
166 "fscanf",
167 "fseek",
168 "fseeko",
169 "fseeko64",
170 "fsetpos",
171 "fstat",
172 "fstat64",
173 "fstatvfs",
174 "fstatvfs64",
175 "ftell",
176 "ftello",
177 "ftello64",
178 "ftrylockfile",
179 "funlockfile",
Chad Rosierabba0942011-11-30 01:51:49 +0000180 "fwrite",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000181 "getc",
182 "getc_unlocked",
183 "getchar",
184 "getenv",
185 "getitimer",
186 "getlogin_r",
187 "getpwnam",
188 "gets",
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000189 "gettimeofday",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000190 "htonl",
191 "htons",
Chad Rosierabba0942011-11-30 01:51:49 +0000192 "iprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000193 "isascii",
194 "isdigit",
195 "labs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000196 "lchown",
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000197 "ldexp",
198 "ldexpf",
199 "ldexpl",
Meador Inge780a1862012-11-22 15:36:42 +0000200 "llabs",
Chad Rosier738da252011-11-30 19:19:00 +0000201 "log",
Chad Rosier738da252011-11-30 19:19:00 +0000202 "log10",
Chad Rosier738da252011-11-30 19:19:00 +0000203 "log10f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000204 "log10l",
Chad Rosier738da252011-11-30 19:19:00 +0000205 "log1p",
Chad Rosier738da252011-11-30 19:19:00 +0000206 "log1pf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000207 "log1pl",
208 "log2",
209 "log2f",
210 "log2l",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000211 "logb",
212 "logbf",
213 "logbl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000214 "logf",
215 "logl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000216 "lstat",
217 "lstat64",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000218 "malloc",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000219 "memalign",
220 "memccpy",
Nuno Lopes342cf782012-07-24 21:00:36 +0000221 "memchr",
222 "memcmp",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000223 "memcpy",
224 "memmove",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000225 "memrchr",
Chad Rosierabba0942011-11-30 01:51:49 +0000226 "memset",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000227 "memset_pattern16",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000228 "mkdir",
229 "mktime",
230 "modf",
231 "modff",
232 "modfl",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000233 "nearbyint",
234 "nearbyintf",
235 "nearbyintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000236 "ntohl",
237 "ntohs",
238 "open",
239 "open64",
240 "opendir",
241 "pclose",
242 "perror",
243 "popen",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000244 "posix_memalign",
Chad Rosier738da252011-11-30 19:19:00 +0000245 "pow",
246 "powf",
247 "powl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000248 "pread",
Meador Inge780a1862012-11-22 15:36:42 +0000249 "printf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000250 "putc",
Nuno Lopes342cf782012-07-24 21:00:36 +0000251 "putchar",
252 "puts",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000253 "pwrite",
254 "qsort",
255 "read",
256 "readlink",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000257 "realloc",
258 "reallocf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000259 "realpath",
260 "remove",
261 "rename",
262 "rewind",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000263 "rint",
264 "rintf",
265 "rintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000266 "rmdir",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000267 "round",
268 "roundf",
269 "roundl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000270 "scanf",
271 "setbuf",
272 "setitimer",
273 "setvbuf",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000274 "sin",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000275 "sinf",
Chad Rosier676c0932011-12-01 18:26:19 +0000276 "sinh",
Chad Rosier676c0932011-12-01 18:26:19 +0000277 "sinhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000278 "sinhl",
279 "sinl",
Chad Rosier676c0932011-12-01 18:26:19 +0000280 "siprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000281 "snprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000282 "sprintf",
Chad Rosier82e1bd82011-11-29 23:57:10 +0000283 "sqrt",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000284 "sqrtf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000285 "sqrtl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000286 "sscanf",
287 "stat",
288 "stat64",
289 "statvfs",
290 "statvfs64",
Meador Inge2526a422012-11-10 03:11:06 +0000291 "stpcpy",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000292 "stpncpy",
293 "strcasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000294 "strcat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000295 "strchr",
Meador Inge2526a422012-11-10 03:11:06 +0000296 "strcmp",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000297 "strcoll",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000298 "strcpy",
Meador Inge2526a422012-11-10 03:11:06 +0000299 "strcspn",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000300 "strdup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000301 "strlen",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000302 "strncasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000303 "strncat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000304 "strncmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000305 "strncpy",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000306 "strndup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000307 "strnlen",
Meador Inge2526a422012-11-10 03:11:06 +0000308 "strpbrk",
309 "strrchr",
310 "strspn",
311 "strstr",
312 "strtod",
313 "strtof",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000314 "strtok",
315 "strtok_r",
Meador Inge2526a422012-11-10 03:11:06 +0000316 "strtol",
317 "strtold",
318 "strtoll",
319 "strtoul",
320 "strtoull",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000321 "strxfrm",
322 "system",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000323 "tan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000324 "tanf",
325 "tanh",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000326 "tanhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000327 "tanhl",
328 "tanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000329 "times",
330 "tmpfile",
331 "tmpfile64",
Meador Inge780a1862012-11-22 15:36:42 +0000332 "toascii",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000333 "trunc",
334 "truncf",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000335 "truncl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000336 "uname",
337 "ungetc",
338 "unlink",
339 "unsetenv",
340 "utime",
341 "utimes",
342 "valloc",
343 "vfprintf",
344 "vfscanf",
345 "vprintf",
346 "vscanf",
347 "vsnprintf",
348 "vsprintf",
349 "vsscanf",
350 "write"
Eli Friedman489c0ff2011-11-17 01:27:36 +0000351 };
352
Bob Wilsond8d92d92013-11-03 06:48:38 +0000353static bool hasSinCosPiStret(const Triple &T) {
354 // Only Darwin variants have _stret versions of combined trig functions.
Bob Wilson9868d712014-10-09 05:43:30 +0000355 if (!T.isOSDarwin())
Bob Wilsond8d92d92013-11-03 06:48:38 +0000356 return false;
357
358 // The ABI is rather complicated on x86, so don't do anything special there.
359 if (T.getArch() == Triple::x86)
360 return false;
361
362 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
363 return false;
364
Bob Wilson9868d712014-10-09 05:43:30 +0000365 if (T.isiOS() && T.isOSVersionLT(7, 0))
Bob Wilsond8d92d92013-11-03 06:48:38 +0000366 return false;
367
368 return true;
369}
370
Chris Lattner0e125bb2011-02-18 21:50:34 +0000371/// initialize - Initialize the set of available library functions based on the
372/// specified target triple. This should be carefully written so that a missing
373/// target triple gets a sane set of defaults.
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000374static void initialize(TargetLibraryInfo &TLI, const Triple &T,
375 const char **StandardNames) {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000376 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
377
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000378#ifndef NDEBUG
379 // Verify that the StandardNames array is in alphabetical order.
380 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
381 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
382 llvm_unreachable("TargetLibraryInfo function names must be sorted");
383 }
384#endif // !NDEBUG
Tom Stellard36a03182014-04-02 19:53:29 +0000385
386 // There are no library implementations of mempcy and memset for r600 and
387 // these can be difficult to lower in the backend.
388 if (T.getArch() == Triple::r600) {
389 TLI.setUnavailable(LibFunc::memcpy);
390 TLI.setUnavailable(LibFunc::memset);
391 TLI.setUnavailable(LibFunc::memset_pattern16);
392 return;
393 }
394
Nico Weberad156922014-03-07 18:08:54 +0000395 // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000396 if (T.isMacOSX()) {
397 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000398 TLI.setUnavailable(LibFunc::memset_pattern16);
Cameron Esfahani943908b2013-08-29 20:23:14 +0000399 } else if (T.isiOS()) {
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000400 if (T.isOSVersionLT(3, 0))
401 TLI.setUnavailable(LibFunc::memset_pattern16);
402 } else {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000403 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000404 }
Richard Osborne815de532011-03-03 13:17:51 +0000405
Bob Wilsond8d92d92013-11-03 06:48:38 +0000406 if (!hasSinCosPiStret(T)) {
407 TLI.setUnavailable(LibFunc::sinpi);
408 TLI.setUnavailable(LibFunc::sinpif);
409 TLI.setUnavailable(LibFunc::cospi);
410 TLI.setUnavailable(LibFunc::cospif);
411 TLI.setUnavailable(LibFunc::sincospi_stret);
Tim Northover103e6482014-02-04 16:28:20 +0000412 TLI.setUnavailable(LibFunc::sincospif_stret);
Bob Wilsond8d92d92013-11-03 06:48:38 +0000413 }
414
Eli Friedman489c0ff2011-11-17 01:27:36 +0000415 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
416 !T.isMacOSXVersionLT(10, 7)) {
417 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
418 // we don't care about) have two versions; on recent OSX, the one we want
419 // has a $UNIX2003 suffix. The two implementations are identical except
420 // for the return value in some edge cases. However, we don't want to
421 // generate code that depends on the old symbols.
422 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
423 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
424 }
425
Duncan Sandseeb50c82011-06-09 11:11:45 +0000426 // iprintf and friends are only available on XCore and TCE.
427 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne815de532011-03-03 13:17:51 +0000428 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000429 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborneaf52c522011-03-03 14:20:22 +0000430 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000431 }
Joe Groffa81bcbb2012-04-17 23:05:54 +0000432
Saleem Abdulrasool8dc8fb12014-07-24 22:09:06 +0000433 if (T.isOSWindows() && !T.isOSCygMing()) {
Joe Groffa81bcbb2012-04-17 23:05:54 +0000434 // Win32 does not support long double
435 TLI.setUnavailable(LibFunc::acosl);
436 TLI.setUnavailable(LibFunc::asinl);
437 TLI.setUnavailable(LibFunc::atanl);
438 TLI.setUnavailable(LibFunc::atan2l);
439 TLI.setUnavailable(LibFunc::ceill);
440 TLI.setUnavailable(LibFunc::copysignl);
441 TLI.setUnavailable(LibFunc::cosl);
442 TLI.setUnavailable(LibFunc::coshl);
443 TLI.setUnavailable(LibFunc::expl);
444 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
445 TLI.setUnavailable(LibFunc::fabsl);
446 TLI.setUnavailable(LibFunc::floorl);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000447 TLI.setUnavailable(LibFunc::fmaxl);
448 TLI.setUnavailable(LibFunc::fminl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000449 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000450 TLI.setUnavailable(LibFunc::frexpl);
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000451 TLI.setUnavailable(LibFunc::ldexpf);
452 TLI.setUnavailable(LibFunc::ldexpl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000453 TLI.setUnavailable(LibFunc::logl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000454 TLI.setUnavailable(LibFunc::modfl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000455 TLI.setUnavailable(LibFunc::powl);
456 TLI.setUnavailable(LibFunc::sinl);
457 TLI.setUnavailable(LibFunc::sinhl);
458 TLI.setUnavailable(LibFunc::sqrtl);
459 TLI.setUnavailable(LibFunc::tanl);
460 TLI.setUnavailable(LibFunc::tanhl);
461
462 // Win32 only has C89 math
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000463 TLI.setUnavailable(LibFunc::acosh);
464 TLI.setUnavailable(LibFunc::acoshf);
465 TLI.setUnavailable(LibFunc::acoshl);
466 TLI.setUnavailable(LibFunc::asinh);
467 TLI.setUnavailable(LibFunc::asinhf);
468 TLI.setUnavailable(LibFunc::asinhl);
469 TLI.setUnavailable(LibFunc::atanh);
470 TLI.setUnavailable(LibFunc::atanhf);
471 TLI.setUnavailable(LibFunc::atanhl);
472 TLI.setUnavailable(LibFunc::cbrt);
473 TLI.setUnavailable(LibFunc::cbrtf);
474 TLI.setUnavailable(LibFunc::cbrtl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000475 TLI.setUnavailable(LibFunc::exp2);
476 TLI.setUnavailable(LibFunc::exp2f);
477 TLI.setUnavailable(LibFunc::exp2l);
478 TLI.setUnavailable(LibFunc::expm1);
479 TLI.setUnavailable(LibFunc::expm1f);
480 TLI.setUnavailable(LibFunc::expm1l);
481 TLI.setUnavailable(LibFunc::log2);
482 TLI.setUnavailable(LibFunc::log2f);
483 TLI.setUnavailable(LibFunc::log2l);
484 TLI.setUnavailable(LibFunc::log1p);
485 TLI.setUnavailable(LibFunc::log1pf);
486 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000487 TLI.setUnavailable(LibFunc::logb);
488 TLI.setUnavailable(LibFunc::logbf);
489 TLI.setUnavailable(LibFunc::logbl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000490 TLI.setUnavailable(LibFunc::nearbyint);
491 TLI.setUnavailable(LibFunc::nearbyintf);
492 TLI.setUnavailable(LibFunc::nearbyintl);
493 TLI.setUnavailable(LibFunc::rint);
494 TLI.setUnavailable(LibFunc::rintf);
495 TLI.setUnavailable(LibFunc::rintl);
496 TLI.setUnavailable(LibFunc::round);
497 TLI.setUnavailable(LibFunc::roundf);
498 TLI.setUnavailable(LibFunc::roundl);
499 TLI.setUnavailable(LibFunc::trunc);
500 TLI.setUnavailable(LibFunc::truncf);
501 TLI.setUnavailable(LibFunc::truncl);
502
503 // Win32 provides some C99 math with mangled names
504 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
505
506 if (T.getArch() == Triple::x86) {
507 // Win32 on x86 implements single-precision math functions as macros
508 TLI.setUnavailable(LibFunc::acosf);
509 TLI.setUnavailable(LibFunc::asinf);
510 TLI.setUnavailable(LibFunc::atanf);
511 TLI.setUnavailable(LibFunc::atan2f);
512 TLI.setUnavailable(LibFunc::ceilf);
513 TLI.setUnavailable(LibFunc::copysignf);
514 TLI.setUnavailable(LibFunc::cosf);
515 TLI.setUnavailable(LibFunc::coshf);
516 TLI.setUnavailable(LibFunc::expf);
517 TLI.setUnavailable(LibFunc::floorf);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000518 TLI.setUnavailable(LibFunc::fminf);
519 TLI.setUnavailable(LibFunc::fmaxf);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000520 TLI.setUnavailable(LibFunc::fmodf);
521 TLI.setUnavailable(LibFunc::logf);
522 TLI.setUnavailable(LibFunc::powf);
523 TLI.setUnavailable(LibFunc::sinf);
524 TLI.setUnavailable(LibFunc::sinhf);
525 TLI.setUnavailable(LibFunc::sqrtf);
526 TLI.setUnavailable(LibFunc::tanf);
527 TLI.setUnavailable(LibFunc::tanhf);
528 }
Meador Inge2526a422012-11-10 03:11:06 +0000529
Meador Ingeb904e6e2013-03-05 21:47:40 +0000530 // Win32 does *not* provide provide these functions, but they are
531 // generally available on POSIX-compliant systems:
532 TLI.setUnavailable(LibFunc::access);
533 TLI.setUnavailable(LibFunc::bcmp);
534 TLI.setUnavailable(LibFunc::bcopy);
535 TLI.setUnavailable(LibFunc::bzero);
536 TLI.setUnavailable(LibFunc::chmod);
537 TLI.setUnavailable(LibFunc::chown);
538 TLI.setUnavailable(LibFunc::closedir);
539 TLI.setUnavailable(LibFunc::ctermid);
540 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge780a1862012-11-22 15:36:42 +0000541 TLI.setUnavailable(LibFunc::ffs);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000542 TLI.setUnavailable(LibFunc::fileno);
543 TLI.setUnavailable(LibFunc::flockfile);
544 TLI.setUnavailable(LibFunc::fseeko);
545 TLI.setUnavailable(LibFunc::fstat);
546 TLI.setUnavailable(LibFunc::fstatvfs);
547 TLI.setUnavailable(LibFunc::ftello);
548 TLI.setUnavailable(LibFunc::ftrylockfile);
549 TLI.setUnavailable(LibFunc::funlockfile);
550 TLI.setUnavailable(LibFunc::getc_unlocked);
551 TLI.setUnavailable(LibFunc::getitimer);
552 TLI.setUnavailable(LibFunc::getlogin_r);
553 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000554 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000555 TLI.setUnavailable(LibFunc::htonl);
556 TLI.setUnavailable(LibFunc::htons);
557 TLI.setUnavailable(LibFunc::lchown);
558 TLI.setUnavailable(LibFunc::lstat);
559 TLI.setUnavailable(LibFunc::memccpy);
560 TLI.setUnavailable(LibFunc::mkdir);
561 TLI.setUnavailable(LibFunc::ntohl);
562 TLI.setUnavailable(LibFunc::ntohs);
563 TLI.setUnavailable(LibFunc::open);
564 TLI.setUnavailable(LibFunc::opendir);
565 TLI.setUnavailable(LibFunc::pclose);
566 TLI.setUnavailable(LibFunc::popen);
567 TLI.setUnavailable(LibFunc::pread);
568 TLI.setUnavailable(LibFunc::pwrite);
569 TLI.setUnavailable(LibFunc::read);
570 TLI.setUnavailable(LibFunc::readlink);
571 TLI.setUnavailable(LibFunc::realpath);
572 TLI.setUnavailable(LibFunc::rmdir);
573 TLI.setUnavailable(LibFunc::setitimer);
574 TLI.setUnavailable(LibFunc::stat);
575 TLI.setUnavailable(LibFunc::statvfs);
576 TLI.setUnavailable(LibFunc::stpcpy);
577 TLI.setUnavailable(LibFunc::stpncpy);
578 TLI.setUnavailable(LibFunc::strcasecmp);
579 TLI.setUnavailable(LibFunc::strncasecmp);
580 TLI.setUnavailable(LibFunc::times);
581 TLI.setUnavailable(LibFunc::uname);
582 TLI.setUnavailable(LibFunc::unlink);
583 TLI.setUnavailable(LibFunc::unsetenv);
584 TLI.setUnavailable(LibFunc::utime);
585 TLI.setUnavailable(LibFunc::utimes);
586 TLI.setUnavailable(LibFunc::write);
Meador Inge780a1862012-11-22 15:36:42 +0000587
Meador Ingeb904e6e2013-03-05 21:47:40 +0000588 // Win32 does *not* provide provide these functions, but they are
589 // specified by C99:
590 TLI.setUnavailable(LibFunc::atoll);
591 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge780a1862012-11-22 15:36:42 +0000592 TLI.setUnavailable(LibFunc::llabs);
593 }
594
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000595 switch (T.getOS()) {
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000596 case Triple::MacOSX:
Chandler Carruthf5689f82013-12-28 02:40:19 +0000597 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
598 // and their names are __exp10 and __exp10f. exp10l is not available on
599 // OS X or iOS.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000600 TLI.setUnavailable(LibFunc::exp10l);
601 if (T.isMacOSXVersionLT(10, 9)) {
602 TLI.setUnavailable(LibFunc::exp10);
603 TLI.setUnavailable(LibFunc::exp10f);
604 } else {
605 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
606 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
607 }
608 break;
609 case Triple::IOS:
610 TLI.setUnavailable(LibFunc::exp10l);
611 if (T.isOSVersionLT(7, 0)) {
612 TLI.setUnavailable(LibFunc::exp10);
613 TLI.setUnavailable(LibFunc::exp10f);
614 } else {
615 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
616 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
617 }
618 break;
Chandler Carruthf5689f82013-12-28 02:40:19 +0000619 case Triple::Linux:
620 // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
621 // buggy prior to glibc version 2.18. Until this version is widely deployed
622 // or we have a reasonable detection strategy, we cannot use exp10 reliably
623 // on Linux.
624 //
625 // Fall through to disable all of them.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000626 default:
627 TLI.setUnavailable(LibFunc::exp10);
628 TLI.setUnavailable(LibFunc::exp10f);
629 TLI.setUnavailable(LibFunc::exp10l);
630 }
631
Meador Inge780a1862012-11-22 15:36:42 +0000632 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
633 // Linux (GLIBC):
634 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
635 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
636 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
637 switch (T.getOS()) {
638 case Triple::Darwin:
639 case Triple::MacOSX:
640 case Triple::IOS:
641 case Triple::FreeBSD:
642 case Triple::Linux:
643 break;
644 default:
645 TLI.setUnavailable(LibFunc::ffsl);
646 }
647
648 // ffsll is available on at least FreeBSD and Linux (GLIBC):
649 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
650 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
651 switch (T.getOS()) {
652 case Triple::FreeBSD:
653 case Triple::Linux:
654 break;
655 default:
656 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000657 }
Meador Ingeb904e6e2013-03-05 21:47:40 +0000658
659 // The following functions are available on at least Linux:
Cameron Esfahani943908b2013-08-29 20:23:14 +0000660 if (!T.isOSLinux()) {
Meador Ingeb904e6e2013-03-05 21:47:40 +0000661 TLI.setUnavailable(LibFunc::dunder_strdup);
662 TLI.setUnavailable(LibFunc::dunder_strtok_r);
663 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
664 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
665 TLI.setUnavailable(LibFunc::under_IO_getc);
666 TLI.setUnavailable(LibFunc::under_IO_putc);
667 TLI.setUnavailable(LibFunc::memalign);
668 TLI.setUnavailable(LibFunc::fopen64);
669 TLI.setUnavailable(LibFunc::fseeko64);
670 TLI.setUnavailable(LibFunc::fstat64);
671 TLI.setUnavailable(LibFunc::fstatvfs64);
672 TLI.setUnavailable(LibFunc::ftello64);
673 TLI.setUnavailable(LibFunc::lstat64);
674 TLI.setUnavailable(LibFunc::open64);
675 TLI.setUnavailable(LibFunc::stat64);
676 TLI.setUnavailable(LibFunc::statvfs64);
677 TLI.setUnavailable(LibFunc::tmpfile64);
678 }
Chris Lattner0e125bb2011-02-18 21:50:34 +0000679}
680
681
682TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
683 // Default to everything being available.
684 memset(AvailableArray, -1, sizeof(AvailableArray));
685
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000686 initialize(*this, Triple(), StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000687}
688
689TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
690 // Default to everything being available.
691 memset(AvailableArray, -1, sizeof(AvailableArray));
692
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000693 initialize(*this, T, StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000694}
Chris Lattner1341df92011-02-18 22:34:03 +0000695
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000696TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
697 : ImmutablePass(ID) {
698 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman489c0ff2011-11-17 01:27:36 +0000699 CustomNames = TLI.CustomNames;
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000700}
701
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000702namespace {
703struct StringComparator {
704 /// Compare two strings and return true if LHS is lexicographically less than
705 /// RHS. Requires that RHS doesn't contain any zero bytes.
706 bool operator()(const char *LHS, StringRef RHS) const {
707 // Compare prefixes with strncmp. If prefixes match we know that LHS is
708 // greater or equal to RHS as RHS can't contain any '\0'.
709 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
710 }
711
712 // Provided for compatibility with MSVC's debug mode.
713 bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
714 bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
Benjamin Kramerdfbcba52013-03-13 13:50:47 +0000715 bool operator()(const char *LHS, const char *RHS) const {
716 return std::strcmp(LHS, RHS) < 0;
717 }
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000718};
719}
720
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000721bool TargetLibraryInfo::getLibFunc(StringRef funcName,
722 LibFunc::Func &F) const {
723 const char **Start = &StandardNames[0];
724 const char **End = &StandardNames[LibFunc::NumLibFuncs];
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000725
726 // Filter out empty names and names containing null bytes, those can't be in
727 // our table.
728 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
729 return false;
730
Meador Ingeb904e6e2013-03-05 21:47:40 +0000731 // Check for \01 prefix that is used to mangle __asm declarations and
732 // strip it if present.
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000733 if (funcName.front() == '\01')
Meador Ingeb904e6e2013-03-05 21:47:40 +0000734 funcName = funcName.substr(1);
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000735 const char **I = std::lower_bound(Start, End, funcName, StringComparator());
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000736 if (I != End && *I == funcName) {
737 F = (LibFunc::Func)(I - Start);
738 return true;
739 }
740 return false;
741}
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000742
Chris Lattner1341df92011-02-18 22:34:03 +0000743/// disableAllFunctions - This disables all builtins, which is used for options
744/// like -fno-builtin.
745void TargetLibraryInfo::disableAllFunctions() {
746 memset(AvailableArray, 0, sizeof(AvailableArray));
747}