From 3f02caba7c36d2c0a45d142b210c851369d64024 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Sat, 8 Mar 2008 00:06:35 +0000 Subject: [PATCH] Changed the handling of retypes with arrays to handle source items with unknown size --- backends/BackendPasses.hs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/backends/BackendPasses.hs b/backends/BackendPasses.hs index 46dd6af..4b6faca 100644 --- a/backends/BackendPasses.hs +++ b/backends/BackendPasses.hs @@ -135,18 +135,19 @@ declareSizesArray = doGeneric `ext1M` doStructured 0 -> return $ makeStaticSizeSpec m n_sizes [if d == A.UnknownDimension then A.Dimension (bytes `div` (knownDimsTotal * biElem)) else d | d <- ds] _ -> dieP m "RETYPES has sizes that do not fit" - -- TODO apply a dynamic check for this part: - BIUnknown -> dieP m $ "Cannot handle RETYPES sizes: " ++ show birhs - -- Some array dimensions are not known at compile-time: - _ -> do let A.Array srcDs elemSrcT = t - BIJust biSrcElem <- bytesInType elemSrcT - let A.Variable _ srcN = v - multipliedDimsV = foldl (A.Dyadic m A.Mul) (makeConstant m biSrcElem) - [A.ExprVariable m $ A.SubscriptedVariable m (A.Subscript m $ makeConstant m i) (A.Variable m $ append_sizes srcN) | i <- [0 .. length srcDs - 1]] - return $ makeDynamicSizeSpec m n_sizes + _ -> do totalSizeExpr <- case birhs of + BIUnknown -> return $ A.BytesInType m t + -- An array with a dimension are not known at compile-time: + _ -> do let A.Array srcDs elemSrcT = t + BIJust biSrcElem <- bytesInType elemSrcT + let A.Variable _ srcN = v + multipliedDimsV = foldl (A.Dyadic m A.Mul) (makeConstant m biSrcElem) + [A.ExprVariable m $ A.SubscriptedVariable m (A.Subscript m $ makeConstant m i) (A.Variable m $ append_sizes srcN) | i <- [0 .. length srcDs - 1]] + return multipliedDimsV + return $ makeDynamicSizeSpec m n_sizes [case d of -- TODO add a run-time check here for invalid retypes - A.UnknownDimension -> A.Dyadic m A.Div multipliedDimsV + A.UnknownDimension -> A.Dyadic m A.Div totalSizeExpr (makeConstant m $ knownDimsTotal * biElem) A.Dimension n -> makeConstant m n | d <- ds]