4848if TYPE_CHECKING :
4949 from chb .arm .ARMDictionary import ARMDictionary
5050 from chb .invariants .VarInvariantFact import ReachingDefFact
51+ from chb .invariants .VAssemblyVariable import VMemoryVariable
5152 from chb .invariants .XVariable import XVariable
5253 from chb .invariants .XXpr import XXpr
5354
@@ -62,12 +63,12 @@ def vmem1(self) -> "XVariable":
6263 return self .var (0 , "vmem1" )
6364
6465 @property
65- def vmem2 (self ) -> "XVariable" :
66- return self .var ( 1 , "vmem2" )
66+ def is_vmem_known (self ) -> bool :
67+ return self .xdata . vars_r [ 0 ] is not None
6768
6869 @property
69- def vrn (self ) -> "XVariable" :
70- return self .var (2 , "vrn " )
70+ def vmem2 (self ) -> "XVariable" :
71+ return self .var (1 , "vmem2 " )
7172
7273 @property
7374 def xrn (self ) -> "XXpr" :
@@ -101,17 +102,30 @@ def xaddr1(self) -> "XXpr":
101102 def xaddr2 (self ) -> "XXpr" :
102103 return self .xpr (7 , "xaddr2" )
103104
105+ @property
106+ def is_xaddr_known (self ) -> bool :
107+ return self .xdata .xprs_r [6 ] is not None
108+
104109 @property
105110 def xaddr_updated (self ) -> "XXpr" :
106111 return self .xpr (8 , "xaddr_updated" )
107112
108113 @property
109114 def annotation (self ) -> str :
110- assignment = (
111- str (self .vmem1 ) + " := " + str (self .xxrt ) + "; "
112- + str (self .vmem2 ) + " := " + str (self .xxrt2 ))
113115 wbu = self .writeback_update ()
114- return self .add_instruction_condition (assignment + wbu )
116+ rhs1 = self .xxrt
117+ rhs2 = self .xxrt2
118+ if self .is_ok or self .is_vmem_known :
119+ assign1 = str (self .vmem1 ) + " := " + str (rhs1 )
120+ assign2 = str (self .vmem2 ) + " := " + str (rhs2 )
121+ assigns = assign1 + "; " + assign2
122+ elif self .is_xaddr_known :
123+ assign1 = "*(" + str (self .xaddr1 ) + ") := " + str (rhs1 )
124+ assign2 = "*(" + str (self .xaddr2 ) + ") := " + str (rhs2 )
125+ assigns = assign1 + "; " + assign2
126+ else :
127+ assigns = "Error in vmem and xaddr"
128+ return self .add_instruction_condition (assigns + wbu )
115129
116130
117131@armregistry .register_tag ("STRD" , ARMOpcode )
@@ -194,10 +208,7 @@ def register_spills(self, xdata: InstrXData) -> List[str]:
194208
195209 def annotation (self , xdata : InstrXData ) -> str :
196210 xd = ARMStoreRegisterDualXData (xdata )
197- if xd .is_ok :
198- return xd .annotation
199- else :
200- return "Error value"
211+ return xd .annotation
201212
202213 def assembly_ast (
203214 self ,
@@ -250,27 +261,39 @@ def ast_prov(
250261 bytestring = bytestring ,
251262 annotations = annotations )
252263
253- if not xd .is_ok :
264+ # high-level assignments
265+
266+ if xd .is_ok or xd .is_vmem_known :
267+ lhs1 = xd .vmem1
268+ lhs2 = xd .vmem2
269+ memaddr1 = xd .xaddr1
270+ memaddr2 = xd .xaddr2
271+ hl_lhs1 = XU .xvariable_to_ast_lval (lhs1 , xdata , iaddr , astree )
272+ hl_lhs2 = XU .xvariable_to_ast_lval (lhs2 , xdata , iaddr , astree )
273+
274+ elif xd .is_xaddr_known :
275+ memaddr1 = xd .xaddr1
276+ memaddr2 = xd .xaddr2
277+ hl_lhs1 = XU .xmemory_dereference_lval (memaddr1 , xdata , iaddr , astree )
278+ hl_lhs2 = XU .xmemory_dereference_lval (memaddr2 , xdata , iaddr , astree )
279+
280+ else :
254281 chklogger .logger .error (
255- "Error value encountered at address %s" , iaddr )
282+ "STRD: LHS lval and address both have error values: skipping "
283+ + "store-dual instruction at address %s" ,
284+ iaddr )
256285 return ([], [])
257286
258- # high-level assignments
259287 rdefs = xdata .reachingdefs
260288 deful = xdata .defuses
261289 defuh = xdata .defuseshigh
262290
263- lhs1 = xd .vmem1
264- lhs2 = xd .vmem2
265291 rhs1 = xd .xxrt
266292 rhs2 = xd .xxrt2
267293
268294 hl_rhs1 = XU .xxpr_to_ast_def_expr (rhs1 , xdata , iaddr , astree )
269295 hl_rhs2 = XU .xxpr_to_ast_def_expr (rhs2 , xdata , iaddr , astree )
270296
271- hl_lhs1 = XU .xvariable_to_ast_lval (lhs1 , xdata , iaddr , astree )
272- hl_lhs2 = XU .xvariable_to_ast_lval (lhs2 , xdata , iaddr , astree )
273-
274297 hl_assign1 = astree .mk_assign (
275298 hl_lhs1 ,
276299 hl_rhs1 ,
@@ -284,6 +307,15 @@ def ast_prov(
284307 bytestring = bytestring ,
285308 annotations = annotations )
286309
310+ if (
311+ (not xd .is_vmem_known )
312+ or (lhs1 .is_memory_variable
313+ and cast ("VMemoryVariable" , lhs1 .denotation ).base .is_basevar )
314+ or hl_lhs1 .offset .is_index_offset
315+ or hl_lhs1 .offset .is_field_offset ):
316+ astree .add_expose_instruction (hl_assign1 .instrid )
317+ astree .add_expose_instruction (hl_assign2 .instrid )
318+
287319 # TODO: add writeback update
288320
289321 astree .add_instr_mapping (hl_assign1 , ll_assign1 )
0 commit comments