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