From 2d4ae4d7b49c9fca0ac6a0f81c91ae662301b24d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Mon, 4 Jul 2022 11:11:51 +0200 Subject: [PATCH] [Eva] In the engine, applies the callbacks from Cvalue_callbacks. --- src/plugins/value/domains/cvalue/builtins.ml | 6 ++--- src/plugins/value/engine/compute_functions.ml | 15 ++++++----- src/plugins/value/engine/iterator.ml | 25 ++++++------------- src/plugins/value/engine/transfer_stmt.ml | 5 ++-- 4 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/plugins/value/domains/cvalue/builtins.ml b/src/plugins/value/domains/cvalue/builtins.ml index e630950b1fd..c5682f2f857 100644 --- a/src/plugins/value/domains/cvalue/builtins.ml +++ b/src/plugins/value/domains/cvalue/builtins.ml @@ -265,14 +265,12 @@ let apply_builtin (builtin:builtin) call ~pre ~post = let arguments = compute_arguments call.arguments call.rest in try let call_result = builtin pre arguments in - let call_stack = Eva_utils.call_stack () in let froms = match call_result with | Full result -> `Builtin result.c_from - | States _ -> `Builtin None - | Result _ -> `Spec (Annotations.funspec call.kf) + | States _ | Result _ -> `Builtin None in - Db.Value.Call_Type_Value_Callbacks.apply (froms, pre, call_stack); + Cvalue_callbacks.apply_call_hooks call.callstack call.kf froms pre; process_result call post call_result with | Invalid_nb_of_args n -> diff --git a/src/plugins/value/engine/compute_functions.ml b/src/plugins/value/engine/compute_functions.ml index c4288155ea6..530750b8893 100644 --- a/src/plugins/value/engine/compute_functions.ml +++ b/src/plugins/value/engine/compute_functions.ml @@ -184,9 +184,8 @@ module Make (Abstract: Abstractions.Eva) = struct in call_result | Some (states, i) -> - let stack = Eva_utils.call_stack () in let cvalue = Abstract.Dom.get_cvalue_or_top init_state in - Db.Value.Call_Type_Value_Callbacks.apply (`Memexec, cvalue, stack); + Cvalue_callbacks.apply_call_hooks call.callstack call.kf `Memexec cvalue; (* Evaluate the preconditions of kf, to update the statuses at this call. *) let spec = Annotations.funspec call.kf in @@ -202,7 +201,8 @@ module Make (Abstract: Abstractions.Eva) = struct Self.debug ~dkey "calling Record_Value_New callbacks on saved previous result"; end; - Db.Value.Record_Value_Callbacks_New.apply (stack, Value_types.Reuse i); + let reuse = Cvalue_callbacks.Reuse i in + Cvalue_callbacks.apply_call_results_hooks call.callstack call.kf reuse; (* call can be cached since it was cached once *) Transfer.{states; cacheable = Cacheable; builtin=false} @@ -234,11 +234,10 @@ module Make (Abstract: Abstractions.Eva) = struct let compute_using_spec_or_body target kinstr call state = let global = match kinstr with Kglobal -> true | _ -> false in let pp = not global && Parameters.ValShowProgress.get () in - let call_stack = Eva_utils.call_stack () in if pp then Self.feedback "@[computing for function %a.@\nCalled from %a.@]" - Value_types.Callstack.pretty_short call_stack + Value_types.Callstack.pretty_short call.callstack Cil_datatype.Location.pretty (Cil_datatype.Kinstr.loc kinstr); let cvalue_state = Abstract.Dom.get_cvalue_or_top state in let compute, kind = @@ -248,7 +247,7 @@ module Make (Abstract: Abstractions.Eva) = struct | `Spec funspec -> compute_using_spec funspec, `Spec funspec in - Db.Value.Call_Type_Value_Callbacks.apply (kind, cvalue_state, call_stack); + Cvalue_callbacks.apply_call_hooks call.callstack call.kf kind cvalue_state; let resulting_states, cacheable = compute kinstr call state in if pp then Self.feedback @@ -293,8 +292,8 @@ module Make (Abstract: Abstractions.Eva) = struct let cvalue_state = Abstract.Dom.get_cvalue_or_top state in match final_state with | `Bottom -> - let cs = Eva_utils.call_stack () in - Db.Value.Call_Type_Value_Callbacks.apply (`Spec spec, cvalue_state, cs); + let kind = `Spec spec in + Cvalue_callbacks.apply_call_hooks call.callstack call.kf kind cvalue_state; let cacheable = Eval.Cacheable in Transfer.{states; cacheable; builtin=true} | `Value final_state -> diff --git a/src/plugins/value/engine/iterator.ml b/src/plugins/value/engine/iterator.ml index 3be91801bcb..2fc4a8215b0 100644 --- a/src/plugins/value/engine/iterator.ml +++ b/src/plugins/value/engine/iterator.ml @@ -448,8 +448,8 @@ module Make_Dataflow (* TODO: apply on all domains. *) let states = Partitioning.contents f in let cvalue_states = gather_cvalues states in - Db.Value.Compute_Statement_Callbacks.apply - (stmt, Eva_utils.call_stack (), cvalue_states) + let callstack = Eva_utils.call_stack () in + Cvalue_callbacks.apply_statement_hooks callstack stmt cvalue_states let update_vertex ?(widening : bool = false) (v : vertex) (sources : ('branch * flow) list) : bool = @@ -723,21 +723,12 @@ module Make_Dataflow Db.Value.Record_Value_Callbacks.apply (callstack, merged_pre_cvalues) end; - if not (Db.Value.Record_Value_Callbacks_New.is_empty ()) - then begin - if Parameters.ValShowProgress.get () then - Self.debug ~dkey:dkey_callbacks - "now calling Record_Value_New callbacks"; - if Parameters.MemExecAll.get () then - Db.Value.Record_Value_Callbacks_New.apply - (callstack, - Value_types.NormalStore ((merged_pre_cvalues, merged_post_cvalues), - (Mem_exec.new_counter ()))) - else - Db.Value.Record_Value_Callbacks_New.apply - (callstack, - Value_types.Normal (merged_pre_cvalues, merged_post_cvalues)) - end; + let states = + Cvalue_callbacks.{ before_stmts = merged_pre_cvalues; + after_stmts = merged_post_cvalues } + in + let results = Cvalue_callbacks.Store (states, Mem_exec.new_counter ()) in + Cvalue_callbacks.apply_call_results_hooks callstack kf results; if not (Db.Value.Record_Value_After_Callbacks.is_empty ()) then begin if Parameters.ValShowProgress.get () then diff --git a/src/plugins/value/engine/transfer_stmt.ml b/src/plugins/value/engine/transfer_stmt.ml index 34ec661ec42..09bcb4f40fc 100644 --- a/src/plugins/value/engine/transfer_stmt.ml +++ b/src/plugins/value/engine/transfer_stmt.ml @@ -731,9 +731,8 @@ module Make (Abstract: Abstractions.Eva) = struct let cvalue_state = Domain.get_cvalue_or_top state in Db.Value.Call_Value_Callbacks.apply (cvalue_state, stack_with_call); Db.Value.merge_initial_state (Eva_utils.call_stack ()) cvalue_state; - Db.Value.Call_Type_Value_Callbacks.apply - (`Builtin None, cvalue_state, stack_with_call) - + let kind = `Builtin None in + Cvalue_callbacks.apply_call_hooks stack_with_call kf kind cvalue_state (* --------------------- Process the call statement ---------------------- *) -- GitLab