Don't reach into the middle of TargetMachine and cache one of its ivars.
[oota-llvm.git] / lib / Target / TargetLibraryInfo.cpp
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"
16 using namespace llvm;
17
18 // Register the default implementation.
19 INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20                 "Target Library Information", false, true)
21 char TargetLibraryInfo::ID = 0;
22
23 void TargetLibraryInfo::anchor() { }
24
25 const 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.
334 static 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
583 TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
584   // Default to everything being available.
585   memset(AvailableArray, -1, sizeof(AvailableArray));
586
587   initialize(*this, Triple(), StandardNames);
588 }
589
590 TargetLibraryInfo::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
597 TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
598   : ImmutablePass(ID) {
599   memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
600   CustomNames = TLI.CustomNames;
601 }
602
603 namespace {
604 struct 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
622 bool 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.
646 void TargetLibraryInfo::disableAllFunctions() {
647   memset(AvailableArray, 0, sizeof(AvailableArray));
648 }