Skip to content

Commit 5eee4c7

Browse files
committed
ARM:LDR: restructure writeback
1 parent 3228411 commit 5eee4c7

File tree

4 files changed

+31
-46
lines changed

4 files changed

+31
-46
lines changed

chb/app/InstrXData.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,17 @@ def get_base_update_xpr(self) -> XXpr:
549549
"Unexpected error value in base-update expression")
550550
return self.xprdictionary.xpr(xbuval)
551551

552+
def get_base_update_cxpr(self) -> XXpr:
553+
cbutag = next(t for t in self.tags if t.startswith("cbu:"))
554+
cix = int(cbutag[4:])
555+
cbuval = self.args[cix]
556+
if cbuval == -2:
557+
chklogger.logger.info(
558+
"Base update c expression unavailable, fall back to expression")
559+
return self.get_base_update_xpr()
560+
else:
561+
return self.xprdictionary.xpr(cbuval)
562+
552563
def has_return_xpr(self) -> bool:
553564
return any(s.startswith("return:") for s in self.tags)
554565

chb/arm/ARMOpcode.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,11 +213,18 @@ def get_base_update_xpr(self) -> "XXpr":
213213
raise UF.CHBError(
214214
self.__class__.__name__ + " does not have writeback")
215215

216+
def get_base_update_cxpr(self) -> "XXpr":
217+
if self.is_writeback:
218+
return self.xdata.get_base_update_cxpr()
219+
else:
220+
raise UF.CHBError(
221+
self.__class__.__name__ + " does not have writeback")
222+
216223
def writeback_update(self) -> str:
217224
if self.xdata.has_base_update():
218225
vbu = self.get_base_update_var()
219-
xbu = self.get_base_update_xpr()
220-
return "; " + str(vbu) + " := " + str(xbu)
226+
xbu = self.get_base_update_cxpr()
227+
return "; wbu: " + str(vbu) + " := " + str(xbu)
221228
else:
222229
return ""
223230

chb/arm/opcodes/ARMBranch.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,17 @@ def is_cfcond_ok(self) -> bool:
137137

138138
@property
139139
def xtgt(self) -> "XXpr":
140-
index = 1 if self.is_unconditional else 4
141-
return self.xpr(index, "xtgt")
140+
if self.is_unconditional or (not self.has_branch_conditions()):
141+
return self.xpr(1, "xtgt")
142+
else:
143+
return self.xpr(4, "xtgt")
142144

143145
@property
144146
def is_xtgt_ok(self) -> bool:
145-
index = 1 if self.is_unconditional else 4
146-
return self.is_xpr_ok(index)
147+
if self.is_unconditional or (not self.has_branch_conditions()):
148+
return self.is_xpr_ok(1)
149+
else:
150+
return self.is_xpr_ok(4)
147151

148152
@property
149153
def annotation(self) -> str:
@@ -338,7 +342,7 @@ def default(condition: XXpr) -> AST.ASTExpr:
338342
condition = xd.txpr
339343
else:
340344
chklogger.logger.error(
341-
"Bxx: conditional branch without branch conditions "
345+
"Bcc: conditional branch without branch conditions "
342346
+ "at address %s", iaddr)
343347
hl_astcond = astree.mk_temp_lval_expression()
344348
return (hl_astcond, ll_astcond)

chb/arm/opcodes/ARMLoadRegister.py

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -322,43 +322,9 @@ def has_cast() -> bool:
322322
ll_assigns: List[AST.ASTInstruction] = [ll_assign, ll_addr_assign]
323323

324324
basereg = xd.get_base_update_var()
325-
newaddr = xd.get_base_update_xpr()
325+
newaddr = xd.get_base_update_cxpr()
326326
hl_addr_lhs = XU.xvariable_to_ast_lval(basereg, xdata, iaddr, astree)
327-
328-
hl_addr_lhs_type = hl_addr_lhs.ctype(astree.ctyper)
329-
if hl_addr_lhs_type is not None and len(xdata.ints) > 0:
330-
if hl_addr_lhs_type.is_pointer:
331-
addrtype = cast(AST.ASTTypPtr, hl_addr_lhs_type)
332-
tgttyp = addrtype.tgttyp
333-
tgttypsize = astree.type_size_in_bytes(tgttyp)
334-
if tgttypsize is not None:
335-
incr = xdata.ints[0]
336-
ptrincr = incr // tgttypsize
337-
hl_addr_rhs = astree.mk_binary_op(
338-
"plus",
339-
astree.mk_lval_expression(hl_addr_lhs),
340-
astree.mk_integer_constant(ptrincr))
341-
else:
342-
hl_addr_rhs = XU.xxpr_to_ast_def_expr(
343-
newaddr, xdata, iaddr, astree)
344-
chklogger.logger.warning(
345-
"LDR address adjustment not scaled due to missing "
346-
+ "size of pointer target type %s at address %s",
347-
str(tgttyp), iaddr)
348-
else:
349-
hl_addr_rhs = XU.xxpr_to_ast_def_expr(
350-
newaddr, xdata, iaddr, astree)
351-
chklogger.logger.warning(
352-
"LDR address adjustment not scaled due to unexpected "
353-
+ "address type: %s at address %s",
354-
str(hl_addr_lhs_type), iaddr)
355-
else:
356-
hl_addr_rhs = XU.xxpr_to_ast_def_expr(
357-
newaddr, xdata, iaddr, astree)
358-
chklogger.logger.warning(
359-
"LDR address adjustment not scaled due to lack of type "
360-
+ "information at address %s",
361-
iaddr)
327+
hl_addr_rhs = XU.xxpr_to_ast_def_expr(newaddr, xdata, iaddr, astree)
362328

363329
hl_addr_assign = astree.mk_assign(
364330
hl_addr_lhs,
@@ -368,9 +334,6 @@ def has_cast() -> bool:
368334
annotations=annotations)
369335
hl_assigns: List[AST.ASTInstruction] = [hl_assign, hl_addr_assign]
370336

371-
# Note: work-around for deficiency in def-use propagation
372-
astree.add_expose_instruction(hl_addr_assign.instrid)
373-
374337
astree.add_instr_mapping(hl_addr_assign, ll_addr_assign)
375338
astree.add_instr_address(hl_addr_assign, [iaddr])
376339
astree.add_expr_mapping(hl_addr_rhs, ll_addr_rhs)

0 commit comments

Comments
 (0)