Disable transforms that introduce calls to exp10*() on Linux due to
[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   // iprintf and friends are only available on XCore and TCE.
411   if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
412     TLI.setUnavailable(LibFunc::iprintf);
413     TLI.setUnavailable(LibFunc::siprintf);
414     TLI.setUnavailable(LibFunc::fiprintf);
415   }
416
417   if (T.getOS() == Triple::Win32) {
418     // Win32 does not support long double
419     TLI.setUnavailable(LibFunc::acosl);
420     TLI.setUnavailable(LibFunc::asinl);
421     TLI.setUnavailable(LibFunc::atanl);
422     TLI.setUnavailable(LibFunc::atan2l);
423     TLI.setUnavailable(LibFunc::ceill);
424     TLI.setUnavailable(LibFunc::copysignl);
425     TLI.setUnavailable(LibFunc::cosl);
426     TLI.setUnavailable(LibFunc::coshl);
427     TLI.setUnavailable(LibFunc::expl);
428     TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
429     TLI.setUnavailable(LibFunc::fabsl);
430     TLI.setUnavailable(LibFunc::floorl);
431     TLI.setUnavailable(LibFunc::fmaxl);
432     TLI.setUnavailable(LibFunc::fminl);
433     TLI.setUnavailable(LibFunc::fmodl);
434     TLI.setUnavailable(LibFunc::frexpl);
435     TLI.setUnavailable(LibFunc::logl);
436     TLI.setUnavailable(LibFunc::modfl);
437     TLI.setUnavailable(LibFunc::powl);
438     TLI.setUnavailable(LibFunc::sinl);
439     TLI.setUnavailable(LibFunc::sinhl);
440     TLI.setUnavailable(LibFunc::sqrtl);
441     TLI.setUnavailable(LibFunc::tanl);
442     TLI.setUnavailable(LibFunc::tanhl);
443
444     // Win32 only has C89 math
445     TLI.setUnavailable(LibFunc::acosh);
446     TLI.setUnavailable(LibFunc::acoshf);
447     TLI.setUnavailable(LibFunc::acoshl);
448     TLI.setUnavailable(LibFunc::asinh);
449     TLI.setUnavailable(LibFunc::asinhf);
450     TLI.setUnavailable(LibFunc::asinhl);
451     TLI.setUnavailable(LibFunc::atanh);
452     TLI.setUnavailable(LibFunc::atanhf);
453     TLI.setUnavailable(LibFunc::atanhl);
454     TLI.setUnavailable(LibFunc::cbrt);
455     TLI.setUnavailable(LibFunc::cbrtf);
456     TLI.setUnavailable(LibFunc::cbrtl);
457     TLI.setUnavailable(LibFunc::exp2);
458     TLI.setUnavailable(LibFunc::exp2f);
459     TLI.setUnavailable(LibFunc::exp2l);
460     TLI.setUnavailable(LibFunc::expm1);
461     TLI.setUnavailable(LibFunc::expm1f);
462     TLI.setUnavailable(LibFunc::expm1l);
463     TLI.setUnavailable(LibFunc::log2);
464     TLI.setUnavailable(LibFunc::log2f);
465     TLI.setUnavailable(LibFunc::log2l);
466     TLI.setUnavailable(LibFunc::log1p);
467     TLI.setUnavailable(LibFunc::log1pf);
468     TLI.setUnavailable(LibFunc::log1pl);
469     TLI.setUnavailable(LibFunc::logb);
470     TLI.setUnavailable(LibFunc::logbf);
471     TLI.setUnavailable(LibFunc::logbl);
472     TLI.setUnavailable(LibFunc::nearbyint);
473     TLI.setUnavailable(LibFunc::nearbyintf);
474     TLI.setUnavailable(LibFunc::nearbyintl);
475     TLI.setUnavailable(LibFunc::rint);
476     TLI.setUnavailable(LibFunc::rintf);
477     TLI.setUnavailable(LibFunc::rintl);
478     TLI.setUnavailable(LibFunc::round);
479     TLI.setUnavailable(LibFunc::roundf);
480     TLI.setUnavailable(LibFunc::roundl);
481     TLI.setUnavailable(LibFunc::trunc);
482     TLI.setUnavailable(LibFunc::truncf);
483     TLI.setUnavailable(LibFunc::truncl);
484
485     // Win32 provides some C99 math with mangled names
486     TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
487
488     if (T.getArch() == Triple::x86) {
489       // Win32 on x86 implements single-precision math functions as macros
490       TLI.setUnavailable(LibFunc::acosf);
491       TLI.setUnavailable(LibFunc::asinf);
492       TLI.setUnavailable(LibFunc::atanf);
493       TLI.setUnavailable(LibFunc::atan2f);
494       TLI.setUnavailable(LibFunc::ceilf);
495       TLI.setUnavailable(LibFunc::copysignf);
496       TLI.setUnavailable(LibFunc::cosf);
497       TLI.setUnavailable(LibFunc::coshf);
498       TLI.setUnavailable(LibFunc::expf);
499       TLI.setUnavailable(LibFunc::floorf);
500       TLI.setUnavailable(LibFunc::fminf);
501       TLI.setUnavailable(LibFunc::fmaxf);
502       TLI.setUnavailable(LibFunc::fmodf);
503       TLI.setUnavailable(LibFunc::logf);
504       TLI.setUnavailable(LibFunc::powf);
505       TLI.setUnavailable(LibFunc::sinf);
506       TLI.setUnavailable(LibFunc::sinhf);
507       TLI.setUnavailable(LibFunc::sqrtf);
508       TLI.setUnavailable(LibFunc::tanf);
509       TLI.setUnavailable(LibFunc::tanhf);
510     }
511
512     // Win32 does *not* provide provide these functions, but they are
513     // generally available on POSIX-compliant systems:
514     TLI.setUnavailable(LibFunc::access);
515     TLI.setUnavailable(LibFunc::bcmp);
516     TLI.setUnavailable(LibFunc::bcopy);
517     TLI.setUnavailable(LibFunc::bzero);
518     TLI.setUnavailable(LibFunc::chmod);
519     TLI.setUnavailable(LibFunc::chown);
520     TLI.setUnavailable(LibFunc::closedir);
521     TLI.setUnavailable(LibFunc::ctermid);
522     TLI.setUnavailable(LibFunc::fdopen);
523     TLI.setUnavailable(LibFunc::ffs);
524     TLI.setUnavailable(LibFunc::fileno);
525     TLI.setUnavailable(LibFunc::flockfile);
526     TLI.setUnavailable(LibFunc::fseeko);
527     TLI.setUnavailable(LibFunc::fstat);
528     TLI.setUnavailable(LibFunc::fstatvfs);
529     TLI.setUnavailable(LibFunc::ftello);
530     TLI.setUnavailable(LibFunc::ftrylockfile);
531     TLI.setUnavailable(LibFunc::funlockfile);
532     TLI.setUnavailable(LibFunc::getc_unlocked);
533     TLI.setUnavailable(LibFunc::getitimer);
534     TLI.setUnavailable(LibFunc::getlogin_r);
535     TLI.setUnavailable(LibFunc::getpwnam);
536     TLI.setUnavailable(LibFunc::gettimeofday);
537     TLI.setUnavailable(LibFunc::htonl);
538     TLI.setUnavailable(LibFunc::htons);
539     TLI.setUnavailable(LibFunc::lchown);
540     TLI.setUnavailable(LibFunc::lstat);
541     TLI.setUnavailable(LibFunc::memccpy);
542     TLI.setUnavailable(LibFunc::mkdir);
543     TLI.setUnavailable(LibFunc::ntohl);
544     TLI.setUnavailable(LibFunc::ntohs);
545     TLI.setUnavailable(LibFunc::open);
546     TLI.setUnavailable(LibFunc::opendir);
547     TLI.setUnavailable(LibFunc::pclose);
548     TLI.setUnavailable(LibFunc::popen);
549     TLI.setUnavailable(LibFunc::pread);
550     TLI.setUnavailable(LibFunc::pwrite);
551     TLI.setUnavailable(LibFunc::read);
552     TLI.setUnavailable(LibFunc::readlink);
553     TLI.setUnavailable(LibFunc::realpath);
554     TLI.setUnavailable(LibFunc::rmdir);
555     TLI.setUnavailable(LibFunc::setitimer);
556     TLI.setUnavailable(LibFunc::stat);
557     TLI.setUnavailable(LibFunc::statvfs);
558     TLI.setUnavailable(LibFunc::stpcpy);
559     TLI.setUnavailable(LibFunc::stpncpy);
560     TLI.setUnavailable(LibFunc::strcasecmp);
561     TLI.setUnavailable(LibFunc::strncasecmp);
562     TLI.setUnavailable(LibFunc::times);
563     TLI.setUnavailable(LibFunc::uname);
564     TLI.setUnavailable(LibFunc::unlink);
565     TLI.setUnavailable(LibFunc::unsetenv);
566     TLI.setUnavailable(LibFunc::utime);
567     TLI.setUnavailable(LibFunc::utimes);
568     TLI.setUnavailable(LibFunc::write);
569
570     // Win32 does *not* provide provide these functions, but they are
571     // specified by C99:
572     TLI.setUnavailable(LibFunc::atoll);
573     TLI.setUnavailable(LibFunc::frexpf);
574     TLI.setUnavailable(LibFunc::llabs);
575   }
576
577   switch (T.getOS()) {
578   case Triple::MacOSX:
579     // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
580     // and their names are __exp10 and __exp10f. exp10l is not available on
581     // OS X or iOS.
582     TLI.setUnavailable(LibFunc::exp10l);
583     if (T.isMacOSXVersionLT(10, 9)) {
584       TLI.setUnavailable(LibFunc::exp10);
585       TLI.setUnavailable(LibFunc::exp10f);
586     } else {
587       TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
588       TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
589     }
590     break;
591   case Triple::IOS:
592     TLI.setUnavailable(LibFunc::exp10l);
593     if (T.isOSVersionLT(7, 0)) {
594       TLI.setUnavailable(LibFunc::exp10);
595       TLI.setUnavailable(LibFunc::exp10f);
596     } else {
597       TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
598       TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
599     }
600     break;
601   case Triple::Linux:
602     // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
603     // buggy prior to glibc version 2.18. Until this version is widely deployed
604     // or we have a reasonable detection strategy, we cannot use exp10 reliably
605     // on Linux.
606     //
607     // Fall through to disable all of them.
608   default:
609     TLI.setUnavailable(LibFunc::exp10);
610     TLI.setUnavailable(LibFunc::exp10f);
611     TLI.setUnavailable(LibFunc::exp10l);
612   }
613
614   // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
615   // Linux (GLIBC):
616   // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
617   // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
618   // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
619   switch (T.getOS()) {
620   case Triple::Darwin:
621   case Triple::MacOSX:
622   case Triple::IOS:
623   case Triple::FreeBSD:
624   case Triple::Linux:
625     break;
626   default:
627     TLI.setUnavailable(LibFunc::ffsl);
628   }
629
630   // ffsll is available on at least FreeBSD and Linux (GLIBC):
631   // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
632   // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
633   switch (T.getOS()) {
634   case Triple::FreeBSD:
635   case Triple::Linux:
636     break;
637   default:
638     TLI.setUnavailable(LibFunc::ffsll);
639   }
640
641   // The following functions are available on at least Linux:
642   if (!T.isOSLinux()) {
643     TLI.setUnavailable(LibFunc::dunder_strdup);
644     TLI.setUnavailable(LibFunc::dunder_strtok_r);
645     TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
646     TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
647     TLI.setUnavailable(LibFunc::under_IO_getc);
648     TLI.setUnavailable(LibFunc::under_IO_putc);
649     TLI.setUnavailable(LibFunc::memalign);
650     TLI.setUnavailable(LibFunc::fopen64);
651     TLI.setUnavailable(LibFunc::fseeko64);
652     TLI.setUnavailable(LibFunc::fstat64);
653     TLI.setUnavailable(LibFunc::fstatvfs64);
654     TLI.setUnavailable(LibFunc::ftello64);
655     TLI.setUnavailable(LibFunc::lstat64);
656     TLI.setUnavailable(LibFunc::open64);
657     TLI.setUnavailable(LibFunc::stat64);
658     TLI.setUnavailable(LibFunc::statvfs64);
659     TLI.setUnavailable(LibFunc::tmpfile64);
660   }
661 }
662
663
664 TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
665   // Default to everything being available.
666   memset(AvailableArray, -1, sizeof(AvailableArray));
667
668   initialize(*this, Triple(), StandardNames);
669 }
670
671 TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
672   // Default to everything being available.
673   memset(AvailableArray, -1, sizeof(AvailableArray));
674   
675   initialize(*this, T, StandardNames);
676 }
677
678 TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
679   : ImmutablePass(ID) {
680   memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
681   CustomNames = TLI.CustomNames;
682 }
683
684 namespace {
685 struct StringComparator {
686   /// Compare two strings and return true if LHS is lexicographically less than
687   /// RHS. Requires that RHS doesn't contain any zero bytes.
688   bool operator()(const char *LHS, StringRef RHS) const {
689     // Compare prefixes with strncmp. If prefixes match we know that LHS is
690     // greater or equal to RHS as RHS can't contain any '\0'.
691     return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
692   }
693
694   // Provided for compatibility with MSVC's debug mode.
695   bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
696   bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
697   bool operator()(const char *LHS, const char *RHS) const {
698     return std::strcmp(LHS, RHS) < 0;
699   }
700 };
701 }
702
703 bool TargetLibraryInfo::getLibFunc(StringRef funcName,
704                                    LibFunc::Func &F) const {
705   const char **Start = &StandardNames[0];
706   const char **End = &StandardNames[LibFunc::NumLibFuncs];
707
708   // Filter out empty names and names containing null bytes, those can't be in
709   // our table.
710   if (funcName.empty() || funcName.find('\0') != StringRef::npos)
711     return false;
712
713   // Check for \01 prefix that is used to mangle __asm declarations and
714   // strip it if present.
715   if (funcName.front() == '\01')
716     funcName = funcName.substr(1);
717   const char **I = std::lower_bound(Start, End, funcName, StringComparator());
718   if (I != End && *I == funcName) {
719     F = (LibFunc::Func)(I - Start);
720     return true;
721   }
722   return false;
723 }
724
725 /// disableAllFunctions - This disables all builtins, which is used for options
726 /// like -fno-builtin.
727 void TargetLibraryInfo::disableAllFunctions() {
728   memset(AvailableArray, 0, sizeof(AvailableArray));
729 }