blob: 5ebd12657490651554a698c9ff139651b8c8beb0 [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
Chandler Carruth62d42152015-01-15 02:16:27 +000014#include "llvm/Analysis/TargetLibraryInfo.h"
Chris Lattner0e125bb2011-02-18 21:50:34 +000015#include "llvm/ADT/Triple.h"
16using namespace llvm;
17
Chandler Carruthc0291862015-01-24 02:06:09 +000018const char* TargetLibraryInfoImpl::StandardNames[LibFunc::NumLibFuncs] =
Eli Friedman489c0ff2011-11-17 01:27:36 +000019 {
Meador Ingeb904e6e2013-03-05 21:47:40 +000020 "_IO_getc",
21 "_IO_putc",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000022 "_ZdaPv",
Richard Smith70523c72013-07-21 23:11:42 +000023 "_ZdaPvRKSt9nothrow_t",
Richard Smith1ed42292014-10-03 20:17:06 +000024 "_ZdaPvj",
25 "_ZdaPvm",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000026 "_ZdlPv",
Richard Smith70523c72013-07-21 23:11:42 +000027 "_ZdlPvRKSt9nothrow_t",
Richard Smith1ed42292014-10-03 20:17:06 +000028 "_ZdlPvj",
29 "_ZdlPvm",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000030 "_Znaj",
31 "_ZnajRKSt9nothrow_t",
32 "_Znam",
33 "_ZnamRKSt9nothrow_t",
34 "_Znwj",
35 "_ZnwjRKSt9nothrow_t",
36 "_Znwm",
37 "_ZnwmRKSt9nothrow_t",
Bob Wilsond8d92d92013-11-03 06:48:38 +000038 "__cospi",
39 "__cospif",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000040 "__cxa_atexit",
41 "__cxa_guard_abort",
42 "__cxa_guard_acquire",
43 "__cxa_guard_release",
Meador Ingeb904e6e2013-03-05 21:47:40 +000044 "__isoc99_scanf",
45 "__isoc99_sscanf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000046 "__memcpy_chk",
Ahmed Bougacha55a333d2014-11-12 21:23:34 +000047 "__memmove_chk",
48 "__memset_chk",
Bob Wilsond8d92d92013-11-03 06:48:38 +000049 "__sincospi_stret",
Tim Northover103e6482014-02-04 16:28:20 +000050 "__sincospif_stret",
Bob Wilsond8d92d92013-11-03 06:48:38 +000051 "__sinpi",
52 "__sinpif",
Preston Gurd048f99d2013-05-27 15:44:35 +000053 "__sqrt_finite",
54 "__sqrtf_finite",
55 "__sqrtl_finite",
Ahmed Bougacha55a333d2014-11-12 21:23:34 +000056 "__stpcpy_chk",
57 "__stpncpy_chk",
58 "__strcpy_chk",
Meador Ingeb904e6e2013-03-05 21:47:40 +000059 "__strdup",
Ahmed Bougacha55a333d2014-11-12 21:23:34 +000060 "__strncpy_chk",
Meador Ingeb904e6e2013-03-05 21:47:40 +000061 "__strndup",
62 "__strtok_r",
Meador Inge780a1862012-11-22 15:36:42 +000063 "abs",
Meador Ingeb904e6e2013-03-05 21:47:40 +000064 "access",
Chad Rosier738da252011-11-30 19:19:00 +000065 "acos",
Chad Rosier738da252011-11-30 19:19:00 +000066 "acosf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000067 "acosh",
68 "acoshf",
69 "acoshl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000070 "acosl",
Chad Rosier738da252011-11-30 19:19:00 +000071 "asin",
Chad Rosier738da252011-11-30 19:19:00 +000072 "asinf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000073 "asinh",
74 "asinhf",
75 "asinhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000076 "asinl",
Chad Rosier738da252011-11-30 19:19:00 +000077 "atan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000078 "atan2",
Chad Rosier10fe1fe2011-12-01 17:54:37 +000079 "atan2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000080 "atan2l",
81 "atanf",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000082 "atanh",
83 "atanhf",
84 "atanhl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000085 "atanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +000086 "atof",
87 "atoi",
88 "atol",
89 "atoll",
90 "bcmp",
91 "bcopy",
92 "bzero",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +000093 "calloc",
Chad Rosier7fb0cd22012-08-21 23:28:56 +000094 "cbrt",
95 "cbrtf",
96 "cbrtl",
Chad Rosier738da252011-11-30 19:19:00 +000097 "ceil",
Chad Rosier738da252011-11-30 19:19:00 +000098 "ceilf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +000099 "ceill",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000100 "chmod",
101 "chown",
102 "clearerr",
103 "closedir",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000104 "copysign",
105 "copysignf",
106 "copysignl",
Chad Rosier738da252011-11-30 19:19:00 +0000107 "cos",
Chad Rosier738da252011-11-30 19:19:00 +0000108 "cosf",
109 "cosh",
Chad Rosier738da252011-11-30 19:19:00 +0000110 "coshf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000111 "coshl",
112 "cosl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000113 "ctermid",
Chad Rosier738da252011-11-30 19:19:00 +0000114 "exp",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000115 "exp10",
116 "exp10f",
117 "exp10l",
Chad Rosier738da252011-11-30 19:19:00 +0000118 "exp2",
Chad Rosier738da252011-11-30 19:19:00 +0000119 "exp2f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000120 "exp2l",
121 "expf",
122 "expl",
Chad Rosier738da252011-11-30 19:19:00 +0000123 "expm1",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000124 "expm1f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000125 "expm1l",
Chad Rosier738da252011-11-30 19:19:00 +0000126 "fabs",
Chad Rosier738da252011-11-30 19:19:00 +0000127 "fabsf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000128 "fabsl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000129 "fclose",
130 "fdopen",
131 "feof",
132 "ferror",
133 "fflush",
Meador Inge780a1862012-11-22 15:36:42 +0000134 "ffs",
135 "ffsl",
136 "ffsll",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000137 "fgetc",
138 "fgetpos",
139 "fgets",
140 "fileno",
Chad Rosierabba0942011-11-30 01:51:49 +0000141 "fiprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000142 "flockfile",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000143 "floor",
144 "floorf",
145 "floorl",
Yi Jiang6ab044e2013-12-16 22:42:40 +0000146 "fmax",
147 "fmaxf",
148 "fmaxl",
149 "fmin",
150 "fminf",
151 "fminl",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000152 "fmod",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000153 "fmodf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000154 "fmodl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000155 "fopen",
156 "fopen64",
Meador Inge780a1862012-11-22 15:36:42 +0000157 "fprintf",
Nuno Lopes342cf782012-07-24 21:00:36 +0000158 "fputc",
Chad Rosierabba0942011-11-30 01:51:49 +0000159 "fputs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000160 "fread",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000161 "free",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000162 "frexp",
163 "frexpf",
164 "frexpl",
165 "fscanf",
166 "fseek",
167 "fseeko",
168 "fseeko64",
169 "fsetpos",
170 "fstat",
171 "fstat64",
172 "fstatvfs",
173 "fstatvfs64",
174 "ftell",
175 "ftello",
176 "ftello64",
177 "ftrylockfile",
178 "funlockfile",
Chad Rosierabba0942011-11-30 01:51:49 +0000179 "fwrite",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000180 "getc",
181 "getc_unlocked",
182 "getchar",
183 "getenv",
184 "getitimer",
185 "getlogin_r",
186 "getpwnam",
187 "gets",
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000188 "gettimeofday",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000189 "htonl",
190 "htons",
Chad Rosierabba0942011-11-30 01:51:49 +0000191 "iprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000192 "isascii",
193 "isdigit",
194 "labs",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000195 "lchown",
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000196 "ldexp",
197 "ldexpf",
198 "ldexpl",
Meador Inge780a1862012-11-22 15:36:42 +0000199 "llabs",
Chad Rosier738da252011-11-30 19:19:00 +0000200 "log",
Chad Rosier738da252011-11-30 19:19:00 +0000201 "log10",
Chad Rosier738da252011-11-30 19:19:00 +0000202 "log10f",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000203 "log10l",
Chad Rosier738da252011-11-30 19:19:00 +0000204 "log1p",
Chad Rosier738da252011-11-30 19:19:00 +0000205 "log1pf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000206 "log1pl",
207 "log2",
208 "log2f",
209 "log2l",
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000210 "logb",
211 "logbf",
212 "logbl",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000213 "logf",
214 "logl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000215 "lstat",
216 "lstat64",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000217 "malloc",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000218 "memalign",
219 "memccpy",
Nuno Lopes342cf782012-07-24 21:00:36 +0000220 "memchr",
221 "memcmp",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000222 "memcpy",
223 "memmove",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000224 "memrchr",
Chad Rosierabba0942011-11-30 01:51:49 +0000225 "memset",
Eli Friedman489c0ff2011-11-17 01:27:36 +0000226 "memset_pattern16",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000227 "mkdir",
228 "mktime",
229 "modf",
230 "modff",
231 "modfl",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000232 "nearbyint",
233 "nearbyintf",
234 "nearbyintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000235 "ntohl",
236 "ntohs",
237 "open",
238 "open64",
239 "opendir",
240 "pclose",
241 "perror",
242 "popen",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000243 "posix_memalign",
Chad Rosier738da252011-11-30 19:19:00 +0000244 "pow",
245 "powf",
246 "powl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000247 "pread",
Meador Inge780a1862012-11-22 15:36:42 +0000248 "printf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000249 "putc",
Nuno Lopes342cf782012-07-24 21:00:36 +0000250 "putchar",
251 "puts",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000252 "pwrite",
253 "qsort",
254 "read",
255 "readlink",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000256 "realloc",
257 "reallocf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000258 "realpath",
259 "remove",
260 "rename",
261 "rewind",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000262 "rint",
263 "rintf",
264 "rintl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000265 "rmdir",
Joe Groffa81bcbb2012-04-17 23:05:54 +0000266 "round",
267 "roundf",
268 "roundl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000269 "scanf",
270 "setbuf",
271 "setitimer",
272 "setvbuf",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000273 "sin",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000274 "sinf",
Chad Rosier676c0932011-12-01 18:26:19 +0000275 "sinh",
Chad Rosier676c0932011-12-01 18:26:19 +0000276 "sinhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000277 "sinhl",
278 "sinl",
Chad Rosier676c0932011-12-01 18:26:19 +0000279 "siprintf",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000280 "snprintf",
Meador Inge780a1862012-11-22 15:36:42 +0000281 "sprintf",
Chad Rosier82e1bd82011-11-29 23:57:10 +0000282 "sqrt",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000283 "sqrtf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000284 "sqrtl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000285 "sscanf",
286 "stat",
287 "stat64",
288 "statvfs",
289 "statvfs64",
Meador Inge2526a422012-11-10 03:11:06 +0000290 "stpcpy",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000291 "stpncpy",
292 "strcasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000293 "strcat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000294 "strchr",
Meador Inge2526a422012-11-10 03:11:06 +0000295 "strcmp",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000296 "strcoll",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000297 "strcpy",
Meador Inge2526a422012-11-10 03:11:06 +0000298 "strcspn",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000299 "strdup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000300 "strlen",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000301 "strncasecmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000302 "strncat",
Nuno Lopes342cf782012-07-24 21:00:36 +0000303 "strncmp",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000304 "strncpy",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000305 "strndup",
Nuno Lopes20f5a7a2012-07-24 17:25:06 +0000306 "strnlen",
Meador Inge2526a422012-11-10 03:11:06 +0000307 "strpbrk",
308 "strrchr",
309 "strspn",
310 "strstr",
311 "strtod",
312 "strtof",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000313 "strtok",
314 "strtok_r",
Meador Inge2526a422012-11-10 03:11:06 +0000315 "strtol",
316 "strtold",
317 "strtoll",
318 "strtoul",
319 "strtoull",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000320 "strxfrm",
321 "system",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000322 "tan",
Chad Rosier10fe1fe2011-12-01 17:54:37 +0000323 "tanf",
324 "tanh",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000325 "tanhf",
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000326 "tanhl",
327 "tanl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000328 "times",
329 "tmpfile",
330 "tmpfile64",
Meador Inge780a1862012-11-22 15:36:42 +0000331 "toascii",
Owen Andersonbb15fec2011-12-08 22:15:21 +0000332 "trunc",
333 "truncf",
Benjamin Kramer8bcc9712012-08-29 15:32:21 +0000334 "truncl",
Meador Ingeb904e6e2013-03-05 21:47:40 +0000335 "uname",
336 "ungetc",
337 "unlink",
338 "unsetenv",
339 "utime",
340 "utimes",
341 "valloc",
342 "vfprintf",
343 "vfscanf",
344 "vprintf",
345 "vscanf",
346 "vsnprintf",
347 "vsprintf",
348 "vsscanf",
349 "write"
Eli Friedman489c0ff2011-11-17 01:27:36 +0000350 };
351
Bob Wilsond8d92d92013-11-03 06:48:38 +0000352static bool hasSinCosPiStret(const Triple &T) {
353 // Only Darwin variants have _stret versions of combined trig functions.
Bob Wilson9868d712014-10-09 05:43:30 +0000354 if (!T.isOSDarwin())
Bob Wilsond8d92d92013-11-03 06:48:38 +0000355 return false;
356
357 // The ABI is rather complicated on x86, so don't do anything special there.
358 if (T.getArch() == Triple::x86)
359 return false;
360
361 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
362 return false;
363
Bob Wilson9868d712014-10-09 05:43:30 +0000364 if (T.isiOS() && T.isOSVersionLT(7, 0))
Bob Wilsond8d92d92013-11-03 06:48:38 +0000365 return false;
366
367 return true;
368}
369
Chris Lattner0e125bb2011-02-18 21:50:34 +0000370/// initialize - Initialize the set of available library functions based on the
371/// specified target triple. This should be carefully written so that a missing
372/// target triple gets a sane set of defaults.
Chandler Carruthc0291862015-01-24 02:06:09 +0000373static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000374 const char **StandardNames) {
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000375#ifndef NDEBUG
376 // Verify that the StandardNames array is in alphabetical order.
377 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
378 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
Chandler Carruthc0291862015-01-24 02:06:09 +0000379 llvm_unreachable("TargetLibraryInfoImpl function names must be sorted");
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000380 }
381#endif // !NDEBUG
Tom Stellard36a03182014-04-02 19:53:29 +0000382
Tom Stellardd00a9232015-01-07 01:17:37 +0000383 // There are no library implementations of mempcy and memset for AMD gpus and
Tom Stellard36a03182014-04-02 19:53:29 +0000384 // these can be difficult to lower in the backend.
Tom Stellardd00a9232015-01-07 01:17:37 +0000385 if (T.getArch() == Triple::r600 ||
386 T.getArch() == Triple::amdgcn) {
Tom Stellard36a03182014-04-02 19:53:29 +0000387 TLI.setUnavailable(LibFunc::memcpy);
388 TLI.setUnavailable(LibFunc::memset);
389 TLI.setUnavailable(LibFunc::memset_pattern16);
390 return;
391 }
392
Nico Weberad156922014-03-07 18:08:54 +0000393 // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000394 if (T.isMacOSX()) {
395 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000396 TLI.setUnavailable(LibFunc::memset_pattern16);
Cameron Esfahani943908b2013-08-29 20:23:14 +0000397 } else if (T.isiOS()) {
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000398 if (T.isOSVersionLT(3, 0))
399 TLI.setUnavailable(LibFunc::memset_pattern16);
400 } else {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000401 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar9483bb62011-04-19 20:44:08 +0000402 }
Richard Osborne815de532011-03-03 13:17:51 +0000403
Bob Wilsond8d92d92013-11-03 06:48:38 +0000404 if (!hasSinCosPiStret(T)) {
405 TLI.setUnavailable(LibFunc::sinpi);
406 TLI.setUnavailable(LibFunc::sinpif);
407 TLI.setUnavailable(LibFunc::cospi);
408 TLI.setUnavailable(LibFunc::cospif);
409 TLI.setUnavailable(LibFunc::sincospi_stret);
Tim Northover103e6482014-02-04 16:28:20 +0000410 TLI.setUnavailable(LibFunc::sincospif_stret);
Bob Wilsond8d92d92013-11-03 06:48:38 +0000411 }
412
Eli Friedman489c0ff2011-11-17 01:27:36 +0000413 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
414 !T.isMacOSXVersionLT(10, 7)) {
415 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
416 // we don't care about) have two versions; on recent OSX, the one we want
417 // has a $UNIX2003 suffix. The two implementations are identical except
418 // for the return value in some edge cases. However, we don't want to
419 // generate code that depends on the old symbols.
420 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
421 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
422 }
423
Duncan Sandseeb50c82011-06-09 11:11:45 +0000424 // iprintf and friends are only available on XCore and TCE.
425 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne815de532011-03-03 13:17:51 +0000426 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000427 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborneaf52c522011-03-03 14:20:22 +0000428 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne2dfb8882011-03-03 14:09:28 +0000429 }
Joe Groffa81bcbb2012-04-17 23:05:54 +0000430
Saleem Abdulrasool8dc8fb12014-07-24 22:09:06 +0000431 if (T.isOSWindows() && !T.isOSCygMing()) {
Joe Groffa81bcbb2012-04-17 23:05:54 +0000432 // Win32 does not support long double
433 TLI.setUnavailable(LibFunc::acosl);
434 TLI.setUnavailable(LibFunc::asinl);
435 TLI.setUnavailable(LibFunc::atanl);
436 TLI.setUnavailable(LibFunc::atan2l);
437 TLI.setUnavailable(LibFunc::ceill);
438 TLI.setUnavailable(LibFunc::copysignl);
439 TLI.setUnavailable(LibFunc::cosl);
440 TLI.setUnavailable(LibFunc::coshl);
441 TLI.setUnavailable(LibFunc::expl);
442 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
443 TLI.setUnavailable(LibFunc::fabsl);
444 TLI.setUnavailable(LibFunc::floorl);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000445 TLI.setUnavailable(LibFunc::fmaxl);
446 TLI.setUnavailable(LibFunc::fminl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000447 TLI.setUnavailable(LibFunc::fmodl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000448 TLI.setUnavailable(LibFunc::frexpl);
Benjamin Kramer34f460e2014-02-04 20:27:23 +0000449 TLI.setUnavailable(LibFunc::ldexpf);
450 TLI.setUnavailable(LibFunc::ldexpl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000451 TLI.setUnavailable(LibFunc::logl);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000452 TLI.setUnavailable(LibFunc::modfl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000453 TLI.setUnavailable(LibFunc::powl);
454 TLI.setUnavailable(LibFunc::sinl);
455 TLI.setUnavailable(LibFunc::sinhl);
456 TLI.setUnavailable(LibFunc::sqrtl);
457 TLI.setUnavailable(LibFunc::tanl);
458 TLI.setUnavailable(LibFunc::tanhl);
459
460 // Win32 only has C89 math
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000461 TLI.setUnavailable(LibFunc::acosh);
462 TLI.setUnavailable(LibFunc::acoshf);
463 TLI.setUnavailable(LibFunc::acoshl);
464 TLI.setUnavailable(LibFunc::asinh);
465 TLI.setUnavailable(LibFunc::asinhf);
466 TLI.setUnavailable(LibFunc::asinhl);
467 TLI.setUnavailable(LibFunc::atanh);
468 TLI.setUnavailable(LibFunc::atanhf);
469 TLI.setUnavailable(LibFunc::atanhl);
470 TLI.setUnavailable(LibFunc::cbrt);
471 TLI.setUnavailable(LibFunc::cbrtf);
472 TLI.setUnavailable(LibFunc::cbrtl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000473 TLI.setUnavailable(LibFunc::exp2);
474 TLI.setUnavailable(LibFunc::exp2f);
475 TLI.setUnavailable(LibFunc::exp2l);
476 TLI.setUnavailable(LibFunc::expm1);
477 TLI.setUnavailable(LibFunc::expm1f);
478 TLI.setUnavailable(LibFunc::expm1l);
479 TLI.setUnavailable(LibFunc::log2);
480 TLI.setUnavailable(LibFunc::log2f);
481 TLI.setUnavailable(LibFunc::log2l);
482 TLI.setUnavailable(LibFunc::log1p);
483 TLI.setUnavailable(LibFunc::log1pf);
484 TLI.setUnavailable(LibFunc::log1pl);
Chad Rosier7fb0cd22012-08-21 23:28:56 +0000485 TLI.setUnavailable(LibFunc::logb);
486 TLI.setUnavailable(LibFunc::logbf);
487 TLI.setUnavailable(LibFunc::logbl);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000488 TLI.setUnavailable(LibFunc::nearbyint);
489 TLI.setUnavailable(LibFunc::nearbyintf);
490 TLI.setUnavailable(LibFunc::nearbyintl);
491 TLI.setUnavailable(LibFunc::rint);
492 TLI.setUnavailable(LibFunc::rintf);
493 TLI.setUnavailable(LibFunc::rintl);
494 TLI.setUnavailable(LibFunc::round);
495 TLI.setUnavailable(LibFunc::roundf);
496 TLI.setUnavailable(LibFunc::roundl);
497 TLI.setUnavailable(LibFunc::trunc);
498 TLI.setUnavailable(LibFunc::truncf);
499 TLI.setUnavailable(LibFunc::truncl);
500
501 // Win32 provides some C99 math with mangled names
502 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
503
504 if (T.getArch() == Triple::x86) {
505 // Win32 on x86 implements single-precision math functions as macros
506 TLI.setUnavailable(LibFunc::acosf);
507 TLI.setUnavailable(LibFunc::asinf);
508 TLI.setUnavailable(LibFunc::atanf);
509 TLI.setUnavailable(LibFunc::atan2f);
510 TLI.setUnavailable(LibFunc::ceilf);
511 TLI.setUnavailable(LibFunc::copysignf);
512 TLI.setUnavailable(LibFunc::cosf);
513 TLI.setUnavailable(LibFunc::coshf);
514 TLI.setUnavailable(LibFunc::expf);
515 TLI.setUnavailable(LibFunc::floorf);
Yi Jiang6ab044e2013-12-16 22:42:40 +0000516 TLI.setUnavailable(LibFunc::fminf);
517 TLI.setUnavailable(LibFunc::fmaxf);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000518 TLI.setUnavailable(LibFunc::fmodf);
519 TLI.setUnavailable(LibFunc::logf);
520 TLI.setUnavailable(LibFunc::powf);
521 TLI.setUnavailable(LibFunc::sinf);
522 TLI.setUnavailable(LibFunc::sinhf);
523 TLI.setUnavailable(LibFunc::sqrtf);
524 TLI.setUnavailable(LibFunc::tanf);
525 TLI.setUnavailable(LibFunc::tanhf);
526 }
Meador Inge2526a422012-11-10 03:11:06 +0000527
Meador Ingeb904e6e2013-03-05 21:47:40 +0000528 // Win32 does *not* provide provide these functions, but they are
529 // generally available on POSIX-compliant systems:
530 TLI.setUnavailable(LibFunc::access);
531 TLI.setUnavailable(LibFunc::bcmp);
532 TLI.setUnavailable(LibFunc::bcopy);
533 TLI.setUnavailable(LibFunc::bzero);
534 TLI.setUnavailable(LibFunc::chmod);
535 TLI.setUnavailable(LibFunc::chown);
536 TLI.setUnavailable(LibFunc::closedir);
537 TLI.setUnavailable(LibFunc::ctermid);
538 TLI.setUnavailable(LibFunc::fdopen);
Meador Inge780a1862012-11-22 15:36:42 +0000539 TLI.setUnavailable(LibFunc::ffs);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000540 TLI.setUnavailable(LibFunc::fileno);
541 TLI.setUnavailable(LibFunc::flockfile);
542 TLI.setUnavailable(LibFunc::fseeko);
543 TLI.setUnavailable(LibFunc::fstat);
544 TLI.setUnavailable(LibFunc::fstatvfs);
545 TLI.setUnavailable(LibFunc::ftello);
546 TLI.setUnavailable(LibFunc::ftrylockfile);
547 TLI.setUnavailable(LibFunc::funlockfile);
548 TLI.setUnavailable(LibFunc::getc_unlocked);
549 TLI.setUnavailable(LibFunc::getitimer);
550 TLI.setUnavailable(LibFunc::getlogin_r);
551 TLI.setUnavailable(LibFunc::getpwnam);
Michael Gottesmanf7459c72013-07-03 04:00:51 +0000552 TLI.setUnavailable(LibFunc::gettimeofday);
Meador Ingeb904e6e2013-03-05 21:47:40 +0000553 TLI.setUnavailable(LibFunc::htonl);
554 TLI.setUnavailable(LibFunc::htons);
555 TLI.setUnavailable(LibFunc::lchown);
556 TLI.setUnavailable(LibFunc::lstat);
557 TLI.setUnavailable(LibFunc::memccpy);
558 TLI.setUnavailable(LibFunc::mkdir);
559 TLI.setUnavailable(LibFunc::ntohl);
560 TLI.setUnavailable(LibFunc::ntohs);
561 TLI.setUnavailable(LibFunc::open);
562 TLI.setUnavailable(LibFunc::opendir);
563 TLI.setUnavailable(LibFunc::pclose);
564 TLI.setUnavailable(LibFunc::popen);
565 TLI.setUnavailable(LibFunc::pread);
566 TLI.setUnavailable(LibFunc::pwrite);
567 TLI.setUnavailable(LibFunc::read);
568 TLI.setUnavailable(LibFunc::readlink);
569 TLI.setUnavailable(LibFunc::realpath);
570 TLI.setUnavailable(LibFunc::rmdir);
571 TLI.setUnavailable(LibFunc::setitimer);
572 TLI.setUnavailable(LibFunc::stat);
573 TLI.setUnavailable(LibFunc::statvfs);
574 TLI.setUnavailable(LibFunc::stpcpy);
575 TLI.setUnavailable(LibFunc::stpncpy);
576 TLI.setUnavailable(LibFunc::strcasecmp);
577 TLI.setUnavailable(LibFunc::strncasecmp);
578 TLI.setUnavailable(LibFunc::times);
579 TLI.setUnavailable(LibFunc::uname);
580 TLI.setUnavailable(LibFunc::unlink);
581 TLI.setUnavailable(LibFunc::unsetenv);
582 TLI.setUnavailable(LibFunc::utime);
583 TLI.setUnavailable(LibFunc::utimes);
584 TLI.setUnavailable(LibFunc::write);
Meador Inge780a1862012-11-22 15:36:42 +0000585
Meador Ingeb904e6e2013-03-05 21:47:40 +0000586 // Win32 does *not* provide provide these functions, but they are
587 // specified by C99:
588 TLI.setUnavailable(LibFunc::atoll);
589 TLI.setUnavailable(LibFunc::frexpf);
Meador Inge780a1862012-11-22 15:36:42 +0000590 TLI.setUnavailable(LibFunc::llabs);
591 }
592
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000593 switch (T.getOS()) {
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000594 case Triple::MacOSX:
Chandler Carruthf5689f82013-12-28 02:40:19 +0000595 // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
596 // and their names are __exp10 and __exp10f. exp10l is not available on
597 // OS X or iOS.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000598 TLI.setUnavailable(LibFunc::exp10l);
599 if (T.isMacOSXVersionLT(10, 9)) {
600 TLI.setUnavailable(LibFunc::exp10);
601 TLI.setUnavailable(LibFunc::exp10f);
602 } else {
603 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
604 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
605 }
606 break;
607 case Triple::IOS:
608 TLI.setUnavailable(LibFunc::exp10l);
609 if (T.isOSVersionLT(7, 0)) {
610 TLI.setUnavailable(LibFunc::exp10);
611 TLI.setUnavailable(LibFunc::exp10f);
612 } else {
613 TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
614 TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
615 }
616 break;
Chandler Carruthf5689f82013-12-28 02:40:19 +0000617 case Triple::Linux:
618 // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
619 // buggy prior to glibc version 2.18. Until this version is widely deployed
620 // or we have a reasonable detection strategy, we cannot use exp10 reliably
621 // on Linux.
622 //
623 // Fall through to disable all of them.
Reid Klecknerf4355ee2013-12-26 19:17:04 +0000624 default:
625 TLI.setUnavailable(LibFunc::exp10);
626 TLI.setUnavailable(LibFunc::exp10f);
627 TLI.setUnavailable(LibFunc::exp10l);
628 }
629
Meador Inge780a1862012-11-22 15:36:42 +0000630 // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
631 // Linux (GLIBC):
632 // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
633 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
634 // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
635 switch (T.getOS()) {
636 case Triple::Darwin:
637 case Triple::MacOSX:
638 case Triple::IOS:
639 case Triple::FreeBSD:
640 case Triple::Linux:
641 break;
642 default:
643 TLI.setUnavailable(LibFunc::ffsl);
644 }
645
646 // ffsll is available on at least FreeBSD and Linux (GLIBC):
647 // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
648 // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
649 switch (T.getOS()) {
650 case Triple::FreeBSD:
651 case Triple::Linux:
652 break;
653 default:
654 TLI.setUnavailable(LibFunc::ffsll);
Joe Groffa81bcbb2012-04-17 23:05:54 +0000655 }
Meador Ingeb904e6e2013-03-05 21:47:40 +0000656
657 // The following functions are available on at least Linux:
Cameron Esfahani943908b2013-08-29 20:23:14 +0000658 if (!T.isOSLinux()) {
Meador Ingeb904e6e2013-03-05 21:47:40 +0000659 TLI.setUnavailable(LibFunc::dunder_strdup);
660 TLI.setUnavailable(LibFunc::dunder_strtok_r);
661 TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
662 TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
663 TLI.setUnavailable(LibFunc::under_IO_getc);
664 TLI.setUnavailable(LibFunc::under_IO_putc);
665 TLI.setUnavailable(LibFunc::memalign);
666 TLI.setUnavailable(LibFunc::fopen64);
667 TLI.setUnavailable(LibFunc::fseeko64);
668 TLI.setUnavailable(LibFunc::fstat64);
669 TLI.setUnavailable(LibFunc::fstatvfs64);
670 TLI.setUnavailable(LibFunc::ftello64);
671 TLI.setUnavailable(LibFunc::lstat64);
672 TLI.setUnavailable(LibFunc::open64);
673 TLI.setUnavailable(LibFunc::stat64);
674 TLI.setUnavailable(LibFunc::statvfs64);
675 TLI.setUnavailable(LibFunc::tmpfile64);
676 }
Chris Lattner0e125bb2011-02-18 21:50:34 +0000677}
678
Chandler Carruthc0291862015-01-24 02:06:09 +0000679TargetLibraryInfoImpl::TargetLibraryInfoImpl() {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000680 // Default to everything being available.
681 memset(AvailableArray, -1, sizeof(AvailableArray));
682
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000683 initialize(*this, Triple(), StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000684}
685
Chandler Carruthc0291862015-01-24 02:06:09 +0000686TargetLibraryInfoImpl::TargetLibraryInfoImpl(const Triple &T) {
Chris Lattner0e125bb2011-02-18 21:50:34 +0000687 // Default to everything being available.
688 memset(AvailableArray, -1, sizeof(AvailableArray));
Chandler Carruthb98f63d2015-01-15 10:41:28 +0000689
Bob Wilsonc740e3f2012-08-03 04:06:22 +0000690 initialize(*this, T, StandardNames);
Chris Lattner0e125bb2011-02-18 21:50:34 +0000691}
Chris Lattner1341df92011-02-18 22:34:03 +0000692
Chandler Carruthc0291862015-01-24 02:06:09 +0000693TargetLibraryInfoImpl::TargetLibraryInfoImpl(const TargetLibraryInfoImpl &TLI)
Chandler Carruth8ca43222015-01-15 11:39:46 +0000694 : CustomNames(TLI.CustomNames) {
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000695 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Chandler Carruth8ca43222015-01-15 11:39:46 +0000696}
697
Chandler Carruthc0291862015-01-24 02:06:09 +0000698TargetLibraryInfoImpl::TargetLibraryInfoImpl(TargetLibraryInfoImpl &&TLI)
Chandler Carruth8ca43222015-01-15 11:39:46 +0000699 : CustomNames(std::move(TLI.CustomNames)) {
700 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
701 AvailableArray);
702}
703
Chandler Carruthc0291862015-01-24 02:06:09 +0000704TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(const TargetLibraryInfoImpl &TLI) {
Eli Friedman489c0ff2011-11-17 01:27:36 +0000705 CustomNames = TLI.CustomNames;
Chandler Carruth8ca43222015-01-15 11:39:46 +0000706 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
707 return *this;
708}
709
Chandler Carruthc0291862015-01-24 02:06:09 +0000710TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(TargetLibraryInfoImpl &&TLI) {
Chandler Carruth8ca43222015-01-15 11:39:46 +0000711 CustomNames = std::move(TLI.CustomNames);
712 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
713 AvailableArray);
714 return *this;
Chris Lattner4c0d9e22011-05-21 20:09:13 +0000715}
716
Michael Zolotukhin21abdf92015-03-02 23:24:40 +0000717static StringRef sanitizeFunctionName(StringRef funcName) {
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000718 // Filter out empty names and names containing null bytes, those can't be in
719 // our table.
720 if (funcName.empty() || funcName.find('\0') != StringRef::npos)
Michael Zolotukhin21abdf92015-03-02 23:24:40 +0000721 return StringRef();
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000722
Meador Ingeb904e6e2013-03-05 21:47:40 +0000723 // Check for \01 prefix that is used to mangle __asm declarations and
724 // strip it if present.
Benjamin Kramer160f72d2013-03-09 13:48:23 +0000725 if (funcName.front() == '\01')
Meador Ingeb904e6e2013-03-05 21:47:40 +0000726 funcName = funcName.substr(1);
Michael Zolotukhin21abdf92015-03-02 23:24:40 +0000727 return funcName;
728}
729
730bool TargetLibraryInfoImpl::getLibFunc(StringRef funcName,
731 LibFunc::Func &F) const {
732 const char **Start = &StandardNames[0];
733 const char **End = &StandardNames[LibFunc::NumLibFuncs];
734
735 funcName = sanitizeFunctionName(funcName);
736 if (funcName.empty())
737 return false;
738
Michael Zolotukhind3b76a32015-03-02 20:50:08 +0000739 const char **I = std::lower_bound(
740 Start, End, funcName, [](const char *LHS, StringRef RHS) {
741 return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
742 });
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
Chandler Carruthc0291862015-01-24 02:06:09 +0000750void TargetLibraryInfoImpl::disableAllFunctions() {
Chris Lattner1341df92011-02-18 22:34:03 +0000751 memset(AvailableArray, 0, sizeof(AvailableArray));
752}
Chandler Carruthb98f63d2015-01-15 10:41:28 +0000753
Chandler Carruthc0291862015-01-24 02:06:09 +0000754TargetLibraryInfo TargetLibraryAnalysis::run(Module &M) {
755 if (PresetInfoImpl)
756 return TargetLibraryInfo(*PresetInfoImpl);
757
758 return TargetLibraryInfo(lookupInfoImpl(Triple(M.getTargetTriple())));
759}
760
761TargetLibraryInfo TargetLibraryAnalysis::run(Function &F) {
762 if (PresetInfoImpl)
763 return TargetLibraryInfo(*PresetInfoImpl);
764
765 return TargetLibraryInfo(
766 lookupInfoImpl(Triple(F.getParent()->getTargetTriple())));
767}
768
769TargetLibraryInfoImpl &TargetLibraryAnalysis::lookupInfoImpl(Triple T) {
770 std::unique_ptr<TargetLibraryInfoImpl> &Impl =
771 Impls[T.normalize()];
772 if (!Impl)
773 Impl.reset(new TargetLibraryInfoImpl(T));
774
775 return *Impl;
776}
777
778
Chandler Carruthb98f63d2015-01-15 10:41:28 +0000779TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass()
Chandler Carruthc0291862015-01-24 02:06:09 +0000780 : ImmutablePass(ID), TLIImpl(), TLI(TLIImpl) {
Chandler Carruthb98f63d2015-01-15 10:41:28 +0000781 initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
782}
783
784TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(const Triple &T)
Chandler Carruthc0291862015-01-24 02:06:09 +0000785 : ImmutablePass(ID), TLIImpl(T), TLI(TLIImpl) {
Chandler Carruthb98f63d2015-01-15 10:41:28 +0000786 initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
787}
788
789TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(
Chandler Carruthc0291862015-01-24 02:06:09 +0000790 const TargetLibraryInfoImpl &TLIImpl)
791 : ImmutablePass(ID), TLIImpl(TLIImpl), TLI(this->TLIImpl) {
Chandler Carruthb98f63d2015-01-15 10:41:28 +0000792 initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
793}
794
Chandler Carruth8ca43222015-01-15 11:39:46 +0000795char TargetLibraryAnalysis::PassID;
796
Chandler Carruthb98f63d2015-01-15 10:41:28 +0000797// Register the basic pass.
798INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
799 "Target Library Information", false, true)
800char TargetLibraryInfoWrapperPass::ID = 0;
801
802void TargetLibraryInfoWrapperPass::anchor() {}