@@ -90,15 +90,13 @@ let x2p = xpr_formatter#pr_expr
9090let p2s = pretty_to_string
9191let x2s x = p2s (x2p x)
9292
93- let opt_size_to_string (s : int option ) =
94- match s with
95- | Some i -> " size:" ^ (string_of_int i)
96- | _ -> " size:None"
93+ let opti2s (i : int option ) =
94+ if Option. is_some i then string_of_int (Option. get i) else " ?"
9795
98- let opt_type_to_string ( t : btype_t option ) =
99- match t with
100- | Some t -> " btype: " ^ (btype_to_string t)
101- | _ -> " btype:None "
96+ let _ty2s ( ty : btype_t ) =
97+ if is_unknown_type ty then " ? " else btype_to_string ty
98+ let optty2s ( ty : btype_t option ) =
99+ if Option. is_some ty then btype_to_string ( Option. get ty) else " ? "
102100
103101
104102let log_error (tag : string ) (msg : string ): tracelogspec_t =
@@ -665,6 +663,14 @@ object (self)
665663 ?(size =4 )
666664 (var : variable_t )
667665 (numoffset : numerical_t ): variable_t traceresult =
666+ let _ =
667+ log_diagnostics_result
668+ ~msg: (p2s self#l#toPretty)
669+ ~tag: " get-memory-variable-numoffset"
670+ __FILE__ __LINE__
671+ [" size: " ^ (string_of_int size);
672+ " var: " ^ (p2s var#toPretty);
673+ " numoffset: " ^ (numoffset#toString)] in
668674 let inv = self#inv in
669675 let mk_memvar memref_r memoffset_r =
670676 let _ =
@@ -1512,9 +1518,9 @@ object (self)
15121518 ~msg: (p2s self#l#toPretty)
15131519 ~tag: " convert_xpr_to_c_expr"
15141520 __FILE__ __LINE__
1515- [(opt_size_to_string size) ^ " ; "
1516- ^ (opt_type_to_string xtype) ^ " ; "
1517- ^ " x: " ^ (x2s x)] in
1521+ [" size: " ^ (opti2s size);
1522+ " xtype: " ^ (optty2s xtype);
1523+ " x: " ^ (x2s x)] in
15181524 match xtype with
15191525 | None -> self#convert_xpr_offsets ~size x
15201526 | Some t ->
@@ -1598,8 +1604,8 @@ object (self)
15981604 TR. tmap (fun v -> XVar v) var_r
15991605 | _ ->
16001606 Error [__FILE__ ^ " :" ^ (string_of_int __LINE__) ^ " : "
1601- ^ (opt_size_to_string size) ^ " ; "
1602- ^ (opt_type_to_string xtype) ^ " ; "
1607+ ^ " size: " ^ (opti2s size) ^ " ; "
1608+ ^ " type: " ^ (optty2s xtype) ^ " ; "
16031609 ^ " addr: " ^ (x2s a)
16041610 ^ " : Not yet handled" ]
16051611
@@ -1609,8 +1615,8 @@ object (self)
16091615 | None -> self#convert_variable_offsets ~size v
16101616 | _ ->
16111617 Error [__FILE__ ^ " :" ^ (string_of_int __LINE__) ^ " : "
1612- ^ (opt_size_to_string size) ^ " ; "
1613- ^ (opt_type_to_string vtype) ^ " ; "
1618+ ^ " size: " ^ (opti2s size) ^ " ; "
1619+ ^ " type: " ^ (optty2s vtype) ^ " ; "
16141620 ^ " v: " ^ (p2s v#toPretty)
16151621 ^ " : Not yet implemented" ]
16161622
@@ -1672,14 +1678,22 @@ object (self)
16721678 memref_r memoff_r
16731679 | _ ->
16741680 Error [__FILE__ ^ " :" ^ (string_of_int __LINE__) ^ " : "
1675- ^ (opt_size_to_string size) ^ " ; "
1676- ^ (opt_type_to_string vtype) ^ " ; "
1681+ ^ " size: " ^ (opti2s size) ^ " ; "
1682+ ^ " vtype: " ^ (optty2s vtype) ^ " ; "
16771683 ^ " addr: " ^ (x2s a)
16781684 ^ " : Not yet handled" ]
16791685
16801686
16811687 method convert_variable_offsets
16821688 ?(vtype =None ) ?(size =None ) (v : variable_t ): variable_t traceresult =
1689+ let _ =
1690+ log_diagnostics_result
1691+ ~msg: (p2s self#l#toPretty)
1692+ ~tag: " convert-variable-offsets"
1693+ __FILE__ __LINE__
1694+ [" vtype: " ^ (optty2s vtype);
1695+ " size: " ^ (opti2s size);
1696+ " v: " ^ (p2s v#toPretty)] in
16831697 if self#env#is_basevar_memory_variable v then
16841698 let basevar_r = self#env#get_memvar_basevar v in
16851699 let offset_r = self#env#get_memvar_offset v in
@@ -1737,6 +1751,12 @@ object (self)
17371751
17381752 method convert_value_offsets
17391753 ?(size =None ) (v : variable_t ): variable_t traceresult =
1754+ let _ =
1755+ log_diagnostics_result
1756+ ~msg: (p2s self#l#toPretty)
1757+ ~tag: " convert-value-offsets"
1758+ __FILE__ __LINE__
1759+ [" size: " ^ (opti2s size); " v: " ^ (p2s v#toPretty)] in
17401760 if self#env#is_basevar_memory_value v then
17411761 let basevar_r = self#env#get_memval_basevar v in
17421762 let offset_r = self#env#get_memval_offset v in
@@ -1812,6 +1832,12 @@ object (self)
18121832
18131833 method convert_xpr_offsets
18141834 ?(xtype =None ) ?(size =None ) (x : xpr_t ): xpr_t traceresult =
1835+ let _ =
1836+ log_diagnostics_result
1837+ ~msg: (p2s self#l#toPretty)
1838+ ~tag: " convert-xpr-offsets"
1839+ __FILE__ __LINE__
1840+ [" xtype: " ^ (optty2s xtype); " size: " ^ (opti2s size); " x: " ^ (x2s x)] in
18151841 let rec aux exp =
18161842 match exp with
18171843 | XVar v when self#env#is_basevar_memory_value v ->
@@ -2349,41 +2375,51 @@ object (self)
23492375 rhs
23502376 | _ -> rhs in
23512377
2352- let rhs =
2353- (* if rhs is a composite symbolic expression, create a new variable
2378+ if self#f#env#is_global_variable lhs then
2379+ let _ =
2380+ log_diagnostics_result
2381+ ~msg: (p2s self#l#toPretty)
2382+ ~tag: (" get_assign_cmds_r: abstract global variable" )
2383+ __FILE__ __LINE__
2384+ [" lhs: " ^ (p2s lhs#toPretty); " rhs: " ^ (x2s rhs)] in
2385+ [ABSTRACT_VARS [lhs]]
2386+
2387+ else
2388+ let rhs =
2389+ (* if rhs is a composite symbolic expression, create a new variable
23542390 for it *)
2355- if self#is_composite_symbolic_value rhs then
2356- XVar (self#env#mk_symbolic_value rhs)
2357- else
2358- rhs in
2359- let reqN () = self#env#mk_num_temp in
2360- let reqC = self#env#request_num_constant in
2361- let (rhscmds, rhs_c) = xpr_to_numexpr reqN reqC rhs in
2362- let cmds = rhscmds @ [ASSIGN_NUM (lhs, rhs_c)] in
2363- let fndata = self#f#get_function_data in
2364- match fndata#get_regvar_intro self#ia with
2365- | Some rvi when rvi.rvi_cast && Option. is_some rvi.rvi_vartype ->
2366- TR. tfold
2367- ~ok: (fun reg ->
2368- let ty = Option. get rvi.rvi_vartype in
2369- let tcvar =
2370- self#f#env#mk_typecast_value self#cia rvi.rvi_name ty reg in
2371- begin
2372- log_result __FILE__ __LINE__
2373- [" Create typecast var for "
2374- ^ (register_to_string reg)
2375- ^ " at "
2376- ^ self#cia];
2377- cmds @ [ASSIGN_NUM (lhs, NUM_VAR tcvar)]
2378- end )
2379- ~error: (fun e ->
2380- begin
2381- log_error_result __FILE__ __LINE__
2382- (" expected a register variable" :: e);
2383- cmds
2384- end )
2385- (self#f#env#get_register lhs)
2386- | _ -> cmds
2391+ if self#is_composite_symbolic_value rhs then
2392+ XVar (self#env#mk_symbolic_value rhs)
2393+ else
2394+ rhs in
2395+ let reqN () = self#env#mk_num_temp in
2396+ let reqC = self#env#request_num_constant in
2397+ let (rhscmds, rhs_c) = xpr_to_numexpr reqN reqC rhs in
2398+ let cmds = rhscmds @ [ASSIGN_NUM (lhs, rhs_c)] in
2399+ let fndata = self#f#get_function_data in
2400+ match fndata#get_regvar_intro self#ia with
2401+ | Some rvi when rvi.rvi_cast && Option. is_some rvi.rvi_vartype ->
2402+ TR. tfold
2403+ ~ok: (fun reg ->
2404+ let ty = Option. get rvi.rvi_vartype in
2405+ let tcvar =
2406+ self#f#env#mk_typecast_value self#cia rvi.rvi_name ty reg in
2407+ begin
2408+ log_result __FILE__ __LINE__
2409+ [" Create typecast var for "
2410+ ^ (register_to_string reg)
2411+ ^ " at "
2412+ ^ self#cia];
2413+ cmds @ [ASSIGN_NUM (lhs, NUM_VAR tcvar)]
2414+ end )
2415+ ~error: (fun e ->
2416+ begin
2417+ log_error_result __FILE__ __LINE__
2418+ (" expected a register variable" :: e);
2419+ cmds
2420+ end )
2421+ (self#f#env#get_register lhs)
2422+ | _ -> cmds
23872423
23882424 (* Note: recording of loads and stores is performed by the different
23892425 architectures directly in FnXXXDictionary.*)
@@ -2448,6 +2484,15 @@ object (self)
24482484 [OPERATION ({ op_name = unknown_write_symbol; op_args = op_args});
24492485 ASSIGN_NUM (lhs, rhs)]
24502486
2487+ else if self#f#env#is_global_variable lhs then
2488+ let _ =
2489+ log_diagnostics_result
2490+ ~msg: (p2s self#l#toPretty)
2491+ ~tag: (" get_assign_cmds: abstract global variable" )
2492+ __FILE__ __LINE__
2493+ [" lhs: " ^ (p2s lhs#toPretty); " rhs: " ^ (x2s rhs_expr)] in
2494+ [ABSTRACT_VARS [lhs]]
2495+
24512496 else
24522497 rhsCmds @ [ASSIGN_NUM (lhs, rhs)]
24532498
0 commit comments