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