5252
5353
5454class ARMStoreRegisterByteXData (ARMOpcodeXData ):
55+ """Data format:
56+ - variables:
57+ 0: vmem_r (lhs)
58+
59+ - c variables:
60+ 0: cvmem_r (lhs)
61+
62+ - expressions:
63+ 0: xrn
64+ 1: xrm
65+ 2: xrt (rhs)
66+ 3: xxrt (rhs, rewritten)
67+ 4: xaddr (lhs address)
68+ 5: xxaddr (lhs address, rewritten)
69+
70+ - c expressions:
71+ 0: cxrt (rhs)
72+ 1: cxaddr (lhs address)
73+ """
5574
5675 def __init__ (self , xdata : InstrXData ) -> None :
5776 ARMOpcodeXData .__init__ (self , xdata )
@@ -61,20 +80,16 @@ def vmem(self) -> "XVariable":
6180 return self .var (0 , "vmem" )
6281
6382 @property
64- def is_vmem_unknown (self ) -> bool :
65- return self .xdata .vars_r [0 ] is None
66-
67- @property
68- def lhsvar (self ) -> "XVariable" :
69- return self .var (1 , "lhsvar" )
83+ def is_vmem_ok (self ) -> bool :
84+ return self .is_var_ok (0 )
7085
7186 @property
72- def is_lhsvar_unknown (self ) -> bool :
73- return self .xdata . vars_r [ 1 ] is None
87+ def cvmem (self ) -> "XVariable" :
88+ return self .cvar ( 0 , "cvmem" )
7489
7590 @property
76- def is_lhsvar_known (self ) -> bool :
77- return self .xdata . vars_r [ 1 ] is not None
91+ def is_cvmem_ok (self ) -> bool :
92+ return self .is_cvar_ok ( 0 )
7893
7994 @property
8095 def xrn (self ) -> "XXpr" :
@@ -92,23 +107,62 @@ def xrt(self) -> "XXpr":
92107 def xxrt (self ) -> "XXpr" :
93108 return self .xpr (3 , "xxrt" )
94109
110+ @property
111+ def is_xxrt_ok (self ) -> bool :
112+ return self .is_xpr_ok (3 )
113+
114+ @property
115+ def cxrt (self ) -> "XXpr" :
116+ return self .cxpr (0 , "cxrt" )
117+
118+ @property
119+ def is_cxrt_ok (self ) -> bool :
120+ return self .is_cxpr_ok (0 )
121+
95122 @property
96123 def xaddr (self ) -> "XXpr" :
97124 return self .xpr (4 , "xaddr" )
98125
99126 @property
100- def is_address_known (self ) -> bool :
101- return self .xdata .xprs_r [4 ] is not None
127+ def is_xaddr_ok (self ) -> "bool" :
128+ return self .is_xpr_ok (4 )
129+
130+ @property
131+ def xxaddr (self ) -> "XXpr" :
132+ return self .xpr (5 , "xxaddr" )
133+
134+ @property
135+ def is_xxaddr_ok (self ) -> bool :
136+ return self .is_xpr_ok (5 )
137+
138+ @property
139+ def cxaddr (self ) -> "XXpr" :
140+ return self .cxpr (1 , "cxaddr" )
141+
142+ @property
143+ def is_cxaddr_ok (self ) -> bool :
144+ return self .is_cxpr_ok (1 )
102145
103146 @property
104147 def annotation (self ) -> str :
105148 wbu = self .writeback_update ()
106- if self .is_ok :
107- assignment = str (self .vmem ) + " := " + str (self .xxrt )
108- elif self .is_vmem_unknown and self .is_address_known :
109- assignment = "*(" + str (self .xaddr ) + ") := " + str (self .xxrt )
149+ clhs = str (self .cvmem ) if self .is_cvmem_ok else "None"
150+ crhs = str (self .cxrt ) if self .is_cxrt_ok else "None"
151+ assignc = "(C: " + clhs + " := " + crhs + ")"
152+ if self .is_vmem_ok :
153+ lhs = str (self .vmem )
154+ elif self .is_xxaddr_ok :
155+ lhs = "*(" + str (self .xxaddr ) + ")"
156+ elif self .is_xaddr_ok :
157+ lhs = "*(" + str (self .xaddr ) + ")"
158+ else :
159+ lhs = "Error addr"
160+ if self .is_xxrt_ok :
161+ rhs = str (self .xxrt )
110162 else :
111- assignment = "Error value"
163+ rhs = "Error value"
164+ assign = lhs + " := " + rhs
165+ assignment = assign + " " + assignc
112166 return self .add_instruction_condition (assignment + wbu )
113167
114168
@@ -125,15 +179,8 @@ class ARMStoreRegisterByte(ARMOpcode):
125179 args[3]: index of memory location in armdictionary
126180 args[4]: is-wide (thumb)
127181
128- xdata format: a:vxxxxrrrdh
129- --------------------------
130- vars[0]: lhs
131- xprs[0]: xrn (base register)
132- xprs[1]: xrm (index)
133- xprs[2]: xrt (rhs, source register)
134- xprs[3]: xrt (rhs, simplified)
135- xprs[4]: xaddr (memory address)
136- xprs[5]: condition (if TC is set)
182+ xdata format:
183+ -------------
137184 rdefs[0]: rn
138185 rdefs[1]: rm
139186 rdefs[2]: rt
@@ -199,42 +246,44 @@ def ast_prov(
199246
200247 xd = ARMStoreRegisterByteXData (xdata )
201248
202- if xd .is_ok :
203- lhs = xd .lhsvar
204- memaddr = xd .xaddr
205- hl_lhs = XU .xvariable_to_ast_lval (
206- lhs , xdata , iaddr , astree , memaddr = memaddr )
249+ if xd .is_cvmem_ok :
250+ lhs = xd .cvmem
251+ hl_lhs = XU .xvariable_to_ast_lval (lhs , xdata , iaddr , astree )
207252
208- elif xd .is_vmem_unknown and xd .is_lhsvar_known and xd .is_address_known :
209- memaddr = xd .xaddr
210- lhsvar = xd .lhsvar
211- hl_lhs = XU .xvariable_to_ast_lval (
212- lhsvar , xdata , iaddr , astree , memaddr = memaddr )
253+ elif xd .is_vmem_ok :
254+ lhs = xd .vmem
255+ hl_lhs = XU .xvariable_to_ast_lval (lhs , xdata , iaddr , astree )
256+
257+ elif xd .is_cxaddr_ok :
258+ memaddr = xd .cxaddr
259+ hl_lhs = XU .xmemory_dereference_lval (memaddr , xdata , iaddr , astree )
260+
261+ elif xd .is_xxaddr_ok :
262+ memaddr = xd .xxaddr
263+ hl_lhs = XU .xmemory_dereference_lval (memaddr , xdata , iaddr , astree )
213264
214- elif xd .is_address_known :
265+ elif xd .is_xaddr_ok :
215266 memaddr = xd .xaddr
216267 hl_lhs = XU .xmemory_dereference_lval (memaddr , xdata , iaddr , astree )
217268
218269 else :
219270 chklogger .logger .error (
220271 "STRB: Lhs lval and address both have error values: skipping "
221- + "store instruction at address %s" ,
222- iaddr )
223- return ([], [])
272+ "store instruction at address %s" , iaddr )
273+ return ([], (ll_preinstrs + [ll_assign ] + ll_postinstrs ))
274+
275+ if xd .is_cxrt_ok :
276+ rhs = xd .cxrt
277+ elif xd .is_xxrt_ok :
278+ rhs = xd .xxrt
279+ else :
280+ rhs = xd .xrt
281+ hl_rhs = XU .xxpr_to_ast_def_expr (rhs , xdata , iaddr , astree )
224282
225- rhs = xd .xxrt
226- rhs_basic = xd .xrt
227283 rdefs = xdata .reachingdefs
228284 defuses = xdata .defuses
229285 defuseshigh = xdata .defuseshigh
230286
231- if rhs .has_variables_with_property (
232- lambda v : v .is_initial_memory_value
233- and xdata .function .has_var_disequality (iaddr , v )):
234- hl_rhs = XU .xxpr_to_ast_def_expr (rhs_basic , xdata , iaddr , astree )
235- else :
236- hl_rhs = XU .xxpr_to_ast_def_expr (rhs , xdata , iaddr , astree )
237-
238287 hl_assign = astree .mk_assign (
239288 hl_lhs ,
240289 hl_rhs ,
@@ -246,7 +295,7 @@ def ast_prov(
246295 # to variables that are part of a struct or array variable, so these
247296 # assignments must be explicitly forced to appear in the lifting
248297 if (
249- xd .is_vmem_unknown
298+ ( not xd .is_vmem_ok )
250299 or hl_lhs .offset .is_index_offset
251300 or hl_lhs .offset .is_field_offset ):
252301 astree .add_expose_instruction (hl_assign .instrid )
@@ -302,4 +351,4 @@ def ast_prov(
302351 memexp = cast (AST .ASTMemRef , ll_lhs .lhost ).memexp
303352 astree .add_expr_reachingdefs (memexp , [rdefs [0 ], rdefs [1 ]])
304353
305- return ([hl_assign ], [ ll_assign ] )
354+ return ([hl_assign ], ( ll_preinstrs + ll_assigns + ll_postinstrs ) )
0 commit comments