12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #!/usr/bin/env python
- import argparse
- import re
- import random
- import string
- def parse_memory_trace(input_file, output_file):
- active_memory_requests = {}
- malloc_pattern = re.compile(r'dmmlib - m (0x\w+) (\d+)')
- realloc_pattern = re.compile(r'dmmlib - r (0x\w+) (0x\w+) (\d+)')
- free_pattern = re.compile(r'dmmlib - f (0x\w+)')
- for line in input_file:
- malloc_match = malloc_pattern.search(line)
- if malloc_match:
- if malloc_match.group(1) not in active_memory_requests:
- active_memory_requests[malloc_match.group(1)] = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6))
- variable_declaration = ''.join([' void *var_', active_memory_requests[malloc_match.group(1)], ';\n'])
- output_file.write(variable_declaration)
- new_line = ''.join([' var_', active_memory_requests[malloc_match.group(1)], ' = malloc(', malloc_match.group(2), ');\n'])
- output_file.write(new_line)
- realloc_match = realloc_pattern.search(line)
- if realloc_match:
- if realloc_match.group(2) not in active_memory_requests:
- active_memory_requests[realloc_match.group(2)] = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6))
- variable_declaration = ''.join([' void *var_', active_memory_requests[realloc_match.group(2)], ';\n'])
- output_file.write(variable_declaration)
- new_line = ''.join([' var_', active_memory_requests[realloc_match.group(2)], ' = realloc(', realloc_match.group(1), ', ', realloc_match.group(3), ');\n'])
- output_file.write(new_line)
- free_match = free_pattern.search(line)
- if free_match:
- if free_match.group(1) in active_memory_requests:
- new_line = ''.join([' free(var_', active_memory_requests[free_match.group(1)], ');\n'])
- del active_memory_requests[free_match.group(1)]
- output_file.write(new_line)
- else:
- print "Warning: free call without an actual allocation beforehands"
- input_file.close()
- def main():
- parser = argparse.ArgumentParser(
- description='''Generate a C file of dynamic memory operations from a dmmlib
- trace''')
- parser.add_argument('tracefile', type=argparse.FileType('rt'),
- help='dmmlib trace from the application')
- parser.add_argument('-o', '--output', metavar='outputfile', type=argparse.FileType('wt'),
- help='generated C file, will use output.c if not available')
- try:
- args = parser.parse_args()
- except IOError, msg:
- parser.error(str(msg))
- if args.output is None:
- args.output = open('output.c', 'wt')
- template_file = open('benchmark_template.c', 'rt')
- for line in template_file:
- if line == '$instructions\n':
- parse_memory_trace(args.tracefile, args.output)
- else:
- args.output.write(line)
- args.output.close()
- if __name__ == "__main__":
- main()
|