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