Beispiel #1
0
 def __init__(self, addr, branches, arg=None, base_value=0):
     self.name = 'switch-highlevel'
     if not arg:
         self.arg = placeholders.A
     else:
         self.arg = arg
     self.addr = addr
     self.branches = branches
     self.jtAddr = JumpTableAddress(addr.offset(1))
     self.base_value = base_value
Beispiel #2
0
 def __init__(self, addr, branches, arg=None, base_value=0):
     self.name = "switch-highlevel"
     if not arg:
         self.arg = placeholders.A
     else:
         self.arg = arg
     self.addr = addr
     self.branches = branches
     self.jtAddr = JumpTableAddress(addr.offset(1))
     self.base_value = base_value
Beispiel #3
0
class Switch(Instruction):
    def __init__(self, addr, branches, arg=None, base_value=0):
        self.name = "switch-highlevel"
        if not arg:
            self.arg = placeholders.A
        else:
            self.arg = arg
        self.addr = addr
        self.branches = branches
        self.jtAddr = JumpTableAddress(addr.offset(1))
        self.base_value = base_value

    def valueForBranch(self, i):
        return Constant(self.base_value + i)

    def render(self, renderer):
        renderer.newInstruction(self.addr)
        renderer.instructionName("switch")
        renderer.add(" (")
        self.arg.render(renderer)
        renderer.add(", ")
        self.jtAddr.render(renderer)
        renderer.add(") {")

        for (i, b) in enumerate(self.branches):
            renderer.newInstruction(self.addr)
            renderer.instructionName("case")
            renderer.add(" ")
            self.valueForBranch(i).render(renderer)
            renderer.add(":")
            with renderer.indent():
                b.render(renderer)

        renderer.newInstruction(self.addr)
        renderer.add("}")

    def getInstructions(self, out):
        for b in self.branches:
            b.getInstructions(out)
        out.add(self)

    def optimizedWithContext(self, ctx):
        arg = self.arg.optimizedWithContext(ctx)

        base_value = self.base_value

        from . import operator

        if isinstance(arg, operator.Sub) and arg.right.value is not None:
            base_value += arg.right.value
            arg = arg.left

        branches = [b.optimizedWithContext(ctx.clone()) for b in self.branches]
        for b in self.branches:
            for w in b.getDependencySet().writes:
                ctx.setValueComplex(w)
        return Switch(self.addr, branches, arg, base_value)

    def getDependencies(self, needed):
        deps = self.arg.getDependencies()
        for b in self.branches:
            deps |= b.getDependencies(needed)
        return deps

    def getDependencySet(self):
        deps = DependencySet()
        for b in self.branches:
            deps = dependParallel(b.getDependencySet(), deps)
        return DependencySet(deps.reads | self.arg.getDependencies(), deps.writes)

    def optimizeDependencies(self, needed):
        branches = [b.optimizeDependencies(needed) for b in self.branches]
        return Switch(self.addr, branches, self.arg, self.base_value)
Beispiel #4
0
class Switch(Instruction):
    def __init__(self, addr, branches, arg=None, base_value=0):
        self.name = 'switch-highlevel'
        if not arg:
            self.arg = placeholders.A
        else:
            self.arg = arg
        self.addr = addr
        self.branches = branches
        self.jtAddr = JumpTableAddress(addr.offset(1))
        self.base_value = base_value

    def valueForBranch(self, i):
        return Constant(self.base_value + i)

    def render(self, renderer):
        renderer.newInstruction(self.addr)
        renderer.instructionName('switch')
        renderer.add(' (')
        self.arg.render(renderer)
        renderer.add(', ')
        self.jtAddr.render(renderer)
        renderer.add(') {')

        for (i, b) in enumerate(self.branches):
            renderer.newInstruction(self.addr)
            renderer.instructionName('case')
            renderer.add(' ')
            self.valueForBranch(i).render(renderer)
            renderer.add(':')
            with renderer.indent():
                b.render(renderer)

        renderer.newInstruction(self.addr)
        renderer.add('}')

    def getInstructions(self, out):
        for b in self.branches:
            b.getInstructions(out)
        out.add(self)

    def optimizedWithContext(self, ctx):
        arg = self.arg.optimizedWithContext(ctx)

        base_value = self.base_value

        from . import operator
        if isinstance(arg, operator.Sub) and arg.right.value is not None:
            base_value += arg.right.value
            arg = arg.left

        branches = [b.optimizedWithContext(ctx.clone()) for b in self.branches]
        for b in self.branches:
            for w in b.getDependencySet().writes:
                ctx.setValueComplex(w)
        return Switch(self.addr, branches, arg, base_value)

    def getDependencies(self, needed):
        deps = self.arg.getDependencies()
        for b in self.branches:
            deps |= b.getDependencies(needed)
        return deps

    def getDependencySet(self):
        deps = DependencySet()
        for b in self.branches:
            deps = dependParallel(b.getDependencySet(), deps)
        return DependencySet(deps.reads | self.arg.getDependencies(),
                             deps.writes)

    def optimizeDependencies(self, needed):
        branches = [b.optimizeDependencies(needed) for b in self.branches]
        return Switch(self.addr, branches, self.arg, self.base_value)