Skip to content

Commit 09c4683

Browse files
committed
ARM:STRB: update for conversion to C expressions
1 parent 62770f1 commit 09c4683

File tree

1 file changed

+100
-51
lines changed

1 file changed

+100
-51
lines changed

chb/arm/opcodes/ARMStoreRegisterByte.py

Lines changed: 100 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,25 @@
5252

5353

5454
class 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

Comments
 (0)