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