[project @ 2001-01-10 17:19:01 by sewardj]
[ghc-hetmet.git] / ghc / rts / Linker.c
index cbe069d..7bfc7c6 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Linker.c,v 1.1 2000/10/06 15:33:27 simonmar Exp $
+ * $Id: Linker.c,v 1.7 2001/01/10 17:21:18 sewardj Exp $
  *
  * (c) The GHC Team, 2000
  *
@@ -21,6 +21,8 @@
 /* ToDo: configure this */
 #include <dlfcn.h>
 
+#ifdef GHCI /* endif is right at end of file */
+
 /* A bucket in the symbol hash-table.  Primarily, maps symbol names to
  * absolute addresses.  All symbols from a given module are linked
  * together, so they can be freed at the same time.  There's also a
@@ -105,32 +107,36 @@ static int ocResolve_PEi386     ( ObjectCode* oc );
       Sym(stg_gen_chk)                         \
       SymX(stg_exit)                           \
       SymX(stg_update_PAP)                     \
-      SymX(__ap_2_upd_info)                    \
-      SymX(__ap_3_upd_info)                    \
-      SymX(__ap_4_upd_info)                    \
-      SymX(__ap_5_upd_info)                    \
-      SymX(__ap_6_upd_info)                    \
-      SymX(__ap_7_upd_info)                    \
-      SymX(__ap_8_upd_info)                    \
-      SymX(__sel_0_upd_info)                   \
-      SymX(__sel_1_upd_info)                   \
-      SymX(__sel_2_upd_info)                   \
-      SymX(__sel_3_upd_info)                   \
-      SymX(__sel_4_upd_info)                   \
-      SymX(__sel_5_upd_info)                   \
-      SymX(__sel_6_upd_info)                   \
-      SymX(__sel_7_upd_info)                   \
-      SymX(__sel_8_upd_info)                   \
-      SymX(__sel_9_upd_info)                   \
-      SymX(__sel_10_upd_info)                  \
-      SymX(__sel_11_upd_info)                  \
-      SymX(__sel_12_upd_info)                  \
-      SymX(upd_frame_info)                     \
-      SymX(seq_frame_info)                     \
-      SymX(CAF_BLACKHOLE_info)                 \
-      SymX(IND_STATIC_info)                    \
-      SymX(EMPTY_MVAR_info)                    \
-      SymX(MUT_ARR_PTRS_FROZEN_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_ap_8_upd_info)                  \
+      SymX(stg_sel_0_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_sel_10_upd_info)                        \
+      SymX(stg_sel_11_upd_info)                        \
+      SymX(stg_sel_12_upd_info)                        \
+      SymX(stg_upd_frame_info)                 \
+      SymX(stg_seq_frame_info)                 \
+      SymX(stg_CAF_BLACKHOLE_info)             \
+      SymX(stg_IND_STATIC_info)                        \
+      SymX(stg_EMPTY_MVAR_info)                        \
+      SymX(stg_MUT_ARR_PTRS_FROZEN_info)       \
+      SymX(stg_WEAK_info)                       \
+      SymX(stg_CHARLIKE_closure)               \
+      SymX(stg_INTLIKE_closure)                        \
+      SymX(stg_CAF_UNENTERED_entry)            \
       SymX(newCAF)                             \
       SymX(putMVarzh_fast)                     \
       SymX(newMVarzh_fast)                     \
@@ -138,45 +144,25 @@ static int ocResolve_PEi386     ( ObjectCode* oc );
       SymX(tryTakeMVarzh_fast)                 \
       SymX(catchzh_fast)                       \
       SymX(raisezh_fast)                       \
+      SymX(forkzh_fast)                                \
       SymX(delayzh_fast)                       \
       SymX(yieldzh_fast)                       \
       SymX(killThreadzh_fast)                  \
       SymX(waitReadzh_fast)                    \
       SymX(waitWritezh_fast)                   \
-      SymX(CHARLIKE_closure)                   \
-      SymX(INTLIKE_closure)                    \
       SymX(suspendThread)                      \
       SymX(resumeThread)                       \
       SymX(stackOverflow)                      \
       SymX(int2Integerzh_fast)                 \
-      SymX(ErrorHdrHook)                       \
+      SymX(word2Integerzh_fast)                        \
       SymX(mkForeignObjzh_fast)                        \
       SymX(__encodeDouble)                     \
       SymX(decodeDoublezh_fast)                        \
-      SymX(isDoubleNaN)                                \
-      SymX(isDoubleInfinite)                   \
-      SymX(isDoubleDenormalized)               \
-      SymX(isDoubleNegativeZero)               \
-      SymX(__encodeFloat)                      \
       SymX(decodeFloatzh_fast)                 \
-      SymX(isFloatNaN)                         \
-      SymX(isFloatInfinite)                    \
-      SymX(isFloatDenormalized)                        \
-      SymX(isFloatNegativeZero)                        \
-      SymX(__int_encodeFloat)                  \
-      SymX(__int_encodeDouble)                 \
-      SymX(__gmpz_cmp_si)                      \
-      SymX(__gmpz_cmp)                         \
-      SymX(__gmpn_gcd_1)                       \
       SymX(gcdIntegerzh_fast)                  \
       SymX(newArrayzh_fast)                    \
       SymX(unsafeThawArrayzh_fast)             \
-      SymX(newDoubleArrayzh_fast)              \
-      SymX(newFloatArrayzh_fast)               \
-      SymX(newAddrArrayzh_fast)                        \
-      SymX(newWordArrayzh_fast)                        \
-      SymX(newIntArrayzh_fast)                 \
-      SymX(newCharArrayzh_fast)                        \
+      SymX(newByteArrayzh_fast)                        \
       SymX(newMutVarzh_fast)                   \
       SymX(quotRemIntegerzh_fast)              \
       SymX(quotIntegerzh_fast)                 \
@@ -186,7 +172,29 @@ static int ocResolve_PEi386     ( ObjectCode* oc );
       SymX(timesIntegerzh_fast)                        \
       SymX(minusIntegerzh_fast)                        \
       SymX(plusIntegerzh_fast)                 \
+      SymX(andIntegerzh_fast)                  \
+      SymX(orIntegerzh_fast)                   \
+      SymX(xorIntegerzh_fast)                  \
+      SymX(complementIntegerzh_fast)           \
       SymX(mkWeakzh_fast)                      \
+      SymX(makeStableNamezh_fast)              \
+      SymX(finalizzeWeakzh_fast)               \
+      SymX(blockAsyncExceptionszh_fast)                \
+      SymX(unblockAsyncExceptionszh_fast)      \
+      SymX(isDoubleNaN)                                \
+      SymX(isDoubleInfinite)                   \
+      SymX(isDoubleDenormalized)               \
+      SymX(isDoubleNegativeZero)               \
+      SymX(__encodeFloat)                      \
+      SymX(isFloatNaN)                         \
+      SymX(isFloatInfinite)                    \
+      SymX(isFloatDenormalized)                        \
+      SymX(isFloatNegativeZero)                        \
+      SymX(__int_encodeFloat)                  \
+      SymX(__int_encodeDouble)                 \
+      SymX(__gmpz_cmp_si)                      \
+      SymX(__gmpz_cmp)                         \
+      SymX(__gmpn_gcd_1)                       \
       SymX(prog_argv)                          \
       SymX(prog_argc)                          \
       SymX(resetNonBlockingFd)                 \
@@ -194,13 +202,65 @@ static int ocResolve_PEi386     ( ObjectCode* oc );
       SymX(stable_ptr_table)                   \
       SymX(shutdownHaskellAndExit)             \
       Sym(stg_enterStackTop)                   \
-      SymX(CAF_UNENTERED_entry)                        \
-      Sym(stg_yield_to_Hugs)                   \
+      Sym(stg_yield_to_interpreter)            \
       Sym(StgReturn)                           \
       Sym(init_stack)                          \
-      SymX(blockAsyncExceptionszh_fast)                \
-      SymX(unblockAsyncExceptionszh_fast)      \
-      Sym(__init_PrelGHC)
+      SymX(cmp_thread)                         \
+      Sym(__init_PrelGHC)                      \
+      SymX(freeHaskellFunctionPtr)             \
+      SymX(OnExitHook)                         \
+      SymX(ErrorHdrHook)                       \
+      SymX(NoRunnableThreadsHook)              \
+      SymX(StackOverflowHook)                  \
+      SymX(OutOfHeapHook)                      \
+      SymX(MallocFailHook)                     \
+      SymX(PatErrorHdrHook)                    \
+      SymX(defaultsHook)                       \
+      SymX(PreTraceHook)                       \
+      SymX(PostTraceHook)
+
+#ifndef SUPPORT_LONG_LONGS
+#define RTS_LONG_LONG_SYMS /* nothing */
+#else
+#define RTS_LONG_LONG_SYMS \
+      SymX(stg_gtWord64)                       \
+      SymX(stg_geWord64)                       \
+      SymX(stg_eqWord64)                       \
+      SymX(stg_neWord64)                       \
+      SymX(stg_ltWord64)                       \
+      SymX(stg_leWord64)                       \
+      SymX(stg_gtInt64)                                \
+      SymX(stg_geInt64)                                \
+      SymX(stg_eqInt64)                                \
+      SymX(stg_neInt64)                                \
+      SymX(stg_ltInt64)                                \
+      SymX(stg_leInt64)                                \
+      SymX(stg_remWord64)                      \
+      SymX(stg_quotWord64)                     \
+      SymX(stg_remInt64)                       \
+      SymX(stg_quotInt64)                      \
+      SymX(stg_negateInt64)                    \
+      SymX(stg_plusInt64)                      \
+      SymX(stg_minusInt64)                     \
+      SymX(stg_timesInt64)                     \
+      SymX(stg_and64)                          \
+      SymX(stg_or64)                           \
+      SymX(stg_xor64)                          \
+      SymX(stg_not64)                          \
+      SymX(stg_shiftL64)                       \
+      SymX(stg_shiftRL64)                      \
+      SymX(stg_iShiftL64)                      \
+      SymX(stg_iShiftRL64)                     \
+      SymX(stg_iShiftRA64)                     \
+      SymX(stg_intToInt64)                     \
+      SymX(stg_int64ToInt)                     \
+      SymX(stg_int64ToWord64)                  \
+      SymX(stg_wordToWord64)                   \
+      SymX(stg_word64ToWord)                   \
+      SymX(stg_word64ToInt64)                  \
+      SymX(int64ToIntegerzh_fast)              \
+      SymX(word64ToIntegerzh_fast)
+#endif /* SUPPORT_LONG_LONGS */
 
 /* entirely bogus claims about types of these symbols */
 #define Sym(vvv)  extern void (vvv);
@@ -221,6 +281,7 @@ RTS_SYMBOLS
 
 static SymbolVal rtsSyms[] = {
       RTS_SYMBOLS
+      RTS_LONG_LONG_SYMS
       { 0, 0 } /* sentinel */
 };
 
@@ -1406,7 +1467,7 @@ ocResolve_ELF ( ObjectCode* oc )
  * Used by the garbage collector when walking the stack.
  * -------------------------------------------------------------------------- */
 
-SectionKind
+static __inline__ SectionKind
 lookupSection ( void* addr )
 {
    int          i;
@@ -1426,7 +1487,7 @@ int
 is_dynamically_loaded_code_or_rodata_ptr ( char* p )
 {
    SectionKind sk = lookupSection(p);
-   assert (sk != SECTIONKIND_NOINFOAVAIL);
+   ASSERT (sk != SECTIONKIND_NOINFOAVAIL);
    return (sk == SECTIONKIND_CODE_OR_RODATA);
 }
 
@@ -1435,7 +1496,7 @@ int
 is_dynamically_loaded_rwdata_ptr ( char* p )
 {
    SectionKind sk = lookupSection(p);
-   assert (sk != SECTIONKIND_NOINFOAVAIL);
+   ASSERT (sk != SECTIONKIND_NOINFOAVAIL);
    return (sk == SECTIONKIND_RWDATA);
 }
 
@@ -1444,7 +1505,8 @@ int
 is_not_dynamically_loaded_ptr ( char* p )
 {
    SectionKind sk = lookupSection(p);
-   assert (sk != SECTIONKIND_NOINFOAVAIL);
+   ASSERT (sk != SECTIONKIND_NOINFOAVAIL);
    return (sk == SECTIONKIND_OTHER);
 }
 
+#endif /* GHCI */