@@ -78,6 +78,8 @@ module TR = CHTraceResult
7878
7979let x2p = xpr_formatter#pr_expr
8080let p2s = CHPrettyUtil. pretty_to_string
81+ let x2s x = p2s (x2p x)
82+ let x_r2s x_r = TR. tfold_default x2s " error-value" x_r
8183
8284let log_error (tag : string ) (msg : string ): tracelogspec_t =
8385 mk_tracelog_spec ~tag: (" FnARMDictionary:" ^ tag) msg
@@ -362,19 +364,23 @@ object (self)
362364 (LBLOCK [
363365 STR __FILE__; STR " :" ; INT __LINE__; STR " : " ;
364366 STR " Empty tag list" ])) in
365- let xtag = (List. hd tags) ^ " vtlxdh " in
367+ let xtag = (List. hd tags) ^ " vtlxcdh " in
366368 let uses = [get_def_use_r v] in
367369 let useshigh = [get_def_use_high_r v] in
368370 let argslen = List. length args in
369371 let vbutag = " vbu:" ^ (string_of_int argslen) in
370372 let xbutag = " xbu:" ^ (string_of_int (argslen + 3 )) in
371- let tags = xtag :: ((List. tl tags) @ [vbutag; xbutag]) in
373+ let cbutag = " cbu:" ^ (string_of_int (argslen + 4 )) in
374+ let tags = xtag :: ((List. tl tags) @ [vbutag; xbutag; cbutag]) in
375+ let xx = TR. tmap rewrite_expr x in
376+ let cx = TR. tbind (floc#convert_xpr_to_c_expr ~size: (Some 4 )) xx in
372377 let args =
373378 args
374379 @ [index_variable v;
375380 bcd#index_typ t_unknown;
376381 inc;
377- index_xpr x]
382+ index_xpr x;
383+ index_xpr cx]
378384 @ uses @ useshigh in
379385 (tags, args) in
380386
@@ -894,18 +900,18 @@ object (self)
894900 (fun xrn xrm -> XOp (XBAnd , [xrn; XOp (XBNot , [xrm])]))
895901 xrn_r xrm_r in
896902 let rresult_r = TR. tmap rewrite_expr result_r in
903+ let cresult_r =
904+ TR. tbind (floc#convert_xpr_to_c_expr ~size: (Some 4 )) rresult_r in
897905 let rdefs =
898906 [get_rdef_r xrn_r; get_rdef_r xrm_r] @ (get_all_rdefs_r rresult_r) in
899907 let uses = [get_def_use_r vrd_r] in
900908 let useshigh = [get_def_use_high_r vrd_r] in
909+ let vars_r = [vrd_r] in
910+ let xprs_r = [xrn_r; xrm_r; result_r; rresult_r] in
911+ let cxprs_r = [cresult_r] in
901912 let (tagstring, args) =
902913 mk_instrx_data_r
903- ~vars_r: [vrd_r]
904- ~xprs_r: [xrn_r; xrm_r; result_r; rresult_r]
905- ~rdefs
906- ~uses
907- ~useshigh
908- () in
914+ ~vars_r ~xprs_r ~cxprs_r ~rdefs ~uses ~useshigh () in
909915 let (tags, args) = add_optional_instr_condition tagstring args c in
910916 (tags, args)
911917
@@ -935,17 +941,17 @@ object (self)
935941 let xrm_r = rm#to_expr floc in
936942 let result_r = TR. tmap (fun xrm -> XOp (XBNot , [xrm])) xrm_r in
937943 let rresult_r = TR. tmap rewrite_expr result_r in
944+ let cresult_r =
945+ TR. tbind (floc#convert_xpr_to_c_expr ~size: (Some 4 )) rresult_r in
938946 let rdefs = [get_rdef_r xrm_r] @ (get_all_rdefs_r rresult_r) in
939947 let uses = [get_def_use_r vrd_r] in
940948 let useshigh = [get_def_use_high_r vrd_r] in
949+ let vars_r = [vrd_r] in
950+ let xprs_r = [xrm_r; result_r; rresult_r] in
951+ let cxprs_r = [cresult_r] in
941952 let (tagstring, args) =
942953 mk_instrx_data_r
943- ~vars_r: [vrd_r]
944- ~xprs_r: [xrm_r; result_r; rresult_r]
945- ~rdefs
946- ~uses
947- ~useshigh
948- () in
954+ ~vars_r ~xprs_r ~cxprs_r ~rdefs ~uses ~useshigh () in
949955 let (tags, args) = add_optional_instr_condition tagstring args c in
950956 (tags, args)
951957
@@ -1066,6 +1072,8 @@ object (self)
10661072 let csetter = floc#f#get_associated_cc_setter floc#cia in
10671073 let tcond = rewrite_test_expr csetter txpr in
10681074 let fcond = rewrite_test_expr csetter fxpr in
1075+ let ctcond_r = floc#convert_xpr_to_c_expr ~size: (Some 4 ) tcond in
1076+ let cfcond_r = floc#convert_xpr_to_c_expr ~size: (Some 4 ) fcond in
10691077 let csetter_addr_r = string_to_doubleword csetter in
10701078 let csetter_instr_r =
10711079 TR. tbind get_arm_assembly_instruction csetter_addr_r in
@@ -1076,15 +1084,26 @@ object (self)
10761084 begin log_error_result __FILE__ __LINE__ e; " 0x0" end )
10771085 csetter_instr_r in
10781086 let rdefs = (get_all_rdefs txpr) @ (get_all_rdefs tcond) in
1079- let (tagstring, args) =
1080- mk_instrx_data_r
1081- ~xprs_r: [Ok txpr; Ok fxpr; Ok tcond; Ok fcond; xtgt_r]
1082- ~rdefs
1083- () in
1087+ let xprs_r = [Ok txpr; Ok fxpr; Ok tcond; Ok fcond; xtgt_r] in
1088+ let cxprs_r = [ctcond_r; cfcond_r] in
1089+ let (tagstring, args) = mk_instrx_data_r ~xprs_r ~cxprs_r ~rdefs () in
10841090 let (tags, args) = (tagstring :: [" TF" ; csetter; bytestr], args) in
10851091 let tags = add_optional_subsumption tags in
10861092 (tags, args)
10871093
1094+ (* conditional branch without test expression *)
1095+ | Branch (c, tgt, _)
1096+ when is_cond_conditional c
1097+ && tgt#is_absolute_address ->
1098+ let xtgt_r = tgt#to_expr floc in
1099+ let xxtgt_r = TR. tmap rewrite_expr xtgt_r in
1100+ let xprs_r = [xtgt_r; xxtgt_r] in
1101+ let rdefs = (get_rdef_r xtgt_r) :: (get_all_rdefs_r xxtgt_r) in
1102+ let (tagstring, args) = mk_instrx_data_r ~xprs_r ~rdefs () in
1103+ let (tags, args) = (tagstring :: [" TF:no-x" ], args) in
1104+ let tags = add_optional_subsumption tags in
1105+ (tags, args)
1106+
10881107 | Branch (_ , tgt , _ ) ->
10891108 let xtgt_r = tgt#to_expr floc in
10901109 let xxtgt_r = TR. tmap rewrite_expr xtgt_r in
@@ -1176,10 +1195,14 @@ object (self)
11761195 let xresult_r =
11771196 TR. tmap2 (fun xrn xrm -> XOp (XMinus , [xrn; xrm])) xrn_r xrm_r in
11781197 let result_r = TR. tmap rewrite_expr xresult_r in
1198+ let cresult_r =
1199+ TR. tbind (floc#convert_xpr_to_c_expr ~size: (Some 4 )) result_r in
11791200 let rdefs =
11801201 [get_rdef_r xrn_r; get_rdef_r xrm_r] @ (get_all_rdefs_r result_r) in
1202+ let xprs_r = [xrn_r; xrm_r; xresult_r; result_r] in
1203+ let cxprs_r = [cresult_r] in
11811204 let (tagstring, args) =
1182- mk_instrx_data_r ~xprs_r: [xrn_r; xrm_r; result_r] ~rdefs () in
1205+ mk_instrx_data_r ~xprs_r ~cxprs_r ~rdefs () in
11831206 let (tags, args) = add_optional_instr_condition tagstring args c in
11841207 let tags = add_optional_subsumption tags in
11851208 (tags, args)
@@ -1528,6 +1551,12 @@ object (self)
15281551 if Result. is_ok cxrmem_r then
15291552 cxrmem_r
15301553 else
1554+ let _ =
1555+ log_diagnostics_result
1556+ ~msg: (p2s floc#l#toPretty)
1557+ ~tag: " LDR:fall-back address conversion"
1558+ __FILE__ __LINE__
1559+ [" xxaddr: " ^ (x_r2s xxaddr_r)] in
15311560 TR. tbind floc#convert_addr_to_c_pointed_to_expr xxaddr_r in
15321561 let _ =
15331562 TR. tfold_default
@@ -1733,13 +1762,21 @@ object (self)
17331762 let xaddr_r = mem#to_address floc in
17341763 let vmem_r = mem#to_variable floc in
17351764 let xmem_r = mem#to_expr floc in
1736- let xrmem_r = TR. tmap rewrite_expr xmem_r in
1737- let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
17381765 let rdefs =
17391766 [get_rdef_r xrn_r; get_rdef_r xrm_r; get_rdef_memvar_r vmem_r]
17401767 @ (get_all_rdefs_r xmem_r) in
17411768 let uses = [get_def_use_r vrt_r] in
17421769 let useshigh = [get_def_use_high_r vrt_r] in
1770+ let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
1771+ let cxaddr_r = TR. tbind floc#convert_xpr_to_c_expr xxaddr_r in
1772+ let xrmem_r = TR. tmap rewrite_expr xmem_r in
1773+ let cxrmem_r =
1774+ TR. tbind (floc#convert_xpr_to_c_expr ~size: (Some 2 )) xrmem_r in
1775+ let cxrmem_r =
1776+ if Result. is_ok cxrmem_r then
1777+ cxrmem_r
1778+ else
1779+ TR. tbind floc#convert_addr_to_c_pointed_to_expr xxaddr_r in
17431780 let _ =
17441781 floc#memrecorder#record_load_r
17451782 ~signed: false
@@ -1749,8 +1786,9 @@ object (self)
17491786 ~vtype: t_unknown in
17501787 let (tagstring, args) =
17511788 mk_instrx_data_r
1752- ~vars_r: [vrt_r; vmem_r]
1753- ~xprs_r: [xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r]
1789+ ~vars_r: [vrt_r]
1790+ ~xprs_r: [xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r; xxaddr_r]
1791+ ~cxprs_r: [cxrmem_r; cxaddr_r]
17541792 ~rdefs
17551793 ~uses
17561794 ~useshigh
0 commit comments