Skip to content

Commit b5220b0

Browse files
committed
CHB: add attributes to assembly variables
1 parent 16ab1ee commit b5220b0

File tree

3 files changed

+75
-11
lines changed

3 files changed

+75
-11
lines changed

CodeHawk/CHB/bchlib/bCHFunctionInfo.ml

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ let pr_expr = xpr_formatter#pr_expr
133133

134134
class function_environment_t
135135
(faddr:doubleword_int)
136+
(fndata: function_data_int)
136137
(varmgr:variable_manager_int):function_environment_int =
137138
object (self)
138139

@@ -142,7 +143,8 @@ object (self)
142143

143144
initializer
144145
List.iter (fun av ->
145-
ignore (self#mk_variable av)) varmgr#get_assembly_variables
146+
let atts = self#varmgr#get_av_attributes av#index in
147+
ignore (self#mk_variable ~atts av)) varmgr#get_assembly_variables
146148

147149
method get_variable_comparator = varmgr#get_external_variable_comparator
148150

@@ -161,7 +163,7 @@ object (self)
161163

162164
method variable_names = variable_names
163165

164-
method varmgr = varmgr
166+
method varmgr: variable_manager_int = varmgr
165167

166168
method set_variable_name (v:variable_t) (name:string) =
167169
variable_names#add v#getName#getSeqNumber name
@@ -578,19 +580,21 @@ object (self)
578580
(* Keep a separate map of symbolic variables per domain *)
579581
val dom_symchifvars = H.create 5
580582

581-
method private add_chifvar (v:assembly_variable_int) (vt:variable_type_t) =
583+
method private add_chifvar
584+
?(atts = []) (v:assembly_variable_int) (vt:variable_type_t) =
582585
if H.mem chifvars v#index then
583586
H.find chifvars v#index
584587
else
585-
let vname = new symbol_t ~seqnr:v#index v#get_name in
588+
let vname = new symbol_t ~atts ~seqnr:v#index v#get_name in
586589
let chifvar = scope#mkVariable vname vt in
587590
begin
588-
H.add chifvars v#index chifvar ;
591+
H.add chifvars v#index chifvar;
592+
(if (List.length atts) > 0 then self#varmgr#set_av_attributes v#index atts);
589593
chifvar
590594
end
591595

592-
method private mk_variable (v:assembly_variable_int) =
593-
self#add_chifvar v NUM_VAR_TYPE
596+
method private mk_variable ?(atts = []) (v:assembly_variable_int) =
597+
self#add_chifvar ~atts v NUM_VAR_TYPE
594598

595599
method private add_domain_symchifvar
596600
(domain: string) (seqnr: int) (v: variable_t) =
@@ -772,7 +776,12 @@ object (self)
772776
(LBLOCK [STR "Unknown memory reference in mk_offset_memory_variable"]))
773777
else
774778
let avar = varmgr#make_memory_variable memref ~size offset in
775-
self#mk_variable avar
779+
let var = self#mk_variable avar in
780+
let _ =
781+
ch_diagnostics_log#add
782+
"mk_offset_memory_variable"
783+
(LBLOCK [var#toPretty]) in
784+
var
776785

777786
method mk_basevar_memory_variable
778787
?(size=4)
@@ -893,11 +902,21 @@ object (self)
893902
tmap
894903
~msg:(__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": memref:stack")
895904
(fun memoffset ->
905+
let atts: string list = if stackslot#is_loopcounter then ["lc"] else [] in
896906
let svar =
897907
self#mk_variable
908+
~atts
898909
(self#varmgr#make_local_stack_variable
899910
~offset:memoffset (mkNumerical stackslot#offset)) in
900911
let name = stackslot#name ^ (memory_offset_to_string memoffset) in
912+
let _ =
913+
match atts with
914+
| [] -> ()
915+
| _ ->
916+
ch_diagnostics_log#add
917+
"loopcounter variable on the stack"
918+
(LBLOCK [STR "Offset: "; offset#toPretty; STR ": "; STR name;
919+
STR "; "; svar#toPretty]) in
901920
begin
902921
self#set_variable_name svar name;
903922
svar
@@ -1290,14 +1309,18 @@ object (self)
12901309
method get_sideeffvar_count =
12911310
List.length (List.filter self#is_sideeffect_value self#get_variables)
12921311

1293-
method is_global_variable (v:variable_t) =
1312+
method is_global_variable (v: variable_t) =
12941313
(varmgr#is_global_variable v) ||
12951314
((varmgr#is_initial_memory_value v) &&
12961315
(tfold_default
12971316
self#is_global_variable
12981317
false
12991318
(varmgr#get_initial_memory_value_variable v)))
13001319

1320+
method is_mutable_global_variable (v: variable_t): bool =
1321+
(varmgr#is_global_variable v)
1322+
&& (not (fndata#is_const_global_variable (self#variable_name_to_string v)))
1323+
13011324
method has_global_variable_address (v: variable_t): bool =
13021325
varmgr#has_global_variable_address v
13031326

@@ -1632,7 +1655,7 @@ object (self)
16321655
* These data items are saved and reloaded as part of the intermediate *
16331656
* analysis results. *
16341657
* ------------------------------------------------------------------------- *)
1635-
val env = new function_environment_t faddr varmgr
1658+
val env = new function_environment_t faddr fndata varmgr
16361659
val constant_table = new VariableCollections.table_t (* constants *)
16371660
val calltargets = H.create 5 (* call-targets *)
16381661

CodeHawk/CHB/bchlib/bCHVarDictionary.ml

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ open BCHBasicTypes
4444
open BCHLibTypes
4545
open BCHSumTypeSerializer
4646

47+
module H = Hashtbl
4748
module TR = CHTraceResult
4849

4950

@@ -74,6 +75,9 @@ object (self)
7475

7576
val faddr = faddr
7677
val xd = xd
78+
79+
val assembly_variable_attributes = H.create 5 (* avar#index -> atts *)
80+
7781
val memory_base_table = mk_index_table "memory-base-table"
7882
val memory_offset_table = mk_index_table "memory-offset-table"
7983
val sideeffect_argument_location_table =
@@ -106,6 +110,18 @@ object (self)
106110

107111
method xd = xd
108112

113+
method set_av_attributes (index: int) (atts: string list) =
114+
H.replace assembly_variable_attributes index atts
115+
116+
method get_av_attributes (index: int): string list =
117+
if H.mem assembly_variable_attributes index then
118+
H.find assembly_variable_attributes index
119+
else
120+
[]
121+
122+
method private list_av_attributes: (int * string list) list =
123+
H.fold (fun k v a -> (k, v) :: a) assembly_variable_attributes []
124+
109125
method get_indexed_variables =
110126
List.map (fun (_,index) -> (index,self#get_assembly_variable_denotation index))
111127
assembly_variable_denotation_table#items
@@ -346,10 +362,27 @@ object (self)
346362
?(tag="isa") (node: xml_element_int) (sa: stack_access_t) =
347363
node#setIntAttribute tag (self#index_stack_access sa)
348364

365+
method private read_xml_av_attributes (node: xml_element_int) =
366+
List.iter (fun avnode ->
367+
let index = avnode#getIntAttribute "ix" in
368+
let atts = avnode#getAttribute "atts" in
369+
let atts = String.split_on_char ',' atts in
370+
self#set_av_attributes index atts) (node#getTaggedChildren "av")
371+
349372
method write_xml (node:xml_element_int) =
373+
let anode = xmlElement "av-attributes" in
350374
let vnode = xmlElement "var-dictionary" in
351375
let xnode = xmlElement "xpr-dictionary" in
352376
begin
377+
anode#appendChildren
378+
(List.map
379+
(fun (k, v) ->
380+
let avnode = xmlElement "av" in
381+
begin
382+
avnode#setIntAttribute "ix" k;
383+
avnode#setAttribute "atts" (String.concat "," v);
384+
avnode
385+
end) self#list_av_attributes);
353386
vnode#appendChildren
354387
(List.map
355388
(fun t ->
@@ -360,13 +393,15 @@ object (self)
360393
end) tables);
361394
xd#write_xml xnode;
362395
vnode#appendChildren [xnode];
363-
node#appendChildren [vnode]
396+
node#appendChildren [anode; vnode]
364397
end
365398

366399
method read_xml (node:xml_element_int) =
367400
let vnode = node#getTaggedChild "var-dictionary" in
368401
let getc = vnode#getTaggedChild in
369402
begin
403+
(if node#hasOneTaggedChild "av-attributes" then
404+
self#read_xml_av_attributes (node#getTaggedChild "av-attributes"));
370405
xd#read_xml (getc "xpr-dictionary");
371406
List.iter (fun t -> t#read_xml (getc t#get_name)) tables
372407
end

CodeHawk/CHB/bchlib/bCHVariable.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,12 @@ object (self)
543543

544544
method memrefmgr = memrefmgr
545545

546+
method set_av_attributes (avindex: int) (atts: string list) =
547+
self#vard#set_av_attributes avindex atts
548+
549+
method get_av_attributes (avindex: int): string list =
550+
self#vard#get_av_attributes avindex
551+
546552
method private mk_variable (denotation:assembly_variable_denotation_t) =
547553
let index = vard#index_assembly_variable_denotation denotation in
548554
if H.mem vartable index then

0 commit comments

Comments
 (0)