TargetLibraryInfo.cpp revision b704d23062aa78b00999b75dcdcb628d4d84ee3f
1//===-- 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
23void TargetLibraryInfo::anchor() { }
24
25const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
26  {
27    "_IO_getc",
28    "_IO_putc",
29    "_ZdaPv",
30    "_ZdlPv",
31    "_Znaj",
32    "_ZnajRKSt9nothrow_t",
33    "_Znam",
34    "_ZnamRKSt9nothrow_t",
35    "_Znwj",
36    "_ZnwjRKSt9nothrow_t",
37    "_Znwm",
38    "_ZnwmRKSt9nothrow_t",
39    "__cxa_atexit",
40    "__cxa_guard_abort",
41    "__cxa_guard_acquire",
42    "__cxa_guard_release",
43    "__isoc99_scanf",
44    "__isoc99_sscanf",
45    "__memcpy_chk",
46    "__sqrt_finite",
47    "__sqrtf_finite",
48    "__sqrtl_finite",
49    "__strdup",
50    "__strndup",
51    "__strtok_r",
52    "abs",
53    "access",
54    "acos",
55    "acosf",
56    "acosh",
57    "acoshf",
58    "acoshl",
59    "acosl",
60    "asin",
61    "asinf",
62    "asinh",
63    "asinhf",
64    "asinhl",
65    "asinl",
66    "atan",
67    "atan2",
68    "atan2f",
69    "atan2l",
70    "atanf",
71    "atanh",
72    "atanhf",
73    "atanhl",
74    "atanl",
75    "atof",
76    "atoi",
77    "atol",
78    "atoll",
79    "bcmp",
80    "bcopy",
81    "bzero",
82    "calloc",
83    "cbrt",
84    "cbrtf",
85    "cbrtl",
86    "ceil",
87    "ceilf",
88    "ceill",
89    "chmod",
90    "chown",
91    "clearerr",
92    "closedir",
93    "copysign",
94    "copysignf",
95    "copysignl",
96    "cos",
97    "cosf",
98    "cosh",
99    "coshf",
100    "coshl",
101    "cosl",
102    "ctermid",
103    "exp",
104    "exp10",
105    "exp10f",
106    "exp10l",
107    "exp2",
108    "exp2f",
109    "exp2l",
110    "expf",
111    "expl",
112    "expm1",
113    "expm1f",
114    "expm1l",
115    "fabs",
116    "fabsf",
117    "fabsl",
118    "fclose",
119    "fdopen",
120    "feof",
121    "ferror",
122    "fflush",
123    "ffs",
124    "ffsl",
125    "ffsll",
126    "fgetc",
127    "fgetpos",
128    "fgets",
129    "fileno",
130    "fiprintf",
131    "flockfile",
132    "floor",
133    "floorf",
134    "floorl",
135    "fmod",
136    "fmodf",
137    "fmodl",
138    "fopen",
139    "fopen64",
140    "fprintf",
141    "fputc",
142    "fputs",
143    "fread",
144    "free",
145    "frexp",
146    "frexpf",
147    "frexpl",
148    "fscanf",
149    "fseek",
150    "fseeko",
151    "fseeko64",
152    "fsetpos",
153    "fstat",
154    "fstat64",
155    "fstatvfs",
156    "fstatvfs64",
157    "ftell",
158    "ftello",
159    "ftello64",
160    "ftrylockfile",
161    "funlockfile",
162    "fwrite",
163    "getc",
164    "getc_unlocked",
165    "getchar",
166    "getenv",
167    "getitimer",
168    "getlogin_r",
169    "getpwnam",
170    "gets",
171    "htonl",
172    "htons",
173    "iprintf",
174    "isascii",
175    "isdigit",
176    "labs",
177    "lchown",
178    "llabs",
179    "log",
180    "log10",
181    "log10f",
182    "log10l",
183    "log1p",
184    "log1pf",
185    "log1pl",
186    "log2",
187    "log2f",
188    "log2l",
189    "logb",
190    "logbf",
191    "logbl",
192    "logf",
193    "logl",
194    "lstat",
195    "lstat64",
196    "malloc",
197    "memalign",
198    "memccpy",
199    "memchr",
200    "memcmp",
201    "memcpy",
202    "memmove",
203    "memrchr",
204    "memset",
205    "memset_pattern16",
206    "mkdir",
207    "mktime",
208    "modf",
209    "modff",
210    "modfl",
211    "nearbyint",
212    "nearbyintf",
213    "nearbyintl",
214    "ntohl",
215    "ntohs",
216    "open",
217    "open64",
218    "opendir",
219    "pclose",
220    "perror",
221    "popen",
222    "posix_memalign",
223    "pow",
224    "powf",
225    "powl",
226    "pread",
227    "printf",
228    "putc",
229    "putchar",
230    "puts",
231    "pwrite",
232    "qsort",
233    "read",
234    "readlink",
235    "realloc",
236    "reallocf",
237    "realpath",
238    "remove",
239    "rename",
240    "rewind",
241    "rint",
242    "rintf",
243    "rintl",
244    "rmdir",
245    "round",
246    "roundf",
247    "roundl",
248    "scanf",
249    "setbuf",
250    "setitimer",
251    "setvbuf",
252    "sin",
253    "sinf",
254    "sinh",
255    "sinhf",
256    "sinhl",
257    "sinl",
258    "siprintf",
259    "snprintf",
260    "sprintf",
261    "sqrt",
262    "sqrtf",
263    "sqrtl",
264    "sscanf",
265    "stat",
266    "stat64",
267    "statvfs",
268    "statvfs64",
269    "stpcpy",
270    "stpncpy",
271    "strcasecmp",
272    "strcat",
273    "strchr",
274    "strcmp",
275    "strcoll",
276    "strcpy",
277    "strcspn",
278    "strdup",
279    "strlen",
280    "strncasecmp",
281    "strncat",
282    "strncmp",
283    "strncpy",
284    "strndup",
285    "strnlen",
286    "strpbrk",
287    "strrchr",
288    "strspn",
289    "strstr",
290    "strtod",
291    "strtof",
292    "strtok",
293    "strtok_r",
294    "strtol",
295    "strtold",
296    "strtoll",
297    "strtoul",
298    "strtoull",
299    "strxfrm",
300    "system",
301    "tan",
302    "tanf",
303    "tanh",
304    "tanhf",
305    "tanhl",
306    "tanl",
307    "times",
308    "tmpfile",
309    "tmpfile64",
310    "toascii",
311    "trunc",
312    "truncf",
313    "truncl",
314    "uname",
315    "ungetc",
316    "unlink",
317    "unsetenv",
318    "utime",
319    "utimes",
320    "valloc",
321    "vfprintf",
322    "vfscanf",
323    "vprintf",
324    "vscanf",
325    "vsnprintf",
326    "vsprintf",
327    "vsscanf",
328    "write"
329  };
330
331/// initialize - Initialize the set of available library functions based on the
332/// specified target triple.  This should be carefully written so that a missing
333/// target triple gets a sane set of defaults.
334static void initialize(TargetLibraryInfo &TLI, const Triple &T,
335                       const char **StandardNames) {
336  initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
337
338#ifndef NDEBUG
339  // Verify that the StandardNames array is in alphabetical order.
340  for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
341    if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
342      llvm_unreachable("TargetLibraryInfo function names must be sorted");
343  }
344#endif // !NDEBUG
345
346  // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
347  if (T.isMacOSX()) {
348    if (T.isMacOSXVersionLT(10, 5))
349      TLI.setUnavailable(LibFunc::memset_pattern16);
350  } else if (T.getOS() == Triple::IOS) {
351    if (T.isOSVersionLT(3, 0))
352      TLI.setUnavailable(LibFunc::memset_pattern16);
353  } else {
354    TLI.setUnavailable(LibFunc::memset_pattern16);
355  }
356
357  if (T.isMacOSX() && T.getArch() == Triple::x86 &&
358      !T.isMacOSXVersionLT(10, 7)) {
359    // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
360    // we don't care about) have two versions; on recent OSX, the one we want
361    // has a $UNIX2003 suffix. The two implementations are identical except
362    // for the return value in some edge cases.  However, we don't want to
363    // generate code that depends on the old symbols.
364    TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
365    TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
366  }
367
368  // iprintf and friends are only available on XCore and TCE.
369  if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
370    TLI.setUnavailable(LibFunc::iprintf);
371    TLI.setUnavailable(LibFunc::siprintf);
372    TLI.setUnavailable(LibFunc::fiprintf);
373  }
374
375  if (T.getOS() == Triple::Win32) {
376    // Win32 does not support long double
377    TLI.setUnavailable(LibFunc::acosl);
378    TLI.setUnavailable(LibFunc::asinl);
379    TLI.setUnavailable(LibFunc::atanl);
380    TLI.setUnavailable(LibFunc::atan2l);
381    TLI.setUnavailable(LibFunc::ceill);
382    TLI.setUnavailable(LibFunc::copysignl);
383    TLI.setUnavailable(LibFunc::cosl);
384    TLI.setUnavailable(LibFunc::coshl);
385    TLI.setUnavailable(LibFunc::expl);
386    TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
387    TLI.setUnavailable(LibFunc::fabsl);
388    TLI.setUnavailable(LibFunc::floorl);
389    TLI.setUnavailable(LibFunc::fmodl);
390    TLI.setUnavailable(LibFunc::frexpl);
391    TLI.setUnavailable(LibFunc::logl);
392    TLI.setUnavailable(LibFunc::modfl);
393    TLI.setUnavailable(LibFunc::powl);
394    TLI.setUnavailable(LibFunc::sinl);
395    TLI.setUnavailable(LibFunc::sinhl);
396    TLI.setUnavailable(LibFunc::sqrtl);
397    TLI.setUnavailable(LibFunc::tanl);
398    TLI.setUnavailable(LibFunc::tanhl);
399
400    // Win32 only has C89 math
401    TLI.setUnavailable(LibFunc::acosh);
402    TLI.setUnavailable(LibFunc::acoshf);
403    TLI.setUnavailable(LibFunc::acoshl);
404    TLI.setUnavailable(LibFunc::asinh);
405    TLI.setUnavailable(LibFunc::asinhf);
406    TLI.setUnavailable(LibFunc::asinhl);
407    TLI.setUnavailable(LibFunc::atanh);
408    TLI.setUnavailable(LibFunc::atanhf);
409    TLI.setUnavailable(LibFunc::atanhl);
410    TLI.setUnavailable(LibFunc::cbrt);
411    TLI.setUnavailable(LibFunc::cbrtf);
412    TLI.setUnavailable(LibFunc::cbrtl);
413    TLI.setUnavailable(LibFunc::exp10);
414    TLI.setUnavailable(LibFunc::exp10f);
415    TLI.setUnavailable(LibFunc::exp10l);
416    TLI.setUnavailable(LibFunc::exp2);
417    TLI.setUnavailable(LibFunc::exp2f);
418    TLI.setUnavailable(LibFunc::exp2l);
419    TLI.setUnavailable(LibFunc::expm1);
420    TLI.setUnavailable(LibFunc::expm1f);
421    TLI.setUnavailable(LibFunc::expm1l);
422    TLI.setUnavailable(LibFunc::log2);
423    TLI.setUnavailable(LibFunc::log2f);
424    TLI.setUnavailable(LibFunc::log2l);
425    TLI.setUnavailable(LibFunc::log1p);
426    TLI.setUnavailable(LibFunc::log1pf);
427    TLI.setUnavailable(LibFunc::log1pl);
428    TLI.setUnavailable(LibFunc::logb);
429    TLI.setUnavailable(LibFunc::logbf);
430    TLI.setUnavailable(LibFunc::logbl);
431    TLI.setUnavailable(LibFunc::nearbyint);
432    TLI.setUnavailable(LibFunc::nearbyintf);
433    TLI.setUnavailable(LibFunc::nearbyintl);
434    TLI.setUnavailable(LibFunc::rint);
435    TLI.setUnavailable(LibFunc::rintf);
436    TLI.setUnavailable(LibFunc::rintl);
437    TLI.setUnavailable(LibFunc::round);
438    TLI.setUnavailable(LibFunc::roundf);
439    TLI.setUnavailable(LibFunc::roundl);
440    TLI.setUnavailable(LibFunc::trunc);
441    TLI.setUnavailable(LibFunc::truncf);
442    TLI.setUnavailable(LibFunc::truncl);
443
444    // Win32 provides some C99 math with mangled names
445    TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
446
447    if (T.getArch() == Triple::x86) {
448      // Win32 on x86 implements single-precision math functions as macros
449      TLI.setUnavailable(LibFunc::acosf);
450      TLI.setUnavailable(LibFunc::asinf);
451      TLI.setUnavailable(LibFunc::atanf);
452      TLI.setUnavailable(LibFunc::atan2f);
453      TLI.setUnavailable(LibFunc::ceilf);
454      TLI.setUnavailable(LibFunc::copysignf);
455      TLI.setUnavailable(LibFunc::cosf);
456      TLI.setUnavailable(LibFunc::coshf);
457      TLI.setUnavailable(LibFunc::expf);
458      TLI.setUnavailable(LibFunc::floorf);
459      TLI.setUnavailable(LibFunc::fmodf);
460      TLI.setUnavailable(LibFunc::logf);
461      TLI.setUnavailable(LibFunc::powf);
462      TLI.setUnavailable(LibFunc::sinf);
463      TLI.setUnavailable(LibFunc::sinhf);
464      TLI.setUnavailable(LibFunc::sqrtf);
465      TLI.setUnavailable(LibFunc::tanf);
466      TLI.setUnavailable(LibFunc::tanhf);
467    }
468
469    // Win32 does *not* provide provide these functions, but they are
470    // generally available on POSIX-compliant systems:
471    TLI.setUnavailable(LibFunc::access);
472    TLI.setUnavailable(LibFunc::bcmp);
473    TLI.setUnavailable(LibFunc::bcopy);
474    TLI.setUnavailable(LibFunc::bzero);
475    TLI.setUnavailable(LibFunc::chmod);
476    TLI.setUnavailable(LibFunc::chown);
477    TLI.setUnavailable(LibFunc::closedir);
478    TLI.setUnavailable(LibFunc::ctermid);
479    TLI.setUnavailable(LibFunc::fdopen);
480    TLI.setUnavailable(LibFunc::ffs);
481    TLI.setUnavailable(LibFunc::fileno);
482    TLI.setUnavailable(LibFunc::flockfile);
483    TLI.setUnavailable(LibFunc::fseeko);
484    TLI.setUnavailable(LibFunc::fstat);
485    TLI.setUnavailable(LibFunc::fstatvfs);
486    TLI.setUnavailable(LibFunc::ftello);
487    TLI.setUnavailable(LibFunc::ftrylockfile);
488    TLI.setUnavailable(LibFunc::funlockfile);
489    TLI.setUnavailable(LibFunc::getc_unlocked);
490    TLI.setUnavailable(LibFunc::getitimer);
491    TLI.setUnavailable(LibFunc::getlogin_r);
492    TLI.setUnavailable(LibFunc::getpwnam);
493    TLI.setUnavailable(LibFunc::htonl);
494    TLI.setUnavailable(LibFunc::htons);
495    TLI.setUnavailable(LibFunc::lchown);
496    TLI.setUnavailable(LibFunc::lstat);
497    TLI.setUnavailable(LibFunc::memccpy);
498    TLI.setUnavailable(LibFunc::mkdir);
499    TLI.setUnavailable(LibFunc::ntohl);
500    TLI.setUnavailable(LibFunc::ntohs);
501    TLI.setUnavailable(LibFunc::open);
502    TLI.setUnavailable(LibFunc::opendir);
503    TLI.setUnavailable(LibFunc::pclose);
504    TLI.setUnavailable(LibFunc::popen);
505    TLI.setUnavailable(LibFunc::pread);
506    TLI.setUnavailable(LibFunc::pwrite);
507    TLI.setUnavailable(LibFunc::read);
508    TLI.setUnavailable(LibFunc::readlink);
509    TLI.setUnavailable(LibFunc::realpath);
510    TLI.setUnavailable(LibFunc::rmdir);
511    TLI.setUnavailable(LibFunc::setitimer);
512    TLI.setUnavailable(LibFunc::stat);
513    TLI.setUnavailable(LibFunc::statvfs);
514    TLI.setUnavailable(LibFunc::stpcpy);
515    TLI.setUnavailable(LibFunc::stpncpy);
516    TLI.setUnavailable(LibFunc::strcasecmp);
517    TLI.setUnavailable(LibFunc::strncasecmp);
518    TLI.setUnavailable(LibFunc::times);
519    TLI.setUnavailable(LibFunc::uname);
520    TLI.setUnavailable(LibFunc::unlink);
521    TLI.setUnavailable(LibFunc::unsetenv);
522    TLI.setUnavailable(LibFunc::utime);
523    TLI.setUnavailable(LibFunc::utimes);
524    TLI.setUnavailable(LibFunc::write);
525
526    // Win32 does *not* provide provide these functions, but they are
527    // specified by C99:
528    TLI.setUnavailable(LibFunc::atoll);
529    TLI.setUnavailable(LibFunc::frexpf);
530    TLI.setUnavailable(LibFunc::llabs);
531  }
532
533  // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
534  // Linux (GLIBC):
535  // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
536  // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
537  // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
538  switch (T.getOS()) {
539  case Triple::Darwin:
540  case Triple::MacOSX:
541  case Triple::IOS:
542  case Triple::FreeBSD:
543  case Triple::Linux:
544    break;
545  default:
546    TLI.setUnavailable(LibFunc::ffsl);
547  }
548
549  // ffsll is available on at least FreeBSD and Linux (GLIBC):
550  // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
551  // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
552  switch (T.getOS()) {
553  case Triple::FreeBSD:
554  case Triple::Linux:
555    break;
556  default:
557    TLI.setUnavailable(LibFunc::ffsll);
558  }
559
560  // The following functions are available on at least Linux:
561  if (T.getOS() != Triple::Linux) {
562    TLI.setUnavailable(LibFunc::dunder_strdup);
563    TLI.setUnavailable(LibFunc::dunder_strtok_r);
564    TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
565    TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
566    TLI.setUnavailable(LibFunc::under_IO_getc);
567    TLI.setUnavailable(LibFunc::under_IO_putc);
568    TLI.setUnavailable(LibFunc::memalign);
569    TLI.setUnavailable(LibFunc::fopen64);
570    TLI.setUnavailable(LibFunc::fseeko64);
571    TLI.setUnavailable(LibFunc::fstat64);
572    TLI.setUnavailable(LibFunc::fstatvfs64);
573    TLI.setUnavailable(LibFunc::ftello64);
574    TLI.setUnavailable(LibFunc::lstat64);
575    TLI.setUnavailable(LibFunc::open64);
576    TLI.setUnavailable(LibFunc::stat64);
577    TLI.setUnavailable(LibFunc::statvfs64);
578    TLI.setUnavailable(LibFunc::tmpfile64);
579  }
580}
581
582
583TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
584  // Default to everything being available.
585  memset(AvailableArray, -1, sizeof(AvailableArray));
586
587  initialize(*this, Triple(), StandardNames);
588}
589
590TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
591  // Default to everything being available.
592  memset(AvailableArray, -1, sizeof(AvailableArray));
593
594  initialize(*this, T, StandardNames);
595}
596
597TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
598  : ImmutablePass(ID) {
599  memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
600  CustomNames = TLI.CustomNames;
601}
602
603namespace {
604struct StringComparator {
605  /// Compare two strings and return true if LHS is lexicographically less than
606  /// RHS. Requires that RHS doesn't contain any zero bytes.
607  bool operator()(const char *LHS, StringRef RHS) const {
608    // Compare prefixes with strncmp. If prefixes match we know that LHS is
609    // greater or equal to RHS as RHS can't contain any '\0'.
610    return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
611  }
612
613  // Provided for compatibility with MSVC's debug mode.
614  bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
615  bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
616  bool operator()(const char *LHS, const char *RHS) const {
617    return std::strcmp(LHS, RHS) < 0;
618  }
619};
620}
621
622bool TargetLibraryInfo::getLibFunc(StringRef funcName,
623                                   LibFunc::Func &F) const {
624  const char **Start = &StandardNames[0];
625  const char **End = &StandardNames[LibFunc::NumLibFuncs];
626
627  // Filter out empty names and names containing null bytes, those can't be in
628  // our table.
629  if (funcName.empty() || funcName.find('\0') != StringRef::npos)
630    return false;
631
632  // Check for \01 prefix that is used to mangle __asm declarations and
633  // strip it if present.
634  if (funcName.front() == '\01')
635    funcName = funcName.substr(1);
636  const char **I = std::lower_bound(Start, End, funcName, StringComparator());
637  if (I != End && *I == funcName) {
638    F = (LibFunc::Func)(I - Start);
639    return true;
640  }
641  return false;
642}
643
644/// disableAllFunctions - This disables all builtins, which is used for options
645/// like -fno-builtin.
646void TargetLibraryInfo::disableAllFunctions() {
647  memset(AvailableArray, 0, sizeof(AvailableArray));
648}
649