diff --git a/src/plugins/alias/src/API.ml b/src/plugins/alias/src/API.ml index 53ae066ea24aafd942d7d7a861fb10668723d4de..9e0fed57f7b23d2393de793f93348e1dc57a85fe 100644 --- a/src/plugins/alias/src/API.ml +++ b/src/plugins/alias/src/API.ml @@ -58,7 +58,22 @@ module Statement = struct let points_to_vars ~stmt lv = vars ~stmt (Abstract_state.points_to_vars lv) let points_to_lvals ~stmt lv = lset ~stmt (Abstract_state.points_to_lvals lv) let alias_vars ~stmt lv = vars ~stmt (Abstract_state.alias_vars lv) - let aliases ~stmt lv = lset ~stmt (Abstract_state.find_all_aliases lv) + let alias_lvals ~stmt lv = lset ~stmt (Abstract_state.alias_lvals lv) + let aliases = alias_lvals (* deprecated *) + + let new_aliases_lvals ~stmt lv = + let get_set state = + let new_state = Analysis.do_stmt state stmt in + Abstract_state.alias_lvals lv new_state + in + lset ~stmt:stmt get_set + + let new_aliases_vars ~stmt lv = + let get_set state = + let new_state = Analysis.do_stmt state stmt in + Abstract_state.alias_vars lv new_state + in + vars ~stmt:stmt get_set let are_aliased ~stmt (lv1: lval) (lv2:lval) : bool = (* TODO: more efficient algorithm: do they share a successor? *) @@ -69,13 +84,6 @@ let points_to_set_stmt _kf stmt = Statement.points_to_lvals ~stmt let aliases_stmt _kf stmt = Statement.aliases ~stmt -let new_aliases_stmt s lv = - let get_set state = - let new_state = Analysis.do_stmt state s in - Abstract_state.find_all_aliases lv new_state - in - lset ~stmt:s get_set - module Function = struct let return_stmt kf = if Kernel_function.has_definition kf @@ -85,14 +93,15 @@ module Function = struct let points_to_vars ~kf = Statement.points_to_vars ~stmt:(return_stmt kf) let points_to_lvals ~kf = Statement.points_to_lvals ~stmt:(return_stmt kf) let alias_vars ~kf = Statement.alias_vars ~stmt:(return_stmt kf) - let aliases ~kf = Statement.aliases ~stmt:(return_stmt kf) + let alias_lvals ~kf = Statement.alias_lvals ~stmt:(return_stmt kf) + let aliases = alias_lvals (* deprecated *) let are_aliased ~kf = Statement.are_aliased ~stmt:(return_stmt kf) let fundec_stmts ~kf lv = if Kernel_function.has_definition kf then List.map - (fun s -> s, new_aliases_stmt s lv) + (fun stmt -> stmt, Statement.new_aliases_lvals ~stmt lv) (Kernel_function.get_definition kf).sallstmts else Options.abort "fundec_stmts: function %a has no definition" Kernel_function.pretty kf @@ -112,7 +121,7 @@ let fold_aliases_stmt f_fold acc kf s lv = LSet.fold (fun e a -> f_fold a e) (aliases_stmt kf s lv) acc let fold_new_aliases_stmt f_fold acc _kf s lv = - LSet.fold (fun e a -> f_fold a e) (new_aliases_stmt s lv) acc + LSet.fold (fun e a -> f_fold a e) (Statement.new_aliases_lvals ~stmt:s lv) acc let fold_points_to_set_kf (f_fold: 'a -> lval -> 'a) (acc: 'a) (kf:kernel_function) (lv:lval) : 'a = LSet.fold (fun e a -> f_fold a e) (points_to_set_kf kf lv) acc diff --git a/src/plugins/alias/src/API.mli b/src/plugins/alias/src/API.mli index 2d435abbefbd6b45128ee3d0a587e79d484ce1ff..76f407ec449eb72f25a7a1d26e939adc7afc4324 100644 --- a/src/plugins/alias/src/API.mli +++ b/src/plugins/alias/src/API.mli @@ -55,8 +55,17 @@ module Statement : sig (** see [Abstract_state.alias_vars] *) val alias_vars : stmt:stmt -> lval -> VarSet.t - (** see [Abstract_state.find_all_aliases] *) val aliases : stmt:stmt -> lval -> LSet.t + [@@alert deprecated "Use Statement.alias_lvals instead!"] + + (** see [Abstract_state.alias_lvals] *) + val alias_lvals : stmt:stmt -> lval -> LSet.t + + (** aliases of the given lval [lv] created by stmt [s] *) + val new_aliases_lvals : stmt:stmt -> lval -> LSet.t + + (** aliases of the given lval [lv] created by stmt [s] *) + val new_aliases_vars : stmt:stmt -> lval -> VarSet.t val are_aliased: stmt:stmt -> lval -> lval -> bool end @@ -73,8 +82,11 @@ module Function : sig (** see [Abstract_state.alias_vars] *) val alias_vars : kf:kernel_function -> lval -> VarSet.t - (** see [Abstract_state.find_all_aliases] *) val aliases : kf:kernel_function -> lval -> LSet.t + [@@alert deprecated "Use Function.alias_lvals instead!"] + + (** see [Abstract_state.alias_lvals] *) + val alias_lvals : kf:kernel_function -> lval -> LSet.t val are_aliased: kf:kernel_function -> lval -> lval -> bool @@ -107,10 +119,9 @@ val fold_aliases_stmt: ('a -> lval -> 'a) -> 'a -> kernel_function -> stmt -> lval -> 'a [@@alert deprecated "Use LSet.fold and Statement.aliases instead!"] -(** [fold_new_aliases_stmt f acc kf s lv] folds [f acc] over all the aliases of - the given lval [lv] created by stmt [s] in function [kf]. *) val fold_new_aliases_stmt: ('a -> lval -> 'a) -> 'a -> kernel_function -> stmt -> lval -> 'a +[@@alert deprecated "Use Statement.new_aliases with LSet.fold instead!"] val fold_points_to_set_kf : ('a -> lval -> 'a) -> 'a -> kernel_function -> lval -> 'a @@ -183,7 +194,7 @@ module Abstract_state : sig Does not raise an exception but returns an empty set for inexisting lval. *) val find_vars : lval -> t -> VarSet.t - (** Note: You probably want to use [find_all_aliases] instead of this function. + (** Note: You probably want to use [alias_lvals] instead of this function. Combining [find_vertex] with [get_lval_set], this function yields all the different ways the vertex containing the given lval can be referred to. Example: {a} → {b,c} @@ -205,9 +216,9 @@ module Abstract_state : sig val alias_vars : lval -> t -> VarSet.t val find_aliases : lval -> t -> LSet.t - [@@alert deprecated "Use find_synonyms, alias_vars, or find_all_aliases instead!"] + [@@alert deprecated "Use find_synonyms, alias_vars, or alias_lvals instead!"] - (** Yields all lvals that are alias of a given lval [lv]. This includes: + (** Yields all lvals that are an alias of a given lval [lv]. This includes: - variables sharing an equivalence class (or: vertex) with [lv] - variables from a neighbouring vertex, i.e. a vertex that shares a successor with the vertex of [lv]. @@ -216,11 +227,14 @@ module Abstract_state : sig Example: {a,b} → {c} ↠{d} ↠{e} The aliases of "a" are {a,b,d,*e}: - "b" shares a vertex with "a" - - "d" is in a neighbouring vertex, pointing to "c" as does {a,b} + - "d" is in a neighbouring vertex, as it shares a successor with {a,b} - *e is obtained by following backwards the pointer edge from {d} to {e}. *) + val alias_lvals : lval -> t -> LSet.t + val find_all_aliases : lval -> t -> LSet.t + [@@alert deprecated "Use alias_lvals instead!"] - (** the set of all lvars to which the given variable may point. *) + (** the set of all variables to which the given variable may point. *) val points_to_vars : lval -> t -> VarSet.t (** the set of all lvals to which the given variable may point including @@ -231,7 +245,7 @@ module Abstract_state : sig val points_to_set : lval -> t -> LSet.t [@@alert deprecated "Use points_to_vars or points_to_lvals instead!"] - (** find_aliases, then recursively finds other sets of lvals. We + (** alias_lvals, then recursively finds other sets of lvals. We have the property (if lval [lv] is in abstract state [x]) : List.hd (find_transitive_closure lv x) = (find_vertex lv x, find_aliases lv x). diff --git a/src/plugins/alias/src/abstract_state.ml b/src/plugins/alias/src/abstract_state.ml index 2dbd0b81ec4a95ec60d34dfa9c67ff2cdd49aabb..0d5b2298c151b22a84cf13a1e77c866c18f91a10 100644 --- a/src/plugins/alias/src/abstract_state.ml +++ b/src/plugins/alias/src/abstract_state.ml @@ -215,7 +215,7 @@ module Readout = struct List.fold_left VarSet.union VarSet.empty pred_vars with Not_found -> VarSet.empty - let find_all_aliases lv s : LSet.t = + let alias_lvals lv s : LSet.t = let v_opt = try Some (find_lval_vertex lv s) with Not_found -> None in match Option.bind v_opt @@ G.psucc_opt s.graph with | None -> LSet.empty @@ -925,7 +925,8 @@ module API = struct let find_synonyms = Readout.find_synonyms let find_aliases = Readout.find_synonyms let alias_vars = Readout.alias_vars - let find_all_aliases = Readout.find_all_aliases + let alias_lvals = Readout.alias_lvals + let find_all_aliases = Readout.alias_lvals (* deprecated *) let points_to_vars = Readout.points_to_vars let points_to_set = Readout.points_to_lvals let points_to_lvals = Readout.points_to_lvals diff --git a/src/plugins/alias/src/abstract_state.mli b/src/plugins/alias/src/abstract_state.mli index ba87fe798d8e41ef73c6d4b569ef28cc36bb1e84..babc954e729686f782e71daac6c11186c6ecc203 100644 --- a/src/plugins/alias/src/abstract_state.mli +++ b/src/plugins/alias/src/abstract_state.mli @@ -55,10 +55,14 @@ val find_vars : lval -> t -> VarSet.t val find_synonyms : lval -> t -> LSet.t val find_aliases : lval -> t -> LSet.t -[@@alert deprecated "Use find_synonyms or find_all_aliases instead!"] +[@@alert deprecated "Use find_synonyms or alias_lvals instead!"] val alias_vars : lval -> t -> VarSet.t +val alias_lvals : lval -> t -> LSet.t + val find_all_aliases : lval -> t -> LSet.t +[@@alert deprecated "Use alias_lvals instead!"] + val points_to_vars : lval -> t -> VarSet.t val points_to_lvals : lval -> t -> LSet.t