TargetLibraryInfo.cpp revision 51004dff923259c90591621e7151408ad94e0eb8
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"
16using namespace llvm;
17
18// Register the default implementation.
19INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20                "Target Library Information", false, true)
21char TargetLibraryInfo::ID = 0;
22
23void TargetLibraryInfo::anchor() { }
24
25const 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.
143static 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
253TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
254  // Default to everything being available.
255  memset(AvailableArray, -1, sizeof(AvailableArray));
256
257  initialize(*this, Triple());
258}
259
260TargetLibraryInfo::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
267TargetLibraryInfo::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.
276void TargetLibraryInfo::disableAllFunctions() {
277  memset(AvailableArray, 0, sizeof(AvailableArray));
278}
279