Skip to content

Commit 07a84f7

Browse files
committed
CHB:ARM: more support for c-style representation
1 parent a587a86 commit 07a84f7

File tree

6 files changed

+94
-29
lines changed

6 files changed

+94
-29
lines changed

CodeHawk/CH/xprlib/xsimplify.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ and reduce_bitwise_not (m: bool) (e1: xpr_t): (bool * xpr_t) =
181181
match e1 with
182182
| XConst (IntConst num) when num#equal numerical_zero ->
183183
(true, XConst (IntConst numerical_one#neg))
184+
| XConst (IntConst num) when num#equal numerical_one ->
185+
(true, XConst (IntConst (mkNumerical 2)#neg))
184186
| _ -> default ()
185187

186188

CodeHawk/CHB/bchlibarm32/bCHARMOperand.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,10 @@ object (self:'a)
614614
let vreg = floc#env#mk_arm_register_variable r in
615615
let shiftv = XOp (XBAnd, [XVar vsreg; int_constant_expr 7]) in
616616
Ok (XOp (XLsl, [XVar vreg; shiftv]))
617+
| ARMShiftedReg (r, ARMRegSRT (SRType_LSR, sr)) ->
618+
let vsreg = floc#env#mk_arm_register_variable sr in
619+
let vreg = floc#env#mk_arm_register_variable r in
620+
Ok (XOp (XLsr, [XVar vreg; XVar vsreg]))
617621
| ARMShiftedReg (_, srt) ->
618622
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
619623
^ "Shifted reg: " ^ (register_shift_to_string srt)

CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml

Lines changed: 63 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ module TR = CHTraceResult
7878

7979
let x2p = xpr_formatter#pr_expr
8080
let 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

8284
let 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

CodeHawk/CHB/bchlibarm32/bCHTranslateARMToCHIF.ml

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ module TR = CHTraceResult
7474
let x2p = xpr_formatter#pr_expr
7575
let p2s = CHPrettyUtil.pretty_to_string
7676
let x2s x = p2s (x2p x)
77+
let x_r2s x_r = TR.tfold_default x2s "error-value" x_r
7778

7879
let log_error (tag: string) (msg: string): tracelogspec_t =
7980
mk_tracelog_spec ~tag:("TranslateARMToCHIF:" ^ tag) msg
@@ -2256,7 +2257,13 @@ let translate_arm_instruction
22562257
| Pop (c, sp, rl, _) ->
22572258
let floc = get_floc loc in
22582259
let regcount = rl#get_register_count in
2259-
2260+
let is_restore_temporary (r: register_t) =
2261+
if rl#includes_pc then
2262+
match r with
2263+
| ARMRegister armreg -> List.mem armreg arm_temporaries
2264+
| _ -> false
2265+
else
2266+
false in
22602267
let popcmds (): cmd_t list =
22612268
let sprhs_r = sp#to_expr floc in
22622269
let regs = rl#to_multiple_register in
@@ -2271,7 +2278,21 @@ let translate_arm_instruction
22712278
let cmds1 = floc#get_assign_commands_r (Ok reglhs) stackrhs_r in
22722279
let usevars =
22732280
TR.tfold_default (fun stackvar -> [stackvar]) [] stackvar_r in
2274-
let usehigh = get_use_high_vars_r ~is_pop:true [stackrhs_r] in
2281+
let usehigh =
2282+
if is_restore_temporary reg then
2283+
let _ =
2284+
chlog#add
2285+
"register restore of temporary"
2286+
(LBLOCK [
2287+
floc#l#toPretty;
2288+
STR ": ";
2289+
STR (register_to_string reg);
2290+
STR " := ";
2291+
STR (x_r2s (TR.tmap (rewrite_expr floc) stackrhs_r))
2292+
]) in
2293+
[]
2294+
else
2295+
get_use_high_vars_r ~is_pop:true [stackrhs_r] in
22752296
let defcmds1 =
22762297
floc#get_vardef_commands
22772298
~defs:[reglhs; splhs]

CodeHawk/CHB/bchsummaries/so_functions/gmtime.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
</apidoc>
2525
</documentation>
2626
<api adj="0" cc="cdecl" name="gmtime">
27-
<returntype><ptr>gmtime</ptr></returntype>
27+
<returntype><ptr>ch_tm</ptr></returntype>
2828
<par loc="stack" io="r" name="timer" nr="1">
2929
<roles>
3030
<role rt="ioc:memops" rn="src-bytes:time_t" />

CodeHawk/CHT/CHB_tests/bchlibarm32_tests/txbchlibarm32/bCHTranslateARMToCHIFTest.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ let translate_store () =
9191
("STRDwb1", "0x1b4bc", "f0416de100",
9292
[("var_0016", "R4_in");
9393
("var_0012", "R5_in");
94-
("SP", "sv__15__sv")]);
94+
("SP", "sv__23__sv")]);
9595
("STRDwb2", "0x10ab8", "fc406de100",
9696
[("var_0012", "R4_in");
9797
("var_0008", "R5_in");

0 commit comments

Comments
 (0)