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