From fb97ee6c493df83e2797b330ac93633037e82a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Tue, 1 Jun 2021 11:25:31 +0200 Subject: [PATCH] [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. --- src/kernel_services/ast_queries/file.ml | 35 +++++++++++++------------ 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/kernel_services/ast_queries/file.ml b/src/kernel_services/ast_queries/file.ml index 8d5ce416adc..c71b094486f 100644 --- a/src/kernel_services/ast_queries/file.ml +++ b/src/kernel_services/ast_queries/file.ml @@ -1026,6 +1026,23 @@ let register_code_transformation_category s = after_id = Transform_after_cleanup.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 ~before ~after name f (p:(module Parameter_sig.S)) = let module P = (val p: Parameter_sig.S) in @@ -1037,6 +1054,7 @@ let add_transform_parameter "applying %s to current AST, after option %s changed" name.name P.option_name; f (Ast.get()); + recompute_cfg (); if Kernel.Check.get () then Filecheck.check_ast ("after code transformation: " ^ name.name ^ @@ -1058,23 +1076,6 @@ let add_transform_parameter Transform_after_parameter_change.add_dependency a.prm_id name.prm_id) 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 printer = if is_normalized then Printer.pp_file else Cil_printer.pp_file -- GitLab