Allow to specific maturities at a instruction simplification rule level

This commit is contained in:
Boris Batteux
2021-02-25 16:33:56 +01:00
parent a57a48800f
commit 68c9473608
2 changed files with 10 additions and 4 deletions

View File

@@ -3,6 +3,7 @@ import os
from d810.ast import minsn_to_ast
from d810.hexrays_formatters import format_minsn_t, format_mop_t, maturity_to_string
from d810.optimizers.handler import DEFAULT_INSTRUCTION_MATURITIES
from d810.optimizers.instructions.analysis.handler import InstructionAnalysisRule
from d810.optimizers.instructions.analysis.utils import get_possible_patterns
@@ -12,6 +13,7 @@ class ExampleGuessingRule(InstructionAnalysisRule):
def __init__(self):
super().__init__()
self.maturities = DEFAULT_INSTRUCTION_MATURITIES
self.cur_maturity = None
self.min_nb_var = 1
self.max_nb_var = 3

View File

@@ -3,7 +3,7 @@ import logging
from typing import List
from ida_hexrays import *
from d810.optimizers.handler import OptimizationRule, DEFAULT_INSTRUCTION_MATURITIES
from d810.optimizers.handler import OptimizationRule
from d810.hexrays_formatters import format_minsn_t
from d810.ast import minsn_to_ast, AstNode
from d810.errors import D810Exception
@@ -16,7 +16,7 @@ optimizer_logger = logging.getLogger('D810.optimizer')
class InstructionOptimizationRule(OptimizationRule):
def __init__(self):
super().__init__()
self.maturities = DEFAULT_INSTRUCTION_MATURITIES
self.maturities = []
def check_and_replace(self, blk, ins):
return None
@@ -97,6 +97,8 @@ class InstructionOptimizer(object):
if not is_valid_rule_class:
return False
optimizer_logger.debug("Adding rule {0}".format(rule))
if len(rule.maturities) == 0:
rule.maturities = self.maturities
self.rules.add(rule)
self.rules_usage_info[rule.name] = 0
return True
@@ -114,9 +116,11 @@ class InstructionOptimizer(object):
def get_optimized_instruction(self, blk: mblock_t, ins: minsn_t):
if blk is not None:
self.cur_maturity = blk.mba.maturity
if self.cur_maturity not in self.maturities:
return None
# if self.cur_maturity not in self.maturities:
# return None
for rule in self.rules:
if self.cur_maturity not in rule.maturities:
continue
try:
new_ins = rule.check_and_replace(blk, ins)
if new_ins is not None: