• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2018 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5
6"""Writes a Perf-formated json file with stats about the given cpp file."""
7
8
9import csv
10import json
11import os
12import re
13import subprocess
14import sys
15
16
17def main():
18  input_file = sys.argv[1]
19  out_dir = sys.argv[2]
20  keystr = sys.argv[3]
21  propstr = sys.argv[4]
22  bloaty_path = sys.argv[5]
23
24  results = {
25    'key': { },
26    'results': { }
27  }
28
29  props = propstr.split(' ')
30  for i in range(0, len(props), 2):
31    results[props[i]] = props[i+1]
32
33  keys = keystr.split(' ')
34  for i in range(0, len(keys), 2):
35    results['key'][keys[i]] = keys[i+1]
36
37  # Human "readable" overview as an FYI.
38  print ('Note that template instantiations are grouped together, '
39         'thus the elided types.')
40  print subprocess.check_output([bloaty_path, input_file,
41                                 '-d', 'sections,shortsymbols', '-n', '200'])
42  print ' '
43
44  sections = subprocess.check_output([bloaty_path, input_file, '-d',
45                                      'sections', '-n', '0', '--csv'])
46
47  name = os.path.basename(input_file)
48
49  r = {
50    # Use the default config as stats about the whole binary
51    'default' : {
52      'total_size_bytes': os.path.getsize(input_file)
53    },
54  }
55
56  # report section by section data. Sections are like .text, .data, etc.
57  for section_row in sections.strip().split('\n'):
58    # Follows schema sections,vmsize,filesize
59    parts = section_row.split(',')
60    if len(parts) < 3 or parts[0] == 'sections':
61      # If we see section, that's the table header
62      continue
63    section = parts[0]
64    # part[1] is "VM Size", part[2] is "File Size". From the bloaty docs:
65    # The "VM SIZE" column tells you how much space the binary will take
66    # when it is loaded into memory. The "FILE SIZE" column tells you about
67    # how much space the binary is taking on disk.
68    vmsize = parts[1]   # In bytes
69    filesize = parts[2] # In bytes
70    section = re.sub('[^0-9a-zA-Z_]', '_', section)
71    r['section'+section] = {
72      'in_file_size_bytes': int(filesize),
73      'vm_size_bytes': int(vmsize),
74    }
75
76
77  results['results'][name] = r
78
79  # Make debugging easier
80  print json.dumps(results, indent=2)
81
82  with open(os.path.join(out_dir, name+'.json'), 'w') as output:
83    output.write(json.dumps(results, indent=2))
84
85
86if '__main__' == __name__:
87  main()
88