5050
5151
5252class 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 ,
0 commit comments