Skip to content

Commit cc681d5

Browse files
committed
CHB:ARM: add type constraints and fields
1 parent 02aa98d commit cc681d5

File tree

2 files changed

+102
-13
lines changed

2 files changed

+102
-13
lines changed

CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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;

CodeHawk/CHB/bchlibarm32/bCHFnARMTypeConstraints.ml

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ object (self)
110110
else
111111
None in
112112

113+
let get_stackvar_type_annotation (offset: int): btype_t option =
114+
if fndata#has_stackvar_type_annotation offset then
115+
TR.tfold
116+
~ok:(fun t -> Some t)
117+
~error:(fun e ->
118+
begin
119+
log_error_result __FILE__ __LINE__ e;
120+
None
121+
end)
122+
(fndata#get_stackvar_type_annotation offset)
123+
else
124+
None in
125+
113126
let rdef_pairs_to_pretty (pairs: (symbol_t * symbol_t) list) =
114127
pretty_print_list
115128
pairs
@@ -242,6 +255,20 @@ object (self)
242255
let xrn_r = rn#to_expr floc in
243256
begin
244257

258+
(match get_regvar_type_annotation () with
259+
| Some t ->
260+
let rdreg = rd#to_register in
261+
let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
262+
let opttc = mk_btype_constraint lhstypevar t in
263+
(match opttc with
264+
| Some tc ->
265+
begin
266+
log_type_constraint "ADD-rvintro" tc;
267+
store#add_constraint tc
268+
end
269+
| _ -> ())
270+
| _ -> ());
271+
245272
(if rm#is_immediate && (rm#to_numerical#toInt < 256) then
246273
let rdreg = rd#to_register in
247274
let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
@@ -483,17 +510,28 @@ object (self)
483510
| Some offset ->
484511
let lhstypevar =
485512
mk_localstack_lhs_typevar offset faddr iaddr in
486-
if is_pointer ptype then
487-
let eltype = ptr_deref ptype in
488-
let atype = t_array eltype 1 in
489-
let opttc = mk_btype_constraint lhstypevar atype in
490-
match opttc with
491-
| Some tc ->
492-
begin
493-
log_type_constraint "BL-reg-arg" tc;
494-
store#add_constraint tc
495-
end
496-
| _ -> ())
513+
match get_stackvar_type_annotation offset with
514+
| Some t ->
515+
let opttc = mk_btype_constraint lhstypevar t in
516+
(match opttc with
517+
| Some tc ->
518+
begin
519+
log_type_constraint "BL-stack-vintro" tc;
520+
store#add_constraint tc
521+
end
522+
| _ -> ())
523+
| _ ->
524+
if is_pointer ptype then
525+
let eltype = ptr_deref ptype in
526+
let atype = t_array eltype 1 in
527+
let opttc = mk_btype_constraint lhstypevar atype in
528+
match opttc with
529+
| Some tc ->
530+
begin
531+
log_type_constraint "BL-reg-arg" tc;
532+
store#add_constraint tc
533+
end
534+
| _ -> ())
497535
end
498536
) callargs
499537

@@ -787,11 +825,29 @@ object (self)
787825

788826
end
789827

790-
| LoadRegisterHalfword (_, rt, rn, rm, _, _) when rm#is_immediate ->
828+
| LoadRegisterHalfword (_, rt, rn, rm, memop, _) when rm#is_immediate ->
791829
let rtreg = rt#to_register in
792830
let rttypevar = mk_reglhs_typevar rtreg faddr iaddr in
793831
begin
794832

833+
(* loaded type may be known *)
834+
(let xmem_r = memop#to_expr floc in
835+
let xrmem_r =
836+
TR.tmap (fun x -> simplify_xpr (floc#inv#rewrite_expr x)) xmem_r in
837+
let xtype_r = TR.tmap floc#get_xpr_type xrmem_r in
838+
let xtype_opt = TR.tvalue xtype_r ~default:None in
839+
match xtype_opt with
840+
| Some t ->
841+
let opttc = mk_btype_constraint rttypevar t in
842+
(match opttc with
843+
| Some tc ->
844+
begin
845+
log_type_constraint "LDRH-var" tc;
846+
store#add_constraint tc
847+
end
848+
| _ -> ())
849+
| _ -> ());
850+
795851
(* LDRH rt, [rn, rm] : X_rndef.load <: X_rt *)
796852
(let xrdef = get_variable_rdefs_r (rn#to_variable floc) in
797853
let rnreg = rn#to_register in

0 commit comments

Comments
 (0)