e0a4eccc97e9ded95e94af2ea1d5cb445fc12fc5
[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   };
138
139 /// initialize - Initialize the set of available library functions based on the
140 /// specified target triple.  This should be carefully written so that a missing
141 /// target triple gets a sane set of defaults.
142 static void initialize(TargetLibraryInfo &TLI, const Triple &T) {
143   initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
144
145   
146   // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
147   if (T.isMacOSX()) {
148     if (T.isMacOSXVersionLT(10, 5))
149       TLI.setUnavailable(LibFunc::memset_pattern16);
150   } else if (T.getOS() == Triple::IOS) {
151     if (T.isOSVersionLT(3, 0))
152       TLI.setUnavailable(LibFunc::memset_pattern16);
153   } else {
154     TLI.setUnavailable(LibFunc::memset_pattern16);
155   }
156
157   if (T.isMacOSX() && T.getArch() == Triple::x86 &&
158       !T.isMacOSXVersionLT(10, 7)) {
159     // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
160     // we don't care about) have two versions; on recent OSX, the one we want
161     // has a $UNIX2003 suffix. The two implementations are identical except
162     // for the return value in some edge cases.  However, we don't want to
163     // generate code that depends on the old symbols.
164     TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
165     TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
166   }
167
168   // iprintf and friends are only available on XCore and TCE.
169   if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
170     TLI.setUnavailable(LibFunc::iprintf);
171     TLI.setUnavailable(LibFunc::siprintf);
172     TLI.setUnavailable(LibFunc::fiprintf);
173   }
174
175   if (T.getOS() == Triple::Win32) {
176     // Win32 does not support long double
177     TLI.setUnavailable(LibFunc::acosl);
178     TLI.setUnavailable(LibFunc::asinl);
179     TLI.setUnavailable(LibFunc::atanl);
180     TLI.setUnavailable(LibFunc::atan2l);
181     TLI.setUnavailable(LibFunc::ceill);
182     TLI.setUnavailable(LibFunc::copysignl);
183     TLI.setUnavailable(LibFunc::cosl);
184     TLI.setUnavailable(LibFunc::coshl);
185     TLI.setUnavailable(LibFunc::expl);
186     TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
187     TLI.setUnavailable(LibFunc::fabsl);
188     TLI.setUnavailable(LibFunc::floorl);
189     TLI.setUnavailable(LibFunc::fmodl);
190     TLI.setUnavailable(LibFunc::logl);
191     TLI.setUnavailable(LibFunc::powl);
192     TLI.setUnavailable(LibFunc::sinl);
193     TLI.setUnavailable(LibFunc::sinhl);
194     TLI.setUnavailable(LibFunc::sqrtl);
195     TLI.setUnavailable(LibFunc::tanl);
196     TLI.setUnavailable(LibFunc::tanhl);
197
198     // Win32 only has C89 math
199     TLI.setUnavailable(LibFunc::exp2);
200     TLI.setUnavailable(LibFunc::exp2f);
201     TLI.setUnavailable(LibFunc::exp2l);
202     TLI.setUnavailable(LibFunc::expm1);
203     TLI.setUnavailable(LibFunc::expm1f);
204     TLI.setUnavailable(LibFunc::expm1l);
205     TLI.setUnavailable(LibFunc::log2);
206     TLI.setUnavailable(LibFunc::log2f);
207     TLI.setUnavailable(LibFunc::log2l);
208     TLI.setUnavailable(LibFunc::log1p);
209     TLI.setUnavailable(LibFunc::log1pf);
210     TLI.setUnavailable(LibFunc::log1pl);
211     TLI.setUnavailable(LibFunc::nearbyint);
212     TLI.setUnavailable(LibFunc::nearbyintf);
213     TLI.setUnavailable(LibFunc::nearbyintl);
214     TLI.setUnavailable(LibFunc::rint);
215     TLI.setUnavailable(LibFunc::rintf);
216     TLI.setUnavailable(LibFunc::rintl);
217     TLI.setUnavailable(LibFunc::round);
218     TLI.setUnavailable(LibFunc::roundf);
219     TLI.setUnavailable(LibFunc::roundl);
220     TLI.setUnavailable(LibFunc::trunc);
221     TLI.setUnavailable(LibFunc::truncf);
222     TLI.setUnavailable(LibFunc::truncl);
223
224     // Win32 provides some C99 math with mangled names
225     TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
226
227     if (T.getArch() == Triple::x86) {
228       // Win32 on x86 implements single-precision math functions as macros
229       TLI.setUnavailable(LibFunc::acosf);
230       TLI.setUnavailable(LibFunc::asinf);
231       TLI.setUnavailable(LibFunc::atanf);
232       TLI.setUnavailable(LibFunc::atan2f);
233       TLI.setUnavailable(LibFunc::ceilf);
234       TLI.setUnavailable(LibFunc::copysignf);
235       TLI.setUnavailable(LibFunc::cosf);
236       TLI.setUnavailable(LibFunc::coshf);
237       TLI.setUnavailable(LibFunc::expf);
238       TLI.setUnavailable(LibFunc::floorf);
239       TLI.setUnavailable(LibFunc::fmodf);
240       TLI.setUnavailable(LibFunc::logf);
241       TLI.setUnavailable(LibFunc::powf);
242       TLI.setUnavailable(LibFunc::sinf);
243       TLI.setUnavailable(LibFunc::sinhf);
244       TLI.setUnavailable(LibFunc::sqrtf);
245       TLI.setUnavailable(LibFunc::tanf);
246       TLI.setUnavailable(LibFunc::tanhf);
247     }
248   }
249 }
250
251
252 TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
253   // Default to everything being available.
254   memset(AvailableArray, -1, sizeof(AvailableArray));
255
256   initialize(*this, Triple());
257 }
258
259 TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
260   // Default to everything being available.
261   memset(AvailableArray, -1, sizeof(AvailableArray));
262   
263   initialize(*this, T);
264 }
265
266 TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
267   : ImmutablePass(ID) {
268   memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
269   CustomNames = TLI.CustomNames;
270 }
271
272
273 /// disableAllFunctions - This disables all builtins, which is used for options
274 /// like -fno-builtin.
275 void TargetLibraryInfo::disableAllFunctions() {
276   memset(AvailableArray, 0, sizeof(AvailableArray));
277 }