From c9bbb031b95ea6af431dd930c322dc88594b51c8 Mon Sep 17 00:00:00 2001 From: Gabriel Kerneis Date: Thu, 27 Feb 2014 12:59:25 +0000 Subject: Load POWER binary into interpreter's memory --- src/test/run_power.ml | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/test/run_power.ml (limited to 'src/test') 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 () ;; -- cgit v1.2.3