@@ -31,6 +31,7 @@ import qualified Gibbon.Language as GL
3131import Gibbon.DynFlags
3232import Gibbon.L2.Syntax ( Multiplicity (.. ) )
3333import Gibbon.L4.Syntax
34+ import Language.Haskell.Exts (var )
3435
3536--------------------------------------------------------------------------------
3637
@@ -480,6 +481,7 @@ codegenTriv venv (ProdTriv ls) =
480481codegenTriv venv (ProjTriv i trv) =
481482 let field = " field" ++ show i
482483 in [cexp | $(codegenTriv venv trv).$id:field |]
484+ codegenTriv venv (IndexCursorArrayTriv idx v) = [cexp | $(codegenTriv venv v)[$int:idx] |]
483485
484486
485487-- Type environment
@@ -1072,11 +1074,17 @@ codegenTail venv fenv sort_fns (LetPrimCallT bnds prm rnds body) ty sync_deps =
10721074 -- _new_chunk <- gensym "new_chunk"
10731075 -- _chunk_start <- gensym "chunk_start"
10741076 -- _chunk_end <- gensym "chunk_end"
1075- ifConds <- mapM (\ (ProdTriv [(IntTriv i),(VarTriv bound), (VarTriv cur)]) ->
1077+ ifConds <- mapM (\ (ProdTriv [(IntTriv i),(VarTriv bound), (VarTriv cur), _ ]) ->
10761078 pure [cexp | ($id:cur + $int:i) > $id:bound |]
10771079 ) rnds
1078- ifBody <- mapM (\ (ProdTriv [(IntTriv i),(VarTriv bound), (VarTriv cur)]) ->
1079- pure [ C. BlockStm [cstm | gib_grow_region(& $id:cur, & $id:bound); |] ]
1080+ ifBody <- mapM (\ (ProdTriv [_, _, _, ProdTriv [(VarTriv b), (VarTriv c)]]) -> do
1081+ {- TODO: VS: Maybe we should check loc too, but i think we desinged this such that it is
1082+ not needed! -}
1083+ let bty = M. lookup b venv
1084+ case bty of
1085+ Just CursorTy -> pure [ C. BlockStm [cstm | gib_grow_region(& $id:c, & $id:b); |] ]
1086+ Just MutCursorTy -> pure [ C. BlockStm [cstm | gib_grow_region(& $id:c, $id:b); |] ]
1087+ _ -> error " Did not expect variable type in gib_grow_region!\n "
10801088 ) rnds
10811089 let condExpr = foldr1 (\ c1 c2 -> [cexp | $exp:c1 || $exp:c2 |]) ifConds
10821090 let ifBody' = concat ifBody
@@ -1572,6 +1580,18 @@ codegenTail venv fenv sort_fns (LetPrimCallT bnds prm rnds body) ty sync_deps =
15721580 [ptr] = rnds
15731581 ptr' = codegenTriv venv ptr
15741582 return [ C. BlockDecl [cdecl | $ty:(codegenTy outT) $id:outV = ($ty:(codegenTy outT)) $exp:ptr'; |] ]
1583+
1584+ AddrOfCursor -> do
1585+ let [(outV, outT)] = bnds
1586+ [expr] = rnds
1587+ expr' = codegenTriv venv expr
1588+ return [ C. BlockDecl [cdecl | $ty:(codegenTy outT) $id:outV = &($exp:expr'); |] ]
1589+
1590+ DerefMutCursor -> do
1591+ let [(outV, outT)] = bnds
1592+ [var] = rnds
1593+ var' = codegenTriv venv var
1594+ return [ C. BlockDecl [cdecl | $ty:(codegenTy outT) $id:outV = *($exp:var'); |] ]
15751595
15761596 _ -> error $ " codegen: " ++ show prm ++ " unhandled."
15771597
@@ -1654,6 +1674,7 @@ codegenTy SymTy = [cty|typename GibSym|]
16541674codegenTy PtrTy = [cty |typename GibPtr|] -- char* - Hack, this could be void* if we have enough casts. [2016.11.06]
16551675codegenTy CursorTy = [cty |typename GibCursor|]
16561676codegenTy (CursorArrayTy size) = [cty |typename GibCursor* |]
1677+ codegenTy MutCursorTy = [cty |typename GibCursor* |]
16571678codegenTy RegionTy = [cty |typename GibChunk|]
16581679codegenTy ChunkTy = [cty |typename GibChunk|]
16591680codegenTy (ProdTy [] ) = [cty |unsigned char|]
@@ -1679,6 +1700,7 @@ makeName' SymTy = "GibSym"
16791700makeName' BoolTy = " GibBool"
16801701makeName' CursorTy = " GibCursor"
16811702makeName' (CursorArrayTy {}) = " GibCursorPtr"
1703+ makeName' (MutCursorTy ) = " GibMutCursor"
16821704makeName' TagTyPacked = " GibPackedTag"
16831705makeName' TagTyBoxed = " GibBoxedTag"
16841706makeName' PtrTy = " GibPtr"
0 commit comments