TargetLibraryInfo.cpp revision 8d32463a9fa2aba9de552350a5019099edf0b90d
1ce99120084f549a523213064648662a704e8b789Chris Lattner//===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
2ce99120084f549a523213064648662a704e8b789Chris Lattner//
3ce99120084f549a523213064648662a704e8b789Chris Lattner//                     The LLVM Compiler Infrastructure
4ce99120084f549a523213064648662a704e8b789Chris Lattner//
5ce99120084f549a523213064648662a704e8b789Chris Lattner// This file is distributed under the University of Illinois Open Source
6ce99120084f549a523213064648662a704e8b789Chris Lattner// License. See LICENSE.TXT for details.
7ce99120084f549a523213064648662a704e8b789Chris Lattner//
8ce99120084f549a523213064648662a704e8b789Chris Lattner//===----------------------------------------------------------------------===//
9ce99120084f549a523213064648662a704e8b789Chris Lattner//
10ce99120084f549a523213064648662a704e8b789Chris Lattner// This file implements the TargetLibraryInfo class.
11ce99120084f549a523213064648662a704e8b789Chris Lattner//
12ce99120084f549a523213064648662a704e8b789Chris Lattner//===----------------------------------------------------------------------===//
13ce99120084f549a523213064648662a704e8b789Chris Lattner
14ce99120084f549a523213064648662a704e8b789Chris Lattner#include "llvm/Target/TargetLibraryInfo.h"
15ce99120084f549a523213064648662a704e8b789Chris Lattner#include "llvm/ADT/Triple.h"
16ce99120084f549a523213064648662a704e8b789Chris Lattnerusing namespace llvm;
17ce99120084f549a523213064648662a704e8b789Chris Lattner
18ce99120084f549a523213064648662a704e8b789Chris Lattner// Register the default implementation.
19ce99120084f549a523213064648662a704e8b789Chris LattnerINITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20ce99120084f549a523213064648662a704e8b789Chris Lattner                "Target Library Information", false, true)
21ce99120084f549a523213064648662a704e8b789Chris Lattnerchar TargetLibraryInfo::ID = 0;
22ce99120084f549a523213064648662a704e8b789Chris Lattner
232d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid TargetLibraryInfo::anchor() { }
242d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
259d434dbff3eb0501efc3457acec2401afdffef2fEli Friedmanconst char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
269d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  {
278ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "acos",
288ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "acosl",
298ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "acosf",
308ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "asin",
318ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "asinl",
328ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "asinf",
338ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "atan",
348ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "atanl",
358ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "atanf",
3632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "atan2",
3732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "atan2l",
3832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "atan2f",
398ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "ceil",
408ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "ceill",
418ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "ceilf",
42243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "copysign",
43243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "copysignf",
44243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "copysignl",
458ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "cos",
468ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "cosl",
478ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "cosf",
488ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "cosh",
498ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "coshl",
508ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "coshf",
518ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "exp",
528ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "expl",
538ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "expf",
548ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "exp2",
558ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "exp2l",
568ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "exp2f",
578ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "expm1",
588ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "expm1l",
59d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "expm1f",
608ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "fabs",
618ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "fabsl",
628ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "fabsf",
638ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "floor",
648ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "floorl",
658ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "floorf",
66683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "fiprintf",
6732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "fmod",
6832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "fmodl",
6932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "fmodf",
708d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "fputc",
71683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "fputs",
72683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "fwrite",
73683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "iprintf",
748ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log",
758ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "logl",
768ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "logf",
778ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log2",
788ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log2l",
798ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log2f",
808ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log10",
818ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log10l",
828ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log10f",
838ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log1p",
848ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log1pl",
858ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log1pf",
868d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "memchr",
878d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "memcmp",
889d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    "memcpy",
899d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    "memmove",
90683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "memset",
919d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    "memset_pattern16",
92243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "nearbyint",
93243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "nearbyintf",
94243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "nearbyintl",
958ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "pow",
968ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "powf",
978ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "powl",
988d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "putchar",
998d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "puts",
100243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "rint",
101243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "rintf",
102243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "rintl",
103d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "round",
104d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "roundf",
105d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "roundl",
10632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "sin",
10732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "sinl",
10832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "sinf",
109fbd828d8e1133763c8acee540bcd221bc2aab355Chad Rosier    "sinh",
110fbd828d8e1133763c8acee540bcd221bc2aab355Chad Rosier    "sinhl",
111fbd828d8e1133763c8acee540bcd221bc2aab355Chad Rosier    "sinhf",
112fbd828d8e1133763c8acee540bcd221bc2aab355Chad Rosier    "siprintf",
1133d925d24e8c54cde05228258c25cc21687cad922Chad Rosier    "sqrt",
1148ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "sqrtl",
11532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "sqrtf",
1160841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strcat",
1178d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "strchr",
1180841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strcpy",
1190841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strlen",
1200841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strncat",
1218d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "strncmp",
1220841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strncpy",
1230841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strnlen",
12432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tan",
12532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tanl",
12632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tanf",
12732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tanh",
12832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tanhl",
129243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "tanhf",
130243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "trunc",
131243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "truncf",
1326a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky    "truncl",
1336a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky    "__cxa_atexit",
1346a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky    "__cxa_guard_abort",
1356a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky    "__cxa_guard_acquire",
1366a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky    "__cxa_guard_release"
1379d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  };
1389d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
139ce99120084f549a523213064648662a704e8b789Chris Lattner/// initialize - Initialize the set of available library functions based on the
140ce99120084f549a523213064648662a704e8b789Chris Lattner/// specified target triple.  This should be carefully written so that a missing
141ce99120084f549a523213064648662a704e8b789Chris Lattner/// target triple gets a sane set of defaults.
142ce99120084f549a523213064648662a704e8b789Chris Lattnerstatic void initialize(TargetLibraryInfo &TLI, const Triple &T) {
143ce99120084f549a523213064648662a704e8b789Chris Lattner  initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
144ce99120084f549a523213064648662a704e8b789Chris Lattner
145ce99120084f549a523213064648662a704e8b789Chris Lattner
146ce99120084f549a523213064648662a704e8b789Chris Lattner  // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
147558692fd0a31d4d3ae4fd09a3a02f80da2e44e5cDaniel Dunbar  if (T.isMacOSX()) {
148558692fd0a31d4d3ae4fd09a3a02f80da2e44e5cDaniel Dunbar    if (T.isMacOSXVersionLT(10, 5))
14913fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar      TLI.setUnavailable(LibFunc::memset_pattern16);
15013fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar  } else if (T.getOS() == Triple::IOS) {
15113fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar    if (T.isOSVersionLT(3, 0))
15213fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar      TLI.setUnavailable(LibFunc::memset_pattern16);
15313fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar  } else {
154ce99120084f549a523213064648662a704e8b789Chris Lattner    TLI.setUnavailable(LibFunc::memset_pattern16);
15513fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar  }
1563649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne
1579d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  if (T.isMacOSX() && T.getArch() == Triple::x86 &&
1589d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman      !T.isMacOSXVersionLT(10, 7)) {
1599d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
1609d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // we don't care about) have two versions; on recent OSX, the one we want
1619d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // has a $UNIX2003 suffix. The two implementations are identical except
1629d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // for the return value in some edge cases.  However, we don't want to
1639d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // generate code that depends on the old symbols.
1649d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
1659d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
1669d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  }
1679d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
1689fe88973be6bf0f47b36f40ada87176b9d7edd4bDuncan Sands  // iprintf and friends are only available on XCore and TCE.
1699fe88973be6bf0f47b36f40ada87176b9d7edd4bDuncan Sands  if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
1703649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne    TLI.setUnavailable(LibFunc::iprintf);
171419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne    TLI.setUnavailable(LibFunc::siprintf);
172022708f221e2a9ea1a42c07c7cd7817a8de881dcRichard Osborne    TLI.setUnavailable(LibFunc::fiprintf);
173419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne  }
174d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
175d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff  if (T.getOS() == Triple::Win32) {
176d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    // Win32 does not support long double
177d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::acosl);
178d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::asinl);
179d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::atanl);
180d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::atan2l);
181d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::ceill);
182d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::copysignl);
183d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::cosl);
184d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::coshl);
185d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expl);
186d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
187d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::fabsl);
188d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::floorl);
189d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::fmodl);
190d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::logl);
191d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::powl);
192d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::sinl);
193d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::sinhl);
194d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::sqrtl);
195d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::tanl);
196d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::tanhl);
197d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
198d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    // Win32 only has C89 math
199d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::exp2);
200d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::exp2f);
201d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::exp2l);
202d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expm1);
203d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expm1f);
204d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expm1l);
205d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log2);
206d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log2f);
207d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log2l);
208d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log1p);
209d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log1pf);
210d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log1pl);
211d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::nearbyint);
212d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::nearbyintf);
213d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::nearbyintl);
214d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::rint);
215d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::rintf);
216d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::rintl);
217d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::round);
218d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::roundf);
219d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::roundl);
220d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::trunc);
221d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::truncf);
222d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::truncl);
223d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
224d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    // Win32 provides some C99 math with mangled names
225d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
226d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
227d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    if (T.getArch() == Triple::x86) {
228d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      // Win32 on x86 implements single-precision math functions as macros
229d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::acosf);
230d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::asinf);
231d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::atanf);
232d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::atan2f);
233d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::ceilf);
234d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::copysignf);
235d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::cosf);
236d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::coshf);
237d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::expf);
238d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::floorf);
239d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::fmodf);
240d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::logf);
241d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::powf);
242d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::sinf);
243d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::sinhf);
244d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::sqrtf);
245d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::tanf);
246d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::tanhf);
247d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    }
248d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff  }
249ce99120084f549a523213064648662a704e8b789Chris Lattner}
250ce99120084f549a523213064648662a704e8b789Chris Lattner
251ce99120084f549a523213064648662a704e8b789Chris Lattner
252ce99120084f549a523213064648662a704e8b789Chris LattnerTargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
253ce99120084f549a523213064648662a704e8b789Chris Lattner  // Default to everything being available.
254ce99120084f549a523213064648662a704e8b789Chris Lattner  memset(AvailableArray, -1, sizeof(AvailableArray));
255ce99120084f549a523213064648662a704e8b789Chris Lattner
256ce99120084f549a523213064648662a704e8b789Chris Lattner  initialize(*this, Triple());
257ce99120084f549a523213064648662a704e8b789Chris Lattner}
258ce99120084f549a523213064648662a704e8b789Chris Lattner
259ce99120084f549a523213064648662a704e8b789Chris LattnerTargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
260ce99120084f549a523213064648662a704e8b789Chris Lattner  // Default to everything being available.
261ce99120084f549a523213064648662a704e8b789Chris Lattner  memset(AvailableArray, -1, sizeof(AvailableArray));
262ce99120084f549a523213064648662a704e8b789Chris Lattner
263ce99120084f549a523213064648662a704e8b789Chris Lattner  initialize(*this, T);
264ce99120084f549a523213064648662a704e8b789Chris Lattner}
265188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner
26640f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris LattnerTargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
26740f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner  : ImmutablePass(ID) {
26840f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner  memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
2699d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  CustomNames = TLI.CustomNames;
27040f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner}
27140f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner
27240f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner
273188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner/// disableAllFunctions - This disables all builtins, which is used for options
274188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner/// like -fno-builtin.
275188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattnervoid TargetLibraryInfo::disableAllFunctions() {
276188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  memset(AvailableArray, 0, sizeof(AvailableArray));
277188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner}
278