示例#1
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)
示例#2
0
    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
示例#3
0
    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
示例#4
0
 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()))
示例#5
0
 def getDependencies(self):
     return regutil.splitRegister(self.name)