4949
5050
5151class ARMLogicalShiftLeftXData (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 expresions:
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
@@ -156,10 +192,7 @@ def lsl_xdata(self, xdata: InstrXData) -> ARMLogicalShiftLeftXData:
156192
157193 def annotation (self , xdata : InstrXData ) -> str :
158194 xd = ARMLogicalShiftLeftXData (xdata )
159- if xd .is_ok :
160- return xd .annotation
161- else :
162- return "Error value"
195+ return xd .annotation
163196
164197 def ast_prov (
165198 self ,
@@ -185,24 +218,35 @@ def ast_prov(
185218 bytestring = bytestring ,
186219 annotations = annotations )
187220
221+ rdefs = xdata .reachingdefs
222+
223+ astree .add_expr_reachingdefs (ll_rhs1 , [rdefs [0 ]])
224+ astree .add_expr_reachingdefs (ll_rhs2 , [rdefs [1 ]])
225+
188226 # high-level assignment
189227
190228 xd = ARMLogicalShiftLeftXData (xdata )
191- if not xd .is_ok :
229+
230+ if xd .is_cresult_ok and xd .is_rresult_ok :
231+ rhs = xd .cresult
232+
233+ elif xd .is_rresult_ok :
234+ rhs = xd .rresult
235+
236+ elif xd .is_result_ok :
237+ rhs = xd .result
238+
239+ else :
192240 chklogger .logger .error (
193- "Encountered error value at address %s" , iaddr )
194- return ([], [])
241+ "LSL: Encountered error value for rhs address %s" , iaddr )
242+ return ([], [ll_assign ])
195243
196244 lhs = xd .vrd
197- rhs1 = xd .xrn
198- rhs2 = xd .xrm
199- rresult = xd .rresult
200- rdefs = xdata .reachingdefs
201245 defuses = xdata .defuses
202246 defuseshigh = xdata .defuseshigh
203247
204248 hl_lhs = XU .xvariable_to_ast_lval (lhs , xdata , iaddr , astree )
205- hl_rhs = XU .xxpr_to_ast_def_expr (rresult , xdata , iaddr , astree )
249+ hl_rhs = XU .xxpr_to_ast_def_expr (rhs , xdata , iaddr , astree )
206250
207251 hl_assign = astree .mk_assign (
208252 hl_lhs ,
@@ -216,8 +260,6 @@ def ast_prov(
216260 astree .add_expr_mapping (hl_rhs , ll_rhs )
217261 astree .add_lval_mapping (hl_lhs , ll_lhs )
218262 astree .add_expr_reachingdefs (ll_rhs , [rdefs [0 ], rdefs [1 ]])
219- astree .add_expr_reachingdefs (ll_rhs1 , [rdefs [0 ]])
220- astree .add_expr_reachingdefs (ll_rhs2 , [rdefs [1 ]])
221263 astree .add_expr_reachingdefs (hl_rhs , rdefs [2 :])
222264 astree .add_lval_defuses (hl_lhs , defuses [0 ])
223265 astree .add_lval_defuses_high (hl_lhs , defuseshigh [0 ])
0 commit comments