summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLemmih <lemmih@gmail.com>2006-01-23 11:06:25 +0000
committerLemmih <lemmih@gmail.com>2006-01-23 11:06:25 +0000
commit65691f95b3727c277a24ec5f0d5a4058c9a681e2 (patch)
tree204d3fbcfd69ca9bab893d4d3ab55e26cb174308
parent95c7525626b8802ec21036a82037e933caf0b17f (diff)
downloadhaskell-65691f95b3727c277a24ec5f0d5a4058c9a681e2.tar.gz
Fix for feature request #655 (Loading the GHC library from GHCi.)
Moved the utility functions out of hschooks, avoided linking the GHC library with hschooks.o and added a couple of symbols to the linkers export list.
-rw-r--r--ghc/compiler/Makefile2
-rw-r--r--ghc/compiler/parser/cutils.c70
-rw-r--r--ghc/compiler/parser/cutils.h16
-rw-r--r--ghc/compiler/parser/hschooks.c36
-rw-r--r--ghc/compiler/parser/hschooks.h6
-rw-r--r--ghc/rts/Linker.c13
6 files changed, 100 insertions, 43 deletions
diff --git a/ghc/compiler/Makefile b/ghc/compiler/Makefile
index 97cd2c62a1..72985607a0 100644
--- a/ghc/compiler/Makefile
+++ b/ghc/compiler/Makefile
@@ -756,7 +756,7 @@ PKG_DEPENDS += base haskell98
PACKAGE_CPP_OPTS += -DPKG_DEPENDS='$(PKG_DEPENDS)'
# Omit Main from the library, the client will want to plug their own Main in
-LIBOBJS = $(filter-out $(odir)/main/Main.o, $(OBJS))
+LIBOBJS = $(filter-out $(odir)/main/Main.o $(odir)/parser/hschooks.o, $(OBJS))
# disable splitting: it won't really help with GHC, and the specialised
# build system for ghc/compiler isn't set up to handle it.
diff --git a/ghc/compiler/parser/cutils.c b/ghc/compiler/parser/cutils.c
new file mode 100644
index 0000000000..08832f298d
--- /dev/null
+++ b/ghc/compiler/parser/cutils.c
@@ -0,0 +1,70 @@
+/*
+These utility routines are used various
+places in the GHC library.
+*/
+
+/* For GHC 4.08, we are relying on the fact that RtsFlags has
+ * compatible layout with the current version, because we're
+ * #including the current version of RtsFlags.h below. 4.08 didn't
+ * ship with its own RtsFlags.h, unfortunately. For later GHC
+ * versions, we #include the correct RtsFlags.h.
+ */
+#if __GLASGOW_HASKELL__ < 502
+#include "../includes/Rts.h"
+#include "../includes/RtsFlags.h"
+#else
+#include "Rts.h"
+#include "RtsFlags.h"
+#endif
+
+#include "HsFFI.h"
+
+#include <string.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/*
+Calling 'strlen' and 'memcpy' directly gives problems with GCC's inliner,
+and causes gcc to require too many registers on x84
+*/
+
+HsInt
+ghc_strlen( HsAddr a )
+{
+ return (strlen((char *)a));
+}
+
+HsInt
+ghc_memcmp( HsAddr a1, HsAddr a2, HsInt len )
+{
+ return (memcmp((char *)a1, a2, len));
+}
+
+HsInt
+ghc_memcmp_off( HsAddr a1, HsInt i, HsAddr a2, HsInt len )
+{
+ return (memcmp((char *)a1 + i, a2, len));
+}
+
+void
+enableTimingStats( void ) /* called from the driver */
+{
+#if __GLASGOW_HASKELL__ >= 411
+ RtsFlags.GcFlags.giveStats = ONELINE_GC_STATS;
+#endif
+ /* ignored when bootstrapping with an older GHC */
+}
+
+void
+setHeapSize( HsInt size )
+{
+ RtsFlags.GcFlags.heapSizeSuggestion = size / BLOCK_SIZE;
+ if (RtsFlags.GcFlags.maxHeapSize != 0 &&
+ RtsFlags.GcFlags.heapSizeSuggestion > RtsFlags.GcFlags.maxHeapSize) {
+ RtsFlags.GcFlags.maxHeapSize = RtsFlags.GcFlags.heapSizeSuggestion;
+ }
+}
+
+
diff --git a/ghc/compiler/parser/cutils.h b/ghc/compiler/parser/cutils.h
new file mode 100644
index 0000000000..c7c1867ded
--- /dev/null
+++ b/ghc/compiler/parser/cutils.h
@@ -0,0 +1,16 @@
+/* -----------------------------------------------------------------------------
+ *
+ * Utility C functions.
+ *
+ * -------------------------------------------------------------------------- */
+
+#include "HsFFI.h"
+
+// Out-of-line string functions, see PrimPacked.lhs
+HsInt ghc_strlen( HsAddr a );
+HsInt ghc_memcmp( HsAddr a1, HsAddr a2, HsInt len );
+HsInt ghc_memcmp_off( HsAddr a1, HsInt i, HsAddr a2, HsInt len );
+
+
+void enableTimingStats( void );
+void setHeapSize( HsInt size );
diff --git a/ghc/compiler/parser/hschooks.c b/ghc/compiler/parser/hschooks.c
index 5c1f0236ac..f3e7447a49 100644
--- a/ghc/compiler/parser/hschooks.c
+++ b/ghc/compiler/parser/hschooks.c
@@ -39,25 +39,6 @@ defaultsHook (void)
}
void
-enableTimingStats( void ) /* called from the driver */
-{
-#if __GLASGOW_HASKELL__ >= 411
- RtsFlags.GcFlags.giveStats = ONELINE_GC_STATS;
-#endif
- /* ignored when bootstrapping with an older GHC */
-}
-
-void
-setHeapSize( HsInt size )
-{
- RtsFlags.GcFlags.heapSizeSuggestion = size / BLOCK_SIZE;
- if (RtsFlags.GcFlags.maxHeapSize != 0 &&
- RtsFlags.GcFlags.heapSizeSuggestion > RtsFlags.GcFlags.maxHeapSize) {
- RtsFlags.GcFlags.maxHeapSize = RtsFlags.GcFlags.heapSizeSuggestion;
- }
-}
-
-void
OutOfHeapHook (unsigned long request_size/* always zero these days */,
unsigned long heap_size)
/* both in bytes */
@@ -72,20 +53,3 @@ StackOverflowHook (unsigned long stack_size) /* in bytes */
fprintf(stderr, "GHC stack-space overflow: current limit is %ld bytes.\nUse the `-K<size>' option to increase it.\n", stack_size);
}
-HsInt
-ghc_strlen( HsAddr a )
-{
- return (strlen((char *)a));
-}
-
-HsInt
-ghc_memcmp( HsAddr a1, HsAddr a2, HsInt len )
-{
- return (memcmp((char *)a1, a2, len));
-}
-
-HsInt
-ghc_memcmp_off( HsAddr a1, HsInt i, HsAddr a2, HsInt len )
-{
- return (memcmp((char *)a1 + i, a2, len));
-}
diff --git a/ghc/compiler/parser/hschooks.h b/ghc/compiler/parser/hschooks.h
index c68b41e23b..4ce1c0f93d 100644
--- a/ghc/compiler/parser/hschooks.h
+++ b/ghc/compiler/parser/hschooks.h
@@ -6,10 +6,4 @@
* -------------------------------------------------------------------------- */
#include "HsFFI.h"
-void enableTimingStats( void );
-void setHeapSize( HsInt size );
-// Out-of-line string functions, see PrimPacked.lhs
-HsInt ghc_strlen( HsAddr a );
-HsInt ghc_memcmp( HsAddr a1, HsAddr a2, HsInt len );
-HsInt ghc_memcmp_off( HsAddr a1, HsInt i, HsAddr a2, HsInt len );
diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c
index ac3296fc24..87fda47c61 100644
--- a/ghc/rts/Linker.c
+++ b/ghc/rts/Linker.c
@@ -656,6 +656,19 @@ typedef struct _RtsSymbolVal {
SymX(writeTVarzh_fast) \
SymX(xorIntegerzh_fast) \
SymX(yieldzh_fast) \
+ SymX(stg_interp_constr_entry) \
+ SymX(stg_interp_constr1_entry) \
+ SymX(stg_interp_constr2_entry) \
+ SymX(stg_interp_constr3_entry) \
+ SymX(stg_interp_constr4_entry) \
+ SymX(stg_interp_constr5_entry) \
+ SymX(stg_interp_constr6_entry) \
+ SymX(stg_interp_constr7_entry) \
+ SymX(stg_interp_constr8_entry) \
+ SymX(stgMallocBytesRWX) \
+ SymX(getAllocations) \
+ SymX(revertCAFs) \
+ SymX(RtsFlags) \
RTS_USER_SIGNALS_SYMBOLS
#ifdef SUPPORT_LONG_LONGS