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