Extend ModBreaks with the srcspan's of the enclosing expressions
[ghc-hetmet.git] / rts / Linker.c
index 65305f3..2d50280 100644 (file)
@@ -477,12 +477,12 @@ typedef struct _RtsSymbolVal {
       SymX(__encodeDouble)                     \
       SymX(__encodeFloat)                      \
       SymX(addDLL)                             \
-      SymX(__gmpn_gcd_1)                       \
-      SymX(__gmpz_cmp)                         \
-      SymX(__gmpz_cmp_si)                      \
-      SymX(__gmpz_cmp_ui)                      \
-      SymX(__gmpz_get_si)                      \
-      SymX(__gmpz_get_ui)                      \
+      SymExtern(__gmpn_gcd_1)                  \
+      SymExtern(__gmpz_cmp)                    \
+      SymExtern(__gmpz_cmp_si)                 \
+      SymExtern(__gmpz_cmp_ui)                 \
+      SymExtern(__gmpz_get_si)                 \
+      SymExtern(__gmpz_get_ui)                 \
       SymX(__int_encodeDouble)                 \
       SymX(__int_encodeFloat)                  \
       SymX(andIntegerzh_fast)                  \
@@ -523,6 +523,7 @@ typedef struct _RtsSymbolVal {
       SymX(genSymZh)                           \
       SymX(genericRaise)                       \
       SymX(getProgArgv)                                \
+      SymX(getFullProgArgv)                            \
       SymX(getStablePtr)                       \
       SymX(hs_init)                            \
       SymX(hs_exit)                            \
@@ -718,6 +719,8 @@ typedef struct _RtsSymbolVal {
       SymX(revertCAFs)                          \
       SymX(RtsFlags)                            \
       SymX(rts_breakpoint_io_action)           \
+      SymX(rts_stop_next_breakpoint)           \
+      SymX(rts_stop_on_exception)              \
       RTS_USER_SIGNALS_SYMBOLS
 
 #ifdef SUPPORT_LONG_LONGS
@@ -763,6 +766,11 @@ typedef struct _RtsSymbolVal {
 
 /* entirely bogus claims about types of these symbols */
 #define Sym(vvv)  extern void vvv(void);
+#if defined(__PIC__) && defined(mingw32_TARGET_OS)
+#define SymExtern(vvv)  extern void _imp__ ## vvv (void);
+#else
+#define SymExtern(vvv)  SymX(vvv)
+#endif
 #define SymX(vvv) /**/
 #define SymX_redirect(vvv,xxx) /**/
 RTS_SYMBOLS
@@ -776,6 +784,7 @@ RTS_LIBGCC_SYMBOLS
 #undef Sym
 #undef SymX
 #undef SymX_redirect
+#undef SymExtern
 
 #ifdef LEADING_UNDERSCORE
 #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s)
@@ -786,6 +795,8 @@ RTS_LIBGCC_SYMBOLS
 #define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
                     (void*)(&(vvv)) },
 #define SymX(vvv) Sym(vvv)
+#define SymExtern(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
+           (void*)DLL_IMPORT_DATA_REF(vvv) },
 
 // SymX_redirect allows us to redirect references to one symbol to
 // another symbol.  See newCAF/newDynCAF for an example.
@@ -2523,13 +2534,16 @@ ocResolve_PEi386 ( ObjectCode* oc )
 #endif
 
 #if !defined(openbsd_HOST_OS)
-#include <elf.h>
+#  include <elf.h>
+#  ifndef R_X86_64_PC64     /* If elf.h doesn't define it */
+#    define R_X86_64_PC64 24
+#  endif
 #else
 /* openbsd elf has things in different places, with diff names */
-#include <elf_abi.h>
-#include <machine/reloc.h>
-#define R_386_32    RELOC_32
-#define R_386_PC32  RELOC_PC32
+#  include <elf_abi.h>
+#  include <machine/reloc.h>
+#  define R_386_32    RELOC_32
+#  define R_386_PC32  RELOC_PC32
 #endif
 
 /*
@@ -3473,6 +3487,13 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
          break;
       }
 
+      case R_X86_64_PC64:
+      {
+         StgInt64 off = value - P;
+         *(Elf64_Word *)P = (Elf64_Word)off;
+         break;
+      }
+
       case R_X86_64_32:
          if (value >= 0x7fffffffL) {
              barf("R_X86_64_32 relocation out of range: %s = %p\n",