@@ -70,6 +70,12 @@ object Primitives {
70
70
case (I64V (v1), I64V (v2)) => I64V (v1 & v2)
71
71
case _ => throw new Exception (" Invalid types" )
72
72
}
73
+ case Or (_) =>
74
+ (lhs, rhs) match {
75
+ case (I32V (v1), I32V (v2)) => I32V (v1 | v2)
76
+ case (I64V (v1), I64V (v2)) => I64V (v1 | v2)
77
+ case _ => throw new Exception (" Invalid types" )
78
+ }
73
79
case _ => {
74
80
println(s " unimplemented binop: $op" )
75
81
???
@@ -180,13 +186,18 @@ object Primitives {
180
186
case Concrete (v) => Concrete (evalTestOp(op, v))
181
187
case _ =>
182
188
op match {
183
- case Eqz (_ ) => SymIte ( CondEqz (sv ), Concrete ( I32V ( 1 )) , Concrete (I32V ( 0 )))
189
+ case Eqz (ty ) => RelCond ( Eq (ty ), sv , Concrete (zero(ty )))
184
190
}
185
191
}
186
192
187
193
def evalSymRelOp (op : RelOp , lhs : SymVal , rhs : SymVal ): SymVal = (lhs, rhs) match {
188
194
case (Concrete (lhs), Concrete (rhs)) => Concrete (evalRelOp(op, lhs, rhs))
189
- case _ => SymIte (RelCond (op, lhs, rhs), Concrete (I32V (1 )), Concrete (I32V (0 )))
195
+ case _ =>
196
+ RelCond (
197
+ op,
198
+ lhs,
199
+ rhs
200
+ ) // TODO: it was SymIte(RelCond(op, lhs, rhs), Concrete(I32V(1)), Concrete(I32V(0))) before, but why??
190
201
}
191
202
192
203
def memOutOfBound (frame : Frame , memoryIndex : Int , offset : Int , size : Int ) = {
@@ -365,10 +376,10 @@ case class Evaluator(module: ModuleInstance) {
365
376
case If (ty, thn, els) =>
366
377
val scnd :: newSymStack = symStack
367
378
val I32V (cond) :: newStack = concStack
368
- val inner = if (cond = = 0 ) thn else els
379
+ val inner = if (cond ! = 0 ) thn else els
369
380
val newPathConds = scnd match {
370
381
case Concrete (_) => pathConds
371
- case _ => if (cond = = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
382
+ case _ => if (cond ! = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
372
383
}
373
384
val k : Cont = (retStack, retSymStack, newPathConds) =>
374
385
eval(rest, retStack ++ newStack, retSymStack ++ newSymStack, frame, ret, trail)(newPathConds)
@@ -380,7 +391,7 @@ case class Evaluator(module: ModuleInstance) {
380
391
val I32V (cond) :: newStack = concStack
381
392
val newPathConds = scnd match {
382
393
case Concrete (_) => pathConds
383
- case _ => if (cond = = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
394
+ case _ => if (cond ! = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
384
395
}
385
396
if (cond == 0 ) eval(rest, newStack, newSymStack, frame, ret, trail)(newPathConds)
386
397
else trail(label)(newStack, newSymStack, newPathConds)
@@ -497,22 +508,19 @@ case class Evaluator(module: ModuleInstance) {
497
508
})
498
509
499
510
print(s " instrs: $instrs" )
500
-
501
511
// val instrs = List(Call(funcId))
502
512
503
- // TODO: what are we tryign to do with globals here
504
- // does global values allow general expressions?
505
- // val globals = module.definitions.collect({ case g@Global(_, _) => g })
513
+ val globals = module.defs.collect({ case g @ Global (_, _) => g })
506
514
507
- // for (global <- globals) {
508
- // global.f match {
509
- // case GlobalValue(ty, e) => {
510
- // val (cv, sv) = evalExpr(e)
511
- // moduleInst .globals.append((RTGlobal(ty, cv), sv))
512
- // }
513
- // case _ => ???
514
- // }
515
- // }
515
+ for (global <- globals) {
516
+ global.f match {
517
+ case GlobalValue (ty, e) => {
518
+ val (cv, sv) = evalExpr(e)
519
+ module .globals.append((RTGlobal (ty, cv), sv))
520
+ }
521
+ case _ => ???
522
+ }
523
+ }
516
524
517
525
val locals = extractLocals(module, main)
518
526
@@ -542,7 +550,7 @@ case class Evaluator(module: ModuleInstance) {
542
550
System .err.println(s " Entering function $main" )
543
551
module.funcs(fid) match {
544
552
case FuncDef (_, FuncBodyDef (_, _, locals, _)) => locals
545
- case _ => throw new Exception (" Entry function has no concrete body" )
553
+ case _ => throw new Exception (" Entry function has no concrete body" )
546
554
}
547
555
case _ => List ()
548
556
})
@@ -552,7 +560,7 @@ case class Evaluator(module: ModuleInstance) {
552
560
System .err.println(s " Entering unnamed function $id" )
553
561
module.funcs(id) match {
554
562
case FuncDef (_, FuncBodyDef (_, _, locals, body)) => locals
555
- case _ => throw new Exception (" Entry function has no concrete body" )
563
+ case _ => throw new Exception (" Entry function has no concrete body" )
556
564
}
557
565
case _ => List ()
558
566
})
0 commit comments