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