X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLinker.c;h=c73fbece206be96d99b39cef065a09bcb76e4934;hb=2b16fa4791b08b02df8461f3b79d0e44d72d0960;hp=59143b9b0e1d2fa522d538428df55a657cc8f74d;hpb=c245355e6f2c7b7c95e9af910c4d420e13af9413;p=ghc-hetmet.git diff --git a/rts/Linker.c b/rts/Linker.c index 59143b9..c73fbec 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -27,6 +27,7 @@ #include "Schedule.h" #include "Sparks.h" #include "RtsTypeable.h" +#include "Timer.h" #ifdef HAVE_SYS_TYPES_H #include @@ -59,12 +60,12 @@ #include #endif -#if defined(ia64_HOST_ARCH) || defined(openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS) +#if defined(ia64_HOST_ARCH) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) #define USE_MMAP #include #include -#if defined(openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS) +#if defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) #ifdef HAVE_UNISTD_H #include #endif @@ -150,6 +151,18 @@ static void machoInitSymbolsWithoutUnderscore( void ); * * See bug #781 * See thread http://www.haskell.org/pipermail/cvs-ghc/2007-September/038458.html + * + * Naming Scheme for Symbol Macros + * + * SymI_*: symbol is internal to the RTS. It resides in an object + * file/library that is statically. + * SymE_*: symbol is external to the RTS library. It might be linked + * dynamically. + * + * Sym*_HasProto : the symbol prototype is imported in an include file + * or defined explicitly + * Sym*_NeedsProto: the symbol is undefined and we add a dummy + * default proto extern void sym(void); */ #define X86_64_ELF_NONPIC_HACK 1 @@ -162,11 +175,10 @@ typedef struct _RtsSymbolVal { void *addr; } RtsSymbolVal; - #if !defined(PAR) -#define Maybe_Stable_Names SymX(mkWeakzh_fast) \ - SymX(makeStableNamezh_fast) \ - SymX(finalizzeWeakzh_fast) +#define Maybe_Stable_Names SymI_HasProto(mkWeakzh_fast) \ + SymI_HasProto(makeStableNamezh_fast) \ + SymI_HasProto(finalizzeWeakzh_fast) #else /* These are not available in GUM!!! -- HWL */ #define Maybe_Stable_Names @@ -174,11 +186,12 @@ typedef struct _RtsSymbolVal { #if !defined (mingw32_HOST_OS) #define RTS_POSIX_ONLY_SYMBOLS \ - Sym(lockFile) \ - Sym(unlockFile) \ - SymX(signal_handlers) \ - SymX(stg_sig_install) \ - Sym(nocldstop) + SymI_HasProto(shutdownHaskellAndSignal) \ + SymI_NeedsProto(lockFile) \ + SymI_NeedsProto(unlockFile) \ + SymI_HasProto(signal_handlers) \ + SymI_HasProto(stg_sig_install) \ + SymI_NeedsProto(nocldstop) #endif #if defined (cygwin32_HOST_OS) @@ -187,83 +200,83 @@ typedef struct _RtsSymbolVal { * we have to stupidly list a lot of what libcygwin.a * exports; sigh. */ -#define RTS_CYGWIN_ONLY_SYMBOLS \ - SymX(regfree) \ - SymX(regexec) \ - SymX(regerror) \ - SymX(regcomp) \ - SymX(__errno) \ - SymX(access) \ - SymX(chmod) \ - SymX(chdir) \ - SymX(close) \ - SymX(creat) \ - SymX(dup) \ - SymX(dup2) \ - SymX(fstat) \ - SymX(fcntl) \ - SymX(getcwd) \ - SymX(getenv) \ - SymX(lseek) \ - SymX(open) \ - SymX(fpathconf) \ - SymX(pathconf) \ - SymX(stat) \ - SymX(pow) \ - SymX(tanh) \ - SymX(cosh) \ - SymX(sinh) \ - SymX(atan) \ - SymX(acos) \ - SymX(asin) \ - SymX(tan) \ - SymX(cos) \ - SymX(sin) \ - SymX(exp) \ - SymX(log) \ - SymX(sqrt) \ - SymX(localtime_r) \ - SymX(gmtime_r) \ - SymX(mktime) \ - Sym(_imp___tzname) \ - SymX(gettimeofday) \ - SymX(timezone) \ - SymX(tcgetattr) \ - SymX(tcsetattr) \ - SymX(memcpy) \ - SymX(memmove) \ - SymX(realloc) \ - SymX(malloc) \ - SymX(free) \ - SymX(fork) \ - SymX(lstat) \ - SymX(isatty) \ - SymX(mkdir) \ - SymX(opendir) \ - SymX(readdir) \ - SymX(rewinddir) \ - SymX(closedir) \ - SymX(link) \ - SymX(mkfifo) \ - SymX(pipe) \ - SymX(read) \ - SymX(rename) \ - SymX(rmdir) \ - SymX(select) \ - SymX(system) \ - SymX(write) \ - SymX(strcmp) \ - SymX(strcpy) \ - SymX(strncpy) \ - SymX(strerror) \ - SymX(sigaddset) \ - SymX(sigemptyset) \ - SymX(sigprocmask) \ - SymX(umask) \ - SymX(uname) \ - SymX(unlink) \ - SymX(utime) \ - SymX(waitpid) +#define RTS_CYGWIN_ONLY_SYMBOLS \ + SymI_HasProto(regfree) \ + SymI_HasProto(regexec) \ + SymI_HasProto(regerror) \ + SymI_HasProto(regcomp) \ + SymI_HasProto(__errno) \ + SymI_HasProto(access) \ + SymI_HasProto(chmod) \ + SymI_HasProto(chdir) \ + SymI_HasProto(close) \ + SymI_HasProto(creat) \ + SymI_HasProto(dup) \ + SymI_HasProto(dup2) \ + SymI_HasProto(fstat) \ + SymI_HasProto(fcntl) \ + SymI_HasProto(getcwd) \ + SymI_HasProto(getenv) \ + SymI_HasProto(lseek) \ + SymI_HasProto(open) \ + SymI_HasProto(fpathconf) \ + SymI_HasProto(pathconf) \ + SymI_HasProto(stat) \ + SymI_HasProto(pow) \ + SymI_HasProto(tanh) \ + SymI_HasProto(cosh) \ + SymI_HasProto(sinh) \ + SymI_HasProto(atan) \ + SymI_HasProto(acos) \ + SymI_HasProto(asin) \ + SymI_HasProto(tan) \ + SymI_HasProto(cos) \ + SymI_HasProto(sin) \ + SymI_HasProto(exp) \ + SymI_HasProto(log) \ + SymI_HasProto(sqrt) \ + SymI_HasProto(localtime_r) \ + SymI_HasProto(gmtime_r) \ + SymI_HasProto(mktime) \ + SymI_NeedsProto(_imp___tzname) \ + SymI_HasProto(gettimeofday) \ + SymI_HasProto(timezone) \ + SymI_HasProto(tcgetattr) \ + SymI_HasProto(tcsetattr) \ + SymI_HasProto(memcpy) \ + SymI_HasProto(memmove) \ + SymI_HasProto(realloc) \ + SymI_HasProto(malloc) \ + SymI_HasProto(free) \ + SymI_HasProto(fork) \ + SymI_HasProto(lstat) \ + SymI_HasProto(isatty) \ + SymI_HasProto(mkdir) \ + SymI_HasProto(opendir) \ + SymI_HasProto(readdir) \ + SymI_HasProto(rewinddir) \ + SymI_HasProto(closedir) \ + SymI_HasProto(link) \ + SymI_HasProto(mkfifo) \ + SymI_HasProto(pipe) \ + SymI_HasProto(read) \ + SymI_HasProto(rename) \ + SymI_HasProto(rmdir) \ + SymI_HasProto(select) \ + SymI_HasProto(system) \ + SymI_HasProto(write) \ + SymI_HasProto(strcmp) \ + SymI_HasProto(strcpy) \ + SymI_HasProto(strncpy) \ + SymI_HasProto(strerror) \ + SymI_HasProto(sigaddset) \ + SymI_HasProto(sigemptyset) \ + SymI_HasProto(sigprocmask) \ + SymI_HasProto(umask) \ + SymI_HasProto(uname) \ + SymI_HasProto(unlink) \ + SymI_HasProto(utime) \ + SymI_HasProto(waitpid) #elif !defined(mingw32_HOST_OS) #define RTS_MINGW_ONLY_SYMBOLS /**/ @@ -275,529 +288,555 @@ typedef struct _RtsSymbolVal { /* Extra syms gen'ed by mingw-2's gcc-3.2: */ #if __GNUC__>=3 #define RTS_MINGW_EXTRA_SYMS \ - Sym(_imp____mb_cur_max) \ - Sym(_imp___pctype) + SymI_NeedsProto(_imp____mb_cur_max) \ + SymI_NeedsProto(_imp___pctype) #else #define RTS_MINGW_EXTRA_SYMS #endif #if HAVE_GETTIMEOFDAY -#define RTS_MINGW_GETTIMEOFDAY_SYM Sym(gettimeofday) +#define RTS_MINGW_GETTIMEOFDAY_SYM SymI_NeedsProto(gettimeofday) #else #define RTS_MINGW_GETTIMEOFDAY_SYM /**/ #endif /* These are statically linked from the mingw libraries into the ghc executable, so we have to employ this hack. */ -#define RTS_MINGW_ONLY_SYMBOLS \ - SymX(asyncReadzh_fast) \ - SymX(asyncWritezh_fast) \ - SymX(asyncDoProczh_fast) \ - SymX(memset) \ - SymX(inet_ntoa) \ - SymX(inet_addr) \ - SymX(htonl) \ - SymX(recvfrom) \ - SymX(listen) \ - SymX(bind) \ - SymX(shutdown) \ - SymX(connect) \ - SymX(htons) \ - SymX(ntohs) \ - SymX(getservbyname) \ - SymX(getservbyport) \ - SymX(getprotobynumber) \ - SymX(getprotobyname) \ - SymX(gethostbyname) \ - SymX(gethostbyaddr) \ - SymX(gethostname) \ - SymX(strcpy) \ - SymX(strncpy) \ - SymX(abort) \ - Sym(_alloca) \ - Sym(isxdigit) \ - Sym(isupper) \ - Sym(ispunct) \ - Sym(islower) \ - Sym(isspace) \ - Sym(isprint) \ - Sym(isdigit) \ - Sym(iscntrl) \ - Sym(isalpha) \ - Sym(isalnum) \ - SymX(strcmp) \ - SymX(memmove) \ - SymX(realloc) \ - SymX(malloc) \ - SymX(pow) \ - SymX(tanh) \ - SymX(cosh) \ - SymX(sinh) \ - SymX(atan) \ - SymX(acos) \ - SymX(asin) \ - SymX(tan) \ - SymX(cos) \ - SymX(sin) \ - SymX(exp) \ - SymX(log) \ - SymX(sqrt) \ - SymX(powf) \ - SymX(tanhf) \ - SymX(coshf) \ - SymX(sinhf) \ - SymX(atanf) \ - SymX(acosf) \ - SymX(asinf) \ - SymX(tanf) \ - SymX(cosf) \ - SymX(sinf) \ - SymX(expf) \ - SymX(logf) \ - SymX(sqrtf) \ - SymX(memcpy) \ - SymX(rts_InstallConsoleEvent) \ - SymX(rts_ConsoleHandlerDone) \ - Sym(mktime) \ - Sym(_imp___timezone) \ - Sym(_imp___tzname) \ - Sym(_imp__tzname) \ - Sym(_imp___iob) \ - Sym(_imp___osver) \ - Sym(localtime) \ - Sym(gmtime) \ - Sym(opendir) \ - Sym(readdir) \ - Sym(rewinddir) \ - RTS_MINGW_EXTRA_SYMS \ - RTS_MINGW_GETTIMEOFDAY_SYM \ - Sym(closedir) +#define RTS_MINGW_ONLY_SYMBOLS \ + SymI_HasProto(asyncReadzh_fast) \ + SymI_HasProto(asyncWritezh_fast) \ + SymI_HasProto(asyncDoProczh_fast) \ + SymI_HasProto(memset) \ + SymI_HasProto(inet_ntoa) \ + SymI_HasProto(inet_addr) \ + SymI_HasProto(htonl) \ + SymI_HasProto(recvfrom) \ + SymI_HasProto(listen) \ + SymI_HasProto(bind) \ + SymI_HasProto(shutdown) \ + SymI_HasProto(connect) \ + SymI_HasProto(htons) \ + SymI_HasProto(ntohs) \ + SymI_HasProto(getservbyname) \ + SymI_HasProto(getservbyport) \ + SymI_HasProto(getprotobynumber) \ + SymI_HasProto(getprotobyname) \ + SymI_HasProto(gethostbyname) \ + SymI_HasProto(gethostbyaddr) \ + SymI_HasProto(gethostname) \ + SymI_HasProto(strcpy) \ + SymI_HasProto(strncpy) \ + SymI_HasProto(abort) \ + SymI_NeedsProto(_alloca) \ + SymI_NeedsProto(isxdigit) \ + SymI_NeedsProto(isupper) \ + SymI_NeedsProto(ispunct) \ + SymI_NeedsProto(islower) \ + SymI_NeedsProto(isspace) \ + SymI_NeedsProto(isprint) \ + SymI_NeedsProto(isdigit) \ + SymI_NeedsProto(iscntrl) \ + SymI_NeedsProto(isalpha) \ + SymI_NeedsProto(isalnum) \ + SymI_HasProto(strcmp) \ + SymI_HasProto(memmove) \ + SymI_HasProto(realloc) \ + SymI_HasProto(malloc) \ + SymI_HasProto(pow) \ + SymI_HasProto(tanh) \ + SymI_HasProto(cosh) \ + SymI_HasProto(sinh) \ + SymI_HasProto(atan) \ + SymI_HasProto(acos) \ + SymI_HasProto(asin) \ + SymI_HasProto(tan) \ + SymI_HasProto(cos) \ + SymI_HasProto(sin) \ + SymI_HasProto(exp) \ + SymI_HasProto(log) \ + SymI_HasProto(sqrt) \ + SymI_HasProto(powf) \ + SymI_HasProto(tanhf) \ + SymI_HasProto(coshf) \ + SymI_HasProto(sinhf) \ + SymI_HasProto(atanf) \ + SymI_HasProto(acosf) \ + SymI_HasProto(asinf) \ + SymI_HasProto(tanf) \ + SymI_HasProto(cosf) \ + SymI_HasProto(sinf) \ + SymI_HasProto(expf) \ + SymI_HasProto(logf) \ + SymI_HasProto(sqrtf) \ + SymI_HasProto(memcpy) \ + SymI_HasProto(rts_InstallConsoleEvent) \ + SymI_HasProto(rts_ConsoleHandlerDone) \ + SymI_NeedsProto(mktime) \ + SymI_NeedsProto(_imp___timezone) \ + SymI_NeedsProto(_imp___tzname) \ + SymI_NeedsProto(_imp__tzname) \ + SymI_NeedsProto(_imp___iob) \ + SymI_NeedsProto(_imp___osver) \ + SymI_NeedsProto(localtime) \ + SymI_NeedsProto(gmtime) \ + SymI_NeedsProto(opendir) \ + SymI_NeedsProto(readdir) \ + SymI_NeedsProto(rewinddir) \ + RTS_MINGW_EXTRA_SYMS \ + RTS_MINGW_GETTIMEOFDAY_SYM \ + SymI_NeedsProto(closedir) #endif #if defined(darwin_TARGET_OS) && HAVE_PRINTF_LDBLSTUB -#define RTS_DARWIN_ONLY_SYMBOLS \ - Sym(asprintf$LDBLStub) \ - Sym(err$LDBLStub) \ - Sym(errc$LDBLStub) \ - Sym(errx$LDBLStub) \ - Sym(fprintf$LDBLStub) \ - Sym(fscanf$LDBLStub) \ - Sym(fwprintf$LDBLStub) \ - Sym(fwscanf$LDBLStub) \ - Sym(printf$LDBLStub) \ - Sym(scanf$LDBLStub) \ - Sym(snprintf$LDBLStub) \ - Sym(sprintf$LDBLStub) \ - Sym(sscanf$LDBLStub) \ - Sym(strtold$LDBLStub) \ - Sym(swprintf$LDBLStub) \ - Sym(swscanf$LDBLStub) \ - Sym(syslog$LDBLStub) \ - Sym(vasprintf$LDBLStub) \ - Sym(verr$LDBLStub) \ - Sym(verrc$LDBLStub) \ - Sym(verrx$LDBLStub) \ - Sym(vfprintf$LDBLStub) \ - Sym(vfscanf$LDBLStub) \ - Sym(vfwprintf$LDBLStub) \ - Sym(vfwscanf$LDBLStub) \ - Sym(vprintf$LDBLStub) \ - Sym(vscanf$LDBLStub) \ - Sym(vsnprintf$LDBLStub) \ - Sym(vsprintf$LDBLStub) \ - Sym(vsscanf$LDBLStub) \ - Sym(vswprintf$LDBLStub) \ - Sym(vswscanf$LDBLStub) \ - Sym(vsyslog$LDBLStub) \ - Sym(vwarn$LDBLStub) \ - Sym(vwarnc$LDBLStub) \ - Sym(vwarnx$LDBLStub) \ - Sym(vwprintf$LDBLStub) \ - Sym(vwscanf$LDBLStub) \ - Sym(warn$LDBLStub) \ - Sym(warnc$LDBLStub) \ - Sym(warnx$LDBLStub) \ - Sym(wcstold$LDBLStub) \ - Sym(wprintf$LDBLStub) \ - Sym(wscanf$LDBLStub) +#define RTS_DARWIN_ONLY_SYMBOLS \ + SymI_NeedsProto(asprintf$LDBLStub) \ + SymI_NeedsProto(err$LDBLStub) \ + SymI_NeedsProto(errc$LDBLStub) \ + SymI_NeedsProto(errx$LDBLStub) \ + SymI_NeedsProto(fprintf$LDBLStub) \ + SymI_NeedsProto(fscanf$LDBLStub) \ + SymI_NeedsProto(fwprintf$LDBLStub) \ + SymI_NeedsProto(fwscanf$LDBLStub) \ + SymI_NeedsProto(printf$LDBLStub) \ + SymI_NeedsProto(scanf$LDBLStub) \ + SymI_NeedsProto(snprintf$LDBLStub) \ + SymI_NeedsProto(sprintf$LDBLStub) \ + SymI_NeedsProto(sscanf$LDBLStub) \ + SymI_NeedsProto(strtold$LDBLStub) \ + SymI_NeedsProto(swprintf$LDBLStub) \ + SymI_NeedsProto(swscanf$LDBLStub) \ + SymI_NeedsProto(syslog$LDBLStub) \ + SymI_NeedsProto(vasprintf$LDBLStub) \ + SymI_NeedsProto(verr$LDBLStub) \ + SymI_NeedsProto(verrc$LDBLStub) \ + SymI_NeedsProto(verrx$LDBLStub) \ + SymI_NeedsProto(vfprintf$LDBLStub) \ + SymI_NeedsProto(vfscanf$LDBLStub) \ + SymI_NeedsProto(vfwprintf$LDBLStub) \ + SymI_NeedsProto(vfwscanf$LDBLStub) \ + SymI_NeedsProto(vprintf$LDBLStub) \ + SymI_NeedsProto(vscanf$LDBLStub) \ + SymI_NeedsProto(vsnprintf$LDBLStub) \ + SymI_NeedsProto(vsprintf$LDBLStub) \ + SymI_NeedsProto(vsscanf$LDBLStub) \ + SymI_NeedsProto(vswprintf$LDBLStub) \ + SymI_NeedsProto(vswscanf$LDBLStub) \ + SymI_NeedsProto(vsyslog$LDBLStub) \ + SymI_NeedsProto(vwarn$LDBLStub) \ + SymI_NeedsProto(vwarnc$LDBLStub) \ + SymI_NeedsProto(vwarnx$LDBLStub) \ + SymI_NeedsProto(vwprintf$LDBLStub) \ + SymI_NeedsProto(vwscanf$LDBLStub) \ + SymI_NeedsProto(warn$LDBLStub) \ + SymI_NeedsProto(warnc$LDBLStub) \ + SymI_NeedsProto(warnx$LDBLStub) \ + SymI_NeedsProto(wcstold$LDBLStub) \ + SymI_NeedsProto(wprintf$LDBLStub) \ + SymI_NeedsProto(wscanf$LDBLStub) #else #define RTS_DARWIN_ONLY_SYMBOLS #endif #ifndef SMP -# define MAIN_CAP_SYM SymX(MainCapability) +# define MAIN_CAP_SYM SymI_HasProto(MainCapability) #else # define MAIN_CAP_SYM #endif #if !defined(mingw32_HOST_OS) #define RTS_USER_SIGNALS_SYMBOLS \ - SymX(setIOManagerPipe) + SymI_HasProto(setIOManagerPipe) #else -#define RTS_USER_SIGNALS_SYMBOLS \ - SymX(sendIOManagerEvent) \ - SymX(readIOManagerEvent) \ - SymX(getIOManagerEvent) \ - SymX(console_handler) +#define RTS_USER_SIGNALS_SYMBOLS \ + SymI_HasProto(sendIOManagerEvent) \ + SymI_HasProto(readIOManagerEvent) \ + SymI_HasProto(getIOManagerEvent) \ + SymI_HasProto(console_handler) #endif +#define RTS_LIBFFI_SYMBOLS \ + SymE_NeedsProto(ffi_prep_cif) \ + SymE_NeedsProto(ffi_call) \ + SymE_NeedsProto(ffi_type_void) \ + SymE_NeedsProto(ffi_type_float) \ + SymE_NeedsProto(ffi_type_double) \ + SymE_NeedsProto(ffi_type_sint64) \ + SymE_NeedsProto(ffi_type_uint64) \ + SymE_NeedsProto(ffi_type_sint32) \ + SymE_NeedsProto(ffi_type_uint32) \ + SymE_NeedsProto(ffi_type_sint16) \ + SymE_NeedsProto(ffi_type_uint16) \ + SymE_NeedsProto(ffi_type_sint8) \ + SymE_NeedsProto(ffi_type_uint8) \ + SymE_NeedsProto(ffi_type_pointer) + #ifdef TABLES_NEXT_TO_CODE #define RTS_RET_SYMBOLS /* nothing */ #else -#define RTS_RET_SYMBOLS \ - SymX(stg_enter_ret) \ - SymX(stg_gc_fun_ret) \ - SymX(stg_ap_v_ret) \ - SymX(stg_ap_f_ret) \ - SymX(stg_ap_d_ret) \ - SymX(stg_ap_l_ret) \ - SymX(stg_ap_n_ret) \ - SymX(stg_ap_p_ret) \ - SymX(stg_ap_pv_ret) \ - SymX(stg_ap_pp_ret) \ - SymX(stg_ap_ppv_ret) \ - SymX(stg_ap_ppp_ret) \ - SymX(stg_ap_pppv_ret) \ - SymX(stg_ap_pppp_ret) \ - SymX(stg_ap_ppppp_ret) \ - SymX(stg_ap_pppppp_ret) +#define RTS_RET_SYMBOLS \ + SymI_HasProto(stg_enter_ret) \ + SymI_HasProto(stg_gc_fun_ret) \ + SymI_HasProto(stg_ap_v_ret) \ + SymI_HasProto(stg_ap_f_ret) \ + SymI_HasProto(stg_ap_d_ret) \ + SymI_HasProto(stg_ap_l_ret) \ + SymI_HasProto(stg_ap_n_ret) \ + SymI_HasProto(stg_ap_p_ret) \ + SymI_HasProto(stg_ap_pv_ret) \ + SymI_HasProto(stg_ap_pp_ret) \ + SymI_HasProto(stg_ap_ppv_ret) \ + SymI_HasProto(stg_ap_ppp_ret) \ + SymI_HasProto(stg_ap_pppv_ret) \ + SymI_HasProto(stg_ap_pppp_ret) \ + SymI_HasProto(stg_ap_ppppp_ret) \ + SymI_HasProto(stg_ap_pppppp_ret) #endif /* On Windows, we link libgmp.a statically into libHSrts.dll */ #ifdef mingw32_HOST_OS -#define GMP_SYMS \ - SymX(__gmpz_cmp) \ - SymX(__gmpz_cmp_si) \ - SymX(__gmpz_cmp_ui) \ - SymX(__gmpz_get_si) \ - SymX(__gmpz_get_ui) +#define GMP_SYMS \ + SymI_HasProto(__gmpz_cmp) \ + SymI_HasProto(__gmpz_cmp_si) \ + SymI_HasProto(__gmpz_cmp_ui) \ + SymI_HasProto(__gmpz_get_si) \ + SymI_HasProto(__gmpz_get_ui) #else -#define GMP_SYMS \ - SymExtern(__gmpz_cmp) \ - SymExtern(__gmpz_cmp_si) \ - SymExtern(__gmpz_cmp_ui) \ - SymExtern(__gmpz_get_si) \ - SymExtern(__gmpz_get_ui) +#define GMP_SYMS \ + SymE_HasProto(__gmpz_cmp) \ + SymE_HasProto(__gmpz_cmp_si) \ + SymE_HasProto(__gmpz_cmp_ui) \ + SymE_HasProto(__gmpz_get_si) \ + SymE_HasProto(__gmpz_get_ui) #endif -#define RTS_SYMBOLS \ - Maybe_Stable_Names \ - SymX(StgReturn) \ - SymX(stg_enter_info) \ - SymX(stg_gc_void_info) \ - SymX(__stg_gc_enter_1) \ - SymX(stg_gc_noregs) \ - SymX(stg_gc_unpt_r1_info) \ - SymX(stg_gc_unpt_r1) \ - SymX(stg_gc_unbx_r1_info) \ - SymX(stg_gc_unbx_r1) \ - SymX(stg_gc_f1_info) \ - SymX(stg_gc_f1) \ - SymX(stg_gc_d1_info) \ - SymX(stg_gc_d1) \ - SymX(stg_gc_l1_info) \ - SymX(stg_gc_l1) \ - SymX(__stg_gc_fun) \ - SymX(stg_gc_fun_info) \ - SymX(stg_gc_gen) \ - SymX(stg_gc_gen_info) \ - SymX(stg_gc_gen_hp) \ - SymX(stg_gc_ut) \ - SymX(stg_gen_yield) \ - SymX(stg_yield_noregs) \ - SymX(stg_yield_to_interpreter) \ - SymX(stg_gen_block) \ - SymX(stg_block_noregs) \ - SymX(stg_block_1) \ - SymX(stg_block_takemvar) \ - SymX(stg_block_putmvar) \ - MAIN_CAP_SYM \ - SymX(MallocFailHook) \ - SymX(OnExitHook) \ - SymX(OutOfHeapHook) \ - SymX(StackOverflowHook) \ - SymX(__encodeDouble) \ - SymX(__encodeFloat) \ - SymX(addDLL) \ - GMP_SYMS \ - SymX(__int_encodeDouble) \ - SymX(__int_encodeFloat) \ - SymX(andIntegerzh_fast) \ - SymX(atomicallyzh_fast) \ - SymX(barf) \ - SymX(debugBelch) \ - SymX(errorBelch) \ - SymX(blockAsyncExceptionszh_fast) \ - SymX(catchzh_fast) \ - SymX(catchRetryzh_fast) \ - SymX(catchSTMzh_fast) \ - SymX(checkzh_fast) \ - SymX(closure_flags) \ - SymX(cmp_thread) \ - SymX(cmpIntegerzh_fast) \ - SymX(cmpIntegerIntzh_fast) \ - SymX(complementIntegerzh_fast) \ - SymX(createAdjustor) \ - SymX(decodeDoublezh_fast) \ - SymX(decodeFloatzh_fast) \ - SymX(defaultsHook) \ - SymX(delayzh_fast) \ - SymX(deRefWeakzh_fast) \ - SymX(deRefStablePtrzh_fast) \ - SymX(dirty_MUT_VAR) \ - SymX(divExactIntegerzh_fast) \ - SymX(divModIntegerzh_fast) \ - SymX(forkzh_fast) \ - SymX(forkOnzh_fast) \ - SymX(forkProcess) \ - SymX(forkOS_createThread) \ - SymX(freeHaskellFunctionPtr) \ - SymX(freeStablePtr) \ - SymX(getOrSetTypeableStore) \ - SymX(gcdIntegerzh_fast) \ - SymX(gcdIntegerIntzh_fast) \ - SymX(gcdIntzh_fast) \ - SymX(genSymZh) \ - SymX(genericRaise) \ - SymX(getProgArgv) \ - SymX(getFullProgArgv) \ - SymX(getStablePtr) \ - SymX(hs_init) \ - SymX(hs_exit) \ - SymX(hs_set_argv) \ - SymX(hs_add_root) \ - SymX(hs_perform_gc) \ - SymX(hs_free_stable_ptr) \ - SymX(hs_free_fun_ptr) \ - SymX(hs_hpc_rootModule) \ - SymX(initLinker) \ - SymX(unpackClosurezh_fast) \ - SymX(getApStackValzh_fast) \ - SymX(int2Integerzh_fast) \ - SymX(integer2Intzh_fast) \ - SymX(integer2Wordzh_fast) \ - SymX(isCurrentThreadBoundzh_fast) \ - SymX(isDoubleDenormalized) \ - SymX(isDoubleInfinite) \ - SymX(isDoubleNaN) \ - SymX(isDoubleNegativeZero) \ - SymX(isEmptyMVarzh_fast) \ - SymX(isFloatDenormalized) \ - SymX(isFloatInfinite) \ - SymX(isFloatNaN) \ - SymX(isFloatNegativeZero) \ - SymX(killThreadzh_fast) \ - SymX(loadObj) \ - SymX(insertStableSymbol) \ - SymX(insertSymbol) \ - SymX(lookupSymbol) \ - SymX(makeStablePtrzh_fast) \ - SymX(minusIntegerzh_fast) \ - SymX(mkApUpd0zh_fast) \ - SymX(myThreadIdzh_fast) \ - SymX(labelThreadzh_fast) \ - SymX(newArrayzh_fast) \ - SymX(newBCOzh_fast) \ - SymX(newByteArrayzh_fast) \ - SymX_redirect(newCAF, newDynCAF) \ - SymX(newMVarzh_fast) \ - SymX(newMutVarzh_fast) \ - SymX(newTVarzh_fast) \ - SymX(noDuplicatezh_fast) \ - SymX(atomicModifyMutVarzh_fast) \ - SymX(newPinnedByteArrayzh_fast) \ - SymX(newSpark) \ - SymX(orIntegerzh_fast) \ - SymX(performGC) \ - SymX(performMajorGC) \ - SymX(plusIntegerzh_fast) \ - SymX(prog_argc) \ - SymX(prog_argv) \ - SymX(putMVarzh_fast) \ - SymX(quotIntegerzh_fast) \ - SymX(quotRemIntegerzh_fast) \ - SymX(raisezh_fast) \ - SymX(raiseIOzh_fast) \ - SymX(readTVarzh_fast) \ - SymX(remIntegerzh_fast) \ - SymX(resetNonBlockingFd) \ - SymX(resumeThread) \ - SymX(resolveObjs) \ - SymX(retryzh_fast) \ - SymX(rts_apply) \ - SymX(rts_checkSchedStatus) \ - SymX(rts_eval) \ - SymX(rts_evalIO) \ - SymX(rts_evalLazyIO) \ - SymX(rts_evalStableIO) \ - SymX(rts_eval_) \ - SymX(rts_getBool) \ - SymX(rts_getChar) \ - SymX(rts_getDouble) \ - SymX(rts_getFloat) \ - SymX(rts_getInt) \ - SymX(rts_getInt8) \ - SymX(rts_getInt16) \ - SymX(rts_getInt32) \ - SymX(rts_getInt64) \ - SymX(rts_getPtr) \ - SymX(rts_getFunPtr) \ - SymX(rts_getStablePtr) \ - SymX(rts_getThreadId) \ - SymX(rts_getWord) \ - SymX(rts_getWord8) \ - SymX(rts_getWord16) \ - SymX(rts_getWord32) \ - SymX(rts_getWord64) \ - SymX(rts_lock) \ - SymX(rts_mkBool) \ - SymX(rts_mkChar) \ - SymX(rts_mkDouble) \ - SymX(rts_mkFloat) \ - SymX(rts_mkInt) \ - SymX(rts_mkInt8) \ - SymX(rts_mkInt16) \ - SymX(rts_mkInt32) \ - SymX(rts_mkInt64) \ - SymX(rts_mkPtr) \ - SymX(rts_mkFunPtr) \ - SymX(rts_mkStablePtr) \ - SymX(rts_mkString) \ - SymX(rts_mkWord) \ - SymX(rts_mkWord8) \ - SymX(rts_mkWord16) \ - SymX(rts_mkWord32) \ - SymX(rts_mkWord64) \ - SymX(rts_unlock) \ - SymX(rtsSupportsBoundThreads) \ - SymX(__hscore_get_saved_termios) \ - SymX(__hscore_set_saved_termios) \ - SymX(setProgArgv) \ - SymX(startupHaskell) \ - SymX(shutdownHaskell) \ - SymX(shutdownHaskellAndExit) \ - SymX(stable_ptr_table) \ - SymX(stackOverflow) \ - SymX(stg_CAF_BLACKHOLE_info) \ - SymX(awakenBlockedQueue) \ - SymX(stg_CHARLIKE_closure) \ - SymX(stg_MVAR_CLEAN_info) \ - SymX(stg_MVAR_DIRTY_info) \ - SymX(stg_IND_STATIC_info) \ - SymX(stg_INTLIKE_closure) \ - SymX(stg_MUT_ARR_PTRS_DIRTY_info) \ - SymX(stg_MUT_ARR_PTRS_FROZEN_info) \ - SymX(stg_MUT_ARR_PTRS_FROZEN0_info) \ - SymX(stg_WEAK_info) \ - SymX(stg_ap_v_info) \ - SymX(stg_ap_f_info) \ - SymX(stg_ap_d_info) \ - SymX(stg_ap_l_info) \ - SymX(stg_ap_n_info) \ - SymX(stg_ap_p_info) \ - SymX(stg_ap_pv_info) \ - SymX(stg_ap_pp_info) \ - SymX(stg_ap_ppv_info) \ - SymX(stg_ap_ppp_info) \ - SymX(stg_ap_pppv_info) \ - SymX(stg_ap_pppp_info) \ - SymX(stg_ap_ppppp_info) \ - SymX(stg_ap_pppppp_info) \ - SymX(stg_ap_0_fast) \ - SymX(stg_ap_v_fast) \ - SymX(stg_ap_f_fast) \ - SymX(stg_ap_d_fast) \ - SymX(stg_ap_l_fast) \ - SymX(stg_ap_n_fast) \ - SymX(stg_ap_p_fast) \ - SymX(stg_ap_pv_fast) \ - SymX(stg_ap_pp_fast) \ - SymX(stg_ap_ppv_fast) \ - SymX(stg_ap_ppp_fast) \ - SymX(stg_ap_pppv_fast) \ - SymX(stg_ap_pppp_fast) \ - SymX(stg_ap_ppppp_fast) \ - SymX(stg_ap_pppppp_fast) \ - SymX(stg_ap_1_upd_info) \ - SymX(stg_ap_2_upd_info) \ - SymX(stg_ap_3_upd_info) \ - SymX(stg_ap_4_upd_info) \ - SymX(stg_ap_5_upd_info) \ - SymX(stg_ap_6_upd_info) \ - SymX(stg_ap_7_upd_info) \ - SymX(stg_exit) \ - SymX(stg_sel_0_upd_info) \ - SymX(stg_sel_10_upd_info) \ - SymX(stg_sel_11_upd_info) \ - SymX(stg_sel_12_upd_info) \ - SymX(stg_sel_13_upd_info) \ - SymX(stg_sel_14_upd_info) \ - SymX(stg_sel_15_upd_info) \ - SymX(stg_sel_1_upd_info) \ - SymX(stg_sel_2_upd_info) \ - SymX(stg_sel_3_upd_info) \ - SymX(stg_sel_4_upd_info) \ - SymX(stg_sel_5_upd_info) \ - SymX(stg_sel_6_upd_info) \ - SymX(stg_sel_7_upd_info) \ - SymX(stg_sel_8_upd_info) \ - SymX(stg_sel_9_upd_info) \ - SymX(stg_upd_frame_info) \ - SymX(suspendThread) \ - SymX(takeMVarzh_fast) \ - SymX(timesIntegerzh_fast) \ - SymX(tryPutMVarzh_fast) \ - SymX(tryTakeMVarzh_fast) \ - SymX(unblockAsyncExceptionszh_fast) \ - SymX(unloadObj) \ - SymX(unsafeThawArrayzh_fast) \ - SymX(waitReadzh_fast) \ - SymX(waitWritezh_fast) \ - SymX(word2Integerzh_fast) \ - SymX(writeTVarzh_fast) \ - SymX(xorIntegerzh_fast) \ - SymX(yieldzh_fast) \ - SymX(stg_interp_constr_entry) \ - SymX(allocateExec) \ - SymX(freeExec) \ - SymX(getAllocations) \ - SymX(revertCAFs) \ - SymX(RtsFlags) \ - SymX(rts_breakpoint_io_action) \ - SymX(rts_stop_next_breakpoint) \ - SymX(rts_stop_on_exception) \ - SymX(stopTimer) \ - SymX(n_capabilities) \ +#define RTS_SYMBOLS \ + Maybe_Stable_Names \ + SymI_HasProto(StgReturn) \ + SymI_HasProto(stg_enter_info) \ + SymI_HasProto(stg_gc_void_info) \ + SymI_HasProto(__stg_gc_enter_1) \ + SymI_HasProto(stg_gc_noregs) \ + SymI_HasProto(stg_gc_unpt_r1_info) \ + SymI_HasProto(stg_gc_unpt_r1) \ + SymI_HasProto(stg_gc_unbx_r1_info) \ + SymI_HasProto(stg_gc_unbx_r1) \ + SymI_HasProto(stg_gc_f1_info) \ + SymI_HasProto(stg_gc_f1) \ + SymI_HasProto(stg_gc_d1_info) \ + SymI_HasProto(stg_gc_d1) \ + SymI_HasProto(stg_gc_l1_info) \ + SymI_HasProto(stg_gc_l1) \ + SymI_HasProto(__stg_gc_fun) \ + SymI_HasProto(stg_gc_fun_info) \ + SymI_HasProto(stg_gc_gen) \ + SymI_HasProto(stg_gc_gen_info) \ + SymI_HasProto(stg_gc_gen_hp) \ + SymI_HasProto(stg_gc_ut) \ + SymI_HasProto(stg_gen_yield) \ + SymI_HasProto(stg_yield_noregs) \ + SymI_HasProto(stg_yield_to_interpreter) \ + SymI_HasProto(stg_gen_block) \ + SymI_HasProto(stg_block_noregs) \ + SymI_HasProto(stg_block_1) \ + SymI_HasProto(stg_block_takemvar) \ + SymI_HasProto(stg_block_putmvar) \ + MAIN_CAP_SYM \ + SymI_HasProto(MallocFailHook) \ + SymI_HasProto(OnExitHook) \ + SymI_HasProto(OutOfHeapHook) \ + SymI_HasProto(StackOverflowHook) \ + SymI_HasProto(__encodeDouble) \ + SymI_HasProto(__encodeFloat) \ + SymI_HasProto(addDLL) \ + GMP_SYMS \ + SymI_HasProto(__int_encodeDouble) \ + SymI_HasProto(__word_encodeDouble) \ + SymI_HasProto(__2Int_encodeDouble) \ + SymI_HasProto(__int_encodeFloat) \ + SymI_HasProto(__word_encodeFloat) \ + SymI_HasProto(andIntegerzh_fast) \ + SymI_HasProto(atomicallyzh_fast) \ + SymI_HasProto(barf) \ + SymI_HasProto(debugBelch) \ + SymI_HasProto(errorBelch) \ + SymI_HasProto(asyncExceptionsBlockedzh_fast) \ + SymI_HasProto(blockAsyncExceptionszh_fast) \ + SymI_HasProto(catchzh_fast) \ + SymI_HasProto(catchRetryzh_fast) \ + SymI_HasProto(catchSTMzh_fast) \ + SymI_HasProto(checkzh_fast) \ + SymI_HasProto(closure_flags) \ + SymI_HasProto(cmp_thread) \ + SymI_HasProto(cmpIntegerzh_fast) \ + SymI_HasProto(cmpIntegerIntzh_fast) \ + SymI_HasProto(complementIntegerzh_fast) \ + SymI_HasProto(createAdjustor) \ + SymI_HasProto(decodeDoublezh_fast) \ + SymI_HasProto(decodeFloatzh_fast) \ + SymI_HasProto(decodeDoublezu2Intzh_fast) \ + SymI_HasProto(decodeFloatzuIntzh_fast) \ + SymI_HasProto(defaultsHook) \ + SymI_HasProto(delayzh_fast) \ + SymI_HasProto(deRefWeakzh_fast) \ + SymI_HasProto(deRefStablePtrzh_fast) \ + SymI_HasProto(dirty_MUT_VAR) \ + SymI_HasProto(divExactIntegerzh_fast) \ + SymI_HasProto(divModIntegerzh_fast) \ + SymI_HasProto(forkzh_fast) \ + SymI_HasProto(forkOnzh_fast) \ + SymI_HasProto(forkProcess) \ + SymI_HasProto(forkOS_createThread) \ + SymI_HasProto(freeHaskellFunctionPtr) \ + SymI_HasProto(freeStablePtr) \ + SymI_HasProto(getOrSetTypeableStore) \ + SymI_HasProto(gcdIntegerzh_fast) \ + SymI_HasProto(gcdIntegerIntzh_fast) \ + SymI_HasProto(gcdIntzh_fast) \ + SymI_HasProto(genSymZh) \ + SymI_HasProto(genericRaise) \ + SymI_HasProto(getProgArgv) \ + SymI_HasProto(getFullProgArgv) \ + SymI_HasProto(getStablePtr) \ + SymI_HasProto(hs_init) \ + SymI_HasProto(hs_exit) \ + SymI_HasProto(hs_set_argv) \ + SymI_HasProto(hs_add_root) \ + SymI_HasProto(hs_perform_gc) \ + SymI_HasProto(hs_free_stable_ptr) \ + SymI_HasProto(hs_free_fun_ptr) \ + SymI_HasProto(hs_hpc_rootModule) \ + SymI_HasProto(initLinker) \ + SymI_HasProto(unpackClosurezh_fast) \ + SymI_HasProto(getApStackValzh_fast) \ + SymI_HasProto(getSparkzh_fast) \ + SymI_HasProto(int2Integerzh_fast) \ + SymI_HasProto(integer2Intzh_fast) \ + SymI_HasProto(integer2Wordzh_fast) \ + SymI_HasProto(isCurrentThreadBoundzh_fast) \ + SymI_HasProto(isDoubleDenormalized) \ + SymI_HasProto(isDoubleInfinite) \ + SymI_HasProto(isDoubleNaN) \ + SymI_HasProto(isDoubleNegativeZero) \ + SymI_HasProto(isEmptyMVarzh_fast) \ + SymI_HasProto(isFloatDenormalized) \ + SymI_HasProto(isFloatInfinite) \ + SymI_HasProto(isFloatNaN) \ + SymI_HasProto(isFloatNegativeZero) \ + SymI_HasProto(killThreadzh_fast) \ + SymI_HasProto(loadObj) \ + SymI_HasProto(insertStableSymbol) \ + SymI_HasProto(insertSymbol) \ + SymI_HasProto(lookupSymbol) \ + SymI_HasProto(makeStablePtrzh_fast) \ + SymI_HasProto(minusIntegerzh_fast) \ + SymI_HasProto(mkApUpd0zh_fast) \ + SymI_HasProto(myThreadIdzh_fast) \ + SymI_HasProto(labelThreadzh_fast) \ + SymI_HasProto(newArrayzh_fast) \ + SymI_HasProto(newBCOzh_fast) \ + SymI_HasProto(newByteArrayzh_fast) \ + SymI_HasProto_redirect(newCAF, newDynCAF) \ + SymI_HasProto(newMVarzh_fast) \ + SymI_HasProto(newMutVarzh_fast) \ + SymI_HasProto(newTVarzh_fast) \ + SymI_HasProto(noDuplicatezh_fast) \ + SymI_HasProto(atomicModifyMutVarzh_fast) \ + SymI_HasProto(newPinnedByteArrayzh_fast) \ + SymI_HasProto(newSpark) \ + SymI_HasProto(orIntegerzh_fast) \ + SymI_HasProto(performGC) \ + SymI_HasProto(performMajorGC) \ + SymI_HasProto(plusIntegerzh_fast) \ + SymI_HasProto(prog_argc) \ + SymI_HasProto(prog_argv) \ + SymI_HasProto(putMVarzh_fast) \ + SymI_HasProto(quotIntegerzh_fast) \ + SymI_HasProto(quotRemIntegerzh_fast) \ + SymI_HasProto(raisezh_fast) \ + SymI_HasProto(raiseIOzh_fast) \ + SymI_HasProto(readTVarzh_fast) \ + SymI_HasProto(readTVarIOzh_fast) \ + SymI_HasProto(remIntegerzh_fast) \ + SymI_HasProto(resetNonBlockingFd) \ + SymI_HasProto(resumeThread) \ + SymI_HasProto(resolveObjs) \ + SymI_HasProto(retryzh_fast) \ + SymI_HasProto(rts_apply) \ + SymI_HasProto(rts_checkSchedStatus) \ + SymI_HasProto(rts_eval) \ + SymI_HasProto(rts_evalIO) \ + SymI_HasProto(rts_evalLazyIO) \ + SymI_HasProto(rts_evalStableIO) \ + SymI_HasProto(rts_eval_) \ + SymI_HasProto(rts_getBool) \ + SymI_HasProto(rts_getChar) \ + SymI_HasProto(rts_getDouble) \ + SymI_HasProto(rts_getFloat) \ + SymI_HasProto(rts_getInt) \ + SymI_HasProto(rts_getInt8) \ + SymI_HasProto(rts_getInt16) \ + SymI_HasProto(rts_getInt32) \ + SymI_HasProto(rts_getInt64) \ + SymI_HasProto(rts_getPtr) \ + SymI_HasProto(rts_getFunPtr) \ + SymI_HasProto(rts_getStablePtr) \ + SymI_HasProto(rts_getThreadId) \ + SymI_HasProto(rts_getWord) \ + SymI_HasProto(rts_getWord8) \ + SymI_HasProto(rts_getWord16) \ + SymI_HasProto(rts_getWord32) \ + SymI_HasProto(rts_getWord64) \ + SymI_HasProto(rts_lock) \ + SymI_HasProto(rts_mkBool) \ + SymI_HasProto(rts_mkChar) \ + SymI_HasProto(rts_mkDouble) \ + SymI_HasProto(rts_mkFloat) \ + SymI_HasProto(rts_mkInt) \ + SymI_HasProto(rts_mkInt8) \ + SymI_HasProto(rts_mkInt16) \ + SymI_HasProto(rts_mkInt32) \ + SymI_HasProto(rts_mkInt64) \ + SymI_HasProto(rts_mkPtr) \ + SymI_HasProto(rts_mkFunPtr) \ + SymI_HasProto(rts_mkStablePtr) \ + SymI_HasProto(rts_mkString) \ + SymI_HasProto(rts_mkWord) \ + SymI_HasProto(rts_mkWord8) \ + SymI_HasProto(rts_mkWord16) \ + SymI_HasProto(rts_mkWord32) \ + SymI_HasProto(rts_mkWord64) \ + SymI_HasProto(rts_unlock) \ + SymI_HasProto(rtsSupportsBoundThreads) \ + SymI_HasProto(__hscore_get_saved_termios) \ + SymI_HasProto(__hscore_set_saved_termios) \ + SymI_HasProto(setProgArgv) \ + SymI_HasProto(startupHaskell) \ + SymI_HasProto(shutdownHaskell) \ + SymI_HasProto(shutdownHaskellAndExit) \ + SymI_HasProto(stable_ptr_table) \ + SymI_HasProto(stackOverflow) \ + SymI_HasProto(stg_CAF_BLACKHOLE_info) \ + SymI_HasProto(awakenBlockedQueue) \ + SymI_HasProto(startTimer) \ + SymI_HasProto(stg_CHARLIKE_closure) \ + SymI_HasProto(stg_MVAR_CLEAN_info) \ + SymI_HasProto(stg_MVAR_DIRTY_info) \ + SymI_HasProto(stg_IND_STATIC_info) \ + SymI_HasProto(stg_INTLIKE_closure) \ + SymI_HasProto(stg_MUT_ARR_PTRS_DIRTY_info) \ + SymI_HasProto(stg_MUT_ARR_PTRS_FROZEN_info) \ + SymI_HasProto(stg_MUT_ARR_PTRS_FROZEN0_info) \ + SymI_HasProto(stg_WEAK_info) \ + SymI_HasProto(stg_ap_v_info) \ + SymI_HasProto(stg_ap_f_info) \ + SymI_HasProto(stg_ap_d_info) \ + SymI_HasProto(stg_ap_l_info) \ + SymI_HasProto(stg_ap_n_info) \ + SymI_HasProto(stg_ap_p_info) \ + SymI_HasProto(stg_ap_pv_info) \ + SymI_HasProto(stg_ap_pp_info) \ + SymI_HasProto(stg_ap_ppv_info) \ + SymI_HasProto(stg_ap_ppp_info) \ + SymI_HasProto(stg_ap_pppv_info) \ + SymI_HasProto(stg_ap_pppp_info) \ + SymI_HasProto(stg_ap_ppppp_info) \ + SymI_HasProto(stg_ap_pppppp_info) \ + SymI_HasProto(stg_ap_0_fast) \ + SymI_HasProto(stg_ap_v_fast) \ + SymI_HasProto(stg_ap_f_fast) \ + SymI_HasProto(stg_ap_d_fast) \ + SymI_HasProto(stg_ap_l_fast) \ + SymI_HasProto(stg_ap_n_fast) \ + SymI_HasProto(stg_ap_p_fast) \ + SymI_HasProto(stg_ap_pv_fast) \ + SymI_HasProto(stg_ap_pp_fast) \ + SymI_HasProto(stg_ap_ppv_fast) \ + SymI_HasProto(stg_ap_ppp_fast) \ + SymI_HasProto(stg_ap_pppv_fast) \ + SymI_HasProto(stg_ap_pppp_fast) \ + SymI_HasProto(stg_ap_ppppp_fast) \ + SymI_HasProto(stg_ap_pppppp_fast) \ + SymI_HasProto(stg_ap_1_upd_info) \ + SymI_HasProto(stg_ap_2_upd_info) \ + SymI_HasProto(stg_ap_3_upd_info) \ + SymI_HasProto(stg_ap_4_upd_info) \ + SymI_HasProto(stg_ap_5_upd_info) \ + SymI_HasProto(stg_ap_6_upd_info) \ + SymI_HasProto(stg_ap_7_upd_info) \ + SymI_HasProto(stg_exit) \ + SymI_HasProto(stg_sel_0_upd_info) \ + SymI_HasProto(stg_sel_10_upd_info) \ + SymI_HasProto(stg_sel_11_upd_info) \ + SymI_HasProto(stg_sel_12_upd_info) \ + SymI_HasProto(stg_sel_13_upd_info) \ + SymI_HasProto(stg_sel_14_upd_info) \ + SymI_HasProto(stg_sel_15_upd_info) \ + SymI_HasProto(stg_sel_1_upd_info) \ + SymI_HasProto(stg_sel_2_upd_info) \ + SymI_HasProto(stg_sel_3_upd_info) \ + SymI_HasProto(stg_sel_4_upd_info) \ + SymI_HasProto(stg_sel_5_upd_info) \ + SymI_HasProto(stg_sel_6_upd_info) \ + SymI_HasProto(stg_sel_7_upd_info) \ + SymI_HasProto(stg_sel_8_upd_info) \ + SymI_HasProto(stg_sel_9_upd_info) \ + SymI_HasProto(stg_upd_frame_info) \ + SymI_HasProto(suspendThread) \ + SymI_HasProto(takeMVarzh_fast) \ + SymI_HasProto(threadStatuszh_fast) \ + SymI_HasProto(timesIntegerzh_fast) \ + SymI_HasProto(tryPutMVarzh_fast) \ + SymI_HasProto(tryTakeMVarzh_fast) \ + SymI_HasProto(unblockAsyncExceptionszh_fast) \ + SymI_HasProto(unloadObj) \ + SymI_HasProto(unsafeThawArrayzh_fast) \ + SymI_HasProto(waitReadzh_fast) \ + SymI_HasProto(waitWritezh_fast) \ + SymI_HasProto(word2Integerzh_fast) \ + SymI_HasProto(writeTVarzh_fast) \ + SymI_HasProto(xorIntegerzh_fast) \ + SymI_HasProto(yieldzh_fast) \ + SymI_NeedsProto(stg_interp_constr_entry) \ + SymI_HasProto(allocateExec) \ + SymI_HasProto(freeExec) \ + SymI_HasProto(getAllocations) \ + SymI_HasProto(revertCAFs) \ + SymI_HasProto(RtsFlags) \ + SymI_NeedsProto(rts_breakpoint_io_action) \ + SymI_NeedsProto(rts_stop_next_breakpoint) \ + SymI_NeedsProto(rts_stop_on_exception) \ + SymI_HasProto(stopTimer) \ + SymI_HasProto(n_capabilities) \ RTS_USER_SIGNALS_SYMBOLS #ifdef SUPPORT_LONG_LONGS -#define RTS_LONG_LONG_SYMS \ - SymX(int64ToIntegerzh_fast) \ - SymX(word64ToIntegerzh_fast) +#define RTS_LONG_LONG_SYMS \ + SymI_HasProto(int64ToIntegerzh_fast) \ + SymI_HasProto(word64ToIntegerzh_fast) #else #define RTS_LONG_LONG_SYMS /* nothing */ #endif // 64-bit support functions in libgcc.a #if defined(__GNUC__) && SIZEOF_VOID_P <= 4 -#define RTS_LIBGCC_SYMBOLS \ - Sym(__divdi3) \ - Sym(__udivdi3) \ - Sym(__moddi3) \ - Sym(__umoddi3) \ - Sym(__muldi3) \ - Sym(__ashldi3) \ - Sym(__ashrdi3) \ - Sym(__lshrdi3) \ - Sym(__eprintf) +#define RTS_LIBGCC_SYMBOLS \ + SymI_NeedsProto(__divdi3) \ + SymI_NeedsProto(__udivdi3) \ + SymI_NeedsProto(__moddi3) \ + SymI_NeedsProto(__umoddi3) \ + SymI_NeedsProto(__muldi3) \ + SymI_NeedsProto(__ashldi3) \ + SymI_NeedsProto(__ashrdi3) \ + SymI_NeedsProto(__lshrdi3) \ + SymI_NeedsProto(__eprintf) #elif defined(ia64_HOST_ARCH) -#define RTS_LIBGCC_SYMBOLS \ - Sym(__divdi3) \ - Sym(__udivdi3) \ - Sym(__moddi3) \ - Sym(__umoddi3) \ - Sym(__divsf3) \ - Sym(__divdf3) +#define RTS_LIBGCC_SYMBOLS \ + SymI_NeedsProto(__divdi3) \ + SymI_NeedsProto(__udivdi3) \ + SymI_NeedsProto(__moddi3) \ + SymI_NeedsProto(__umoddi3) \ + SymI_NeedsProto(__divsf3) \ + SymI_NeedsProto(__divdf3) #else #define RTS_LIBGCC_SYMBOLS #endif @@ -807,19 +846,21 @@ typedef struct _RtsSymbolVal { // on Mac OS X. They have to receive special treatment, // see machoInitSymbolsWithoutUnderscore() #define RTS_MACHO_NOUNDERLINE_SYMBOLS \ - Sym(saveFP) \ - Sym(restFP) + SymI_NeedsProto(saveFP) \ + SymI_NeedsProto(restFP) #endif /* entirely bogus claims about types of these symbols */ -#define Sym(vvv) extern void vvv(void); +#define SymI_NeedsProto(vvv) extern void vvv(void); #if defined(__PIC__) && defined(mingw32_TARGET_OS) -#define SymExtern(vvv) extern void _imp__ ## vvv (void); +#define SymE_HasProto(vvv) SymE_HasProto(vvv); +#define SymE_NeedsProto(vvv) extern void _imp__ ## vvv (void); #else -#define SymExtern(vvv) SymX(vvv) +#define SymE_NeedsProto(vvv) SymI_NeedsProto(vvv); +#define SymE_HasProto(vvv) SymI_HasProto(vvv) #endif -#define SymX(vvv) /**/ -#define SymX_redirect(vvv,xxx) /**/ +#define SymI_HasProto(vvv) /**/ +#define SymI_HasProto_redirect(vvv,xxx) /**/ RTS_SYMBOLS RTS_RET_SYMBOLS RTS_LONG_LONG_SYMS @@ -828,10 +869,12 @@ RTS_MINGW_ONLY_SYMBOLS RTS_CYGWIN_ONLY_SYMBOLS RTS_DARWIN_ONLY_SYMBOLS RTS_LIBGCC_SYMBOLS -#undef Sym -#undef SymX -#undef SymX_redirect -#undef SymExtern +RTS_LIBFFI_SYMBOLS +#undef SymI_NeedsProto +#undef SymI_HasProto +#undef SymI_HasProto_redirect +#undef SymE_HasProto +#undef SymE_NeedsProto #ifdef LEADING_UNDERSCORE #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s) @@ -839,15 +882,17 @@ RTS_LIBGCC_SYMBOLS #define MAYBE_LEADING_UNDERSCORE_STR(s) (s) #endif -#define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ +#define SymI_HasProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ (void*)(&(vvv)) }, -#define SymX(vvv) Sym(vvv) -#define SymExtern(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ +#define SymE_HasProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ (void*)DLL_IMPORT_DATA_REF(vvv) }, -// SymX_redirect allows us to redirect references to one symbol to +#define SymI_NeedsProto(vvv) SymI_HasProto(vvv) +#define SymE_NeedsProto(vvv) SymE_HasProto(vvv) + +// SymI_HasProto_redirect allows us to redirect references to one symbol to // another symbol. See newCAF/newDynCAF for an example. -#define SymX_redirect(vvv,xxx) \ +#define SymI_HasProto_redirect(vvv,xxx) \ { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ (void*)(&(xxx)) }, @@ -860,6 +905,7 @@ static RtsSymbolVal rtsSyms[] = { RTS_CYGWIN_ONLY_SYMBOLS RTS_DARWIN_ONLY_SYMBOLS RTS_LIBGCC_SYMBOLS + RTS_LIBFFI_SYMBOLS #if defined(darwin_HOST_OS) && defined(i386_HOST_ARCH) // dyld stub code contains references to this, // but it should never be called because we treat @@ -993,7 +1039,9 @@ addDLL( char *dll_name ) initLinker(); - hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL); + // omitted: RTLD_NOW + // see http://www.haskell.org/pipermail/cvs-ghc/2007-September/038570.html + hdl= dlopen(dll_name, RTLD_LAZY | RTLD_GLOBAL); if (hdl == NULL) { /* dlopen failed; return a ptr to the error msg. */ @@ -1036,14 +1084,19 @@ addDLL( char *dll_name ) sprintf(buf, "%s.DLL", dll_name); instance = LoadLibrary(buf); if (instance == NULL) { - sprintf(buf, "%s.DRV", dll_name); // KAA: allow loading of drivers (like winspool.drv) - instance = LoadLibrary(buf); - if (instance == NULL) { - stgFree(buf); - - /* LoadLibrary failed; return a ptr to the error msg. */ - return "addDLL: unknown error"; - } + if (GetLastError() != ERROR_MOD_NOT_FOUND) goto error; + // KAA: allow loading of drivers (like winspool.drv) + sprintf(buf, "%s.DRV", dll_name); + instance = LoadLibrary(buf); + if (instance == NULL) { + if (GetLastError() != ERROR_MOD_NOT_FOUND) goto error; + // #1883: allow loading of unix-style libfoo.dll DLLs + sprintf(buf, "lib%s.DLL", dll_name); + instance = LoadLibrary(buf); + if (instance == NULL) { + goto error; + } + } } stgFree(buf); @@ -1056,6 +1109,14 @@ addDLL( char *dll_name ) opened_dlls = o_dll; return NULL; + +error: + stgFree(buf); + sysErrorBelch(dll_name); + + /* LoadLibrary failed; return a ptr to the error msg. */ + return "addDLL: could not load DLL"; + # else barf("addDLL: not implemented on this platform"); # endif @@ -1148,23 +1209,6 @@ lookupSymbol( char *lbl ) } } -static -__attribute((unused)) -void * -lookupLocalSymbol( ObjectCode* oc, char *lbl ) -{ - void *val; - initLinker() ; - val = lookupStrHashTable(oc->lochash, lbl); - - if (val == NULL) { - return NULL; - } else { - return val; - } -} - - /* ----------------------------------------------------------------------------- * Debugging aid: look in GHCi's object symbol tables for symbols * within DELTA bytes of the specified address, and show their names. @@ -1186,11 +1230,7 @@ void ghci_enquire ( char* addr ) for (i = 0; i < oc->n_symbols; i++) { sym = oc->symbols[i]; if (sym == NULL) continue; - // debugBelch("enquire %p %p\n", sym, oc->lochash); a = NULL; - if (oc->lochash != NULL) { - a = lookupStrHashTable(oc->lochash, sym); - } if (a == NULL) { a = lookupStrHashTable(symhash, sym); } @@ -1275,7 +1315,6 @@ loadObj( char *path ) oc->fileSize = st.st_size; oc->symbols = NULL; oc->sections = NULL; - oc->lochash = allocStrHashTable(); oc->proddables = NULL; /* chain it onto the list of objects */ @@ -1484,9 +1523,6 @@ unloadObj( char *path ) stgFree(oc->fileName); stgFree(oc->symbols); stgFree(oc->sections); - /* The local hash table should have been freed at the end - of the ocResolve_ call on it. */ - ASSERT(oc->lochash == NULL); stgFree(oc); return 1; } @@ -1595,47 +1631,36 @@ static int ocAllocateSymbolExtras( ObjectCode* oc, int count, int first ) aligned = (oc->fileSize + 3) & ~3; #ifdef USE_MMAP - #ifndef linux_HOST_OS /* mremap is a linux extension */ - #error ocAllocateSymbolExtras doesnt want USE_MMAP to be defined - #endif - pagesize = getpagesize(); n = ROUND_UP( oc->fileSize, pagesize ); m = ROUND_UP( aligned + sizeof (SymbolExtra) * count, pagesize ); - /* If we have a half-page-size file and map one page of it then - * the part of the page after the size of the file remains accessible. - * If, however, we map in 2 pages, the 2nd page is not accessible - * and will give a "Bus Error" on access. To get around this, we check - * if we need any extra pages for the jump islands and map them in - * anonymously. We must check that we actually require extra pages - * otherwise the attempt to mmap 0 pages of anonymous memory will - * fail -EINVAL. + /* we try to use spare space at the end of the last page of the + * image for the jump islands, but if there isn't enough space + * then we have to map some (anonymously, remembering MAP_32BIT). */ - - if( m > n ) + if( m > n ) // we need to allocate more pages { - /* The effect of this mremap() call is only the ensure that we have - * a sufficient number of virtually contiguous pages. As returned from - * mremap, the pages past the end of the file are not backed. We give - * them a backing by using MAP_FIXED to map in anonymous pages. - */ - oc->image = mremap( oc->image, n, m, MREMAP_MAYMOVE ); - - if( oc->image == MAP_FAILED ) - { - errorBelch( "Unable to mremap for Jump Islands\n" ); - return 0; - } - - if( mmap( oc->image + n, m - n, PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0 ) == MAP_FAILED ) - { - errorBelch( "Unable to mmap( MAP_FIXED ) for Jump Islands\n" ); - return 0; - } + oc->symbol_extras = mmap (NULL, sizeof(SymbolExtra) * count, + PROT_EXEC|PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS|EXTRA_MAP_FLAGS, + 0, 0); + if (oc->symbol_extras == MAP_FAILED) + { + errorBelch( "Unable to mmap() for jump islands\n" ); + return 0; + } +#ifdef x86_64_HOST_ARCH + if ((StgWord)oc->symbol_extras > 0x80000000) + { + barf("mmap() returned memory outside 2Gb"); + } +#endif + } + else + { + oc->symbol_extras = (SymbolExtra *) (oc->image + aligned); } - #else oc->image -= misalignment; oc->image = stgReallocBytes( oc->image, @@ -1643,9 +1668,10 @@ static int ocAllocateSymbolExtras( ObjectCode* oc, int count, int first ) aligned + sizeof (SymbolExtra) * count, "ocAllocateSymbolExtras" ); oc->image += misalignment; -#endif /* USE_MMAP */ oc->symbol_extras = (SymbolExtra *) (oc->image + aligned); +#endif /* USE_MMAP */ + memset( oc->symbol_extras, 0, sizeof (SymbolExtra) * count ); } else @@ -2285,6 +2311,8 @@ ocGetNames_PEi386 ( ObjectCode* oc ) && 0 != strcmp(".ctors", sectab_i->Name) /* ignore section generated from .ident */ && 0!= strcmp("/4", sectab_i->Name) + /* ignore unknown section that appeared in gcc 3.4.5(?) */ + && 0!= strcmp(".reloc", sectab_i->Name) ) { errorBelch("Unknown PEi386 section name `%s' (while processing: %s)", sectab_i->Name, oc->fileName); return 0; @@ -2502,13 +2530,9 @@ ocResolve_PEi386 ( ObjectCode* oc ) + sym->Value); } else { copyName ( sym->Name, strtab, symbol, 1000-1 ); - S = (UInt32) lookupLocalSymbol( oc, symbol ); - if ((void*)S != NULL) goto foundit; S = (UInt32) lookupSymbol( symbol ); if ((void*)S != NULL) goto foundit; zapTrailingAtSign ( symbol ); - S = (UInt32) lookupLocalSymbol( oc, symbol ); - if ((void*)S != NULL) goto foundit; S = (UInt32) lookupSymbol( symbol ); if ((void*)S != NULL) goto foundit; /* Newline first because the interactive linker has printed "linking..." */ @@ -3136,7 +3160,7 @@ ocGetNames_ELF ( ObjectCode* oc ) if (ELF_ST_TYPE(stab[j].st_info) == STT_FUNC) ad = (char *)allocateFunctionDesc((Elf_Addr)ad); #endif - IF_DEBUG(linker,debugBelch( "addOTabName(GLOB): %10p %s %s", + IF_DEBUG(linker,debugBelch( "addOTabName(GLOB): %10p %s %s\n", ad, oc->fileName, nm )); isLocal = FALSE; } @@ -3598,10 +3622,6 @@ ocResolve_ELF ( ObjectCode* oc ) } } - /* Free the local symbol table; we won't need it again. */ - freeHashTable(oc->lochash, NULL); - oc->lochash = NULL; - #if defined(powerpc_HOST_ARCH) ocFlushInstructionCache( oc ); #endif @@ -3880,8 +3900,6 @@ static int resolveImports( if((symbol->n_type & N_TYPE) == N_UNDF && (symbol->n_type & N_EXT) && (symbol->n_value != 0)) addr = (void*) (symbol->n_value); - else if((addr = lookupLocalSymbol(oc,nm)) != NULL) - ; else addr = lookupSymbol(nm); if(!addr) @@ -4528,10 +4546,6 @@ static int ocResolve_MachO(ObjectCode* oc) return 0; } - /* Free the local symbol table; we won't need it again. */ - freeHashTable(oc->lochash, NULL); - oc->lochash = NULL; - #if defined (powerpc_HOST_ARCH) ocFlushInstructionCache( oc ); #endif @@ -4556,7 +4570,7 @@ static void machoInitSymbolsWithoutUnderscore() __asm__ volatile(".globl _symbolsWithoutUnderscore\n.data\n_symbolsWithoutUnderscore:"); #undef Sym -#define Sym(x) \ +#define SymI_NeedsProto(x) \ __asm__ volatile(".long " # x); RTS_MACHO_NOUNDERLINE_SYMBOLS @@ -4564,7 +4578,7 @@ static void machoInitSymbolsWithoutUnderscore() __asm__ volatile(".text"); #undef Sym -#define Sym(x) \ +#define SymI_NeedsProto(x) \ ghciInsertStrHashTable("(GHCi built-in symbols)", symhash, #x, *p++); RTS_MACHO_NOUNDERLINE_SYMBOLS