Esempio n. 1
0
 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']))
Esempio n. 2
0
    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
Esempio n. 3
0
 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)
Esempio n. 4
0
    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
Esempio n. 5
0
def encode(depset):
    return ", ".join(regutil.joinRegisters(depset.reads)) + " -> " + ", ".join(regutil.joinRegisters(depset.writes))
Esempio n. 6
0
 def __str__(self):
     return 'DependencySet({0}, {1})'.format(regutil.joinRegisters(self.reads), regutil.joinRegisters(self.writes))
Esempio n. 7
0
 def signature(self):
     ins = regutil.joinRegisters(self.needed - set(['mem']))
     return ' @ ' + ', '.join(ins)
Esempio n. 8
0
 def signature(self):
     deps = self.inner.getDependencySet()
     loopvars = deps.writes & deps.reads
     loopvars -= set(['mem'])
     loopvars = regutil.joinRegisters(loopvars)
     return " @ loopvars: " + ", ".join(loopvars)
Esempio n. 9
0
 def __str__(self):
     return '#'+self.hint+':'+(','.join(regutil.joinRegisters(self.deps)))+'#'