Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion chb/app/CHVersion.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
chbversion: str = "0.3.0-20251012"
chbversion: str = "0.3.0-20251022"
2 changes: 1 addition & 1 deletion chb/arm/opcodes/ARMAdd.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def has_cast() -> bool:
defuses = xdata.defuses
defuseshigh = xdata.defuseshigh

hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree, rhs=rhs)

if str(lhs) == "PC":
chklogger.logger.info(
Expand Down
2 changes: 1 addition & 1 deletion chb/arm/opcodes/ARMArithmeticShiftRight.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ def ast_prov(
defuses = xdata.defuses
defuseshigh = xdata.defuseshigh

hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree, rhs=rhs)
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)

hl_assign = astree.mk_assign(
Expand Down
2 changes: 1 addition & 1 deletion chb/arm/opcodes/ARMLogicalShiftLeft.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ def ast_prov(
defuses = xdata.defuses
defuseshigh = xdata.defuseshigh

hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree, rhs=rhs)
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)

hl_assign = astree.mk_assign(
Expand Down
2 changes: 1 addition & 1 deletion chb/arm/opcodes/ARMLogicalShiftRight.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ def ast_prov(
defuses = xdata.defuses
defuseshigh = xdata.defuseshigh

hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree, rhs=rhs)
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)

hl_assign = astree.mk_assign(
Expand Down
2 changes: 1 addition & 1 deletion chb/arm/opcodes/ARMReverseSubtract.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ def ast_prov(
defuses = xdata.defuses
defuseshigh = xdata.defuseshigh

hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree, rhs=rhs)
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)

hl_assign = astree.mk_assign(
Expand Down
15 changes: 13 additions & 2 deletions chb/arm/opcodes/ARMStoreRegisterHalfword.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,19 @@ def is_cxaddr_ok(self) -> bool:
@property
def annotation(self) -> str:
wbu = self.writeback_update()
clhs = str(self.cvmem) if self.is_cvmem_ok else "None"
if self.is_cvmem_ok:
clhs = str(self.cvmem)
elif self.is_cxaddr_ok:
if self.cxaddr.is_addressof_var:
lhsvar = self.cxaddr.get_addressof_var
if lhsvar is not None:
clhs = str(lhsvar)
else:
clhs = "*(" + str(self.cxaddr) + ")"
else:
clhs = "*(" + str(self.cxaddr) + ")"
else:
clhs = "None"
crhs = str(self.cxrt) if self.is_cxrt_ok else "None"
assignc = "(C: " + clhs + " := " + crhs + ")"
if self.is_vmem_ok:
Expand All @@ -165,7 +177,6 @@ def annotation(self) -> str:
return self.add_instruction_condition(assignment + wbu)



@armregistry.register_tag("STRH", ARMOpcode)
class ARMStoreRegisterHalfword(ARMOpcode):
"""Stores the least significant halfword from a register into memory.
Expand Down
2 changes: 1 addition & 1 deletion chb/arm/opcodes/ARMSubtract.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ def ast_prov(
defuses = xdata.defuses
defuseshigh = xdata.defuseshigh

hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree, rhs=rhs)

# resulting expression is a stack address
if str(rhs1) == "SP" and xrhs.is_stack_address:
Expand Down
4 changes: 4 additions & 0 deletions chb/arm/opcodes/ARMTestEquivalence.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ def __init__(self, d: "ARMDictionary", ixval: IndexedTableValue) -> None:
def operands(self) -> List[ARMOperand]:
return [self.armd.arm_operand(i) for i in self.args]

@property
def opargs(self) -> List[ARMOperand]:
return [self.armd.arm_operand(i) for i in self.args]

def annotation(self, xdata: InstrXData) -> str:
xd = ARMTestEquivalenceXData(xdata)
if xd.is_ok:
Expand Down
90 changes: 85 additions & 5 deletions chb/ast/ASTNode.py
Original file line number Diff line number Diff line change
Expand Up @@ -494,24 +494,24 @@ def ctype(self, ctyper: "ASTCTyper") -> Optional["ASTTyp"]:
return ctyper.ctype_block_stmt(self)

def is_empty(self) -> bool:
return all(s.is_empty() for s in self.stmts)
return self.is_stmt_label or all(s.is_empty() for s in self.stmts)

def address_taken(self) -> Set[str]:
if self.is_empty():
if self.is_stmt_label or self.is_empty():
return set([])
else:
return self.stmts[0].address_taken().union(
*(s.address_taken() for s in self.stmts[1:]))

def variables_used(self) -> Set[str]:
if self.is_empty():
if self.is_stmt_label or self.is_empty():
return set([])
else:
return self.stmts[0].variables_used().union(
*(s.variables_used() for s in self.stmts[1:]))

def callees(self) -> Set[str]:
if self.is_empty():
if self.is_stmt_label or self.is_empty():
return set([])
else:
return self.stmts[0].callees().union(
Expand Down Expand Up @@ -749,6 +749,9 @@ def cases(self) -> "ASTStmt":
def merge_address(self) -> Optional[str]:
return self._mergeaddress

def variables_used(self) -> Set[str]:
return self.cases.variables_used().union(self.switchexpr.variables_used())

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_switch_stmt(self)

Expand All @@ -772,6 +775,9 @@ def __init__(self, locationid: int, tag: str) -> None:
def is_stmt_label(self) -> bool:
return True

def is_empty(self) -> bool:
return True

@property
def locationid(self) -> int:
return self._locationid
Expand Down Expand Up @@ -1003,7 +1009,8 @@ def address_taken(self) -> Set[str]:
return self.lhs.address_taken().union(self.rhs.address_taken())

def variables_used(self) -> Set[str]:
return self.lhs.variables_used().union(self.rhs.variables_used())
lhsvars = set([]) if self.lhs.is_variable else self.lhs.variables_used()
return self.rhs.variables_used().union(lhsvars)

def callees(self) -> Set[str]:
return set([])
Expand Down Expand Up @@ -1051,6 +1058,12 @@ def tgt(self) -> "ASTExpr":
def arguments(self) -> List["ASTExpr"]:
return self._args

def variables_used(self) -> Set[str]:
result: Set[str] = set([])
for arg in self.arguments:
result = result.union(arg.variables_used())
return result

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_call_instr(self)

Expand Down Expand Up @@ -1142,6 +1155,10 @@ def lvalid(self) -> int:
def lhost(self) -> "ASTLHost":
return self._lhost

@property
def is_constant_value_expression(self) -> bool:
return self.lhost.is_constant_value_expression

@property
def offset(self) -> "ASTOffset":
return self._offset
Expand Down Expand Up @@ -1204,6 +1221,14 @@ def is_variable(self) -> bool:
def is_global(self) -> bool:
return False

@property
def is_ssa(self) -> bool:
return False

@property
def is_constant_value_expression(self) -> bool:
return self.is_ssa

@abstractmethod
def transform(self, transformer: "ASTTransformer") -> "ASTLHost":
...
Expand All @@ -1226,12 +1251,14 @@ def __init__(
vtype: Optional["ASTTyp"],
parameter: Optional[int] = None,
globaladdress: Optional[int] = None,
ssa: bool = False,
vdescr: Optional[str] = None) -> None:
ASTNode.__init__(self, "varinfo")
self._vname = vname
self._vtype = vtype
self._parameter = parameter
self._globaladdress = globaladdress
self._ssa = ssa
self._vdescr = vdescr # describes what the variable holds

@property
Expand All @@ -1258,6 +1285,10 @@ def globaladdress(self) -> Optional[int]:
def is_global(self) -> bool:
return self.globaladdress is not None

@property
def is_ssa(self) -> bool:
return self._ssa

@property
def vdescr(self) -> Optional[str]:
return self._vdescr
Expand Down Expand Up @@ -1304,6 +1335,10 @@ def varinfo(self) -> "ASTVarInfo":
def is_global(self) -> bool:
return self.varinfo.is_global

@property
def is_ssa(self) -> bool:
return self.varinfo.is_ssa

@property
def vname(self) -> str:
return self.varinfo.vname
Expand Down Expand Up @@ -1625,6 +1660,10 @@ def is_integer_constant(self) -> bool:
def is_integer_constant_zero(self) -> bool:
return False

@property
def is_constant_value_expression(self) -> bool:
return False

@property
def is_global_address(self) -> bool:
return False
Expand Down Expand Up @@ -1692,6 +1731,10 @@ def __init__(self, exprid: int, tag: str) -> None:
def is_ast_constant(self) -> bool:
return True

@property
def is_constant_value_expression(self) -> bool:
return True

def use(self) -> List[str]:
return []

Expand Down Expand Up @@ -1886,6 +1929,10 @@ def is_ast_lval_expr(self) -> bool:
def lval(self) -> "ASTLval":
return self._lval

@property
def is_constant_value_expression(self) -> bool:
return self.lval.is_constant_value_expression

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_lval_expression(self)

Expand Down Expand Up @@ -1921,6 +1968,10 @@ def __init__(self, exprid: int, tgttyp: "ASTTyp") -> None:
def tgt_type(self) -> "ASTTyp":
return self._tgttyp

@property
def is_constant_value_expression(self) -> bool:
return True

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_sizeof_expression(self)

Expand Down Expand Up @@ -1956,6 +2007,10 @@ def cast_tgt_type(self) -> "ASTTyp":
def cast_expr(self) -> "ASTExpr":
return self._exp

@property
def is_constant_value_expression(self) -> bool:
return self.cast_expr.is_constant_value_expression

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_cast_expression(self)

Expand Down Expand Up @@ -2002,6 +2057,10 @@ def op(self) -> str:
def exp1(self) -> "ASTExpr":
return self._exp

@property
def is_constant_value_expression(self) -> bool:
return self.exp1.is_constant_value_expression

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_unary_expression(self)

Expand Down Expand Up @@ -2058,6 +2117,12 @@ def exp1(self) -> "ASTExpr":
def exp2(self) -> "ASTExpr":
return self._exp2

@property
def is_constant_value_expression(self) -> bool:
return (
self.exp1.is_constant_value_expression
and self.exp2.is_constant_value_expression)

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_binary_expression(self)

Expand Down Expand Up @@ -2119,6 +2184,13 @@ def exp2(self) -> "ASTExpr":
def exp3(self) -> "ASTExpr":
return self._exp3

@property
def is_constant_value_expression(self) -> bool:
return (
self.exp1.is_constant_value_expression
and self.exp2.is_constant_value_expression
and self.exp3.is_constant_value_expression)

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_question_expression(self)

Expand Down Expand Up @@ -2164,6 +2236,10 @@ def is_ast_addressof(self) -> bool:
def lval(self) -> "ASTLval":
return self._lval

@property
def is_constant_value_expression(self) -> bool:
return True

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_address_of_expression(self)

Expand Down Expand Up @@ -2203,6 +2279,10 @@ def is_ast_startof(self) -> bool:
def lval(self) -> "ASTLval":
return self._lval

@property
def is_constant_value_expression(self) -> bool:
return True

def accept(self, visitor: "ASTVisitor") -> None:
visitor.visit_start_of_expression(self)

Expand Down
4 changes: 4 additions & 0 deletions chb/ast/ASTSymbolTable.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ def add_symbol(
vtype: Optional[AST.ASTTyp] = None,
parameter: Optional[int] = None,
globaladdress: Optional[int] = None,
ssa: bool = False,
llref: bool = False,
vdescr: Optional[str] = None) -> AST.ASTVarInfo:

Expand Down Expand Up @@ -104,6 +105,7 @@ def add_symbol(
vtype=vtype,
parameter=parameter,
globaladdress=globaladdress,
ssa=ssa,
vdescr=vdescr)
self._table[vname] = varinfo
return varinfo
Expand Down Expand Up @@ -257,6 +259,7 @@ def add_symbol(
vtype: Optional[AST.ASTTyp] = None,
parameter: Optional[int] = None,
globaladdress: Optional[int] = None,
ssa: bool = False,
llref: bool = False,
vdescr: Optional[str] = None) -> AST.ASTVarInfo:
if parameter is not None:
Expand All @@ -266,6 +269,7 @@ def add_symbol(
vname,
vtype=vtype,
globaladdress=globaladdress,
ssa=ssa,
vdescr=vdescr)
if globaladdress is not None:
self._symbolicnames[vinfo.vname] = vinfo
Expand Down
2 changes: 2 additions & 0 deletions chb/ast/AbstractSyntaxTree.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,12 +204,14 @@ def add_symbol(
vtype: Optional[AST.ASTTyp] = None,
parameter: Optional[int] = None,
globaladdress: Optional[int] = None,
ssa: bool = False,
vdescr: Optional[str] = None) -> AST.ASTVarInfo:
return self.symboltable.add_symbol(
name,
vtype=vtype,
parameter=parameter,
globaladdress=globaladdress,
ssa=ssa,
vdescr=vdescr)

def add_compinfo(self, cinfo: AST.ASTCompInfo) -> None:
Expand Down
Loading