Skip to content

Commit 6c63031

Browse files
committed
ARM: add error handling for STRD
1 parent 34c0153 commit 6c63031

File tree

2 files changed

+53
-21
lines changed

2 files changed

+53
-21
lines changed

chb/app/CHVersion.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
chbversion: str = "0.3.0-20250313"
1+
chbversion: str = "0.3.0-20250314"

chb/arm/opcodes/ARMStoreRegisterDual.py

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
if 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

Comments
 (0)