@@ -424,12 +424,12 @@ object (self)
424424 (* add constraints for argument values *)
425425 List. iter (fun (p , x ) ->
426426 let ptype = get_parameter_type p in
427- if is_register_parameter p then
428- let regarg = TR. tget_ok (get_register_parameter_register p) in
429- let pvar = floc#f#env#mk_register_variable regarg in
430- let rdefs = get_variable_rdefs pvar in
431- begin
432- ( if not (is_unknown_type ptype) then
427+ begin
428+ ( if is_register_parameter p then
429+ let regarg = TR. tget_ok (get_register_parameter_register p) in
430+ let pvar = floc#f#env#mk_register_variable regarg in
431+ let rdefs = get_variable_rdefs pvar in
432+ if not (is_unknown_type ptype) then
433433 List. iter (fun rdsym ->
434434 let typevar =
435435 mk_reglhs_typevar regarg faddr rdsym#getBaseName in
@@ -444,53 +444,57 @@ object (self)
444444 begin
445445 log_no_type_constraint " BL-reg-arg" ptype;
446446 ()
447- end ) rdefs);
448-
449- (match getopt_stackaddress x with
450- | None -> ()
451- | Some offset ->
452- let lhstypevar =
453- mk_localstack_lhs_typevar offset faddr iaddr in
454- if is_pointer ptype then
455- let eltype = ptr_deref ptype in
456- let atype = t_array eltype 1 in
457- let opttc = mk_btype_constraint lhstypevar atype in
458- match opttc with
459- | Some tc ->
460- begin
461- log_type_constraint " BL-reg-arg" tc;
462- store#add_constraint tc
463- end
464- | _ -> () )
465- end
466-
467- else if is_stack_parameter p then
468- (log_tfold_default
469- (log_error
470- (" Unable to retrieve stack offset from "
471- ^ (fts_parameter_to_string p)))
472- (fun p_offset ->
473- (log_tfold_default
474- (log_error " Unable to get current stack pointer offset" )
475- (fun sp_offset ->
476- let arg_offset =
477- (sp_offset#add (mkNumerical p_offset))#neg in
478- let typevar =
479- mk_localstack_lhs_typevar
480- arg_offset#toInt faddr iaddr in
481- let opttc = mk_btype_constraint typevar ptype in
482- match opttc with
483- | Some tc ->
484- begin
485- log_type_constraint " BL-reg-arg" tc;
486- store#add_constraint tc
487- end
488- | _ -> () )
489- ()
490- (floc#get_singleton_stackpointer_offset)))
491- ()
492- (get_stack_parameter_offset p))
493-
447+ end ) rdefs
448+ else
449+ ()
450+
451+ else if is_stack_parameter p then
452+ (log_tfold_default
453+ (log_error
454+ (" Unable to retrieve stack offset from "
455+ ^ (fts_parameter_to_string p)))
456+ (fun p_offset ->
457+ (log_tfold_default
458+ (log_error " Unable to get current stack pointer offset" )
459+ (fun sp_offset ->
460+ let arg_offset =
461+ (sp_offset#add (mkNumerical p_offset))#neg in
462+ let typevar =
463+ mk_localstack_lhs_typevar
464+ arg_offset#toInt faddr iaddr in
465+ let opttc = mk_btype_constraint typevar ptype in
466+ match opttc with
467+ | Some tc ->
468+ begin
469+ log_type_constraint " BL-stack-arg" tc;
470+ store#add_constraint tc
471+ end
472+ | _ -> () )
473+ ()
474+ (floc#get_singleton_stackpointer_offset)))
475+ ()
476+ (get_stack_parameter_offset p))
477+
478+ else
479+ () );
480+
481+ (match getopt_stackaddress x with
482+ | None -> ()
483+ | Some offset ->
484+ let lhstypevar =
485+ 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+ | _ -> () )
497+ end
494498 ) callargs
495499
496500 end
@@ -574,6 +578,7 @@ object (self)
574578 let rttypevar = mk_reglhs_typevar rtreg faddr iaddr in
575579 begin
576580
581+ (* variable introduction for lhs with type *)
577582 (match get_regvar_type_annotation () with
578583 | Some t ->
579584 let opttc = mk_btype_constraint rttypevar t in
@@ -586,6 +591,24 @@ object (self)
586591 | _ -> () )
587592 | _ -> () );
588593
594+ (* loaded type may be known *)
595+ (let xmem_r = memop#to_expr floc in
596+ let xrmem_r =
597+ TR. tmap (fun x -> simplify_xpr (floc#inv#rewrite_expr x)) xmem_r in
598+ let xtype_r = TR. tmap floc#get_xpr_type xrmem_r in
599+ let xtype_opt = TR. tvalue xtype_r ~default: None in
600+ match xtype_opt with
601+ | Some t ->
602+ let opttc = mk_btype_constraint rttypevar t in
603+ (match opttc with
604+ | Some tc ->
605+ begin
606+ log_type_constraint " LDR-var" tc;
607+ store#add_constraint tc
608+ end
609+ | _ -> () )
610+ | _ -> () );
611+
589612 (* LDR rt, [rn, rm] : X_rndef.load <: X_rt *)
590613 (let xrdef = get_variable_rdefs_r (rn#to_variable floc) in
591614 let rnreg = rn#to_register in
@@ -985,43 +1008,64 @@ object (self)
9851008 end
9861009
9871010 (* Store x in y --- *y := x --- X <: Y.store *)
988- | StoreRegister (_ , rt , _rn , rm , memvarop , _ ) when rm#is_immediate ->
1011+ | StoreRegister (_ , rt , rn , rm , memvarop , _ ) when rm#is_immediate ->
1012+ let rnrdefs = get_variable_rdefs_r (rn#to_variable floc) in
1013+ let rnreg = rn#to_register in
1014+ let offset = rm#to_numerical#toInt in
1015+ let rtrdefs = get_variable_rdefs_r (rt#to_variable floc) in
1016+ let rtreg = rt#to_register in
9891017 let xaddr_r = memvarop#to_address floc in
9901018 let xrt_r = rt#to_expr floc in
991- (match getopt_stackaddress_r xaddr_r with
992- | None -> ()
993- | Some offset ->
994- let lhstypevar = mk_localstack_lhs_typevar offset faddr iaddr in
995- begin
996- (* propagate function argument type *)
997- (match getopt_initial_argument_value_r xrt_r with
998- | Some (rtreg , off ) when off = 0 ->
999- let rhstypevar = mk_function_typevar faddr in
1000- let rhstypevar = add_freg_param_capability rtreg rhstypevar in
1001- let rhstypeterm = mk_vty_term rhstypevar in
1002- let lhstypeterm = mk_vty_term lhstypevar in
1003- begin
1004- log_subtype_constraint " STR-funarg" rhstypeterm lhstypeterm;
1005- store#add_subtype_constraint rhstypeterm lhstypeterm
1006- end
1007- | _ -> () );
1008-
1009- (* propagate src register type from rdefs *)
1010- (let rtreg = rt#to_register in
1011- let rtvar_r = rt#to_variable floc in
1012- let rtrdefs = get_variable_rdefs_r rtvar_r in
1013- List. iter (fun rtrdef ->
1014- let rtaddr = rtrdef#getBaseName in
1015- if rtaddr != " init" then
1016- let rttypevar = mk_reglhs_typevar rtreg faddr rtaddr in
1017- let rttypeterm = mk_vty_term rttypevar in
1018- let lhstypeterm = mk_vty_term lhstypevar in
1019- begin
1020- log_subtype_constraint " STR-imm-off" rttypeterm lhstypeterm;
1021- store#add_subtype_constraint rttypeterm lhstypeterm
1022- end ) rtrdefs)
1023- end
1024- )
1019+ begin
1020+
1021+ (match getopt_stackaddress_r xaddr_r with
1022+ | None -> ()
1023+ | Some offset ->
1024+ let lhstypevar = mk_localstack_lhs_typevar offset faddr iaddr in
1025+ begin
1026+ (* propagate function argument type *)
1027+ (match getopt_initial_argument_value_r xrt_r with
1028+ | Some (rtreg , off ) when off = 0 ->
1029+ let rhstypevar = mk_function_typevar faddr in
1030+ let rhstypevar = add_freg_param_capability rtreg rhstypevar in
1031+ let rhstypeterm = mk_vty_term rhstypevar in
1032+ let lhstypeterm = mk_vty_term lhstypevar in
1033+ begin
1034+ log_subtype_constraint " STR-funarg" rhstypeterm lhstypeterm;
1035+ store#add_subtype_constraint rhstypeterm lhstypeterm
1036+ end
1037+ | _ -> () );
1038+
1039+ (* propagate src register type from rdefs *)
1040+ (let rtreg = rt#to_register in
1041+ let rtvar_r = rt#to_variable floc in
1042+ let rtrdefs = get_variable_rdefs_r rtvar_r in
1043+ List. iter (fun rtrdef ->
1044+ let rtaddr = rtrdef#getBaseName in
1045+ if rtaddr != " init" then
1046+ let rttypevar = mk_reglhs_typevar rtreg faddr rtaddr in
1047+ let rttypeterm = mk_vty_term rttypevar in
1048+ let lhstypeterm = mk_vty_term lhstypevar in
1049+ begin
1050+ log_subtype_constraint " STR-imm-off" rttypeterm lhstypeterm;
1051+ store#add_subtype_constraint rttypeterm lhstypeterm
1052+ end ) rtrdefs)
1053+ end );
1054+
1055+ (List. iter (fun rndsym ->
1056+ let straddr = rndsym#getBaseName in
1057+ let rntypevar = mk_reglhs_typevar rnreg faddr straddr in
1058+ let rntypevar = add_load_capability ~size: 4 ~offset rntypevar in
1059+ List. iter (fun rtdsym ->
1060+ let rtdloc = rtdsym#getBaseName in
1061+ let rttypevar = mk_reglhs_typevar rtreg faddr rtdloc in
1062+ let rttypeterm = mk_vty_term rttypevar in
1063+ let rntypeterm = mk_vty_term rntypevar in
1064+ begin
1065+ log_subtype_constraint " STR-imm-off" rttypeterm rntypeterm;
1066+ store#add_subtype_constraint rttypeterm rntypeterm
1067+ end ) rtrdefs) rnrdefs)
1068+ end
10251069
10261070 | StoreRegisterByte (_ , rt , rn , rm , _memvarop , _ ) when rm#is_immediate ->
10271071 let rnrdefs = get_variable_rdefs_r (rn#to_variable floc) in
0 commit comments