def _ail_handle_Load(self, expr): addr = self._expr(expr.addr) if addr != expr.addr: return Expr.Load(expr.idx, addr, expr.size, expr.endness, **expr.tags) return expr
def _ail_handle_Load(self, expr: Expr.Load) -> Optional[PropValue]: self.state: 'PropagatorAILState' addr = self._expr(expr.addr) if self.state.is_top(addr.value): return PropValue.from_value_and_details( self.state.top(expr.size * self.arch.byte_width), expr.size, expr, self._codeloc() ) sp_offset = self.extract_offset_to_sp(addr.value) if sp_offset is not None: # Stack variable. var = self.state.load_stack_variable(sp_offset, expr.size, endness=expr.endness) if var is not None and not self.state.is_top(var.value): # We do not add replacements here since in AIL function and block simplifiers we explicitly forbid # replacing stack variables. # #if not self.is_using_outdated_def(var): # l.debug("Add a replacement: %s with %s", expr, var) # self.state.add_replacement(self._codeloc(), expr, var) return var addr_expr = addr.one_expr if addr_expr is not None and addr_expr is not expr.addr: new_expr = Expr.Load(expr.idx, addr_expr, expr.size, expr.endness, **expr.tags) else: new_expr = expr prop_value = PropValue.from_value_and_details( self.state.top(expr.size * self.arch.byte_width), expr.size, new_expr, self._codeloc() ) return prop_value
def _ail_handle_Load(self, expr: Expr.Load): self.state: 'PropagatorAILState' addr = self._expr(expr.addr) if self.state.is_top(addr): return self.state.top(expr.size * self.arch.byte_width) sp_offset = self.extract_offset_to_sp(addr) if sp_offset is not None: # Stack variable. var = self.state.get_stack_variable(sp_offset, expr.size, endness=expr.endness) if var is not None and not self.state.is_top(var): # We do not add replacements here since in AIL function and block simplifiers we explicitly forbid # replacing stack variables. # #if not self.is_using_outdated_def(var): # l.debug("Add a replacement: %s with %s", expr, var) # self.state.add_replacement(self._codeloc(), expr, var) return var if addr is not expr.addr: return Expr.Load(expr.idx, addr, expr.size, expr.endness, **expr.tags) return expr
def _ail_handle_Store(self, stmt): addr = self._expr(stmt.addr) data = self._expr(stmt.data) if isinstance(addr, Expr.StackBaseOffset): # Storing data to a stack variable self.state.store_variable( Expr.Load(None, addr, data.bits // 8, stmt.endness), data)
def _ail_handle_Load(self, expr): addr = self._expr(expr.addr) if isinstance(addr, Expr.StackBaseOffset): var = self.state.get_stack_variable(addr, expr.size, endness=expr.endness) if var is not None: return var if addr != expr.addr: return Expr.Load(expr.idx, addr, expr.size, expr.endness, **expr.tags) return expr
def _resolve_stack_argument(self, call_stmt, arg_loc): # pylint:disable=unused-argument size = arg_loc.size offset = arg_loc.stack_offset if self.project.arch.call_pushes_ret: # adjust the offset offset -= self.project.arch.bytes return Expr.Load(None, Expr.Register(None, None, self.project.arch.sp_offset, self.project.arch.bits) + Expr.Const(None, None, offset, self.project.arch.bits), size, self.project.arch.memory_endness, )
def _resolve_stack_argument(self, call_stmt, arg_loc) -> Tuple[Any, Any]: # pylint:disable=unused-argument size = arg_loc.size offset = arg_loc.stack_offset if self.project.arch.call_pushes_ret: # adjust the offset offset -= self.project.arch.bytes # TODO: Support extracting values return None, Expr.Load( self._atom_idx(), Expr.Register(self._atom_idx(), None, self.project.arch.sp_offset, self.project.arch.bits) + Expr.Const(self._atom_idx(), None, offset, self.project.arch.bits), size, self.project.arch.memory_endness, )
def _ail_handle_Load(self, expr: Expr.Load) -> Optional[PropValue]: self.state: 'PropagatorAILState' addr = self._expr(expr.addr) addr_expr = addr.one_expr if addr_expr is not None: sp_offset = self.extract_offset_to_sp(addr_expr) if sp_offset is not None: # Stack variable. var = self.state.load_stack_variable(sp_offset, expr.size, endness=expr.endness) if var is not None: # We do not add replacements here since in AIL function and block simplifiers we explicitly forbid # replacing stack variables, unless this is in the middle of a call statement. if self.state._inside_call_stmt: if var.one_expr is not None: if not self.is_using_outdated_def(var.one_expr, var.one_defat, avoid=expr.addr): l.debug("Add a replacement: %s with %s", expr, var.one_expr) self.state.add_replacement(self._codeloc(), expr, var.one_expr) else: # there isn't a single expression to replace with. remove the old replacement for this # expression if available. self.state.add_replacement(self._codeloc(), expr, self.state.top(expr.bits)) if not self.state.is_top(var.value): return var if addr_expr is not None and addr_expr is not expr.addr: new_expr = Expr.Load(expr.idx, addr_expr, expr.size, expr.endness, **expr.tags) else: new_expr = expr prop_value = PropValue.from_value_and_details( self.state.top(expr.size * self.arch.byte_width), expr.size, new_expr, self._codeloc() ) return prop_value