blob: 972f7cb8f2f8f480408a1cb84039bd1781f60a2d [file] [log] [blame]
Chris Lattnerce991202011-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 Blaikie2d24e2a2011-12-20 02:50:00 +000023void TargetLibraryInfo::anchor() { }
24
Eli Friedman9d434db2011-11-17 01:27:36 +000025const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
26 {
Meador Ingecf705902013-03-05 21:47:40 +000027 "_IO_getc",
28 "_IO_putc",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +000029 "_ZdaPv",
Richard Smith72c83312013-07-21 23:11:42 +000030 "_ZdaPvRKSt9nothrow_t",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +000031 "_ZdlPv",
Richard Smith72c83312013-07-21 23:11:42 +000032 "_ZdlPvRKSt9nothrow_t",
Benjamin Kramer8e0d1c02012-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 Wilsond1e672e2012-08-03 04:06:22 +000041 "__cxa_atexit",
42 "__cxa_guard_abort",
43 "__cxa_guard_acquire",
44 "__cxa_guard_release",
Meador Ingecf705902013-03-05 21:47:40 +000045 "__isoc99_scanf",
46 "__isoc99_sscanf",
Bob Wilsond1e672e2012-08-03 04:06:22 +000047 "__memcpy_chk",
Preston Gurdb704d232013-05-27 15:44:35 +000048 "__sqrt_finite",
49 "__sqrtf_finite",
50 "__sqrtl_finite",
Meador Ingecf705902013-03-05 21:47:40 +000051 "__strdup",
52 "__strndup",
53 "__strtok_r",
Meador Inge6098c6b2012-11-22 15:36:42 +000054 "abs",
Meador Ingecf705902013-03-05 21:47:40 +000055 "access",
Chad Rosier8ff41152011-11-30 19:19:00 +000056 "acos",
Chad Rosier8ff41152011-11-30 19:19:00 +000057 "acosf",
Chad Rosier6871d1e2012-08-21 23:28:56 +000058 "acosh",
59 "acoshf",
60 "acoshl",
Bob Wilsond1e672e2012-08-03 04:06:22 +000061 "acosl",
Chad Rosier8ff41152011-11-30 19:19:00 +000062 "asin",
Chad Rosier8ff41152011-11-30 19:19:00 +000063 "asinf",
Chad Rosier6871d1e2012-08-21 23:28:56 +000064 "asinh",
65 "asinhf",
66 "asinhl",
Bob Wilsond1e672e2012-08-03 04:06:22 +000067 "asinl",
Chad Rosier8ff41152011-11-30 19:19:00 +000068 "atan",
Chad Rosier32b6c592011-12-01 17:54:37 +000069 "atan2",
Chad Rosier32b6c592011-12-01 17:54:37 +000070 "atan2f",
Bob Wilsond1e672e2012-08-03 04:06:22 +000071 "atan2l",
72 "atanf",
Chad Rosier6871d1e2012-08-21 23:28:56 +000073 "atanh",
74 "atanhf",
75 "atanhl",
Bob Wilsond1e672e2012-08-03 04:06:22 +000076 "atanl",
Meador Ingecf705902013-03-05 21:47:40 +000077 "atof",
78 "atoi",
79 "atol",
80 "atoll",
81 "bcmp",
82 "bcopy",
83 "bzero",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +000084 "calloc",
Chad Rosier6871d1e2012-08-21 23:28:56 +000085 "cbrt",
86 "cbrtf",
87 "cbrtl",
Chad Rosier8ff41152011-11-30 19:19:00 +000088 "ceil",
Chad Rosier8ff41152011-11-30 19:19:00 +000089 "ceilf",
Bob Wilsond1e672e2012-08-03 04:06:22 +000090 "ceill",
Meador Ingecf705902013-03-05 21:47:40 +000091 "chmod",
92 "chown",
93 "clearerr",
94 "closedir",
Owen Anderson243eb9e2011-12-08 22:15:21 +000095 "copysign",
96 "copysignf",
97 "copysignl",
Chad Rosier8ff41152011-11-30 19:19:00 +000098 "cos",
Chad Rosier8ff41152011-11-30 19:19:00 +000099 "cosf",
100 "cosh",
Chad Rosier8ff41152011-11-30 19:19:00 +0000101 "coshf",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000102 "coshl",
103 "cosl",
Meador Ingecf705902013-03-05 21:47:40 +0000104 "ctermid",
Chad Rosier8ff41152011-11-30 19:19:00 +0000105 "exp",
Chad Rosier6871d1e2012-08-21 23:28:56 +0000106 "exp10",
107 "exp10f",
108 "exp10l",
Chad Rosier8ff41152011-11-30 19:19:00 +0000109 "exp2",
Chad Rosier8ff41152011-11-30 19:19:00 +0000110 "exp2f",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000111 "exp2l",
112 "expf",
113 "expl",
Chad Rosier8ff41152011-11-30 19:19:00 +0000114 "expm1",
Joe Groffd5bda5e2012-04-17 23:05:54 +0000115 "expm1f",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000116 "expm1l",
Chad Rosier8ff41152011-11-30 19:19:00 +0000117 "fabs",
Chad Rosier8ff41152011-11-30 19:19:00 +0000118 "fabsf",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000119 "fabsl",
Meador Ingecf705902013-03-05 21:47:40 +0000120 "fclose",
121 "fdopen",
122 "feof",
123 "ferror",
124 "fflush",
Meador Inge6098c6b2012-11-22 15:36:42 +0000125 "ffs",
126 "ffsl",
127 "ffsll",
Meador Ingecf705902013-03-05 21:47:40 +0000128 "fgetc",
129 "fgetpos",
130 "fgets",
131 "fileno",
Chad Rosier683e47b2011-11-30 01:51:49 +0000132 "fiprintf",
Meador Ingecf705902013-03-05 21:47:40 +0000133 "flockfile",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000134 "floor",
135 "floorf",
136 "floorl",
Chad Rosier32b6c592011-12-01 17:54:37 +0000137 "fmod",
Chad Rosier32b6c592011-12-01 17:54:37 +0000138 "fmodf",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000139 "fmodl",
Meador Ingecf705902013-03-05 21:47:40 +0000140 "fopen",
141 "fopen64",
Meador Inge6098c6b2012-11-22 15:36:42 +0000142 "fprintf",
Nuno Lopes8d324632012-07-24 21:00:36 +0000143 "fputc",
Chad Rosier683e47b2011-11-30 01:51:49 +0000144 "fputs",
Meador Ingecf705902013-03-05 21:47:40 +0000145 "fread",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +0000146 "free",
Meador Ingecf705902013-03-05 21:47:40 +0000147 "frexp",
148 "frexpf",
149 "frexpl",
150 "fscanf",
151 "fseek",
152 "fseeko",
153 "fseeko64",
154 "fsetpos",
155 "fstat",
156 "fstat64",
157 "fstatvfs",
158 "fstatvfs64",
159 "ftell",
160 "ftello",
161 "ftello64",
162 "ftrylockfile",
163 "funlockfile",
Chad Rosier683e47b2011-11-30 01:51:49 +0000164 "fwrite",
Meador Ingecf705902013-03-05 21:47:40 +0000165 "getc",
166 "getc_unlocked",
167 "getchar",
168 "getenv",
169 "getitimer",
170 "getlogin_r",
171 "getpwnam",
172 "gets",
Michael Gottesmanf0f85ea2013-07-03 04:00:51 +0000173 "gettimeofday",
Meador Ingecf705902013-03-05 21:47:40 +0000174 "htonl",
175 "htons",
Chad Rosier683e47b2011-11-30 01:51:49 +0000176 "iprintf",
Meador Inge6098c6b2012-11-22 15:36:42 +0000177 "isascii",
178 "isdigit",
179 "labs",
Meador Ingecf705902013-03-05 21:47:40 +0000180 "lchown",
Meador Inge6098c6b2012-11-22 15:36:42 +0000181 "llabs",
Chad Rosier8ff41152011-11-30 19:19:00 +0000182 "log",
Chad Rosier8ff41152011-11-30 19:19:00 +0000183 "log10",
Chad Rosier8ff41152011-11-30 19:19:00 +0000184 "log10f",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000185 "log10l",
Chad Rosier8ff41152011-11-30 19:19:00 +0000186 "log1p",
Chad Rosier8ff41152011-11-30 19:19:00 +0000187 "log1pf",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000188 "log1pl",
189 "log2",
190 "log2f",
191 "log2l",
Chad Rosier6871d1e2012-08-21 23:28:56 +0000192 "logb",
193 "logbf",
194 "logbl",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000195 "logf",
196 "logl",
Meador Ingecf705902013-03-05 21:47:40 +0000197 "lstat",
198 "lstat64",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +0000199 "malloc",
Meador Ingecf705902013-03-05 21:47:40 +0000200 "memalign",
201 "memccpy",
Nuno Lopes8d324632012-07-24 21:00:36 +0000202 "memchr",
203 "memcmp",
Eli Friedman9d434db2011-11-17 01:27:36 +0000204 "memcpy",
205 "memmove",
Meador Ingecf705902013-03-05 21:47:40 +0000206 "memrchr",
Chad Rosier683e47b2011-11-30 01:51:49 +0000207 "memset",
Eli Friedman9d434db2011-11-17 01:27:36 +0000208 "memset_pattern16",
Meador Ingecf705902013-03-05 21:47:40 +0000209 "mkdir",
210 "mktime",
211 "modf",
212 "modff",
213 "modfl",
Owen Anderson243eb9e2011-12-08 22:15:21 +0000214 "nearbyint",
215 "nearbyintf",
216 "nearbyintl",
Meador Ingecf705902013-03-05 21:47:40 +0000217 "ntohl",
218 "ntohs",
219 "open",
220 "open64",
221 "opendir",
222 "pclose",
223 "perror",
224 "popen",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +0000225 "posix_memalign",
Chad Rosier8ff41152011-11-30 19:19:00 +0000226 "pow",
227 "powf",
228 "powl",
Meador Ingecf705902013-03-05 21:47:40 +0000229 "pread",
Meador Inge6098c6b2012-11-22 15:36:42 +0000230 "printf",
Meador Ingecf705902013-03-05 21:47:40 +0000231 "putc",
Nuno Lopes8d324632012-07-24 21:00:36 +0000232 "putchar",
233 "puts",
Meador Ingecf705902013-03-05 21:47:40 +0000234 "pwrite",
235 "qsort",
236 "read",
237 "readlink",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +0000238 "realloc",
239 "reallocf",
Meador Ingecf705902013-03-05 21:47:40 +0000240 "realpath",
241 "remove",
242 "rename",
243 "rewind",
Owen Anderson243eb9e2011-12-08 22:15:21 +0000244 "rint",
245 "rintf",
246 "rintl",
Meador Ingecf705902013-03-05 21:47:40 +0000247 "rmdir",
Joe Groffd5bda5e2012-04-17 23:05:54 +0000248 "round",
249 "roundf",
250 "roundl",
Meador Ingecf705902013-03-05 21:47:40 +0000251 "scanf",
252 "setbuf",
253 "setitimer",
254 "setvbuf",
Chad Rosier32b6c592011-12-01 17:54:37 +0000255 "sin",
Chad Rosier32b6c592011-12-01 17:54:37 +0000256 "sinf",
Chad Rosierfbd828d2011-12-01 18:26:19 +0000257 "sinh",
Chad Rosierfbd828d2011-12-01 18:26:19 +0000258 "sinhf",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000259 "sinhl",
260 "sinl",
Chad Rosierfbd828d2011-12-01 18:26:19 +0000261 "siprintf",
Meador Ingecf705902013-03-05 21:47:40 +0000262 "snprintf",
Meador Inge6098c6b2012-11-22 15:36:42 +0000263 "sprintf",
Chad Rosier3d925d22011-11-29 23:57:10 +0000264 "sqrt",
Chad Rosier32b6c592011-12-01 17:54:37 +0000265 "sqrtf",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000266 "sqrtl",
Meador Ingecf705902013-03-05 21:47:40 +0000267 "sscanf",
268 "stat",
269 "stat64",
270 "statvfs",
271 "statvfs64",
Meador Inge939f5002012-11-10 03:11:06 +0000272 "stpcpy",
Meador Ingecf705902013-03-05 21:47:40 +0000273 "stpncpy",
274 "strcasecmp",
Nuno Lopes0841e632012-07-24 17:25:06 +0000275 "strcat",
Nuno Lopes8d324632012-07-24 21:00:36 +0000276 "strchr",
Meador Inge939f5002012-11-10 03:11:06 +0000277 "strcmp",
Meador Ingecf705902013-03-05 21:47:40 +0000278 "strcoll",
Nuno Lopes0841e632012-07-24 17:25:06 +0000279 "strcpy",
Meador Inge939f5002012-11-10 03:11:06 +0000280 "strcspn",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +0000281 "strdup",
Nuno Lopes0841e632012-07-24 17:25:06 +0000282 "strlen",
Meador Ingecf705902013-03-05 21:47:40 +0000283 "strncasecmp",
Nuno Lopes0841e632012-07-24 17:25:06 +0000284 "strncat",
Nuno Lopes8d324632012-07-24 21:00:36 +0000285 "strncmp",
Nuno Lopes0841e632012-07-24 17:25:06 +0000286 "strncpy",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +0000287 "strndup",
Nuno Lopes0841e632012-07-24 17:25:06 +0000288 "strnlen",
Meador Inge939f5002012-11-10 03:11:06 +0000289 "strpbrk",
290 "strrchr",
291 "strspn",
292 "strstr",
293 "strtod",
294 "strtof",
Meador Ingecf705902013-03-05 21:47:40 +0000295 "strtok",
296 "strtok_r",
Meador Inge939f5002012-11-10 03:11:06 +0000297 "strtol",
298 "strtold",
299 "strtoll",
300 "strtoul",
301 "strtoull",
Meador Ingecf705902013-03-05 21:47:40 +0000302 "strxfrm",
303 "system",
Chad Rosier32b6c592011-12-01 17:54:37 +0000304 "tan",
Chad Rosier32b6c592011-12-01 17:54:37 +0000305 "tanf",
306 "tanh",
Owen Anderson243eb9e2011-12-08 22:15:21 +0000307 "tanhf",
Bob Wilsond1e672e2012-08-03 04:06:22 +0000308 "tanhl",
309 "tanl",
Meador Ingecf705902013-03-05 21:47:40 +0000310 "times",
311 "tmpfile",
312 "tmpfile64",
Meador Inge6098c6b2012-11-22 15:36:42 +0000313 "toascii",
Owen Anderson243eb9e2011-12-08 22:15:21 +0000314 "trunc",
315 "truncf",
Benjamin Kramer8e0d1c02012-08-29 15:32:21 +0000316 "truncl",
Meador Ingecf705902013-03-05 21:47:40 +0000317 "uname",
318 "ungetc",
319 "unlink",
320 "unsetenv",
321 "utime",
322 "utimes",
323 "valloc",
324 "vfprintf",
325 "vfscanf",
326 "vprintf",
327 "vscanf",
328 "vsnprintf",
329 "vsprintf",
330 "vsscanf",
331 "write"
Eli Friedman9d434db2011-11-17 01:27:36 +0000332 };
333
Chris Lattnerce991202011-02-18 21:50:34 +0000334/// initialize - Initialize the set of available library functions based on the
335/// specified target triple. This should be carefully written so that a missing
336/// target triple gets a sane set of defaults.
Bob Wilsond1e672e2012-08-03 04:06:22 +0000337static void initialize(TargetLibraryInfo &TLI, const Triple &T,
338 const char **StandardNames) {
Chris Lattnerce991202011-02-18 21:50:34 +0000339 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
340
Bob Wilsond1e672e2012-08-03 04:06:22 +0000341#ifndef NDEBUG
342 // Verify that the StandardNames array is in alphabetical order.
343 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
344 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
345 llvm_unreachable("TargetLibraryInfo function names must be sorted");
346 }
347#endif // !NDEBUG
Chris Lattnerce991202011-02-18 21:50:34 +0000348
349 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
Daniel Dunbar558692f2011-04-20 00:14:25 +0000350 if (T.isMacOSX()) {
351 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar13fb3b52011-04-19 20:44:08 +0000352 TLI.setUnavailable(LibFunc::memset_pattern16);
Cameron Esfahani441c5572013-08-29 20:23:14 +0000353 } else if (T.isiOS()) {
Daniel Dunbar13fb3b52011-04-19 20:44:08 +0000354 if (T.isOSVersionLT(3, 0))
355 TLI.setUnavailable(LibFunc::memset_pattern16);
356 } else {
Chris Lattnerce991202011-02-18 21:50:34 +0000357 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar13fb3b52011-04-19 20:44:08 +0000358 }
Richard Osborne36498242011-03-03 13:17:51 +0000359
Eli Friedman9d434db2011-11-17 01:27:36 +0000360 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
361 !T.isMacOSXVersionLT(10, 7)) {
362 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
363 // we don't care about) have two versions; on recent OSX, the one we want
364 // has a $UNIX2003 suffix. The two implementations are identical except
365 // for the return value in some edge cases. However, we don't want to
366 // generate code that depends on the old symbols.
367 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
368 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
369 }
370
Duncan Sands9fe88972011-06-09 11:11:45 +0000371 // iprintf and friends are only available on XCore and TCE.
372 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne36498242011-03-03 13:17:51 +0000373 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne419454a2011-03-03 14:09:28 +0000374 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborne022708f2011-03-03 14:20:22 +0000375 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne419454a2011-03-03 14:09:28 +0000376 }
Joe Groffd5bda5e2012-04-17 23:05:54 +0000377
378 if (T.getOS() == Triple::Win32) {
379 // Win32 does not support long double
380 TLI.setUnavailable(LibFunc::acosl);
381 TLI.setUnavailable(LibFunc::asinl);
382 TLI.setUnavailable(LibFunc::atanl);
383 TLI.setUnavailable(LibFunc::atan2l);
384 TLI.setUnavailable(LibFunc::ceill);
385 TLI.setUnavailable(LibFunc::copysignl);
386 TLI.setUnavailable(LibFunc::cosl);
387 TLI.setUnavailable(LibFunc::coshl);
388 TLI.setUnavailable(LibFunc::expl);
389 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
390 TLI.setUnavailable(LibFunc::fabsl);
391 TLI.setUnavailable(LibFunc::floorl);
392 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingecf705902013-03-05 21:47:40 +0000393 TLI.setUnavailable(LibFunc::frexpl);
Joe Groffd5bda5e2012-04-17 23:05:54 +0000394 TLI.setUnavailable(LibFunc::logl);
Meador Ingecf705902013-03-05 21:47:40 +0000395 TLI.setUnavailable(LibFunc::modfl);
Joe Groffd5bda5e2012-04-17 23:05:54 +0000396 TLI.setUnavailable(LibFunc::powl);
397 TLI.setUnavailable(LibFunc::sinl);
398 TLI.setUnavailable(LibFunc::sinhl);
399 TLI.setUnavailable(LibFunc::sqrtl);
400 TLI.setUnavailable(LibFunc::tanl);
401 TLI.setUnavailable(LibFunc::tanhl);
402
403 // Win32 only has C89 math
Chad Rosier6871d1e2012-08-21 23:28:56 +0000404 TLI.setUnavailable(LibFunc::acosh);
405 TLI.setUnavailable(LibFunc::acoshf);
406 TLI.setUnavailable(LibFunc::acoshl);
407 TLI.setUnavailable(LibFunc::asinh);
408 TLI.setUnavailable(LibFunc::asinhf);
409 TLI.setUnavailable(LibFunc::asinhl);
410 TLI.setUnavailable(LibFunc::atanh);
411 TLI.setUnavailable(LibFunc::atanhf);
412 TLI.setUnavailable(LibFunc::atanhl);
413 TLI.setUnavailable(LibFunc::cbrt);
414 TLI.setUnavailable(LibFunc::cbrtf);
415 TLI.setUnavailable(LibFunc::cbrtl);
416 TLI.setUnavailable(LibFunc::exp10);
417 TLI.setUnavailable(LibFunc::exp10f);
418 TLI.setUnavailable(LibFunc::exp10l);
Joe Groffd5bda5e2012-04-17 23:05:54 +0000419 TLI.setUnavailable(LibFunc::exp2);
420 TLI.setUnavailable(LibFunc::exp2f);
421 TLI.setUnavailable(LibFunc::exp2l);
422 TLI.setUnavailable(LibFunc::expm1);
423 TLI.setUnavailable(LibFunc::expm1f);
424 TLI.setUnavailable(LibFunc::expm1l);
425 TLI.setUnavailable(LibFunc::log2);
426 TLI.setUnavailable(LibFunc::log2f);
427 TLI.setUnavailable(LibFunc::log2l);
428 TLI.setUnavailable(LibFunc::log1p);
429 TLI.setUnavailable(LibFunc::log1pf);
430 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier6871d1e2012-08-21 23:28:56 +0000431 TLI.setUnavailable(LibFunc::logb);
432 TLI.setUnavailable(LibFunc::logbf);
433 TLI.setUnavailable(LibFunc::logbl);
Joe Groffd5bda5e2012-04-17 23:05:54 +0000434 TLI.setUnavailable(LibFunc::nearbyint);
435 TLI.setUnavailable(LibFunc::nearbyintf);
436 TLI.setUnavailable(LibFunc::nearbyintl);
437 TLI.setUnavailable(LibFunc::rint);
438 TLI.setUnavailable(LibFunc::rintf);
439 TLI.setUnavailable(LibFunc::rintl);
440 TLI.setUnavailable(LibFunc::round);
441 TLI.setUnavailable(LibFunc::roundf);
442 TLI.setUnavailable(LibFunc::roundl);
443 TLI.setUnavailable(LibFunc::trunc);
444 TLI.setUnavailable(LibFunc::truncf);
445 TLI.setUnavailable(LibFunc::truncl);
446
447 // Win32 provides some C99 math with mangled names
448 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
449
450 if (T.getArch() == Triple::x86) {
451 // Win32 on x86 implements single-precision math functions as macros
452 TLI.setUnavailable(LibFunc::acosf);
453 TLI.setUnavailable(LibFunc::asinf);
454 TLI.setUnavailable(LibFunc::atanf);
455 TLI.setUnavailable(LibFunc::atan2f);
456 TLI.setUnavailable(LibFunc::ceilf);
457 TLI.setUnavailable(LibFunc::copysignf);
458 TLI.setUnavailable(LibFunc::cosf);
459 TLI.setUnavailable(LibFunc::coshf);
460 TLI.setUnavailable(LibFunc::expf);
461 TLI.setUnavailable(LibFunc::floorf);
462 TLI.setUnavailable(LibFunc::fmodf);
463 TLI.setUnavailable(LibFunc::logf);
464 TLI.setUnavailable(LibFunc::powf);
465 TLI.setUnavailable(LibFunc::sinf);
466 TLI.setUnavailable(LibFunc::sinhf);
467 TLI.setUnavailable(LibFunc::sqrtf);
468 TLI.setUnavailable(LibFunc::tanf);
469 TLI.setUnavailable(LibFunc::tanhf);
470 }
Meador Inge939f5002012-11-10 03:11:06 +0000471
Meador Ingecf705902013-03-05 21:47:40 +0000472 // Win32 does *not* provide provide these functions, but they are
473 // generally available on POSIX-compliant systems:
474 TLI.setUnavailable(LibFunc::access);
475 TLI.setUnavailable(LibFunc::bcmp);
476 TLI.setUnavailable(LibFunc::bcopy);
477 TLI.setUnavailable(LibFunc::bzero);
478 TLI.setUnavailable(LibFunc::chmod);
479 TLI.setUnavailable(LibFunc::chown);
480 TLI.setUnavailable(LibFunc::closedir);
481 TLI.setUnavailable(LibFunc::ctermid);
482 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge6098c6b2012-11-22 15:36:42 +0000483 TLI.setUnavailable(LibFunc::ffs);
Meador Ingecf705902013-03-05 21:47:40 +0000484 TLI.setUnavailable(LibFunc::fileno);
485 TLI.setUnavailable(LibFunc::flockfile);
486 TLI.setUnavailable(LibFunc::fseeko);
487 TLI.setUnavailable(LibFunc::fstat);
488 TLI.setUnavailable(LibFunc::fstatvfs);
489 TLI.setUnavailable(LibFunc::ftello);
490 TLI.setUnavailable(LibFunc::ftrylockfile);
491 TLI.setUnavailable(LibFunc::funlockfile);
492 TLI.setUnavailable(LibFunc::getc_unlocked);
493 TLI.setUnavailable(LibFunc::getitimer);
494 TLI.setUnavailable(LibFunc::getlogin_r);
495 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf0f85ea2013-07-03 04:00:51 +0000496 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingecf705902013-03-05 21:47:40 +0000497 TLI.setUnavailable(LibFunc::htonl);
498 TLI.setUnavailable(LibFunc::htons);
499 TLI.setUnavailable(LibFunc::lchown);
500 TLI.setUnavailable(LibFunc::lstat);
501 TLI.setUnavailable(LibFunc::memccpy);
502 TLI.setUnavailable(LibFunc::mkdir);
503 TLI.setUnavailable(LibFunc::ntohl);
504 TLI.setUnavailable(LibFunc::ntohs);
505 TLI.setUnavailable(LibFunc::open);
506 TLI.setUnavailable(LibFunc::opendir);
507 TLI.setUnavailable(LibFunc::pclose);
508 TLI.setUnavailable(LibFunc::popen);
509 TLI.setUnavailable(LibFunc::pread);
510 TLI.setUnavailable(LibFunc::pwrite);
511 TLI.setUnavailable(LibFunc::read);
512 TLI.setUnavailable(LibFunc::readlink);
513 TLI.setUnavailable(LibFunc::realpath);
514 TLI.setUnavailable(LibFunc::rmdir);
515 TLI.setUnavailable(LibFunc::setitimer);
516 TLI.setUnavailable(LibFunc::stat);
517 TLI.setUnavailable(LibFunc::statvfs);
518 TLI.setUnavailable(LibFunc::stpcpy);
519 TLI.setUnavailable(LibFunc::stpncpy);
520 TLI.setUnavailable(LibFunc::strcasecmp);
521 TLI.setUnavailable(LibFunc::strncasecmp);
522 TLI.setUnavailable(LibFunc::times);
523 TLI.setUnavailable(LibFunc::uname);
524 TLI.setUnavailable(LibFunc::unlink);
525 TLI.setUnavailable(LibFunc::unsetenv);
526 TLI.setUnavailable(LibFunc::utime);
527 TLI.setUnavailable(LibFunc::utimes);
528 TLI.setUnavailable(LibFunc::write);
Meador Inge6098c6b2012-11-22 15:36:42 +0000529
Meador Ingecf705902013-03-05 21:47:40 +0000530 // Win32 does *not* provide provide these functions, but they are
531 // specified by C99:
532 TLI.setUnavailable(LibFunc::atoll);
533 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge6098c6b2012-11-22 15:36:42 +0000534 TLI.setUnavailable(LibFunc::llabs);
535 }
536
537 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
538 // Linux (GLIBC):
539 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
540 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
541 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
542 switch (T.getOS()) {
543 case Triple::Darwin:
544 case Triple::MacOSX:
545 case Triple::IOS:
546 case Triple::FreeBSD:
547 case Triple::Linux:
548 break;
549 default:
550 TLI.setUnavailable(LibFunc::ffsl);
551 }
552
553 // ffsll is available on at least FreeBSD and Linux (GLIBC):
554 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
555 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
556 switch (T.getOS()) {
557 case Triple::FreeBSD:
558 case Triple::Linux:
559 break;
560 default:
561 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffd5bda5e2012-04-17 23:05:54 +0000562 }
Meador Ingecf705902013-03-05 21:47:40 +0000563
564 // The following functions are available on at least Linux:
Cameron Esfahani441c5572013-08-29 20:23:14 +0000565 if (!T.isOSLinux()) {
Meador Ingecf705902013-03-05 21:47:40 +0000566 TLI.setUnavailable(LibFunc::dunder_strdup);
567 TLI.setUnavailable(LibFunc::dunder_strtok_r);
568 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
569 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
570 TLI.setUnavailable(LibFunc::under_IO_getc);
571 TLI.setUnavailable(LibFunc::under_IO_putc);
572 TLI.setUnavailable(LibFunc::memalign);
573 TLI.setUnavailable(LibFunc::fopen64);
574 TLI.setUnavailable(LibFunc::fseeko64);
575 TLI.setUnavailable(LibFunc::fstat64);
576 TLI.setUnavailable(LibFunc::fstatvfs64);
577 TLI.setUnavailable(LibFunc::ftello64);
578 TLI.setUnavailable(LibFunc::lstat64);
579 TLI.setUnavailable(LibFunc::open64);
580 TLI.setUnavailable(LibFunc::stat64);
581 TLI.setUnavailable(LibFunc::statvfs64);
582 TLI.setUnavailable(LibFunc::tmpfile64);
583 }
Chris Lattnerce991202011-02-18 21:50:34 +0000584}
585
586
587TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
588 // Default to everything being available.
589 memset(AvailableArray, -1, sizeof(AvailableArray));
590
Bob Wilsond1e672e2012-08-03 04:06:22 +0000591 initialize(*this, Triple(), StandardNames);
Chris Lattnerce991202011-02-18 21:50:34 +0000592}
593
594TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
595 // Default to everything being available.
596 memset(AvailableArray, -1, sizeof(AvailableArray));
597
Bob Wilsond1e672e2012-08-03 04:06:22 +0000598 initialize(*this, T, StandardNames);
Chris Lattnerce991202011-02-18 21:50:34 +0000599}
Chris Lattner188a7e02011-02-18 22:34:03 +0000600
Chris Lattner40f5fbc2011-05-21 20:09:13 +0000601TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
602 : ImmutablePass(ID) {
603 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman9d434db2011-11-17 01:27:36 +0000604 CustomNames = TLI.CustomNames;
Chris Lattner40f5fbc2011-05-21 20:09:13 +0000605}
606
Benjamin Kramer576f62c2013-03-09 13:48:23 +0000607namespace {
608struct StringComparator {
609 /// Compare two strings and return true if LHS is lexicographically less than
610 /// RHS. Requires that RHS doesn't contain any zero bytes.
611 bool operator()(const char *LHS, StringRef RHS) const {
612 // Compare prefixes with strncmp. If prefixes match we know that LHS is
613 // greater or equal to RHS as RHS can't contain any '\0'.
614 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
615 }
616
617 // Provided for compatibility with MSVC's debug mode.
618 bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
619 bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
Benjamin Kramerdec29b62013-03-13 13:50:47 +0000620 bool operator()(const char *LHS, const char *RHS) const {
621 return std::strcmp(LHS, RHS) < 0;
622 }
Benjamin Kramer576f62c2013-03-09 13:48:23 +0000623};
624}
625
Bob Wilsond1e672e2012-08-03 04:06:22 +0000626bool TargetLibraryInfo::getLibFunc(StringRef funcName,
627 LibFunc::Func &F) const {
628 const char **Start = &StandardNames[0];
629 const char **End = &StandardNames[LibFunc::NumLibFuncs];
Benjamin Kramer576f62c2013-03-09 13:48:23 +0000630
631 // Filter out empty names and names containing null bytes, those can't be in
632 // our table.
633 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
634 return false;
635
Meador Ingecf705902013-03-05 21:47:40 +0000636 // Check for \01 prefix that is used to mangle __asm declarations and
637 // strip it if present.
Benjamin Kramer576f62c2013-03-09 13:48:23 +0000638 if (funcName.front() == '\01')
Meador Ingecf705902013-03-05 21:47:40 +0000639 funcName = funcName.substr(1);
Benjamin Kramer576f62c2013-03-09 13:48:23 +0000640 const char **I = std::lower_bound(Start, End, funcName, StringComparator());
Bob Wilsond1e672e2012-08-03 04:06:22 +0000641 if (I != End && *I == funcName) {
642 F = (LibFunc::Func)(I - Start);
643 return true;
644 }
645 return false;
646}
Chris Lattner40f5fbc2011-05-21 20:09:13 +0000647
Chris Lattner188a7e02011-02-18 22:34:03 +0000648/// disableAllFunctions - This disables all builtins, which is used for options
649/// like -fno-builtin.
650void TargetLibraryInfo::disableAllFunctions() {
651 memset(AvailableArray, 0, sizeof(AvailableArray));
652}