#!/usr/bin/env python # ===-- objdump -----------------------------------------------------------===## # # The KLEE Symbolic Virtual Machine # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # # ===----------------------------------------------------------------------===## """ An objdump wrapper for use with klee & kcachegrind. This allows klee to output instruction level statistic information which kcachegrind can then display by intercepting kcachegrind's calls to objdump and returning the LLVM instructions in a format that it can parse. """ from __future__ import print_function import os import sys kActualObjdump = os.path.join(os.path.dirname(__file__), 'objdump.actual') if not os.path.exists(kActualObjdump): for path in ['/usr/bin', '/usr/local/bin']: p = os.path.join(path, 'objdump') if os.path.exists(p): kActualObjdump = p def fake_objdump_output(file, start, end): print('Using fake objdump output:\n\n') lines = open(file).readlines() for i in range(max(0, start - 1), min(end - 1, len(lines))): print('%x:\t00 00\t%s' % (i + 1, lines[i])) def main(args): # exact pattern match kcachegrind's calling sequence if (len(args) >= 6 and args[1] == '-C' and args[2] == '-d' and args[3].startswith('--start-address=') and args[4].startswith('--stop-address=') and args[5].endswith('.ll')): fake_objdump_output(args[5], eval(args[3].split('=', 1)[1]), eval(args[4].split('=', 1)[1])) else: os.execv(kActualObjdump, args) raise RuntimeError if __name__ == '__main__': main(sys.argv)