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