5050
5151
5252class 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