@@ -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))
0 commit comments