|
25 | 25 | # SOFTWARE. |
26 | 26 | # ------------------------------------------------------------------------------ |
27 | 27 |
|
28 | | -from typing import List, TYPE_CHECKING |
| 28 | +from typing import List, Tuple, TYPE_CHECKING |
29 | 29 |
|
30 | 30 | from chb.app.InstrXData import InstrXData |
31 | 31 |
|
32 | 32 | from chb.arm.ARMDictionaryRecord import armregistry |
33 | 33 | from chb.arm.ARMOpcode import ARMOpcode, ARMOpcodeXData, simplify_result |
34 | 34 | from chb.arm.ARMOperand import ARMOperand |
35 | 35 |
|
| 36 | +import chb.ast.ASTNode as AST |
| 37 | +from chb.astinterface.ASTInterface import ASTInterface |
| 38 | + |
| 39 | +import chb.invariants.XXprUtil as XU |
| 40 | + |
36 | 41 | import chb.util.fileutil as UF |
37 | 42 | from chb.util.IndexedTable import IndexedTableValue |
38 | 43 | from chb.util.loggingutil import chklogger |
@@ -67,7 +72,7 @@ def result(self) -> "XXpr": |
67 | 72 |
|
68 | 73 | @property |
69 | 74 | def rresult(self) -> "XXpr": |
70 | | - return self.xpr(3, "result") |
| 75 | + return self.xpr(3, "rresult") |
71 | 76 |
|
72 | 77 | @property |
73 | 78 | def result_simplified(self) -> str: |
@@ -101,9 +106,78 @@ def __init__(self, d: "ARMDictionary", ixval: IndexedTableValue) -> None: |
101 | 106 | def operands(self) -> List[ARMOperand]: |
102 | 107 | return [self.armd.arm_operand(i) for i in self.args[1:]] |
103 | 108 |
|
| 109 | + @property |
| 110 | + def opargs(self) -> List[ARMOperand]: |
| 111 | + return [self.armd.arm_operand(i) for i in self.args[1:]] |
| 112 | + |
104 | 113 | def annotation(self, xdata: InstrXData) -> str: |
105 | 114 | xd = ARMMultiplyXData(xdata) |
106 | 115 | if xd.is_ok: |
107 | 116 | return xd.annotation |
108 | 117 | else: |
109 | 118 | return "Error value" |
| 119 | + |
| 120 | + def ast_prov( |
| 121 | + self, |
| 122 | + astree: ASTInterface, |
| 123 | + iaddr: str, |
| 124 | + bytestring: str, |
| 125 | + xdata: InstrXData) -> Tuple[ |
| 126 | + List[AST.ASTInstruction], List[AST.ASTInstruction]]: |
| 127 | + |
| 128 | + annotations: List[str] = [iaddr, "MUL"] |
| 129 | + |
| 130 | + # low-level assignment |
| 131 | + |
| 132 | + (ll_lhs, _, _) = self.opargs[0].ast_lvalue(astree) |
| 133 | + (ll_op1, _, _) = self.opargs[1].ast_rvalue(astree) |
| 134 | + (ll_op2, _, _) = self.opargs[2].ast_rvalue(astree) |
| 135 | + ll_rhs = astree.mk_binary_op("mult", ll_op1, ll_op2) |
| 136 | + |
| 137 | + ll_assign = astree.mk_assign( |
| 138 | + ll_lhs, |
| 139 | + ll_rhs, |
| 140 | + iaddr=iaddr, |
| 141 | + bytestring=bytestring, |
| 142 | + annotations=annotations) |
| 143 | + |
| 144 | + rdefs = xdata.reachingdefs |
| 145 | + |
| 146 | + astree.add_expr_reachingdefs(ll_op1, [rdefs[0]]) |
| 147 | + astree.add_expr_reachingdefs(ll_op2, [rdefs[1]]) |
| 148 | + |
| 149 | + # high-level assignment |
| 150 | + |
| 151 | + xd = ARMMultiplyXData(xdata) |
| 152 | + if not xd.is_ok: |
| 153 | + chklogger.logger.error("Error value encountered at %s", iaddr) |
| 154 | + return ([], []) |
| 155 | + |
| 156 | + lhs = xd.vrd |
| 157 | + rhs1 = xd.xrn |
| 158 | + rhs2 = xd.xrm |
| 159 | + rhs3 = xd.rresult |
| 160 | + |
| 161 | + defuses = xdata.defuses |
| 162 | + defuseshigh = xdata.defuseshigh |
| 163 | + |
| 164 | + hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree) |
| 165 | + hl_rhs = XU.xxpr_to_ast_def_expr(rhs3, xdata, iaddr, astree) |
| 166 | + |
| 167 | + hl_assign = astree.mk_assign( |
| 168 | + hl_lhs, |
| 169 | + hl_rhs, |
| 170 | + iaddr=iaddr, |
| 171 | + bytestring=bytestring, |
| 172 | + annotations=annotations) |
| 173 | + |
| 174 | + astree.add_instr_mapping(hl_assign, ll_assign) |
| 175 | + astree.add_instr_address(hl_assign, [iaddr]) |
| 176 | + astree.add_expr_mapping(hl_rhs, ll_rhs) |
| 177 | + astree.add_lval_mapping(hl_lhs, ll_lhs) |
| 178 | + astree.add_expr_reachingdefs(hl_rhs, rdefs[2:]) |
| 179 | + astree.add_expr_reachingdefs(ll_rhs, rdefs[:2]) |
| 180 | + astree.add_lval_defuses(hl_lhs, defuses[0]) |
| 181 | + astree.add_lval_defuses_high(hl_lhs, defuseshigh[0]) |
| 182 | + |
| 183 | + return ([hl_assign], [ll_assign]) |
0 commit comments