Skip to content

Commit e4262d8

Browse files
committed
CHB:ARM: add c expressions to some results
1 parent 338652e commit e4262d8

File tree

3 files changed

+84
-23
lines changed

3 files changed

+84
-23
lines changed

CodeHawk/CHB/bchlib/bCHBCTypeXml.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ let get_standard_txt_type (t: string): btype_t option =
6969
| "byte" -> Some (TInt (IUChar, []))
7070
| "BYTE" -> Some (TInt (IUChar, []))
7171
| "char" -> Some (TInt (IChar, []))
72+
| "float" -> Some (TFloat (FFloat, FScalar, []))
7273
| "double" -> Some (TFloat (FDouble, FScalar, []))
7374
| "DWORD" -> Some (TInt (IUInt, []))
7475
| "int" -> Some (TInt (IInt, []))

CodeHawk/CHB/bchlib/bCHVersion.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ end
9595

9696

9797
let version = new version_info_t
98-
~version:"0.6.0_20250812"
99-
~date:"2025-08-12"
98+
~version:"0.6.0_20250817"
99+
~date:"2025-08-17"
100100
~licensee: None
101101
~maxfilesize: None
102102
()

CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1856,7 +1856,21 @@ object (self)
18561856
@ (get_all_rdefs_r xmem_r) in
18571857
let uses = [get_def_use_r vrt_r] in
18581858
let useshigh = [get_def_use_high_r vrt_r] in
1859+
let xxaddr_r = TR.tmap rewrite_expr xaddr_r in
1860+
let cxaddr_r = TR.tbind floc#convert_xpr_to_c_expr xxaddr_r in
18591861
let xrmem_r = TR.tmap rewrite_expr xmem_r in
1862+
let cxrmem_r = TR.tbind floc#convert_xpr_to_c_expr xrmem_r in
1863+
let cxrmem_r =
1864+
if Result.is_ok cxrmem_r then
1865+
cxrmem_r
1866+
else
1867+
let _ =
1868+
log_diagnostics_result
1869+
~msg:(p2s floc#l#toPretty)
1870+
~tag:"LDREX:fall-back address conversion"
1871+
__FILE__ __LINE__
1872+
["xxaddr: " ^ (x_r2s xxaddr_r)] in
1873+
TR.tbind floc#convert_addr_to_c_pointed_to_expr xxaddr_r in
18601874
let _ =
18611875
TR.tfold_default
18621876
(fun xrmem -> ignore (get_string_reference floc xrmem)) () xrmem_r in
@@ -1870,7 +1884,8 @@ object (self)
18701884
let (tagstring, args) =
18711885
mk_instrx_data_r
18721886
~vars_r:[vrt_r; vmem_r]
1873-
~xprs_r:[xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r]
1887+
~xprs_r:[xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r; xxaddr_r]
1888+
~cxprs_r:[cxrmem_r; cxaddr_r]
18741889
~rdefs
18751890
~uses
18761891
~useshigh
@@ -2751,34 +2766,57 @@ object (self)
27512766
let regcount = rl#get_register_count in
27522767
let rhss_rl = rl#to_multiple_expr floc in
27532768
let rrhss_rl = List.map (TR.tmap rewrite_expr) rhss_rl in
2754-
let (memlhss_rl, _) =
2769+
let crhss_rl =
2770+
List.map (fun rrhs_r ->
2771+
TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 4)) rrhs_r)
2772+
rrhss_rl in
2773+
let (memlhss_rl, cmemlhss_rl, _) =
27552774
List.fold_left
2756-
(fun (acc, off) _reg ->
2775+
(fun (lhss, clhss, off) _reg ->
27572776
let memop = arm_reg_deref ~with_offset:off basereg WR in
27582777
let memlhs_r = memop#to_variable floc in
2759-
(acc @ [memlhs_r], off + 4))
2760-
([], - (4 * regcount)) rl#get_register_op_list in
2778+
let cmemlhs_r =
2779+
TR.tbind
2780+
(floc#convert_var_to_c_variable ~size:(Some 4)) memlhs_r in
2781+
(lhss @ [memlhs_r],
2782+
clhss @ [cmemlhs_r],
2783+
off + 4)) ([], [], - (4 * regcount)) rl#get_register_op_list in
2784+
let xaddrs_r =
2785+
List.init
2786+
rl#get_register_count
2787+
(fun i ->
2788+
let xaddr_r =
2789+
TR.tmap
2790+
(fun baserhs ->
2791+
XOp (XPlus, [baserhs;
2792+
int_constant_expr ((i + 4) - (4 * regcount))]))
2793+
baserhs_r in
2794+
TR.tmap rewrite_expr xaddr_r) in
2795+
let cxaddrs_r =
2796+
List.map (fun xaddr_r ->
2797+
TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 4)) xaddr_r)
2798+
xaddrs_r in
27612799
let rdefs = List.map get_rdef_r (baserhs_r :: rrhss_rl) in
27622800
let uses = List.map get_def_use_r (baselhs_r :: memlhss_rl) in
27632801
let useshigh = List.map get_def_use_high_r (baselhs_r :: memlhss_rl) in
2764-
let wbackresults_r =
2802+
let vars_r = baselhs_r :: memlhss_rl in
2803+
let cvars_r = cmemlhss_rl in
2804+
let xprs_r = (baserhs_r :: rhss_rl) @ rrhss_rl @ xaddrs_r in
2805+
let cxprs_r = crhss_rl @ cxaddrs_r in
2806+
let (tagstring, args) =
2807+
mk_instrx_data_r
2808+
~vars_r ~cvars_r ~xprs_r ~cxprs_r ~rdefs ~uses ~useshigh () in
2809+
let (tags, args) = add_optional_instr_condition tagstring args c in
2810+
let (tags, args) =
27652811
if wback then
2766-
let decrem = int_constant_expr (4 * regcount) in
2812+
let decrem = 4 * regcount in
2813+
let xdecrem = int_constant_expr decrem in
27672814
let baseresult_r =
2768-
TR.tmap (fun baserhs -> XOp (XMinus, [baserhs; decrem])) baserhs_r in
2815+
TR.tmap (fun baserhs -> XOp (XMinus, [baserhs; xdecrem])) baserhs_r in
27692816
let rbaseresult_r = TR.tmap rewrite_expr baseresult_r in
2770-
[baseresult_r; rbaseresult_r]
2817+
add_base_update tags args baselhs_r decrem rbaseresult_r
27712818
else
2772-
[baserhs_r; baserhs_r] in
2773-
let (tagstring, args) =
2774-
mk_instrx_data_r
2775-
~vars_r:(baselhs_r :: memlhss_rl)
2776-
~xprs_r:((baserhs_r :: wbackresults_r) @ rrhss_rl)
2777-
~rdefs
2778-
~uses
2779-
~useshigh
2780-
() in
2781-
let (tags, args) = add_optional_instr_condition tagstring args c in
2819+
(tags, args) in
27822820
(tags, args)
27832821

27842822
| StoreMultipleIncrementAfter _ when instr#is_aggregate_anchor ->
@@ -3637,10 +3675,24 @@ object (self)
36373675
let vvd_r = vd#to_variable floc in
36383676
let xbase_r = base#to_expr floc in
36393677
let xaddr_r = mem#to_address floc in
3678+
let xxaddr_r = TR.tmap rewrite_expr xaddr_r in
3679+
let cxaddr_r = TR.tbind floc#convert_xpr_to_c_expr xxaddr_r in
36403680
let vmem_r = mem#to_variable floc in
36413681
let xmem_r = mem#to_expr floc in
36423682
let rxbase_r = TR.tmap rewrite_expr xbase_r in
36433683
let rxmem_r = TR.tmap rewrite_expr xmem_r in
3684+
let cxmem_r = TR.tbind floc#convert_xpr_to_c_expr rxmem_r in
3685+
let cxmem_r =
3686+
if Result.is_ok cxmem_r then
3687+
cxmem_r
3688+
else
3689+
let _ =
3690+
log_diagnostics_result
3691+
~msg:(p2s floc#l#toPretty)
3692+
~tag:"VLDR:fall-back address conversion"
3693+
__FILE__ __LINE__
3694+
["xxaddr: " ^ (x_r2s xxaddr_r)] in
3695+
TR.tbind floc#convert_addr_to_c_pointed_to_expr xxaddr_r in
36443696
let rdefs =
36453697
[get_rdef_memvar_r vmem_r; get_rdef_r xmem_r]
36463698
@ (get_all_rdefs_r rxmem_r) in
@@ -3649,7 +3701,8 @@ object (self)
36493701
let (tagstring, args) =
36503702
mk_instrx_data_r
36513703
~vars_r:[vvd_r; vmem_r]
3652-
~xprs_r:[xmem_r; rxmem_r; xbase_r; rxbase_r; xaddr_r]
3704+
~xprs_r:[xmem_r; rxmem_r; xbase_r; rxbase_r; xaddr_r; xxaddr_r]
3705+
~cxprs_r:[cxmem_r; cxaddr_r]
36533706
~rdefs
36543707
~uses
36553708
~useshigh
@@ -3888,8 +3941,13 @@ object (self)
38883941
(tags, args)
38893942

38903943
| VStoreRegister (c, src, base, mem) ->
3944+
let size = src#get_size in
38913945
let vmem_r = mem#to_variable floc in
3946+
let cvmem_r =
3947+
TR.tbind (floc#convert_var_to_c_variable ~size:(Some size)) vmem_r in
38923948
let xaddr_r = mem#to_address floc in
3949+
let xxaddr_r = TR.tmap rewrite_expr xaddr_r in
3950+
let cxaddr_r = TR.tbind floc#convert_xpr_to_c_expr xxaddr_r in
38933951
let xsrc_r = src#to_expr floc in
38943952
let xbase_r = base#to_expr floc in
38953953
let rxsrc_r = TR.tmap rewrite_expr xsrc_r in
@@ -3900,7 +3958,9 @@ object (self)
39003958
let (tagstring, args) =
39013959
mk_instrx_data_r
39023960
~vars_r:[vmem_r]
3903-
~xprs_r:[xsrc_r; rxsrc_r; xbase_r; rxbase_r; xaddr_r]
3961+
~xprs_r:[xsrc_r; rxsrc_r; xbase_r; rxbase_r; xaddr_r; xxaddr_r]
3962+
~cvars_r:[cvmem_r]
3963+
~cxprs_r:[cxaddr_r]
39043964
~rdefs
39053965
~uses
39063966
~useshigh

0 commit comments

Comments
 (0)