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