@@ -766,6 +766,31 @@ object (self)
766766 * resolve and save ScaledReg (cpureg1, cpureg2, 1, offset) (memrefs2)
767767 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *)
768768
769+ method get_memory_variable_varoffset
770+ ?(size =4 ) (var1 : variable_t ) (var2 : variable_t ) (offset : numerical_t ):
771+ variable_t traceresult =
772+ let addr = XOp (XPlus , [XVar var1; XVar var2]) in
773+ let addr = XOp (XPlus , [addr; num_constant_expr offset]) in
774+ let address = simplify_xpr (self#inv#rewrite_expr addr) in
775+ let (memref_r, memoff_r) = self#decompose_memaddr address in
776+ tbind
777+ ~msg: (__FILE__ ^ " :" ^ (string_of_int __LINE__))
778+ (fun memref ->
779+ if memref#is_global_reference then
780+ tbind
781+ ~msg: (__FILE__ ^ " :" ^ (string_of_int __LINE__) ^ " : memref:global" )
782+ (fun memoff ->
783+ self#env#mk_global_variable ~size (get_total_constant_offset memoff))
784+ memoff_r
785+ else
786+ tmap
787+ ~msg: (__FILE__ ^ " :" ^ (string_of_int __LINE__))
788+ (fun memoff ->
789+ (self#env#mk_memory_variable
790+ memref (get_total_constant_offset memoff)))
791+ memoff_r)
792+ memref_r
793+
769794 method get_memory_variable_2
770795 ?(size =4 ) (var1 :variable_t ) (var2 :variable_t ) (offset :numerical_t ) =
771796 let _ = track_function
@@ -792,6 +817,42 @@ object (self)
792817 * resolve and save ScaledReg (cpureg1, cpureg2, s, offset) (memrefs3)
793818 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *)
794819
820+ method get_memory_variable_scaledoffset
821+ ?(size =4 )
822+ (base : variable_t )
823+ (index : variable_t )
824+ (scale : int )
825+ (offset : numerical_t ): variable_t traceresult =
826+ let indexexpr =
827+ if self#inv#is_constant index then
828+ num_constant_expr (self#inv#get_constant index)
829+ else
830+ XVar index in
831+ let addr = XOp (XPlus , [XVar base; num_constant_expr offset]) in
832+ let addr = self#inv#rewrite_expr addr in
833+ let addr =
834+ XOp (XPlus ,
835+ [addr; XOp (XMult , [int_constant_expr scale; indexexpr])]) in
836+ let address = simplify_xpr (self#inv#rewrite_expr addr) in
837+ let (memref_r, memoff_r) = self#decompose_memaddr address in
838+ tbind
839+ ~msg: (__FILE__ ^ " :" ^ (string_of_int __LINE__))
840+ (fun memref ->
841+ if memref#is_global_reference then
842+ tbind
843+ ~msg: (__FILE__ ^ " :" ^ (string_of_int __LINE__) ^ " : memref:global" )
844+ (fun memoff ->
845+ self#env#mk_global_variable ~size (get_total_constant_offset memoff))
846+ memoff_r
847+ else
848+ tmap
849+ ~msg: (__FILE__ ^ " :" ^ (string_of_int __LINE__))
850+ (fun memoff ->
851+ (self#env#mk_memory_variable
852+ memref (get_total_constant_offset memoff)))
853+ memoff_r)
854+ memref_r
855+
795856 method get_memory_variable_3
796857 ?(size =4 )
797858 (base :variable_t )
@@ -1528,6 +1589,65 @@ object (self)
15281589 (List. length vars) > 0
15291590 && List. for_all is_fixed_type (variables_in_expr x)
15301591
1592+ method get_assign_commands_r
1593+ ?(signed =false )
1594+ ?(size =4 )
1595+ (lhs_r : variable_t traceresult )
1596+ (rhs_r : xpr_t traceresult ): cmd_t list =
1597+ if Result. is_error lhs_r then
1598+ let (cmds, op_args) =
1599+ TR. tfold
1600+ ~ok: (fun rhs ->
1601+ let reqN () = self#env#mk_num_temp in
1602+ let reqC = self#env#request_num_constant in
1603+ let (rhscmds, rhs_c) = xpr_to_numexpr reqN reqC rhs in
1604+ (rhscmds, get_rhs_op_args rhs_c))
1605+ ~error: (fun e ->
1606+ begin
1607+ log_error_result
1608+ ~tag: (" assignment lhs unknown" )
1609+ ~msg: (p2s self#l#toPretty)
1610+ __FILE__ __LINE__ e;
1611+ ([] , [] )
1612+ end )
1613+ rhs_r in
1614+ cmds @ [OPERATION ({op_name = unknown_write_symbol; op_args = op_args})]
1615+
1616+ else if Result. is_error rhs_r then
1617+ let lhs = TR. tget_ok lhs_r in
1618+ [ABSTRACT_VARS [lhs]]
1619+
1620+ else
1621+ let lhs = TR. tget_ok lhs_r in
1622+ let rhs = TR. tget_ok rhs_r in
1623+ let rhs = simplify_xpr (self#inv#rewrite_expr rhs) in
1624+ let rhs =
1625+ if not signed then
1626+ match rhs with
1627+ | XConst (IntConst n ) ->
1628+ let n =
1629+ match size with
1630+ | 1 -> n#modulo numerical_e8
1631+ | 2 -> n#modulo numerical_e16
1632+ | 4 -> n#modulo numerical_e32
1633+ | _ -> n in
1634+ num_constant_expr n
1635+ | _ -> rhs
1636+ else
1637+ rhs in
1638+
1639+ let rhs =
1640+ (* if rhs is a composite symbolic expression, create a new variable
1641+ for it *)
1642+ if self#is_composite_symbolic_value rhs then
1643+ XVar (self#env#mk_symbolic_value rhs)
1644+ else
1645+ rhs in
1646+ let reqN () = self#env#mk_num_temp in
1647+ let reqC = self#env#request_num_constant in
1648+ let (rhscmds, rhs_c) = xpr_to_numexpr reqN reqC rhs in
1649+ rhscmds @ [ASSIGN_NUM (lhs, rhs_c)]
1650+
15311651 (* Note: recording of loads and stores is performed by the different
15321652 architectures directly in FnXXXDictionary.*)
15331653 method get_assign_commands
@@ -1753,6 +1873,18 @@ object (self)
17531873 (x2s size) (btype_to_string vtype) in
17541874 [ABSTRACT_VARS [lhs]]
17551875
1876+ method get_abstract_commands_r (lhs_r : variable_t traceresult ): cmd_t list =
1877+ TR. tfold
1878+ ~ok: (fun lhs -> [ABSTRACT_VARS [lhs]])
1879+ ~error: (fun e ->
1880+ begin
1881+ log_error_result
1882+ ~tag: " lhs not abstracted" ~msg: (p2s self#l#toPretty)
1883+ __FILE__ __LINE__ e;
1884+ []
1885+ end )
1886+ lhs_r
1887+
17561888 method get_ssa_abstract_commands (reg : register_t ) () =
17571889 let regvar = self#env#mk_register_variable reg in
17581890 (regvar, [ABSTRACT_VARS [regvar]])
0 commit comments