| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 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" | 
|  | 16 | using namespace llvm; | 
|  | 17 |  | 
|  | 18 | // Register the default implementation. | 
|  | 19 | INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo", | 
|  | 20 | "Target Library Information", false, true) | 
|  | 21 | char TargetLibraryInfo::ID = 0; | 
|  | 22 |  | 
| David Blaikie | a379b181 | 2011-12-20 02:50:00 +0000 | [diff] [blame] | 23 | void TargetLibraryInfo::anchor() { } | 
|  | 24 |  | 
| Eli Friedman | 489c0ff | 2011-11-17 01:27:36 +0000 | [diff] [blame] | 25 | const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = | 
|  | 26 | { | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 27 | "_IO_getc", | 
|  | 28 | "_IO_putc", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 29 | "_ZdaPv", | 
| Richard Smith | 70523c7 | 2013-07-21 23:11:42 +0000 | [diff] [blame] | 30 | "_ZdaPvRKSt9nothrow_t", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 31 | "_ZdlPv", | 
| Richard Smith | 70523c7 | 2013-07-21 23:11:42 +0000 | [diff] [blame] | 32 | "_ZdlPvRKSt9nothrow_t", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 33 | "_Znaj", | 
|  | 34 | "_ZnajRKSt9nothrow_t", | 
|  | 35 | "_Znam", | 
|  | 36 | "_ZnamRKSt9nothrow_t", | 
|  | 37 | "_Znwj", | 
|  | 38 | "_ZnwjRKSt9nothrow_t", | 
|  | 39 | "_Znwm", | 
|  | 40 | "_ZnwmRKSt9nothrow_t", | 
| Bob Wilson | d8d92d9 | 2013-11-03 06:48:38 +0000 | [diff] [blame] | 41 | "__cospi", | 
|  | 42 | "__cospif", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 43 | "__cxa_atexit", | 
|  | 44 | "__cxa_guard_abort", | 
|  | 45 | "__cxa_guard_acquire", | 
|  | 46 | "__cxa_guard_release", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 47 | "__isoc99_scanf", | 
|  | 48 | "__isoc99_sscanf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 49 | "__memcpy_chk", | 
| Bob Wilson | d8d92d9 | 2013-11-03 06:48:38 +0000 | [diff] [blame] | 50 | "__sincospi_stret", | 
|  | 51 | "__sincospi_stretf", | 
|  | 52 | "__sinpi", | 
|  | 53 | "__sinpif", | 
| Preston Gurd | 048f99d | 2013-05-27 15:44:35 +0000 | [diff] [blame] | 54 | "__sqrt_finite", | 
|  | 55 | "__sqrtf_finite", | 
|  | 56 | "__sqrtl_finite", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 57 | "__strdup", | 
|  | 58 | "__strndup", | 
|  | 59 | "__strtok_r", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 60 | "abs", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 61 | "access", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 62 | "acos", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 63 | "acosf", | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 64 | "acosh", | 
|  | 65 | "acoshf", | 
|  | 66 | "acoshl", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 67 | "acosl", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 68 | "asin", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 69 | "asinf", | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 70 | "asinh", | 
|  | 71 | "asinhf", | 
|  | 72 | "asinhl", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 73 | "asinl", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 74 | "atan", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 75 | "atan2", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 76 | "atan2f", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 77 | "atan2l", | 
|  | 78 | "atanf", | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 79 | "atanh", | 
|  | 80 | "atanhf", | 
|  | 81 | "atanhl", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 82 | "atanl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 83 | "atof", | 
|  | 84 | "atoi", | 
|  | 85 | "atol", | 
|  | 86 | "atoll", | 
|  | 87 | "bcmp", | 
|  | 88 | "bcopy", | 
|  | 89 | "bzero", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 90 | "calloc", | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 91 | "cbrt", | 
|  | 92 | "cbrtf", | 
|  | 93 | "cbrtl", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 94 | "ceil", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 95 | "ceilf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 96 | "ceill", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 97 | "chmod", | 
|  | 98 | "chown", | 
|  | 99 | "clearerr", | 
|  | 100 | "closedir", | 
| Owen Anderson | bb15fec | 2011-12-08 22:15:21 +0000 | [diff] [blame] | 101 | "copysign", | 
|  | 102 | "copysignf", | 
|  | 103 | "copysignl", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 104 | "cos", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 105 | "cosf", | 
|  | 106 | "cosh", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 107 | "coshf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 108 | "coshl", | 
|  | 109 | "cosl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 110 | "ctermid", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 111 | "exp", | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 112 | "exp10", | 
|  | 113 | "exp10f", | 
|  | 114 | "exp10l", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 115 | "exp2", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 116 | "exp2f", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 117 | "exp2l", | 
|  | 118 | "expf", | 
|  | 119 | "expl", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 120 | "expm1", | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 121 | "expm1f", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 122 | "expm1l", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 123 | "fabs", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 124 | "fabsf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 125 | "fabsl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 126 | "fclose", | 
|  | 127 | "fdopen", | 
|  | 128 | "feof", | 
|  | 129 | "ferror", | 
|  | 130 | "fflush", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 131 | "ffs", | 
|  | 132 | "ffsl", | 
|  | 133 | "ffsll", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 134 | "fgetc", | 
|  | 135 | "fgetpos", | 
|  | 136 | "fgets", | 
|  | 137 | "fileno", | 
| Chad Rosier | abba094 | 2011-11-30 01:51:49 +0000 | [diff] [blame] | 138 | "fiprintf", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 139 | "flockfile", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 140 | "floor", | 
|  | 141 | "floorf", | 
|  | 142 | "floorl", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 143 | "fmod", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 144 | "fmodf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 145 | "fmodl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 146 | "fopen", | 
|  | 147 | "fopen64", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 148 | "fprintf", | 
| Nuno Lopes | 342cf78 | 2012-07-24 21:00:36 +0000 | [diff] [blame] | 149 | "fputc", | 
| Chad Rosier | abba094 | 2011-11-30 01:51:49 +0000 | [diff] [blame] | 150 | "fputs", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 151 | "fread", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 152 | "free", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 153 | "frexp", | 
|  | 154 | "frexpf", | 
|  | 155 | "frexpl", | 
|  | 156 | "fscanf", | 
|  | 157 | "fseek", | 
|  | 158 | "fseeko", | 
|  | 159 | "fseeko64", | 
|  | 160 | "fsetpos", | 
|  | 161 | "fstat", | 
|  | 162 | "fstat64", | 
|  | 163 | "fstatvfs", | 
|  | 164 | "fstatvfs64", | 
|  | 165 | "ftell", | 
|  | 166 | "ftello", | 
|  | 167 | "ftello64", | 
|  | 168 | "ftrylockfile", | 
|  | 169 | "funlockfile", | 
| Chad Rosier | abba094 | 2011-11-30 01:51:49 +0000 | [diff] [blame] | 170 | "fwrite", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 171 | "getc", | 
|  | 172 | "getc_unlocked", | 
|  | 173 | "getchar", | 
|  | 174 | "getenv", | 
|  | 175 | "getitimer", | 
|  | 176 | "getlogin_r", | 
|  | 177 | "getpwnam", | 
|  | 178 | "gets", | 
| Michael Gottesman | f7459c7 | 2013-07-03 04:00:51 +0000 | [diff] [blame] | 179 | "gettimeofday", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 180 | "htonl", | 
|  | 181 | "htons", | 
| Chad Rosier | abba094 | 2011-11-30 01:51:49 +0000 | [diff] [blame] | 182 | "iprintf", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 183 | "isascii", | 
|  | 184 | "isdigit", | 
|  | 185 | "labs", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 186 | "lchown", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 187 | "llabs", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 188 | "log", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 189 | "log10", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 190 | "log10f", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 191 | "log10l", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 192 | "log1p", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 193 | "log1pf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 194 | "log1pl", | 
|  | 195 | "log2", | 
|  | 196 | "log2f", | 
|  | 197 | "log2l", | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 198 | "logb", | 
|  | 199 | "logbf", | 
|  | 200 | "logbl", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 201 | "logf", | 
|  | 202 | "logl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 203 | "lstat", | 
|  | 204 | "lstat64", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 205 | "malloc", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 206 | "memalign", | 
|  | 207 | "memccpy", | 
| Nuno Lopes | 342cf78 | 2012-07-24 21:00:36 +0000 | [diff] [blame] | 208 | "memchr", | 
|  | 209 | "memcmp", | 
| Eli Friedman | 489c0ff | 2011-11-17 01:27:36 +0000 | [diff] [blame] | 210 | "memcpy", | 
|  | 211 | "memmove", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 212 | "memrchr", | 
| Chad Rosier | abba094 | 2011-11-30 01:51:49 +0000 | [diff] [blame] | 213 | "memset", | 
| Eli Friedman | 489c0ff | 2011-11-17 01:27:36 +0000 | [diff] [blame] | 214 | "memset_pattern16", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 215 | "mkdir", | 
|  | 216 | "mktime", | 
|  | 217 | "modf", | 
|  | 218 | "modff", | 
|  | 219 | "modfl", | 
| Owen Anderson | bb15fec | 2011-12-08 22:15:21 +0000 | [diff] [blame] | 220 | "nearbyint", | 
|  | 221 | "nearbyintf", | 
|  | 222 | "nearbyintl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 223 | "ntohl", | 
|  | 224 | "ntohs", | 
|  | 225 | "open", | 
|  | 226 | "open64", | 
|  | 227 | "opendir", | 
|  | 228 | "pclose", | 
|  | 229 | "perror", | 
|  | 230 | "popen", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 231 | "posix_memalign", | 
| Chad Rosier | 738da25 | 2011-11-30 19:19:00 +0000 | [diff] [blame] | 232 | "pow", | 
|  | 233 | "powf", | 
|  | 234 | "powl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 235 | "pread", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 236 | "printf", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 237 | "putc", | 
| Nuno Lopes | 342cf78 | 2012-07-24 21:00:36 +0000 | [diff] [blame] | 238 | "putchar", | 
|  | 239 | "puts", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 240 | "pwrite", | 
|  | 241 | "qsort", | 
|  | 242 | "read", | 
|  | 243 | "readlink", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 244 | "realloc", | 
|  | 245 | "reallocf", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 246 | "realpath", | 
|  | 247 | "remove", | 
|  | 248 | "rename", | 
|  | 249 | "rewind", | 
| Owen Anderson | bb15fec | 2011-12-08 22:15:21 +0000 | [diff] [blame] | 250 | "rint", | 
|  | 251 | "rintf", | 
|  | 252 | "rintl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 253 | "rmdir", | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 254 | "round", | 
|  | 255 | "roundf", | 
|  | 256 | "roundl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 257 | "scanf", | 
|  | 258 | "setbuf", | 
|  | 259 | "setitimer", | 
|  | 260 | "setvbuf", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 261 | "sin", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 262 | "sinf", | 
| Chad Rosier | 676c093 | 2011-12-01 18:26:19 +0000 | [diff] [blame] | 263 | "sinh", | 
| Chad Rosier | 676c093 | 2011-12-01 18:26:19 +0000 | [diff] [blame] | 264 | "sinhf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 265 | "sinhl", | 
|  | 266 | "sinl", | 
| Chad Rosier | 676c093 | 2011-12-01 18:26:19 +0000 | [diff] [blame] | 267 | "siprintf", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 268 | "snprintf", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 269 | "sprintf", | 
| Chad Rosier | 82e1bd8 | 2011-11-29 23:57:10 +0000 | [diff] [blame] | 270 | "sqrt", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 271 | "sqrtf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 272 | "sqrtl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 273 | "sscanf", | 
|  | 274 | "stat", | 
|  | 275 | "stat64", | 
|  | 276 | "statvfs", | 
|  | 277 | "statvfs64", | 
| Meador Inge | 2526a42 | 2012-11-10 03:11:06 +0000 | [diff] [blame] | 278 | "stpcpy", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 279 | "stpncpy", | 
|  | 280 | "strcasecmp", | 
| Nuno Lopes | 20f5a7a | 2012-07-24 17:25:06 +0000 | [diff] [blame] | 281 | "strcat", | 
| Nuno Lopes | 342cf78 | 2012-07-24 21:00:36 +0000 | [diff] [blame] | 282 | "strchr", | 
| Meador Inge | 2526a42 | 2012-11-10 03:11:06 +0000 | [diff] [blame] | 283 | "strcmp", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 284 | "strcoll", | 
| Nuno Lopes | 20f5a7a | 2012-07-24 17:25:06 +0000 | [diff] [blame] | 285 | "strcpy", | 
| Meador Inge | 2526a42 | 2012-11-10 03:11:06 +0000 | [diff] [blame] | 286 | "strcspn", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 287 | "strdup", | 
| Nuno Lopes | 20f5a7a | 2012-07-24 17:25:06 +0000 | [diff] [blame] | 288 | "strlen", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 289 | "strncasecmp", | 
| Nuno Lopes | 20f5a7a | 2012-07-24 17:25:06 +0000 | [diff] [blame] | 290 | "strncat", | 
| Nuno Lopes | 342cf78 | 2012-07-24 21:00:36 +0000 | [diff] [blame] | 291 | "strncmp", | 
| Nuno Lopes | 20f5a7a | 2012-07-24 17:25:06 +0000 | [diff] [blame] | 292 | "strncpy", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 293 | "strndup", | 
| Nuno Lopes | 20f5a7a | 2012-07-24 17:25:06 +0000 | [diff] [blame] | 294 | "strnlen", | 
| Meador Inge | 2526a42 | 2012-11-10 03:11:06 +0000 | [diff] [blame] | 295 | "strpbrk", | 
|  | 296 | "strrchr", | 
|  | 297 | "strspn", | 
|  | 298 | "strstr", | 
|  | 299 | "strtod", | 
|  | 300 | "strtof", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 301 | "strtok", | 
|  | 302 | "strtok_r", | 
| Meador Inge | 2526a42 | 2012-11-10 03:11:06 +0000 | [diff] [blame] | 303 | "strtol", | 
|  | 304 | "strtold", | 
|  | 305 | "strtoll", | 
|  | 306 | "strtoul", | 
|  | 307 | "strtoull", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 308 | "strxfrm", | 
|  | 309 | "system", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 310 | "tan", | 
| Chad Rosier | 10fe1fe | 2011-12-01 17:54:37 +0000 | [diff] [blame] | 311 | "tanf", | 
|  | 312 | "tanh", | 
| Owen Anderson | bb15fec | 2011-12-08 22:15:21 +0000 | [diff] [blame] | 313 | "tanhf", | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 314 | "tanhl", | 
|  | 315 | "tanl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 316 | "times", | 
|  | 317 | "tmpfile", | 
|  | 318 | "tmpfile64", | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 319 | "toascii", | 
| Owen Anderson | bb15fec | 2011-12-08 22:15:21 +0000 | [diff] [blame] | 320 | "trunc", | 
|  | 321 | "truncf", | 
| Benjamin Kramer | 8bcc971 | 2012-08-29 15:32:21 +0000 | [diff] [blame] | 322 | "truncl", | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 323 | "uname", | 
|  | 324 | "ungetc", | 
|  | 325 | "unlink", | 
|  | 326 | "unsetenv", | 
|  | 327 | "utime", | 
|  | 328 | "utimes", | 
|  | 329 | "valloc", | 
|  | 330 | "vfprintf", | 
|  | 331 | "vfscanf", | 
|  | 332 | "vprintf", | 
|  | 333 | "vscanf", | 
|  | 334 | "vsnprintf", | 
|  | 335 | "vsprintf", | 
|  | 336 | "vsscanf", | 
|  | 337 | "write" | 
| Eli Friedman | 489c0ff | 2011-11-17 01:27:36 +0000 | [diff] [blame] | 338 | }; | 
|  | 339 |  | 
| Bob Wilson | d8d92d9 | 2013-11-03 06:48:38 +0000 | [diff] [blame] | 340 | static bool hasSinCosPiStret(const Triple &T) { | 
|  | 341 | // Only Darwin variants have _stret versions of combined trig functions. | 
|  | 342 | if (!T.isMacOSX() && T.getOS() != Triple::IOS) | 
|  | 343 | return false; | 
|  | 344 |  | 
|  | 345 | // The ABI is rather complicated on x86, so don't do anything special there. | 
|  | 346 | if (T.getArch() == Triple::x86) | 
|  | 347 | return false; | 
|  | 348 |  | 
|  | 349 | if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9)) | 
|  | 350 | return false; | 
|  | 351 |  | 
|  | 352 | if (T.getOS() == Triple::IOS && T.isOSVersionLT(7, 0)) | 
|  | 353 | return false; | 
|  | 354 |  | 
|  | 355 | return true; | 
|  | 356 | } | 
|  | 357 |  | 
| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 358 | /// initialize - Initialize the set of available library functions based on the | 
|  | 359 | /// specified target triple.  This should be carefully written so that a missing | 
|  | 360 | /// target triple gets a sane set of defaults. | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 361 | static void initialize(TargetLibraryInfo &TLI, const Triple &T, | 
|  | 362 | const char **StandardNames) { | 
| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 363 | initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry()); | 
|  | 364 |  | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 365 | #ifndef NDEBUG | 
|  | 366 | // Verify that the StandardNames array is in alphabetical order. | 
|  | 367 | for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) { | 
|  | 368 | if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0) | 
|  | 369 | llvm_unreachable("TargetLibraryInfo function names must be sorted"); | 
|  | 370 | } | 
|  | 371 | #endif // !NDEBUG | 
| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 372 |  | 
|  | 373 | // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later. | 
| Daniel Dunbar | cd01ed5 | 2011-04-20 00:14:25 +0000 | [diff] [blame] | 374 | if (T.isMacOSX()) { | 
|  | 375 | if (T.isMacOSXVersionLT(10, 5)) | 
| Daniel Dunbar | 9483bb6 | 2011-04-19 20:44:08 +0000 | [diff] [blame] | 376 | TLI.setUnavailable(LibFunc::memset_pattern16); | 
| Cameron Esfahani | 943908b | 2013-08-29 20:23:14 +0000 | [diff] [blame] | 377 | } else if (T.isiOS()) { | 
| Daniel Dunbar | 9483bb6 | 2011-04-19 20:44:08 +0000 | [diff] [blame] | 378 | if (T.isOSVersionLT(3, 0)) | 
|  | 379 | TLI.setUnavailable(LibFunc::memset_pattern16); | 
|  | 380 | } else { | 
| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 381 | TLI.setUnavailable(LibFunc::memset_pattern16); | 
| Daniel Dunbar | 9483bb6 | 2011-04-19 20:44:08 +0000 | [diff] [blame] | 382 | } | 
| Richard Osborne | 815de53 | 2011-03-03 13:17:51 +0000 | [diff] [blame] | 383 |  | 
| Bob Wilson | d8d92d9 | 2013-11-03 06:48:38 +0000 | [diff] [blame] | 384 | if (!hasSinCosPiStret(T)) { | 
|  | 385 | TLI.setUnavailable(LibFunc::sinpi); | 
|  | 386 | TLI.setUnavailable(LibFunc::sinpif); | 
|  | 387 | TLI.setUnavailable(LibFunc::cospi); | 
|  | 388 | TLI.setUnavailable(LibFunc::cospif); | 
|  | 389 | TLI.setUnavailable(LibFunc::sincospi_stret); | 
|  | 390 | TLI.setUnavailable(LibFunc::sincospi_stretf); | 
|  | 391 | } | 
|  | 392 |  | 
| Eli Friedman | 489c0ff | 2011-11-17 01:27:36 +0000 | [diff] [blame] | 393 | if (T.isMacOSX() && T.getArch() == Triple::x86 && | 
|  | 394 | !T.isMacOSXVersionLT(10, 7)) { | 
|  | 395 | // x86-32 OSX has a scheme where fwrite and fputs (and some other functions | 
|  | 396 | // we don't care about) have two versions; on recent OSX, the one we want | 
|  | 397 | // has a $UNIX2003 suffix. The two implementations are identical except | 
|  | 398 | // for the return value in some edge cases.  However, we don't want to | 
|  | 399 | // generate code that depends on the old symbols. | 
|  | 400 | TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003"); | 
|  | 401 | TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003"); | 
|  | 402 | } | 
|  | 403 |  | 
| Duncan Sands | eeb50c8 | 2011-06-09 11:11:45 +0000 | [diff] [blame] | 404 | // iprintf and friends are only available on XCore and TCE. | 
|  | 405 | if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) { | 
| Richard Osborne | 815de53 | 2011-03-03 13:17:51 +0000 | [diff] [blame] | 406 | TLI.setUnavailable(LibFunc::iprintf); | 
| Richard Osborne | 2dfb888 | 2011-03-03 14:09:28 +0000 | [diff] [blame] | 407 | TLI.setUnavailable(LibFunc::siprintf); | 
| Richard Osborne | af52c52 | 2011-03-03 14:20:22 +0000 | [diff] [blame] | 408 | TLI.setUnavailable(LibFunc::fiprintf); | 
| Richard Osborne | 2dfb888 | 2011-03-03 14:09:28 +0000 | [diff] [blame] | 409 | } | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 410 |  | 
|  | 411 | if (T.getOS() == Triple::Win32) { | 
|  | 412 | // Win32 does not support long double | 
|  | 413 | TLI.setUnavailable(LibFunc::acosl); | 
|  | 414 | TLI.setUnavailable(LibFunc::asinl); | 
|  | 415 | TLI.setUnavailable(LibFunc::atanl); | 
|  | 416 | TLI.setUnavailable(LibFunc::atan2l); | 
|  | 417 | TLI.setUnavailable(LibFunc::ceill); | 
|  | 418 | TLI.setUnavailable(LibFunc::copysignl); | 
|  | 419 | TLI.setUnavailable(LibFunc::cosl); | 
|  | 420 | TLI.setUnavailable(LibFunc::coshl); | 
|  | 421 | TLI.setUnavailable(LibFunc::expl); | 
|  | 422 | TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf | 
|  | 423 | TLI.setUnavailable(LibFunc::fabsl); | 
|  | 424 | TLI.setUnavailable(LibFunc::floorl); | 
|  | 425 | TLI.setUnavailable(LibFunc::fmodl); | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 426 | TLI.setUnavailable(LibFunc::frexpl); | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 427 | TLI.setUnavailable(LibFunc::logl); | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 428 | TLI.setUnavailable(LibFunc::modfl); | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 429 | TLI.setUnavailable(LibFunc::powl); | 
|  | 430 | TLI.setUnavailable(LibFunc::sinl); | 
|  | 431 | TLI.setUnavailable(LibFunc::sinhl); | 
|  | 432 | TLI.setUnavailable(LibFunc::sqrtl); | 
|  | 433 | TLI.setUnavailable(LibFunc::tanl); | 
|  | 434 | TLI.setUnavailable(LibFunc::tanhl); | 
|  | 435 |  | 
|  | 436 | // Win32 only has C89 math | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 437 | TLI.setUnavailable(LibFunc::acosh); | 
|  | 438 | TLI.setUnavailable(LibFunc::acoshf); | 
|  | 439 | TLI.setUnavailable(LibFunc::acoshl); | 
|  | 440 | TLI.setUnavailable(LibFunc::asinh); | 
|  | 441 | TLI.setUnavailable(LibFunc::asinhf); | 
|  | 442 | TLI.setUnavailable(LibFunc::asinhl); | 
|  | 443 | TLI.setUnavailable(LibFunc::atanh); | 
|  | 444 | TLI.setUnavailable(LibFunc::atanhf); | 
|  | 445 | TLI.setUnavailable(LibFunc::atanhl); | 
|  | 446 | TLI.setUnavailable(LibFunc::cbrt); | 
|  | 447 | TLI.setUnavailable(LibFunc::cbrtf); | 
|  | 448 | TLI.setUnavailable(LibFunc::cbrtl); | 
|  | 449 | TLI.setUnavailable(LibFunc::exp10); | 
|  | 450 | TLI.setUnavailable(LibFunc::exp10f); | 
|  | 451 | TLI.setUnavailable(LibFunc::exp10l); | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 452 | TLI.setUnavailable(LibFunc::exp2); | 
|  | 453 | TLI.setUnavailable(LibFunc::exp2f); | 
|  | 454 | TLI.setUnavailable(LibFunc::exp2l); | 
|  | 455 | TLI.setUnavailable(LibFunc::expm1); | 
|  | 456 | TLI.setUnavailable(LibFunc::expm1f); | 
|  | 457 | TLI.setUnavailable(LibFunc::expm1l); | 
|  | 458 | TLI.setUnavailable(LibFunc::log2); | 
|  | 459 | TLI.setUnavailable(LibFunc::log2f); | 
|  | 460 | TLI.setUnavailable(LibFunc::log2l); | 
|  | 461 | TLI.setUnavailable(LibFunc::log1p); | 
|  | 462 | TLI.setUnavailable(LibFunc::log1pf); | 
|  | 463 | TLI.setUnavailable(LibFunc::log1pl); | 
| Chad Rosier | 7fb0cd2 | 2012-08-21 23:28:56 +0000 | [diff] [blame] | 464 | TLI.setUnavailable(LibFunc::logb); | 
|  | 465 | TLI.setUnavailable(LibFunc::logbf); | 
|  | 466 | TLI.setUnavailable(LibFunc::logbl); | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 467 | TLI.setUnavailable(LibFunc::nearbyint); | 
|  | 468 | TLI.setUnavailable(LibFunc::nearbyintf); | 
|  | 469 | TLI.setUnavailable(LibFunc::nearbyintl); | 
|  | 470 | TLI.setUnavailable(LibFunc::rint); | 
|  | 471 | TLI.setUnavailable(LibFunc::rintf); | 
|  | 472 | TLI.setUnavailable(LibFunc::rintl); | 
|  | 473 | TLI.setUnavailable(LibFunc::round); | 
|  | 474 | TLI.setUnavailable(LibFunc::roundf); | 
|  | 475 | TLI.setUnavailable(LibFunc::roundl); | 
|  | 476 | TLI.setUnavailable(LibFunc::trunc); | 
|  | 477 | TLI.setUnavailable(LibFunc::truncf); | 
|  | 478 | TLI.setUnavailable(LibFunc::truncl); | 
|  | 479 |  | 
|  | 480 | // Win32 provides some C99 math with mangled names | 
|  | 481 | TLI.setAvailableWithName(LibFunc::copysign, "_copysign"); | 
|  | 482 |  | 
|  | 483 | if (T.getArch() == Triple::x86) { | 
|  | 484 | // Win32 on x86 implements single-precision math functions as macros | 
|  | 485 | TLI.setUnavailable(LibFunc::acosf); | 
|  | 486 | TLI.setUnavailable(LibFunc::asinf); | 
|  | 487 | TLI.setUnavailable(LibFunc::atanf); | 
|  | 488 | TLI.setUnavailable(LibFunc::atan2f); | 
|  | 489 | TLI.setUnavailable(LibFunc::ceilf); | 
|  | 490 | TLI.setUnavailable(LibFunc::copysignf); | 
|  | 491 | TLI.setUnavailable(LibFunc::cosf); | 
|  | 492 | TLI.setUnavailable(LibFunc::coshf); | 
|  | 493 | TLI.setUnavailable(LibFunc::expf); | 
|  | 494 | TLI.setUnavailable(LibFunc::floorf); | 
|  | 495 | TLI.setUnavailable(LibFunc::fmodf); | 
|  | 496 | TLI.setUnavailable(LibFunc::logf); | 
|  | 497 | TLI.setUnavailable(LibFunc::powf); | 
|  | 498 | TLI.setUnavailable(LibFunc::sinf); | 
|  | 499 | TLI.setUnavailable(LibFunc::sinhf); | 
|  | 500 | TLI.setUnavailable(LibFunc::sqrtf); | 
|  | 501 | TLI.setUnavailable(LibFunc::tanf); | 
|  | 502 | TLI.setUnavailable(LibFunc::tanhf); | 
|  | 503 | } | 
| Meador Inge | 2526a42 | 2012-11-10 03:11:06 +0000 | [diff] [blame] | 504 |  | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 505 | // Win32 does *not* provide provide these functions, but they are | 
|  | 506 | // generally available on POSIX-compliant systems: | 
|  | 507 | TLI.setUnavailable(LibFunc::access); | 
|  | 508 | TLI.setUnavailable(LibFunc::bcmp); | 
|  | 509 | TLI.setUnavailable(LibFunc::bcopy); | 
|  | 510 | TLI.setUnavailable(LibFunc::bzero); | 
|  | 511 | TLI.setUnavailable(LibFunc::chmod); | 
|  | 512 | TLI.setUnavailable(LibFunc::chown); | 
|  | 513 | TLI.setUnavailable(LibFunc::closedir); | 
|  | 514 | TLI.setUnavailable(LibFunc::ctermid); | 
|  | 515 | TLI.setUnavailable(LibFunc::fdopen); | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 516 | TLI.setUnavailable(LibFunc::ffs); | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 517 | TLI.setUnavailable(LibFunc::fileno); | 
|  | 518 | TLI.setUnavailable(LibFunc::flockfile); | 
|  | 519 | TLI.setUnavailable(LibFunc::fseeko); | 
|  | 520 | TLI.setUnavailable(LibFunc::fstat); | 
|  | 521 | TLI.setUnavailable(LibFunc::fstatvfs); | 
|  | 522 | TLI.setUnavailable(LibFunc::ftello); | 
|  | 523 | TLI.setUnavailable(LibFunc::ftrylockfile); | 
|  | 524 | TLI.setUnavailable(LibFunc::funlockfile); | 
|  | 525 | TLI.setUnavailable(LibFunc::getc_unlocked); | 
|  | 526 | TLI.setUnavailable(LibFunc::getitimer); | 
|  | 527 | TLI.setUnavailable(LibFunc::getlogin_r); | 
|  | 528 | TLI.setUnavailable(LibFunc::getpwnam); | 
| Michael Gottesman | f7459c7 | 2013-07-03 04:00:51 +0000 | [diff] [blame] | 529 | TLI.setUnavailable(LibFunc::gettimeofday); | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 530 | TLI.setUnavailable(LibFunc::htonl); | 
|  | 531 | TLI.setUnavailable(LibFunc::htons); | 
|  | 532 | TLI.setUnavailable(LibFunc::lchown); | 
|  | 533 | TLI.setUnavailable(LibFunc::lstat); | 
|  | 534 | TLI.setUnavailable(LibFunc::memccpy); | 
|  | 535 | TLI.setUnavailable(LibFunc::mkdir); | 
|  | 536 | TLI.setUnavailable(LibFunc::ntohl); | 
|  | 537 | TLI.setUnavailable(LibFunc::ntohs); | 
|  | 538 | TLI.setUnavailable(LibFunc::open); | 
|  | 539 | TLI.setUnavailable(LibFunc::opendir); | 
|  | 540 | TLI.setUnavailable(LibFunc::pclose); | 
|  | 541 | TLI.setUnavailable(LibFunc::popen); | 
|  | 542 | TLI.setUnavailable(LibFunc::pread); | 
|  | 543 | TLI.setUnavailable(LibFunc::pwrite); | 
|  | 544 | TLI.setUnavailable(LibFunc::read); | 
|  | 545 | TLI.setUnavailable(LibFunc::readlink); | 
|  | 546 | TLI.setUnavailable(LibFunc::realpath); | 
|  | 547 | TLI.setUnavailable(LibFunc::rmdir); | 
|  | 548 | TLI.setUnavailable(LibFunc::setitimer); | 
|  | 549 | TLI.setUnavailable(LibFunc::stat); | 
|  | 550 | TLI.setUnavailable(LibFunc::statvfs); | 
|  | 551 | TLI.setUnavailable(LibFunc::stpcpy); | 
|  | 552 | TLI.setUnavailable(LibFunc::stpncpy); | 
|  | 553 | TLI.setUnavailable(LibFunc::strcasecmp); | 
|  | 554 | TLI.setUnavailable(LibFunc::strncasecmp); | 
|  | 555 | TLI.setUnavailable(LibFunc::times); | 
|  | 556 | TLI.setUnavailable(LibFunc::uname); | 
|  | 557 | TLI.setUnavailable(LibFunc::unlink); | 
|  | 558 | TLI.setUnavailable(LibFunc::unsetenv); | 
|  | 559 | TLI.setUnavailable(LibFunc::utime); | 
|  | 560 | TLI.setUnavailable(LibFunc::utimes); | 
|  | 561 | TLI.setUnavailable(LibFunc::write); | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 562 |  | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 563 | // Win32 does *not* provide provide these functions, but they are | 
|  | 564 | // specified by C99: | 
|  | 565 | TLI.setUnavailable(LibFunc::atoll); | 
|  | 566 | TLI.setUnavailable(LibFunc::frexpf); | 
| Meador Inge | 780a186 | 2012-11-22 15:36:42 +0000 | [diff] [blame] | 567 | TLI.setUnavailable(LibFunc::llabs); | 
|  | 568 | } | 
|  | 569 |  | 
|  | 570 | // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and | 
|  | 571 | // Linux (GLIBC): | 
|  | 572 | // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html | 
|  | 573 | // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsl.c | 
|  | 574 | // http://www.gnu.org/software/gnulib/manual/html_node/ffsl.html | 
|  | 575 | switch (T.getOS()) { | 
|  | 576 | case Triple::Darwin: | 
|  | 577 | case Triple::MacOSX: | 
|  | 578 | case Triple::IOS: | 
|  | 579 | case Triple::FreeBSD: | 
|  | 580 | case Triple::Linux: | 
|  | 581 | break; | 
|  | 582 | default: | 
|  | 583 | TLI.setUnavailable(LibFunc::ffsl); | 
|  | 584 | } | 
|  | 585 |  | 
|  | 586 | // ffsll is available on at least FreeBSD and Linux (GLIBC): | 
|  | 587 | // http://svn.freebsd.org/base/user/eri/pf45/head/lib/libc/string/ffsll.c | 
|  | 588 | // http://www.gnu.org/software/gnulib/manual/html_node/ffsll.html | 
|  | 589 | switch (T.getOS()) { | 
|  | 590 | case Triple::FreeBSD: | 
|  | 591 | case Triple::Linux: | 
|  | 592 | break; | 
|  | 593 | default: | 
|  | 594 | TLI.setUnavailable(LibFunc::ffsll); | 
| Joe Groff | a81bcbb | 2012-04-17 23:05:54 +0000 | [diff] [blame] | 595 | } | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 596 |  | 
|  | 597 | // The following functions are available on at least Linux: | 
| Cameron Esfahani | 943908b | 2013-08-29 20:23:14 +0000 | [diff] [blame] | 598 | if (!T.isOSLinux()) { | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 599 | TLI.setUnavailable(LibFunc::dunder_strdup); | 
|  | 600 | TLI.setUnavailable(LibFunc::dunder_strtok_r); | 
|  | 601 | TLI.setUnavailable(LibFunc::dunder_isoc99_scanf); | 
|  | 602 | TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf); | 
|  | 603 | TLI.setUnavailable(LibFunc::under_IO_getc); | 
|  | 604 | TLI.setUnavailable(LibFunc::under_IO_putc); | 
|  | 605 | TLI.setUnavailable(LibFunc::memalign); | 
|  | 606 | TLI.setUnavailable(LibFunc::fopen64); | 
|  | 607 | TLI.setUnavailable(LibFunc::fseeko64); | 
|  | 608 | TLI.setUnavailable(LibFunc::fstat64); | 
|  | 609 | TLI.setUnavailable(LibFunc::fstatvfs64); | 
|  | 610 | TLI.setUnavailable(LibFunc::ftello64); | 
|  | 611 | TLI.setUnavailable(LibFunc::lstat64); | 
|  | 612 | TLI.setUnavailable(LibFunc::open64); | 
|  | 613 | TLI.setUnavailable(LibFunc::stat64); | 
|  | 614 | TLI.setUnavailable(LibFunc::statvfs64); | 
|  | 615 | TLI.setUnavailable(LibFunc::tmpfile64); | 
|  | 616 | } | 
| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 617 | } | 
|  | 618 |  | 
|  | 619 |  | 
|  | 620 | TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) { | 
|  | 621 | // Default to everything being available. | 
|  | 622 | memset(AvailableArray, -1, sizeof(AvailableArray)); | 
|  | 623 |  | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 624 | initialize(*this, Triple(), StandardNames); | 
| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 625 | } | 
|  | 626 |  | 
|  | 627 | TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) { | 
|  | 628 | // Default to everything being available. | 
|  | 629 | memset(AvailableArray, -1, sizeof(AvailableArray)); | 
|  | 630 |  | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 631 | initialize(*this, T, StandardNames); | 
| Chris Lattner | 0e125bb | 2011-02-18 21:50:34 +0000 | [diff] [blame] | 632 | } | 
| Chris Lattner | 1341df9 | 2011-02-18 22:34:03 +0000 | [diff] [blame] | 633 |  | 
| Chris Lattner | 4c0d9e2 | 2011-05-21 20:09:13 +0000 | [diff] [blame] | 634 | TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI) | 
|  | 635 | : ImmutablePass(ID) { | 
|  | 636 | memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray)); | 
| Eli Friedman | 489c0ff | 2011-11-17 01:27:36 +0000 | [diff] [blame] | 637 | CustomNames = TLI.CustomNames; | 
| Chris Lattner | 4c0d9e2 | 2011-05-21 20:09:13 +0000 | [diff] [blame] | 638 | } | 
|  | 639 |  | 
| Benjamin Kramer | 160f72d | 2013-03-09 13:48:23 +0000 | [diff] [blame] | 640 | namespace { | 
|  | 641 | struct StringComparator { | 
|  | 642 | /// Compare two strings and return true if LHS is lexicographically less than | 
|  | 643 | /// RHS. Requires that RHS doesn't contain any zero bytes. | 
|  | 644 | bool operator()(const char *LHS, StringRef RHS) const { | 
|  | 645 | // Compare prefixes with strncmp. If prefixes match we know that LHS is | 
|  | 646 | // greater or equal to RHS as RHS can't contain any '\0'. | 
|  | 647 | return std::strncmp(LHS, RHS.data(), RHS.size()) < 0; | 
|  | 648 | } | 
|  | 649 |  | 
|  | 650 | // Provided for compatibility with MSVC's debug mode. | 
|  | 651 | bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; } | 
|  | 652 | bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; } | 
| Benjamin Kramer | dfbcba5 | 2013-03-13 13:50:47 +0000 | [diff] [blame] | 653 | bool operator()(const char *LHS, const char *RHS) const { | 
|  | 654 | return std::strcmp(LHS, RHS) < 0; | 
|  | 655 | } | 
| Benjamin Kramer | 160f72d | 2013-03-09 13:48:23 +0000 | [diff] [blame] | 656 | }; | 
|  | 657 | } | 
|  | 658 |  | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 659 | bool TargetLibraryInfo::getLibFunc(StringRef funcName, | 
|  | 660 | LibFunc::Func &F) const { | 
|  | 661 | const char **Start = &StandardNames[0]; | 
|  | 662 | const char **End = &StandardNames[LibFunc::NumLibFuncs]; | 
| Benjamin Kramer | 160f72d | 2013-03-09 13:48:23 +0000 | [diff] [blame] | 663 |  | 
|  | 664 | // Filter out empty names and names containing null bytes, those can't be in | 
|  | 665 | // our table. | 
|  | 666 | if (funcName.empty() || funcName.find('\0') != StringRef::npos) | 
|  | 667 | return false; | 
|  | 668 |  | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 669 | // Check for \01 prefix that is used to mangle __asm declarations and | 
|  | 670 | // strip it if present. | 
| Benjamin Kramer | 160f72d | 2013-03-09 13:48:23 +0000 | [diff] [blame] | 671 | if (funcName.front() == '\01') | 
| Meador Inge | b904e6e | 2013-03-05 21:47:40 +0000 | [diff] [blame] | 672 | funcName = funcName.substr(1); | 
| Benjamin Kramer | 160f72d | 2013-03-09 13:48:23 +0000 | [diff] [blame] | 673 | const char **I = std::lower_bound(Start, End, funcName, StringComparator()); | 
| Bob Wilson | c740e3f | 2012-08-03 04:06:22 +0000 | [diff] [blame] | 674 | if (I != End && *I == funcName) { | 
|  | 675 | F = (LibFunc::Func)(I - Start); | 
|  | 676 | return true; | 
|  | 677 | } | 
|  | 678 | return false; | 
|  | 679 | } | 
| Chris Lattner | 4c0d9e2 | 2011-05-21 20:09:13 +0000 | [diff] [blame] | 680 |  | 
| Chris Lattner | 1341df9 | 2011-02-18 22:34:03 +0000 | [diff] [blame] | 681 | /// disableAllFunctions - This disables all builtins, which is used for options | 
|  | 682 | /// like -fno-builtin. | 
|  | 683 | void TargetLibraryInfo::disableAllFunctions() { | 
|  | 684 | memset(AvailableArray, 0, sizeof(AvailableArray)); | 
|  | 685 | } |