PageRenderTime 64ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 2ms

/rts/Linker.c

https://github.com/dorchard/ghc
C | 6556 lines | 5063 code | 687 blank | 806 comment | 964 complexity | e8907cc17e82ad8e0a73e6a5b6e91f69 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. /* -----------------------------------------------------------------------------
  2. *
  3. * (c) The GHC Team, 2000-2012
  4. *
  5. * RTS Object Linker
  6. *
  7. * ---------------------------------------------------------------------------*/
  8. #if 0
  9. #include "PosixSource.h"
  10. #endif
  11. /* Linux needs _GNU_SOURCE to get RTLD_DEFAULT from <dlfcn.h> and
  12. MREMAP_MAYMOVE from <sys/mman.h>.
  13. */
  14. #if defined(__linux__) || defined(__GLIBC__)
  15. #define _GNU_SOURCE 1
  16. #endif
  17. #include "Rts.h"
  18. #include "HsFFI.h"
  19. #include "sm/Storage.h"
  20. #include "Stats.h"
  21. #include "Hash.h"
  22. #include "LinkerInternals.h"
  23. #include "RtsUtils.h"
  24. #include "Trace.h"
  25. #include "StgPrimFloat.h" // for __int_encodeFloat etc.
  26. #include "Stable.h"
  27. #include "Proftimer.h"
  28. #if !defined(mingw32_HOST_OS)
  29. #include "posix/Signals.h"
  30. #endif
  31. // get protos for is*()
  32. #include <ctype.h>
  33. #ifdef HAVE_SYS_TYPES_H
  34. #include <sys/types.h>
  35. #endif
  36. #include <inttypes.h>
  37. #include <stdlib.h>
  38. #include <string.h>
  39. #include <stdio.h>
  40. #include <assert.h>
  41. #ifdef HAVE_SYS_STAT_H
  42. #include <sys/stat.h>
  43. #endif
  44. #if defined(HAVE_DLFCN_H)
  45. #include <dlfcn.h>
  46. #endif
  47. #if defined(cygwin32_HOST_OS)
  48. #ifdef HAVE_DIRENT_H
  49. #include <dirent.h>
  50. #endif
  51. #ifdef HAVE_SYS_TIME_H
  52. #include <sys/time.h>
  53. #endif
  54. #include <regex.h>
  55. #include <sys/fcntl.h>
  56. #include <sys/termios.h>
  57. #include <sys/utime.h>
  58. #include <sys/utsname.h>
  59. #include <sys/wait.h>
  60. #endif
  61. #if (defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS)) \
  62. || (!defined(powerpc_HOST_ARCH) && \
  63. ( defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || \
  64. defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS ) || \
  65. defined(openbsd_HOST_OS ) || defined(darwin_HOST_OS ) || \
  66. defined(kfreebsdgnu_HOST_OS) || defined(gnu_HOST_OS)))
  67. /* Don't use mmap on powerpc_HOST_ARCH as mmap doesn't support
  68. * reallocating but we need to allocate jump islands just after each
  69. * object images. Otherwise relative branches to jump islands can fail
  70. * due to 24-bits displacement overflow.
  71. */
  72. #define USE_MMAP
  73. #include <fcntl.h>
  74. #include <sys/mman.h>
  75. #ifdef HAVE_UNISTD_H
  76. #include <unistd.h>
  77. #endif
  78. #endif
  79. /* PowerPC has relative branch instructions with only 24 bit displacements
  80. * and therefore needs jump islands contiguous with each object code module.
  81. */
  82. #if (defined(USE_MMAP) && defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS))
  83. #define USE_CONTIGUOUS_MMAP 1
  84. #else
  85. #define USE_CONTIGUOUS_MMAP 0
  86. #endif
  87. #if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(kfreebsdgnu_HOST_OS) || defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) || defined(gnu_HOST_OS)
  88. # define OBJFORMAT_ELF
  89. # include <regex.h> // regex is already used by dlopen() so this is OK
  90. // to use here without requiring an additional lib
  91. #elif defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
  92. # define OBJFORMAT_PEi386
  93. # include <windows.h>
  94. # include <math.h>
  95. #elif defined(darwin_HOST_OS)
  96. # define OBJFORMAT_MACHO
  97. # include <regex.h>
  98. # include <mach/machine.h>
  99. # include <mach-o/fat.h>
  100. # include <mach-o/loader.h>
  101. # include <mach-o/nlist.h>
  102. # include <mach-o/reloc.h>
  103. #if !defined(HAVE_DLFCN_H)
  104. # include <mach-o/dyld.h>
  105. #endif
  106. #if defined(powerpc_HOST_ARCH)
  107. # include <mach-o/ppc/reloc.h>
  108. #endif
  109. #if defined(x86_64_HOST_ARCH)
  110. # include <mach-o/x86_64/reloc.h>
  111. #endif
  112. #endif
  113. #if defined(x86_64_HOST_ARCH) && defined(darwin_HOST_OS)
  114. #define ALWAYS_PIC
  115. #endif
  116. #if defined(dragonfly_HOST_OS)
  117. #include <sys/tls.h>
  118. #endif
  119. // Defining this as 'int' rather than 'const int' means that we don't get
  120. // warnings like
  121. // error: function might be possible candidate for attribute ‘noreturn’
  122. // from gcc:
  123. #ifdef DYNAMIC_BY_DEFAULT
  124. int dynamicByDefault = 1;
  125. #else
  126. int dynamicByDefault = 0;
  127. #endif
  128. /* Hash table mapping symbol names to Symbol */
  129. static /*Str*/HashTable *symhash;
  130. /* Hash table mapping symbol names to StgStablePtr */
  131. static /*Str*/HashTable *stablehash;
  132. /* List of currently loaded objects */
  133. ObjectCode *objects = NULL; /* initially empty */
  134. static HsInt loadOc( ObjectCode* oc );
  135. static ObjectCode* mkOc( pathchar *path, char *image, int imageSize,
  136. char *archiveMemberName
  137. #ifndef USE_MMAP
  138. #ifdef darwin_HOST_OS
  139. , int misalignment
  140. #endif
  141. #endif
  142. );
  143. // Use wchar_t for pathnames on Windows (#5697)
  144. #if defined(mingw32_HOST_OS)
  145. #define pathcmp wcscmp
  146. #define pathlen wcslen
  147. #define pathopen _wfopen
  148. #define pathstat _wstat
  149. #define struct_stat struct _stat
  150. #define open wopen
  151. #define WSTR(s) L##s
  152. #define PATH_FMT "S"
  153. #else
  154. #define pathcmp strcmp
  155. #define pathlen strlen
  156. #define pathopen fopen
  157. #define pathstat stat
  158. #define struct_stat struct stat
  159. #define WSTR(s) s
  160. #define PATH_FMT "s"
  161. #endif
  162. static pathchar* pathdup(pathchar *path)
  163. {
  164. pathchar *ret;
  165. #if defined(mingw32_HOST_OS)
  166. ret = wcsdup(path);
  167. #else
  168. /* sigh, strdup() isn't a POSIX function, so do it the long way */
  169. ret = stgMallocBytes( strlen(path)+1, "loadObj" );
  170. strcpy(ret, path);
  171. #endif
  172. return ret;
  173. }
  174. #if defined(OBJFORMAT_ELF)
  175. static int ocVerifyImage_ELF ( ObjectCode* oc );
  176. static int ocGetNames_ELF ( ObjectCode* oc );
  177. static int ocResolve_ELF ( ObjectCode* oc );
  178. #if defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH) || defined(arm_HOST_ARCH)
  179. static int ocAllocateSymbolExtras_ELF ( ObjectCode* oc );
  180. #endif
  181. #elif defined(OBJFORMAT_PEi386)
  182. static int ocVerifyImage_PEi386 ( ObjectCode* oc );
  183. static int ocGetNames_PEi386 ( ObjectCode* oc );
  184. static int ocResolve_PEi386 ( ObjectCode* oc );
  185. static void *lookupSymbolInDLLs ( unsigned char *lbl );
  186. static void zapTrailingAtSign ( unsigned char *sym );
  187. #elif defined(OBJFORMAT_MACHO)
  188. static int ocVerifyImage_MachO ( ObjectCode* oc );
  189. static int ocGetNames_MachO ( ObjectCode* oc );
  190. static int ocResolve_MachO ( ObjectCode* oc );
  191. #ifndef USE_MMAP
  192. static int machoGetMisalignment( FILE * );
  193. #endif
  194. #if defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH)
  195. static int ocAllocateSymbolExtras_MachO ( ObjectCode* oc );
  196. #endif
  197. #ifdef powerpc_HOST_ARCH
  198. static void machoInitSymbolsWithoutUnderscore( void );
  199. #endif
  200. #endif
  201. /* on x86_64 we have a problem with relocating symbol references in
  202. * code that was compiled without -fPIC. By default, the small memory
  203. * model is used, which assumes that symbol references can fit in a
  204. * 32-bit slot. The system dynamic linker makes this work for
  205. * references to shared libraries by either (a) allocating a jump
  206. * table slot for code references, or (b) moving the symbol at load
  207. * time (and copying its contents, if necessary) for data references.
  208. *
  209. * We unfortunately can't tell whether symbol references are to code
  210. * or data. So for now we assume they are code (the vast majority
  211. * are), and allocate jump-table slots. Unfortunately this will
  212. * SILENTLY generate crashing code for data references. This hack is
  213. * enabled by X86_64_ELF_NONPIC_HACK.
  214. *
  215. * One workaround is to use shared Haskell libraries. This is
  216. * coming. Another workaround is to keep the static libraries but
  217. * compile them with -fPIC, because that will generate PIC references
  218. * to data which can be relocated. The PIC code is still too green to
  219. * do this systematically, though.
  220. *
  221. * See bug #781
  222. * See thread http://www.haskell.org/pipermail/cvs-ghc/2007-September/038458.html
  223. *
  224. * Naming Scheme for Symbol Macros
  225. *
  226. * SymI_*: symbol is internal to the RTS. It resides in an object
  227. * file/library that is statically.
  228. * SymE_*: symbol is external to the RTS library. It might be linked
  229. * dynamically.
  230. *
  231. * Sym*_HasProto : the symbol prototype is imported in an include file
  232. * or defined explicitly
  233. * Sym*_NeedsProto: the symbol is undefined and we add a dummy
  234. * default proto extern void sym(void);
  235. */
  236. #define X86_64_ELF_NONPIC_HACK 1
  237. /* Link objects into the lower 2Gb on x86_64. GHC assumes the
  238. * small memory model on this architecture (see gcc docs,
  239. * -mcmodel=small).
  240. *
  241. * MAP_32BIT not available on OpenBSD/amd64
  242. */
  243. #if defined(x86_64_HOST_ARCH) && defined(MAP_32BIT)
  244. #define TRY_MAP_32BIT MAP_32BIT
  245. #else
  246. #define TRY_MAP_32BIT 0
  247. #endif
  248. /*
  249. * Due to the small memory model (see above), on x86_64 we have to map
  250. * all our non-PIC object files into the low 2Gb of the address space
  251. * (why 2Gb and not 4Gb? Because all addresses must be reachable
  252. * using a 32-bit signed PC-relative offset). On Linux we can do this
  253. * using the MAP_32BIT flag to mmap(), however on other OSs
  254. * (e.g. *BSD, see #2063, and also on Linux inside Xen, see #2512), we
  255. * can't do this. So on these systems, we have to pick a base address
  256. * in the low 2Gb of the address space and try to allocate memory from
  257. * there.
  258. *
  259. * We pick a default address based on the OS, but also make this
  260. * configurable via an RTS flag (+RTS -xm)
  261. */
  262. #if !defined(ALWAYS_PIC) && defined(x86_64_HOST_ARCH)
  263. #if defined(MAP_32BIT)
  264. // Try to use MAP_32BIT
  265. #define MMAP_32BIT_BASE_DEFAULT 0
  266. #else
  267. // A guess: 1Gb.
  268. #define MMAP_32BIT_BASE_DEFAULT 0x40000000
  269. #endif
  270. static void *mmap_32bit_base = (void *)MMAP_32BIT_BASE_DEFAULT;
  271. #endif
  272. /* MAP_ANONYMOUS is MAP_ANON on some systems, e.g. OpenBSD */
  273. #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
  274. #define MAP_ANONYMOUS MAP_ANON
  275. #endif
  276. /* -----------------------------------------------------------------------------
  277. * Built-in symbols from the RTS
  278. */
  279. typedef struct _RtsSymbolVal {
  280. char *lbl;
  281. void *addr;
  282. } RtsSymbolVal;
  283. #define Maybe_Stable_Names SymI_HasProto(stg_mkWeakzh) \
  284. SymI_HasProto(stg_mkWeakNoFinalizzerzh) \
  285. SymI_HasProto(stg_mkWeakForeignEnvzh) \
  286. SymI_HasProto(stg_makeStableNamezh) \
  287. SymI_HasProto(stg_finalizzeWeakzh)
  288. #if !defined (mingw32_HOST_OS)
  289. #define RTS_POSIX_ONLY_SYMBOLS \
  290. SymI_HasProto(__hscore_get_saved_termios) \
  291. SymI_HasProto(__hscore_set_saved_termios) \
  292. SymI_HasProto(shutdownHaskellAndSignal) \
  293. SymI_HasProto(signal_handlers) \
  294. SymI_HasProto(stg_sig_install) \
  295. SymI_HasProto(rtsTimerSignal) \
  296. SymI_HasProto(atexit) \
  297. SymI_NeedsProto(nocldstop)
  298. #endif
  299. #if defined (cygwin32_HOST_OS)
  300. #define RTS_MINGW_ONLY_SYMBOLS /**/
  301. /* Don't have the ability to read import libs / archives, so
  302. * we have to stupidly list a lot of what libcygwin.a
  303. * exports; sigh.
  304. */
  305. #define RTS_CYGWIN_ONLY_SYMBOLS \
  306. SymI_HasProto(regfree) \
  307. SymI_HasProto(regexec) \
  308. SymI_HasProto(regerror) \
  309. SymI_HasProto(regcomp) \
  310. SymI_HasProto(__errno) \
  311. SymI_HasProto(access) \
  312. SymI_HasProto(chmod) \
  313. SymI_HasProto(chdir) \
  314. SymI_HasProto(close) \
  315. SymI_HasProto(creat) \
  316. SymI_HasProto(dup) \
  317. SymI_HasProto(dup2) \
  318. SymI_HasProto(fstat) \
  319. SymI_HasProto(fcntl) \
  320. SymI_HasProto(getcwd) \
  321. SymI_HasProto(getenv) \
  322. SymI_HasProto(lseek) \
  323. SymI_HasProto(open) \
  324. SymI_HasProto(fpathconf) \
  325. SymI_HasProto(pathconf) \
  326. SymI_HasProto(stat) \
  327. SymI_HasProto(pow) \
  328. SymI_HasProto(tanh) \
  329. SymI_HasProto(cosh) \
  330. SymI_HasProto(sinh) \
  331. SymI_HasProto(atan) \
  332. SymI_HasProto(acos) \
  333. SymI_HasProto(asin) \
  334. SymI_HasProto(tan) \
  335. SymI_HasProto(cos) \
  336. SymI_HasProto(sin) \
  337. SymI_HasProto(exp) \
  338. SymI_HasProto(log) \
  339. SymI_HasProto(sqrt) \
  340. SymI_HasProto(localtime_r) \
  341. SymI_HasProto(gmtime_r) \
  342. SymI_HasProto(mktime) \
  343. SymI_NeedsProto(_imp___tzname) \
  344. SymI_HasProto(gettimeofday) \
  345. SymI_HasProto(timezone) \
  346. SymI_HasProto(tcgetattr) \
  347. SymI_HasProto(tcsetattr) \
  348. SymI_HasProto(memcpy) \
  349. SymI_HasProto(memmove) \
  350. SymI_HasProto(realloc) \
  351. SymI_HasProto(malloc) \
  352. SymI_HasProto(free) \
  353. SymI_HasProto(fork) \
  354. SymI_HasProto(lstat) \
  355. SymI_HasProto(isatty) \
  356. SymI_HasProto(mkdir) \
  357. SymI_HasProto(opendir) \
  358. SymI_HasProto(readdir) \
  359. SymI_HasProto(rewinddir) \
  360. SymI_HasProto(closedir) \
  361. SymI_HasProto(link) \
  362. SymI_HasProto(mkfifo) \
  363. SymI_HasProto(pipe) \
  364. SymI_HasProto(read) \
  365. SymI_HasProto(rename) \
  366. SymI_HasProto(rmdir) \
  367. SymI_HasProto(select) \
  368. SymI_HasProto(system) \
  369. SymI_HasProto(write) \
  370. SymI_HasProto(strcmp) \
  371. SymI_HasProto(strcpy) \
  372. SymI_HasProto(strncpy) \
  373. SymI_HasProto(strerror) \
  374. SymI_HasProto(sigaddset) \
  375. SymI_HasProto(sigemptyset) \
  376. SymI_HasProto(sigprocmask) \
  377. SymI_HasProto(umask) \
  378. SymI_HasProto(uname) \
  379. SymI_HasProto(unlink) \
  380. SymI_HasProto(utime) \
  381. SymI_HasProto(waitpid)
  382. #elif defined(mingw32_HOST_OS)
  383. #define RTS_POSIX_ONLY_SYMBOLS /**/
  384. #define RTS_CYGWIN_ONLY_SYMBOLS /**/
  385. #if HAVE_GETTIMEOFDAY
  386. #define RTS_MINGW_GETTIMEOFDAY_SYM SymI_NeedsProto(gettimeofday)
  387. #else
  388. #define RTS_MINGW_GETTIMEOFDAY_SYM /**/
  389. #endif
  390. #if HAVE___MINGW_VFPRINTF
  391. #define RTS___MINGW_VFPRINTF_SYM SymI_HasProto(__mingw_vfprintf)
  392. #else
  393. #define RTS___MINGW_VFPRINTF_SYM /**/
  394. #endif
  395. #if defined(i386_HOST_ARCH)
  396. #define RTS_WIN32_ONLY(X) X
  397. #else
  398. #define RTS_WIN32_ONLY(X) /**/
  399. #endif
  400. #if defined(x86_64_HOST_ARCH)
  401. #define RTS_WIN64_ONLY(X) X
  402. #else
  403. #define RTS_WIN64_ONLY(X) /**/
  404. #endif
  405. /* These are statically linked from the mingw libraries into the ghc
  406. executable, so we have to employ this hack. */
  407. #define RTS_MINGW_ONLY_SYMBOLS \
  408. SymI_HasProto(stg_asyncReadzh) \
  409. SymI_HasProto(stg_asyncWritezh) \
  410. SymI_HasProto(stg_asyncDoProczh) \
  411. SymI_HasProto(getWin32ProgArgv) \
  412. SymI_HasProto(setWin32ProgArgv) \
  413. SymI_HasProto(memset) \
  414. SymI_HasProto(inet_ntoa) \
  415. SymI_HasProto(inet_addr) \
  416. SymI_HasProto(htonl) \
  417. SymI_HasProto(recvfrom) \
  418. SymI_HasProto(listen) \
  419. SymI_HasProto(bind) \
  420. SymI_HasProto(shutdown) \
  421. SymI_HasProto(connect) \
  422. SymI_HasProto(htons) \
  423. SymI_HasProto(ntohs) \
  424. SymI_HasProto(getservbyname) \
  425. SymI_HasProto(getservbyport) \
  426. SymI_HasProto(getprotobynumber) \
  427. SymI_HasProto(getprotobyname) \
  428. SymI_HasProto(gethostbyname) \
  429. SymI_HasProto(gethostbyaddr) \
  430. SymI_HasProto(gethostname) \
  431. SymI_HasProto(strcpy) \
  432. SymI_HasProto(strncpy) \
  433. SymI_HasProto(abort) \
  434. RTS_WIN32_ONLY(SymI_NeedsProto(_alloca)) \
  435. SymI_HasProto(isxdigit) \
  436. SymI_HasProto(isupper) \
  437. SymI_HasProto(ispunct) \
  438. SymI_HasProto(islower) \
  439. SymI_HasProto(isspace) \
  440. SymI_HasProto(isprint) \
  441. SymI_HasProto(isdigit) \
  442. SymI_HasProto(iscntrl) \
  443. SymI_HasProto(isalpha) \
  444. SymI_HasProto(isalnum) \
  445. SymI_HasProto(isascii) \
  446. RTS___MINGW_VFPRINTF_SYM \
  447. SymI_HasProto(strcmp) \
  448. SymI_HasProto(memmove) \
  449. SymI_HasProto(realloc) \
  450. SymI_HasProto(malloc) \
  451. SymI_HasProto(pow) \
  452. SymI_HasProto(tanh) \
  453. SymI_HasProto(cosh) \
  454. SymI_HasProto(sinh) \
  455. SymI_HasProto(atan) \
  456. SymI_HasProto(acos) \
  457. SymI_HasProto(asin) \
  458. SymI_HasProto(tan) \
  459. SymI_HasProto(cos) \
  460. SymI_HasProto(sin) \
  461. SymI_HasProto(exp) \
  462. SymI_HasProto(log) \
  463. SymI_HasProto(sqrt) \
  464. SymI_HasProto(powf) \
  465. SymI_HasProto(tanhf) \
  466. SymI_HasProto(coshf) \
  467. SymI_HasProto(sinhf) \
  468. SymI_HasProto(atanf) \
  469. SymI_HasProto(acosf) \
  470. SymI_HasProto(asinf) \
  471. SymI_HasProto(tanf) \
  472. SymI_HasProto(cosf) \
  473. SymI_HasProto(sinf) \
  474. SymI_HasProto(expf) \
  475. SymI_HasProto(logf) \
  476. SymI_HasProto(sqrtf) \
  477. SymI_HasProto(erf) \
  478. SymI_HasProto(erfc) \
  479. SymI_HasProto(erff) \
  480. SymI_HasProto(erfcf) \
  481. SymI_HasProto(memcpy) \
  482. SymI_HasProto(rts_InstallConsoleEvent) \
  483. SymI_HasProto(rts_ConsoleHandlerDone) \
  484. SymI_NeedsProto(mktime) \
  485. RTS_WIN32_ONLY(SymI_NeedsProto(_imp___timezone)) \
  486. RTS_WIN32_ONLY(SymI_NeedsProto(_imp___tzname)) \
  487. RTS_WIN32_ONLY(SymI_NeedsProto(_imp__tzname)) \
  488. RTS_WIN32_ONLY(SymI_NeedsProto(_imp___iob)) \
  489. RTS_WIN32_ONLY(SymI_NeedsProto(_imp___osver)) \
  490. SymI_NeedsProto(localtime) \
  491. SymI_NeedsProto(gmtime) \
  492. SymI_NeedsProto(opendir) \
  493. SymI_NeedsProto(readdir) \
  494. SymI_NeedsProto(rewinddir) \
  495. RTS_WIN32_ONLY(SymI_NeedsProto(_imp____mb_cur_max)) \
  496. RTS_WIN32_ONLY(SymI_NeedsProto(_imp___pctype)) \
  497. RTS_WIN32_ONLY(SymI_NeedsProto(__chkstk)) \
  498. RTS_WIN64_ONLY(SymI_NeedsProto(__imp___iob_func)) \
  499. RTS_WIN64_ONLY(SymI_NeedsProto(___chkstk_ms)) \
  500. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_localeconv)) \
  501. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_islower)) \
  502. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_isspace)) \
  503. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_isxdigit)) \
  504. RTS_WIN64_ONLY(SymI_HasProto(close)) \
  505. RTS_WIN64_ONLY(SymI_HasProto(read)) \
  506. RTS_WIN64_ONLY(SymI_HasProto(dup)) \
  507. RTS_WIN64_ONLY(SymI_HasProto(dup2)) \
  508. RTS_WIN64_ONLY(SymI_HasProto(write)) \
  509. SymI_NeedsProto(getpid) \
  510. RTS_WIN64_ONLY(SymI_HasProto(access)) \
  511. SymI_HasProto(chmod) \
  512. RTS_WIN64_ONLY(SymI_HasProto(creat)) \
  513. RTS_WIN64_ONLY(SymI_HasProto(umask)) \
  514. SymI_HasProto(unlink) \
  515. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__errno)) \
  516. RTS_WIN64_ONLY(SymI_NeedsProto(ftruncate64)) \
  517. RTS_WIN64_ONLY(SymI_HasProto(setmode)) \
  518. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__wstat64)) \
  519. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__fstat64)) \
  520. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__wsopen)) \
  521. RTS_WIN64_ONLY(SymI_HasProto(__imp__environ)) \
  522. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetFileAttributesA)) \
  523. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetFileInformationByHandle)) \
  524. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetFileType)) \
  525. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetLastError)) \
  526. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_QueryPerformanceFrequency)) \
  527. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_QueryPerformanceCounter)) \
  528. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetTickCount)) \
  529. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_WaitForSingleObject)) \
  530. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_PeekConsoleInputA)) \
  531. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_ReadConsoleInputA)) \
  532. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_PeekNamedPipe)) \
  533. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__isatty)) \
  534. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_select)) \
  535. RTS_WIN64_ONLY(SymI_HasProto(isatty)) \
  536. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__get_osfhandle)) \
  537. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetConsoleMode)) \
  538. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_SetConsoleMode)) \
  539. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_FlushConsoleInputBuffer)) \
  540. RTS_WIN64_ONLY(SymI_HasProto(free)) \
  541. RTS_WIN64_ONLY(SymI_NeedsProto(raise)) \
  542. RTS_WIN64_ONLY(SymI_NeedsProto(_getpid)) \
  543. RTS_WIN64_ONLY(SymI_HasProto(getc)) \
  544. RTS_WIN64_ONLY(SymI_HasProto(ungetc)) \
  545. RTS_WIN64_ONLY(SymI_HasProto(puts)) \
  546. RTS_WIN64_ONLY(SymI_HasProto(putc)) \
  547. RTS_WIN64_ONLY(SymI_HasProto(putchar)) \
  548. RTS_WIN64_ONLY(SymI_HasProto(fputc)) \
  549. RTS_WIN64_ONLY(SymI_HasProto(fread)) \
  550. RTS_WIN64_ONLY(SymI_HasProto(fwrite)) \
  551. RTS_WIN64_ONLY(SymI_HasProto(ferror)) \
  552. RTS_WIN64_ONLY(SymI_HasProto(printf)) \
  553. RTS_WIN64_ONLY(SymI_HasProto(fprintf)) \
  554. RTS_WIN64_ONLY(SymI_HasProto(sprintf)) \
  555. RTS_WIN64_ONLY(SymI_HasProto(vsprintf)) \
  556. RTS_WIN64_ONLY(SymI_HasProto(sscanf)) \
  557. RTS_WIN64_ONLY(SymI_HasProto(ldexp)) \
  558. RTS_WIN64_ONLY(SymI_HasProto(strlen)) \
  559. RTS_WIN64_ONLY(SymI_HasProto(strnlen)) \
  560. RTS_WIN64_ONLY(SymI_HasProto(strchr)) \
  561. RTS_WIN64_ONLY(SymI_HasProto(strtol)) \
  562. RTS_WIN64_ONLY(SymI_HasProto(strerror)) \
  563. RTS_WIN64_ONLY(SymI_HasProto(memchr)) \
  564. RTS_WIN64_ONLY(SymI_HasProto(memcmp)) \
  565. RTS_WIN64_ONLY(SymI_HasProto(wcscpy)) \
  566. RTS_WIN64_ONLY(SymI_HasProto(wcslen)) \
  567. RTS_WIN64_ONLY(SymI_HasProto(_lseeki64)) \
  568. RTS_WIN64_ONLY(SymI_HasProto(_wchmod)) \
  569. RTS_WIN64_ONLY(SymI_HasProto(closesocket)) \
  570. RTS_WIN64_ONLY(SymI_HasProto(send)) \
  571. RTS_WIN64_ONLY(SymI_HasProto(recv)) \
  572. RTS_WIN64_ONLY(SymI_HasProto(bsearch)) \
  573. RTS_WIN64_ONLY(SymI_HasProto(CommandLineToArgvW)) \
  574. RTS_WIN64_ONLY(SymI_HasProto(CreateBitmap)) \
  575. RTS_WIN64_ONLY(SymI_HasProto(CreateBitmapIndirect)) \
  576. RTS_WIN64_ONLY(SymI_HasProto(CreateCompatibleBitmap)) \
  577. RTS_WIN64_ONLY(SymI_HasProto(CreateDIBPatternBrushPt)) \
  578. RTS_WIN64_ONLY(SymI_HasProto(CreateDIBitmap)) \
  579. RTS_WIN64_ONLY(SymI_HasProto(SetBitmapDimensionEx)) \
  580. RTS_WIN64_ONLY(SymI_HasProto(GetBitmapDimensionEx)) \
  581. RTS_WIN64_ONLY(SymI_HasProto(GetStockObject)) \
  582. RTS_WIN64_ONLY(SymI_HasProto(GetObjectW)) \
  583. RTS_WIN64_ONLY(SymI_HasProto(DeleteObject)) \
  584. RTS_WIN64_ONLY(SymI_HasProto(SetDIBits)) \
  585. RTS_WIN64_ONLY(SymI_HasProto(GetDIBits)) \
  586. RTS_WIN64_ONLY(SymI_HasProto(CreateSolidBrush)) \
  587. RTS_WIN64_ONLY(SymI_HasProto(CreateHatchBrush)) \
  588. RTS_WIN64_ONLY(SymI_HasProto(CreatePatternBrush)) \
  589. RTS_WIN64_ONLY(SymI_HasProto(CreateFontW)) \
  590. RTS_WIN64_ONLY(SymI_HasProto(AngleArc)) \
  591. RTS_WIN64_ONLY(SymI_HasProto(Arc)) \
  592. RTS_WIN64_ONLY(SymI_HasProto(ArcTo)) \
  593. RTS_WIN64_ONLY(SymI_HasProto(BeginPath)) \
  594. RTS_WIN64_ONLY(SymI_HasProto(BitBlt)) \
  595. RTS_WIN64_ONLY(SymI_HasProto(CancelDC)) \
  596. RTS_WIN64_ONLY(SymI_HasProto(Chord)) \
  597. RTS_WIN64_ONLY(SymI_HasProto(CloseFigure)) \
  598. RTS_WIN64_ONLY(SymI_HasProto(CombineRgn)) \
  599. RTS_WIN64_ONLY(SymI_HasProto(CreateCompatibleDC)) \
  600. RTS_WIN64_ONLY(SymI_HasProto(CreateEllipticRgn)) \
  601. RTS_WIN64_ONLY(SymI_HasProto(CreateEllipticRgnIndirect)) \
  602. RTS_WIN64_ONLY(SymI_HasProto(CreatePen)) \
  603. RTS_WIN64_ONLY(SymI_HasProto(CreatePolygonRgn)) \
  604. RTS_WIN64_ONLY(SymI_HasProto(CreateRectRgn)) \
  605. RTS_WIN64_ONLY(SymI_HasProto(CreateRectRgnIndirect)) \
  606. RTS_WIN64_ONLY(SymI_HasProto(CreateRoundRectRgn)) \
  607. RTS_WIN64_ONLY(SymI_HasProto(DeleteDC)) \
  608. RTS_WIN64_ONLY(SymI_HasProto(Ellipse)) \
  609. RTS_WIN64_ONLY(SymI_HasProto(EndPath)) \
  610. RTS_WIN64_ONLY(SymI_HasProto(EqualRgn)) \
  611. RTS_WIN64_ONLY(SymI_HasProto(ExtSelectClipRgn)) \
  612. RTS_WIN64_ONLY(SymI_HasProto(FillPath)) \
  613. RTS_WIN64_ONLY(SymI_HasProto(FillRgn)) \
  614. RTS_WIN64_ONLY(SymI_HasProto(FlattenPath)) \
  615. RTS_WIN64_ONLY(SymI_HasProto(FrameRgn)) \
  616. RTS_WIN64_ONLY(SymI_HasProto(GetArcDirection)) \
  617. RTS_WIN64_ONLY(SymI_HasProto(GetBkColor)) \
  618. RTS_WIN64_ONLY(SymI_HasProto(GetBkMode)) \
  619. RTS_WIN64_ONLY(SymI_HasProto(GetBrushOrgEx)) \
  620. RTS_WIN64_ONLY(SymI_HasProto(GetCurrentObject)) \
  621. RTS_WIN64_ONLY(SymI_HasProto(GetDCOrgEx)) \
  622. RTS_WIN64_ONLY(SymI_HasProto(GetGraphicsMode)) \
  623. RTS_WIN64_ONLY(SymI_HasProto(GetMiterLimit)) \
  624. RTS_WIN64_ONLY(SymI_HasProto(GetPolyFillMode)) \
  625. RTS_WIN64_ONLY(SymI_HasProto(GetRgnBox)) \
  626. RTS_WIN64_ONLY(SymI_HasProto(GetStretchBltMode)) \
  627. RTS_WIN64_ONLY(SymI_HasProto(GetTextAlign)) \
  628. RTS_WIN64_ONLY(SymI_HasProto(GetTextCharacterExtra)) \
  629. RTS_WIN64_ONLY(SymI_HasProto(GetTextColor)) \
  630. RTS_WIN64_ONLY(SymI_HasProto(GetTextExtentPoint32W)) \
  631. RTS_WIN64_ONLY(SymI_HasProto(InvertRgn)) \
  632. RTS_WIN64_ONLY(SymI_HasProto(LineTo)) \
  633. RTS_WIN64_ONLY(SymI_HasProto(MaskBlt)) \
  634. RTS_WIN64_ONLY(SymI_HasProto(MoveToEx)) \
  635. RTS_WIN64_ONLY(SymI_HasProto(OffsetRgn)) \
  636. RTS_WIN64_ONLY(SymI_HasProto(PaintRgn)) \
  637. RTS_WIN64_ONLY(SymI_HasProto(PathToRegion)) \
  638. RTS_WIN64_ONLY(SymI_HasProto(Pie)) \
  639. RTS_WIN64_ONLY(SymI_HasProto(PlgBlt)) \
  640. RTS_WIN64_ONLY(SymI_HasProto(PolyBezier)) \
  641. RTS_WIN64_ONLY(SymI_HasProto(PolyBezierTo)) \
  642. RTS_WIN64_ONLY(SymI_HasProto(Polygon)) \
  643. RTS_WIN64_ONLY(SymI_HasProto(Polyline)) \
  644. RTS_WIN64_ONLY(SymI_HasProto(PolylineTo)) \
  645. RTS_WIN64_ONLY(SymI_HasProto(PtInRegion)) \
  646. RTS_WIN64_ONLY(SymI_HasProto(Rectangle)) \
  647. RTS_WIN64_ONLY(SymI_HasProto(RectInRegion)) \
  648. RTS_WIN64_ONLY(SymI_HasProto(RestoreDC)) \
  649. RTS_WIN64_ONLY(SymI_HasProto(RoundRect)) \
  650. RTS_WIN64_ONLY(SymI_HasProto(SaveDC)) \
  651. RTS_WIN64_ONLY(SymI_HasProto(SelectClipPath)) \
  652. RTS_WIN64_ONLY(SymI_HasProto(SelectClipRgn)) \
  653. RTS_WIN64_ONLY(SymI_HasProto(SelectObject)) \
  654. RTS_WIN64_ONLY(SymI_HasProto(SelectPalette)) \
  655. RTS_WIN64_ONLY(SymI_HasProto(SetArcDirection)) \
  656. RTS_WIN64_ONLY(SymI_HasProto(SetBkColor)) \
  657. RTS_WIN64_ONLY(SymI_HasProto(SetBkMode)) \
  658. RTS_WIN64_ONLY(SymI_HasProto(SetBrushOrgEx)) \
  659. RTS_WIN64_ONLY(SymI_HasProto(SetGraphicsMode)) \
  660. RTS_WIN64_ONLY(SymI_HasProto(SetMiterLimit)) \
  661. RTS_WIN64_ONLY(SymI_HasProto(SetPolyFillMode)) \
  662. RTS_WIN64_ONLY(SymI_HasProto(SetStretchBltMode)) \
  663. RTS_WIN64_ONLY(SymI_HasProto(SetTextAlign)) \
  664. RTS_WIN64_ONLY(SymI_HasProto(SetTextCharacterExtra)) \
  665. RTS_WIN64_ONLY(SymI_HasProto(SetTextColor)) \
  666. RTS_WIN64_ONLY(SymI_HasProto(StretchBlt)) \
  667. RTS_WIN64_ONLY(SymI_HasProto(StrokeAndFillPath)) \
  668. RTS_WIN64_ONLY(SymI_HasProto(StrokePath)) \
  669. RTS_WIN64_ONLY(SymI_HasProto(TextOutW)) \
  670. RTS_WIN64_ONLY(SymI_HasProto(timeGetTime)) \
  671. RTS_WIN64_ONLY(SymI_HasProto(WidenPath)) \
  672. RTS_WIN64_ONLY(SymI_HasProto(GetFileSecurityW)) \
  673. RTS_WIN64_ONLY(SymI_HasProto(RegCloseKey)) \
  674. RTS_WIN64_ONLY(SymI_HasProto(RegConnectRegistryW)) \
  675. RTS_WIN64_ONLY(SymI_HasProto(RegCreateKeyExW)) \
  676. RTS_WIN64_ONLY(SymI_HasProto(RegCreateKeyW)) \
  677. RTS_WIN64_ONLY(SymI_HasProto(RegDeleteKeyW)) \
  678. RTS_WIN64_ONLY(SymI_HasProto(RegDeleteValueW)) \
  679. RTS_WIN64_ONLY(SymI_HasProto(RegEnumKeyW)) \
  680. RTS_WIN64_ONLY(SymI_HasProto(RegEnumValueW)) \
  681. RTS_WIN64_ONLY(SymI_HasProto(RegFlushKey)) \
  682. RTS_WIN64_ONLY(SymI_HasProto(RegLoadKeyW)) \
  683. RTS_WIN64_ONLY(SymI_HasProto(RegNotifyChangeKeyValue)) \
  684. RTS_WIN64_ONLY(SymI_HasProto(RegOpenKeyExW)) \
  685. RTS_WIN64_ONLY(SymI_HasProto(RegOpenKeyW)) \
  686. RTS_WIN64_ONLY(SymI_HasProto(RegQueryInfoKeyW)) \
  687. RTS_WIN64_ONLY(SymI_HasProto(RegQueryValueExW)) \
  688. RTS_WIN64_ONLY(SymI_HasProto(RegQueryValueW)) \
  689. RTS_WIN64_ONLY(SymI_HasProto(RegReplaceKeyW)) \
  690. RTS_WIN64_ONLY(SymI_HasProto(RegRestoreKeyW)) \
  691. RTS_WIN64_ONLY(SymI_HasProto(RegSaveKeyW)) \
  692. RTS_WIN64_ONLY(SymI_HasProto(RegSetValueExW)) \
  693. RTS_WIN64_ONLY(SymI_HasProto(RegSetValueW)) \
  694. RTS_WIN64_ONLY(SymI_HasProto(RegUnLoadKeyW)) \
  695. RTS_WIN64_ONLY(SymI_NeedsProto(SHGetFolderPathW)) \
  696. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_SetWindowLongPtrW)) \
  697. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetWindowLongPtrW)) \
  698. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_MenuItemFromPoint)) \
  699. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_ChildWindowFromPoint)) \
  700. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_ChildWindowFromPointEx)) \
  701. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_DeleteObject)) \
  702. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_UnmapViewOfFile)) \
  703. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_CloseHandle)) \
  704. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_FreeLibrary)) \
  705. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetMessageW)) \
  706. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_TranslateMessage)) \
  707. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_DispatchMessageW)) \
  708. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_DefWindowProcW)) \
  709. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetDIBits)) \
  710. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GlobalAlloc)) \
  711. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GlobalFree)) \
  712. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_CreateFileW)) \
  713. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_WriteFile)) \
  714. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_CreateCompatibleBitmap)) \
  715. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_SelectObject)) \
  716. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_Polygon)) \
  717. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_FormatMessageW)) \
  718. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__localtime64)) \
  719. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__tzname)) \
  720. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__timezone)) \
  721. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_CreatePipe)) \
  722. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_SetHandleInformation)) \
  723. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetStdHandle)) \
  724. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetCurrentProcess)) \
  725. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_DuplicateHandle)) \
  726. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_CreateProcessW)) \
  727. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_TerminateProcess)) \
  728. RTS_WIN64_ONLY(SymI_NeedsProto(__imp__open_osfhandle)) \
  729. RTS_WIN64_ONLY(SymI_NeedsProto(__imp_GetExitCodeProcess)) \
  730. RTS_MINGW_GETTIMEOFDAY_SYM \
  731. SymI_NeedsProto(closedir)
  732. #else
  733. #define RTS_MINGW_ONLY_SYMBOLS /**/
  734. #define RTS_CYGWIN_ONLY_SYMBOLS /**/
  735. #endif
  736. #if defined(darwin_HOST_OS) && HAVE_PRINTF_LDBLSTUB
  737. #define RTS_DARWIN_ONLY_SYMBOLS \
  738. SymI_NeedsProto(asprintf$LDBLStub) \
  739. SymI_NeedsProto(err$LDBLStub) \
  740. SymI_NeedsProto(errc$LDBLStub) \
  741. SymI_NeedsProto(errx$LDBLStub) \
  742. SymI_NeedsProto(fprintf$LDBLStub) \
  743. SymI_NeedsProto(fscanf$LDBLStub) \
  744. SymI_NeedsProto(fwprintf$LDBLStub) \
  745. SymI_NeedsProto(fwscanf$LDBLStub) \
  746. SymI_NeedsProto(printf$LDBLStub) \
  747. SymI_NeedsProto(scanf$LDBLStub) \
  748. SymI_NeedsProto(snprintf$LDBLStub) \
  749. SymI_NeedsProto(sprintf$LDBLStub) \
  750. SymI_NeedsProto(sscanf$LDBLStub) \
  751. SymI_NeedsProto(strtold$LDBLStub) \
  752. SymI_NeedsProto(swprintf$LDBLStub) \
  753. SymI_NeedsProto(swscanf$LDBLStub) \
  754. SymI_NeedsProto(syslog$LDBLStub) \
  755. SymI_NeedsProto(vasprintf$LDBLStub) \
  756. SymI_NeedsProto(verr$LDBLStub) \
  757. SymI_NeedsProto(verrc$LDBLStub) \
  758. SymI_NeedsProto(verrx$LDBLStub) \
  759. SymI_NeedsProto(vfprintf$LDBLStub) \
  760. SymI_NeedsProto(vfscanf$LDBLStub) \
  761. SymI_NeedsProto(vfwprintf$LDBLStub) \
  762. SymI_NeedsProto(vfwscanf$LDBLStub) \
  763. SymI_NeedsProto(vprintf$LDBLStub) \
  764. SymI_NeedsProto(vscanf$LDBLStub) \
  765. SymI_NeedsProto(vsnprintf$LDBLStub) \
  766. SymI_NeedsProto(vsprintf$LDBLStub) \
  767. SymI_NeedsProto(vsscanf$LDBLStub) \
  768. SymI_NeedsProto(vswprintf$LDBLStub) \
  769. SymI_NeedsProto(vswscanf$LDBLStub) \
  770. SymI_NeedsProto(vsyslog$LDBLStub) \
  771. SymI_NeedsProto(vwarn$LDBLStub) \
  772. SymI_NeedsProto(vwarnc$LDBLStub) \
  773. SymI_NeedsProto(vwarnx$LDBLStub) \
  774. SymI_NeedsProto(vwprintf$LDBLStub) \
  775. SymI_NeedsProto(vwscanf$LDBLStub) \
  776. SymI_NeedsProto(warn$LDBLStub) \
  777. SymI_NeedsProto(warnc$LDBLStub) \
  778. SymI_NeedsProto(warnx$LDBLStub) \
  779. SymI_NeedsProto(wcstold$LDBLStub) \
  780. SymI_NeedsProto(wprintf$LDBLStub) \
  781. SymI_NeedsProto(wscanf$LDBLStub)
  782. #else
  783. #define RTS_DARWIN_ONLY_SYMBOLS
  784. #endif
  785. #ifndef SMP
  786. # define MAIN_CAP_SYM SymI_HasProto(MainCapability)
  787. #else
  788. # define MAIN_CAP_SYM
  789. #endif
  790. #if !defined(mingw32_HOST_OS)
  791. #define RTS_USER_SIGNALS_SYMBOLS \
  792. SymI_HasProto(setIOManagerControlFd) \
  793. SymI_HasProto(setIOManagerWakeupFd) \
  794. SymI_HasProto(ioManagerWakeup) \
  795. SymI_HasProto(blockUserSignals) \
  796. SymI_HasProto(unblockUserSignals)
  797. #else
  798. #define RTS_USER_SIGNALS_SYMBOLS \
  799. SymI_HasProto(ioManagerWakeup) \
  800. SymI_HasProto(sendIOManagerEvent) \
  801. SymI_HasProto(readIOManagerEvent) \
  802. SymI_HasProto(getIOManagerEvent) \
  803. SymI_HasProto(console_handler)
  804. #endif
  805. #define RTS_LIBFFI_SYMBOLS \
  806. SymE_NeedsProto(ffi_prep_cif) \
  807. SymE_NeedsProto(ffi_call) \
  808. SymE_NeedsProto(ffi_type_void) \
  809. SymE_NeedsProto(ffi_type_float) \
  810. SymE_NeedsProto(ffi_type_double) \
  811. SymE_NeedsProto(ffi_type_sint64) \
  812. SymE_NeedsProto(ffi_type_uint64) \
  813. SymE_NeedsProto(ffi_type_sint32) \
  814. SymE_NeedsProto(ffi_type_uint32) \
  815. SymE_NeedsProto(ffi_type_sint16) \
  816. SymE_NeedsProto(ffi_type_uint16) \
  817. SymE_NeedsProto(ffi_type_sint8) \
  818. SymE_NeedsProto(ffi_type_uint8) \
  819. SymE_NeedsProto(ffi_type_pointer)
  820. #ifdef TABLES_NEXT_TO_CODE
  821. #define RTS_RET_SYMBOLS /* nothing */
  822. #else
  823. #define RTS_RET_SYMBOLS \
  824. SymI_HasProto(stg_enter_ret) \
  825. SymI_HasProto(stg_gc_fun_ret) \
  826. SymI_HasProto(stg_ap_v_ret) \
  827. SymI_HasProto(stg_ap_f_ret) \
  828. SymI_HasProto(stg_ap_d_ret) \
  829. SymI_HasProto(stg_ap_l_ret) \
  830. SymI_HasProto(stg_ap_v16_ret) \
  831. SymI_HasProto(stg_ap_n_ret) \
  832. SymI_HasProto(stg_ap_p_ret) \
  833. SymI_HasProto(stg_ap_pv_ret) \
  834. SymI_HasProto(stg_ap_pp_ret) \
  835. SymI_HasProto(stg_ap_ppv_ret) \
  836. SymI_HasProto(stg_ap_ppp_ret) \
  837. SymI_HasProto(stg_ap_pppv_ret) \
  838. SymI_HasProto(stg_ap_pppp_ret) \
  839. SymI_HasProto(stg_ap_ppppp_ret) \
  840. SymI_HasProto(stg_ap_pppppp_ret)
  841. #endif
  842. /* Modules compiled with -ticky may mention ticky counters */
  843. /* This list should marry up with the one in $(TOP)/includes/stg/Ticky.h */
  844. #define RTS_TICKY_SYMBOLS \
  845. SymI_NeedsProto(ticky_entry_ctrs) \
  846. SymI_NeedsProto(top_ct) \
  847. \
  848. SymI_HasProto(ENT_VIA_NODE_ctr) \
  849. SymI_HasProto(ENT_STATIC_THK_ctr) \
  850. SymI_HasProto(ENT_DYN_THK_ctr) \
  851. SymI_HasProto(ENT_STATIC_FUN_DIRECT_ctr) \
  852. SymI_HasProto(ENT_DYN_FUN_DIRECT_ctr) \
  853. SymI_HasProto(ENT_STATIC_CON_ctr) \
  854. SymI_HasProto(ENT_DYN_CON_ctr) \
  855. SymI_HasProto(ENT_STATIC_IND_ctr) \
  856. SymI_HasProto(ENT_DYN_IND_ctr) \
  857. SymI_HasProto(ENT_PERM_IND_ctr) \
  858. SymI_HasProto(ENT_PAP_ctr) \
  859. SymI_HasProto(ENT_AP_ctr) \
  860. SymI_HasProto(ENT_AP_STACK_ctr) \
  861. SymI_HasProto(ENT_BH_ctr) \
  862. SymI_HasProto(UNKNOWN_CALL_ctr) \
  863. SymI_HasProto(SLOW_CALL_v_ctr) \
  864. SymI_HasProto(SLOW_CALL_f_ctr) \
  865. SymI_HasProto(SLOW_CALL_d_ctr) \
  866. SymI_HasProto(SLOW_CALL_l_ctr) \
  867. SymI_HasProto(SLOW_CALL_n_ctr) \
  868. SymI_HasProto(SLOW_CALL_p_ctr) \
  869. SymI_HasProto(SLOW_CALL_pv_ctr) \
  870. SymI_HasProto(SLOW_CALL_pp_ctr) \
  871. SymI_HasProto(SLOW_CALL_ppv_ctr) \
  872. SymI_HasProto(SLOW_CALL_ppp_ctr) \
  873. SymI_HasProto(SLOW_CALL_pppv_ctr) \
  874. SymI_HasProto(SLOW_CALL_pppp_ctr) \
  875. SymI_HasProto(SLOW_CALL_ppppp_ctr) \
  876. SymI_HasProto(SLOW_CALL_pppppp_ctr) \
  877. SymI_HasProto(SLOW_CALL_OTHER_ctr) \
  878. SymI_HasProto(ticky_slow_call_unevald) \
  879. SymI_HasProto(SLOW_CALL_ctr) \
  880. SymI_HasProto(MULTI_CHUNK_SLOW_CALL_ctr) \
  881. SymI_HasProto(MULTI_CHUNK_SLOW_CALL_CHUNKS_ctr) \
  882. SymI_HasProto(KNOWN_CALL_ctr) \
  883. SymI_HasProto(KNOWN_CALL_TOO_FEW_ARGS_ctr) \
  884. SymI_HasProto(KNOWN_CALL_EXTRA_ARGS_ctr) \
  885. SymI_HasProto(SLOW_CALL_FUN_TOO_FEW_ctr) \
  886. SymI_HasProto(SLOW_CALL_FUN_CORRECT_ctr) \
  887. SymI_HasProto(SLOW_CALL_FUN_TOO_MANY_ctr) \
  888. SymI_HasProto(SLOW_CALL_PAP_TOO_FEW_ctr) \
  889. SymI_HasProto(SLOW_CALL_PAP_CORRECT_ctr) \
  890. SymI_HasProto(SLOW_CALL_PAP_TOO_MANY_ctr) \
  891. SymI_HasProto(SLOW_CALL_UNEVALD_ctr) \
  892. SymI_HasProto(UPDF_OMITTED_ctr) \
  893. SymI_HasProto(UPDF_PUSHED_ctr) \
  894. SymI_HasProto(CATCHF_PUSHED_ctr) \
  895. SymI_HasProto(UPDF_RCC_PUSHED_ctr) \
  896. SymI_HasProto(UPDF_RCC_OMITTED_ctr) \
  897. SymI_HasProto(UPD_SQUEEZED_ctr) \
  898. SymI_HasProto(UPD_CON_IN_NEW_ctr) \
  899. SymI_HasProto(UPD_CON_IN_PLACE_ctr) \
  900. SymI_HasProto(UPD_PAP_IN_NEW_ctr) \
  901. SymI_HasProto(UPD_PAP_IN_PLACE_ctr) \
  902. SymI_HasProto(ALLOC_HEAP_ctr) \
  903. SymI_HasProto(ALLOC_HEAP_tot) \
  904. SymI_HasProto(ALLOC_FUN_ctr) \
  905. SymI_HasProto(ALLOC_FUN_adm) \
  906. SymI_HasProto(ALLOC_FUN_gds) \
  907. SymI_HasProto(ALLOC_FUN_slp) \
  908. SymI_HasProto(UPD_NEW_IND_ctr) \
  909. SymI_HasProto(UPD_NEW_PERM_IND_ctr) \
  910. SymI_HasProto(UPD_OLD_IND_ctr) \
  911. SymI_HasProto(UPD_OLD_PERM_IND_ctr) \
  912. SymI_HasProto(UPD_BH_UPDATABLE_ctr) \
  913. SymI_HasProto(UPD_BH_SINGLE_ENTRY_ctr) \
  914. SymI_HasProto(UPD_CAF_BH_UPDATABLE_ctr) \
  915. SymI_HasProto(UPD_CAF_BH_SINGLE_ENTRY_ctr) \
  916. SymI_HasProto(GC_SEL_ABANDONED_ctr) \
  917. SymI_HasProto(GC_SEL_MINOR_ctr) \
  918. SymI_HasProto(GC_SEL_MAJOR_ctr) \
  919. SymI_HasProto(GC_FAILED_PROMOTION_ctr) \
  920. SymI_HasProto(ALLOC_UP_THK_ctr) \
  921. SymI_HasProto(ALLOC_SE_THK_ctr) \
  922. SymI_HasProto(ALLOC_THK_adm) \
  923. SymI_HasProto(ALLOC_THK_gds) \
  924. SymI_HasProto(ALLOC_THK_slp) \
  925. SymI_HasProto(ALLOC_CON_ctr) \
  926. SymI_HasProto(ALLOC_CON_adm) \
  927. SymI_HasProto(ALLOC_CON_gds) \
  928. SymI_HasProto(ALLOC_CON_slp) \
  929. SymI_HasProto(ALLOC_TUP_ctr) \
  930. SymI_HasProto(ALLOC_TUP_adm) \
  931. SymI_HasProto(ALLOC_TUP_gds) \
  932. SymI_HasProto(ALLOC_TUP_slp) \
  933. SymI_HasProto(ALLOC_BH_ctr) \
  934. SymI_HasProto(ALLOC_BH_adm) \
  935. SymI_HasProto(ALLOC_BH_gds) \
  936. SymI_HasProto(ALLOC_BH_slp) \
  937. SymI_HasProto(ALLOC_PRIM_ctr) \
  938. SymI_HasProto(ALLOC_PRIM_adm) \
  939. SymI_HasProto(ALLOC_PRIM_gds) \
  940. SymI_HasProto(ALLOC_PRIM_slp) \
  941. SymI_HasProto(ALLOC_PAP_ctr) \
  942. SymI_HasProto(ALLOC_PAP_adm) \
  943. SymI_HasProto(ALLOC_PAP_gds) \
  944. SymI_HasProto(ALLOC_PAP_slp) \
  945. SymI_HasProto(ALLOC_TSO_ctr) \
  946. SymI_HasProto(ALLOC_TSO_adm) \
  947. SymI_HasProto(ALLOC_TSO_gds) \
  948. SymI_HasProto(ALLOC_TSO_slp) \
  949. SymI_HasProto(RET_NEW_ctr) \
  950. SymI_HasProto(RET_OLD_ctr) \
  951. SymI_HasProto(RET_UNBOXED_TUP_ctr) \
  952. SymI_HasProto(RET_SEMI_loads_avoided)
  953. // On most platforms, the garbage collector rewrites references
  954. // to small integer and char objects to a set of common, shared ones.
  955. //
  956. // We don't do this when compiling to Windows DLLs at the moment because
  957. // it doesn't support cross package data references well.
  958. //
  959. #if defined(COMPILING_WINDOWS_DLL)
  960. #define RTS_INTCHAR_SYMBOLS
  961. #else
  962. #define RTS_INTCHAR_SYMBOLS \
  963. SymI_HasProto(stg_CHARLIKE_closure) \
  964. SymI_HasProto(stg_INTLIKE_closure)
  965. #endif
  966. #define RTS_SYMBOLS \
  967. Maybe_Stable_Names \
  968. RTS_TICKY_SYMBOLS \
  969. SymI_HasProto(StgReturn) \
  970. SymI_HasProto(stg_gc_noregs) \
  971. SymI_HasProto(stg_ret_v_info) \
  972. SymI_HasProto(stg_ret_p_info) \
  973. SymI_HasProto(stg_ret_n_info) \
  974. SymI_HasProto(stg_ret_f_info) \
  975. SymI_HasProto(stg_ret_d_info) \
  976. SymI_HasProto(stg_ret_l_info) \
  977. SymI_HasProto(stg_gc_prim_p) \
  978. SymI_HasProto(stg_gc_prim_pp) \
  979. SymI_HasProto(stg_gc_prim_n) \
  980. SymI_HasProto(stg_enter_info) \
  981. SymI_HasProto(__stg_gc_enter_1) \
  982. SymI_HasProto(stg_gc_unpt_r1) \
  983. SymI_HasProto(stg_gc_unbx_r1) \
  984. SymI_HasProto(stg_gc_f1) \
  985. SymI_HasProto(stg_gc_d1) \
  986. SymI_HasProto(stg_gc_l1) \
  987. SymI_HasProto(stg_gc_pp) \
  988. SymI_HasProto(stg_gc_ppp) \
  989. SymI_HasProto(stg_gc_pppp) \
  990. SymI_HasProto(__stg_gc_fun) \
  991. SymI_HasProto(stg_gc_fun_info) \
  992. SymI_HasProto(stg_yield_noregs) \
  993. SymI_HasProto(stg_yield_t

Large files files are truncated, but you can click here to view the full file