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