@@ -95,6 +95,7 @@ object (self)
9595 val sp_offset_table = mk_index_table " sp-offset-table"
9696 val instrx_table = mk_index_table " instrx-table"
9797 val xd = vard#xd
98+ val fndata = BCHFunctionData. functions_data#get_function faddr
9899
99100 val mutable tables = []
100101
@@ -127,6 +128,20 @@ object (self)
127128 let varinv = floc#varinv in
128129 let e16_c = int_constant_expr e16 in
129130 let e32_c = int_constant_expr e32 in
131+
132+ let get_regvar_type_annotation () : btype_t option =
133+ if fndata#has_regvar_type_annotation floc#l#i then
134+ TR. tfold
135+ ~ok: (fun t -> Some t)
136+ ~error: (fun e ->
137+ begin
138+ log_error_result __FILE__ __LINE__ e;
139+ None
140+ end )
141+ (fndata#get_regvar_type_annotation floc#l#i)
142+ else
143+ None in
144+
130145 let log_dc_error_result (file : string ) (line : int ) (e : string list ) =
131146 if BCHSystemSettings. system_settings#collect_data then
132147 log_error_result ~msg: (p2s floc#l#toPretty) file line e
@@ -621,6 +636,7 @@ object (self)
621636 (floc#get_var_at_address ~btype: (ptr_deref ptype) xx)
622637 else
623638 xx in
639+ let xx = TR. tvalue (floc#convert_xpr_offsets xx) ~default: xx in
624640 let rdef = get_rdef_r xvar_r in
625641 (xx :: xprs, xvar_r :: xvars, rdef :: rdefs, index + 1 ))
626642 ([] , [] , [] , 1 ) callargs in
@@ -707,6 +723,10 @@ object (self)
707723 [get_rdef_r xrn_r; get_rdef_r xrm_r] @ (get_all_rdefs_r rresult_r) in
708724 let uses = get_def_use_r vrd_r in
709725 let useshigh = get_def_use_high_r vrd_r in
726+ let vrtype =
727+ match get_regvar_type_annotation () with
728+ | Some t -> t
729+ | _ -> t_unknown in
710730 (*
711731 let rresult_r =
712732 TR.tmap
@@ -720,6 +740,7 @@ object (self)
720740 let (tagstring, args) =
721741 mk_instrx_data_r
722742 ~vars_r: [vrd_r]
743+ ~types: [vrtype]
723744 ~xprs_r: [xrn_r; xrm_r; result_r; rresult_r; xxrn_r; xxrm_r]
724745 ~rdefs: rdefs
725746 ~uses: [uses]
@@ -1042,6 +1063,8 @@ object (self)
10421063 let csetter = floc#f#get_associated_cc_setter floc#cia in
10431064 let tcond = rewrite_test_expr csetter txpr in
10441065 let fcond = rewrite_test_expr csetter fxpr in
1066+ let tcond_r = floc#convert_xpr_offsets ~size: (Some 4 ) tcond in
1067+ let fcond_r = floc#convert_xpr_offsets ~size: (Some 4 ) fcond in
10451068 let bytestr =
10461069 try
10471070 let instr =
@@ -1059,7 +1082,7 @@ object (self)
10591082 let rdefs = (get_all_rdefs txpr) @ (get_all_rdefs tcond) in
10601083 let (tagstring, args) =
10611084 mk_instrx_data_r
1062- ~xprs_r: [Ok txpr; Ok fxpr; Ok tcond; Ok fcond ; xtgt_r]
1085+ ~xprs_r: [Ok txpr; Ok fxpr; tcond_r; fcond_r ; xtgt_r]
10631086 ~rdefs
10641087 () in
10651088 let (tags, args) = (tagstring :: [" TF" ; csetter; bytestr], args) in
@@ -1156,6 +1179,8 @@ object (self)
11561179 let xresult_r =
11571180 TR. tmap2 (fun xrn xrm -> XOp (XMinus , [xrn; xrm])) xrn_r xrm_r in
11581181 let result_r = TR. tmap rewrite_expr xresult_r in
1182+ let result_r =
1183+ TR. tbind (floc#convert_xpr_offsets ~size: (Some 4 )) result_r in
11591184 let rdefs =
11601185 [get_rdef_r xrn_r; get_rdef_r xrm_r] @ (get_all_rdefs_r result_r) in
11611186 let (tagstring, args) =
@@ -1493,6 +1518,8 @@ object (self)
14931518 let useshigh = [get_def_use_high_r vrt_r] in
14941519 let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
14951520 let xrmem_r = TR. tmap rewrite_expr xmem_r in
1521+ let xrmem_r =
1522+ TR. tbind (floc#convert_xpr_offsets ~size: (Some 4 )) xrmem_r in
14961523 let _ =
14971524 TR. tfold_default
14981525 (fun xrmem -> ignore (get_string_reference floc xrmem)) () xrmem_r in
@@ -1697,6 +1724,7 @@ object (self)
16971724 let vmem_r = mem#to_variable floc in
16981725 let xmem_r = mem#to_expr floc in
16991726 let xrmem_r = TR. tmap rewrite_expr xmem_r in
1727+ let xrmem_r = TR. tbind floc#convert_xpr_offsets xrmem_r in
17001728 let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
17011729 let rdefs =
17021730 [get_rdef_r xrn_r; get_rdef_r xrm_r; get_rdef_memvar_r vmem_r]
@@ -2629,11 +2657,14 @@ object (self)
26292657
26302658 | StoreRegister (c , rt , rn , rm , mem , _ ) ->
26312659 let vmem_r = mem#to_variable floc in
2660+ let vmem_r =
2661+ TR. tbind (floc#convert_variable_offsets ~size: (Some 4 )) vmem_r in
26322662 let xaddr_r = mem#to_address floc in
26332663 let xrt_r = rt#to_expr floc in
26342664 let xrn_r = rn#to_expr floc in
26352665 let xrm_r = rm#to_expr floc in
26362666 let xxrt_r = TR. tmap rewrite_expr xrt_r in
2667+ let xxrt_r = TR. tbind floc#convert_xpr_offsets xxrt_r in
26372668 let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
26382669 let lhsvar_r = TR. tbind floc#get_var_at_address xxaddr_r in
26392670 let rdefs =
@@ -2807,11 +2838,13 @@ object (self)
28072838
28082839 | StoreRegisterHalfword (c , rt , rn , rm , mem , _ ) ->
28092840 let vmem_r = mem#to_variable floc in
2841+ let vmem_r = TR. tbind floc#convert_variable_offsets vmem_r in
28102842 let xaddr_r = mem#to_address floc in
28112843 let xrt_r = rt#to_expr floc in
28122844 let xrn_r = rn#to_expr floc in
28132845 let xrm_r = rm#to_expr floc in
28142846 let xxrt_r = TR. tmap rewrite_expr xrt_r in
2847+ let xxrt_r = TR. tbind floc#convert_xpr_offsets xxrt_r in
28152848 let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
28162849 let rdefs =
28172850 [get_rdef_r xrn_r;
0 commit comments