blob: 46cce8485916a3138ea79b6be17336f9eac196a7 [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",
Tim Northover103e6482014-02-04 16:28:20 +000051 "__sincospif_stret",
Bob Wilsond8d92d92013-11-03 06:48:38 +000052 "__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",
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000193 "ldexp",
194 "ldexpf",
195 "ldexpl",
Meador Inge780a1862012-11-22 15:36:42 +0000196 "llabs",
Chad Rosier738da252011-11-30 19:19:00 +0000197 "log",
Chad Rosier738da252011-11-30 19:19:00 +0000198 "log10",
Chad Rosier738da252011-11-30 19:19:00 +0000199 "log10f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000200 "log10l",
Chad Rosier738da252011-11-30 19:19:00 +0000201 "log1p",
Chad Rosier738da252011-11-30 19:19:00 +0000202 "log1pf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000203 "log1pl",
204 "log2",
205 "log2f",
206 "log2l",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000207 "logb",
208 "logbf",
209 "logbl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000210 "logf",
211 "logl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000212 "lstat",
213 "lstat64",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000214 "malloc",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000215 "memalign",
216 "memccpy",
Nuno Lopes342cf782012-07-24 21:00:36 +0000217 "memchr",
218 "memcmp",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000219 "memcpy",
220 "memmove",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000221 "memrchr",
Chad Rosierabba0942011-11-30 01:51:49 +0000222 "memset",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000223 "memset_pattern16",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000224 "mkdir",
225 "mktime",
226 "modf",
227 "modff",
228 "modfl",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000229 "nearbyint",
230 "nearbyintf",
231 "nearbyintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000232 "ntohl",
233 "ntohs",
234 "open",
235 "open64",
236 "opendir",
237 "pclose",
238 "perror",
239 "popen",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000240 "posix_memalign",
Chad Rosier738da252011-11-30 19:19:00 +0000241 "pow",
242 "powf",
243 "powl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000244 "pread",
Meador Inge780a1862012-11-22 15:36:42 +0000245 "printf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000246 "putc",
Nuno Lopes342cf782012-07-24 21:00:36 +0000247 "putchar",
248 "puts",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000249 "pwrite",
250 "qsort",
251 "read",
252 "readlink",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000253 "realloc",
254 "reallocf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000255 "realpath",
256 "remove",
257 "rename",
258 "rewind",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000259 "rint",
260 "rintf",
261 "rintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000262 "rmdir",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000263 "round",
264 "roundf",
265 "roundl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000266 "scanf",
267 "setbuf",
268 "setitimer",
269 "setvbuf",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000270 "sin",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000271 "sinf",
Chad Rosier676c0932011-12-01 18:26:19 +0000272 "sinh",
Chad Rosier676c0932011-12-01 18:26:19 +0000273 "sinhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000274 "sinhl",
275 "sinl",
Chad Rosier676c0932011-12-01 18:26:19 +0000276 "siprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000277 "snprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000278 "sprintf",
Chad Rosier82e1bd82011-11-29 23:57:10 +0000279 "sqrt",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000280 "sqrtf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000281 "sqrtl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000282 "sscanf",
283 "stat",
284 "stat64",
285 "statvfs",
286 "statvfs64",
Meador Inge2526a422012-11-10 03:11:06 +0000287 "stpcpy",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000288 "stpncpy",
289 "strcasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000290 "strcat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000291 "strchr",
Meador Inge2526a422012-11-10 03:11:06 +0000292 "strcmp",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000293 "strcoll",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000294 "strcpy",
Meador Inge2526a422012-11-10 03:11:06 +0000295 "strcspn",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000296 "strdup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000297 "strlen",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000298 "strncasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000299 "strncat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000300 "strncmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000301 "strncpy",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000302 "strndup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000303 "strnlen",
Meador Inge2526a422012-11-10 03:11:06 +0000304 "strpbrk",
305 "strrchr",
306 "strspn",
307 "strstr",
308 "strtod",
309 "strtof",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000310 "strtok",
311 "strtok_r",
Meador Inge2526a422012-11-10 03:11:06 +0000312 "strtol",
313 "strtold",
314 "strtoll",
315 "strtoul",
316 "strtoull",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000317 "strxfrm",
318 "system",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000319 "tan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000320 "tanf",
321 "tanh",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000322 "tanhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000323 "tanhl",
324 "tanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000325 "times",
326 "tmpfile",
327 "tmpfile64",
Meador Inge780a1862012-11-22 15:36:42 +0000328 "toascii",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000329 "trunc",
330 "truncf",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000331 "truncl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000332 "uname",
333 "ungetc",
334 "unlink",
335 "unsetenv",
336 "utime",
337 "utimes",
338 "valloc",
339 "vfprintf",
340 "vfscanf",
341 "vprintf",
342 "vscanf",
343 "vsnprintf",
344 "vsprintf",
345 "vsscanf",
346 "write"
Eli Friedman489c0ff2011-11-17 01:27:36 +0000347 };
348
Bob Wilsond8d92d92013-11-03 06:48:38 +0000349static bool hasSinCosPiStret(const Triple &T) {
350 // Only Darwin variants have _stret versions of combined trig functions.
351 if (!T.isMacOSX() && T.getOS() != Triple::IOS)
352 return false;
353
354 // The ABI is rather complicated on x86, so don't do anything special there.
355 if (T.getArch() == Triple::x86)
356 return false;
357
358 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
359 return false;
360
361 if (T.getOS() == Triple::IOS && T.isOSVersionLT(7, 0))
362 return false;
363
364 return true;
365}
366
Chris Lattner0e125bb2011-02-18 21:50:34 +0000367/// initialize - Initialize the set of available library functions based on the
368/// specified target triple. This should be carefully written so that a missing
369/// target triple gets a sane set of defaults.
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000370static void initialize(TargetLibraryInfo &TLI, const Triple &T,
371 const char **StandardNames) {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000372 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
373
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000374#ifndef NDEBUG
375 // Verify that the StandardNames array is in alphabetical order.
376 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
377 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
378 llvm_unreachable("TargetLibraryInfo function names must be sorted");
379 }
380#endif // !NDEBUG
Chris Lattner0e125bb2011-02-18 21:50:34 +0000381
382 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000383 if (T.isMacOSX()) {
384 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000385 TLI.setUnavailable(LibFunc::memset_pattern16);
Cameron Esfahani943908b2013-08-29 20:23:14 +0000386 } else if (T.isiOS()) {
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000387 if (T.isOSVersionLT(3, 0))
388 TLI.setUnavailable(LibFunc::memset_pattern16);
389 } else {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000390 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000391 }
Richard Osborne815de532011-03-03 13:17:51 +0000392
Bob Wilsond8d92d92013-11-03 06:48:38 +0000393 if (!hasSinCosPiStret(T)) {
394 TLI.setUnavailable(LibFunc::sinpi);
395 TLI.setUnavailable(LibFunc::sinpif);
396 TLI.setUnavailable(LibFunc::cospi);
397 TLI.setUnavailable(LibFunc::cospif);
398 TLI.setUnavailable(LibFunc::sincospi_stret);
Tim Northover103e6482014-02-04 16:28:20 +0000399 TLI.setUnavailable(LibFunc::sincospif_stret);
Bob Wilsond8d92d92013-11-03 06:48:38 +0000400 }
401
Eli Friedman489c0ff2011-11-17 01:27:36 +0000402 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
403 !T.isMacOSXVersionLT(10, 7)) {
404 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
405 // we don't care about) have two versions; on recent OSX, the one we want
406 // has a $UNIX2003 suffix. The two implementations are identical except
407 // for the return value in some edge cases. However, we don't want to
408 // generate code that depends on the old symbols.
409 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
410 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
411 }
412
Duncan Sandseeb50c82011-06-09 11:11:45 +0000413 // iprintf and friends are only available on XCore and TCE.
414 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne815de532011-03-03 13:17:51 +0000415 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000416 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborneaf52c522011-03-03 14:20:22 +0000417 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000418 }
Joe Groffa81bcbb2012-04-17 23:05:54 +0000419
420 if (T.getOS() == Triple::Win32) {
421 // Win32 does not support long double
422 TLI.setUnavailable(LibFunc::acosl);
423 TLI.setUnavailable(LibFunc::asinl);
424 TLI.setUnavailable(LibFunc::atanl);
425 TLI.setUnavailable(LibFunc::atan2l);
426 TLI.setUnavailable(LibFunc::ceill);
427 TLI.setUnavailable(LibFunc::copysignl);
428 TLI.setUnavailable(LibFunc::cosl);
429 TLI.setUnavailable(LibFunc::coshl);
430 TLI.setUnavailable(LibFunc::expl);
431 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
432 TLI.setUnavailable(LibFunc::fabsl);
433 TLI.setUnavailable(LibFunc::floorl);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000434 TLI.setUnavailable(LibFunc::fmaxl);
435 TLI.setUnavailable(LibFunc::fminl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000436 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000437 TLI.setUnavailable(LibFunc::frexpl);
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000438 TLI.setUnavailable(LibFunc::ldexpf);
439 TLI.setUnavailable(LibFunc::ldexpl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000440 TLI.setUnavailable(LibFunc::logl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000441 TLI.setUnavailable(LibFunc::modfl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000442 TLI.setUnavailable(LibFunc::powl);
443 TLI.setUnavailable(LibFunc::sinl);
444 TLI.setUnavailable(LibFunc::sinhl);
445 TLI.setUnavailable(LibFunc::sqrtl);
446 TLI.setUnavailable(LibFunc::tanl);
447 TLI.setUnavailable(LibFunc::tanhl);
448
449 // Win32 only has C89 math
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000450 TLI.setUnavailable(LibFunc::acosh);
451 TLI.setUnavailable(LibFunc::acoshf);
452 TLI.setUnavailable(LibFunc::acoshl);
453 TLI.setUnavailable(LibFunc::asinh);
454 TLI.setUnavailable(LibFunc::asinhf);
455 TLI.setUnavailable(LibFunc::asinhl);
456 TLI.setUnavailable(LibFunc::atanh);
457 TLI.setUnavailable(LibFunc::atanhf);
458 TLI.setUnavailable(LibFunc::atanhl);
459 TLI.setUnavailable(LibFunc::cbrt);
460 TLI.setUnavailable(LibFunc::cbrtf);
461 TLI.setUnavailable(LibFunc::cbrtl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000462 TLI.setUnavailable(LibFunc::exp2);
463 TLI.setUnavailable(LibFunc::exp2f);
464 TLI.setUnavailable(LibFunc::exp2l);
465 TLI.setUnavailable(LibFunc::expm1);
466 TLI.setUnavailable(LibFunc::expm1f);
467 TLI.setUnavailable(LibFunc::expm1l);
468 TLI.setUnavailable(LibFunc::log2);
469 TLI.setUnavailable(LibFunc::log2f);
470 TLI.setUnavailable(LibFunc::log2l);
471 TLI.setUnavailable(LibFunc::log1p);
472 TLI.setUnavailable(LibFunc::log1pf);
473 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000474 TLI.setUnavailable(LibFunc::logb);
475 TLI.setUnavailable(LibFunc::logbf);
476 TLI.setUnavailable(LibFunc::logbl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000477 TLI.setUnavailable(LibFunc::nearbyint);
478 TLI.setUnavailable(LibFunc::nearbyintf);
479 TLI.setUnavailable(LibFunc::nearbyintl);
480 TLI.setUnavailable(LibFunc::rint);
481 TLI.setUnavailable(LibFunc::rintf);
482 TLI.setUnavailable(LibFunc::rintl);
483 TLI.setUnavailable(LibFunc::round);
484 TLI.setUnavailable(LibFunc::roundf);
485 TLI.setUnavailable(LibFunc::roundl);
486 TLI.setUnavailable(LibFunc::trunc);
487 TLI.setUnavailable(LibFunc::truncf);
488 TLI.setUnavailable(LibFunc::truncl);
489
490 // Win32 provides some C99 math with mangled names
491 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
492
493 if (T.getArch() == Triple::x86) {
494 // Win32 on x86 implements single-precision math functions as macros
495 TLI.setUnavailable(LibFunc::acosf);
496 TLI.setUnavailable(LibFunc::asinf);
497 TLI.setUnavailable(LibFunc::atanf);
498 TLI.setUnavailable(LibFunc::atan2f);
499 TLI.setUnavailable(LibFunc::ceilf);
500 TLI.setUnavailable(LibFunc::copysignf);
501 TLI.setUnavailable(LibFunc::cosf);
502 TLI.setUnavailable(LibFunc::coshf);
503 TLI.setUnavailable(LibFunc::expf);
504 TLI.setUnavailable(LibFunc::floorf);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000505 TLI.setUnavailable(LibFunc::fminf);
506 TLI.setUnavailable(LibFunc::fmaxf);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000507 TLI.setUnavailable(LibFunc::fmodf);
508 TLI.setUnavailable(LibFunc::logf);
509 TLI.setUnavailable(LibFunc::powf);
510 TLI.setUnavailable(LibFunc::sinf);
511 TLI.setUnavailable(LibFunc::sinhf);
512 TLI.setUnavailable(LibFunc::sqrtf);
513 TLI.setUnavailable(LibFunc::tanf);
514 TLI.setUnavailable(LibFunc::tanhf);
515 }
Meador Inge2526a422012-11-10 03:11:06 +0000516
Meador Ingeb904e6e2013-03-05 21:47:40 +0000517 // Win32 does *not* provide provide these functions, but they are
518 // generally available on POSIX-compliant systems:
519 TLI.setUnavailable(LibFunc::access);
520 TLI.setUnavailable(LibFunc::bcmp);
521 TLI.setUnavailable(LibFunc::bcopy);
522 TLI.setUnavailable(LibFunc::bzero);
523 TLI.setUnavailable(LibFunc::chmod);
524 TLI.setUnavailable(LibFunc::chown);
525 TLI.setUnavailable(LibFunc::closedir);
526 TLI.setUnavailable(LibFunc::ctermid);
527 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge780a1862012-11-22 15:36:42 +0000528 TLI.setUnavailable(LibFunc::ffs);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000529 TLI.setUnavailable(LibFunc::fileno);
530 TLI.setUnavailable(LibFunc::flockfile);
531 TLI.setUnavailable(LibFunc::fseeko);
532 TLI.setUnavailable(LibFunc::fstat);
533 TLI.setUnavailable(LibFunc::fstatvfs);
534 TLI.setUnavailable(LibFunc::ftello);
535 TLI.setUnavailable(LibFunc::ftrylockfile);
536 TLI.setUnavailable(LibFunc::funlockfile);
537 TLI.setUnavailable(LibFunc::getc_unlocked);
538 TLI.setUnavailable(LibFunc::getitimer);
539 TLI.setUnavailable(LibFunc::getlogin_r);
540 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000541 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000542 TLI.setUnavailable(LibFunc::htonl);
543 TLI.setUnavailable(LibFunc::htons);
544 TLI.setUnavailable(LibFunc::lchown);
545 TLI.setUnavailable(LibFunc::lstat);
546 TLI.setUnavailable(LibFunc::memccpy);
547 TLI.setUnavailable(LibFunc::mkdir);
548 TLI.setUnavailable(LibFunc::ntohl);
549 TLI.setUnavailable(LibFunc::ntohs);
550 TLI.setUnavailable(LibFunc::open);
551 TLI.setUnavailable(LibFunc::opendir);
552 TLI.setUnavailable(LibFunc::pclose);
553 TLI.setUnavailable(LibFunc::popen);
554 TLI.setUnavailable(LibFunc::pread);
555 TLI.setUnavailable(LibFunc::pwrite);
556 TLI.setUnavailable(LibFunc::read);
557 TLI.setUnavailable(LibFunc::readlink);
558 TLI.setUnavailable(LibFunc::realpath);
559 TLI.setUnavailable(LibFunc::rmdir);
560 TLI.setUnavailable(LibFunc::setitimer);
561 TLI.setUnavailable(LibFunc::stat);
562 TLI.setUnavailable(LibFunc::statvfs);
563 TLI.setUnavailable(LibFunc::stpcpy);
564 TLI.setUnavailable(LibFunc::stpncpy);
565 TLI.setUnavailable(LibFunc::strcasecmp);
566 TLI.setUnavailable(LibFunc::strncasecmp);
567 TLI.setUnavailable(LibFunc::times);
568 TLI.setUnavailable(LibFunc::uname);
569 TLI.setUnavailable(LibFunc::unlink);
570 TLI.setUnavailable(LibFunc::unsetenv);
571 TLI.setUnavailable(LibFunc::utime);
572 TLI.setUnavailable(LibFunc::utimes);
573 TLI.setUnavailable(LibFunc::write);
Meador Inge780a1862012-11-22 15:36:42 +0000574
Meador Ingeb904e6e2013-03-05 21:47:40 +0000575 // Win32 does *not* provide provide these functions, but they are
576 // specified by C99:
577 TLI.setUnavailable(LibFunc::atoll);
578 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge780a1862012-11-22 15:36:42 +0000579 TLI.setUnavailable(LibFunc::llabs);
580 }
581
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000582 switch (T.getOS()) {
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000583 case Triple::MacOSX:
Chandler Carruthf5689f82013-12-28 02:40:19 +0000584 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
585 // and their names are __exp10 and __exp10f. exp10l is not available on
586 // OS X or iOS.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000587 TLI.setUnavailable(LibFunc::exp10l);
588 if (T.isMacOSXVersionLT(10, 9)) {
589 TLI.setUnavailable(LibFunc::exp10);
590 TLI.setUnavailable(LibFunc::exp10f);
591 } else {
592 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
593 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
594 }
595 break;
596 case Triple::IOS:
597 TLI.setUnavailable(LibFunc::exp10l);
598 if (T.isOSVersionLT(7, 0)) {
599 TLI.setUnavailable(LibFunc::exp10);
600 TLI.setUnavailable(LibFunc::exp10f);
601 } else {
602 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
603 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
604 }
605 break;
Chandler Carruthf5689f82013-12-28 02:40:19 +0000606 case Triple::Linux:
607 // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
608 // buggy prior to glibc version 2.18. Until this version is widely deployed
609 // or we have a reasonable detection strategy, we cannot use exp10 reliably
610 // on Linux.
611 //
612 // Fall through to disable all of them.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000613 default:
614 TLI.setUnavailable(LibFunc::exp10);
615 TLI.setUnavailable(LibFunc::exp10f);
616 TLI.setUnavailable(LibFunc::exp10l);
617 }
618
Meador Inge780a1862012-11-22 15:36:42 +0000619 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
620 // Linux (GLIBC):
621 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
622 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
623 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
624 switch (T.getOS()) {
625 case Triple::Darwin:
626 case Triple::MacOSX:
627 case Triple::IOS:
628 case Triple::FreeBSD:
629 case Triple::Linux:
630 break;
631 default:
632 TLI.setUnavailable(LibFunc::ffsl);
633 }
634
635 // ffsll is available on at least FreeBSD and Linux (GLIBC):
636 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
637 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
638 switch (T.getOS()) {
639 case Triple::FreeBSD:
640 case Triple::Linux:
641 break;
642 default:
643 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000644 }
Meador Ingeb904e6e2013-03-05 21:47:40 +0000645
646 // The following functions are available on at least Linux:
Cameron Esfahani943908b2013-08-29 20:23:14 +0000647 if (!T.isOSLinux()) {
Meador Ingeb904e6e2013-03-05 21:47:40 +0000648 TLI.setUnavailable(LibFunc::dunder_strdup);
649 TLI.setUnavailable(LibFunc::dunder_strtok_r);
650 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
651 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
652 TLI.setUnavailable(LibFunc::under_IO_getc);
653 TLI.setUnavailable(LibFunc::under_IO_putc);
654 TLI.setUnavailable(LibFunc::memalign);
655 TLI.setUnavailable(LibFunc::fopen64);
656 TLI.setUnavailable(LibFunc::fseeko64);
657 TLI.setUnavailable(LibFunc::fstat64);
658 TLI.setUnavailable(LibFunc::fstatvfs64);
659 TLI.setUnavailable(LibFunc::ftello64);
660 TLI.setUnavailable(LibFunc::lstat64);
661 TLI.setUnavailable(LibFunc::open64);
662 TLI.setUnavailable(LibFunc::stat64);
663 TLI.setUnavailable(LibFunc::statvfs64);
664 TLI.setUnavailable(LibFunc::tmpfile64);
665 }
Chris Lattner0e125bb2011-02-18 21:50:34 +0000666}
667
668
669TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
670 // Default to everything being available.
671 memset(AvailableArray, -1, sizeof(AvailableArray));
672
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000673 initialize(*this, Triple(), StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000674}
675
676TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
677 // Default to everything being available.
678 memset(AvailableArray, -1, sizeof(AvailableArray));
679
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000680 initialize(*this, T, StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000681}
Chris Lattner1341df92011-02-18 22:34:03 +0000682
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000683TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
684 : ImmutablePass(ID) {
685 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman489c0ff2011-11-17 01:27:36 +0000686 CustomNames = TLI.CustomNames;
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000687}
688
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000689namespace {
690struct StringComparator {
691 /// Compare two strings and return true if LHS is lexicographically less than
692 /// RHS. Requires that RHS doesn't contain any zero bytes.
693 bool operator()(const char *LHS, StringRef RHS) const {
694 // Compare prefixes with strncmp. If prefixes match we know that LHS is
695 // greater or equal to RHS as RHS can't contain any '\0'.
696 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
697 }
698
699 // Provided for compatibility with MSVC's debug mode.
700 bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
701 bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
Benjamin Kramerdfbcba52013-03-13 13:50:47 +0000702 bool operator()(const char *LHS, const char *RHS) const {
703 return std::strcmp(LHS, RHS) < 0;
704 }
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000705};
706}
707
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000708bool TargetLibraryInfo::getLibFunc(StringRef funcName,
709 LibFunc::Func &F) const {
710 const char **Start = &StandardNames[0];
711 const char **End = &StandardNames[LibFunc::NumLibFuncs];
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000712
713 // Filter out empty names and names containing null bytes, those can't be in
714 // our table.
715 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
716 return false;
717
Meador Ingeb904e6e2013-03-05 21:47:40 +0000718 // Check for \01 prefix that is used to mangle __asm declarations and
719 // strip it if present.
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000720 if (funcName.front() == '\01')
Meador Ingeb904e6e2013-03-05 21:47:40 +0000721 funcName = funcName.substr(1);
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000722 const char **I = std::lower_bound(Start, End, funcName, StringComparator());
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000723 if (I != End && *I == funcName) {
724 F = (LibFunc::Func)(I - Start);
725 return true;
726 }
727 return false;
728}
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000729
Chris Lattner1341df92011-02-18 22:34:03 +0000730/// disableAllFunctions - This disables all builtins, which is used for options
731/// like -fno-builtin.
732void TargetLibraryInfo::disableAllFunctions() {
733 memset(AvailableArray, 0, sizeof(AvailableArray));
734}