[project @ 2005-04-07 05:27:16 by wolfgang]
authorwolfgang <unknown>
Thu, 7 Apr 2005 05:27:17 +0000 (05:27 +0000)
committerwolfgang <unknown>
Thu, 7 Apr 2005 05:27:17 +0000 (05:27 +0000)
Set the keepCAFs flag (required for GHCi with dynamic libraries) from an
__attribute__((constructor)) function linked to stage 2 ghc if GhcBuildDylibs
is set in mk/build.mk.

The previous hack (setting it from addDLL) didn't work, because a few CAFs
from libHSbase_dyn were evaluated before the Linker was first invoked by
GHCi.

MERGE TO STABLE

ghc/compiler/Makefile
ghc/compiler/ghci/keepCAFsForGHCi.c [new file with mode: 0644]
ghc/rts/Linker.c

index f9fbb55..49601a4 100644 (file)
@@ -409,6 +409,16 @@ PKG_DEPENDS += template-haskell
 
 ALL_DIRS += ghci
 
+# If we are going to use dynamic libraries instead of .o files for ghci,
+# we will need to always retain CAFs in the compiler.
+# ghci/keepCAFsForGHCi contains a GNU C __attribute__((constructor))
+# function which sets the keepCAFs flag for the RTS before any Haskell
+# code is run.
+ifeq "$(GhcBuildDylibs)" "YES"
+else
+EXCLUDED_SRCS += ghci/keepCAFsForGHCi.c
+endif
+
 # Enable readline if either:
 #   - we're building stage 1 and $(GhcHasReadline)="YES"
 #   - we're building stage 2/3, and we have built the readline package
diff --git a/ghc/compiler/ghci/keepCAFsForGHCi.c b/ghc/compiler/ghci/keepCAFsForGHCi.c
new file mode 100644 (file)
index 0000000..0aabbed
--- /dev/null
@@ -0,0 +1,15 @@
+#include "Rts.h"
+#include "Storage.h"
+
+// This file is only included when GhcBuildDylibs is set in mk/build.mk.
+// It contains an __attribute__((constructor)) function (run prior to main())
+// which sets the keepCAFs flag in the RTS, before any Haskell code is run.
+// This is required so that GHCi can use dynamic libraries instead of HSxyz.o
+// files.
+
+static void keepCAFsForGHCi() __attribute__((constructor));
+
+static void keepCAFsForGHCi()
+{
+    keepCAFs = 1;
+}
index 3633e54..f57bb5a 100644 (file)
@@ -803,24 +803,6 @@ addDLL( char *dll_name )
    void *hdl;
    char *errmsg;
 
-   // *** HACK
-   // If we load libHSbase_cbits_dyn.[so|dylib],
-   // then we know that we need to activate another newCAF
-   // related hack in Storage.c because we can't redirect
-   // newCAF to newDynCAF with the system dynamic linker.
-#ifdef OBJFORMAT_MACHO
-   const char *hsbase = "/libHSbase_cbits_dyn.dylib";
-#else
-   const char *hsbase = "/libHSbase_cbits_dyn.so";
-#endif
-   int namelen = strlen(dll_name);
-   int baselen = strlen(hsbase);
-   if(namelen > baselen && !strcmp(dll_name + namelen - baselen, hsbase))
-   {
-      keepCAFs = rtsTrue;
-   }
-   // *** END HACK.
-
    initLinker();
 
    hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL);