Added various bits for shared channels, which now means that cgtest86 compiles and passes
This commit is contained in:
parent
10b4cd7cfc
commit
e08197bbef
|
@ -759,6 +759,9 @@ cgetCType m origT am
|
||||||
(A.Record n, _, True, A.Abbrev) -> return $ Pointer $ Pointer $ Plain $ nameString n
|
(A.Record n, _, True, A.Abbrev) -> return $ Pointer $ Pointer $ Plain $ nameString n
|
||||||
(A.Record n, _, True, _) -> return $ Pointer $ const $ Plain $ nameString n
|
(A.Record n, _, True, _) -> return $ Pointer $ const $ Plain $ nameString n
|
||||||
|
|
||||||
|
(A.Chan (A.ChanAttributes A.Shared A.Shared) _, _, False, _)
|
||||||
|
-> return $ Pointer $ Plain "mt_cb_t"
|
||||||
|
|
||||||
(A.Chan {}, _, False, A.Original) -> return $ Plain "Channel"
|
(A.Chan {}, _, False, A.Original) -> return $ Plain "Channel"
|
||||||
(A.Chan {}, _, False, A.Abbrev) -> return $ Pointer $ Plain "Channel"
|
(A.Chan {}, _, False, A.Abbrev) -> return $ Pointer $ Plain "Channel"
|
||||||
(A.ChanEnd {}, _, False, _) -> return $ Pointer $ Plain "Channel"
|
(A.ChanEnd {}, _, False, _) -> return $ Pointer $ Plain "Channel"
|
||||||
|
@ -1260,10 +1263,13 @@ cgenFlatArraySize ds
|
||||||
|
|
||||||
-- | Initialise an item being declared.
|
-- | Initialise an item being declared.
|
||||||
cdeclareInit :: Meta -> A.Type -> A.Variable -> Maybe (CGen ())
|
cdeclareInit :: Meta -> A.Type -> A.Variable -> Maybe (CGen ())
|
||||||
cdeclareInit _ (A.Chan _ _) var
|
cdeclareInit _ (A.Chan (A.ChanAttributes A.Unshared A.Unshared) _) var
|
||||||
= Just $ do tell ["ChanInit(wptr,"]
|
= Just $ do tell ["ChanInit(wptr,"]
|
||||||
call genVariableUnchecked var A.Abbrev
|
call genVariableUnchecked var A.Abbrev
|
||||||
tell [");"]
|
tell [");"]
|
||||||
|
cdeclareInit _ (A.Chan (A.ChanAttributes A.Shared A.Shared) _) var
|
||||||
|
= Just $ do call genVariable' var A.Original (const $ Pointer $ Plain "mt_cb_t")
|
||||||
|
tell [" = MTAllocChanType(wptr, 1, true);"]
|
||||||
cdeclareInit m t@(A.Array ds t') var
|
cdeclareInit m t@(A.Array ds t') var
|
||||||
= Just $ do case t' of
|
= Just $ do case t' of
|
||||||
A.Chan _ _ ->
|
A.Chan _ _ ->
|
||||||
|
@ -1299,6 +1305,9 @@ cdeclareInit m t@(A.Mobile t') var
|
||||||
case t' of
|
case t' of
|
||||||
A.Array ds _ | A.UnknownDimension `elem` ds -> return ()
|
A.Array ds _ | A.UnknownDimension `elem` ds -> return ()
|
||||||
_ -> call genAssign m [var] $ A.ExpressionList m [A.AllocMobile m t Nothing]
|
_ -> call genAssign m [var] $ A.ExpressionList m [A.AllocMobile m t Nothing]
|
||||||
|
cdeclareInit m (A.ChanDataType {}) var
|
||||||
|
= Just $ do call genVariable' var A.Original (const $ Pointer $ Plain "mt_cb_t")
|
||||||
|
tell ["=NULL;"]
|
||||||
cdeclareInit _ _ _ = Nothing
|
cdeclareInit _ _ _ = Nothing
|
||||||
|
|
||||||
-- | Free a declared item that's going out of scope.
|
-- | Free a declared item that's going out of scope.
|
||||||
|
@ -1374,8 +1383,27 @@ cintroduceSpec (A.Specification _ n (A.IsChannelArray _ (A.Array _ c) cs))
|
||||||
tell ["[]={"]
|
tell ["[]={"]
|
||||||
seqComma (map (\v -> call genVariable v A.Abbrev) cs)
|
seqComma (map (\v -> call genVariable v A.Abbrev) cs)
|
||||||
tell ["};"]
|
tell ["};"]
|
||||||
|
cintroduceSpec (A.Specification _ n (A.IsClaimed _ v))
|
||||||
|
= do t <- astTypeOf n
|
||||||
|
case t of
|
||||||
|
A.ChanEnd dir _ _ -> do call genDecl A.Original t n
|
||||||
|
tell ["=(&(((mt_cb_t*)"]
|
||||||
|
lock dir
|
||||||
|
tell [")->channels[0]));"]
|
||||||
|
A.ChanDataType dir _ _ -> do call genDecl A.Original t n
|
||||||
|
tell ["="]
|
||||||
|
lock dir
|
||||||
|
tell [";"]
|
||||||
|
where
|
||||||
|
lock dir = do tell ["TockMTLock(wptr,"]
|
||||||
|
call genVariable' v A.Original (const $ Pointer $ Plain "mt_cb_t")
|
||||||
|
tell [",",if dir == A.DirInput
|
||||||
|
then "MT_CB_CLIENT"
|
||||||
|
else "MT_CB_SERVER"
|
||||||
|
,")"]
|
||||||
cintroduceSpec (A.Specification _ _ (A.DataType _ _)) = return ()
|
cintroduceSpec (A.Specification _ _ (A.DataType _ _)) = return ()
|
||||||
cintroduceSpec (A.Specification _ _ (A.RecordType _ _ _)) = return ()
|
cintroduceSpec (A.Specification _ _ (A.RecordType _ _ _)) = return ()
|
||||||
|
cintroduceSpec (A.Specification _ _ (A.ChanBundleType {})) = return ()
|
||||||
cintroduceSpec (A.Specification _ n (A.Protocol _ _)) = return ()
|
cintroduceSpec (A.Specification _ n (A.Protocol _ _)) = return ()
|
||||||
cintroduceSpec (A.Specification _ n (A.ProtocolCase _ ts))
|
cintroduceSpec (A.Specification _ n (A.ProtocolCase _ ts))
|
||||||
= do tell ["typedef enum{"]
|
= do tell ["typedef enum{"]
|
||||||
|
@ -1478,6 +1506,18 @@ cremoveSpec (A.Specification m n (A.IsExpr _ am t e))
|
||||||
Nothing -> return ()
|
Nothing -> return ()
|
||||||
where
|
where
|
||||||
var = A.Variable m n
|
var = A.Variable m n
|
||||||
|
cremoveSpec (A.Specification _ n (A.IsClaimed _ v))
|
||||||
|
= do t <- astTypeOf n
|
||||||
|
let dir = case t of
|
||||||
|
A.ChanEnd dir _ _ -> dir
|
||||||
|
A.ChanDataType dir _ _ -> dir
|
||||||
|
tell ["MTUnlock(wptr,"]
|
||||||
|
call genVariable' v A.Original (const $ Pointer $ Plain "mt_cb_t")
|
||||||
|
tell [",",if dir == A.DirInput
|
||||||
|
then "MT_CB_CLIENT"
|
||||||
|
else "MT_CB_SERVER"
|
||||||
|
,");"]
|
||||||
|
|
||||||
cremoveSpec _ = return ()
|
cremoveSpec _ = return ()
|
||||||
|
|
||||||
cgenSpecMode :: A.SpecMode -> CGen ()
|
cgenSpecMode :: A.SpecMode -> CGen ()
|
||||||
|
@ -1673,7 +1713,18 @@ cgenAssign m (v:vs) (A.IntrinsicFunctionCallList _ n es)
|
||||||
emptyMeta "dummy_intrinsic_param")) (A.ActualVariable v)) vs
|
emptyMeta "dummy_intrinsic_param")) (A.ActualVariable v)) vs
|
||||||
when giveMeta $ genComma >> genMeta m
|
when giveMeta $ genComma >> genMeta m
|
||||||
tell [");"]
|
tell [");"]
|
||||||
|
cgenAssign m [vA, vB] (A.AllocChannelBundle _ n)
|
||||||
|
= do t@(A.ChanDataType dirA shA _) <- astTypeOf vA
|
||||||
|
A.ChanDataType dirB shB _ <- astTypeOf vB
|
||||||
|
call genClearMobile m vA
|
||||||
|
call genClearMobile m vB
|
||||||
|
fs <- recordFields m t
|
||||||
|
call genVariable' vA A.Original (const $ Pointer $ Plain "mt_cb_t")
|
||||||
|
tell ["=MTAllocChanType(wptr,", show (length fs), ",",
|
||||||
|
if shA == A.Shared || shB == A.Shared then "true" else "false", ");"]
|
||||||
|
call genAssign m [vB] (el $ A.CloneMobile m $ A.ExprVariable m vA)
|
||||||
|
where
|
||||||
|
el e = A.ExpressionList m [e]
|
||||||
cgenAssign m _ _ = call genMissing "Cannot perform assignment with multiple destinations or multiple sources"
|
cgenAssign m _ _ = call genMissing "Cannot perform assignment with multiple destinations or multiple sources"
|
||||||
|
|
||||||
isPOD :: A.Type -> Bool
|
isPOD :: A.Type -> Bool
|
||||||
|
|
|
@ -58,6 +58,13 @@ static inline void occam_RESIZE_MOBILE_ARRAY_1D (Workspace wptr, const int eleme
|
||||||
|
|
||||||
//}}}
|
//}}}
|
||||||
|
|
||||||
|
//{{{ other mobile stuff
|
||||||
|
static inline void* TockMTLock(Workspace wptr, void* ptr, int lock) {
|
||||||
|
MTLock(wptr, ptr, lock);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
//}}}
|
||||||
|
|
||||||
//{{{ top-level process interface
|
//{{{ top-level process interface
|
||||||
static void tock_tlp_input_bcall (FILE *in, int *ch) occam_unused;
|
static void tock_tlp_input_bcall (FILE *in, int *ch) occam_unused;
|
||||||
static void tock_tlp_input_bcall (FILE *in, int *ch) {
|
static void tock_tlp_input_bcall (FILE *in, int *ch) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user