def testDependencies(self): q = instruction.LoadInstruction('LD', placeholders.HL, operand.Constant(0xFFFF)) a = instruction.LoadInstruction('LD', placeholders.A, operand.Constant(1)) b = instruction.LoadInstruction('LD', placeholders.deref_HL, placeholders.A) c = instruction.LoadInstruction('LD', placeholders.B, placeholders.deref_HL) deps = set() deps = c.getDependencies(deps) self.assertEquals(regutil.joinRegisters(deps), set(['mem', 'HL'])) deps = b.getDependencies(deps) self.assertEquals(regutil.joinRegisters(deps), set(['mem', 'HL', 'A'])) deps = a.getDependencies(deps) self.assertEquals(regutil.joinRegisters(deps), set(['mem', 'HL'])) deps = q.getDependencies(deps) self.assertEquals(regutil.joinRegisters(deps), set(['mem']))
def optimizedWithContext(self, ctx): self.target = self.target.optimizedWithContext(ctx) if hasattr(self.target, 'getAddress'): self.targetAddr = self.target.getAddress() else: self.targetAddr = address.fromVirtualAndCurrent(self.target.value, self.addr) deps = self.getDependencySet() ins = regutil.joinRegisters(deps.reads - set(['mem'])) for param in ins: if ctx.hasConstantValue(param): self.constant_params[param] = ctx.getValue(param) for w in deps.writes: ctx.setValueComplex(w) # TODO: XXX if self.targetAddr.virtual() == 0x07B9: if 'A' in self.constant_params: ctx.setValue('ROMBANK', self.constant_params['A']) return self
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 signature(self): x = '' if not self.cond.alwaysTrue(): x = 'CONDITIONAL' ins = regutil.joinRegisters(self.getDependencySet().reads - set(['mem'])) outs = regutil.joinRegisters(self.returns_used - set(['mem'])) ins |= set(param+'='+str(self.constant_params[param]) for param in self.constant_params) ins = ', '.join(ins) outs = ', '.join(outs) if ins: ins = ' @ (' + ins + ')' if not outs: outs = 'void' return x + ins + ' -> ' + outs
def encode(depset): return ", ".join(regutil.joinRegisters(depset.reads)) + " -> " + ", ".join(regutil.joinRegisters(depset.writes))
def __str__(self): return 'DependencySet({0}, {1})'.format(regutil.joinRegisters(self.reads), regutil.joinRegisters(self.writes))
def signature(self): ins = regutil.joinRegisters(self.needed - set(['mem'])) return ' @ ' + ', '.join(ins)
def signature(self): deps = self.inner.getDependencySet() loopvars = deps.writes & deps.reads loopvars -= set(['mem']) loopvars = regutil.joinRegisters(loopvars) return " @ loopvars: " + ", ".join(loopvars)
def __str__(self): return '#'+self.hint+':'+(','.join(regutil.joinRegisters(self.deps)))+'#'