blob: b208bfd3728d48995f08403ef3edafe936701def [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",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000031 "_ZdlPv",
Richard Smith70523c72013-07-21 23:11:42 +000032 "_ZdlPvRKSt9nothrow_t",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000033 "_Znaj",
34 "_ZnajRKSt9nothrow_t",
35 "_Znam",
36 "_ZnamRKSt9nothrow_t",
37 "_Znwj",
38 "_ZnwjRKSt9nothrow_t",
39 "_Znwm",
40 "_ZnwmRKSt9nothrow_t",
Bob Wilsond8d92d92013-11-03 06:48:38 +000041 "__cospi",
42 "__cospif",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000043 "__cxa_atexit",
44 "__cxa_guard_abort",
45 "__cxa_guard_acquire",
46 "__cxa_guard_release",
Meador Ingeb904e6e2013-03-05 21:47:40 +000047 "__isoc99_scanf",
48 "__isoc99_sscanf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000049 "__memcpy_chk",
Bob Wilsond8d92d92013-11-03 06:48:38 +000050 "__sincospi_stret",
51 "__sincospi_stretf",
52 "__sinpi",
53 "__sinpif",
Preston Gurd048f99d2013-05-27 15:44:35 +000054 "__sqrt_finite",
55 "__sqrtf_finite",
56 "__sqrtl_finite",
Meador Ingeb904e6e2013-03-05 21:47:40 +000057 "__strdup",
58 "__strndup",
59 "__strtok_r",
Meador Inge780a1862012-11-22 15:36:42 +000060 "abs",
Meador Ingeb904e6e2013-03-05 21:47:40 +000061 "access",
Chad Rosier738da252011-11-30 19:19:00 +000062 "acos",
Chad Rosier738da252011-11-30 19:19:00 +000063 "acosf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000064 "acosh",
65 "acoshf",
66 "acoshl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000067 "acosl",
Chad Rosier738da252011-11-30 19:19:00 +000068 "asin",
Chad Rosier738da252011-11-30 19:19:00 +000069 "asinf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000070 "asinh",
71 "asinhf",
72 "asinhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000073 "asinl",
Chad Rosier738da252011-11-30 19:19:00 +000074 "atan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000075 "atan2",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000076 "atan2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000077 "atan2l",
78 "atanf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000079 "atanh",
80 "atanhf",
81 "atanhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000082 "atanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +000083 "atof",
84 "atoi",
85 "atol",
86 "atoll",
87 "bcmp",
88 "bcopy",
89 "bzero",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000090 "calloc",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000091 "cbrt",
92 "cbrtf",
93 "cbrtl",
Chad Rosier738da252011-11-30 19:19:00 +000094 "ceil",
Chad Rosier738da252011-11-30 19:19:00 +000095 "ceilf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000096 "ceill",
Meador Ingeb904e6e2013-03-05 21:47:40 +000097 "chmod",
98 "chown",
99 "clearerr",
100 "closedir",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000101 "copysign",
102 "copysignf",
103 "copysignl",
Chad Rosier738da252011-11-30 19:19:00 +0000104 "cos",
Chad Rosier738da252011-11-30 19:19:00 +0000105 "cosf",
106 "cosh",
Chad Rosier738da252011-11-30 19:19:00 +0000107 "coshf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000108 "coshl",
109 "cosl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000110 "ctermid",
Chad Rosier738da252011-11-30 19:19:00 +0000111 "exp",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000112 "exp10",
113 "exp10f",
114 "exp10l",
Chad Rosier738da252011-11-30 19:19:00 +0000115 "exp2",
Chad Rosier738da252011-11-30 19:19:00 +0000116 "exp2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000117 "exp2l",
118 "expf",
119 "expl",
Chad Rosier738da252011-11-30 19:19:00 +0000120 "expm1",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000121 "expm1f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000122 "expm1l",
Chad Rosier738da252011-11-30 19:19:00 +0000123 "fabs",
Chad Rosier738da252011-11-30 19:19:00 +0000124 "fabsf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000125 "fabsl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000126 "fclose",
127 "fdopen",
128 "feof",
129 "ferror",
130 "fflush",
Meador Inge780a1862012-11-22 15:36:42 +0000131 "ffs",
132 "ffsl",
133 "ffsll",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000134 "fgetc",
135 "fgetpos",
136 "fgets",
137 "fileno",
Chad Rosierabba0942011-11-30 01:51:49 +0000138 "fiprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000139 "flockfile",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000140 "floor",
141 "floorf",
142 "floorl",
Yi Jiang6ab044e2013-12-16 22:42:40 +0000143 "fmax",
144 "fmaxf",
145 "fmaxl",
146 "fmin",
147 "fminf",
148 "fminl",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000149 "fmod",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000150 "fmodf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000151 "fmodl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000152 "fopen",
153 "fopen64",
Meador Inge780a1862012-11-22 15:36:42 +0000154 "fprintf",
Nuno Lopes342cf782012-07-24 21:00:36 +0000155 "fputc",
Chad Rosierabba0942011-11-30 01:51:49 +0000156 "fputs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000157 "fread",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000158 "free",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000159 "frexp",
160 "frexpf",
161 "frexpl",
162 "fscanf",
163 "fseek",
164 "fseeko",
165 "fseeko64",
166 "fsetpos",
167 "fstat",
168 "fstat64",
169 "fstatvfs",
170 "fstatvfs64",
171 "ftell",
172 "ftello",
173 "ftello64",
174 "ftrylockfile",
175 "funlockfile",
Chad Rosierabba0942011-11-30 01:51:49 +0000176 "fwrite",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000177 "getc",
178 "getc_unlocked",
179 "getchar",
180 "getenv",
181 "getitimer",
182 "getlogin_r",
183 "getpwnam",
184 "gets",
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000185 "gettimeofday",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000186 "htonl",
187 "htons",
Chad Rosierabba0942011-11-30 01:51:49 +0000188 "iprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000189 "isascii",
190 "isdigit",
191 "labs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000192 "lchown",
Meador Inge780a1862012-11-22 15:36:42 +0000193 "llabs",
Chad Rosier738da252011-11-30 19:19:00 +0000194 "log",
Chad Rosier738da252011-11-30 19:19:00 +0000195 "log10",
Chad Rosier738da252011-11-30 19:19:00 +0000196 "log10f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000197 "log10l",
Chad Rosier738da252011-11-30 19:19:00 +0000198 "log1p",
Chad Rosier738da252011-11-30 19:19:00 +0000199 "log1pf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000200 "log1pl",
201 "log2",
202 "log2f",
203 "log2l",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000204 "logb",
205 "logbf",
206 "logbl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000207 "logf",
208 "logl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000209 "lstat",
210 "lstat64",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000211 "malloc",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000212 "memalign",
213 "memccpy",
Nuno Lopes342cf782012-07-24 21:00:36 +0000214 "memchr",
215 "memcmp",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000216 "memcpy",
217 "memmove",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000218 "memrchr",
Chad Rosierabba0942011-11-30 01:51:49 +0000219 "memset",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000220 "memset_pattern16",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000221 "mkdir",
222 "mktime",
223 "modf",
224 "modff",
225 "modfl",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000226 "nearbyint",
227 "nearbyintf",
228 "nearbyintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000229 "ntohl",
230 "ntohs",
231 "open",
232 "open64",
233 "opendir",
234 "pclose",
235 "perror",
236 "popen",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000237 "posix_memalign",
Chad Rosier738da252011-11-30 19:19:00 +0000238 "pow",
239 "powf",
240 "powl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000241 "pread",
Meador Inge780a1862012-11-22 15:36:42 +0000242 "printf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000243 "putc",
Nuno Lopes342cf782012-07-24 21:00:36 +0000244 "putchar",
245 "puts",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000246 "pwrite",
247 "qsort",
248 "read",
249 "readlink",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000250 "realloc",
251 "reallocf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000252 "realpath",
253 "remove",
254 "rename",
255 "rewind",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000256 "rint",
257 "rintf",
258 "rintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000259 "rmdir",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000260 "round",
261 "roundf",
262 "roundl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000263 "scanf",
264 "setbuf",
265 "setitimer",
266 "setvbuf",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000267 "sin",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000268 "sinf",
Chad Rosier676c0932011-12-01 18:26:19 +0000269 "sinh",
Chad Rosier676c0932011-12-01 18:26:19 +0000270 "sinhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000271 "sinhl",
272 "sinl",
Chad Rosier676c0932011-12-01 18:26:19 +0000273 "siprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000274 "snprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000275 "sprintf",
Chad Rosier82e1bd82011-11-29 23:57:10 +0000276 "sqrt",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000277 "sqrtf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000278 "sqrtl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000279 "sscanf",
280 "stat",
281 "stat64",
282 "statvfs",
283 "statvfs64",
Meador Inge2526a422012-11-10 03:11:06 +0000284 "stpcpy",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000285 "stpncpy",
286 "strcasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000287 "strcat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000288 "strchr",
Meador Inge2526a422012-11-10 03:11:06 +0000289 "strcmp",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000290 "strcoll",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000291 "strcpy",
Meador Inge2526a422012-11-10 03:11:06 +0000292 "strcspn",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000293 "strdup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000294 "strlen",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000295 "strncasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000296 "strncat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000297 "strncmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000298 "strncpy",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000299 "strndup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000300 "strnlen",
Meador Inge2526a422012-11-10 03:11:06 +0000301 "strpbrk",
302 "strrchr",
303 "strspn",
304 "strstr",
305 "strtod",
306 "strtof",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000307 "strtok",
308 "strtok_r",
Meador Inge2526a422012-11-10 03:11:06 +0000309 "strtol",
310 "strtold",
311 "strtoll",
312 "strtoul",
313 "strtoull",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000314 "strxfrm",
315 "system",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000316 "tan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000317 "tanf",
318 "tanh",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000319 "tanhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000320 "tanhl",
321 "tanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000322 "times",
323 "tmpfile",
324 "tmpfile64",
Meador Inge780a1862012-11-22 15:36:42 +0000325 "toascii",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000326 "trunc",
327 "truncf",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000328 "truncl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000329 "uname",
330 "ungetc",
331 "unlink",
332 "unsetenv",
333 "utime",
334 "utimes",
335 "valloc",
336 "vfprintf",
337 "vfscanf",
338 "vprintf",
339 "vscanf",
340 "vsnprintf",
341 "vsprintf",
342 "vsscanf",
343 "write"
Eli Friedman489c0ff2011-11-17 01:27:36 +0000344 };
345
Bob Wilsond8d92d92013-11-03 06:48:38 +0000346static bool hasSinCosPiStret(const Triple &T) {
347 // Only Darwin variants have _stret versions of combined trig functions.
348 if (!T.isMacOSX() && T.getOS() != Triple::IOS)
349 return false;
350
351 // The ABI is rather complicated on x86, so don't do anything special there.
352 if (T.getArch() == Triple::x86)
353 return false;
354
355 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
356 return false;
357
358 if (T.getOS() == Triple::IOS && T.isOSVersionLT(7, 0))
359 return false;
360
361 return true;
362}
363
Chris Lattner0e125bb2011-02-18 21:50:34 +0000364/// initialize - Initialize the set of available library functions based on the
365/// specified target triple. This should be carefully written so that a missing
366/// target triple gets a sane set of defaults.
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000367static void initialize(TargetLibraryInfo &TLI, const Triple &T,
368 const char **StandardNames) {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000369 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
370
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000371#ifndef NDEBUG
372 // Verify that the StandardNames array is in alphabetical order.
373 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
374 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
375 llvm_unreachable("TargetLibraryInfo function names must be sorted");
376 }
377#endif // !NDEBUG
Chris Lattner0e125bb2011-02-18 21:50:34 +0000378
379 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000380 if (T.isMacOSX()) {
381 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000382 TLI.setUnavailable(LibFunc::memset_pattern16);
Cameron Esfahani943908b2013-08-29 20:23:14 +0000383 } else if (T.isiOS()) {
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000384 if (T.isOSVersionLT(3, 0))
385 TLI.setUnavailable(LibFunc::memset_pattern16);
386 } else {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000387 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000388 }
Richard Osborne815de532011-03-03 13:17:51 +0000389
Bob Wilsond8d92d92013-11-03 06:48:38 +0000390 if (!hasSinCosPiStret(T)) {
391 TLI.setUnavailable(LibFunc::sinpi);
392 TLI.setUnavailable(LibFunc::sinpif);
393 TLI.setUnavailable(LibFunc::cospi);
394 TLI.setUnavailable(LibFunc::cospif);
395 TLI.setUnavailable(LibFunc::sincospi_stret);
396 TLI.setUnavailable(LibFunc::sincospi_stretf);
397 }
398
Eli Friedman489c0ff2011-11-17 01:27:36 +0000399 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
400 !T.isMacOSXVersionLT(10, 7)) {
401 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
402 // we don't care about) have two versions; on recent OSX, the one we want
403 // has a $UNIX2003 suffix. The two implementations are identical except
404 // for the return value in some edge cases. However, we don't want to
405 // generate code that depends on the old symbols.
406 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
407 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
408 }
409
Duncan Sandseeb50c82011-06-09 11:11:45 +0000410 // iprintf and friends are only available on XCore and TCE.
411 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne815de532011-03-03 13:17:51 +0000412 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000413 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborneaf52c522011-03-03 14:20:22 +0000414 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000415 }
Joe Groffa81bcbb2012-04-17 23:05:54 +0000416
417 if (T.getOS() == Triple::Win32) {
418 // Win32 does not support long double
419 TLI.setUnavailable(LibFunc::acosl);
420 TLI.setUnavailable(LibFunc::asinl);
421 TLI.setUnavailable(LibFunc::atanl);
422 TLI.setUnavailable(LibFunc::atan2l);
423 TLI.setUnavailable(LibFunc::ceill);
424 TLI.setUnavailable(LibFunc::copysignl);
425 TLI.setUnavailable(LibFunc::cosl);
426 TLI.setUnavailable(LibFunc::coshl);
427 TLI.setUnavailable(LibFunc::expl);
428 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
429 TLI.setUnavailable(LibFunc::fabsl);
430 TLI.setUnavailable(LibFunc::floorl);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000431 TLI.setUnavailable(LibFunc::fmaxl);
432 TLI.setUnavailable(LibFunc::fminl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000433 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000434 TLI.setUnavailable(LibFunc::frexpl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000435 TLI.setUnavailable(LibFunc::logl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000436 TLI.setUnavailable(LibFunc::modfl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000437 TLI.setUnavailable(LibFunc::powl);
438 TLI.setUnavailable(LibFunc::sinl);
439 TLI.setUnavailable(LibFunc::sinhl);
440 TLI.setUnavailable(LibFunc::sqrtl);
441 TLI.setUnavailable(LibFunc::tanl);
442 TLI.setUnavailable(LibFunc::tanhl);
443
444 // Win32 only has C89 math
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000445 TLI.setUnavailable(LibFunc::acosh);
446 TLI.setUnavailable(LibFunc::acoshf);
447 TLI.setUnavailable(LibFunc::acoshl);
448 TLI.setUnavailable(LibFunc::asinh);
449 TLI.setUnavailable(LibFunc::asinhf);
450 TLI.setUnavailable(LibFunc::asinhl);
451 TLI.setUnavailable(LibFunc::atanh);
452 TLI.setUnavailable(LibFunc::atanhf);
453 TLI.setUnavailable(LibFunc::atanhl);
454 TLI.setUnavailable(LibFunc::cbrt);
455 TLI.setUnavailable(LibFunc::cbrtf);
456 TLI.setUnavailable(LibFunc::cbrtl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000457 TLI.setUnavailable(LibFunc::exp2);
458 TLI.setUnavailable(LibFunc::exp2f);
459 TLI.setUnavailable(LibFunc::exp2l);
460 TLI.setUnavailable(LibFunc::expm1);
461 TLI.setUnavailable(LibFunc::expm1f);
462 TLI.setUnavailable(LibFunc::expm1l);
463 TLI.setUnavailable(LibFunc::log2);
464 TLI.setUnavailable(LibFunc::log2f);
465 TLI.setUnavailable(LibFunc::log2l);
466 TLI.setUnavailable(LibFunc::log1p);
467 TLI.setUnavailable(LibFunc::log1pf);
468 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000469 TLI.setUnavailable(LibFunc::logb);
470 TLI.setUnavailable(LibFunc::logbf);
471 TLI.setUnavailable(LibFunc::logbl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000472 TLI.setUnavailable(LibFunc::nearbyint);
473 TLI.setUnavailable(LibFunc::nearbyintf);
474 TLI.setUnavailable(LibFunc::nearbyintl);
475 TLI.setUnavailable(LibFunc::rint);
476 TLI.setUnavailable(LibFunc::rintf);
477 TLI.setUnavailable(LibFunc::rintl);
478 TLI.setUnavailable(LibFunc::round);
479 TLI.setUnavailable(LibFunc::roundf);
480 TLI.setUnavailable(LibFunc::roundl);
481 TLI.setUnavailable(LibFunc::trunc);
482 TLI.setUnavailable(LibFunc::truncf);
483 TLI.setUnavailable(LibFunc::truncl);
484
485 // Win32 provides some C99 math with mangled names
486 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
487
488 if (T.getArch() == Triple::x86) {
489 // Win32 on x86 implements single-precision math functions as macros
490 TLI.setUnavailable(LibFunc::acosf);
491 TLI.setUnavailable(LibFunc::asinf);
492 TLI.setUnavailable(LibFunc::atanf);
493 TLI.setUnavailable(LibFunc::atan2f);
494 TLI.setUnavailable(LibFunc::ceilf);
495 TLI.setUnavailable(LibFunc::copysignf);
496 TLI.setUnavailable(LibFunc::cosf);
497 TLI.setUnavailable(LibFunc::coshf);
498 TLI.setUnavailable(LibFunc::expf);
499 TLI.setUnavailable(LibFunc::floorf);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000500 TLI.setUnavailable(LibFunc::fminf);
501 TLI.setUnavailable(LibFunc::fmaxf);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000502 TLI.setUnavailable(LibFunc::fmodf);
503 TLI.setUnavailable(LibFunc::logf);
504 TLI.setUnavailable(LibFunc::powf);
505 TLI.setUnavailable(LibFunc::sinf);
506 TLI.setUnavailable(LibFunc::sinhf);
507 TLI.setUnavailable(LibFunc::sqrtf);
508 TLI.setUnavailable(LibFunc::tanf);
509 TLI.setUnavailable(LibFunc::tanhf);
510 }
Meador Inge2526a422012-11-10 03:11:06 +0000511
Meador Ingeb904e6e2013-03-05 21:47:40 +0000512 // Win32 does *not* provide provide these functions, but they are
513 // generally available on POSIX-compliant systems:
514 TLI.setUnavailable(LibFunc::access);
515 TLI.setUnavailable(LibFunc::bcmp);
516 TLI.setUnavailable(LibFunc::bcopy);
517 TLI.setUnavailable(LibFunc::bzero);
518 TLI.setUnavailable(LibFunc::chmod);
519 TLI.setUnavailable(LibFunc::chown);
520 TLI.setUnavailable(LibFunc::closedir);
521 TLI.setUnavailable(LibFunc::ctermid);
522 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge780a1862012-11-22 15:36:42 +0000523 TLI.setUnavailable(LibFunc::ffs);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000524 TLI.setUnavailable(LibFunc::fileno);
525 TLI.setUnavailable(LibFunc::flockfile);
526 TLI.setUnavailable(LibFunc::fseeko);
527 TLI.setUnavailable(LibFunc::fstat);
528 TLI.setUnavailable(LibFunc::fstatvfs);
529 TLI.setUnavailable(LibFunc::ftello);
530 TLI.setUnavailable(LibFunc::ftrylockfile);
531 TLI.setUnavailable(LibFunc::funlockfile);
532 TLI.setUnavailable(LibFunc::getc_unlocked);
533 TLI.setUnavailable(LibFunc::getitimer);
534 TLI.setUnavailable(LibFunc::getlogin_r);
535 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000536 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000537 TLI.setUnavailable(LibFunc::htonl);
538 TLI.setUnavailable(LibFunc::htons);
539 TLI.setUnavailable(LibFunc::lchown);
540 TLI.setUnavailable(LibFunc::lstat);
541 TLI.setUnavailable(LibFunc::memccpy);
542 TLI.setUnavailable(LibFunc::mkdir);
543 TLI.setUnavailable(LibFunc::ntohl);
544 TLI.setUnavailable(LibFunc::ntohs);
545 TLI.setUnavailable(LibFunc::open);
546 TLI.setUnavailable(LibFunc::opendir);
547 TLI.setUnavailable(LibFunc::pclose);
548 TLI.setUnavailable(LibFunc::popen);
549 TLI.setUnavailable(LibFunc::pread);
550 TLI.setUnavailable(LibFunc::pwrite);
551 TLI.setUnavailable(LibFunc::read);
552 TLI.setUnavailable(LibFunc::readlink);
553 TLI.setUnavailable(LibFunc::realpath);
554 TLI.setUnavailable(LibFunc::rmdir);
555 TLI.setUnavailable(LibFunc::setitimer);
556 TLI.setUnavailable(LibFunc::stat);
557 TLI.setUnavailable(LibFunc::statvfs);
558 TLI.setUnavailable(LibFunc::stpcpy);
559 TLI.setUnavailable(LibFunc::stpncpy);
560 TLI.setUnavailable(LibFunc::strcasecmp);
561 TLI.setUnavailable(LibFunc::strncasecmp);
562 TLI.setUnavailable(LibFunc::times);
563 TLI.setUnavailable(LibFunc::uname);
564 TLI.setUnavailable(LibFunc::unlink);
565 TLI.setUnavailable(LibFunc::unsetenv);
566 TLI.setUnavailable(LibFunc::utime);
567 TLI.setUnavailable(LibFunc::utimes);
568 TLI.setUnavailable(LibFunc::write);
Meador Inge780a1862012-11-22 15:36:42 +0000569
Meador Ingeb904e6e2013-03-05 21:47:40 +0000570 // Win32 does *not* provide provide these functions, but they are
571 // specified by C99:
572 TLI.setUnavailable(LibFunc::atoll);
573 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge780a1862012-11-22 15:36:42 +0000574 TLI.setUnavailable(LibFunc::llabs);
575 }
576
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000577 // exp10, exp10f, exp10l is available on at least Linux (GLIBC)
578 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
579 // and their names are __exp10 and __exp10f. exp10l is not available on
580 // OS X or iOS.
581 switch (T.getOS()) {
582 case Triple::Linux:
583 break;
584 case Triple::MacOSX:
585 TLI.setUnavailable(LibFunc::exp10l);
586 if (T.isMacOSXVersionLT(10, 9)) {
587 TLI.setUnavailable(LibFunc::exp10);
588 TLI.setUnavailable(LibFunc::exp10f);
589 } else {
590 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
591 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
592 }
593 break;
594 case Triple::IOS:
595 TLI.setUnavailable(LibFunc::exp10l);
596 if (T.isOSVersionLT(7, 0)) {
597 TLI.setUnavailable(LibFunc::exp10);
598 TLI.setUnavailable(LibFunc::exp10f);
599 } else {
600 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
601 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
602 }
603 break;
604 default:
605 TLI.setUnavailable(LibFunc::exp10);
606 TLI.setUnavailable(LibFunc::exp10f);
607 TLI.setUnavailable(LibFunc::exp10l);
608 }
609
Meador Inge780a1862012-11-22 15:36:42 +0000610 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
611 // Linux (GLIBC):
612 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
613 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
614 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
615 switch (T.getOS()) {
616 case Triple::Darwin:
617 case Triple::MacOSX:
618 case Triple::IOS:
619 case Triple::FreeBSD:
620 case Triple::Linux:
621 break;
622 default:
623 TLI.setUnavailable(LibFunc::ffsl);
624 }
625
626 // ffsll is available on at least FreeBSD and Linux (GLIBC):
627 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
628 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
629 switch (T.getOS()) {
630 case Triple::FreeBSD:
631 case Triple::Linux:
632 break;
633 default:
634 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000635 }
Meador Ingeb904e6e2013-03-05 21:47:40 +0000636
637 // The following functions are available on at least Linux:
Cameron Esfahani943908b2013-08-29 20:23:14 +0000638 if (!T.isOSLinux()) {
Meador Ingeb904e6e2013-03-05 21:47:40 +0000639 TLI.setUnavailable(LibFunc::dunder_strdup);
640 TLI.setUnavailable(LibFunc::dunder_strtok_r);
641 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
642 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
643 TLI.setUnavailable(LibFunc::under_IO_getc);
644 TLI.setUnavailable(LibFunc::under_IO_putc);
645 TLI.setUnavailable(LibFunc::memalign);
646 TLI.setUnavailable(LibFunc::fopen64);
647 TLI.setUnavailable(LibFunc::fseeko64);
648 TLI.setUnavailable(LibFunc::fstat64);
649 TLI.setUnavailable(LibFunc::fstatvfs64);
650 TLI.setUnavailable(LibFunc::ftello64);
651 TLI.setUnavailable(LibFunc::lstat64);
652 TLI.setUnavailable(LibFunc::open64);
653 TLI.setUnavailable(LibFunc::stat64);
654 TLI.setUnavailable(LibFunc::statvfs64);
655 TLI.setUnavailable(LibFunc::tmpfile64);
656 }
Chris Lattner0e125bb2011-02-18 21:50:34 +0000657}
658
659
660TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
661 // Default to everything being available.
662 memset(AvailableArray, -1, sizeof(AvailableArray));
663
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000664 initialize(*this, Triple(), StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000665}
666
667TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
668 // Default to everything being available.
669 memset(AvailableArray, -1, sizeof(AvailableArray));
670
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000671 initialize(*this, T, StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000672}
Chris Lattner1341df92011-02-18 22:34:03 +0000673
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000674TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
675 : ImmutablePass(ID) {
676 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman489c0ff2011-11-17 01:27:36 +0000677 CustomNames = TLI.CustomNames;
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000678}
679
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000680namespace {
681struct StringComparator {
682 /// Compare two strings and return true if LHS is lexicographically less than
683 /// RHS. Requires that RHS doesn't contain any zero bytes.
684 bool operator()(const char *LHS, StringRef RHS) const {
685 // Compare prefixes with strncmp. If prefixes match we know that LHS is
686 // greater or equal to RHS as RHS can't contain any '\0'.
687 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
688 }
689
690 // Provided for compatibility with MSVC's debug mode.
691 bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
692 bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
Benjamin Kramerdfbcba52013-03-13 13:50:47 +0000693 bool operator()(const char *LHS, const char *RHS) const {
694 return std::strcmp(LHS, RHS) < 0;
695 }
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000696};
697}
698
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000699bool TargetLibraryInfo::getLibFunc(StringRef funcName,
700 LibFunc::Func &F) const {
701 const char **Start = &StandardNames[0];
702 const char **End = &StandardNames[LibFunc::NumLibFuncs];
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000703
704 // Filter out empty names and names containing null bytes, those can't be in
705 // our table.
706 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
707 return false;
708
Meador Ingeb904e6e2013-03-05 21:47:40 +0000709 // Check for \01 prefix that is used to mangle __asm declarations and
710 // strip it if present.
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000711 if (funcName.front() == '\01')
Meador Ingeb904e6e2013-03-05 21:47:40 +0000712 funcName = funcName.substr(1);
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000713 const char **I = std::lower_bound(Start, End, funcName, StringComparator());
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000714 if (I != End && *I == funcName) {
715 F = (LibFunc::Func)(I - Start);
716 return true;
717 }
718 return false;
719}
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000720
Chris Lattner1341df92011-02-18 22:34:03 +0000721/// disableAllFunctions - This disables all builtins, which is used for options
722/// like -fno-builtin.
723void TargetLibraryInfo::disableAllFunctions() {
724 memset(AvailableArray, 0, sizeof(AvailableArray));
725}