Remove __encodeDouble and __encodeFloat from the rts
[ghc-hetmet.git] / rts / Linker.c
index f1534e9..283103f 100644 (file)
@@ -26,7 +26,7 @@
 #include "RtsUtils.h"
 #include "Schedule.h"
 #include "Sparks.h"
-#include "RtsTypeable.h"
+#include "RtsGlobals.h"
 #include "Timer.h"
 #include "Trace.h"
 
@@ -205,7 +205,7 @@ static void machoInitSymbolsWithoutUnderscore( void );
 #define MMAP_32BIT_BASE_DEFAULT 0x40000000
 #endif
 
-static void *mmap_32bit_base = MMAP_32BIT_BASE_DEFAULT;
+static void *mmap_32bit_base = (void *)MMAP_32BIT_BASE_DEFAULT;
 #endif
 
 /* MAP_ANONYMOUS is MAP_ANON on some systems, e.g. OpenBSD */
@@ -222,15 +222,10 @@ typedef struct _RtsSymbolVal {
     void   *addr;
 } RtsSymbolVal;
 
-#if !defined(PAR)
 #define Maybe_Stable_Names      SymI_HasProto(mkWeakzh_fast)                   \
                                SymI_HasProto(mkWeakForeignEnvzh_fast)          \
                                SymI_HasProto(makeStableNamezh_fast)            \
                                SymI_HasProto(finalizzeWeakzh_fast)
-#else
-/* These are not available in GUM!!! -- HWL */
-#define Maybe_Stable_Names
-#endif
 
 #if !defined (mingw32_HOST_OS)
 #define RTS_POSIX_ONLY_SYMBOLS                  \
@@ -595,8 +590,6 @@ typedef struct _RtsSymbolVal {
       SymI_HasProto(OnExitHook)                                \
       SymI_HasProto(OutOfHeapHook)                     \
       SymI_HasProto(StackOverflowHook)                 \
-      SymI_HasProto(__encodeDouble)                    \
-      SymI_HasProto(__encodeFloat)                     \
       SymI_HasProto(addDLL)                            \
       GMP_SYMS                                         \
       SymI_HasProto(__int_encodeDouble)                        \
@@ -609,6 +602,7 @@ typedef struct _RtsSymbolVal {
       SymI_HasProto(barf)                              \
       SymI_HasProto(debugBelch)                                \
       SymI_HasProto(errorBelch)                                \
+      SymI_HasProto(sysErrorBelch)                      \
       SymI_HasProto(asyncExceptionsBlockedzh_fast)     \
       SymI_HasProto(blockAsyncExceptionszh_fast)       \
       SymI_HasProto(catchzh_fast)                      \
@@ -622,7 +616,6 @@ typedef struct _RtsSymbolVal {
       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)                      \
@@ -639,6 +632,7 @@ typedef struct _RtsSymbolVal {
       SymI_HasProto(freeHaskellFunctionPtr)            \
       SymI_HasProto(freeStablePtr)                     \
       SymI_HasProto(getOrSetTypeableStore)             \
+      SymI_HasProto(getOrSetSignalHandlerStore)                \
       SymI_HasProto(gcdIntegerzh_fast)                 \
       SymI_HasProto(gcdIntegerIntzh_fast)              \
       SymI_HasProto(gcdIntzh_fast)                     \
@@ -655,6 +649,7 @@ typedef struct _RtsSymbolVal {
       SymI_HasProto(hs_free_stable_ptr)                        \
       SymI_HasProto(hs_free_fun_ptr)                   \
       SymI_HasProto(hs_hpc_rootModule)                 \
+      SymI_HasProto(hs_hpc_module)                     \
       SymI_HasProto(initLinker)                                \
       SymI_HasProto(unpackClosurezh_fast)               \
       SymI_HasProto(getApStackValzh_fast)               \
@@ -1052,6 +1047,16 @@ initLinker( void )
         mmap_32bit_base = (void*)RtsFlags.MiscFlags.linkerMemBase;
     }
 #endif
+
+#if defined(mingw32_HOST_OS)
+    /*
+     * These two libraries cause problems when added to the static link,
+     * but are necessary for resolving symbols in GHCi, hence we load
+     * them manually here.
+     */
+    addDLL("msvcrt");
+    addDLL("kernel32");
+#endif
 }
 
 /* -----------------------------------------------------------------------------
@@ -3531,17 +3536,26 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
             w1 |= w2;
             *pP = w1;
             break;
+
          /* According to the Sun documentation:
             R_SPARC_UA32
             This relocation type resembles R_SPARC_32, except it refers to an
             unaligned word. That is, the word to be relocated must be treated
             as four separate bytes with arbitrary alignment, not as a word
             aligned according to the architecture requirements.
-
-            (JRS: which means that freeloading on the R_SPARC_32 case
-            is probably wrong, but hey ...)
          */
          case R_SPARC_UA32:
+            w2 = (Elf_Word)value;
+
+            // SPARC doesn't do misaligned writes of 32 bit words,
+           //       so we have to do this one byte-at-a-time.
+           char *pPc   = (char*)pP;
+           pPc[0]      = (char) ((Elf_Word)(w2 & 0xff000000) >> 24);
+           pPc[1]      = (char) ((Elf_Word)(w2 & 0x00ff0000) >> 16);
+           pPc[2]      = (char) ((Elf_Word)(w2 & 0x0000ff00) >> 8);
+           pPc[3]      = (char) ((Elf_Word)(w2 & 0x000000ff));
+           break;
+
          case R_SPARC_32:
             w2 = (Elf_Word)value;
             *pP = w2;
@@ -4096,7 +4110,9 @@ static int relocateSection(
         
         char    *thingPtr = image + sect->offset + reloc->r_address;
         uint64_t thing;
-        uint64_t value;
+        /* We shouldn't need to initialise this, but gcc on OS X 64 bit
+           complains that it may be used uninitialized if we don't */
+        uint64_t value = 0;
         uint64_t baseValue;
         int type = reloc->r_type;