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
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))