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