Skip to content

Commit ada1128

Browse files
committed
ARM:POP: conversion of return value for c expressions
1 parent 1d08371 commit ada1128

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

chb/arm/opcodes/ARMPop.py

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,23 @@
5050

5151

5252
class ARMPopXData(ARMOpcodeXData):
53+
"""Data format:
54+
- variables:
55+
0: splhs
56+
1..n: lhsvars
57+
58+
- expressions:
59+
0: sprhs
60+
1: spresult
61+
2: rspresult (spresult, rewritten)
62+
3..n+2: rrhsexprs
63+
n+3 .. (2n+2): xaddrs
64+
65+
optional return values:
66+
- returnval
67+
- rreturnval
68+
- creturnval
69+
"""
5370

5471
def __init__(self, xdata: InstrXData) -> None:
5572
ARMOpcodeXData.__init__(self, xdata)
@@ -96,6 +113,12 @@ def returnval(self) -> "XXpr":
96113
def rreturnval(self) -> "XXpr":
97114
return self.xdata.get_return_xxpr()
98115

116+
def has_creturnval(self) -> bool:
117+
return self.xdata.has_return_cxpr()
118+
119+
def creturnval(self) -> "XXpr":
120+
return self.xdata.get_return_cxpr()
121+
99122
@property
100123
def r0(self) -> Optional["XXpr"]:
101124
if "return" in self._xdata.tags:
@@ -109,7 +132,11 @@ def annotation(self) -> str:
109132
assigns = "; ".join(str(v) + " := " + str(x) for (v, x) in pairs)
110133
assigns = spassign + "; " + assigns
111134
if self.has_return_xpr():
112-
rxpr = "; return " + str(self.rreturnval())
135+
cxpr = (
136+
" (C: "
137+
+ (str(self.creturnval()) if self.has_creturnval() else "None")
138+
+ ")")
139+
rxpr = "; return " + str(self.rreturnval()) + cxpr
113140
else:
114141
rxpr = ""
115142
return self.add_instruction_condition(assigns + rxpr)
@@ -126,16 +153,8 @@ class ARMPop(ARMOpcode):
126153
args[1]: index of register list in armdictionary
127154
args[2]: is-wide (thumb)
128155
129-
xdata format: a:vv(n)xxxx(n)rr(n)dd(n)hh(n) (SP + registers popped)
130-
---------------------------------------------------------------------
131-
vars[0]: SP
132-
vars[1..n]: v(r) for r: register popped
133-
xprs[0]: SP
134-
xprs[1]: SP updated
135-
xprs[2]: SP updated, simplified
136-
xprs[3..n+2]: x(m) for m: memory location value retrieved
137-
xprs[n+3..2n+2]: memory address of memory location value retrieved
138-
xprs[2n+3]: (optional) value of R0 if register list includes PC
156+
xdata format
157+
------------
139158
rdefs[0]: SP
140159
rdefs[1..n]: rdef(m) for m: memory location variable
141160
rdefs[n+1]: (optional) rdef for R0 if register list includes PC
@@ -172,16 +191,16 @@ def is_return_instruction(self, xdata: InstrXData) -> bool:
172191
def return_value(self, xdata: InstrXData) -> Optional[XXpr]:
173192
xd = ARMPopXData(xdata)
174193
if xd.has_return_xpr():
175-
return xd.rreturnval()
194+
if xd.has_creturnval():
195+
return xd.creturnval()
196+
else:
197+
return xd.rreturnval()
176198
else:
177199
return None
178200

179201
def annotation(self, xdata: InstrXData) -> str:
180202
xd = ARMPopXData(xdata)
181-
if xd.is_ok:
182-
return xd.annotation
183-
else:
184-
return "Error value"
203+
return xd.annotation
185204

186205
def ast_condition_prov(
187206
self,

chb/arm/opcodes/ARMStoreMultipleIncrementAfter.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,12 +394,16 @@ def ast_prov_ldmstmcopy(
394394

395395
# high-level arguments
396396

397-
if xd.is_xxdst_ok:
397+
if xd.is_cdst_ok:
398+
xxdst = xd.cdst
399+
elif xd.is_xxdst_ok:
398400
xxdst = xd.xxdst
399401
else:
400402
xxdst = xdst
401403

402-
if xd.is_xxsrc_ok:
404+
if xd.is_csrc_ok:
405+
xxsrc = xd.csrc
406+
elif xd.is_xxsrc_ok:
403407
xxsrc = xd.xxsrc
404408
else:
405409
xxsrc = xsrc

chb/cmdline/commandutil.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ def results_stats(args: argparse.Namespace) -> NoReturn:
619619
sortby: str = args.sortby
620620
timeshare: int = args.timeshare
621621
opcodes: str = args.opcodes
622-
annotationfile: str = str(args.annotationfile)
622+
annotationfile: Optional[str] = args.annotationfile
623623
loglevel: str = args.loglevel
624624
logfilename: Optional[str] = args.logfilename
625625
logfilemode: str = args.logfilemode

0 commit comments

Comments
 (0)