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