Skip to content

Commit 19123ea

Browse files
committed
CHB: create def-use from reachingdefs
1 parent 7efb3fa commit 19123ea

File tree

6 files changed

+132
-21
lines changed

6 files changed

+132
-21
lines changed

CodeHawk/CHB/bchanalyze/bCHReachingDefs.ml

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -260,25 +260,28 @@ let analyze_procedure_with_flag_reaching_defs
260260
let extract_reaching_defs
261261
(finfo: function_info_int)
262262
(invariants: (string, (string, atlas_t) H.t) H.t) =
263-
H.iter (fun k v ->
264-
if H.mem v "reachingdefs" then
265-
let inv = H.find v "reachingdefs" in
266-
let domain = inv#getDomain "reachingdefs" in
267-
let varObserver = domain#observer#getNonRelationalVariableObserver in
268-
let vars = domain#observer#getObservedVariables in
269-
List.iter (fun (v: variable_t) ->
270-
let reachingdefs = (varObserver v)#toSymbolicSet in
271-
if reachingdefs#isTop then
272-
()
273-
else
274-
match reachingdefs#getSymbols with
275-
| SET symbols ->
276-
let symbols =
277-
List.sort (fun s1 s2 ->
278-
Stdlib.compare
279-
s1#getBaseName s2#getBaseName) symbols#toList in
280-
finfo#fvarinv#add_reaching_def k v symbols
281-
| _ -> ()) vars) invariants
263+
begin
264+
H.iter (fun k v ->
265+
if H.mem v "reachingdefs" then
266+
let inv = H.find v "reachingdefs" in
267+
let domain = inv#getDomain "reachingdefs" in
268+
let varObserver = domain#observer#getNonRelationalVariableObserver in
269+
let vars = domain#observer#getObservedVariables in
270+
List.iter (fun (v: variable_t) ->
271+
let reachingdefs = (varObserver v)#toSymbolicSet in
272+
if reachingdefs#isTop then
273+
()
274+
else
275+
match reachingdefs#getSymbols with
276+
| SET symbols ->
277+
let symbols =
278+
List.sort (fun s1 s2 ->
279+
Stdlib.compare
280+
s1#getBaseName s2#getBaseName) symbols#toList in
281+
finfo#add_reaching_def k v symbols;
282+
| _ -> ()) vars) invariants;
283+
finfo#fvarinv#collect_use_facts
284+
end
282285

283286

284287
let extract_flag_reaching_defs

CodeHawk/CHB/bchlib/bCHFloc.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1557,6 +1557,8 @@ object (self)
15571557
let useops = mk_ops ["defuse"] use_op_name use in
15581558
let usehighops = mk_ops ["defusehigh"] usehigh_op_name usehigh in
15591559
let flagdefops = mk_ops ["flagreachingdefs"] flagdef_op_name flagdefs in
1560+
let _ = List.iter (fun v -> self#f#add_use_loc v iaddr) use in
1561+
let _ = List.iter (fun v -> self#f#add_use_high_loc v iaddr) usehigh in
15601562
useops @ usehighops @ defops @ clobberops @ flagdefops
15611563

15621564
method private evaluate_fts_argument (p: fts_parameter_t) =

CodeHawk/CHB/bchlib/bCHFunctionInfo.ml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,6 +1750,50 @@ object (self)
17501750

17511751
method fvarinv = varinvio
17521752

1753+
val uselocs = H.create 5
1754+
val usehighlocs = H.create 5
1755+
1756+
method add_reaching_def
1757+
(iaddr: string) (v: variable_t) (deflocs: symbol_t list) =
1758+
begin
1759+
self#fvarinv#add_reaching_def iaddr v deflocs;
1760+
List.iter (fun s ->
1761+
if (List.length s#getAttributes) = 0 then
1762+
let defloc = s#getBaseName in
1763+
begin
1764+
(if self#is_use_loc v iaddr then
1765+
self#fvarinv#add_use_loc defloc v iaddr);
1766+
(if self#is_use_high_loc v iaddr then
1767+
self#fvarinv#add_use_high_loc defloc v iaddr)
1768+
end) deflocs
1769+
end
1770+
1771+
method add_use_loc (v: variable_t) (iaddr: string) =
1772+
let varix = v#getName#getSeqNumber in
1773+
let entry =
1774+
if H.mem uselocs varix then
1775+
H.find uselocs varix
1776+
else
1777+
[] in
1778+
H.replace uselocs varix (iaddr :: entry)
1779+
1780+
method add_use_high_loc (v: variable_t) (iaddr: string) =
1781+
let varix = v#getName#getSeqNumber in
1782+
let entry =
1783+
if H.mem usehighlocs varix then
1784+
H.find usehighlocs varix
1785+
else
1786+
[] in
1787+
H.replace usehighlocs varix (iaddr :: entry)
1788+
1789+
method is_use_loc (v: variable_t) (iaddr: string) =
1790+
let varix = v#getName#getSeqNumber in
1791+
(H.mem uselocs varix) && (List.mem iaddr (H.find uselocs varix))
1792+
1793+
method is_use_high_loc (v: variable_t) (iaddr: string) =
1794+
let varix = v#getName#getSeqNumber in
1795+
(H.mem usehighlocs varix) && (List.mem iaddr (H.find usehighlocs varix))
1796+
17531797
method iinv (iaddr: ctxt_iaddress_t): location_invariant_int =
17541798
invio#get_location_invariant iaddr
17551799

CodeHawk/CHB/bchlib/bCHLibTypes.mli

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,6 +1656,9 @@ class type location_var_invariant_int =
16561656
object
16571657
method reset: unit
16581658
method add_fact: var_invariant_fact_t -> unit
1659+
method add_use_loc: variable_t -> string -> unit
1660+
method add_use_high_loc: variable_t -> string -> unit
1661+
method collect_use_facts: unit
16591662

16601663
(* accessors *)
16611664
method get_var_facts: variable_t -> var_invariant_int list
@@ -1684,6 +1687,10 @@ class type var_invariant_io_int =
16841687
method add_def_use: string -> variable_t -> symbol_t list -> unit
16851688
method add_def_use_high: string -> variable_t -> symbol_t list -> unit
16861689

1690+
method add_use_loc: string -> variable_t -> string -> unit
1691+
method add_use_high_loc: string -> variable_t -> string -> unit
1692+
method collect_use_facts: unit
1693+
16871694
(* accessors *)
16881695
method get_location_var_invariant: string -> location_var_invariant_int
16891696
method get_multiple_reaching_defs: (string * var_invariant_int) list
@@ -4971,6 +4978,16 @@ object
49714978
[iaddr].*)
49724979
method ivarinv: ctxt_iaddress_t -> location_var_invariant_int
49734980

4981+
method add_reaching_def: string -> variable_t -> symbol_t list -> unit
4982+
4983+
method add_use_loc: variable_t -> string -> unit
4984+
4985+
method add_use_high_loc: variable_t -> string -> unit
4986+
4987+
method is_use_loc: variable_t -> string -> bool
4988+
4989+
method is_use_high_loc: variable_t -> string -> bool
4990+
49744991
(** {2 Invariant reset}
49754992
49764993
Note: currently used only for x86.

CodeHawk/CHB/bchlib/bCHLocationVarInvariant.ml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,15 @@ object (self)
145145
val table = H.create 5 (* facts indexed by variable seq number *)
146146
val facts = H.create 3 (* var_invariant_fact index -> var_invariant_int *)
147147

148+
val uselocs = H.create 5 (* var-ix -> (var, use locations) *)
149+
val usehighlocs = H.create 5 (* var-ix -> (var, use-high locations) *)
150+
148151
method reset =
149152
begin
150153
H.clear table;
151154
H.clear facts;
155+
H.clear uselocs;
156+
H.clear usehighlocs;
152157
end
153158

154159
method add_fact (fact: var_invariant_fact_t) =
@@ -164,6 +169,37 @@ object (self)
164169
H.replace table varindex (fact :: entry)
165170
end
166171

172+
method private add_loc table (v: variable_t) (useloc: string) =
173+
let varix = v#getName#getSeqNumber in
174+
let (_, entry) =
175+
if H.mem table varix then
176+
H.find table varix
177+
else
178+
let locset = new SymbolCollections.set_t in
179+
begin
180+
H.add table varix (v, locset);
181+
(v, locset)
182+
end in
183+
entry#add (new symbol_t useloc)
184+
185+
method add_use_loc (var: variable_t) (useloc: string) =
186+
self#add_loc uselocs var useloc
187+
188+
method add_use_high_loc (var: variable_t) (useloc: string) =
189+
self#add_loc usehighlocs var useloc
190+
191+
method collect_use_facts =
192+
begin
193+
H.iter
194+
(fun _ (var, locs) ->
195+
let locs = List.sort Stdlib.compare locs#toList in
196+
self#add_fact (DefUse (var, locs))) uselocs;
197+
H.iter
198+
(fun _ (var, locs) ->
199+
let locs = List.sort Stdlib.compare locs#toList in
200+
self#add_fact (DefUseHigh (var,locs))) usehighlocs
201+
end
202+
167203
method get_var_facts (var: variable_t): var_invariant_int list =
168204
List.filter (fun f -> f#get_variable#equal var) self#get_facts
169205

@@ -232,10 +268,19 @@ object (self)
232268
method private add (iaddr: string) (fact: var_invariant_fact_t) =
233269
(self#get_location_var_invariant iaddr)#add_fact fact
234270

271+
method collect_use_facts =
272+
invariants#iter (fun _ v -> v#collect_use_facts)
273+
235274
method add_reaching_def
236275
(iaddr: string) (var: variable_t) (locs: symbol_t list) =
237276
self#add iaddr (ReachingDef (var, locs))
238277

278+
method add_use_loc (defloc: string) (v: variable_t) (useloc: string) =
279+
(self#get_location_var_invariant defloc)#add_use_loc v useloc
280+
281+
method add_use_high_loc (defloc: string) (v: variable_t) (useloc: string) =
282+
(self#get_location_var_invariant defloc)#add_use_high_loc v useloc
283+
239284
method add_flag_reaching_def
240285
(iaddr: string) (var: variable_t) (locs: symbol_t list) =
241286
self#add iaddr (FlagReachingDef (var, locs))

CodeHawk/CHB/bchlib/bCHVersion.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ end
9595

9696

9797
let version = new version_info_t
98-
~version:"0.6.0_20241111"
99-
~date:"2024-11-11"
98+
~version:"0.6.0_20241118"
99+
~date:"2024-11-18"
100100
~licensee: None
101101
~maxfilesize: None
102102
()

0 commit comments

Comments
 (0)