1 #!/usr/bin/env python 2 # 3 # Copyright 2016 the V8 project authors. All rights reserved. 4 # Redistribution and use in source and binary forms, with or without 5 # modification, are permitted provided that the following conditions are 6 # met: 7 # 8 # * Redistributions of source code must retain the above copyright 9 # notice, this list of conditions and the following disclaimer. 10 # * Redistributions in binary form must reproduce the above 11 # copyright notice, this list of conditions and the following 12 # disclaimer in the documentation and/or other materials provided 13 # with the distribution. 14 # * Neither the name of Google Inc. nor the names of its 15 # contributors may be used to endorse or promote products derived 16 # from this software without specific prior written permission. 17 # 18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 import os.path 31 import re 32 import subprocess 33 import sys 34 35 36 def get_address_bounds(): 37 start = -1 38 end = -1 39 for arg in sys.argv: 40 if arg.startswith("--start-address="): 41 start = int(arg[-12:], 16) 42 if arg.startswith("--stop-address="): 43 end = int(arg[-12:], 16) 44 return start, end 45 46 47 def format_line(line): 48 pieces = line.split(None, 3) 49 return " " + pieces[0][2:] + ":\t" + pieces[3] 50 51 52 def is_comment(line): 53 stripped = line.strip() 54 return stripped.startswith("--") or stripped.startswith(";;") 55 56 def main(): 57 filename = sys.argv[-1] 58 match = re.match(r"/tmp/perf-(.*)\.map", filename) 59 if match: 60 start, end = get_address_bounds() 61 process_codefile = "code-" + match.group(1) + "-1.asm" 62 if os.path.exists(process_codefile): 63 codefile = open(process_codefile, "r") 64 else: 65 codefile = open("code.asm", "r") 66 with codefile: 67 printing = False 68 for line in codefile: 69 if line.startswith("0x"): 70 addr = int(line.split()[0], 0) 71 if start <= addr <= end: 72 printing = True 73 sys.stdout.write(format_line(line)) 74 elif printing: 75 break 76 elif printing and not is_comment(line): 77 break 78 else: 79 sys.argv[0] = "objdump" 80 sys.exit(subprocess.call(sys.argv)) 81 82 if __name__ == "__main__": 83 main() 84