-rwxr-xr-x 1265 djbsort-20180710/verif/unroll
#!/usr/bin/env python2
import sys
import angr
symbol = sys.argv[1]
n = int(sys.argv[2])
executable = sys.argv[3]
proj = angr.Project(executable)
state = proj.factory.full_init_state()
xaddr = proj.loader.find_symbol(symbol).rebased_addr
for i in range(n):
  state.mem[xaddr + 4 * i].int = state.solver.BVS('in%d' % i,32)
simgr = proj.factory.simgr(state)
simgr.run()
exits = simgr.deadended
assert len(exits) == 1
walked = dict()
walknext = 0
def informat(x):
  if x.startswith('in'):
    y = x[2:].split('_')
    x = 'in_%s_%s' % (y[0],y[2])
  return x
def walk(t):
  global walknext
  if t in walked: return walked[t]
  if t.op == 'BVV':
    walknext += 1
    print 'v%d = %d' % (walknext,t.args[0])
  elif t.op == 'BVS':
    walknext += 1
    print 'v%d = %s' % (walknext,informat(t.args[0]))
  elif t.op == 'Extract':
    assert len(t.args) == 3
    input = 'v%d' % walk(t.args[2])
    walknext += 1
    print 'v%d = Extract(%s,%d,%d)' % (walknext,input,t.args[0],t.args[1])
  else:
    inputs = ['v%d' % walk(a) for a in t.args]
    walknext += 1
    print 'v%d = %s(%s)' % (walknext,t.op,','.join(inputs))
  walked[t] = walknext
  return walknext
for i in range(n):
  x = exits[0].mem[xaddr + 4 * i].int.resolved
  print 'out%d = v%s' % (i,walk(x))