Skip to content

Commit f36342c

Browse files
committed
ARM: add more type inference
1 parent a58d1b4 commit f36342c

File tree

3 files changed

+71
-17
lines changed

3 files changed

+71
-17
lines changed

CodeHawk/CHB/bchlib/bCHVersion.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ end
9595

9696

9797
let version = new version_info_t
98-
~version:"0.6.0_20250312"
99-
~date:"2025-03-12"
98+
~version:"0.6.0_20250313"
99+
~date:"2025-03-13"
100100
~licensee: None
101101
~maxfilesize: None
102102
()

CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2658,7 +2658,8 @@ object (self)
26582658
| StoreRegister (c, rt, rn, rm, mem, _) ->
26592659
let vmem_r = mem#to_variable floc in
26602660
let vmem_r =
2661-
TR.tbind (floc#convert_variable_offsets ~size:(Some 4)) vmem_r in
2661+
let r = TR.tbind (floc#convert_variable_offsets ~size:(Some 4)) vmem_r in
2662+
if Result.is_ok r then r else vmem_r in
26622663
let xaddr_r = mem#to_address floc in
26632664
let xrt_r = rt#to_expr floc in
26642665
let xrn_r = rn#to_expr floc in
@@ -2704,6 +2705,9 @@ object (self)
27042705

27052706
| StoreRegisterByte (c, rt, rn, rm, mem, _) ->
27062707
let vmem_r = mem#to_variable floc in
2708+
let vmem_r =
2709+
let r = TR.tbind (floc#convert_variable_offsets ~size:(Some 1)) vmem_r in
2710+
if Result.is_ok r then r else vmem_r in
27072711
let xaddr_r = mem#to_address floc in
27082712
let xrt_r = rt#to_expr floc in
27092713
let xrn_r = rn#to_expr floc in
@@ -2840,7 +2844,9 @@ object (self)
28402844

28412845
| StoreRegisterHalfword (c, rt, rn, rm, mem, _) ->
28422846
let vmem_r = mem#to_variable floc in
2843-
let vmem_r = TR.tbind floc#convert_variable_offsets vmem_r in
2847+
let vmem_r =
2848+
let r = TR.tbind (floc#convert_variable_offsets ~size:(Some 2)) vmem_r in
2849+
if Result.is_ok r then r else vmem_r in
28442850
let xaddr_r = mem#to_address floc in
28452851
let xrt_r = rt#to_expr floc in
28462852
let xrn_r = rn#to_expr floc in

CodeHawk/CHB/bchlibarm32/bCHFnARMTypeConstraints.ml

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,22 @@ object (self)
958958
| Move (_, _, rd, rm, _, _) when rm#is_register ->
959959
let xrm_r = rm#to_expr floc in
960960
let rdreg = rd#to_register in
961+
let rdtypevar = mk_reglhs_typevar rdreg faddr iaddr in
961962
begin
963+
964+
(* variable introduction for lhs with type *)
965+
(match get_regvar_type_annotation () with
966+
| Some t ->
967+
let opttc = mk_btype_constraint rdtypevar t in
968+
(match opttc with
969+
| Some tc ->
970+
begin
971+
log_type_constraint "MOV-rvintro" tc;
972+
store#add_constraint tc
973+
end
974+
| _ -> ())
975+
| _ -> ());
976+
962977
(* propagate function argument type *)
963978
(match getopt_initial_argument_value_r xrm_r with
964979
| Some (rmreg, off) when off = 0 ->
@@ -1014,18 +1029,36 @@ object (self)
10141029
| _ ->
10151030
let reg = register_of_arm_register AR0 in
10161031
let typevar = mk_reglhs_typevar reg faddr iaddr in
1017-
let opttc = mk_btype_constraint typevar rtype in
1018-
match opttc with
1019-
| Some tc ->
1020-
begin
1021-
log_type_constraint "POP-rv" tc;
1022-
store#add_constraint tc
1023-
end
1024-
| _ ->
1025-
begin
1026-
log_no_type_constraint "POP-rv" rtype;
1027-
()
1028-
end)
1032+
1033+
begin
1034+
(* use function return type *)
1035+
(let opttc = mk_btype_constraint typevar rtype in
1036+
match opttc with
1037+
| Some tc ->
1038+
begin
1039+
log_type_constraint "POP-rv" tc;
1040+
store#add_constraint tc
1041+
end
1042+
| _ ->
1043+
begin
1044+
log_no_type_constraint "POP-rv" rtype;
1045+
()
1046+
end);
1047+
1048+
(* propagate via reaching defs *)
1049+
(let r0var = floc#env#mk_arm_register_variable AR0 in
1050+
let r0defs = get_variable_rdefs r0var in
1051+
List.iter (fun r0def ->
1052+
let r0addr = r0def#getBaseName in
1053+
if r0addr != "init" then
1054+
let r0typevar = mk_reglhs_typevar reg faddr r0addr in
1055+
let r0typeterm = mk_vty_term r0typevar in
1056+
let lhstypeterm = mk_vty_term typevar in
1057+
begin
1058+
log_subtype_constraint "POP-R0-rdef" r0typeterm lhstypeterm;
1059+
store#add_subtype_constraint r0typeterm lhstypeterm
1060+
end) r0defs)
1061+
end)
10291062

10301063
| Push _
10311064
| Pop _ ->
@@ -1105,7 +1138,22 @@ object (self)
11051138
begin
11061139
log_subtype_constraint "STR-imm-off" rttypeterm lhstypeterm;
11071140
store#add_subtype_constraint rttypeterm lhstypeterm
1108-
end) rtrdefs)
1141+
end) rtrdefs);
1142+
1143+
(* import type from stackvar-introductions *)
1144+
(match get_stackvar_type_annotation offset with
1145+
| None -> ()
1146+
| Some t ->
1147+
let lhstypevar =
1148+
mk_localstack_lhs_typevar offset faddr iaddr in
1149+
let opttc = mk_btype_constraint lhstypevar t in
1150+
(match opttc with
1151+
| Some tc ->
1152+
begin
1153+
log_type_constraint "STR-stack-vintro" tc;
1154+
store#add_constraint tc
1155+
end
1156+
| _ -> ()))
11091157
end);
11101158

11111159
(List.iter (fun rndsym ->

0 commit comments

Comments
 (0)