Skip to content
Snippets Groups Projects
Commit fb97ee6c authored by David Bühler's avatar David Bühler
Browse files

[kernel] Always recompute the CFG after applying a code transformation.

Even if the AST already exists and the transformation is triggered by an
option change.
parent 4f3dbb9d
No related branches found
No related tags found
No related merge requests found
...@@ -1026,6 +1026,23 @@ let register_code_transformation_category s = ...@@ -1026,6 +1026,23 @@ let register_code_transformation_category s =
after_id = Transform_after_cleanup.register_key s; after_id = Transform_after_cleanup.register_key s;
prm_id = Transform_after_parameter_change.register_key s } prm_id = Transform_after_parameter_change.register_key s }
module Cfg_recomputation_queue =
State_builder.Set_ref(Cil_datatype.Fundec.Set)
(struct
let name = "File.Cfg_recomputation_queue"
let dependencies = [Ast.self]
end)
let () = Ast.add_linked_state Cfg_recomputation_queue.self
let must_recompute_cfg f = Cfg_recomputation_queue.add f
let recompute_cfg _ =
(* just in case f happens to modify the CFG *)
Cfg_recomputation_queue.iter
(fun f -> Cfg.clearCFGinfo ~clear_id:false f; Cfg.cfgFun f);
Cfg_recomputation_queue.clear ()
let add_transform_parameter let add_transform_parameter
~before ~after name f (p:(module Parameter_sig.S)) = ~before ~after name f (p:(module Parameter_sig.S)) =
let module P = (val p: Parameter_sig.S) in let module P = (val p: Parameter_sig.S) in
...@@ -1037,6 +1054,7 @@ let add_transform_parameter ...@@ -1037,6 +1054,7 @@ let add_transform_parameter
"applying %s to current AST, after option %s changed" "applying %s to current AST, after option %s changed"
name.name P.option_name; name.name P.option_name;
f (Ast.get()); f (Ast.get());
recompute_cfg ();
if Kernel.Check.get () then if Kernel.Check.get () then
Filecheck.check_ast Filecheck.check_ast
("after code transformation: " ^ name.name ^ ("after code transformation: " ^ name.name ^
...@@ -1058,23 +1076,6 @@ let add_transform_parameter ...@@ -1058,23 +1076,6 @@ let add_transform_parameter
Transform_after_parameter_change.add_dependency a.prm_id name.prm_id) Transform_after_parameter_change.add_dependency a.prm_id name.prm_id)
after after
module Cfg_recomputation_queue =
State_builder.Set_ref(Cil_datatype.Fundec.Set)
(struct
let name = "File.Cfg_recomputation_queue"
let dependencies = [Ast.self]
end)
let () = Ast.add_linked_state Cfg_recomputation_queue.self
let must_recompute_cfg f = Cfg_recomputation_queue.add f
let recompute_cfg _ =
(* just in case f happens to modify the CFG *)
Cfg_recomputation_queue.iter
(fun f -> Cfg.clearCFGinfo ~clear_id:false f; Cfg.cfgFun f);
Cfg_recomputation_queue.clear ()
let transform_and_check name is_normalized f ast = let transform_and_check name is_normalized f ast =
let printer = let printer =
if is_normalized then Printer.pp_file else Cil_printer.pp_file if is_normalized then Printer.pp_file else Cil_printer.pp_file
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment