4949
5050
5151class ARMBitwiseOrXData (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,41 @@ 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+ else :
111+ return str (self .xrn ) + " | " + str (self .xrm )
80112
81113 @property
82114 def annotation (self ) -> str :
83- assignment = str (self .vrd ) + " := " + self .result_simplified
115+ cresult = (
116+ " (C: "
117+ + (str (self .cresult ) if self .is_cresult_ok else "None" )
118+ + ")" )
119+ assignment = str (self .vrd ) + " := " + self .result_simplified + cresult
84120 return self .add_instruction_condition (assignment )
85121
86122
@@ -98,13 +134,8 @@ class ARMBitwiseOr(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
104- xprs[0]: xrn
105- xprs[1]: xrm
106- xprs[2]: xrn & xrm
107- xprs[3]: xrn & xrm (simplified)
137+ xdata format:
138+ -------------
108139 rdefs[0]: xrm
109140 rdefs[1]: xrn
110141 rdefs[2..]: xrn & xrm (simplified)
@@ -136,10 +167,7 @@ def opargs(self) -> List[ARMOperand]:
136167
137168 def annotation (self , xdata : InstrXData ) -> str :
138169 xd = ARMBitwiseOrXData (xdata )
139- if xd .is_ok :
140- return xd .annotation
141- else :
142- return "Error value"
170+ return xd .annotation
143171
144172 def ast_prov (
145173 self ,
@@ -173,18 +201,27 @@ def ast_prov(
173201 # high-level assignment
174202
175203 xd = ARMBitwiseOrXData (xdata )
176- if not xd .is_ok :
204+
205+ if xd .is_cresult_ok :
206+ rhs = xd .cresult
207+
208+ elif xd .is_rresult_ok :
209+ rhs = xd .rresult
210+
211+ elif xd .is_result_ok :
212+ rhs = xd .result
213+
214+ else :
177215 chklogger .logger .error (
178- "Encountered error value at address %s" , iaddr )
179- return ([], [])
216+ "ORR: Encountered error value for rhs at address %s" , iaddr )
217+ return ([], [ll_assign ])
180218
181219 lhs = xd .vrd
182- rhs3 = xd .rresult
183220 defuses = xdata .defuses
184221 defuseshigh = xdata .defuseshigh
185222
186223 hl_lhs = XU .xvariable_to_ast_lval (lhs , xdata , iaddr , astree )
187- 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 )
188225
189226 hl_assign = astree .mk_assign (
190227 hl_lhs ,
0 commit comments