blob: 753562077f9e797b37cd2c6294140e6d03281bec [file] [log] [blame]
Chris Lattner0e125bb2011-02-18 21:50:34 +00001//===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the TargetLibraryInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Target/TargetLibraryInfo.h"
15#include "llvm/ADT/Triple.h"
16using namespace llvm;
17
18// Register the default implementation.
19INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20 "Target Library Information", false, true)
21char TargetLibraryInfo::ID = 0;
22
David Blaikiea379b1812011-12-20 02:50:00 +000023void TargetLibraryInfo::anchor() { }
24
Eli Friedman489c0ff2011-11-17 01:27:36 +000025const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
26 {
Meador Ingeb904e6e2013-03-05 21:47:40 +000027 "_IO_getc",
28 "_IO_putc",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000029 "_ZdaPv",
Richard Smith70523c72013-07-21 23:11:42 +000030 "_ZdaPvRKSt9nothrow_t",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000031 "_ZdlPv",
Richard Smith70523c72013-07-21 23:11:42 +000032 "_ZdlPvRKSt9nothrow_t",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000033 "_Znaj",
34 "_ZnajRKSt9nothrow_t",
35 "_Znam",
36 "_ZnamRKSt9nothrow_t",
37 "_Znwj",
38 "_ZnwjRKSt9nothrow_t",
39 "_Znwm",
40 "_ZnwmRKSt9nothrow_t",
Bob Wilsond8d92d92013-11-03 06:48:38 +000041 "__cospi",
42 "__cospif",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000043 "__cxa_atexit",
44 "__cxa_guard_abort",
45 "__cxa_guard_acquire",
46 "__cxa_guard_release",
Meador Ingeb904e6e2013-03-05 21:47:40 +000047 "__isoc99_scanf",
48 "__isoc99_sscanf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000049 "__memcpy_chk",
Bob Wilsond8d92d92013-11-03 06:48:38 +000050 "__sincospi_stret",
51 "__sincospi_stretf",
52 "__sinpi",
53 "__sinpif",
Preston Gurd048f99d2013-05-27 15:44:35 +000054 "__sqrt_finite",
55 "__sqrtf_finite",
56 "__sqrtl_finite",
Meador Ingeb904e6e2013-03-05 21:47:40 +000057 "__strdup",
58 "__strndup",
59 "__strtok_r",
Meador Inge780a1862012-11-22 15:36:42 +000060 "abs",
Meador Ingeb904e6e2013-03-05 21:47:40 +000061 "access",
Chad Rosier738da252011-11-30 19:19:00 +000062 "acos",
Chad Rosier738da252011-11-30 19:19:00 +000063 "acosf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000064 "acosh",
65 "acoshf",
66 "acoshl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000067 "acosl",
Chad Rosier738da252011-11-30 19:19:00 +000068 "asin",
Chad Rosier738da252011-11-30 19:19:00 +000069 "asinf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000070 "asinh",
71 "asinhf",
72 "asinhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000073 "asinl",
Chad Rosier738da252011-11-30 19:19:00 +000074 "atan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000075 "atan2",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000076 "atan2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000077 "atan2l",
78 "atanf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000079 "atanh",
80 "atanhf",
81 "atanhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000082 "atanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +000083 "atof",
84 "atoi",
85 "atol",
86 "atoll",
87 "bcmp",
88 "bcopy",
89 "bzero",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000090 "calloc",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000091 "cbrt",
92 "cbrtf",
93 "cbrtl",
Chad Rosier738da252011-11-30 19:19:00 +000094 "ceil",
Chad Rosier738da252011-11-30 19:19:00 +000095 "ceilf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000096 "ceill",
Meador Ingeb904e6e2013-03-05 21:47:40 +000097 "chmod",
98 "chown",
99 "clearerr",
100 "closedir",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000101 "copysign",
102 "copysignf",
103 "copysignl",
Chad Rosier738da252011-11-30 19:19:00 +0000104 "cos",
Chad Rosier738da252011-11-30 19:19:00 +0000105 "cosf",
106 "cosh",
Chad Rosier738da252011-11-30 19:19:00 +0000107 "coshf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000108 "coshl",
109 "cosl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000110 "ctermid",
Chad Rosier738da252011-11-30 19:19:00 +0000111 "exp",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000112 "exp10",
113 "exp10f",
114 "exp10l",
Chad Rosier738da252011-11-30 19:19:00 +0000115 "exp2",
Chad Rosier738da252011-11-30 19:19:00 +0000116 "exp2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000117 "exp2l",
118 "expf",
119 "expl",
Chad Rosier738da252011-11-30 19:19:00 +0000120 "expm1",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000121 "expm1f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000122 "expm1l",
Chad Rosier738da252011-11-30 19:19:00 +0000123 "fabs",
Chad Rosier738da252011-11-30 19:19:00 +0000124 "fabsf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000125 "fabsl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000126 "fclose",
127 "fdopen",
128 "feof",
129 "ferror",
130 "fflush",
Meador Inge780a1862012-11-22 15:36:42 +0000131 "ffs",
132 "ffsl",
133 "ffsll",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000134 "fgetc",
135 "fgetpos",
136 "fgets",
137 "fileno",
Chad Rosierabba0942011-11-30 01:51:49 +0000138 "fiprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000139 "flockfile",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000140 "floor",
141 "floorf",
142 "floorl",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000143 "fmod",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000144 "fmodf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000145 "fmodl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000146 "fopen",
147 "fopen64",
Meador Inge780a1862012-11-22 15:36:42 +0000148 "fprintf",
Nuno Lopes342cf782012-07-24 21:00:36 +0000149 "fputc",
Chad Rosierabba0942011-11-30 01:51:49 +0000150 "fputs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000151 "fread",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000152 "free",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000153 "frexp",
154 "frexpf",
155 "frexpl",
156 "fscanf",
157 "fseek",
158 "fseeko",
159 "fseeko64",
160 "fsetpos",
161 "fstat",
162 "fstat64",
163 "fstatvfs",
164 "fstatvfs64",
165 "ftell",
166 "ftello",
167 "ftello64",
168 "ftrylockfile",
169 "funlockfile",
Chad Rosierabba0942011-11-30 01:51:49 +0000170 "fwrite",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000171 "getc",
172 "getc_unlocked",
173 "getchar",
174 "getenv",
175 "getitimer",
176 "getlogin_r",
177 "getpwnam",
178 "gets",
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000179 "gettimeofday",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000180 "htonl",
181 "htons",
Chad Rosierabba0942011-11-30 01:51:49 +0000182 "iprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000183 "isascii",
184 "isdigit",
185 "labs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000186 "lchown",
Meador Inge780a1862012-11-22 15:36:42 +0000187 "llabs",
Chad Rosier738da252011-11-30 19:19:00 +0000188 "log",
Chad Rosier738da252011-11-30 19:19:00 +0000189 "log10",
Chad Rosier738da252011-11-30 19:19:00 +0000190 "log10f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000191 "log10l",
Chad Rosier738da252011-11-30 19:19:00 +0000192 "log1p",
Chad Rosier738da252011-11-30 19:19:00 +0000193 "log1pf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000194 "log1pl",
195 "log2",
196 "log2f",
197 "log2l",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000198 "logb",
199 "logbf",
200 "logbl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000201 "logf",
202 "logl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000203 "lstat",
204 "lstat64",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000205 "malloc",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000206 "memalign",
207 "memccpy",
Nuno Lopes342cf782012-07-24 21:00:36 +0000208 "memchr",
209 "memcmp",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000210 "memcpy",
211 "memmove",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000212 "memrchr",
Chad Rosierabba0942011-11-30 01:51:49 +0000213 "memset",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000214 "memset_pattern16",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000215 "mkdir",
216 "mktime",
217 "modf",
218 "modff",
219 "modfl",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000220 "nearbyint",
221 "nearbyintf",
222 "nearbyintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000223 "ntohl",
224 "ntohs",
225 "open",
226 "open64",
227 "opendir",
228 "pclose",
229 "perror",
230 "popen",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000231 "posix_memalign",
Chad Rosier738da252011-11-30 19:19:00 +0000232 "pow",
233 "powf",
234 "powl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000235 "pread",
Meador Inge780a1862012-11-22 15:36:42 +0000236 "printf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000237 "putc",
Nuno Lopes342cf782012-07-24 21:00:36 +0000238 "putchar",
239 "puts",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000240 "pwrite",
241 "qsort",
242 "read",
243 "readlink",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000244 "realloc",
245 "reallocf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000246 "realpath",
247 "remove",
248 "rename",
249 "rewind",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000250 "rint",
251 "rintf",
252 "rintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000253 "rmdir",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000254 "round",
255 "roundf",
256 "roundl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000257 "scanf",
258 "setbuf",
259 "setitimer",
260 "setvbuf",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000261 "sin",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000262 "sinf",
Chad Rosier676c0932011-12-01 18:26:19 +0000263 "sinh",
Chad Rosier676c0932011-12-01 18:26:19 +0000264 "sinhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000265 "sinhl",
266 "sinl",
Chad Rosier676c0932011-12-01 18:26:19 +0000267 "siprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000268 "snprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000269 "sprintf",
Chad Rosier82e1bd82011-11-29 23:57:10 +0000270 "sqrt",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000271 "sqrtf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000272 "sqrtl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000273 "sscanf",
274 "stat",
275 "stat64",
276 "statvfs",
277 "statvfs64",
Meador Inge2526a422012-11-10 03:11:06 +0000278 "stpcpy",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000279 "stpncpy",
280 "strcasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000281 "strcat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000282 "strchr",
Meador Inge2526a422012-11-10 03:11:06 +0000283 "strcmp",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000284 "strcoll",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000285 "strcpy",
Meador Inge2526a422012-11-10 03:11:06 +0000286 "strcspn",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000287 "strdup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000288 "strlen",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000289 "strncasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000290 "strncat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000291 "strncmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000292 "strncpy",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000293 "strndup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000294 "strnlen",
Meador Inge2526a422012-11-10 03:11:06 +0000295 "strpbrk",
296 "strrchr",
297 "strspn",
298 "strstr",
299 "strtod",
300 "strtof",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000301 "strtok",
302 "strtok_r",
Meador Inge2526a422012-11-10 03:11:06 +0000303 "strtol",
304 "strtold",
305 "strtoll",
306 "strtoul",
307 "strtoull",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000308 "strxfrm",
309 "system",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000310 "tan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000311 "tanf",
312 "tanh",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000313 "tanhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000314 "tanhl",
315 "tanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000316 "times",
317 "tmpfile",
318 "tmpfile64",
Meador Inge780a1862012-11-22 15:36:42 +0000319 "toascii",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000320 "trunc",
321 "truncf",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000322 "truncl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000323 "uname",
324 "ungetc",
325 "unlink",
326 "unsetenv",
327 "utime",
328 "utimes",
329 "valloc",
330 "vfprintf",
331 "vfscanf",
332 "vprintf",
333 "vscanf",
334 "vsnprintf",
335 "vsprintf",
336 "vsscanf",
337 "write"
Eli Friedman489c0ff2011-11-17 01:27:36 +0000338 };
339
Bob Wilsond8d92d92013-11-03 06:48:38 +0000340static bool hasSinCosPiStret(const Triple &T) {
341 // Only Darwin variants have _stret versions of combined trig functions.
342 if (!T.isMacOSX() && T.getOS() != Triple::IOS)
343 return false;
344
345 // The ABI is rather complicated on x86, so don't do anything special there.
346 if (T.getArch() == Triple::x86)
347 return false;
348
349 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
350 return false;
351
352 if (T.getOS() == Triple::IOS && T.isOSVersionLT(7, 0))
353 return false;
354
355 return true;
356}
357
Chris Lattner0e125bb2011-02-18 21:50:34 +0000358/// initialize - Initialize the set of available library functions based on the
359/// specified target triple. This should be carefully written so that a missing
360/// target triple gets a sane set of defaults.
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000361static void initialize(TargetLibraryInfo &TLI, const Triple &T,
362 const char **StandardNames) {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000363 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
364
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000365#ifndef NDEBUG
366 // Verify that the StandardNames array is in alphabetical order.
367 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
368 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
369 llvm_unreachable("TargetLibraryInfo function names must be sorted");
370 }
371#endif // !NDEBUG
Chris Lattner0e125bb2011-02-18 21:50:34 +0000372
373 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000374 if (T.isMacOSX()) {
375 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000376 TLI.setUnavailable(LibFunc::memset_pattern16);
Cameron Esfahani943908b2013-08-29 20:23:14 +0000377 } else if (T.isiOS()) {
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000378 if (T.isOSVersionLT(3, 0))
379 TLI.setUnavailable(LibFunc::memset_pattern16);
380 } else {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000381 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000382 }
Richard Osborne815de532011-03-03 13:17:51 +0000383
Bob Wilsond8d92d92013-11-03 06:48:38 +0000384 if (!hasSinCosPiStret(T)) {
385 TLI.setUnavailable(LibFunc::sinpi);
386 TLI.setUnavailable(LibFunc::sinpif);
387 TLI.setUnavailable(LibFunc::cospi);
388 TLI.setUnavailable(LibFunc::cospif);
389 TLI.setUnavailable(LibFunc::sincospi_stret);
390 TLI.setUnavailable(LibFunc::sincospi_stretf);
391 }
392
Eli Friedman489c0ff2011-11-17 01:27:36 +0000393 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
394 !T.isMacOSXVersionLT(10, 7)) {
395 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
396 // we don't care about) have two versions; on recent OSX, the one we want
397 // has a $UNIX2003 suffix. The two implementations are identical except
398 // for the return value in some edge cases. However, we don't want to
399 // generate code that depends on the old symbols.
400 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
401 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
402 }
403
Yi Jiangf92a5742013-12-12 01:55:04 +0000404 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
405 // and their names are __exp10 and __exp10f. exp10l is not available on
406 // OS X or iOS.
407 if (T.isMacOSX()) {
408 TLI.setUnavailable(LibFunc::exp10l);
409 if (T.isMacOSXVersionLT(10, 9)) {
410 TLI.setUnavailable(LibFunc::exp10);
411 TLI.setUnavailable(LibFunc::exp10f);
412 } else {
413 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
414 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
415 }
416 }
417
418 if (T.getOS() == Triple::IOS) {
419 TLI.setUnavailable(LibFunc::exp10l);
420 if (T.isOSVersionLT(7, 0)) {
421 TLI.setUnavailable(LibFunc::exp10);
422 TLI.setUnavailable(LibFunc::exp10f);
423 } else {
424 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
425 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
426 }
427 }
428
Duncan Sandseeb50c82011-06-09 11:11:45 +0000429 // iprintf and friends are only available on XCore and TCE.
430 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne815de532011-03-03 13:17:51 +0000431 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000432 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborneaf52c522011-03-03 14:20:22 +0000433 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000434 }
Joe Groffa81bcbb2012-04-17 23:05:54 +0000435
436 if (T.getOS() == Triple::Win32) {
437 // Win32 does not support long double
438 TLI.setUnavailable(LibFunc::acosl);
439 TLI.setUnavailable(LibFunc::asinl);
440 TLI.setUnavailable(LibFunc::atanl);
441 TLI.setUnavailable(LibFunc::atan2l);
442 TLI.setUnavailable(LibFunc::ceill);
443 TLI.setUnavailable(LibFunc::copysignl);
444 TLI.setUnavailable(LibFunc::cosl);
445 TLI.setUnavailable(LibFunc::coshl);
446 TLI.setUnavailable(LibFunc::expl);
447 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
448 TLI.setUnavailable(LibFunc::fabsl);
449 TLI.setUnavailable(LibFunc::floorl);
450 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000451 TLI.setUnavailable(LibFunc::frexpl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000452 TLI.setUnavailable(LibFunc::logl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000453 TLI.setUnavailable(LibFunc::modfl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000454 TLI.setUnavailable(LibFunc::powl);
455 TLI.setUnavailable(LibFunc::sinl);
456 TLI.setUnavailable(LibFunc::sinhl);
457 TLI.setUnavailable(LibFunc::sqrtl);
458 TLI.setUnavailable(LibFunc::tanl);
459 TLI.setUnavailable(LibFunc::tanhl);
460
461 // Win32 only has C89 math
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000462 TLI.setUnavailable(LibFunc::acosh);
463 TLI.setUnavailable(LibFunc::acoshf);
464 TLI.setUnavailable(LibFunc::acoshl);
465 TLI.setUnavailable(LibFunc::asinh);
466 TLI.setUnavailable(LibFunc::asinhf);
467 TLI.setUnavailable(LibFunc::asinhl);
468 TLI.setUnavailable(LibFunc::atanh);
469 TLI.setUnavailable(LibFunc::atanhf);
470 TLI.setUnavailable(LibFunc::atanhl);
471 TLI.setUnavailable(LibFunc::cbrt);
472 TLI.setUnavailable(LibFunc::cbrtf);
473 TLI.setUnavailable(LibFunc::cbrtl);
474 TLI.setUnavailable(LibFunc::exp10);
475 TLI.setUnavailable(LibFunc::exp10f);
476 TLI.setUnavailable(LibFunc::exp10l);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000477 TLI.setUnavailable(LibFunc::exp2);
478 TLI.setUnavailable(LibFunc::exp2f);
479 TLI.setUnavailable(LibFunc::exp2l);
480 TLI.setUnavailable(LibFunc::expm1);
481 TLI.setUnavailable(LibFunc::expm1f);
482 TLI.setUnavailable(LibFunc::expm1l);
483 TLI.setUnavailable(LibFunc::log2);
484 TLI.setUnavailable(LibFunc::log2f);
485 TLI.setUnavailable(LibFunc::log2l);
486 TLI.setUnavailable(LibFunc::log1p);
487 TLI.setUnavailable(LibFunc::log1pf);
488 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000489 TLI.setUnavailable(LibFunc::logb);
490 TLI.setUnavailable(LibFunc::logbf);
491 TLI.setUnavailable(LibFunc::logbl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000492 TLI.setUnavailable(LibFunc::nearbyint);
493 TLI.setUnavailable(LibFunc::nearbyintf);
494 TLI.setUnavailable(LibFunc::nearbyintl);
495 TLI.setUnavailable(LibFunc::rint);
496 TLI.setUnavailable(LibFunc::rintf);
497 TLI.setUnavailable(LibFunc::rintl);
498 TLI.setUnavailable(LibFunc::round);
499 TLI.setUnavailable(LibFunc::roundf);
500 TLI.setUnavailable(LibFunc::roundl);
501 TLI.setUnavailable(LibFunc::trunc);
502 TLI.setUnavailable(LibFunc::truncf);
503 TLI.setUnavailable(LibFunc::truncl);
504
505 // Win32 provides some C99 math with mangled names
506 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
507
508 if (T.getArch() == Triple::x86) {
509 // Win32 on x86 implements single-precision math functions as macros
510 TLI.setUnavailable(LibFunc::acosf);
511 TLI.setUnavailable(LibFunc::asinf);
512 TLI.setUnavailable(LibFunc::atanf);
513 TLI.setUnavailable(LibFunc::atan2f);
514 TLI.setUnavailable(LibFunc::ceilf);
515 TLI.setUnavailable(LibFunc::copysignf);
516 TLI.setUnavailable(LibFunc::cosf);
517 TLI.setUnavailable(LibFunc::coshf);
518 TLI.setUnavailable(LibFunc::expf);
519 TLI.setUnavailable(LibFunc::floorf);
520 TLI.setUnavailable(LibFunc::fmodf);
521 TLI.setUnavailable(LibFunc::logf);
522 TLI.setUnavailable(LibFunc::powf);
523 TLI.setUnavailable(LibFunc::sinf);
524 TLI.setUnavailable(LibFunc::sinhf);
525 TLI.setUnavailable(LibFunc::sqrtf);
526 TLI.setUnavailable(LibFunc::tanf);
527 TLI.setUnavailable(LibFunc::tanhf);
528 }
Meador Inge2526a422012-11-10 03:11:06 +0000529
Meador Ingeb904e6e2013-03-05 21:47:40 +0000530 // Win32 does *not* provide provide these functions, but they are
531 // generally available on POSIX-compliant systems:
532 TLI.setUnavailable(LibFunc::access);
533 TLI.setUnavailable(LibFunc::bcmp);
534 TLI.setUnavailable(LibFunc::bcopy);
535 TLI.setUnavailable(LibFunc::bzero);
536 TLI.setUnavailable(LibFunc::chmod);
537 TLI.setUnavailable(LibFunc::chown);
538 TLI.setUnavailable(LibFunc::closedir);
539 TLI.setUnavailable(LibFunc::ctermid);
540 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge780a1862012-11-22 15:36:42 +0000541 TLI.setUnavailable(LibFunc::ffs);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000542 TLI.setUnavailable(LibFunc::fileno);
543 TLI.setUnavailable(LibFunc::flockfile);
544 TLI.setUnavailable(LibFunc::fseeko);
545 TLI.setUnavailable(LibFunc::fstat);
546 TLI.setUnavailable(LibFunc::fstatvfs);
547 TLI.setUnavailable(LibFunc::ftello);
548 TLI.setUnavailable(LibFunc::ftrylockfile);
549 TLI.setUnavailable(LibFunc::funlockfile);
550 TLI.setUnavailable(LibFunc::getc_unlocked);
551 TLI.setUnavailable(LibFunc::getitimer);
552 TLI.setUnavailable(LibFunc::getlogin_r);
553 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000554 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000555 TLI.setUnavailable(LibFunc::htonl);
556 TLI.setUnavailable(LibFunc::htons);
557 TLI.setUnavailable(LibFunc::lchown);
558 TLI.setUnavailable(LibFunc::lstat);
559 TLI.setUnavailable(LibFunc::memccpy);
560 TLI.setUnavailable(LibFunc::mkdir);
561 TLI.setUnavailable(LibFunc::ntohl);
562 TLI.setUnavailable(LibFunc::ntohs);
563 TLI.setUnavailable(LibFunc::open);
564 TLI.setUnavailable(LibFunc::opendir);
565 TLI.setUnavailable(LibFunc::pclose);
566 TLI.setUnavailable(LibFunc::popen);
567 TLI.setUnavailable(LibFunc::pread);
568 TLI.setUnavailable(LibFunc::pwrite);
569 TLI.setUnavailable(LibFunc::read);
570 TLI.setUnavailable(LibFunc::readlink);
571 TLI.setUnavailable(LibFunc::realpath);
572 TLI.setUnavailable(LibFunc::rmdir);
573 TLI.setUnavailable(LibFunc::setitimer);
574 TLI.setUnavailable(LibFunc::stat);
575 TLI.setUnavailable(LibFunc::statvfs);
576 TLI.setUnavailable(LibFunc::stpcpy);
577 TLI.setUnavailable(LibFunc::stpncpy);
578 TLI.setUnavailable(LibFunc::strcasecmp);
579 TLI.setUnavailable(LibFunc::strncasecmp);
580 TLI.setUnavailable(LibFunc::times);
581 TLI.setUnavailable(LibFunc::uname);
582 TLI.setUnavailable(LibFunc::unlink);
583 TLI.setUnavailable(LibFunc::unsetenv);
584 TLI.setUnavailable(LibFunc::utime);
585 TLI.setUnavailable(LibFunc::utimes);
586 TLI.setUnavailable(LibFunc::write);
Meador Inge780a1862012-11-22 15:36:42 +0000587
Meador Ingeb904e6e2013-03-05 21:47:40 +0000588 // Win32 does *not* provide provide these functions, but they are
589 // specified by C99:
590 TLI.setUnavailable(LibFunc::atoll);
591 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge780a1862012-11-22 15:36:42 +0000592 TLI.setUnavailable(LibFunc::llabs);
593 }
594
595 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
596 // Linux (GLIBC):
597 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
598 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
599 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
600 switch (T.getOS()) {
601 case Triple::Darwin:
602 case Triple::MacOSX:
603 case Triple::IOS:
604 case Triple::FreeBSD:
605 case Triple::Linux:
606 break;
607 default:
608 TLI.setUnavailable(LibFunc::ffsl);
609 }
610
611 // ffsll is available on at least FreeBSD and Linux (GLIBC):
612 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
613 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
614 switch (T.getOS()) {
615 case Triple::FreeBSD:
616 case Triple::Linux:
617 break;
618 default:
619 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000620 }
Meador Ingeb904e6e2013-03-05 21:47:40 +0000621
622 // The following functions are available on at least Linux:
Cameron Esfahani943908b2013-08-29 20:23:14 +0000623 if (!T.isOSLinux()) {
Meador Ingeb904e6e2013-03-05 21:47:40 +0000624 TLI.setUnavailable(LibFunc::dunder_strdup);
625 TLI.setUnavailable(LibFunc::dunder_strtok_r);
626 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
627 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
628 TLI.setUnavailable(LibFunc::under_IO_getc);
629 TLI.setUnavailable(LibFunc::under_IO_putc);
630 TLI.setUnavailable(LibFunc::memalign);
631 TLI.setUnavailable(LibFunc::fopen64);
632 TLI.setUnavailable(LibFunc::fseeko64);
633 TLI.setUnavailable(LibFunc::fstat64);
634 TLI.setUnavailable(LibFunc::fstatvfs64);
635 TLI.setUnavailable(LibFunc::ftello64);
636 TLI.setUnavailable(LibFunc::lstat64);
637 TLI.setUnavailable(LibFunc::open64);
638 TLI.setUnavailable(LibFunc::stat64);
639 TLI.setUnavailable(LibFunc::statvfs64);
640 TLI.setUnavailable(LibFunc::tmpfile64);
641 }
Chris Lattner0e125bb2011-02-18 21:50:34 +0000642}
643
644
645TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
646 // Default to everything being available.
647 memset(AvailableArray, -1, sizeof(AvailableArray));
648
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000649 initialize(*this, Triple(), StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000650}
651
652TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
653 // Default to everything being available.
654 memset(AvailableArray, -1, sizeof(AvailableArray));
655
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000656 initialize(*this, T, StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000657}
Chris Lattner1341df92011-02-18 22:34:03 +0000658
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000659TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
660 : ImmutablePass(ID) {
661 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman489c0ff2011-11-17 01:27:36 +0000662 CustomNames = TLI.CustomNames;
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000663}
664
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000665namespace {
666struct StringComparator {
667 /// Compare two strings and return true if LHS is lexicographically less than
668 /// RHS. Requires that RHS doesn't contain any zero bytes.
669 bool operator()(const char *LHS, StringRef RHS) const {
670 // Compare prefixes with strncmp. If prefixes match we know that LHS is
671 // greater or equal to RHS as RHS can't contain any '\0'.
672 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
673 }
674
675 // Provided for compatibility with MSVC's debug mode.
676 bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
677 bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
Benjamin Kramerdfbcba52013-03-13 13:50:47 +0000678 bool operator()(const char *LHS, const char *RHS) const {
679 return std::strcmp(LHS, RHS) < 0;
680 }
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000681};
682}
683
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000684bool TargetLibraryInfo::getLibFunc(StringRef funcName,
685 LibFunc::Func &F) const {
686 const char **Start = &StandardNames[0];
687 const char **End = &StandardNames[LibFunc::NumLibFuncs];
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000688
689 // Filter out empty names and names containing null bytes, those can't be in
690 // our table.
691 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
692 return false;
693
Meador Ingeb904e6e2013-03-05 21:47:40 +0000694 // Check for \01 prefix that is used to mangle __asm declarations and
695 // strip it if present.
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000696 if (funcName.front() == '\01')
Meador Ingeb904e6e2013-03-05 21:47:40 +0000697 funcName = funcName.substr(1);
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000698 const char **I = std::lower_bound(Start, End, funcName, StringComparator());
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000699 if (I != End && *I == funcName) {
700 F = (LibFunc::Func)(I - Start);
701 return true;
702 }
703 return false;
704}
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000705
Chris Lattner1341df92011-02-18 22:34:03 +0000706/// disableAllFunctions - This disables all builtins, which is used for options
707/// like -fno-builtin.
708void TargetLibraryInfo::disableAllFunctions() {
709 memset(AvailableArray, 0, sizeof(AvailableArray));
710}