summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKathy Gray2014-10-30 11:24:14 +0000
committerKathy Gray2014-10-30 11:24:14 +0000
commit855ad1ab622cf6045f556365f6c257ee79d6fd91 (patch)
treee91b678f95738c21c5329509e5638f31f18e8cd9 /src
parentf0121963e7bbeef2ce1fe041a186b142855b9b82 (diff)
Add parameter to interp_exhaust with type maybe (list (reg_name,value)) for registers we might read that we want values for (particularly the PC)
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp_inter_imp.lem35
-rw-r--r--src/lem_interp/interp_interface.lem4
-rw-r--r--src/lem_interp/run_interp_model.ml2
3 files changed, 30 insertions, 11 deletions
diff --git a/src/lem_interp/interp_inter_imp.lem b/src/lem_interp/interp_inter_imp.lem
index bc6d4361..bfca32d3 100644
--- a/src/lem_interp/interp_inter_imp.lem
+++ b/src/lem_interp/interp_inter_imp.lem
@@ -331,24 +331,43 @@ let rec interp_to_outcome mode thunk =
let interp mode i_state = interp_to_outcome mode (fun _ -> Interp.resume mode i_state Nothing)
-let rec ie_loop mode i_state =
+(*TODO: Only find exact matches, need to look for field/slice sub pieces*)
+let rec find_reg_name reg = function
+ | [] -> Nothing
+ | (reg_name,v)::registers ->
+ match (reg,reg_name) with
+ | (Reg i, Reg n) -> if i = n then v else find_reg_name reg registers
+ | (Reg_slice i (p1,p2), Reg_slice n (p3,p4)) ->
+ if i=n && p1=p3 && p2 = p4 then v else find_reg_name reg registers
+ | (Reg_field i f _,Reg_field n fn _) ->
+ if i=n && f = fn then v else find_reg_name reg registers
+ | (Reg_f_slice i f _ (p1,p2), Reg_f_slice n fn _ (p3,p4)) ->
+ if i=n && f=fn && p1=p3 && p2=p3 then v else find_reg_name reg registers
+end end
+
+let rec ie_loop mode register_values i_state =
match (interp mode i_state) with
| Done -> []
| Error msg -> [E_error msg]
| Read_reg reg i_state_fun ->
- (E_read_reg reg)::(ie_loop mode (i_state_fun Unknown))
+ let v = match register_values with
+ | Nothing -> Unknown
+ | Just(registers) -> match find_reg_name reg registers with
+ | Nothing -> Unknown
+ | Just v -> v end end in
+ (E_read_reg reg)::(ie_loop mode register_values (i_state_fun v))
| Write_reg reg value i_state->
- (E_write_reg reg value)::(ie_loop mode i_state)
+ (E_write_reg reg value)::(ie_loop mode register_values i_state)
| Read_mem read_k loc length tracking i_state_fun ->
- (E_read_mem read_k loc length tracking)::(ie_loop mode (i_state_fun Unknown))
+ (E_read_mem read_k loc length tracking)::(ie_loop mode register_values (i_state_fun Unknown))
| Write_mem write_k loc length tracking value v_tracking i_state_fun ->
- (E_write_mem write_k loc length tracking value v_tracking)::(ie_loop mode (i_state_fun true))
- | Internal _ _ next -> (ie_loop mode next)
+ (E_write_mem write_k loc length tracking value v_tracking)::(ie_loop mode register_values (i_state_fun true))
+ | Internal _ _ next -> (ie_loop mode register_values next)
end ;;
-let interp_exhaustive i_state =
+let interp_exhaustive register_values i_state =
let mode = make_mode true true in
- ie_loop mode i_state
+ ie_loop mode register_values i_state
let rec rr_ie_loop mode i_state =
match (interp mode i_state) with
diff --git a/src/lem_interp/interp_interface.lem b/src/lem_interp/interp_interface.lem
index 32c0fa4a..712070d8 100644
--- a/src/lem_interp/interp_interface.lem
+++ b/src/lem_interp/interp_interface.lem
@@ -112,8 +112,8 @@ val append_value : value -> value -> value
(* When interp_mode has eager_eval false, interpreter is (close to) small step *)
val interp : interp_mode -> instruction_state -> outcome
-(* Run the interpreter without external interaction, feeding in Unknown on all reads *)
-val interp_exhaustive : instruction_state -> list event
+(* Run the interpreter without external interaction, feeding in Unknown on all reads except for those register values provided *)
+val interp_exhaustive : instruction_state -> maybe (list (reg_name * value)) -> list event
(* As above, but will request register reads: outcome will only be rreg, done, or error *)
val rr_interp_exhaustive : interp_mode -> instruction_state -> list event -> (outcome * (list event))
diff --git a/src/lem_interp/run_interp_model.ml b/src/lem_interp/run_interp_model.ml
index 28d0d862..8a047a5b 100644
--- a/src/lem_interp/run_interp_model.ml
+++ b/src/lem_interp/run_interp_model.ml
@@ -206,7 +206,7 @@ let run
interact mode env stack
| "e" | "exh" | "exhaust" ->
debugf "interpreting exhaustively from current state\n";
- let events = interp_exhaustive stack in
+ let events = interp_exhaustive None stack in
debugf "%s" (format_events events);
interact mode env stack
| "c" | "cont" | "continuation" ->