summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwolfgang <unknown>2005-04-12 19:58:57 +0000
committerwolfgang <unknown>2005-04-12 19:58:57 +0000
commit48ea897f45f17d1e09af59034fad9271702c7393 (patch)
tree9358f6d8bcc8da40d02d8b0bc27d5c0e910821ec
parent7e55e663ba1d7af20eb15f7496f0706f3879eef8 (diff)
downloadhaskell-48ea897f45f17d1e09af59034fad9271702c7393.tar.gz
[project @ 2005-04-12 19:58:56 by wolfgang]
Dynamic Linking: On non-Win32, we can store cross-dylib pointers in static data, so disable a Win32-specific hack on the other platforms, to prevent code bloat.
-rw-r--r--ghc/compiler/codeGen/CgCon.lhs5
-rw-r--r--ghc/compiler/coreSyn/CoreUtils.lhs6
2 files changed, 9 insertions, 2 deletions
diff --git a/ghc/compiler/codeGen/CgCon.lhs b/ghc/compiler/codeGen/CgCon.lhs
index 9a9f11aa4d..d94cbf03f6 100644
--- a/ghc/compiler/codeGen/CgCon.lhs
+++ b/ghc/compiler/codeGen/CgCon.lhs
@@ -72,7 +72,10 @@ cgTopRhsCon :: Id -- Name of thing bound to this RHS
cgTopRhsCon id con args
= do {
; dflags <- getDynFlags
- ; ASSERT( not (isDllConApp dflags con args) ) return ()
+#if mingw32_TARGET_OS
+ -- Windows DLLs have a problem with static cross-DLL refs.
+ ; ASSERT( not (isDllConApp dflags con args) ) return ()
+#endif
; ASSERT( args `lengthIs` dataConRepArity con ) return ()
-- LAY IT OUT
diff --git a/ghc/compiler/coreSyn/CoreUtils.lhs b/ghc/compiler/coreSyn/CoreUtils.lhs
index 24a6eb1c35..1951d8cb36 100644
--- a/ghc/compiler/coreSyn/CoreUtils.lhs
+++ b/ghc/compiler/coreSyn/CoreUtils.lhs
@@ -1175,6 +1175,8 @@ rhsIsStatic :: DynFlags -> CoreExpr -> Bool
-- BUT watch out for
-- (i) Any cross-DLL references kill static-ness completely
-- because they must be 'executed' not statically allocated
+-- ("DLL" here really only refers to Windows DLLs, on other platforms,
+-- this is not necessary)
--
-- (ii) We treat partial applications as redexes, because in fact we
-- make a thunk for them that runs and builds a PAP
@@ -1244,7 +1246,9 @@ rhsIsStatic dflags rhs = is_static False rhs
is_static in_arg other_expr = go other_expr 0
where
go (Var f) n_val_args
- | not (isDllName dflags (idName f))
+#if mingw32_TARGET_OS
+ | not (isDllName dflags (idName f))
+#endif
= saturated_data_con f n_val_args
|| (in_arg && n_val_args == 0)
-- A naked un-applied variable is *not* deemed a static RHS