| # Copyright 2018 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| |
| """Writes a Perf-formated json file with stats about the given cpp file.""" |
| |
| |
| import csv |
| import json |
| import os |
| import re |
| import subprocess |
| import sys |
| |
| |
| def main(): |
| input_file = sys.argv[1] |
| out_dir = sys.argv[2] |
| keystr = sys.argv[3] |
| propstr = sys.argv[4] |
| bloaty_path = sys.argv[5] |
| |
| results = { |
| 'key': { }, |
| 'results': { } |
| } |
| |
| props = propstr.split(' ') |
| for i in range(0, len(props), 2): |
| results[props[i]] = props[i+1] |
| |
| keys = keystr.split(' ') |
| for i in range(0, len(keys), 2): |
| results['key'][keys[i]] = keys[i+1] |
| |
| # Human "readable" overview as an FYI. |
| print ('Note that template instantiations are grouped together, ' |
| 'thus the elided types.') |
| print subprocess.check_output([bloaty_path, input_file, |
| '-d', 'sections,shortsymbols', '-n', '200']) |
| print ' ' |
| |
| sections = subprocess.check_output([bloaty_path, input_file, '-d', |
| 'sections', '-n', '0', '--csv']) |
| |
| name = os.path.basename(input_file) |
| |
| r = { |
| # Use the default config as stats about the whole binary |
| 'default' : { |
| 'total_size_bytes': os.path.getsize(input_file) |
| }, |
| } |
| |
| # report section by section data. Sections are like .text, .data, etc. |
| for section_row in sections.strip().split('\n'): |
| # Follows schema sections,vmsize,filesize |
| parts = section_row.split(',') |
| if len(parts) < 3 or parts[0] == 'sections': |
| # If we see section, that's the table header |
| continue |
| section = parts[0] |
| # part[1] is "VM Size", part[2] is "File Size". From the bloaty docs: |
| # The "VM SIZE" column tells you how much space the binary will take |
| # when it is loaded into memory. The "FILE SIZE" column tells you about |
| # how much space the binary is taking on disk. |
| vmsize = parts[1] # In bytes |
| filesize = parts[2] # In bytes |
| section = re.sub('[^0-9a-zA-Z_]', '_', section) |
| r['section'+section] = { |
| 'in_file_size_bytes': int(filesize), |
| 'vm_size_bytes': int(vmsize), |
| } |
| |
| |
| results['results'][name] = r |
| |
| # Make debugging easier |
| print json.dumps(results, indent=2) |
| |
| with open(os.path.join(out_dir, name+'.json'), 'w') as output: |
| output.write(json.dumps(results, indent=2)) |
| |
| |
| if __name__ == '__main__': |
| main() |