Skip to content

Commit 87cdaa6

Browse files
committed
ARM:ASR: update for conversion to C expressions
1 parent 550b78e commit 87cdaa6

File tree

1 file changed

+58
-19
lines changed

1 file changed

+58
-19
lines changed

chb/arm/opcodes/ARMArithmeticShiftRight.py

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@
4949

5050

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

5366
def __init__(self, xdata: InstrXData) -> None:
5467
ARMOpcodeXData.__init__(self, xdata)
@@ -69,18 +82,43 @@ def xrm(self) -> "XXpr":
6982
def result(self) -> "XXpr":
7083
return self.xpr(2, "result")
7184

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

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

81115
@property
82116
def annotation(self) -> str:
83-
assignment = str(self.vrd) + " := " + self.result_simplified
117+
cresult = (
118+
" (C: "
119+
+ (str(self.cresult) if self.is_cresult_ok else "None")
120+
+ ")")
121+
assignment = str(self.vrd) + " := " + self.result_simplified + cresult
84122
return self.add_instruction_condition(assignment)
85123

86124

@@ -98,13 +136,8 @@ class ARMArithmeticShiftRight(ARMOpcode):
98136
args[3]: index of rm in armdictionary
99137
args[4]: is-wide (thumb)
100138
101-
xdata format: a:vxxxxrrdh
102-
-------------------------
103-
vars[0]: lhs
104-
xprs[0]: xrn
105-
xprs[1]: xrm
106-
xprs[2]: xrn >> xrm
107-
xprs[3]: xrn >> xrm (simplified)
139+
xdata format
140+
------------
108141
rdefs[0]: xrm
109142
rdefs[1]: xrn
110143
rdefs[2..]: xrn >> xrm (simplified)
@@ -136,10 +169,7 @@ def mnemonic_extension(self) -> str:
136169

137170
def annotation(self, xdata: InstrXData) -> str:
138171
xd = ARMArithmeticShiftRightXData(xdata)
139-
if xd.is_ok:
140-
return xd.annotation
141-
else:
142-
return "Error value"
172+
return xd.annotation
143173

144174
def ast_prov(
145175
self,
@@ -168,21 +198,30 @@ def ast_prov(
168198
# high-level assignment
169199

170200
xd = ARMArithmeticShiftRightXData(xdata)
171-
if not xd.is_ok:
201+
202+
if xd.is_cresult_ok and xd.is_rresult_ok:
203+
rhs = xd.cresult
204+
205+
elif xd.is_rresult_ok:
206+
rhs = xd.rresult
207+
208+
elif xd.is_result_ok:
209+
rhs = xd.result
210+
211+
else:
172212
chklogger.logger.error(
173-
"Encountered error value at address %s", iaddr)
174-
return ([], [])
213+
"ASR: Encountered error value for rhs at address %s", iaddr)
214+
return ([], [ll_assign])
175215

176216
lhs = xd.vrd
177217
rhs1 = xd.xrn
178218
rhs2 = xd.xrm
179-
rhs3 = xd.rresult
180219
rdefs = xdata.reachingdefs
181220
defuses = xdata.defuses
182221
defuseshigh = xdata.defuseshigh
183222

184223
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
185-
hl_rhs = XU.xxpr_to_ast_def_expr(rhs3, xdata, iaddr, astree)
224+
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)
186225

187226
hl_assign = astree.mk_assign(
188227
hl_lhs,

0 commit comments

Comments
 (0)