Remove TargetELFWriterInfo.
[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     "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     "strcat",
156     "strchr",
157     "strcpy",
158     "strdup",
159     "strlen",
160     "strncat",
161     "strncmp",
162     "strncpy",
163     "strndup",
164     "strnlen",
165     "tan",
166     "tanf",
167     "tanh",
168     "tanhf",
169     "tanhl",
170     "tanl",
171     "trunc",
172     "truncf",
173     "truncl",
174     "valloc"
175   };
176
177 /// initialize - Initialize the set of available library functions based on the
178 /// specified target triple.  This should be carefully written so that a missing
179 /// target triple gets a sane set of defaults.
180 static void initialize(TargetLibraryInfo &TLI, const Triple &T,
181                        const char **StandardNames) {
182   initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
183
184 #ifndef NDEBUG
185   // Verify that the StandardNames array is in alphabetical order.
186   for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
187     if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
188       llvm_unreachable("TargetLibraryInfo function names must be sorted");
189   }
190 #endif // !NDEBUG
191   
192   // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
193   if (T.isMacOSX()) {
194     if (T.isMacOSXVersionLT(10, 5))
195       TLI.setUnavailable(LibFunc::memset_pattern16);
196   } else if (T.getOS() == Triple::IOS) {
197     if (T.isOSVersionLT(3, 0))
198       TLI.setUnavailable(LibFunc::memset_pattern16);
199   } else {
200     TLI.setUnavailable(LibFunc::memset_pattern16);
201   }
202
203   if (T.isMacOSX() && T.getArch() == Triple::x86 &&
204       !T.isMacOSXVersionLT(10, 7)) {
205     // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
206     // we don't care about) have two versions; on recent OSX, the one we want
207     // has a $UNIX2003 suffix. The two implementations are identical except
208     // for the return value in some edge cases.  However, we don't want to
209     // generate code that depends on the old symbols.
210     TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
211     TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
212   }
213
214   // iprintf and friends are only available on XCore and TCE.
215   if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
216     TLI.setUnavailable(LibFunc::iprintf);
217     TLI.setUnavailable(LibFunc::siprintf);
218     TLI.setUnavailable(LibFunc::fiprintf);
219   }
220
221   if (T.getOS() == Triple::Win32) {
222     // Win32 does not support long double
223     TLI.setUnavailable(LibFunc::acosl);
224     TLI.setUnavailable(LibFunc::asinl);
225     TLI.setUnavailable(LibFunc::atanl);
226     TLI.setUnavailable(LibFunc::atan2l);
227     TLI.setUnavailable(LibFunc::ceill);
228     TLI.setUnavailable(LibFunc::copysignl);
229     TLI.setUnavailable(LibFunc::cosl);
230     TLI.setUnavailable(LibFunc::coshl);
231     TLI.setUnavailable(LibFunc::expl);
232     TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
233     TLI.setUnavailable(LibFunc::fabsl);
234     TLI.setUnavailable(LibFunc::floorl);
235     TLI.setUnavailable(LibFunc::fmodl);
236     TLI.setUnavailable(LibFunc::logl);
237     TLI.setUnavailable(LibFunc::powl);
238     TLI.setUnavailable(LibFunc::sinl);
239     TLI.setUnavailable(LibFunc::sinhl);
240     TLI.setUnavailable(LibFunc::sqrtl);
241     TLI.setUnavailable(LibFunc::tanl);
242     TLI.setUnavailable(LibFunc::tanhl);
243
244     // Win32 only has C89 math
245     TLI.setUnavailable(LibFunc::acosh);
246     TLI.setUnavailable(LibFunc::acoshf);
247     TLI.setUnavailable(LibFunc::acoshl);
248     TLI.setUnavailable(LibFunc::asinh);
249     TLI.setUnavailable(LibFunc::asinhf);
250     TLI.setUnavailable(LibFunc::asinhl);
251     TLI.setUnavailable(LibFunc::atanh);
252     TLI.setUnavailable(LibFunc::atanhf);
253     TLI.setUnavailable(LibFunc::atanhl);
254     TLI.setUnavailable(LibFunc::cbrt);
255     TLI.setUnavailable(LibFunc::cbrtf);
256     TLI.setUnavailable(LibFunc::cbrtl);
257     TLI.setUnavailable(LibFunc::exp10);
258     TLI.setUnavailable(LibFunc::exp10f);
259     TLI.setUnavailable(LibFunc::exp10l);
260     TLI.setUnavailable(LibFunc::exp2);
261     TLI.setUnavailable(LibFunc::exp2f);
262     TLI.setUnavailable(LibFunc::exp2l);
263     TLI.setUnavailable(LibFunc::expm1);
264     TLI.setUnavailable(LibFunc::expm1f);
265     TLI.setUnavailable(LibFunc::expm1l);
266     TLI.setUnavailable(LibFunc::log2);
267     TLI.setUnavailable(LibFunc::log2f);
268     TLI.setUnavailable(LibFunc::log2l);
269     TLI.setUnavailable(LibFunc::log1p);
270     TLI.setUnavailable(LibFunc::log1pf);
271     TLI.setUnavailable(LibFunc::log1pl);
272     TLI.setUnavailable(LibFunc::logb);
273     TLI.setUnavailable(LibFunc::logbf);
274     TLI.setUnavailable(LibFunc::logbl);
275     TLI.setUnavailable(LibFunc::nearbyint);
276     TLI.setUnavailable(LibFunc::nearbyintf);
277     TLI.setUnavailable(LibFunc::nearbyintl);
278     TLI.setUnavailable(LibFunc::rint);
279     TLI.setUnavailable(LibFunc::rintf);
280     TLI.setUnavailable(LibFunc::rintl);
281     TLI.setUnavailable(LibFunc::round);
282     TLI.setUnavailable(LibFunc::roundf);
283     TLI.setUnavailable(LibFunc::roundl);
284     TLI.setUnavailable(LibFunc::trunc);
285     TLI.setUnavailable(LibFunc::truncf);
286     TLI.setUnavailable(LibFunc::truncl);
287
288     // Win32 provides some C99 math with mangled names
289     TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
290
291     if (T.getArch() == Triple::x86) {
292       // Win32 on x86 implements single-precision math functions as macros
293       TLI.setUnavailable(LibFunc::acosf);
294       TLI.setUnavailable(LibFunc::asinf);
295       TLI.setUnavailable(LibFunc::atanf);
296       TLI.setUnavailable(LibFunc::atan2f);
297       TLI.setUnavailable(LibFunc::ceilf);
298       TLI.setUnavailable(LibFunc::copysignf);
299       TLI.setUnavailable(LibFunc::cosf);
300       TLI.setUnavailable(LibFunc::coshf);
301       TLI.setUnavailable(LibFunc::expf);
302       TLI.setUnavailable(LibFunc::floorf);
303       TLI.setUnavailable(LibFunc::fmodf);
304       TLI.setUnavailable(LibFunc::logf);
305       TLI.setUnavailable(LibFunc::powf);
306       TLI.setUnavailable(LibFunc::sinf);
307       TLI.setUnavailable(LibFunc::sinhf);
308       TLI.setUnavailable(LibFunc::sqrtf);
309       TLI.setUnavailable(LibFunc::tanf);
310       TLI.setUnavailable(LibFunc::tanhf);
311     }
312   }
313 }
314
315
316 TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
317   // Default to everything being available.
318   memset(AvailableArray, -1, sizeof(AvailableArray));
319
320   initialize(*this, Triple(), StandardNames);
321 }
322
323 TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
324   // Default to everything being available.
325   memset(AvailableArray, -1, sizeof(AvailableArray));
326   
327   initialize(*this, T, StandardNames);
328 }
329
330 TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
331   : ImmutablePass(ID) {
332   memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
333   CustomNames = TLI.CustomNames;
334 }
335
336 bool TargetLibraryInfo::getLibFunc(StringRef funcName,
337                                    LibFunc::Func &F) const {
338   const char **Start = &StandardNames[0];
339   const char **End = &StandardNames[LibFunc::NumLibFuncs];
340   const char **I = std::lower_bound(Start, End, funcName);
341   if (I != End && *I == funcName) {
342     F = (LibFunc::Func)(I - Start);
343     return true;
344   }
345   return false;
346 }
347
348 /// disableAllFunctions - This disables all builtins, which is used for options
349 /// like -fno-builtin.
350 void TargetLibraryInfo::disableAllFunctions() {
351   memset(AvailableArray, 0, sizeof(AvailableArray));
352 }