Skip to content

Commit 34c7332

Browse files
committed
CHB: add more type constraints
1 parent 5cf8b3b commit 34c7332

File tree

4 files changed

+112
-14
lines changed

4 files changed

+112
-14
lines changed

CodeHawk/CHB/bchlib/bCHFunctionInfo.ml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,12 @@ object (self)
876876
self#mk_variable (varmgr#make_global_variable ~size ~offset base) in
877877
begin
878878
(match name with
879-
| Some vname -> self#set_variable_name var vname
879+
| Some vname ->
880+
let ivar = self#mk_variable (varmgr#make_initial_memory_value var) in
881+
begin
882+
self#set_variable_name var vname;
883+
self#set_variable_name ivar (vname ^ "_in")
884+
end
880885
| _ -> ());
881886
Ok var
882887
end in

CodeHawk/CHB/bchlib/bCHTypeConstraintStore.ml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,7 @@ object (self)
293293
| [] -> ()
294294
| [_] -> ()
295295
| _ ->
296-
if List.for_all termset#has cterms then
297-
()
298-
else if List.exists termset#has cterms then
296+
if List.exists termset#has cterms then
299297
begin
300298
List.iter termset#add cterms;
301299
constraintset#add ixc;

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_20241217"
99-
~date:"2024-12-17"
98+
~version:"0.6.0_20241218"
99+
~date:"2024-12-18"
100100
~licensee: None
101101
~maxfilesize: None
102102
()

CodeHawk/CHB/bchlibarm32/bCHFnARMTypeConstraints.ml

Lines changed: 103 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ open BCHBCFiles
4242
open BCHBCTypePretty
4343
open BCHBCTypes
4444
open BCHBCTypeUtil
45-
open BCHConstantDefinitions
4645
open BCHCPURegisters
4746
open BCHDoubleword
4847
open BCHFloc
@@ -209,6 +208,7 @@ object (self)
209208
match instr#get_opcode with
210209

211210
| Add (_, _, rd, rn, rm, _) ->
211+
let xrn = rn#to_expr floc in
212212
begin
213213

214214
(if rm#is_immediate && (rm#to_numerical#toInt < 256) then
@@ -228,8 +228,8 @@ object (self)
228228

229229
(match getopt_global_address (rn#to_expr floc) with
230230
| Some gaddr ->
231-
if is_in_global_arrayvar gaddr then
232-
(match (get_arrayvar_base_offset gaddr) with
231+
if BCHConstantDefinitions.is_in_global_arrayvar gaddr then
232+
(match (BCHConstantDefinitions.get_arrayvar_base_offset gaddr) with
233233
| Some _ ->
234234
let rmdefs = get_variable_rdefs (rm#to_variable floc) in
235235
let rmreg = rm#to_register in
@@ -246,6 +246,20 @@ object (self)
246246
| _ -> ())
247247
else
248248
()
249+
| _ -> ());
250+
251+
(match getopt_initial_argument_value xrn with
252+
| Some (reg, _) ->
253+
let ftvar = mk_function_typevar faddr in
254+
let ftvar = add_freg_param_capability reg ftvar in
255+
let rdreg = rd#to_register in
256+
let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
257+
let fttypeterm = mk_vty_term ftvar in
258+
let lhstypeterm = mk_vty_term lhstypevar in
259+
begin
260+
log_subtype_constraint "ADD-lhs-init" fttypeterm lhstypeterm;
261+
store#add_subtype_constraint fttypeterm lhstypeterm
262+
end
249263
| _ -> ())
250264
end
251265

@@ -313,6 +327,25 @@ object (self)
313327

314328
end
315329

330+
| BitwiseOr (_, _, rd, rn, _, _) ->
331+
let rdreg = rd#to_register in
332+
let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
333+
let rndefs = get_variable_rdefs (rn#to_variable floc) in
334+
let rnreg = rn#to_register in
335+
begin
336+
337+
List.iter (fun rnsym ->
338+
let rnaddr = rnsym#getBaseName in
339+
let rntypevar = mk_reglhs_typevar rnreg faddr rnaddr in
340+
let rntypeterm = mk_vty_term rntypevar in
341+
let lhstypeterm = mk_vty_term lhstypevar in
342+
begin
343+
log_subtype_constraint "AND-rdef-1" rntypeterm lhstypeterm;
344+
store#add_subtype_constraint rntypeterm lhstypeterm
345+
end) rndefs
346+
end
347+
348+
316349
| Branch _ ->
317350
(* no type information gained *)
318351
()
@@ -545,8 +578,8 @@ object (self)
545578
assign the type of that field to the destination register. *)
546579
(match getopt_global_address (memop#to_address floc) with
547580
| Some gaddr ->
548-
if is_in_global_structvar gaddr then
549-
match (get_structvar_base_offset gaddr) with
581+
if BCHConstantDefinitions.is_in_global_structvar gaddr then
582+
match (BCHConstantDefinitions.get_structvar_base_offset gaddr) with
550583
| Some (_, Field ((fname, fckey), NoOffset)) ->
551584
let compinfo = bcfiles#get_compinfo fckey in
552585
let finfo = get_compinfo_field compinfo fname in
@@ -599,8 +632,8 @@ object (self)
599632
assign that array type to the destination register. *)
600633
(match getopt_global_address (memop#to_expr floc) with
601634
| Some gaddr ->
602-
if is_in_global_arrayvar gaddr then
603-
(match (get_arrayvar_base_offset gaddr) with
635+
if BCHConstantDefinitions.is_in_global_arrayvar gaddr then
636+
(match (BCHConstantDefinitions.get_arrayvar_base_offset gaddr) with
604637
| Some (_, offset, bty) ->
605638
(match offset with
606639
| Index (Const (CInt (i64, _, _)), NoOffset) ->
@@ -659,7 +692,17 @@ object (self)
659692
begin
660693
log_subtype_constraint "LDRB-imm-off" rdtypeterm rttypeterm;
661694
store#add_subtype_constraint rdtypeterm rttypeterm
662-
end) xrdefs)
695+
end) xrdefs);
696+
697+
(* LDRB rt, ... : X_rt <: integer type *)
698+
(let tc = mk_int_type_constant Unsigned 8 in
699+
let tctypeterm = mk_cty_term tc in
700+
let rttypeterm = mk_vty_term rttypevar in
701+
begin
702+
log_subtype_constraint "LDRB-lhs-byte" tctypeterm rttypeterm;
703+
store#add_subtype_constraint tctypeterm rttypeterm
704+
end)
705+
663706
end
664707

665708
| LoadRegisterByte (_, rt, _, _, _, _) ->
@@ -742,6 +785,33 @@ object (self)
742785
store#add_subtype_constraint tctypeterm rntypeterm
743786
end) rndefs)
744787

788+
| LogicalShiftRight (_, _, rd, rn, rm, _) when rm#is_immediate ->
789+
let rdreg = rd#to_register in
790+
let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
791+
let rnreg = rn#to_register in
792+
let rndefs = get_variable_rdefs (rn#to_variable floc) in
793+
794+
(* LSR results in an unsigned integer *)
795+
(let tc = mk_int_type_constant Unsigned 32 in
796+
let tcterm = mk_cty_term tc in
797+
let lhstypeterm = mk_vty_term lhstypevar in
798+
begin
799+
log_subtype_constraint "LSR-lhs" tcterm lhstypeterm;
800+
store#add_subtype_constraint tcterm lhstypeterm
801+
end);
802+
803+
(* LSR is applied to an unsigned integer *)
804+
(List.iter (fun rnrdef ->
805+
let rnaddr = rnrdef#getBaseName in
806+
let rntypevar = mk_reglhs_typevar rnreg faddr rnaddr in
807+
let tyc = mk_int_type_constant Unsigned 32 in
808+
let tctypeterm = mk_cty_term tyc in
809+
let rntypeterm = mk_vty_term rntypevar in
810+
begin
811+
log_subtype_constraint "LSR-rhs" tctypeterm rntypeterm;
812+
store#add_subtype_constraint tctypeterm rntypeterm
813+
end) rndefs)
814+
745815
| Move (_, _, rd, rm, _, _) when rm#is_immediate ->
746816
let rmval = rm#to_numerical#toInt in
747817
(* 0 provides no information about the type *)
@@ -810,6 +880,31 @@ object (self)
810880
end) rmrdefs)
811881
end
812882

883+
| Pop (_, _, rl, _) when rl#includes_pc ->
884+
let fsig = finfo#get_summary#get_function_interface.fintf_type_signature in
885+
let _ =
886+
chlog#add
887+
"POP-function-signature"
888+
(LBLOCK [STR (btype_to_string fsig.fts_returntype)]) in
889+
let rtype = fsig.fts_returntype in
890+
(match rtype with
891+
| TVoid _ -> ()
892+
| _ ->
893+
let reg = register_of_arm_register AR0 in
894+
let typevar = mk_reglhs_typevar reg faddr iaddr in
895+
let opttc = mk_btype_constraint typevar rtype in
896+
match opttc with
897+
| Some tc ->
898+
begin
899+
log_type_constraint "POP-rv" tc;
900+
store#add_constraint tc
901+
end
902+
| _ ->
903+
begin
904+
log_no_type_constraint "POP-rv" rtype;
905+
()
906+
end)
907+
813908
| Push _
814909
| Pop _ ->
815910
(* no type information gained *)

0 commit comments

Comments
 (0)