@@ -133,6 +133,7 @@ let pr_expr = xpr_formatter#pr_expr
133133
134134class function_environment_t
135135 (faddr :doubleword_int )
136+ (fndata : function_data_int )
136137 (varmgr :variable_manager_int ):function_environment_int =
137138object (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
0 commit comments