@@ -42,7 +42,6 @@ open BCHBCFiles
4242open BCHBCTypePretty
4343open BCHBCTypes
4444open BCHBCTypeUtil
45- open BCHConstantDefinitions
4645open BCHCPURegisters
4746open BCHDoubleword
4847open 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