summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorGabriel Kerneis2014-02-27 12:59:25 +0000
committerGabriel Kerneis2014-02-27 14:31:42 +0000
commitc9bbb031b95ea6af431dd930c322dc88594b51c8 (patch)
treefa2c19804916e8be80e005e3429e586664febd36 /src/test
parent088a7661fbc749f6d899540035c883b14acf337c (diff)
Load POWER binary into interpreter's memory
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run_power.ml42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/test/run_power.ml b/src/test/run_power.ml
new file mode 100644
index 00000000..b06f79e3
--- /dev/null
+++ b/src/test/run_power.ml
@@ -0,0 +1,42 @@
+open Printf ;;
+open Interp ;;
+open Interp_ast ;;
+open Interp_lib ;;
+open Run_interp ;;
+
+let rec foldli f acc ?(i=0) = function
+ | [] -> acc
+ | x::xs -> foldli f (f i acc x) ~i:(i+1) xs
+;;
+
+(* POWER is big-endian *)
+let little_endian = false ;;
+
+let binary file =
+ let ic = open_in_bin file in
+ let rec read acc =
+ match try Some (input_byte ic) with End_of_file -> None
+ with
+ | Some b -> read ((V_lit (L_aux (L_num (Big_int.big_int_of_int b), Unknown))) :: acc)
+ | None -> close_in ic; acc in
+ let bytes = read [] in
+ List.rev_map ((if little_endian then to_vec_inc else to_vec_dec) 8) bytes
+;;
+
+let init_mem bytes =
+ foldli
+ (fun i m b -> Mem.add (Id_aux (Id "MEM", Unknown), Big_int.big_int_of_int i) b m)
+ Mem.empty bytes
+;;
+
+let run () =
+ let file = Sys.argv.(1) in
+ let bytes = binary file in
+ eprintf "bytes read\n";
+ let mem = init_mem bytes in
+ eprintf "memory initialized\n";
+ let r = Run_interp.run ~mem (file, Power.defs) in
+ eprintf "%s\n" (if r then "SUCCESS" else "FAILURE")
+;;
+
+run () ;;