diff --git a/CodeHawk/CHB/bchlib/bCHFloc.ml b/CodeHawk/CHB/bchlib/bCHFloc.ml index 070d4cbf..88a2a0f1 100644 --- a/CodeHawk/CHB/bchlib/bCHFloc.ml +++ b/CodeHawk/CHB/bchlib/bCHFloc.ml @@ -667,6 +667,16 @@ object (self) (numoffset: numerical_t): variable_t traceresult = let inv = self#inv in let mk_memvar memref_r memoffset_r = + let _ = + log_diagnostics_result + ~msg:(p2s self#l#toPretty) + ~tag:"get_memory_variable_numoffset:mk_memvar" + __FILE__ __LINE__ + ["var: " ^ (p2s var#toPretty); + "memref_r: " + ^ (TR.tfold_default (fun memref -> p2s memref#toPretty) "error" memref_r); + "memoff_r: " + ^ (TR.tfold_default memory_offset_to_string "error" memoffset_r)] in TR.tbind ~msg:(__FILE__ ^ ":" ^ (string_of_int __LINE__)) (fun memref -> @@ -1250,21 +1260,44 @@ object (self) ?(size=None) ?(btype=t_unknown) (addrvalue: xpr_t): variable_t traceresult = + let _ = + log_diagnostics_result + ~msg:(p2s self#l#toPretty) + ~tag:"get_var_at_address" + __FILE__ __LINE__ + ["addrvalue: " ^ (x2s addrvalue); + "btype: " ^ (btype_to_string btype)] in + match self#normalize_addrvalue addrvalue with | XOp ((Xf "addressofvar"), [XVar v]) -> Ok v | XOp (XPlus, [XOp ((Xf "addressofvar"), [XVar v]); xoff]) when self#f#env#is_global_variable v -> let gvaddr_r = self#f#env#get_global_variable_address v in + let cxoff_r = self#convert_xpr_to_c_expr xoff in TR.tbind ~msg:(__FILE__ ^ ":" ^ (string_of_int __LINE__)) (fun gvaddr -> if memmap#has_location gvaddr then let gloc = memmap#get_location gvaddr in - TR.tmap - ~msg:(__FILE__ ^ ":" ^ (string_of_int __LINE__)) - (fun offset -> self#f#env#mk_gloc_variable gloc offset) - (gloc#address_offset_memory_offset - ~tgtsize:size ~tgtbtype:btype xoff) + let varresult = + TR.tmap + ~msg:(__FILE__ ^ ":" ^ (string_of_int __LINE__)) + (fun offset -> self#f#env#mk_gloc_variable gloc offset) + (TR.tbind + (fun xoff -> + gloc#address_offset_memory_offset + ~tgtsize:size ~tgtbtype:btype xoff) + cxoff_r) in + let _ = + log_diagnostics_result + ~msg:(p2s self#l#toPretty) + ~tag:"normalized global address" + __FILE__ __LINE__ + ["varresult: " + ^ (TR.tfold_default (fun v -> p2s v#toPretty) "error" varresult); + "gloc: " ^ gloc#name] in + varresult + else Error [__FILE__ ^ ":" ^ (string_of_int __LINE__) ^ ": " ^ (p2s self#l#toPretty) @@ -1805,6 +1838,12 @@ object (self) method decompose_memaddr (x: xpr_t): (memory_reference_int traceresult * memory_offset_t traceresult) = + let _ = + log_diagnostics_result + ~msg:(p2s self#l#toPretty) + ~tag:"decompose_memaddr" + __FILE__ __LINE__ + ["x: " ^ (x2s x)] in let is_external (v: variable_t) = self#env#is_function_initial_value v in let vars = vars_as_positive_terms x in let knownpointers = List.filter self#f#is_base_pointer vars in diff --git a/CodeHawk/CHB/bchlib/bCHTypeConstraintStore.ml b/CodeHawk/CHB/bchlib/bCHTypeConstraintStore.ml index 3ca84ac0..8fddfffc 100644 --- a/CodeHawk/CHB/bchlib/bCHTypeConstraintStore.ml +++ b/CodeHawk/CHB/bchlib/bCHTypeConstraintStore.ml @@ -692,8 +692,8 @@ object (self) Some (t_ptrto (type_constant_to_btype c)) | [Store; OffsetAccess _] -> Some (t_ptrto (type_constant_to_btype c)) - | [OffsetAccessA (_size, _)] -> - Some (t_array (type_constant_to_btype c) 1) + | [OffsetAccessA (size, _)] -> + Some (t_array (type_constant_to_btype c) size) | _ -> None in match optty with | Some ty -> result#add (bcd#index_typ ty) diff --git a/CodeHawk/CHB/bchlibarm32/bCHDisassembleARMInstruction.ml b/CodeHawk/CHB/bchlibarm32/bCHDisassembleARMInstruction.ml index 7482df6f..7f6dc583 100644 --- a/CodeHawk/CHB/bchlibarm32/bCHDisassembleARMInstruction.ml +++ b/CodeHawk/CHB/bchlibarm32/bCHDisassembleARMInstruction.ml @@ -215,7 +215,8 @@ let parse_data_proc_reg_load_stores let rn = arm_register_op rnreg (if iswback then RW else RD) in let rm = arm_register_op rmreg RD in let offset = arm_index_offset rmreg in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback WR in + let mem = + mk_arm_offset_address_op rnreg offset ~size:2 ~isadd ~isindex ~iswback WR in (* STRH{} , [, +/-]{!} Pre-x : (index,wback) = (T,T/F) * STRH{} , [], +/- Post-x: (index,wback) = (F,T) *) StoreRegisterHalfword (c, rt, rn, rm, mem, false) @@ -264,7 +265,8 @@ let parse_data_proc_reg_load_stores let rn = arm_register_op rnreg (if iswback then RW else RD) in let rm = arm_register_op rmreg RD in let offset = arm_index_offset rmreg in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback RD in + let mem = + mk_arm_offset_address_op rnreg offset ~size:2 ~isadd ~isindex ~iswback RD in (* LDRH , [, +/-]{!} Pre-x : (index,wback) = (T,T/F) * LDRH , [], +/- Post-x: (index,wback) = (F,T) *) LoadRegisterHalfword (c, rt, rn, rm, mem, false) @@ -277,7 +279,8 @@ let parse_data_proc_reg_load_stores let rn = arm_register_op rnreg (if iswback then RW else RD) in let rm = arm_register_op rmreg RD in let offset = arm_index_offset rmreg in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback RD in + let mem = + mk_arm_offset_address_op rnreg offset ~size:1 ~isadd ~isindex ~iswback RD in (* LDRSB , [,+/-]{!} * LDRSB , [],+/- *) LoadRegisterSignedByte (c, rt, rn, rm, mem, false) @@ -290,7 +293,8 @@ let parse_data_proc_reg_load_stores let rn = arm_register_op rnreg (if iswback then RW else RD) in let rm = arm_register_op rmreg RD in let offset = arm_index_offset rmreg in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback RD in + let mem = + mk_arm_offset_address_op rnreg offset ~size:2 ~isadd ~isindex ~iswback RD in (* LDRSH , [,+/-]{!} *) (* LDRSH , [],+/- *) LoadRegisterSignedHalfword (c, rt, rn, rm, mem, false) @@ -308,7 +312,8 @@ let parse_data_proc_reg_load_stores (signed_immediate_from_int imm32) in let imm = arm_immediate_op imm in let offset = ARMImmOffset imm32 in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback WR in + let mem = + mk_arm_offset_address_op rnreg offset ~size:2 ~isadd ~isindex ~iswback WR in (* STRH , [{, #+/-}] Offset: (index,wback) = (T,F) * STRH , [, #+/-]! Pre-x : (index,wback) = (T,T) * STRH , [], #+/- Post-x: (index,wback) = (F,T) *) @@ -385,7 +390,8 @@ let parse_data_proc_reg_load_stores (signed_immediate_from_int imm32) in let imm = arm_immediate_op imm in let offset = ARMImmOffset imm32 in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback RD in + let mem = + mk_arm_offset_address_op rnreg offset ~size:2 ~isadd ~isindex ~iswback RD in (* LDRH , [{, #+/-}] Offset: (index,wback) = (T,F) * LDRH , [, #+/-]! Pre-x : (index,wback) = (T,T) * LDRH , [], #+/- Post-x: (index,wback) = (F,T) *) @@ -404,7 +410,8 @@ let parse_data_proc_reg_load_stores (signed_immediate_from_int imm32) in let imm = arm_immediate_op imm in let offset = ARMImmOffset imm32 in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback RD in + let mem = + mk_arm_offset_address_op rnreg offset ~size:1 ~isadd ~isindex ~iswback RD in (* LDRSB , [{, #+/-}] * LDRSB , [], #+/- * LDRSB , [, #+/-]! *) @@ -423,7 +430,8 @@ let parse_data_proc_reg_load_stores (signed_immediate_from_int imm32) in let imm = arm_immediate_op imm in let offset = ARMImmOffset imm32 in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback RD in + let mem = + mk_arm_offset_address_op rnreg offset ~size:2 ~isadd ~isindex ~iswback RD in (* LDRSH , [{, #+/-}] * LDRSH , [], #+/- * LDRSH , [, #+/-]! *) @@ -1202,7 +1210,8 @@ let parse_load_store_imm_type let imm12 = b 11 0 in let imm = TR.tget_ok (mk_arm_immediate_op false 4 (mkNumerical imm12)) in let offset = ARMImmOffset imm12 in - let mk_mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in + let mk_mem ?(size=4) (mode: arm_operand_mode_t) = + mk_arm_offset_address_op rnreg offset ~size ~isadd ~isindex ~iswback mode in match (b 22 22, b 20 20, (rnval, p, u, w, imm12)) with (* <2>10010<13><--imm12:4-> *) (* PUSH - A2 *) @@ -1241,7 +1250,7 @@ let parse_load_store_imm_type (* <2>pu1w0<--imm12---> *) (* STRB-imm *) | (1, 0, _) -> - let mem = mk_mem WR in + let mem = mk_mem ~size:1 WR in (* STRB , [{, #+/-}] Offset: (index,wback) = (T,F) * STRB , [, #+/-]! Pre-x : (index,wback) = (T,T) * STRB , [], #+/- Post-x: (index,wback) = (F,T) *) @@ -1249,7 +1258,7 @@ let parse_load_store_imm_type (* <2>pu1w1<--imm12---> *) (* LDRB-imm *) | (1, 1, _) -> - let mem = mk_mem RD in + let mem = mk_mem ~size:1 RD in (* LDRB , [{, #+/-}] Offset: (index,wback) = (T,F) * LDRB , [, #+/-]! Pre-x : (index,wback) = (T,T) * LDRB , [], #+/- Post-x: (index,wback) = (F,T) *) @@ -1282,7 +1291,8 @@ let parse_load_store_reg_type (instr: doubleword_int) (cond: int) = let (shift_t, shift_n) = decode_imm_shift (b 6 5) (b 11 7) in let reg_srt = ARMImmSRT (shift_t, shift_n) in let offset = arm_shifted_index_offset (get_arm_reg (b 3 0)) reg_srt in - let mk_mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in + let mk_mem ?(size=4) (mode: arm_operand_mode_t) = + mk_arm_offset_address_op rnreg offset ~size ~isadd ~isindex ~iswback mode in let selector = (bv 22, bv 20) in match selector with (* <3>pu0w0ty0 *) (* STR (register) - A1 *) @@ -1301,14 +1311,14 @@ let parse_load_store_reg_type (instr: doubleword_int) (cond: int) = (* <3>pu1w0ty0 *) (* STRB (register) - A1 *) | (1, 0) -> - let mem = mk_mem WR in + let mem = mk_mem ~size:1 WR in (* STRB , [,+/-{, }]{!} *) (* STRB , [],+/-{, } *) StoreRegisterByte (c, rt RD, rn, rm, mem, false) (* <3>pu1w1ty0 *) (* LDRB (register) - A1 *) | (1, 1) -> - let mem = mk_mem RD in + let mem = mk_mem ~size:1 RD in LoadRegisterByte (c, rt WR, rn, rm, mem, false) | _ -> OpInvalid diff --git a/CodeHawk/CHB/bchlibarm32/bCHDisassembleThumbInstruction.ml b/CodeHawk/CHB/bchlibarm32/bCHDisassembleThumbInstruction.ml index d4417dfe..fa410c27 100644 --- a/CodeHawk/CHB/bchlibarm32/bCHDisassembleThumbInstruction.ml +++ b/CodeHawk/CHB/bchlibarm32/bCHDisassembleThumbInstruction.ml @@ -3141,7 +3141,7 @@ let parse_thumb32_31_0 let offset = arm_shifted_index_offset (get_arm_reg (b 3 0)) reg_srt in let mem = mk_arm_offset_address_op - rnreg offset ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:1 ~isadd:true ~isindex:true ~iswback:false in (* STRB.W , [, {, LSL #}] *) StoreRegisterByte (cc, rt RD, rn RD, rm RD, mem WR, true) @@ -3152,7 +3152,8 @@ let parse_thumb32_31_0 let isindex = (b 10 10) = 1 in let isadd = (b 9 9) = 1 in let iswback = (b 8 8) = 1 in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in + let mem = + mk_arm_offset_address_op ~size:1 rnreg offset ~isadd ~isindex ~iswback in (* STRB , [, #-] STRB , [], #+/- STRB , [, #+/-]! *) @@ -3199,7 +3200,7 @@ let parse_thumb32_31_0 let offset = arm_shifted_index_offset (get_arm_reg (b 3 0)) reg_srt in let mem = mk_arm_offset_address_op - rnreg offset ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:2 ~isadd:true ~isindex:true ~iswback:false in (* STRH.W , [, {, LSL #}] *) StoreRegisterHalfword (cc, rt RD, rn RD, rm RD, mem WR, true) @@ -3209,7 +3210,8 @@ let parse_thumb32_31_0 let isindex = (b 10 10) = 1 in let isadd = (b 9 9) = 1 in let iswback = (b 8 8) = 1 in - let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in + let mem = + mk_arm_offset_address_op ~size:2 rnreg offset ~isadd ~isindex ~iswback in (* STRH , [, #-] STRH , [], #+/- STRH , [, #+/-]! *) @@ -3222,7 +3224,7 @@ let parse_thumb32_31_0 let offset = arm_shifted_index_offset (get_arm_reg (b 3 0)) reg_srt in let mem = mk_arm_offset_address_op - rnreg offset ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:2 ~isadd:true ~isindex:true ~iswback:false in (* LDRH.W , [, {, LSL #}] *) LoadRegisterHalfword (cc, rt WR, rn RD, rm RD, mem RD, true) @@ -3234,7 +3236,7 @@ let parse_thumb32_31_0 let iswback = (b 8 8) = 1 in let imm = arm_immediate_op (TR.tget_ok (signed_immediate_from_int (b 7 0))) in let mem = - mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in + mk_arm_offset_address_op ~size:2 rnreg offset ~isadd ~isindex ~iswback in (* LDRH.W , [{, #+/-}] Offset: (index,wback) = (T,F) * LDRH.W , [, #+/-]! Pre-x : (index,wback) = (T,T) * LDRH.W , [], #+/- Post-x: (index,wback) = (F,T) *) @@ -3319,7 +3321,7 @@ let parse_thumb32_31_0 TR.tget_ok (mk_arm_immediate_op false 4 (mkNumerical (b 11 0))) in let mem = mk_arm_offset_address_op - rnreg offset ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:1 ~isadd:true ~isindex:true ~iswback:false in StoreRegisterByte (cc, rt RD, rn RD, immop, mem WR, true) (* < 31>00010W1<15><--imm12---> PLD (immediate, T1) *) @@ -3345,7 +3347,7 @@ let parse_thumb32_31_0 (* STRH.W , [, #] *) let mem = mk_arm_offset_address_op - rnreg offset ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:2 ~isadd:true ~isindex:true ~iswback:false in StoreRegisterHalfword (cc, rt RD, rn RD, rm RD, mem WR, true) (* < 31>00< 11><--imm12---> LDRH (immediate) - T2 *) @@ -3353,7 +3355,7 @@ let parse_thumb32_31_0 (* LDRH.W , [{, #} *) let mem = mk_arm_offset_address_op - rnreg offset ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:2 ~isadd:true ~isindex:true ~iswback:false in LoadRegisterHalfword (cc, rt WR, rn RD, rm RD, mem RD, true) (* < 31>00< 12><--imm12---> STR (immediate) - T3 *) @@ -3395,7 +3397,7 @@ let parse_thumb32_31_0 let offset = arm_shifted_index_offset rmreg reg_srt in let memi = mk_arm_offset_address_op - rnreg offset ~align:1 ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:1 ~align:1 ~isadd:true ~isindex:true ~iswback:false in (* LDRSB.W, , [, {, LSL #}] *) LoadRegisterSignedByte (cc, rt WR, rn RD, rm RD, memi RD, true) @@ -3408,7 +3410,8 @@ let parse_thumb32_31_0 let imm = arm_immediate_op (TR.tget_ok (signed_immediate_from_int (b 7 0))) in let mem = - mk_arm_offset_address_op ~align:1 rnreg offset ~isadd ~isindex ~iswback in + mk_arm_offset_address_op + ~size:1 ~align:1 rnreg offset ~isadd ~isindex ~iswback in (* LDRSB , [, #-] LDRSB , [], #+/- LDRSB , [, #+/-]! *) @@ -3532,7 +3535,7 @@ let parse_thumb32_31_0 let offset = arm_shifted_index_offset rmreg reg_srt in let memi = mk_arm_offset_address_op - rnreg offset ~align:1 ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:2 ~align:2 ~isadd:true ~isindex:true ~iswback:false in (* LDRSH.W, , [, {, LSL #}] *) LoadRegisterSignedHalfword (cc, rt WR, rn RD, rm RD, memi RD, true) @@ -3545,7 +3548,8 @@ let parse_thumb32_31_0 let imm = arm_immediate_op (TR.tget_ok (signed_immediate_from_int (b 7 0))) in let mem = - mk_arm_offset_address_op ~align:1 rnreg offset ~isadd ~isindex ~iswback in + mk_arm_offset_address_op + ~size:2 ~align:2 rnreg offset ~isadd ~isindex ~iswback in (* LDRSH , [, #-] LDRSH , [], #+/- LDRSH , [, #+/-]! *) @@ -3558,7 +3562,7 @@ let parse_thumb32_31_0 let offset = ARMImmOffset imm12 in let mem = mk_arm_offset_address_op - rnreg offset ~align:1 ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:2 ~align:1 ~isadd:true ~isindex:true ~iswback:false in (* LDRSB , [, #] *) LoadRegisterSignedByte (cc, rt WR, rn RD, imm, mem RD, false) @@ -3737,7 +3741,7 @@ let parse_thumb32_31_0 let offset = ARMImmOffset imm12 in let mem = mk_arm_offset_address_op - rnreg offset ~align:1 ~isadd:true ~isindex:true ~iswback:false in + rnreg offset ~size:2 ~align:2 ~isadd:true ~isindex:true ~iswback:false in (* LDRSH , [, #] *) LoadRegisterSignedHalfword (cc, rt WR, rn RD, imm, mem RD, false) @@ -5288,9 +5292,9 @@ let parse_t16_load_store_reg let rt = regop rtreg in let reg_srt = ARMImmSRT (SRType_LSL, 0) in let offset = arm_shifted_index_offset rmreg reg_srt in - let mem ?(size=4) m = + let mem ?(size=4) (mode: arm_operand_mode_t) = mk_arm_offset_address_op - ~size rnreg offset ~isadd:true ~isindex:true ~iswback:false m in + ~size rnreg offset ~isadd:true ~isindex:true ~iswback:false mode in match (b 11 9) with @@ -5302,17 +5306,17 @@ let parse_t16_load_store_reg (* 0101001 STRH (register) - T1 *) | 1 -> (* STRH , [, ] *) - StoreRegisterHalfword (cc, rt RD, rn RD, rm RD, mem WR, false) + StoreRegisterHalfword (cc, rt RD, rn RD, rm RD, mem ~size:2 WR, false) (* 0101010 STRB (register) - T1 *) | 2 -> (* STRB , [, ] *) - StoreRegisterByte (cc, rt RD, rn RD, rm RD, mem WR, false) + StoreRegisterByte (cc, rt RD, rn RD, rm RD, mem ~size:1 WR, false) (* 0101011 LDRSB (register) - T1 *) | 3 -> (* LDRSB , [, ] *) - LoadRegisterSignedByte (cc, rt WR, rn RD, rm RD, mem RD, false) + LoadRegisterSignedByte (cc, rt WR, rn RD, rm RD, mem ~size:1 RD, false) (* 0101100 LDR (register) - T1 *) | 4 -> @@ -5332,7 +5336,7 @@ let parse_t16_load_store_reg (* 0101111 LDRSH (register) - T1 *) | 7 -> (* LDRSH , [, ] *) - LoadRegisterSignedHalfword (cc, rt WR, rn RD, rm RD, mem RD, false) + LoadRegisterSignedHalfword (cc, rt WR, rn RD, rm RD, mem ~size:2 RD, false) | tag -> NotRecognized ("t16_load_store_reg:" ^ (stri tag), instr) @@ -5370,16 +5374,16 @@ let parse_t16_load_store_imm arm_immediate_op (TR.tget_ok (signed_immediate_from_int (mult * (b 10 6)))) in let offset (m:int) = ARMImmOffset (m * (b 10 6)) in - let mem (mult: int) m = + let mem (mult: int) ?(size=4) (mode: arm_operand_mode_t) = mk_arm_offset_address_op - rnreg (offset mult) ~isadd:true ~isindex:true ~iswback:false m in + rnreg (offset mult) ~size ~isadd:true ~isindex:true ~iswback:false mode in match (b 12 11) with (* 10000 STRH (immediate) - T1 *) | 0 when hw -> let immop = imm 2 in (* STRH , [, #] *) - StoreRegisterHalfword (cc, rt RD, rn RD, immop, mem 2 WR, false) + StoreRegisterHalfword (cc, rt RD, rn RD, immop, mem 2 ~size:2 WR, false) (* 01100 STR (immediate) - T1 *) | 0 -> @@ -5391,7 +5395,7 @@ let parse_t16_load_store_imm | 1 when hw -> let immop = imm 2 in (* LDRH , [, #] - T1 *) - LoadRegisterHalfword (cc, rt WR, rn RD, immop, mem 2 RD, false) + LoadRegisterHalfword (cc, rt WR, rn RD, immop, mem 2 ~size:2 RD, false) (* 01101 LDR (immediate) - T1 *) | 1 -> @@ -5403,13 +5407,13 @@ let parse_t16_load_store_imm | 2 -> let immop = imm 1 in (* STRB , [, #] *) - StoreRegisterByte (cc, rt RD, rn RD, immop, mem 1 WR, false) + StoreRegisterByte (cc, rt RD, rn RD, immop, mem 1 ~size:1 WR, false) (* 01111 LDRB (immediate) - T1*) | 3 -> let immop = imm 1 in (* LDRB , [, #] *) - LoadRegisterByte (cc, rt WR, rn RD, immop, mem 1 RD, false) + LoadRegisterByte (cc, rt WR, rn RD, immop, mem 1 ~size:1 RD, false) | tag -> NotRecognized ("t16_load_store_imm:" ^ (stri tag), instr) diff --git a/CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml b/CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml index 7935b433..c681f376 100644 --- a/CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml +++ b/CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml @@ -1105,10 +1105,13 @@ object (self) let indexregop = jt#index_operand in let xrn_r = indexregop#to_expr floc in let xxrn_r = TR.tmap rewrite_expr xrn_r in + let cxrn_r = + TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 4)) xxrn_r in let rdefs = (get_rdef_r xrn_r) :: (get_all_rdefs_r xxrn_r) in let (tagstring, args) = mk_instrx_data_r ~xprs_r:[xrn_r; xxrn_r] + ~cxprs_r:[cxrn_r] ~rdefs () in let tags = tagstring :: ["agg-jt"] in