Add LICENSE.TXT covering contributions made by ARM.
[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     "_ZdaPv",
28     "_ZdlPv",
29     "_Znaj",
30     "_ZnajRKSt9nothrow_t",
31     "_Znam",
32     "_ZnamRKSt9nothrow_t",
33     "_Znwj",
34     "_ZnwjRKSt9nothrow_t",
35     "_Znwm",
36     "_ZnwmRKSt9nothrow_t",
37     "__cxa_atexit",
38     "__cxa_guard_abort",
39     "__cxa_guard_acquire",
40     "__cxa_guard_release",
41     "__memcpy_chk",
42     "abs",
43     "acos",
44     "acosf",
45     "acosh",
46     "acoshf",
47     "acoshl",
48     "acosl",
49     "asin",
50     "asinf",
51     "asinh",
52     "asinhf",
53     "asinhl",
54     "asinl",
55     "atan",
56     "atan2",
57     "atan2f",
58     "atan2l",
59     "atanf",
60     "atanh",
61     "atanhf",
62     "atanhl",
63     "atanl",
64     "calloc",
65     "cbrt",
66     "cbrtf",
67     "cbrtl",
68     "ceil",
69     "ceilf",
70     "ceill",
71     "copysign",
72     "copysignf",
73     "copysignl",
74     "cos",
75     "cosf",
76     "cosh",
77     "coshf",
78     "coshl",
79     "cosl",
80     "exp",
81     "exp10",
82     "exp10f",
83     "exp10l",
84     "exp2",
85     "exp2f",
86     "exp2l",
87     "expf",
88     "expl",
89     "expm1",
90     "expm1f",
91     "expm1l",
92     "fabs",
93     "fabsf",
94     "fabsl",
95     "ffs",
96     "ffsl",
97     "ffsll",
98     "fiprintf",
99     "floor",
100     "floorf",
101     "floorl",
102     "fmod",
103     "fmodf",
104     "fmodl",
105     "fprintf",
106     "fputc",
107     "fputs",
108     "free",
109     "fwrite",
110     "iprintf",
111     "isascii",
112     "isdigit",
113     "labs",
114     "llabs",
115     "log",
116     "log10",
117     "log10f",
118     "log10l",
119     "log1p",
120     "log1pf",
121     "log1pl",
122     "log2",
123     "log2f",
124     "log2l",
125     "logb",
126     "logbf",
127     "logbl",
128     "logf",
129     "logl",
130     "malloc",
131     "memchr",
132     "memcmp",
133     "memcpy",
134     "memmove",
135     "memset",
136     "memset_pattern16",
137     "nearbyint",
138     "nearbyintf",
139     "nearbyintl",
140     "posix_memalign",
141     "pow",
142     "powf",
143     "powl",
144     "printf",
145     "putchar",
146     "puts",
147     "realloc",
148     "reallocf",
149     "rint",
150     "rintf",
151     "rintl",
152     "round",
153     "roundf",
154     "roundl",
155     "sin",
156     "sinf",
157     "sinh",
158     "sinhf",
159     "sinhl",
160     "sinl",
161     "siprintf",
162     "sprintf",
163     "sqrt",
164     "sqrtf",
165     "sqrtl",
166     "stpcpy",
167     "strcat",
168     "strchr",
169     "strcmp",
170     "strcpy",
171     "strcspn",
172     "strdup",
173     "strlen",
174     "strncat",
175     "strncmp",
176     "strncpy",
177     "strndup",
178     "strnlen",
179     "strpbrk",
180     "strrchr",
181     "strspn",
182     "strstr",
183     "strtod",
184     "strtof",
185     "strtol",
186     "strtold",
187     "strtoll",
188     "strtoul",
189     "strtoull",
190     "tan",
191     "tanf",
192     "tanh",
193     "tanhf",
194     "tanhl",
195     "tanl",
196     "toascii",
197     "trunc",
198     "truncf",
199     "truncl",
200     "valloc"
201   };
202
203 /// initialize - Initialize the set of available library functions based on the
204 /// specified target triple.  This should be carefully written so that a missing
205 /// target triple gets a sane set of defaults.
206 static void initialize(TargetLibraryInfo &TLI, const Triple &T,
207                        const char **StandardNames) {
208   initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
209
210 #ifndef NDEBUG
211   // Verify that the StandardNames array is in alphabetical order.
212   for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
213     if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
214       llvm_unreachable("TargetLibraryInfo function names must be sorted");
215   }
216 #endif // !NDEBUG
217   
218   // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
219   if (T.isMacOSX()) {
220     if (T.isMacOSXVersionLT(10, 5))
221       TLI.setUnavailable(LibFunc::memset_pattern16);
222   } else if (T.getOS() == Triple::IOS) {
223     if (T.isOSVersionLT(3, 0))
224       TLI.setUnavailable(LibFunc::memset_pattern16);
225   } else {
226     TLI.setUnavailable(LibFunc::memset_pattern16);
227   }
228
229   if (T.isMacOSX() && T.getArch() == Triple::x86 &&
230       !T.isMacOSXVersionLT(10, 7)) {
231     // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
232     // we don't care about) have two versions; on recent OSX, the one we want
233     // has a $UNIX2003 suffix. The two implementations are identical except
234     // for the return value in some edge cases.  However, we don't want to
235     // generate code that depends on the old symbols.
236     TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
237     TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
238   }
239
240   // iprintf and friends are only available on XCore and TCE.
241   if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
242     TLI.setUnavailable(LibFunc::iprintf);
243     TLI.setUnavailable(LibFunc::siprintf);
244     TLI.setUnavailable(LibFunc::fiprintf);
245   }
246
247   if (T.getOS() == Triple::Win32) {
248     // Win32 does not support long double
249     TLI.setUnavailable(LibFunc::acosl);
250     TLI.setUnavailable(LibFunc::asinl);
251     TLI.setUnavailable(LibFunc::atanl);
252     TLI.setUnavailable(LibFunc::atan2l);
253     TLI.setUnavailable(LibFunc::ceill);
254     TLI.setUnavailable(LibFunc::copysignl);
255     TLI.setUnavailable(LibFunc::cosl);
256     TLI.setUnavailable(LibFunc::coshl);
257     TLI.setUnavailable(LibFunc::expl);
258     TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
259     TLI.setUnavailable(LibFunc::fabsl);
260     TLI.setUnavailable(LibFunc::floorl);
261     TLI.setUnavailable(LibFunc::fmodl);
262     TLI.setUnavailable(LibFunc::logl);
263     TLI.setUnavailable(LibFunc::powl);
264     TLI.setUnavailable(LibFunc::sinl);
265     TLI.setUnavailable(LibFunc::sinhl);
266     TLI.setUnavailable(LibFunc::sqrtl);
267     TLI.setUnavailable(LibFunc::tanl);
268     TLI.setUnavailable(LibFunc::tanhl);
269
270     // Win32 only has C89 math
271     TLI.setUnavailable(LibFunc::acosh);
272     TLI.setUnavailable(LibFunc::acoshf);
273     TLI.setUnavailable(LibFunc::acoshl);
274     TLI.setUnavailable(LibFunc::asinh);
275     TLI.setUnavailable(LibFunc::asinhf);
276     TLI.setUnavailable(LibFunc::asinhl);
277     TLI.setUnavailable(LibFunc::atanh);
278     TLI.setUnavailable(LibFunc::atanhf);
279     TLI.setUnavailable(LibFunc::atanhl);
280     TLI.setUnavailable(LibFunc::cbrt);
281     TLI.setUnavailable(LibFunc::cbrtf);
282     TLI.setUnavailable(LibFunc::cbrtl);
283     TLI.setUnavailable(LibFunc::exp10);
284     TLI.setUnavailable(LibFunc::exp10f);
285     TLI.setUnavailable(LibFunc::exp10l);
286     TLI.setUnavailable(LibFunc::exp2);
287     TLI.setUnavailable(LibFunc::exp2f);
288     TLI.setUnavailable(LibFunc::exp2l);
289     TLI.setUnavailable(LibFunc::expm1);
290     TLI.setUnavailable(LibFunc::expm1f);
291     TLI.setUnavailable(LibFunc::expm1l);
292     TLI.setUnavailable(LibFunc::log2);
293     TLI.setUnavailable(LibFunc::log2f);
294     TLI.setUnavailable(LibFunc::log2l);
295     TLI.setUnavailable(LibFunc::log1p);
296     TLI.setUnavailable(LibFunc::log1pf);
297     TLI.setUnavailable(LibFunc::log1pl);
298     TLI.setUnavailable(LibFunc::logb);
299     TLI.setUnavailable(LibFunc::logbf);
300     TLI.setUnavailable(LibFunc::logbl);
301     TLI.setUnavailable(LibFunc::nearbyint);
302     TLI.setUnavailable(LibFunc::nearbyintf);
303     TLI.setUnavailable(LibFunc::nearbyintl);
304     TLI.setUnavailable(LibFunc::rint);
305     TLI.setUnavailable(LibFunc::rintf);
306     TLI.setUnavailable(LibFunc::rintl);
307     TLI.setUnavailable(LibFunc::round);
308     TLI.setUnavailable(LibFunc::roundf);
309     TLI.setUnavailable(LibFunc::roundl);
310     TLI.setUnavailable(LibFunc::trunc);
311     TLI.setUnavailable(LibFunc::truncf);
312     TLI.setUnavailable(LibFunc::truncl);
313
314     // Win32 provides some C99 math with mangled names
315     TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
316
317     if (T.getArch() == Triple::x86) {
318       // Win32 on x86 implements single-precision math functions as macros
319       TLI.setUnavailable(LibFunc::acosf);
320       TLI.setUnavailable(LibFunc::asinf);
321       TLI.setUnavailable(LibFunc::atanf);
322       TLI.setUnavailable(LibFunc::atan2f);
323       TLI.setUnavailable(LibFunc::ceilf);
324       TLI.setUnavailable(LibFunc::copysignf);
325       TLI.setUnavailable(LibFunc::cosf);
326       TLI.setUnavailable(LibFunc::coshf);
327       TLI.setUnavailable(LibFunc::expf);
328       TLI.setUnavailable(LibFunc::floorf);
329       TLI.setUnavailable(LibFunc::fmodf);
330       TLI.setUnavailable(LibFunc::logf);
331       TLI.setUnavailable(LibFunc::powf);
332       TLI.setUnavailable(LibFunc::sinf);
333       TLI.setUnavailable(LibFunc::sinhf);
334       TLI.setUnavailable(LibFunc::sqrtf);
335       TLI.setUnavailable(LibFunc::tanf);
336       TLI.setUnavailable(LibFunc::tanhf);
337     }
338
339     // Win32 does *not* provide stpcpy.  It is provided on POSIX systems:
340     // http://pubs.opengroup.org/onlinepubs/9699919799/functions/stpcpy.html
341     TLI.setUnavailable(LibFunc::stpcpy);
342
343     // Win32 does *not* provide ffs.  It is provided on POSIX systems:
344     // http://pubs.opengroup.org/onlinepubs/009695399/functions/ffs.html
345     TLI.setUnavailable(LibFunc::ffs);
346
347     // Win32 does *not* provide llabs.  It is defined in ISO/IEC 9899:1999,
348     // but Visual C++ does not support it.
349     TLI.setUnavailable(LibFunc::llabs);
350   }
351
352   // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
353   // Linux (GLIBC):
354   // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
355   // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
356   // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
357   switch (T.getOS()) {
358   case Triple::Darwin:
359   case Triple::MacOSX:
360   case Triple::IOS:
361   case Triple::FreeBSD:
362   case Triple::Linux:
363     break;
364   default:
365     TLI.setUnavailable(LibFunc::ffsl);
366   }
367
368   // ffsll is available on at least FreeBSD and Linux (GLIBC):
369   // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
370   // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
371   switch (T.getOS()) {
372   case Triple::FreeBSD:
373   case Triple::Linux:
374     break;
375   default:
376     TLI.setUnavailable(LibFunc::ffsll);
377   }
378 }
379
380
381 TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
382   // Default to everything being available.
383   memset(AvailableArray, -1, sizeof(AvailableArray));
384
385   initialize(*this, Triple(), StandardNames);
386 }
387
388 TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
389   // Default to everything being available.
390   memset(AvailableArray, -1, sizeof(AvailableArray));
391   
392   initialize(*this, T, StandardNames);
393 }
394
395 TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
396   : ImmutablePass(ID) {
397   memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
398   CustomNames = TLI.CustomNames;
399 }
400
401 bool TargetLibraryInfo::getLibFunc(StringRef funcName,
402                                    LibFunc::Func &F) const {
403   const char **Start = &StandardNames[0];
404   const char **End = &StandardNames[LibFunc::NumLibFuncs];
405   const char **I = std::lower_bound(Start, End, funcName);
406   if (I != End && *I == funcName) {
407     F = (LibFunc::Func)(I - Start);
408     return true;
409   }
410   return false;
411 }
412
413 /// disableAllFunctions - This disables all builtins, which is used for options
414 /// like -fno-builtin.
415 void TargetLibraryInfo::disableAllFunctions() {
416   memset(AvailableArray, 0, sizeof(AvailableArray));
417 }