Skip to content

Commit 8ff1c07

Browse files
committed
CHB:ARM: convert LDRB to transmit C expressions
1 parent 07a84f7 commit 8ff1c07

File tree

4 files changed

+149
-89
lines changed

4 files changed

+149
-89
lines changed

CodeHawk/CHB/bchlib/bCHMemoryReference.ml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,12 @@ let rec address_memory_offset
212212
__FILE__ __LINE__
213213
["base type: " ^ (btype_to_string rbasetype)
214214
^ "; xoffset: " ^ n#toString] in
215-
(* Ok (ConstantOffset (n, NoOffset)) *)
216-
Ok (BasePtrArrayIndexOffset (num_constant_expr n, NoOffset))
215+
TR.tmap
216+
~msg:(__FILE__ ^ ":" ^ (string_of_int __LINE__))
217+
(fun size ->
218+
let scaledoffset = n#div (mkNumerical size) in
219+
BasePtrArrayIndexOffset (num_constant_expr scaledoffset, NoOffset))
220+
(size_of_btype rbasetype)
217221
| _ ->
218222
let tgtbtype =
219223
if is_unknown_type tgtbtype then None else Some tgtbtype in
@@ -231,7 +235,15 @@ let rec address_memory_offset
231235
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
232236
^ "Unable to extract index from " ^ (x2s xoffset)]
233237
| Some (indexxpr, xrem) when iszero xrem ->
234-
Ok (BasePtrArrayIndexOffset (indexxpr, NoOffset))
238+
let _ =
239+
log_diagnostics_result
240+
~msg:"address-memory-offset:scalar basetype"
241+
__FILE__ __LINE__
242+
["base type: " ^ (btype_to_string rbasetype)
243+
^ "; xoffset: " ^ (x2s xoffset)] in
244+
let scaledoffset = XOp (XDiv, [indexxpr; int_constant_expr tsize]) in
245+
let scaledoffset = Xsimplify.simplify_xpr scaledoffset in
246+
Ok (BasePtrArrayIndexOffset (scaledoffset, NoOffset))
235247
| _ ->
236248
Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": "
237249
^ "Nonzero suboffset encountered when extracting index "

CodeHawk/CHB/bchlib/bCHTypeConstraintUtil.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ let join_tc_integer
227227
Some (Unsigned, size1)
228228
| (SignedNeutral, size1), (Unsigned, size2) when size1 <= size2 ->
229229
Some (Unsigned, size2)
230+
| (Signed, size1), (Unsigned, size2) when size1 > size2 ->
231+
Some (Signed, size1)
232+
| (Unsigned, size1), (Signed, size2) when size1 < size2 ->
233+
Some (Signed, size2)
230234
| _ -> None
231235

232236

CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,13 +1602,28 @@ object (self)
16021602
let xaddr_r = mem#to_address floc in
16031603
let vmem_r = mem#to_variable floc in
16041604
let xmem_r = mem#to_expr floc in
1605-
let xrmem_r = TR.tmap rewrite_expr xmem_r in
1606-
let xxaddr_r = TR.tmap rewrite_expr xaddr_r in
16071605
let rdefs =
16081606
[get_rdef_r xrn_r; get_rdef_r xrm_r; get_rdef_memvar_r vmem_r]
16091607
@ (get_all_rdefs_r xmem_r) in
16101608
let uses = [get_def_use_r vrt_r] in
16111609
let useshigh = [get_def_use_high_r vrt_r] in
1610+
let xxaddr_r = TR.tmap rewrite_expr xaddr_r in
1611+
let cxaddr_r = TR.tbind floc#convert_xpr_to_c_expr xxaddr_r in
1612+
let xrmem_r = TR.tmap rewrite_expr xmem_r in
1613+
let cxrmem_r =
1614+
TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 1)) xrmem_r in
1615+
let cxrmem_r =
1616+
if Result.is_ok cxrmem_r then
1617+
cxrmem_r
1618+
else
1619+
let _ =
1620+
log_diagnostics_result
1621+
~msg:(p2s floc#l#toPretty)
1622+
~tag:"LDRB:fall-back address conversion"
1623+
__FILE__ __LINE__
1624+
["xxaddr: " ^ (x_r2s xxaddr_r)] in
1625+
TR.tbind
1626+
(floc#convert_addr_to_c_pointed_to_expr ~size:(Some 1)) xxaddr_r in
16121627
let _ =
16131628
floc#memrecorder#record_load_r
16141629
~signed:false
@@ -1618,8 +1633,9 @@ object (self)
16181633
~vtype:t_unknown in
16191634
let (tagstring, args) =
16201635
mk_instrx_data_r
1621-
~vars_r:[vrt_r; vmem_r]
1622-
~xprs_r:[xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r]
1636+
~vars_r:[vrt_r]
1637+
~xprs_r:[xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r; xxaddr_r]
1638+
~cxprs_r: [cxrmem_r; cxaddr_r]
16231639
~rdefs
16241640
~uses
16251641
~useshigh

0 commit comments

Comments
 (0)