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  {
27cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "_IO_getc",
28cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "_IO_putc",
298e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_ZdaPv",
3072c8331ec1437f8c33fff1dac1ea0ebb11009411Richard Smith    "_ZdaPvRKSt9nothrow_t",
318e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_ZdlPv",
3272c8331ec1437f8c33fff1dac1ea0ebb11009411Richard Smith    "_ZdlPvRKSt9nothrow_t",
338e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_Znaj",
348e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_ZnajRKSt9nothrow_t",
358e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_Znam",
368e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_ZnamRKSt9nothrow_t",
378e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_Znwj",
388e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_ZnwjRKSt9nothrow_t",
398e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_Znwm",
408e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "_ZnwmRKSt9nothrow_t",
41208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    "__cospi",
42208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    "__cospif",
43d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "__cxa_atexit",
44d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "__cxa_guard_abort",
45d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "__cxa_guard_acquire",
46d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "__cxa_guard_release",
47cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "__isoc99_scanf",
48cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "__isoc99_sscanf",
49d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "__memcpy_chk",
50208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    "__sincospi_stret",
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "__sincospif_stret",
52208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    "__sinpi",
53208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    "__sinpif",
54b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd    "__sqrt_finite",
55b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd    "__sqrtf_finite",
56b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd    "__sqrtl_finite",
57cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "__strdup",
58cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "__strndup",
59cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "__strtok_r",
606098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "abs",
61cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "access",
628ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "acos",
638ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "acosf",
646871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "acosh",
656871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "acoshf",
666871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "acoshl",
67d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "acosl",
688ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "asin",
698ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "asinf",
706871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "asinh",
716871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "asinhf",
726871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "asinhl",
73d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "asinl",
748ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "atan",
7532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "atan2",
7632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "atan2f",
77d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "atan2l",
78d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "atanf",
796871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "atanh",
806871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "atanhf",
816871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "atanhl",
82d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "atanl",
83cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "atof",
84cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "atoi",
85cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "atol",
86cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "atoll",
87cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "bcmp",
88cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "bcopy",
89cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "bzero",
908e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "calloc",
916871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "cbrt",
926871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "cbrtf",
936871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "cbrtl",
948ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "ceil",
958ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "ceilf",
96d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "ceill",
97cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "chmod",
98cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "chown",
99cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "clearerr",
100cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "closedir",
101243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "copysign",
102243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "copysignf",
103243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "copysignl",
1048ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "cos",
1058ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "cosf",
1068ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "cosh",
1078ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "coshf",
108d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "coshl",
109d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "cosl",
110cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ctermid",
1118ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "exp",
1126871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "exp10",
1136871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "exp10f",
1146871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "exp10l",
1158ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "exp2",
1168ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "exp2f",
117d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "exp2l",
118d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "expf",
119d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "expl",
1208ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "expm1",
121d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "expm1f",
122d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "expm1l",
1238ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "fabs",
1248ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "fabsf",
125d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "fabsl",
126cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fclose",
127cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fdopen",
128cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "feof",
129cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ferror",
130cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fflush",
1316098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "ffs",
1326098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "ffsl",
1336098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "ffsll",
134cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fgetc",
135cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fgetpos",
136cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fgets",
137cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fileno",
138d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "fiprintf",
139cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "flockfile",
1408ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "floor",
1418ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "floorf",
142d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "floorl",
14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "fmax",
14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "fmaxf",
14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "fmaxl",
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "fmin",
14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "fminf",
14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "fminl",
14932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "fmod",
15032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "fmodf",
151d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "fmodl",
152cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fopen",
153cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fopen64",
1546098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "fprintf",
1558d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "fputc",
156683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "fputs",
157cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fread",
1588e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "free",
159cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "frexp",
160cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "frexpf",
161cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "frexpl",
162cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fscanf",
163cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fseek",
164cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fseeko",
165cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fseeko64",
166cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fsetpos",
167cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fstat",
168cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fstat64",
169cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fstatvfs",
170cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "fstatvfs64",
171cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ftell",
172cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ftello",
173cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ftello64",
174cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ftrylockfile",
175cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "funlockfile",
176683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "fwrite",
177cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "getc",
178cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "getc_unlocked",
179cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "getchar",
180cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "getenv",
181cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "getitimer",
182cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "getlogin_r",
183cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "getpwnam",
184cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "gets",
185f0f85eab0469ac93f9bb6c7d19aca2c35868d83aMichael Gottesman    "gettimeofday",
186cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "htonl",
187cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "htons",
188683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "iprintf",
1896098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "isascii",
1906098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "isdigit",
1916098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "labs",
192cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "lchown",
19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "ldexp",
19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "ldexpf",
19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "ldexpl",
1966098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "llabs",
1978ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log",
1988ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log10",
1998ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log10f",
200d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "log10l",
2018ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log1p",
2028ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "log1pf",
203d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "log1pl",
204d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "log2",
205d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "log2f",
206d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "log2l",
2076871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "logb",
2086871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "logbf",
2096871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    "logbl",
210d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "logf",
211d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "logl",
212cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "lstat",
213cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "lstat64",
2148e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "malloc",
215cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "memalign",
216cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "memccpy",
2178d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "memchr",
2188d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "memcmp",
2199d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    "memcpy",
2209d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    "memmove",
221cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "memrchr",
222683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier    "memset",
2239d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    "memset_pattern16",
224cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "mkdir",
225cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "mktime",
226cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "modf",
227cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "modff",
228cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "modfl",
229243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "nearbyint",
230243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "nearbyintf",
231243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "nearbyintl",
232cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ntohl",
233cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ntohs",
234cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "open",
235cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "open64",
236cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "opendir",
237cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "pclose",
238cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "perror",
239cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "popen",
2408e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "posix_memalign",
2418ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "pow",
2428ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "powf",
2438ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier    "powl",
244cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "pread",
2456098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "printf",
246cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "putc",
2478d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "putchar",
2488d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "puts",
249cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "pwrite",
250cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "qsort",
251cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "read",
252cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "readlink",
2538e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "realloc",
2548e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "reallocf",
255cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "realpath",
256cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "remove",
257cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "rename",
258cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "rewind",
259243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "rint",
260243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "rintf",
261243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "rintl",
262cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "rmdir",
263d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "round",
264d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "roundf",
265d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    "roundl",
266cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "scanf",
267cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "setbuf",
268cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "setitimer",
269cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "setvbuf",
27032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "sin",
27132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "sinf",
272fbd828d8e1133763c8acee540bcd221bc2aab355Chad Rosier    "sinh",
273fbd828d8e1133763c8acee540bcd221bc2aab355Chad Rosier    "sinhf",
274d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "sinhl",
275d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "sinl",
276fbd828d8e1133763c8acee540bcd221bc2aab355Chad Rosier    "siprintf",
277cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "snprintf",
2786098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "sprintf",
2793d925d24e8c54cde05228258c25cc21687cad922Chad Rosier    "sqrt",
28032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "sqrtf",
281d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "sqrtl",
282cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "sscanf",
283cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "stat",
284cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "stat64",
285cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "statvfs",
286cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "statvfs64",
287939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "stpcpy",
288cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "stpncpy",
289cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "strcasecmp",
2900841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strcat",
2918d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "strchr",
292939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strcmp",
293cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "strcoll",
2940841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strcpy",
295939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strcspn",
2968e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "strdup",
2970841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strlen",
298cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "strncasecmp",
2990841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strncat",
3008d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes    "strncmp",
3010841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strncpy",
3028e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "strndup",
3030841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes    "strnlen",
304939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strpbrk",
305939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strrchr",
306939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strspn",
307939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strstr",
308939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strtod",
309939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strtof",
310cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "strtok",
311cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "strtok_r",
312939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strtol",
313939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strtold",
314939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strtoll",
315939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strtoul",
316939f5002027e3ccb710ac1c3050dc25471251565Meador Inge    "strtoull",
317cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "strxfrm",
318cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "system",
31932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tan",
32032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tanf",
32132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier    "tanh",
322243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "tanhf",
323d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "tanhl",
324d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    "tanl",
325cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "times",
326cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "tmpfile",
327cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "tmpfile64",
3286098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    "toascii",
329243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "trunc",
330243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson    "truncf",
3318e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer    "truncl",
332cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "uname",
333cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "ungetc",
334cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "unlink",
335cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "unsetenv",
336cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "utime",
337cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "utimes",
338cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "valloc",
339cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "vfprintf",
340cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "vfscanf",
341cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "vprintf",
342cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "vscanf",
343cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "vsnprintf",
344cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "vsprintf",
345cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "vsscanf",
346cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    "write"
3479d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  };
3489d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
349208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilsonstatic bool hasSinCosPiStret(const Triple &T) {
350208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  // Only Darwin variants have _stret versions of combined trig functions.
351208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  if (!T.isMacOSX() && T.getOS() != Triple::IOS)
352208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    return false;
353208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson
354208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  // The ABI is rather complicated on x86, so don't do anything special there.
355208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  if (T.getArch() == Triple::x86)
356208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    return false;
357208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson
358208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9))
359208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    return false;
360208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson
361208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  if (T.getOS() == Triple::IOS && T.isOSVersionLT(7, 0))
362208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    return false;
363208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson
364208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  return true;
365208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson}
366208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson
367ce99120084f549a523213064648662a704e8b789Chris Lattner/// initialize - Initialize the set of available library functions based on the
368ce99120084f549a523213064648662a704e8b789Chris Lattner/// specified target triple.  This should be carefully written so that a missing
369ce99120084f549a523213064648662a704e8b789Chris Lattner/// target triple gets a sane set of defaults.
370d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilsonstatic void initialize(TargetLibraryInfo &TLI, const Triple &T,
371d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson                       const char **StandardNames) {
372ce99120084f549a523213064648662a704e8b789Chris Lattner  initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
373ce99120084f549a523213064648662a704e8b789Chris Lattner
374d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson#ifndef NDEBUG
375d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  // Verify that the StandardNames array is in alphabetical order.
376d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
377d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
378d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson      llvm_unreachable("TargetLibraryInfo function names must be sorted");
379d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  }
380d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson#endif // !NDEBUG
38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // There are no library implementations of mempcy and memset for r600 and
38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // these can be difficult to lower in the backend.
38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (T.getArch() == Triple::r600) {
38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::memcpy);
38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::memset);
38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::memset_pattern16);
38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return;
38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later.
392558692fd0a31d4d3ae4fd09a3a02f80da2e44e5cDaniel Dunbar  if (T.isMacOSX()) {
393558692fd0a31d4d3ae4fd09a3a02f80da2e44e5cDaniel Dunbar    if (T.isMacOSXVersionLT(10, 5))
39413fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar      TLI.setUnavailable(LibFunc::memset_pattern16);
395441c557708b5dbe91f1799baf790ad418c23ea70Cameron Esfahani  } else if (T.isiOS()) {
39613fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar    if (T.isOSVersionLT(3, 0))
39713fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar      TLI.setUnavailable(LibFunc::memset_pattern16);
39813fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar  } else {
399ce99120084f549a523213064648662a704e8b789Chris Lattner    TLI.setUnavailable(LibFunc::memset_pattern16);
40013fb3b5706bf3778c6b76a39a45a9dca5b215940Daniel Dunbar  }
4013649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne
402208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  if (!hasSinCosPiStret(T)) {
403208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    TLI.setUnavailable(LibFunc::sinpi);
404208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    TLI.setUnavailable(LibFunc::sinpif);
405208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    TLI.setUnavailable(LibFunc::cospi);
406208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    TLI.setUnavailable(LibFunc::cospif);
407208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson    TLI.setUnavailable(LibFunc::sincospi_stret);
40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::sincospif_stret);
409208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson  }
410208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson
4119d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  if (T.isMacOSX() && T.getArch() == Triple::x86 &&
4129d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman      !T.isMacOSXVersionLT(10, 7)) {
4139d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
4149d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // we don't care about) have two versions; on recent OSX, the one we want
4159d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // has a $UNIX2003 suffix. The two implementations are identical except
4169d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // for the return value in some edge cases.  However, we don't want to
4179d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    // generate code that depends on the old symbols.
4189d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
4199d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman    TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
4209d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  }
4219d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman
4229fe88973be6bf0f47b36f40ada87176b9d7edd4bDuncan Sands  // iprintf and friends are only available on XCore and TCE.
4239fe88973be6bf0f47b36f40ada87176b9d7edd4bDuncan Sands  if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
4243649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne    TLI.setUnavailable(LibFunc::iprintf);
425419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne    TLI.setUnavailable(LibFunc::siprintf);
426022708f221e2a9ea1a42c07c7cd7817a8de881dcRichard Osborne    TLI.setUnavailable(LibFunc::fiprintf);
427419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne  }
428d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (T.isKnownWindowsMSVCEnvironment()) {
430d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    // Win32 does not support long double
431d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::acosl);
432d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::asinl);
433d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::atanl);
434d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::atan2l);
435d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::ceill);
436d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::copysignl);
437d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::cosl);
438d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::coshl);
439d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expl);
440d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
441d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::fabsl);
442d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::floorl);
44336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::fmaxl);
44436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::fminl);
445d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::fmodl);
446cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::frexpl);
44736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::ldexpf);
44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::ldexpl);
449d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::logl);
450cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::modfl);
451d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::powl);
452d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::sinl);
453d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::sinhl);
454d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::sqrtl);
455d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::tanl);
456d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::tanhl);
457d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
458d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    // Win32 only has C89 math
4596871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::acosh);
4606871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::acoshf);
4616871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::acoshl);
4626871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::asinh);
4636871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::asinhf);
4646871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::asinhl);
4656871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::atanh);
4666871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::atanhf);
4676871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::atanhl);
4686871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::cbrt);
4696871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::cbrtf);
4706871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::cbrtl);
471d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::exp2);
472d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::exp2f);
473d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::exp2l);
474d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expm1);
475d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expm1f);
476d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::expm1l);
477d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log2);
478d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log2f);
479d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log2l);
480d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log1p);
481d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log1pf);
482d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::log1pl);
4836871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::logb);
4846871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::logbf);
4856871d1eceba0455707de29708c36ae3c2778c160Chad Rosier    TLI.setUnavailable(LibFunc::logbl);
486d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::nearbyint);
487d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::nearbyintf);
488d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::nearbyintl);
489d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::rint);
490d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::rintf);
491d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::rintl);
492d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::round);
493d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::roundf);
494d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::roundl);
495d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::trunc);
496d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::truncf);
497d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setUnavailable(LibFunc::truncl);
498d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
499d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    // Win32 provides some C99 math with mangled names
500d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
501d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff
502d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    if (T.getArch() == Triple::x86) {
503d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      // Win32 on x86 implements single-precision math functions as macros
504d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::acosf);
505d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::asinf);
506d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::atanf);
507d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::atan2f);
508d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::ceilf);
509d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::copysignf);
510d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::cosf);
511d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::coshf);
512d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::expf);
513d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::floorf);
51436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setUnavailable(LibFunc::fminf);
51536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setUnavailable(LibFunc::fmaxf);
516d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::fmodf);
517d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::logf);
518d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::powf);
519d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::sinf);
520d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::sinhf);
521d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::sqrtf);
522d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::tanf);
523d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff      TLI.setUnavailable(LibFunc::tanhf);
524d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff    }
525939f5002027e3ccb710ac1c3050dc25471251565Meador Inge
526cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    // Win32 does *not* provide provide these functions, but they are
527cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    // generally available on POSIX-compliant systems:
528cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::access);
529cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::bcmp);
530cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::bcopy);
531cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::bzero);
532cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::chmod);
533cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::chown);
534cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::closedir);
535cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::ctermid);
536cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fdopen);
5376098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    TLI.setUnavailable(LibFunc::ffs);
538cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fileno);
539cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::flockfile);
540cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fseeko);
541cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fstat);
542cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fstatvfs);
543cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::ftello);
544cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::ftrylockfile);
545cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::funlockfile);
546cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::getc_unlocked);
547cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::getitimer);
548cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::getlogin_r);
549cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::getpwnam);
550f0f85eab0469ac93f9bb6c7d19aca2c35868d83aMichael Gottesman    TLI.setUnavailable(LibFunc::gettimeofday);
551cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::htonl);
552cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::htons);
553cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::lchown);
554cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::lstat);
555cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::memccpy);
556cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::mkdir);
557cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::ntohl);
558cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::ntohs);
559cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::open);
560cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::opendir);
561cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::pclose);
562cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::popen);
563cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::pread);
564cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::pwrite);
565cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::read);
566cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::readlink);
567cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::realpath);
568cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::rmdir);
569cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::setitimer);
570cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::stat);
571cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::statvfs);
572cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::stpcpy);
573cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::stpncpy);
574cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::strcasecmp);
575cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::strncasecmp);
576cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::times);
577cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::uname);
578cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::unlink);
579cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::unsetenv);
580cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::utime);
581cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::utimes);
582cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::write);
5836098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge
584cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    // Win32 does *not* provide provide these functions, but they are
585cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    // specified by C99:
586cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::atoll);
587cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::frexpf);
5886098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    TLI.setUnavailable(LibFunc::llabs);
58936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
59036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
59136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  switch (T.getOS()) {
59236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case Triple::MacOSX:
59336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0
59436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // and their names are __exp10 and __exp10f. exp10l is not available on
59536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // OS X or iOS.
59636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::exp10l);
59736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (T.isMacOSXVersionLT(10, 9)) {
59836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setUnavailable(LibFunc::exp10);
59936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setUnavailable(LibFunc::exp10f);
60036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    } else {
60136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
60236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
60336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
60436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
60536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case Triple::IOS:
60636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::exp10l);
60736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (T.isOSVersionLT(7, 0)) {
60836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setUnavailable(LibFunc::exp10);
60936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setUnavailable(LibFunc::exp10f);
61036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    } else {
61136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setAvailableWithName(LibFunc::exp10, "__exp10");
61236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f");
61336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
61436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
61536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case Triple::Linux:
61636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely
61736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // buggy prior to glibc version 2.18. Until this version is widely deployed
61836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // or we have a reasonable detection strategy, we cannot use exp10 reliably
61936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // on Linux.
62036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    //
62136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Fall through to disable all of them.
62236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  default:
62336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::exp10);
62436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::exp10f);
62536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TLI.setUnavailable(LibFunc::exp10l);
6266098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  }
6276098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge
6286098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and
6296098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // Linux (GLIBC):
6306098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html
6316098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c
6326098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html
6336098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  switch (T.getOS()) {
6346098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  case Triple::Darwin:
6356098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  case Triple::MacOSX:
6366098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  case Triple::IOS:
6376098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  case Triple::FreeBSD:
6386098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  case Triple::Linux:
6396098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    break;
6406098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  default:
6416098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    TLI.setUnavailable(LibFunc::ffsl);
6426098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  }
6436098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge
6446098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // ffsll is available on at least FreeBSD and Linux (GLIBC):
6456098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c
6466098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html
6476098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  switch (T.getOS()) {
6486098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  case Triple::FreeBSD:
6496098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  case Triple::Linux:
6506098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    break;
6516098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge  default:
6526098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge    TLI.setUnavailable(LibFunc::ffsll);
653d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff  }
654cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge
655cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge  // The following functions are available on at least Linux:
656441c557708b5dbe91f1799baf790ad418c23ea70Cameron Esfahani  if (!T.isOSLinux()) {
657cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::dunder_strdup);
658cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::dunder_strtok_r);
659cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
660cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
661cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::under_IO_getc);
662cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::under_IO_putc);
663cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::memalign);
664cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fopen64);
665cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fseeko64);
666cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fstat64);
667cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::fstatvfs64);
668cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::ftello64);
669cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::lstat64);
670cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::open64);
671cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::stat64);
672cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::statvfs64);
673cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    TLI.setUnavailable(LibFunc::tmpfile64);
674cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge  }
675ce99120084f549a523213064648662a704e8b789Chris Lattner}
676ce99120084f549a523213064648662a704e8b789Chris Lattner
677ce99120084f549a523213064648662a704e8b789Chris Lattner
678ce99120084f549a523213064648662a704e8b789Chris LattnerTargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
679ce99120084f549a523213064648662a704e8b789Chris Lattner  // Default to everything being available.
680ce99120084f549a523213064648662a704e8b789Chris Lattner  memset(AvailableArray, -1, sizeof(AvailableArray));
681ce99120084f549a523213064648662a704e8b789Chris Lattner
682d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  initialize(*this, Triple(), StandardNames);
683ce99120084f549a523213064648662a704e8b789Chris Lattner}
684ce99120084f549a523213064648662a704e8b789Chris Lattner
685ce99120084f549a523213064648662a704e8b789Chris LattnerTargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
686ce99120084f549a523213064648662a704e8b789Chris Lattner  // Default to everything being available.
687ce99120084f549a523213064648662a704e8b789Chris Lattner  memset(AvailableArray, -1, sizeof(AvailableArray));
688ce99120084f549a523213064648662a704e8b789Chris Lattner
689d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  initialize(*this, T, StandardNames);
690ce99120084f549a523213064648662a704e8b789Chris Lattner}
691188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner
69240f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris LattnerTargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
69340f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner  : ImmutablePass(ID) {
69440f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner  memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
6959d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman  CustomNames = TLI.CustomNames;
69640f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner}
69740f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner
698576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramernamespace {
699576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramerstruct StringComparator {
700576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  /// Compare two strings and return true if LHS is lexicographically less than
701576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  /// RHS. Requires that RHS doesn't contain any zero bytes.
702576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  bool operator()(const char *LHS, StringRef RHS) const {
703576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer    // Compare prefixes with strncmp. If prefixes match we know that LHS is
704576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer    // greater or equal to RHS as RHS can't contain any '\0'.
705576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer    return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
706576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  }
707576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer
708576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  // Provided for compatibility with MSVC's debug mode.
709576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
710576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
711dec29b61a49da09e8ed494dcc1466f160614f80dBenjamin Kramer  bool operator()(const char *LHS, const char *RHS) const {
712dec29b61a49da09e8ed494dcc1466f160614f80dBenjamin Kramer    return std::strcmp(LHS, RHS) < 0;
713dec29b61a49da09e8ed494dcc1466f160614f80dBenjamin Kramer  }
714576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer};
715576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer}
716576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer
717d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilsonbool TargetLibraryInfo::getLibFunc(StringRef funcName,
718d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson                                   LibFunc::Func &F) const {
719d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  const char **Start = &StandardNames[0];
720d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  const char **End = &StandardNames[LibFunc::NumLibFuncs];
721576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer
722576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  // Filter out empty names and names containing null bytes, those can't be in
723576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  // our table.
724576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  if (funcName.empty() || funcName.find('\0') != StringRef::npos)
725576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer    return false;
726576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer
727cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge  // Check for \01 prefix that is used to mangle __asm declarations and
728cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge  // strip it if present.
729576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  if (funcName.front() == '\01')
730cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge    funcName = funcName.substr(1);
731576f62c1ead0c099aacf2bc08552a1348d57c23fBenjamin Kramer  const char **I = std::lower_bound(Start, End, funcName, StringComparator());
732d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  if (I != End && *I == funcName) {
733d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    F = (LibFunc::Func)(I - Start);
734d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson    return true;
735d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  }
736d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson  return false;
737d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson}
73840f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner
739188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner/// disableAllFunctions - This disables all builtins, which is used for options
740188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner/// like -fno-builtin.
741188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattnervoid TargetLibraryInfo::disableAllFunctions() {
742188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  memset(AvailableArray, 0, sizeof(AvailableArray));
743188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner}
744