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    "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.
129static 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
239TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
240  // Default to everything being available.
241  memset(AvailableArray, -1, sizeof(AvailableArray));
242
243  initialize(*this, Triple());
244}
245
246TargetLibraryInfo::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
253TargetLibraryInfo::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.
262void TargetLibraryInfo::disableAllFunctions() {
263  memset(AvailableArray, 0, sizeof(AvailableArray));
264}
265