@@ -679,6 +679,7 @@ trait StagedWasmEvaluator extends SAIOps {
679679 }
680680 val (instrs, locals) = (funBody.body, funBody.locals)
681681 resetStacks()
682+ initGlobals(module.globals)
682683 Frames .pushFrameC(locals)
683684 Frames .pushFrameS(locals)
684685 eval(instrs, (_ : Context ) => forwardKont, mkont, ((_ : Context ) => forwardKont):: Nil )(Context (Nil , locals))
@@ -883,6 +884,18 @@ trait StagedWasmEvaluator extends SAIOps {
883884 " reset-stacks" .reflectCtrlWith[Unit ]()
884885 }
885886
887+ def initGlobals (globals : List [RTGlobal ]): Rep [Unit ] = {
888+ Globals .reserveSpace(globals.size)
889+ for ((g, i) <- globals.view.zipWithIndex) {
890+ val initValue = g.value match {
891+ case n : Num => n
892+ case _ => throw new RuntimeException (" Non-numeric global value is not supported yet" )
893+ }
894+ Globals .setC(i, toStagedNum(initValue))
895+ Globals .setS(i, toStagedSymbolicNum(initValue))
896+ }
897+ }
898+
886899 // call unreachable
887900 def unreachable (): Rep [Unit ] = {
888901 " unreachable" .reflectCtrlWith[Unit ]()
@@ -905,6 +918,11 @@ trait StagedWasmEvaluator extends SAIOps {
905918
906919 // global read/write
907920 object Globals {
921+ def reserveSpace (size : Int ): Rep [Unit ] = {
922+ " global-reserve" .reflectCtrlWith[Unit ](size)
923+ " sym-global-reserve" .reflectCtrlWith[Unit ](size)
924+ }
925+
908926 def getC (i : Int ): StagedConcreteNum = {
909927 module.globals(i).ty match {
910928 case GlobalType (NumType (I32Type ), _) => I32C (" global-get" .reflectCtrlWith[Num ](i))
@@ -1352,8 +1370,6 @@ trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase {
13521370 emit(" Frames.set(" ); shallow(i); emit(" , " ); shallow(value); emit(" );\n " )
13531371 case Node (_, " sym-frame-set" , List (i, s_value), _) =>
13541372 emit(" SymFrames.set(" ); shallow(i); emit(" , " ); shallow(s_value); emit(" );\n " )
1355- case Node (_, " global-set" , List (i, value), _) =>
1356- emit(" Global.globalSet(" ); shallow(i); emit(" , " ); shallow(value); emit(" );\n " )
13571373 // Note: The following code is copied from the traverse of CppBackend.scala, try to avoid duplicated code
13581374 case n @ Node (f, " λ" , (b : LMSBlock ):: LMSConst (0 ):: rest, _) =>
13591375 // TODO: Is a leading block followed by 0 a hint for top function?
@@ -1410,7 +1426,17 @@ trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase {
14101426 case Node (_, " stack-size" , _, _) =>
14111427 emit(" Stack.size()" )
14121428 case Node (_, " global-get" , List (i), _) =>
1413- emit(" Global.globalGet(" ); shallow(i); emit(" )" )
1429+ emit(" Globals.get(" ); shallow(i); emit(" )" )
1430+ case Node (_, " sym-global-get" , List (i), _) =>
1431+ emit(" SymGlobal.get(" ); shallow(i); emit(" )" )
1432+ case Node (_, " global-set" , List (i, value), _) =>
1433+ emit(" Globals.set(" ); shallow(i); emit(" , " ); shallow(value); emit(" )" )
1434+ case Node (_, " sym-global-set" , List (i, s_value), _) =>
1435+ emit(" SymGlobals.set(" ); shallow(i); emit(" , " ); shallow(s_value); emit(" )" )
1436+ case Node (_, " global-reserve" , List (i), _) =>
1437+ emit(" Globals.pushFrame(" ); shallow(i); emit(" )" )
1438+ case Node (_, " sym-global-reserve" , List (i), _) =>
1439+ emit(" SymGlobals.pushFrame(" ); shallow(i); emit(" )" )
14141440 case Node (_, " is-zero" , List (num), _) =>
14151441 emit(" (0 == " ); shallow(num); emit(" )" )
14161442 case Node (_, " sym-is-zero" , List (s_num), _) =>
0 commit comments