7e9cf12bb463de9ae451a84c9ee4f8e4f84783aa
[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     "acos",
28     "acosl",
29     "acosf",
30     "asin",
31     "asinl",
32     "asinf",
33     "atan",
34     "atanl",
35     "atanf",
36     "atan2",
37     "atan2l",
38     "atan2f",
39     "ceil",
40     "ceill",
41     "ceilf",
42     "copysign",
43     "copysignf",
44     "copysignl",
45     "cos",
46     "cosl",
47     "cosf",
48     "cosh",
49     "coshl",
50     "coshf",
51     "exp",
52     "expl",
53     "expf",
54     "exp2",
55     "exp2l",
56     "exp2f",
57     "expm1",
58     "expm1l",
59     "expm1f",
60     "fabs",
61     "fabsl",
62     "fabsf",
63     "floor",
64     "floorl",
65     "floorf",
66     "fiprintf",
67     "fmod",
68     "fmodl",
69     "fmodf",
70     "fputc",
71     "fputs",
72     "fwrite",
73     "iprintf",
74     "log",
75     "logl",
76     "logf",
77     "log2",
78     "log2l",
79     "log2f",
80     "log10",
81     "log10l",
82     "log10f",
83     "log1p",
84     "log1pl",
85     "log1pf",
86     "memchr",
87     "memcmp",
88     "memcpy",
89     "memmove",
90     "memset",
91     "memset_pattern16",
92     "nearbyint",
93     "nearbyintf",
94     "nearbyintl",
95     "pow",
96     "powf",
97     "powl",
98     "putchar",
99     "puts",
100     "rint",
101     "rintf",
102     "rintl",
103     "round",
104     "roundf",
105     "roundl",
106     "sin",
107     "sinl",
108     "sinf",
109     "sinh",
110     "sinhl",
111     "sinhf",
112     "siprintf",
113     "sqrt",
114     "sqrtl",
115     "sqrtf",
116     "strcat",
117     "strchr",
118     "strcpy",
119     "strlen",
120     "strncat",
121     "strncmp",
122     "strncpy",
123     "strnlen",
124     "tan",
125     "tanl",
126     "tanf",
127     "tanh",
128     "tanhl",
129     "tanhf",
130     "trunc",
131     "truncf",
132     "truncl",
133     "__cxa_atexit",
134     "__cxa_guard_abort",
135     "__cxa_guard_acquire",
136     "__cxa_guard_release",
137     "__memcpy_chk"
138   };
139
140 /// initialize - Initialize the set of available library functions based on the
141 /// specified target triple.  This should be carefully written so that a missing
142 /// target triple gets a sane set of defaults.
143 static void initialize(TargetLibraryInfo &TLI, const Triple &T) {
144   initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
145
146   
147   // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
148   if (T.isMacOSX()) {
149     if (T.isMacOSXVersionLT(10, 5))
150       TLI.setUnavailable(LibFunc::memset_pattern16);
151   } else if (T.getOS() == Triple::IOS) {
152     if (T.isOSVersionLT(3, 0))
153       TLI.setUnavailable(LibFunc::memset_pattern16);
154   } else {
155     TLI.setUnavailable(LibFunc::memset_pattern16);
156   }
157
158   if (T.isMacOSX() && T.getArch() == Triple::x86 &&
159       !T.isMacOSXVersionLT(10, 7)) {
160     // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
161     // we don't care about) have two versions; on recent OSX, the one we want
162     // has a $UNIX2003 suffix. The two implementations are identical except
163     // for the return value in some edge cases.  However, we don't want to
164     // generate code that depends on the old symbols.
165     TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
166     TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
167   }
168
169   // iprintf and friends are only available on XCore and TCE.
170   if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
171     TLI.setUnavailable(LibFunc::iprintf);
172     TLI.setUnavailable(LibFunc::siprintf);
173     TLI.setUnavailable(LibFunc::fiprintf);
174   }
175
176   if (T.getOS() == Triple::Win32) {
177     // Win32 does not support long double
178     TLI.setUnavailable(LibFunc::acosl);
179     TLI.setUnavailable(LibFunc::asinl);
180     TLI.setUnavailable(LibFunc::atanl);
181     TLI.setUnavailable(LibFunc::atan2l);
182     TLI.setUnavailable(LibFunc::ceill);
183     TLI.setUnavailable(LibFunc::copysignl);
184     TLI.setUnavailable(LibFunc::cosl);
185     TLI.setUnavailable(LibFunc::coshl);
186     TLI.setUnavailable(LibFunc::expl);
187     TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
188     TLI.setUnavailable(LibFunc::fabsl);
189     TLI.setUnavailable(LibFunc::floorl);
190     TLI.setUnavailable(LibFunc::fmodl);
191     TLI.setUnavailable(LibFunc::logl);
192     TLI.setUnavailable(LibFunc::powl);
193     TLI.setUnavailable(LibFunc::sinl);
194     TLI.setUnavailable(LibFunc::sinhl);
195     TLI.setUnavailable(LibFunc::sqrtl);
196     TLI.setUnavailable(LibFunc::tanl);
197     TLI.setUnavailable(LibFunc::tanhl);
198
199     // Win32 only has C89 math
200     TLI.setUnavailable(LibFunc::exp2);
201     TLI.setUnavailable(LibFunc::exp2f);
202     TLI.setUnavailable(LibFunc::exp2l);
203     TLI.setUnavailable(LibFunc::expm1);
204     TLI.setUnavailable(LibFunc::expm1f);
205     TLI.setUnavailable(LibFunc::expm1l);
206     TLI.setUnavailable(LibFunc::log2);
207     TLI.setUnavailable(LibFunc::log2f);
208     TLI.setUnavailable(LibFunc::log2l);
209     TLI.setUnavailable(LibFunc::log1p);
210     TLI.setUnavailable(LibFunc::log1pf);
211     TLI.setUnavailable(LibFunc::log1pl);
212     TLI.setUnavailable(LibFunc::nearbyint);
213     TLI.setUnavailable(LibFunc::nearbyintf);
214     TLI.setUnavailable(LibFunc::nearbyintl);
215     TLI.setUnavailable(LibFunc::rint);
216     TLI.setUnavailable(LibFunc::rintf);
217     TLI.setUnavailable(LibFunc::rintl);
218     TLI.setUnavailable(LibFunc::round);
219     TLI.setUnavailable(LibFunc::roundf);
220     TLI.setUnavailable(LibFunc::roundl);
221     TLI.setUnavailable(LibFunc::trunc);
222     TLI.setUnavailable(LibFunc::truncf);
223     TLI.setUnavailable(LibFunc::truncl);
224
225     // Win32 provides some C99 math with mangled names
226     TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
227
228     if (T.getArch() == Triple::x86) {
229       // Win32 on x86 implements single-precision math functions as macros
230       TLI.setUnavailable(LibFunc::acosf);
231       TLI.setUnavailable(LibFunc::asinf);
232       TLI.setUnavailable(LibFunc::atanf);
233       TLI.setUnavailable(LibFunc::atan2f);
234       TLI.setUnavailable(LibFunc::ceilf);
235       TLI.setUnavailable(LibFunc::copysignf);
236       TLI.setUnavailable(LibFunc::cosf);
237       TLI.setUnavailable(LibFunc::coshf);
238       TLI.setUnavailable(LibFunc::expf);
239       TLI.setUnavailable(LibFunc::floorf);
240       TLI.setUnavailable(LibFunc::fmodf);
241       TLI.setUnavailable(LibFunc::logf);
242       TLI.setUnavailable(LibFunc::powf);
243       TLI.setUnavailable(LibFunc::sinf);
244       TLI.setUnavailable(LibFunc::sinhf);
245       TLI.setUnavailable(LibFunc::sqrtf);
246       TLI.setUnavailable(LibFunc::tanf);
247       TLI.setUnavailable(LibFunc::tanhf);
248     }
249   }
250 }
251
252
253 TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
254   // Default to everything being available.
255   memset(AvailableArray, -1, sizeof(AvailableArray));
256
257   initialize(*this, Triple());
258 }
259
260 TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
261   // Default to everything being available.
262   memset(AvailableArray, -1, sizeof(AvailableArray));
263   
264   initialize(*this, T);
265 }
266
267 TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
268   : ImmutablePass(ID) {
269   memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
270   CustomNames = TLI.CustomNames;
271 }
272
273
274 /// disableAllFunctions - This disables all builtins, which is used for options
275 /// like -fno-builtin.
276 void TargetLibraryInfo::disableAllFunctions() {
277   memset(AvailableArray, 0, sizeof(AvailableArray));
278 }