blob: c0abdbd9279b8e2f47b5e10149d5392c347978f7 [file] [log] [blame]
Chris Lattner0e125bb2011-02-18 21:50:34 +00001//===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the TargetLibraryInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Target/TargetLibraryInfo.h"
15#include "llvm/ADT/Triple.h"
16using namespace llvm;
17
18// Register the default implementation.
19INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20 "Target Library Information", false, true)
21char TargetLibraryInfo::ID = 0;
22
David Blaikiea379b1812011-12-20 02:50:00 +000023void TargetLibraryInfo::anchor() { }
24
Eli Friedman489c0ff2011-11-17 01:27:36 +000025const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
26 {
Meador Ingeb904e6e2013-03-05 21:47:40 +000027 "_IO_getc",
28 "_IO_putc",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000029 "_ZdaPv",
Richard Smith70523c72013-07-21 23:11:42 +000030 "_ZdaPvRKSt9nothrow_t",
Richard Smith1ed42292014-10-03 20:17:06 +000031 "_ZdaPvj",
32 "_ZdaPvm",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000033 "_ZdlPv",
Richard Smith70523c72013-07-21 23:11:42 +000034 "_ZdlPvRKSt9nothrow_t",
Richard Smith1ed42292014-10-03 20:17:06 +000035 "_ZdlPvj",
36 "_ZdlPvm",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000037 "_Znaj",
38 "_ZnajRKSt9nothrow_t",
39 "_Znam",
40 "_ZnamRKSt9nothrow_t",
41 "_Znwj",
42 "_ZnwjRKSt9nothrow_t",
43 "_Znwm",
44 "_ZnwmRKSt9nothrow_t",
Bob Wilsond8d92d92013-11-03 06:48:38 +000045 "__cospi",
46 "__cospif",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000047 "__cxa_atexit",
48 "__cxa_guard_abort",
49 "__cxa_guard_acquire",
50 "__cxa_guard_release",
Meador Ingeb904e6e2013-03-05 21:47:40 +000051 "__isoc99_scanf",
52 "__isoc99_sscanf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000053 "__memcpy_chk",
Ahmed Bougacha55a333d2014-11-12 21:23:34 +000054 "__memmove_chk",
55 "__memset_chk",
Bob Wilsond8d92d92013-11-03 06:48:38 +000056 "__sincospi_stret",
Tim Northover103e6482014-02-04 16:28:20 +000057 "__sincospif_stret",
Bob Wilsond8d92d92013-11-03 06:48:38 +000058 "__sinpi",
59 "__sinpif",
Preston Gurd048f99d2013-05-27 15:44:35 +000060 "__sqrt_finite",
61 "__sqrtf_finite",
62 "__sqrtl_finite",
Ahmed Bougacha55a333d2014-11-12 21:23:34 +000063 "__stpcpy_chk",
64 "__stpncpy_chk",
65 "__strcpy_chk",
Meador Ingeb904e6e2013-03-05 21:47:40 +000066 "__strdup",
Ahmed Bougacha55a333d2014-11-12 21:23:34 +000067 "__strncpy_chk",
Meador Ingeb904e6e2013-03-05 21:47:40 +000068 "__strndup",
69 "__strtok_r",
Meador Inge780a1862012-11-22 15:36:42 +000070 "abs",
Meador Ingeb904e6e2013-03-05 21:47:40 +000071 "access",
Chad Rosier738da252011-11-30 19:19:00 +000072 "acos",
Chad Rosier738da252011-11-30 19:19:00 +000073 "acosf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000074 "acosh",
75 "acoshf",
76 "acoshl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000077 "acosl",
Chad Rosier738da252011-11-30 19:19:00 +000078 "asin",
Chad Rosier738da252011-11-30 19:19:00 +000079 "asinf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000080 "asinh",
81 "asinhf",
82 "asinhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000083 "asinl",
Chad Rosier738da252011-11-30 19:19:00 +000084 "atan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000085 "atan2",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000086 "atan2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000087 "atan2l",
88 "atanf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000089 "atanh",
90 "atanhf",
91 "atanhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000092 "atanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +000093 "atof",
94 "atoi",
95 "atol",
96 "atoll",
97 "bcmp",
98 "bcopy",
99 "bzero",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000100 "calloc",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000101 "cbrt",
102 "cbrtf",
103 "cbrtl",
Chad Rosier738da252011-11-30 19:19:00 +0000104 "ceil",
Chad Rosier738da252011-11-30 19:19:00 +0000105 "ceilf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000106 "ceill",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000107 "chmod",
108 "chown",
109 "clearerr",
110 "closedir",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000111 "copysign",
112 "copysignf",
113 "copysignl",
Chad Rosier738da252011-11-30 19:19:00 +0000114 "cos",
Chad Rosier738da252011-11-30 19:19:00 +0000115 "cosf",
116 "cosh",
Chad Rosier738da252011-11-30 19:19:00 +0000117 "coshf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000118 "coshl",
119 "cosl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000120 "ctermid",
Chad Rosier738da252011-11-30 19:19:00 +0000121 "exp",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000122 "exp10",
123 "exp10f",
124 "exp10l",
Chad Rosier738da252011-11-30 19:19:00 +0000125 "exp2",
Chad Rosier738da252011-11-30 19:19:00 +0000126 "exp2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000127 "exp2l",
128 "expf",
129 "expl",
Chad Rosier738da252011-11-30 19:19:00 +0000130 "expm1",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000131 "expm1f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000132 "expm1l",
Chad Rosier738da252011-11-30 19:19:00 +0000133 "fabs",
Chad Rosier738da252011-11-30 19:19:00 +0000134 "fabsf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000135 "fabsl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000136 "fclose",
137 "fdopen",
138 "feof",
139 "ferror",
140 "fflush",
Meador Inge780a1862012-11-22 15:36:42 +0000141 "ffs",
142 "ffsl",
143 "ffsll",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000144 "fgetc",
145 "fgetpos",
146 "fgets",
147 "fileno",
Chad Rosierabba0942011-11-30 01:51:49 +0000148 "fiprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000149 "flockfile",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000150 "floor",
151 "floorf",
152 "floorl",
Yi Jiang6ab044e2013-12-16 22:42:40 +0000153 "fmax",
154 "fmaxf",
155 "fmaxl",
156 "fmin",
157 "fminf",
158 "fminl",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000159 "fmod",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000160 "fmodf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000161 "fmodl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000162 "fopen",
163 "fopen64",
Meador Inge780a1862012-11-22 15:36:42 +0000164 "fprintf",
Nuno Lopes342cf782012-07-24 21:00:36 +0000165 "fputc",
Chad Rosierabba0942011-11-30 01:51:49 +0000166 "fputs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000167 "fread",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000168 "free",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000169 "frexp",
170 "frexpf",
171 "frexpl",
172 "fscanf",
173 "fseek",
174 "fseeko",
175 "fseeko64",
176 "fsetpos",
177 "fstat",
178 "fstat64",
179 "fstatvfs",
180 "fstatvfs64",
181 "ftell",
182 "ftello",
183 "ftello64",
184 "ftrylockfile",
185 "funlockfile",
Chad Rosierabba0942011-11-30 01:51:49 +0000186 "fwrite",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000187 "getc",
188 "getc_unlocked",
189 "getchar",
190 "getenv",
191 "getitimer",
192 "getlogin_r",
193 "getpwnam",
194 "gets",
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000195 "gettimeofday",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000196 "htonl",
197 "htons",
Chad Rosierabba0942011-11-30 01:51:49 +0000198 "iprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000199 "isascii",
200 "isdigit",
201 "labs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000202 "lchown",
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000203 "ldexp",
204 "ldexpf",
205 "ldexpl",
Meador Inge780a1862012-11-22 15:36:42 +0000206 "llabs",
Chad Rosier738da252011-11-30 19:19:00 +0000207 "log",
Chad Rosier738da252011-11-30 19:19:00 +0000208 "log10",
Chad Rosier738da252011-11-30 19:19:00 +0000209 "log10f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000210 "log10l",
Chad Rosier738da252011-11-30 19:19:00 +0000211 "log1p",
Chad Rosier738da252011-11-30 19:19:00 +0000212 "log1pf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000213 "log1pl",
214 "log2",
215 "log2f",
216 "log2l",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000217 "logb",
218 "logbf",
219 "logbl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000220 "logf",
221 "logl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000222 "lstat",
223 "lstat64",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000224 "malloc",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000225 "memalign",
226 "memccpy",
Nuno Lopes342cf782012-07-24 21:00:36 +0000227 "memchr",
228 "memcmp",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000229 "memcpy",
230 "memmove",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000231 "memrchr",
Chad Rosierabba0942011-11-30 01:51:49 +0000232 "memset",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000233 "memset_pattern16",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000234 "mkdir",
235 "mktime",
236 "modf",
237 "modff",
238 "modfl",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000239 "nearbyint",
240 "nearbyintf",
241 "nearbyintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000242 "ntohl",
243 "ntohs",
244 "open",
245 "open64",
246 "opendir",
247 "pclose",
248 "perror",
249 "popen",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000250 "posix_memalign",
Chad Rosier738da252011-11-30 19:19:00 +0000251 "pow",
252 "powf",
253 "powl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000254 "pread",
Meador Inge780a1862012-11-22 15:36:42 +0000255 "printf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000256 "putc",
Nuno Lopes342cf782012-07-24 21:00:36 +0000257 "putchar",
258 "puts",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000259 "pwrite",
260 "qsort",
261 "read",
262 "readlink",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000263 "realloc",
264 "reallocf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000265 "realpath",
266 "remove",
267 "rename",
268 "rewind",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000269 "rint",
270 "rintf",
271 "rintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000272 "rmdir",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000273 "round",
274 "roundf",
275 "roundl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000276 "scanf",
277 "setbuf",
278 "setitimer",
279 "setvbuf",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000280 "sin",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000281 "sinf",
Chad Rosier676c0932011-12-01 18:26:19 +0000282 "sinh",
Chad Rosier676c0932011-12-01 18:26:19 +0000283 "sinhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000284 "sinhl",
285 "sinl",
Chad Rosier676c0932011-12-01 18:26:19 +0000286 "siprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000287 "snprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000288 "sprintf",
Chad Rosier82e1bd82011-11-29 23:57:10 +0000289 "sqrt",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000290 "sqrtf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000291 "sqrtl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000292 "sscanf",
293 "stat",
294 "stat64",
295 "statvfs",
296 "statvfs64",
Meador Inge2526a422012-11-10 03:11:06 +0000297 "stpcpy",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000298 "stpncpy",
299 "strcasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000300 "strcat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000301 "strchr",
Meador Inge2526a422012-11-10 03:11:06 +0000302 "strcmp",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000303 "strcoll",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000304 "strcpy",
Meador Inge2526a422012-11-10 03:11:06 +0000305 "strcspn",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000306 "strdup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000307 "strlen",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000308 "strncasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000309 "strncat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000310 "strncmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000311 "strncpy",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000312 "strndup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000313 "strnlen",
Meador Inge2526a422012-11-10 03:11:06 +0000314 "strpbrk",
315 "strrchr",
316 "strspn",
317 "strstr",
318 "strtod",
319 "strtof",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000320 "strtok",
321 "strtok_r",
Meador Inge2526a422012-11-10 03:11:06 +0000322 "strtol",
323 "strtold",
324 "strtoll",
325 "strtoul",
326 "strtoull",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000327 "strxfrm",
328 "system",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000329 "tan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000330 "tanf",
331 "tanh",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000332 "tanhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000333 "tanhl",
334 "tanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000335 "times",
336 "tmpfile",
337 "tmpfile64",
Meador Inge780a1862012-11-22 15:36:42 +0000338 "toascii",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000339 "trunc",
340 "truncf",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000341 "truncl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000342 "uname",
343 "ungetc",
344 "unlink",
345 "unsetenv",
346 "utime",
347 "utimes",
348 "valloc",
349 "vfprintf",
350 "vfscanf",
351 "vprintf",
352 "vscanf",
353 "vsnprintf",
354 "vsprintf",
355 "vsscanf",
356 "write"
Eli Friedman489c0ff2011-11-17 01:27:36 +0000357 };
358
Bob Wilsond8d92d92013-11-03 06:48:38 +0000359static bool hasSinCosPiStret(const Triple &T) {
360 // Only Darwin variants have _stret versions of combined trig functions.
Bob Wilson9868d712014-10-09 05:43:30 +0000361 if (!T.isOSDarwin())
Bob Wilsond8d92d92013-11-03 06:48:38 +0000362 return false;
363
364 // The ABI is rather complicated on x86, so don't do anything special there.
365 if (T.getArch() == Triple::x86)
366 return false;
367
368 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
369 return false;
370
Bob Wilson9868d712014-10-09 05:43:30 +0000371 if (T.isiOS() && T.isOSVersionLT(7, 0))
Bob Wilsond8d92d92013-11-03 06:48:38 +0000372 return false;
373
374 return true;
375}
376
Chris Lattner0e125bb2011-02-18 21:50:34 +0000377/// initialize - Initialize the set of available library functions based on the
378/// specified target triple. This should be carefully written so that a missing
379/// target triple gets a sane set of defaults.
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000380static void initialize(TargetLibraryInfo &TLI, const Triple &T,
381 const char **StandardNames) {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000382 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
383
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000384#ifndef NDEBUG
385 // Verify that the StandardNames array is in alphabetical order.
386 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
387 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
388 llvm_unreachable("TargetLibraryInfo function names must be sorted");
389 }
390#endif // !NDEBUG
Tom Stellard36a03182014-04-02 19:53:29 +0000391
Tom Stellardd00a9232015-01-07 01:17:37 +0000392 // There are no library implementations of mempcy and memset for AMD gpus and
Tom Stellard36a03182014-04-02 19:53:29 +0000393 // these can be difficult to lower in the backend.
Tom Stellardd00a9232015-01-07 01:17:37 +0000394 if (T.getArch() == Triple::r600 ||
395 T.getArch() == Triple::amdgcn) {
Tom Stellard36a03182014-04-02 19:53:29 +0000396 TLI.setUnavailable(LibFunc::memcpy);
397 TLI.setUnavailable(LibFunc::memset);
398 TLI.setUnavailable(LibFunc::memset_pattern16);
399 return;
400 }
401
Nico Weberad156922014-03-07 18:08:54 +0000402 // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000403 if (T.isMacOSX()) {
404 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000405 TLI.setUnavailable(LibFunc::memset_pattern16);
Cameron Esfahani943908b2013-08-29 20:23:14 +0000406 } else if (T.isiOS()) {
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000407 if (T.isOSVersionLT(3, 0))
408 TLI.setUnavailable(LibFunc::memset_pattern16);
409 } else {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000410 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000411 }
Richard Osborne815de532011-03-03 13:17:51 +0000412
Bob Wilsond8d92d92013-11-03 06:48:38 +0000413 if (!hasSinCosPiStret(T)) {
414 TLI.setUnavailable(LibFunc::sinpi);
415 TLI.setUnavailable(LibFunc::sinpif);
416 TLI.setUnavailable(LibFunc::cospi);
417 TLI.setUnavailable(LibFunc::cospif);
418 TLI.setUnavailable(LibFunc::sincospi_stret);
Tim Northover103e6482014-02-04 16:28:20 +0000419 TLI.setUnavailable(LibFunc::sincospif_stret);
Bob Wilsond8d92d92013-11-03 06:48:38 +0000420 }
421
Eli Friedman489c0ff2011-11-17 01:27:36 +0000422 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
423 !T.isMacOSXVersionLT(10, 7)) {
424 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
425 // we don't care about) have two versions; on recent OSX, the one we want
426 // has a $UNIX2003 suffix. The two implementations are identical except
427 // for the return value in some edge cases. However, we don't want to
428 // generate code that depends on the old symbols.
429 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
430 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
431 }
432
Duncan Sandseeb50c82011-06-09 11:11:45 +0000433 // iprintf and friends are only available on XCore and TCE.
434 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne815de532011-03-03 13:17:51 +0000435 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000436 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborneaf52c522011-03-03 14:20:22 +0000437 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000438 }
Joe Groffa81bcbb2012-04-17 23:05:54 +0000439
Saleem Abdulrasool8dc8fb12014-07-24 22:09:06 +0000440 if (T.isOSWindows() && !T.isOSCygMing()) {
Joe Groffa81bcbb2012-04-17 23:05:54 +0000441 // Win32 does not support long double
442 TLI.setUnavailable(LibFunc::acosl);
443 TLI.setUnavailable(LibFunc::asinl);
444 TLI.setUnavailable(LibFunc::atanl);
445 TLI.setUnavailable(LibFunc::atan2l);
446 TLI.setUnavailable(LibFunc::ceill);
447 TLI.setUnavailable(LibFunc::copysignl);
448 TLI.setUnavailable(LibFunc::cosl);
449 TLI.setUnavailable(LibFunc::coshl);
450 TLI.setUnavailable(LibFunc::expl);
451 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
452 TLI.setUnavailable(LibFunc::fabsl);
453 TLI.setUnavailable(LibFunc::floorl);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000454 TLI.setUnavailable(LibFunc::fmaxl);
455 TLI.setUnavailable(LibFunc::fminl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000456 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000457 TLI.setUnavailable(LibFunc::frexpl);
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000458 TLI.setUnavailable(LibFunc::ldexpf);
459 TLI.setUnavailable(LibFunc::ldexpl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000460 TLI.setUnavailable(LibFunc::logl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000461 TLI.setUnavailable(LibFunc::modfl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000462 TLI.setUnavailable(LibFunc::powl);
463 TLI.setUnavailable(LibFunc::sinl);
464 TLI.setUnavailable(LibFunc::sinhl);
465 TLI.setUnavailable(LibFunc::sqrtl);
466 TLI.setUnavailable(LibFunc::tanl);
467 TLI.setUnavailable(LibFunc::tanhl);
468
469 // Win32 only has C89 math
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000470 TLI.setUnavailable(LibFunc::acosh);
471 TLI.setUnavailable(LibFunc::acoshf);
472 TLI.setUnavailable(LibFunc::acoshl);
473 TLI.setUnavailable(LibFunc::asinh);
474 TLI.setUnavailable(LibFunc::asinhf);
475 TLI.setUnavailable(LibFunc::asinhl);
476 TLI.setUnavailable(LibFunc::atanh);
477 TLI.setUnavailable(LibFunc::atanhf);
478 TLI.setUnavailable(LibFunc::atanhl);
479 TLI.setUnavailable(LibFunc::cbrt);
480 TLI.setUnavailable(LibFunc::cbrtf);
481 TLI.setUnavailable(LibFunc::cbrtl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000482 TLI.setUnavailable(LibFunc::exp2);
483 TLI.setUnavailable(LibFunc::exp2f);
484 TLI.setUnavailable(LibFunc::exp2l);
485 TLI.setUnavailable(LibFunc::expm1);
486 TLI.setUnavailable(LibFunc::expm1f);
487 TLI.setUnavailable(LibFunc::expm1l);
488 TLI.setUnavailable(LibFunc::log2);
489 TLI.setUnavailable(LibFunc::log2f);
490 TLI.setUnavailable(LibFunc::log2l);
491 TLI.setUnavailable(LibFunc::log1p);
492 TLI.setUnavailable(LibFunc::log1pf);
493 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000494 TLI.setUnavailable(LibFunc::logb);
495 TLI.setUnavailable(LibFunc::logbf);
496 TLI.setUnavailable(LibFunc::logbl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000497 TLI.setUnavailable(LibFunc::nearbyint);
498 TLI.setUnavailable(LibFunc::nearbyintf);
499 TLI.setUnavailable(LibFunc::nearbyintl);
500 TLI.setUnavailable(LibFunc::rint);
501 TLI.setUnavailable(LibFunc::rintf);
502 TLI.setUnavailable(LibFunc::rintl);
503 TLI.setUnavailable(LibFunc::round);
504 TLI.setUnavailable(LibFunc::roundf);
505 TLI.setUnavailable(LibFunc::roundl);
506 TLI.setUnavailable(LibFunc::trunc);
507 TLI.setUnavailable(LibFunc::truncf);
508 TLI.setUnavailable(LibFunc::truncl);
509
510 // Win32 provides some C99 math with mangled names
511 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
512
513 if (T.getArch() == Triple::x86) {
514 // Win32 on x86 implements single-precision math functions as macros
515 TLI.setUnavailable(LibFunc::acosf);
516 TLI.setUnavailable(LibFunc::asinf);
517 TLI.setUnavailable(LibFunc::atanf);
518 TLI.setUnavailable(LibFunc::atan2f);
519 TLI.setUnavailable(LibFunc::ceilf);
520 TLI.setUnavailable(LibFunc::copysignf);
521 TLI.setUnavailable(LibFunc::cosf);
522 TLI.setUnavailable(LibFunc::coshf);
523 TLI.setUnavailable(LibFunc::expf);
524 TLI.setUnavailable(LibFunc::floorf);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000525 TLI.setUnavailable(LibFunc::fminf);
526 TLI.setUnavailable(LibFunc::fmaxf);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000527 TLI.setUnavailable(LibFunc::fmodf);
528 TLI.setUnavailable(LibFunc::logf);
529 TLI.setUnavailable(LibFunc::powf);
530 TLI.setUnavailable(LibFunc::sinf);
531 TLI.setUnavailable(LibFunc::sinhf);
532 TLI.setUnavailable(LibFunc::sqrtf);
533 TLI.setUnavailable(LibFunc::tanf);
534 TLI.setUnavailable(LibFunc::tanhf);
535 }
Meador Inge2526a422012-11-10 03:11:06 +0000536
Meador Ingeb904e6e2013-03-05 21:47:40 +0000537 // Win32 does *not* provide provide these functions, but they are
538 // generally available on POSIX-compliant systems:
539 TLI.setUnavailable(LibFunc::access);
540 TLI.setUnavailable(LibFunc::bcmp);
541 TLI.setUnavailable(LibFunc::bcopy);
542 TLI.setUnavailable(LibFunc::bzero);
543 TLI.setUnavailable(LibFunc::chmod);
544 TLI.setUnavailable(LibFunc::chown);
545 TLI.setUnavailable(LibFunc::closedir);
546 TLI.setUnavailable(LibFunc::ctermid);
547 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge780a1862012-11-22 15:36:42 +0000548 TLI.setUnavailable(LibFunc::ffs);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000549 TLI.setUnavailable(LibFunc::fileno);
550 TLI.setUnavailable(LibFunc::flockfile);
551 TLI.setUnavailable(LibFunc::fseeko);
552 TLI.setUnavailable(LibFunc::fstat);
553 TLI.setUnavailable(LibFunc::fstatvfs);
554 TLI.setUnavailable(LibFunc::ftello);
555 TLI.setUnavailable(LibFunc::ftrylockfile);
556 TLI.setUnavailable(LibFunc::funlockfile);
557 TLI.setUnavailable(LibFunc::getc_unlocked);
558 TLI.setUnavailable(LibFunc::getitimer);
559 TLI.setUnavailable(LibFunc::getlogin_r);
560 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000561 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000562 TLI.setUnavailable(LibFunc::htonl);
563 TLI.setUnavailable(LibFunc::htons);
564 TLI.setUnavailable(LibFunc::lchown);
565 TLI.setUnavailable(LibFunc::lstat);
566 TLI.setUnavailable(LibFunc::memccpy);
567 TLI.setUnavailable(LibFunc::mkdir);
568 TLI.setUnavailable(LibFunc::ntohl);
569 TLI.setUnavailable(LibFunc::ntohs);
570 TLI.setUnavailable(LibFunc::open);
571 TLI.setUnavailable(LibFunc::opendir);
572 TLI.setUnavailable(LibFunc::pclose);
573 TLI.setUnavailable(LibFunc::popen);
574 TLI.setUnavailable(LibFunc::pread);
575 TLI.setUnavailable(LibFunc::pwrite);
576 TLI.setUnavailable(LibFunc::read);
577 TLI.setUnavailable(LibFunc::readlink);
578 TLI.setUnavailable(LibFunc::realpath);
579 TLI.setUnavailable(LibFunc::rmdir);
580 TLI.setUnavailable(LibFunc::setitimer);
581 TLI.setUnavailable(LibFunc::stat);
582 TLI.setUnavailable(LibFunc::statvfs);
583 TLI.setUnavailable(LibFunc::stpcpy);
584 TLI.setUnavailable(LibFunc::stpncpy);
585 TLI.setUnavailable(LibFunc::strcasecmp);
586 TLI.setUnavailable(LibFunc::strncasecmp);
587 TLI.setUnavailable(LibFunc::times);
588 TLI.setUnavailable(LibFunc::uname);
589 TLI.setUnavailable(LibFunc::unlink);
590 TLI.setUnavailable(LibFunc::unsetenv);
591 TLI.setUnavailable(LibFunc::utime);
592 TLI.setUnavailable(LibFunc::utimes);
593 TLI.setUnavailable(LibFunc::write);
Meador Inge780a1862012-11-22 15:36:42 +0000594
Meador Ingeb904e6e2013-03-05 21:47:40 +0000595 // Win32 does *not* provide provide these functions, but they are
596 // specified by C99:
597 TLI.setUnavailable(LibFunc::atoll);
598 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge780a1862012-11-22 15:36:42 +0000599 TLI.setUnavailable(LibFunc::llabs);
600 }
601
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000602 switch (T.getOS()) {
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000603 case Triple::MacOSX:
Chandler Carruthf5689f82013-12-28 02:40:19 +0000604 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
605 // and their names are __exp10 and __exp10f. exp10l is not available on
606 // OS X or iOS.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000607 TLI.setUnavailable(LibFunc::exp10l);
608 if (T.isMacOSXVersionLT(10, 9)) {
609 TLI.setUnavailable(LibFunc::exp10);
610 TLI.setUnavailable(LibFunc::exp10f);
611 } else {
612 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
613 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
614 }
615 break;
616 case Triple::IOS:
617 TLI.setUnavailable(LibFunc::exp10l);
618 if (T.isOSVersionLT(7, 0)) {
619 TLI.setUnavailable(LibFunc::exp10);
620 TLI.setUnavailable(LibFunc::exp10f);
621 } else {
622 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
623 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
624 }
625 break;
Chandler Carruthf5689f82013-12-28 02:40:19 +0000626 case Triple::Linux:
627 // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
628 // buggy prior to glibc version 2.18. Until this version is widely deployed
629 // or we have a reasonable detection strategy, we cannot use exp10 reliably
630 // on Linux.
631 //
632 // Fall through to disable all of them.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000633 default:
634 TLI.setUnavailable(LibFunc::exp10);
635 TLI.setUnavailable(LibFunc::exp10f);
636 TLI.setUnavailable(LibFunc::exp10l);
637 }
638
Meador Inge780a1862012-11-22 15:36:42 +0000639 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
640 // Linux (GLIBC):
641 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
642 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
643 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
644 switch (T.getOS()) {
645 case Triple::Darwin:
646 case Triple::MacOSX:
647 case Triple::IOS:
648 case Triple::FreeBSD:
649 case Triple::Linux:
650 break;
651 default:
652 TLI.setUnavailable(LibFunc::ffsl);
653 }
654
655 // ffsll is available on at least FreeBSD and Linux (GLIBC):
656 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
657 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
658 switch (T.getOS()) {
659 case Triple::FreeBSD:
660 case Triple::Linux:
661 break;
662 default:
663 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000664 }
Meador Ingeb904e6e2013-03-05 21:47:40 +0000665
666 // The following functions are available on at least Linux:
Cameron Esfahani943908b2013-08-29 20:23:14 +0000667 if (!T.isOSLinux()) {
Meador Ingeb904e6e2013-03-05 21:47:40 +0000668 TLI.setUnavailable(LibFunc::dunder_strdup);
669 TLI.setUnavailable(LibFunc::dunder_strtok_r);
670 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
671 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
672 TLI.setUnavailable(LibFunc::under_IO_getc);
673 TLI.setUnavailable(LibFunc::under_IO_putc);
674 TLI.setUnavailable(LibFunc::memalign);
675 TLI.setUnavailable(LibFunc::fopen64);
676 TLI.setUnavailable(LibFunc::fseeko64);
677 TLI.setUnavailable(LibFunc::fstat64);
678 TLI.setUnavailable(LibFunc::fstatvfs64);
679 TLI.setUnavailable(LibFunc::ftello64);
680 TLI.setUnavailable(LibFunc::lstat64);
681 TLI.setUnavailable(LibFunc::open64);
682 TLI.setUnavailable(LibFunc::stat64);
683 TLI.setUnavailable(LibFunc::statvfs64);
684 TLI.setUnavailable(LibFunc::tmpfile64);
685 }
Chris Lattner0e125bb2011-02-18 21:50:34 +0000686}
687
688
689TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
690 // Default to everything being available.
691 memset(AvailableArray, -1, sizeof(AvailableArray));
692
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000693 initialize(*this, Triple(), StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000694}
695
696TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
697 // Default to everything being available.
698 memset(AvailableArray, -1, sizeof(AvailableArray));
699
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000700 initialize(*this, T, StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000701}
Chris Lattner1341df92011-02-18 22:34:03 +0000702
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000703TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
704 : ImmutablePass(ID) {
705 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman489c0ff2011-11-17 01:27:36 +0000706 CustomNames = TLI.CustomNames;
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000707}
708
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000709namespace {
710struct StringComparator {
711 /// Compare two strings and return true if LHS is lexicographically less than
712 /// RHS. Requires that RHS doesn't contain any zero bytes.
713 bool operator()(const char *LHS, StringRef RHS) const {
714 // Compare prefixes with strncmp. If prefixes match we know that LHS is
715 // greater or equal to RHS as RHS can't contain any '\0'.
716 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
717 }
718
719 // Provided for compatibility with MSVC's debug mode.
720 bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
721 bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
Benjamin Kramerdfbcba52013-03-13 13:50:47 +0000722 bool operator()(const char *LHS, const char *RHS) const {
723 return std::strcmp(LHS, RHS) < 0;
724 }
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000725};
726}
727
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000728bool TargetLibraryInfo::getLibFunc(StringRef funcName,
729 LibFunc::Func &F) const {
730 const char **Start = &StandardNames[0];
731 const char **End = &StandardNames[LibFunc::NumLibFuncs];
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000732
733 // Filter out empty names and names containing null bytes, those can't be in
734 // our table.
735 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
736 return false;
737
Meador Ingeb904e6e2013-03-05 21:47:40 +0000738 // Check for \01 prefix that is used to mangle __asm declarations and
739 // strip it if present.
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000740 if (funcName.front() == '\01')
Meador Ingeb904e6e2013-03-05 21:47:40 +0000741 funcName = funcName.substr(1);
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000742 const char **I = std::lower_bound(Start, End, funcName, StringComparator());
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000743 if (I != End && *I == funcName) {
744 F = (LibFunc::Func)(I - Start);
745 return true;
746 }
747 return false;
748}
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000749
Chris Lattner1341df92011-02-18 22:34:03 +0000750/// disableAllFunctions - This disables all builtins, which is used for options
751/// like -fno-builtin.
752void TargetLibraryInfo::disableAllFunctions() {
753 memset(AvailableArray, 0, sizeof(AvailableArray));
754}