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