summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/test/run_power.ml34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/test/run_power.ml b/src/test/run_power.ml
index 56d2d051..6afca896 100644
--- a/src/test/run_power.ml
+++ b/src/test/run_power.ml
@@ -12,6 +12,8 @@ let startaddr = ref "0" ;;
let mainaddr = ref "0" ;;
let sections = ref [] ;;
let file = ref "" ;;
+let print_bytes = ref false ;;
+let bytes_file = ref "bytes_out.lem";;
let rec foldli f acc ?(i=0) = function
| [] -> acc
@@ -72,6 +74,19 @@ let load_memory (bits,addr) =
loop rest (1 + addr)
in loop bits addr
+let lem_print_memory m =
+ let preamble = "let instruction_byte_list = [" in
+ let list_elements =
+ Mem.fold (fun key byte rest ->
+ rest ^ "([" ^ (List.fold_right (fun i r -> (string_of_int i) ^ ";" ^ r) key "") ^ "], " ^
+ (string_of_int byte) ^ ");\n") m "" in
+ let final = "];;" in
+ let (temp_file_name, o) = Filename.open_temp_file "ll_temp" "" in
+ let o' = Format.formatter_of_out_channel o in
+ Format.fprintf o' "%s" (preamble ^ list_elements ^ final);
+ let _ = close_out o in
+ Sys.rename temp_file_name !bytes_file
+
(* use zero as a sentinel --- it might prevent a minimal loop from
* working in principle, but won't happen in practice *)
let lr_init_value = Big_int.zero_big_int
@@ -107,6 +122,8 @@ let args = [
("--mainaddr", Arg.Set_string mainaddr, "addr address of the main section (entry point; default: 0)");
("--quiet", Arg.Clear Run_interp_model.debug, " do not display interpreter actions");
("--interactive", Arg.Clear eager_eval , " interactive execution");
+ ("--dump", Arg.Set print_bytes , " do not run, just generate a lem file of a list of bytes");
+ ("--out", Arg.Set_string bytes_file, " specify the name for a file generated by --dump");
] ;;
let time_it action arg =
@@ -143,15 +160,9 @@ let run () =
exit 1;
end;
if !eager_eval then Run_interp_model.debug := true;
-(* let ic = open_in_bin !file in
- if !sections = [] then begin
- sections := [(0, in_channel_length ic, Big_int.zero_big_int)];
- end;
- let total_size = List.fold_left (fun n (_,s,_) -> n+s) 0 !sections in*)
let (locations,start_address) = populate !file in
- let total_size = 8 * (List.length locations) in
- eprintf "Loading binary into memory (%d bytes)... %!" total_size;
-(* let t = time_it (List.iter (load_section ic)) !sections in*)
+ let total_size = (List.length locations) in
+ eprintf "Loading binary into memory (%d sections)... %!" total_size;
let t = time_it (List.iter load_memory) locations in
eprintf "done. (%f seconds)\n%!" t;
let rec reading loc length =
@@ -163,14 +174,15 @@ let run () =
| Bytevector location ->
(Mem.find location !mem)::(reading (Big_int.add_big_int loc Big_int.unit_big_int) (length - 1)) in
mainaddr := "0x" ^ (List.fold_left (^) "" (List.map (Printf.sprintf "%02x") (reading (Big_int.big_int_of_int start_address) 8)));
-(* close_in ic;*)
let reg = init_reg () in
(* entry point: unit -> unit fde *)
let funk_name = "fde" in
let parms = [] in
let name = Filename.basename !file in
- let t =time_it (fun () -> fde_loop 0 funk_name parms !mem reg false (name, Power.defs)) () in
- eprintf "Execution time: %f seconds\n" t
+ if !print_bytes
+ then lem_print_memory !mem
+ else let t =time_it (fun () -> fde_loop 0 funk_name parms !mem reg false (name, Power.defs)) () in
+ eprintf "Execution time: %f seconds\n" t
;;
run () ;;