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 "_ZdaPvRKSt9nothrow_t", 31 "_ZdlPv", 32 "_ZdlPvRKSt9nothrow_t", 33 "_Znaj", 34 "_ZnajRKSt9nothrow_t", 35 "_Znam", 36 "_ZnamRKSt9nothrow_t", 37 "_Znwj", 38 "_ZnwjRKSt9nothrow_t", 39 "_Znwm", 40 "_ZnwmRKSt9nothrow_t", 41 "__cospi", 42 "__cospif", 43 "__cxa_atexit", 44 "__cxa_guard_abort", 45 "__cxa_guard_acquire", 46 "__cxa_guard_release", 47 "__isoc99_scanf", 48 "__isoc99_sscanf", 49 "__memcpy_chk", 50 "__sincospi_stret", 51 "__sincospi_stretf", 52 "__sinpi", 53 "__sinpif", 54 "__sqrt_finite", 55 "__sqrtf_finite", 56 "__sqrtl_finite", 57 "__strdup", 58 "__strndup", 59 "__strtok_r", 60 "abs", 61 "access", 62 "acos", 63 "acosf", 64 "acosh", 65 "acoshf", 66 "acoshl", 67 "acosl", 68 "asin", 69 "asinf", 70 "asinh", 71 "asinhf", 72 "asinhl", 73 "asinl", 74 "atan", 75 "atan2", 76 "atan2f", 77 "atan2l", 78 "atanf", 79 "atanh", 80 "atanhf", 81 "atanhl", 82 "atanl", 83 "atof", 84 "atoi", 85 "atol", 86 "atoll", 87 "bcmp", 88 "bcopy", 89 "bzero", 90 "calloc", 91 "cbrt", 92 "cbrtf", 93 "cbrtl", 94 "ceil", 95 "ceilf", 96 "ceill", 97 "chmod", 98 "chown", 99 "clearerr", 100 "closedir", 101 "copysign", 102 "copysignf", 103 "copysignl", 104 "cos", 105 "cosf", 106 "cosh", 107 "coshf", 108 "coshl", 109 "cosl", 110 "ctermid", 111 "exp", 112 "exp10", 113 "exp10f", 114 "exp10l", 115 "exp2", 116 "exp2f", 117 "exp2l", 118 "expf", 119 "expl", 120 "expm1", 121 "expm1f", 122 "expm1l", 123 "fabs", 124 "fabsf", 125 "fabsl", 126 "fclose", 127 "fdopen", 128 "feof", 129 "ferror", 130 "fflush", 131 "ffs", 132 "ffsl", 133 "ffsll", 134 "fgetc", 135 "fgetpos", 136 "fgets", 137 "fileno", 138 "fiprintf", 139 "flockfile", 140 "floor", 141 "floorf", 142 "floorl", 143 "fmod", 144 "fmodf", 145 "fmodl", 146 "fopen", 147 "fopen64", 148 "fprintf", 149 "fputc", 150 "fputs", 151 "fread", 152 "free", 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", 170 "fwrite", 171 "getc", 172 "getc_unlocked", 173 "getchar", 174 "getenv", 175 "getitimer", 176 "getlogin_r", 177 "getpwnam", 178 "gets", 179 "gettimeofday", 180 "htonl", 181 "htons", 182 "iprintf", 183 "isascii", 184 "isdigit", 185 "labs", 186 "lchown", 187 "llabs", 188 "log", 189 "log10", 190 "log10f", 191 "log10l", 192 "log1p", 193 "log1pf", 194 "log1pl", 195 "log2", 196 "log2f", 197 "log2l", 198 "logb", 199 "logbf", 200 "logbl", 201 "logf", 202 "logl", 203 "lstat", 204 "lstat64", 205 "malloc", 206 "memalign", 207 "memccpy", 208 "memchr", 209 "memcmp", 210 "memcpy", 211 "memmove", 212 "memrchr", 213 "memset", 214 "memset_pattern16", 215 "mkdir", 216 "mktime", 217 "modf", 218 "modff", 219 "modfl", 220 "nearbyint", 221 "nearbyintf", 222 "nearbyintl", 223 "ntohl", 224 "ntohs", 225 "open", 226 "open64", 227 "opendir", 228 "pclose", 229 "perror", 230 "popen", 231 "posix_memalign", 232 "pow", 233 "powf", 234 "powl", 235 "pread", 236 "printf", 237 "putc", 238 "putchar", 239 "puts", 240 "pwrite", 241 "qsort", 242 "read", 243 "readlink", 244 "realloc", 245 "reallocf", 246 "realpath", 247 "remove", 248 "rename", 249 "rewind", 250 "rint", 251 "rintf", 252 "rintl", 253 "rmdir", 254 "round", 255 "roundf", 256 "roundl", 257 "scanf", 258 "setbuf", 259 "setitimer", 260 "setvbuf", 261 "sin", 262 "sinf", 263 "sinh", 264 "sinhf", 265 "sinhl", 266 "sinl", 267 "siprintf", 268 "snprintf", 269 "sprintf", 270 "sqrt", 271 "sqrtf", 272 "sqrtl", 273 "sscanf", 274 "stat", 275 "stat64", 276 "statvfs", 277 "statvfs64", 278 "stpcpy", 279 "stpncpy", 280 "strcasecmp", 281 "strcat", 282 "strchr", 283 "strcmp", 284 "strcoll", 285 "strcpy", 286 "strcspn", 287 "strdup", 288 "strlen", 289 "strncasecmp", 290 "strncat", 291 "strncmp", 292 "strncpy", 293 "strndup", 294 "strnlen", 295 "strpbrk", 296 "strrchr", 297 "strspn", 298 "strstr", 299 "strtod", 300 "strtof", 301 "strtok", 302 "strtok_r", 303 "strtol", 304 "strtold", 305 "strtoll", 306 "strtoul", 307 "strtoull", 308 "strxfrm", 309 "system", 310 "tan", 311 "tanf", 312 "tanh", 313 "tanhf", 314 "tanhl", 315 "tanl", 316 "times", 317 "tmpfile", 318 "tmpfile64", 319 "toascii", 320 "trunc", 321 "truncf", 322 "truncl", 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" 338 }; 339 340static 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 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. 361static void initialize(TargetLibraryInfo &TLI, const Triple &T, 362 const char **StandardNames) { 363 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry()); 364 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 372 373 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later. 374 if (T.isMacOSX()) { 375 if (T.isMacOSXVersionLT(10, 5)) 376 TLI.setUnavailable(LibFunc::memset_pattern16); 377 } else if (T.isiOS()) { 378 if (T.isOSVersionLT(3, 0)) 379 TLI.setUnavailable(LibFunc::memset_pattern16); 380 } else { 381 TLI.setUnavailable(LibFunc::memset_pattern16); 382 } 383 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 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 404 // iprintf and friends are only available on XCore and TCE. 405 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) { 406 TLI.setUnavailable(LibFunc::iprintf); 407 TLI.setUnavailable(LibFunc::siprintf); 408 TLI.setUnavailable(LibFunc::fiprintf); 409 } 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); 426 TLI.setUnavailable(LibFunc::frexpl); 427 TLI.setUnavailable(LibFunc::logl); 428 TLI.setUnavailable(LibFunc::modfl); 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 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); 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); 464 TLI.setUnavailable(LibFunc::logb); 465 TLI.setUnavailable(LibFunc::logbf); 466 TLI.setUnavailable(LibFunc::logbl); 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 } 504 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); 516 TLI.setUnavailable(LibFunc::ffs); 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); 529 TLI.setUnavailable(LibFunc::gettimeofday); 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); 562 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); 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); 595 } 596 597 // The following functions are available on at least Linux: 598 if (!T.isOSLinux()) { 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 } 617} 618 619 620TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) { 621 // Default to everything being available. 622 memset(AvailableArray, -1, sizeof(AvailableArray)); 623 624 initialize(*this, Triple(), StandardNames); 625} 626 627TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) { 628 // Default to everything being available. 629 memset(AvailableArray, -1, sizeof(AvailableArray)); 630 631 initialize(*this, T, StandardNames); 632} 633 634TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI) 635 : ImmutablePass(ID) { 636 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray)); 637 CustomNames = TLI.CustomNames; 638} 639 640namespace { 641struct 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; } 653 bool operator()(const char *LHS, const char *RHS) const { 654 return std::strcmp(LHS, RHS) < 0; 655 } 656}; 657} 658 659bool TargetLibraryInfo::getLibFunc(StringRef funcName, 660 LibFunc::Func &F) const { 661 const char **Start = &StandardNames[0]; 662 const char **End = &StandardNames[LibFunc::NumLibFuncs]; 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 669 // Check for \01 prefix that is used to mangle __asm declarations and 670 // strip it if present. 671 if (funcName.front() == '\01') 672 funcName = funcName.substr(1); 673 const char **I = std::lower_bound(Start, End, funcName, StringComparator()); 674 if (I != End && *I == funcName) { 675 F = (LibFunc::Func)(I - Start); 676 return true; 677 } 678 return false; 679} 680 681/// disableAllFunctions - This disables all builtins, which is used for options 682/// like -fno-builtin. 683void TargetLibraryInfo::disableAllFunctions() { 684 memset(AvailableArray, 0, sizeof(AvailableArray)); 685} 686