diff options
| author | Gabriel Kerneis | 2014-02-27 12:59:25 +0000 |
|---|---|---|
| committer | Gabriel Kerneis | 2014-02-27 14:31:42 +0000 |
| commit | c9bbb031b95ea6af431dd930c322dc88594b51c8 (patch) | |
| tree | fa2c19804916e8be80e005e3429e586664febd36 /src/test | |
| parent | 088a7661fbc749f6d899540035c883b14acf337c (diff) | |
Load POWER binary into interpreter's memory
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/run_power.ml | 42 |
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 () ;; |
