@@ -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