def getDependencySet(self): deps = database.procInfo(self.targetAddr).depset reads = set(deps.reads) for r in regutil.joinRegisters(reads): if r in self.constant_params: reads -= regutil.splitRegister(r) return depend.DependencySet(reads, deps.writes)
def splitToSimple(self): if 'sideeffects' in self._writes: return [self] writes = set(self._writes) - set(['mem']) out = [] for w in self._loads: name = w[0] value = w[1] if name.startswith('[') and name.endswith(']'): target = operand.Dereference(operand.Register(name[1:-1])) writes -= set([name]) else: target = operand.Register(name) writes -= regutil.splitRegister(name) instr = LoadInstruction('LD_'+self.name, target, value, self.addr) out.append(instr) for w in writes: value = operand.ComplexValue(self.name, self.getDependencySet().reads) if w.startswith('[') and w.endswith(']'): target = operand.Dereference(operand.Register(w[1:-1])) else: target = operand.Register(w) instr = LoadInstruction('LD_'+self.name, target, value, self.addr) out.append(instr) return out
def filled(self, params, ctx): reads = set() writes = set() values = dict() loads = [] for x in self.reads: if x.startswith("#"): assert(len(x) == 2) value = params[x[1]] operand = placeholders.get(x[1], value) if hasattr(operand, 'target'): reads.add('mem') reads |= regutil.splitRegister('HL') # TODO: XXX: bad else: reads |= regutil.splitRegister(operand.name) else: reads |= regutil.splitRegister(x) for x in self.writes: if x.startswith("#"): assert(len(x) == 2) value = params[x[1]] operand = placeholders.get(x[1], value) if hasattr(operand, 'target'): name = '['+operand.target.name+']' writes.add('mem') reads |= regutil.splitRegister('HL') # TODO: XXX: bad else: name = operand.name writes |= regutil.splitRegister(name) if x in self.values: e = expression.parse(self.values[x]) values[name] = e.optimizedWithContext(ctx) loads.append((name, values[name])) else: writes |= regutil.splitRegister(x) if x in self.values: e = expression.parse(self.values[x]) values[x] = e.optimizedWithContext(ctx) loads.append((x, values[x])) #values = dict() # TODO: XXX: #loads = [] return reads, writes, values, loads
def testDepend(self): self.assertFalse('A' in operand.Constant(1).getDependencies()) self.assertFalse('B' in operand.LabelAddress(address.fromVirtual(1)).getDependencies()) self.assertTrue('A' in placeholders.A.getDependencies()) self.assertFalse('A' in placeholders.BC.getDependencies()) self.assertTrue(regutil.splitRegister('HL') <= regutil.splitRegisters(placeholders.deref_HL.getDependencies()))
def getDependencies(self): return regutil.splitRegister(self.name)