diff options
| author | Kathy Gray | 2014-10-15 11:35:50 +0100 |
|---|---|---|
| committer | Kathy Gray | 2014-10-15 11:35:50 +0100 |
| commit | 1b1a45095f9086585b2b61cd355ccd018850fc82 (patch) | |
| tree | ee7a1fca1d34260f1aae8480ddff2426bddfd4f6 /src | |
| parent | 5b99a9967f211eb6f5c78bfccd25fdf958ad7896 (diff) | |
Add ability to print out binary as lem file of memory dump instead of running binary; to generate files for Peter to load, in the first instance.
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/run_power.ml | 34 |
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 () ;; |
