Skip to content

Commit c8f8bc8

Browse files
committed
ARM:RSB: update for conversion to C expressions
1 parent 876edb0 commit c8f8bc8

File tree

1 file changed

+53
-21
lines changed

1 file changed

+53
-21
lines changed

chb/arm/opcodes/ARMReverseSubtract.py

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@
5050

5151

5252
class ARMReverseSubtractXData(ARMOpcodeXData):
53+
"""Data format:
54+
- variables:
55+
0: vrd
56+
57+
- expressions:
58+
0: xrn
59+
1: xrm
60+
2: result
61+
3: rresult (result rewritten)
62+
63+
- c expressions:
64+
0: cresult
65+
"""
5366

5467
def __init__(self, xdata: InstrXData) -> None:
5568
ARMOpcodeXData.__init__(self, xdata)
@@ -70,18 +83,41 @@ def xrm(self) -> "XXpr":
7083
def result(self) -> "XXpr":
7184
return self.xpr(2, "result")
7285

86+
@property
87+
def is_result_ok(self) -> bool:
88+
return self.is_xpr_ok(2)
89+
7390
@property
7491
def rresult(self) -> "XXpr":
7592
return self.xpr(3, "rresult")
7693

94+
@property
95+
def is_rresult_ok(self) -> bool:
96+
return self.is_xpr_ok(3)
97+
98+
@property
99+
def cresult(self) -> "XXpr":
100+
return self.cxpr(0, "cresult")
101+
102+
@property
103+
def is_cresult_ok(self) -> bool:
104+
return self.is_cxpr_ok(0)
105+
77106
@property
78107
def result_simplified(self) -> str:
79-
return simplify_result(
80-
self.xdata.args[3], self.xdata.args[4], self.result, self.rresult)
108+
if self.is_result_ok and self.is_rresult_ok:
109+
return simplify_result(
110+
self.xdata.args[3], self.xdata.args[4], self.result, self.rresult)
111+
else:
112+
return str(self.xrm) + " - " + str(self.xrn)
81113

82114
@property
83115
def annotation(self) -> str:
84-
assignment = str(self.vrd) + " := " + self.result_simplified
116+
cresult = (
117+
" (C: "
118+
+ (str(self.cresult) if self.is_cresult_ok else "None")
119+
+ ")")
120+
assignment = str(self.vrd) + " := " + self.result_simplified + cresult
85121
return self.add_instruction_condition(assignment)
86122

87123

@@ -98,13 +134,8 @@ class ARMReverseSubtract(ARMOpcode):
98134
args[3]: index of op3 in armdictionary
99135
args[4]: is-wide (thumb)
100136
101-
xdata format: a:vxxxxrrdh
102-
-------------------------
103-
vars[0]: lhs (Rd)
104-
xprs[0]: rhs1 (Rn)
105-
xprs[1]: rhs2 (Rm)
106-
xprs[2]: rhs2 - rhs1
107-
xprs[3]: rhs2 - rhs1 (simplified)
137+
xdata format:
138+
-------------
108139
rdefs[0]: rhs1
109140
rdefs[1]: rhs2
110141
rdefs[2]: reaching definitions for simplified result
@@ -141,10 +172,7 @@ def is_writeback(self) -> bool:
141172

142173
def annotation(self, xdata: InstrXData) -> str:
143174
xd = ARMReverseSubtractXData(xdata)
144-
if xd.is_ok:
145-
return xd.annotation
146-
else:
147-
return "Error value"
175+
return xd.annotation
148176

149177
def ast_prov(
150178
self,
@@ -178,21 +206,25 @@ def ast_prov(
178206
# high-level assignment
179207

180208
xd = ARMReverseSubtractXData(xdata)
181-
if not xd.is_ok:
209+
210+
if xd.is_cresult_ok:
211+
rhs = xd.cresult
212+
elif xd.is_rresult_ok:
213+
rhs = xd.rresult
214+
elif xd.is_result_ok:
215+
rhs = xd.result
216+
else:
182217
chklogger.logger.error(
183-
"Encountered error value at address %s", iaddr)
184-
return ([], [])
218+
"RSB: Encountered error value for rhs at address %s", iaddr)
219+
return ([], [ll_assign])
185220

186221
lhs = xd.vrd
187-
rhs1 = xd.xrn
188-
rhs2 = xd.xrm
189-
rhs3 = xd.rresult
190222

191223
defuses = xdata.defuses
192224
defuseshigh = xdata.defuseshigh
193225

194226
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
195-
hl_rhs = XU.xxpr_to_ast_def_expr(rhs3, xdata, iaddr, astree)
227+
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)
196228

197229
hl_assign = astree.mk_assign(
198230
hl_lhs,

0 commit comments

Comments
 (0)