#!/usr/bin/env python
#===- lib/fuzzer/scripts/unbalanced_allocs.py ------------------------------===#
#
#                     The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
#===------------------------------------------------------------------------===#
#
# Post-process -trace_malloc=2 output and printout only allocations and frees
# unbalanced inside of fuzzer runs.
# Usage:
#   my_fuzzer -trace_malloc=2 -runs=10 2>&1 | unbalanced_allocs.py -skip=5
#
#===------------------------------------------------------------------------===#

import argparse
import sys

_skip = 0

def PrintStack(line, stack):
  global _skip
  if _skip > 0:
    return
  print 'Unbalanced ' + line.rstrip();
  for l in stack:
    print l.rstrip()

def ProcessStack(line, f):
  stack = []
  while line and line.startswith('    #'):
    stack += [line]
    line = f.readline()
  return line, stack

def ProcessFree(line, f, allocs):
  if not line.startswith('FREE['):
    return f.readline()

  addr = int(line.split()[1], 16)
  next_line, stack = ProcessStack(f.readline(), f)
  if addr in allocs:
    del allocs[addr]
  else:
    PrintStack(line, stack)
  return next_line

def ProcessMalloc(line, f, allocs):
  if not line.startswith('MALLOC['):
    return ProcessFree(line, f, allocs)

  addr = int(line.split()[1], 16)
  assert not addr in allocs

  next_line, stack = ProcessStack(f.readline(), f)
  allocs[addr] = (line, stack)
  return next_line

def ProcessRun(line, f):
  if not line.startswith('MallocFreeTracer: START'):
    return ProcessMalloc(line, f, {})

  allocs = {}
  print line.rstrip()
  line = f.readline()
  while line:
    if line.startswith('MallocFreeTracer: STOP'):
      global _skip
      _skip = _skip - 1
      for _, (l, s) in allocs.iteritems():
        PrintStack(l, s)
      print line.rstrip()
      return f.readline()
    line = ProcessMalloc(line, f, allocs)
  return line

def ProcessFile(f):
  line = f.readline()
  while line:
    line = ProcessRun(line, f);

def main(argv):
  parser = argparse.ArgumentParser()
  parser.add_argument('--skip', default=0, help='number of runs to ignore')
  args = parser.parse_args()
  global _skip
  _skip = int(args.skip) + 1
  ProcessFile(sys.stdin)

if __name__ == '__main__':
  main(sys.argv)
