blob: 99fff59535d03a62be963a075b9c31c18c041ee5 [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",
30 "_ZdlPv",
31 "_Znaj",
32 "_ZnajRKSt9nothrow_t",
33 "_Znam",
34 "_ZnamRKSt9nothrow_t",
35 "_Znwj",
36 "_ZnwjRKSt9nothrow_t",
37 "_Znwm",
38 "_ZnwmRKSt9nothrow_t",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000039 "__cxa_atexit",
40 "__cxa_guard_abort",
41 "__cxa_guard_acquire",
42 "__cxa_guard_release",
Meador Ingeb904e6e2013-03-05 21:47:40 +000043 "__isoc99_scanf",
44 "__isoc99_sscanf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000045 "__memcpy_chk",
Preston Gurd048f99d2013-05-27 15:44:35 +000046 "__sqrt_finite",
47 "__sqrtf_finite",
48 "__sqrtl_finite",
Meador Ingeb904e6e2013-03-05 21:47:40 +000049 "__strdup",
50 "__strndup",
51 "__strtok_r",
Meador Inge780a1862012-11-22 15:36:42 +000052 "abs",
Meador Ingeb904e6e2013-03-05 21:47:40 +000053 "access",
Chad Rosier738da252011-11-30 19:19:00 +000054 "acos",
Chad Rosier738da252011-11-30 19:19:00 +000055 "acosf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000056 "acosh",
57 "acoshf",
58 "acoshl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000059 "acosl",
Chad Rosier738da252011-11-30 19:19:00 +000060 "asin",
Chad Rosier738da252011-11-30 19:19:00 +000061 "asinf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000062 "asinh",
63 "asinhf",
64 "asinhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000065 "asinl",
Chad Rosier738da252011-11-30 19:19:00 +000066 "atan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000067 "atan2",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000068 "atan2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000069 "atan2l",
70 "atanf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000071 "atanh",
72 "atanhf",
73 "atanhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000074 "atanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +000075 "atof",
76 "atoi",
77 "atol",
78 "atoll",
79 "bcmp",
80 "bcopy",
81 "bzero",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000082 "calloc",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000083 "cbrt",
84 "cbrtf",
85 "cbrtl",
Chad Rosier738da252011-11-30 19:19:00 +000086 "ceil",
Chad Rosier738da252011-11-30 19:19:00 +000087 "ceilf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000088 "ceill",
Meador Ingeb904e6e2013-03-05 21:47:40 +000089 "chmod",
90 "chown",
91 "clearerr",
92 "closedir",
Owen Andersonbb15fec2011-12-08 22:15:21 +000093 "copysign",
94 "copysignf",
95 "copysignl",
Chad Rosier738da252011-11-30 19:19:00 +000096 "cos",
Chad Rosier738da252011-11-30 19:19:00 +000097 "cosf",
98 "cosh",
Chad Rosier738da252011-11-30 19:19:00 +000099 "coshf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000100 "coshl",
101 "cosl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000102 "ctermid",
Chad Rosier738da252011-11-30 19:19:00 +0000103 "exp",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000104 "exp10",
105 "exp10f",
106 "exp10l",
Chad Rosier738da252011-11-30 19:19:00 +0000107 "exp2",
Chad Rosier738da252011-11-30 19:19:00 +0000108 "exp2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000109 "exp2l",
110 "expf",
111 "expl",
Chad Rosier738da252011-11-30 19:19:00 +0000112 "expm1",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000113 "expm1f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000114 "expm1l",
Chad Rosier738da252011-11-30 19:19:00 +0000115 "fabs",
Chad Rosier738da252011-11-30 19:19:00 +0000116 "fabsf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000117 "fabsl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000118 "fclose",
119 "fdopen",
120 "feof",
121 "ferror",
122 "fflush",
Meador Inge780a1862012-11-22 15:36:42 +0000123 "ffs",
124 "ffsl",
125 "ffsll",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000126 "fgetc",
127 "fgetpos",
128 "fgets",
129 "fileno",
Chad Rosierabba0942011-11-30 01:51:49 +0000130 "fiprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000131 "flockfile",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000132 "floor",
133 "floorf",
134 "floorl",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000135 "fmod",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000136 "fmodf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000137 "fmodl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000138 "fopen",
139 "fopen64",
Meador Inge780a1862012-11-22 15:36:42 +0000140 "fprintf",
Nuno Lopes342cf782012-07-24 21:00:36 +0000141 "fputc",
Chad Rosierabba0942011-11-30 01:51:49 +0000142 "fputs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000143 "fread",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000144 "free",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000145 "frexp",
146 "frexpf",
147 "frexpl",
148 "fscanf",
149 "fseek",
150 "fseeko",
151 "fseeko64",
152 "fsetpos",
153 "fstat",
154 "fstat64",
155 "fstatvfs",
156 "fstatvfs64",
157 "ftell",
158 "ftello",
159 "ftello64",
160 "ftrylockfile",
161 "funlockfile",
Chad Rosierabba0942011-11-30 01:51:49 +0000162 "fwrite",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000163 "getc",
164 "getc_unlocked",
165 "getchar",
166 "getenv",
167 "getitimer",
168 "getlogin_r",
169 "getpwnam",
170 "gets",
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000171 "gettimeofday",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000172 "htonl",
173 "htons",
Chad Rosierabba0942011-11-30 01:51:49 +0000174 "iprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000175 "isascii",
176 "isdigit",
177 "labs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000178 "lchown",
Meador Inge780a1862012-11-22 15:36:42 +0000179 "llabs",
Chad Rosier738da252011-11-30 19:19:00 +0000180 "log",
Chad Rosier738da252011-11-30 19:19:00 +0000181 "log10",
Chad Rosier738da252011-11-30 19:19:00 +0000182 "log10f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000183 "log10l",
Chad Rosier738da252011-11-30 19:19:00 +0000184 "log1p",
Chad Rosier738da252011-11-30 19:19:00 +0000185 "log1pf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000186 "log1pl",
187 "log2",
188 "log2f",
189 "log2l",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000190 "logb",
191 "logbf",
192 "logbl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000193 "logf",
194 "logl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000195 "lstat",
196 "lstat64",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000197 "malloc",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000198 "memalign",
199 "memccpy",
Nuno Lopes342cf782012-07-24 21:00:36 +0000200 "memchr",
201 "memcmp",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000202 "memcpy",
203 "memmove",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000204 "memrchr",
Chad Rosierabba0942011-11-30 01:51:49 +0000205 "memset",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000206 "memset_pattern16",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000207 "mkdir",
208 "mktime",
209 "modf",
210 "modff",
211 "modfl",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000212 "nearbyint",
213 "nearbyintf",
214 "nearbyintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000215 "ntohl",
216 "ntohs",
217 "open",
218 "open64",
219 "opendir",
220 "pclose",
221 "perror",
222 "popen",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000223 "posix_memalign",
Chad Rosier738da252011-11-30 19:19:00 +0000224 "pow",
225 "powf",
226 "powl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000227 "pread",
Meador Inge780a1862012-11-22 15:36:42 +0000228 "printf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000229 "putc",
Nuno Lopes342cf782012-07-24 21:00:36 +0000230 "putchar",
231 "puts",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000232 "pwrite",
233 "qsort",
234 "read",
235 "readlink",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000236 "realloc",
237 "reallocf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000238 "realpath",
239 "remove",
240 "rename",
241 "rewind",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000242 "rint",
243 "rintf",
244 "rintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000245 "rmdir",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000246 "round",
247 "roundf",
248 "roundl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000249 "scanf",
250 "setbuf",
251 "setitimer",
252 "setvbuf",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000253 "sin",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000254 "sinf",
Chad Rosier676c0932011-12-01 18:26:19 +0000255 "sinh",
Chad Rosier676c0932011-12-01 18:26:19 +0000256 "sinhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000257 "sinhl",
258 "sinl",
Chad Rosier676c0932011-12-01 18:26:19 +0000259 "siprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000260 "snprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000261 "sprintf",
Chad Rosier82e1bd82011-11-29 23:57:10 +0000262 "sqrt",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000263 "sqrtf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000264 "sqrtl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000265 "sscanf",
266 "stat",
267 "stat64",
268 "statvfs",
269 "statvfs64",
Meador Inge2526a422012-11-10 03:11:06 +0000270 "stpcpy",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000271 "stpncpy",
272 "strcasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000273 "strcat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000274 "strchr",
Meador Inge2526a422012-11-10 03:11:06 +0000275 "strcmp",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000276 "strcoll",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000277 "strcpy",
Meador Inge2526a422012-11-10 03:11:06 +0000278 "strcspn",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000279 "strdup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000280 "strlen",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000281 "strncasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000282 "strncat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000283 "strncmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000284 "strncpy",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000285 "strndup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000286 "strnlen",
Meador Inge2526a422012-11-10 03:11:06 +0000287 "strpbrk",
288 "strrchr",
289 "strspn",
290 "strstr",
291 "strtod",
292 "strtof",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000293 "strtok",
294 "strtok_r",
Meador Inge2526a422012-11-10 03:11:06 +0000295 "strtol",
296 "strtold",
297 "strtoll",
298 "strtoul",
299 "strtoull",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000300 "strxfrm",
301 "system",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000302 "tan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000303 "tanf",
304 "tanh",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000305 "tanhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000306 "tanhl",
307 "tanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000308 "times",
309 "tmpfile",
310 "tmpfile64",
Meador Inge780a1862012-11-22 15:36:42 +0000311 "toascii",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000312 "trunc",
313 "truncf",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000314 "truncl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000315 "uname",
316 "ungetc",
317 "unlink",
318 "unsetenv",
319 "utime",
320 "utimes",
321 "valloc",
322 "vfprintf",
323 "vfscanf",
324 "vprintf",
325 "vscanf",
326 "vsnprintf",
327 "vsprintf",
328 "vsscanf",
329 "write"
Eli Friedman489c0ff2011-11-17 01:27:36 +0000330 };
331
Chris Lattner0e125bb2011-02-18 21:50:34 +0000332/// initialize - Initialize the set of available library functions based on the
333/// specified target triple. This should be carefully written so that a missing
334/// target triple gets a sane set of defaults.
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000335static void initialize(TargetLibraryInfo &TLI, const Triple &T,
336 const char **StandardNames) {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000337 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
338
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000339#ifndef NDEBUG
340 // Verify that the StandardNames array is in alphabetical order.
341 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
342 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
343 llvm_unreachable("TargetLibraryInfo function names must be sorted");
344 }
345#endif // !NDEBUG
Chris Lattner0e125bb2011-02-18 21:50:34 +0000346
347 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000348 if (T.isMacOSX()) {
349 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000350 TLI.setUnavailable(LibFunc::memset_pattern16);
351 } else if (T.getOS() == Triple::IOS) {
352 if (T.isOSVersionLT(3, 0))
353 TLI.setUnavailable(LibFunc::memset_pattern16);
354 } else {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000355 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000356 }
Richard Osborne815de532011-03-03 13:17:51 +0000357
Eli Friedman489c0ff2011-11-17 01:27:36 +0000358 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
359 !T.isMacOSXVersionLT(10, 7)) {
360 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
361 // we don't care about) have two versions; on recent OSX, the one we want
362 // has a $UNIX2003 suffix. The two implementations are identical except
363 // for the return value in some edge cases. However, we don't want to
364 // generate code that depends on the old symbols.
365 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
366 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
367 }
368
Duncan Sandseeb50c82011-06-09 11:11:45 +0000369 // iprintf and friends are only available on XCore and TCE.
370 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne815de532011-03-03 13:17:51 +0000371 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000372 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborneaf52c522011-03-03 14:20:22 +0000373 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000374 }
Joe Groffa81bcbb2012-04-17 23:05:54 +0000375
376 if (T.getOS() == Triple::Win32) {
377 // Win32 does not support long double
378 TLI.setUnavailable(LibFunc::acosl);
379 TLI.setUnavailable(LibFunc::asinl);
380 TLI.setUnavailable(LibFunc::atanl);
381 TLI.setUnavailable(LibFunc::atan2l);
382 TLI.setUnavailable(LibFunc::ceill);
383 TLI.setUnavailable(LibFunc::copysignl);
384 TLI.setUnavailable(LibFunc::cosl);
385 TLI.setUnavailable(LibFunc::coshl);
386 TLI.setUnavailable(LibFunc::expl);
387 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
388 TLI.setUnavailable(LibFunc::fabsl);
389 TLI.setUnavailable(LibFunc::floorl);
390 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000391 TLI.setUnavailable(LibFunc::frexpl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000392 TLI.setUnavailable(LibFunc::logl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000393 TLI.setUnavailable(LibFunc::modfl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000394 TLI.setUnavailable(LibFunc::powl);
395 TLI.setUnavailable(LibFunc::sinl);
396 TLI.setUnavailable(LibFunc::sinhl);
397 TLI.setUnavailable(LibFunc::sqrtl);
398 TLI.setUnavailable(LibFunc::tanl);
399 TLI.setUnavailable(LibFunc::tanhl);
400
401 // Win32 only has C89 math
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000402 TLI.setUnavailable(LibFunc::acosh);
403 TLI.setUnavailable(LibFunc::acoshf);
404 TLI.setUnavailable(LibFunc::acoshl);
405 TLI.setUnavailable(LibFunc::asinh);
406 TLI.setUnavailable(LibFunc::asinhf);
407 TLI.setUnavailable(LibFunc::asinhl);
408 TLI.setUnavailable(LibFunc::atanh);
409 TLI.setUnavailable(LibFunc::atanhf);
410 TLI.setUnavailable(LibFunc::atanhl);
411 TLI.setUnavailable(LibFunc::cbrt);
412 TLI.setUnavailable(LibFunc::cbrtf);
413 TLI.setUnavailable(LibFunc::cbrtl);
414 TLI.setUnavailable(LibFunc::exp10);
415 TLI.setUnavailable(LibFunc::exp10f);
416 TLI.setUnavailable(LibFunc::exp10l);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000417 TLI.setUnavailable(LibFunc::exp2);
418 TLI.setUnavailable(LibFunc::exp2f);
419 TLI.setUnavailable(LibFunc::exp2l);
420 TLI.setUnavailable(LibFunc::expm1);
421 TLI.setUnavailable(LibFunc::expm1f);
422 TLI.setUnavailable(LibFunc::expm1l);
423 TLI.setUnavailable(LibFunc::log2);
424 TLI.setUnavailable(LibFunc::log2f);
425 TLI.setUnavailable(LibFunc::log2l);
426 TLI.setUnavailable(LibFunc::log1p);
427 TLI.setUnavailable(LibFunc::log1pf);
428 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000429 TLI.setUnavailable(LibFunc::logb);
430 TLI.setUnavailable(LibFunc::logbf);
431 TLI.setUnavailable(LibFunc::logbl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000432 TLI.setUnavailable(LibFunc::nearbyint);
433 TLI.setUnavailable(LibFunc::nearbyintf);
434 TLI.setUnavailable(LibFunc::nearbyintl);
435 TLI.setUnavailable(LibFunc::rint);
436 TLI.setUnavailable(LibFunc::rintf);
437 TLI.setUnavailable(LibFunc::rintl);
438 TLI.setUnavailable(LibFunc::round);
439 TLI.setUnavailable(LibFunc::roundf);
440 TLI.setUnavailable(LibFunc::roundl);
441 TLI.setUnavailable(LibFunc::trunc);
442 TLI.setUnavailable(LibFunc::truncf);
443 TLI.setUnavailable(LibFunc::truncl);
444
445 // Win32 provides some C99 math with mangled names
446 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
447
448 if (T.getArch() == Triple::x86) {
449 // Win32 on x86 implements single-precision math functions as macros
450 TLI.setUnavailable(LibFunc::acosf);
451 TLI.setUnavailable(LibFunc::asinf);
452 TLI.setUnavailable(LibFunc::atanf);
453 TLI.setUnavailable(LibFunc::atan2f);
454 TLI.setUnavailable(LibFunc::ceilf);
455 TLI.setUnavailable(LibFunc::copysignf);
456 TLI.setUnavailable(LibFunc::cosf);
457 TLI.setUnavailable(LibFunc::coshf);
458 TLI.setUnavailable(LibFunc::expf);
459 TLI.setUnavailable(LibFunc::floorf);
460 TLI.setUnavailable(LibFunc::fmodf);
461 TLI.setUnavailable(LibFunc::logf);
462 TLI.setUnavailable(LibFunc::powf);
463 TLI.setUnavailable(LibFunc::sinf);
464 TLI.setUnavailable(LibFunc::sinhf);
465 TLI.setUnavailable(LibFunc::sqrtf);
466 TLI.setUnavailable(LibFunc::tanf);
467 TLI.setUnavailable(LibFunc::tanhf);
468 }
Meador Inge2526a422012-11-10 03:11:06 +0000469
Meador Ingeb904e6e2013-03-05 21:47:40 +0000470 // Win32 does *not* provide provide these functions, but they are
471 // generally available on POSIX-compliant systems:
472 TLI.setUnavailable(LibFunc::access);
473 TLI.setUnavailable(LibFunc::bcmp);
474 TLI.setUnavailable(LibFunc::bcopy);
475 TLI.setUnavailable(LibFunc::bzero);
476 TLI.setUnavailable(LibFunc::chmod);
477 TLI.setUnavailable(LibFunc::chown);
478 TLI.setUnavailable(LibFunc::closedir);
479 TLI.setUnavailable(LibFunc::ctermid);
480 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge780a1862012-11-22 15:36:42 +0000481 TLI.setUnavailable(LibFunc::ffs);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000482 TLI.setUnavailable(LibFunc::fileno);
483 TLI.setUnavailable(LibFunc::flockfile);
484 TLI.setUnavailable(LibFunc::fseeko);
485 TLI.setUnavailable(LibFunc::fstat);
486 TLI.setUnavailable(LibFunc::fstatvfs);
487 TLI.setUnavailable(LibFunc::ftello);
488 TLI.setUnavailable(LibFunc::ftrylockfile);
489 TLI.setUnavailable(LibFunc::funlockfile);
490 TLI.setUnavailable(LibFunc::getc_unlocked);
491 TLI.setUnavailable(LibFunc::getitimer);
492 TLI.setUnavailable(LibFunc::getlogin_r);
493 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000494 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000495 TLI.setUnavailable(LibFunc::htonl);
496 TLI.setUnavailable(LibFunc::htons);
497 TLI.setUnavailable(LibFunc::lchown);
498 TLI.setUnavailable(LibFunc::lstat);
499 TLI.setUnavailable(LibFunc::memccpy);
500 TLI.setUnavailable(LibFunc::mkdir);
501 TLI.setUnavailable(LibFunc::ntohl);
502 TLI.setUnavailable(LibFunc::ntohs);
503 TLI.setUnavailable(LibFunc::open);
504 TLI.setUnavailable(LibFunc::opendir);
505 TLI.setUnavailable(LibFunc::pclose);
506 TLI.setUnavailable(LibFunc::popen);
507 TLI.setUnavailable(LibFunc::pread);
508 TLI.setUnavailable(LibFunc::pwrite);
509 TLI.setUnavailable(LibFunc::read);
510 TLI.setUnavailable(LibFunc::readlink);
511 TLI.setUnavailable(LibFunc::realpath);
512 TLI.setUnavailable(LibFunc::rmdir);
513 TLI.setUnavailable(LibFunc::setitimer);
514 TLI.setUnavailable(LibFunc::stat);
515 TLI.setUnavailable(LibFunc::statvfs);
516 TLI.setUnavailable(LibFunc::stpcpy);
517 TLI.setUnavailable(LibFunc::stpncpy);
518 TLI.setUnavailable(LibFunc::strcasecmp);
519 TLI.setUnavailable(LibFunc::strncasecmp);
520 TLI.setUnavailable(LibFunc::times);
521 TLI.setUnavailable(LibFunc::uname);
522 TLI.setUnavailable(LibFunc::unlink);
523 TLI.setUnavailable(LibFunc::unsetenv);
524 TLI.setUnavailable(LibFunc::utime);
525 TLI.setUnavailable(LibFunc::utimes);
526 TLI.setUnavailable(LibFunc::write);
Meador Inge780a1862012-11-22 15:36:42 +0000527
Meador Ingeb904e6e2013-03-05 21:47:40 +0000528 // Win32 does *not* provide provide these functions, but they are
529 // specified by C99:
530 TLI.setUnavailable(LibFunc::atoll);
531 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge780a1862012-11-22 15:36:42 +0000532 TLI.setUnavailable(LibFunc::llabs);
533 }
534
535 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
536 // Linux (GLIBC):
537 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
538 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
539 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
540 switch (T.getOS()) {
541 case Triple::Darwin:
542 case Triple::MacOSX:
543 case Triple::IOS:
544 case Triple::FreeBSD:
545 case Triple::Linux:
546 break;
547 default:
548 TLI.setUnavailable(LibFunc::ffsl);
549 }
550
551 // ffsll is available on at least FreeBSD and Linux (GLIBC):
552 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
553 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
554 switch (T.getOS()) {
555 case Triple::FreeBSD:
556 case Triple::Linux:
557 break;
558 default:
559 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000560 }
Meador Ingeb904e6e2013-03-05 21:47:40 +0000561
562 // The following functions are available on at least Linux:
563 if (T.getOS() != Triple::Linux) {
564 TLI.setUnavailable(LibFunc::dunder_strdup);
565 TLI.setUnavailable(LibFunc::dunder_strtok_r);
566 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
567 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
568 TLI.setUnavailable(LibFunc::under_IO_getc);
569 TLI.setUnavailable(LibFunc::under_IO_putc);
570 TLI.setUnavailable(LibFunc::memalign);
571 TLI.setUnavailable(LibFunc::fopen64);
572 TLI.setUnavailable(LibFunc::fseeko64);
573 TLI.setUnavailable(LibFunc::fstat64);
574 TLI.setUnavailable(LibFunc::fstatvfs64);
575 TLI.setUnavailable(LibFunc::ftello64);
576 TLI.setUnavailable(LibFunc::lstat64);
577 TLI.setUnavailable(LibFunc::open64);
578 TLI.setUnavailable(LibFunc::stat64);
579 TLI.setUnavailable(LibFunc::statvfs64);
580 TLI.setUnavailable(LibFunc::tmpfile64);
581 }
Chris Lattner0e125bb2011-02-18 21:50:34 +0000582}
583
584
585TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
586 // Default to everything being available.
587 memset(AvailableArray, -1, sizeof(AvailableArray));
588
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000589 initialize(*this, Triple(), StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000590}
591
592TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
593 // Default to everything being available.
594 memset(AvailableArray, -1, sizeof(AvailableArray));
595
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000596 initialize(*this, T, StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000597}
Chris Lattner1341df92011-02-18 22:34:03 +0000598
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000599TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
600 : ImmutablePass(ID) {
601 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman489c0ff2011-11-17 01:27:36 +0000602 CustomNames = TLI.CustomNames;
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000603}
604
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000605namespace {
606struct StringComparator {
607 /// Compare two strings and return true if LHS is lexicographically less than
608 /// RHS. Requires that RHS doesn't contain any zero bytes.
609 bool operator()(const char *LHS, StringRef RHS) const {
610 // Compare prefixes with strncmp. If prefixes match we know that LHS is
611 // greater or equal to RHS as RHS can't contain any '\0'.
612 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
613 }
614
615 // Provided for compatibility with MSVC's debug mode.
616 bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
617 bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
Benjamin Kramerdfbcba52013-03-13 13:50:47 +0000618 bool operator()(const char *LHS, const char *RHS) const {
619 return std::strcmp(LHS, RHS) < 0;
620 }
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000621};
622}
623
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000624bool TargetLibraryInfo::getLibFunc(StringRef funcName,
625 LibFunc::Func &F) const {
626 const char **Start = &StandardNames[0];
627 const char **End = &StandardNames[LibFunc::NumLibFuncs];
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000628
629 // Filter out empty names and names containing null bytes, those can't be in
630 // our table.
631 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
632 return false;
633
Meador Ingeb904e6e2013-03-05 21:47:40 +0000634 // Check for \01 prefix that is used to mangle __asm declarations and
635 // strip it if present.
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000636 if (funcName.front() == '\01')
Meador Ingeb904e6e2013-03-05 21:47:40 +0000637 funcName = funcName.substr(1);
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000638 const char **I = std::lower_bound(Start, End, funcName, StringComparator());
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000639 if (I != End && *I == funcName) {
640 F = (LibFunc::Func)(I - Start);
641 return true;
642 }
643 return false;
644}
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000645
Chris Lattner1341df92011-02-18 22:34:03 +0000646/// disableAllFunctions - This disables all builtins, which is used for options
647/// like -fno-builtin.
648void TargetLibraryInfo::disableAllFunctions() {
649 memset(AvailableArray, 0, sizeof(AvailableArray));
650}