Ejemplo n.º 1
0
def load_trace(infile, start=0, num=1, quiet=False):
    if not quiet: print "Loading trace into memory..."
    trace = iferretpy.load_trace(infile, start, num)

    if not quiet: print "Finding output buffers"
    out_idx = first(lambda i: trace[i].op == 'IFLO_LABEL_OUTPUT', (i for i in range(len(trace)-1, -1, -1)))
    out_op = trace[out_idx]
    outbufs = memrange(out_op.args[0], out_op.args[1])

    if not quiet: print "Finding input buffers"
    inbufs = []
    in_insns = [(i,ins) for i, ins in enumerate(trace[:100]) if ins.op == 'IFLO_LABEL_INPUT']
    for i, ins in in_insns:
        inbufs += memrange(ins.args[0], ins.args[1])
    in_idx = max((i for i,_ in in_insns))
    if not quiet: print "Found input at %s, output at %d" % (", ".join(str(i) for i,_ in in_insns), out_idx)

    # Set up the inputs
    #set_input(trace, inbufs)
    if len(in_insns) > 1 or in_insns[0][1].args[0] != 0:
        for i, (_, ins) in enumerate(in_insns):
            set_input(trace, ins.args[0], i)
    
    del trace[out_idx:]
    del trace[:in_idx+1]

    return trace, inbufs, outbufs
Ejemplo n.º 2
0
    trace = get_insns(infile)

    # TODO: both output and input should probably not be thrown into
    # the same big buffer; instead we should do something like
    #   outbufs[label] = memrange(...)
    # This would allow us to handle multiple ins/outs

    # Find the outputs
    outbufs = []
    output_insns = []
    last_op, last_args = trace.pop()
    while last_op != 'IFLO_LABEL_OUTPUT':
        last_op, last_args = trace.pop()
    while last_op == 'IFLO_LABEL_OUTPUT':
        outbufs += memrange(last_args[0], last_args[1])
        output_insns.append((last_op, last_args))
        last_op, last_args = trace.pop()
    trace.append((last_op, last_args))

    # Find the inputs
    inbufs = []
    input_insns = []
    last_op, last_args = trace.pop(0)
    while last_op != 'IFLO_LABEL_INPUT':
        last_op, last_args = trace.pop(0)
    while last_op == 'IFLO_LABEL_INPUT':
        inbufs += memrange(last_args[0], last_args[1])
        input_insns.append((last_op, last_args))
        last_op, last_args = trace.pop(0)
    trace.insert(0, (last_op, last_args))
Ejemplo n.º 3
0
    trace = get_insns(infile)

    # TODO: both output and input should probably not be thrown into
    # the same big buffer; instead we should do something like
    #   outbufs[label] = memrange(...)
    # This would allow us to handle multiple ins/outs

    # Find the outputs
    outbufs = []
    output_insns = []
    last_op, last_args = trace.pop()
    while last_op != 'IFLO_LABEL_OUTPUT':
        last_op, last_args = trace.pop()
    while last_op == 'IFLO_LABEL_OUTPUT':
        outbufs += memrange(last_args[0], last_args[1])
        output_insns.append((last_op, last_args))
        last_op, last_args = trace.pop()
    trace.append((last_op, last_args))

    # Find the inputs
    inbufs = []
    input_insns = []
    last_op, last_args = trace.pop(0)
    while last_op != 'IFLO_LABEL_INPUT':
        last_op, last_args = trace.pop(0)
    while last_op == 'IFLO_LABEL_INPUT':
        inbufs += memrange(last_args[0], last_args[1])
        input_insns.append((last_op, last_args))
        last_op, last_args = trace.pop(0)
    trace.insert(0, (last_op, last_args))