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