blob: af189c53c3fea41b29d69b4b083ea80a9adf1c52 [file] [log] [blame]
Kevin Lubick6ca0d8a2018-10-09 13:31:33 -04001# 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()