[project @ 2001-09-04 18:22:34 by ken]
authorken <unknown>
Tue, 4 Sep 2001 18:22:34 +0000 (18:22 +0000)
committerken <unknown>
Tue, 4 Sep 2001 18:22:34 +0000 (18:22 +0000)
On the Alpha we can only handle <= 4 integer arguments with foreign export
dynamic.  Following the example of the corresponding Sparc hack, we detect
when we're being asked to do something we can't and refuse.

MERGE TO STABLE BRANCH

ghc/compiler/typecheck/TcForeign.lhs

index c33b8cd..3236ec0 100644 (file)
@@ -147,6 +147,10 @@ adjustor thunks, we only allow 16 bytes of arguments!
 So for example, args (Int,Double,Int) would be OK (1+2+1)
 as would (Int,Int,Int,Int) (1+1+1+1) but not (Int,Double,Double) (1+2+2).
 
+On an Alpha, due to a similar hack, we only allow 4 integer arguments with
+foreign export dynamic (i.e., 32 bytes of arguments after padding each
+argument to a quadword, excluding floating-point arguments).
+
 The check is needed for both via-C and native-code routes
 
 \begin{code}
@@ -157,6 +161,13 @@ checkFEDArgs arg_tys
   where
     words_of_args = sum (map (getPrimRepSize . typePrimRep) arg_tys)
     err = ptext SLIT("On SPARC, I can only handle 4 words of arguments to foreign export dynamic")
+#elsif alpha_TARGET_ARCH
+checkFEDArgs arg_tys
+  = check (integral_args <= 4) err
+  where
+    integral_args = sum (map (getPrimRepSize . filter (not . isFloatingRep)
+                                             . typePrimRep) arg_tys)
+    err = ptext SLIT("On Alpha, I can only handle 4 non-floating-point arguments to foreign export dynamic")
 #else
 checkFEDArgs arg_tys = returnNF_Tc ()
 #endif