| #!/usr/bin/env python |
| # Copyright 2019 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """This script merges code coverage profiles from multiple steps.""" |
| |
| import argparse |
| import logging |
| import sys |
| |
| import merge_lib as merger |
| |
| |
| def _merge_steps_argument_parser(*args, **kwargs): |
| parser = argparse.ArgumentParser(*args, **kwargs) |
| parser.add_argument('--input-dir', required=True, help=argparse.SUPPRESS) |
| parser.add_argument('--output-file', |
| required=True, |
| help='where to store the merged data') |
| parser.add_argument('--llvm-profdata', |
| required=True, |
| help='path to llvm-profdata executable') |
| parser.add_argument( |
| '--profdata-filename-pattern', |
| default='.*', |
| help='regex pattern of profdata filename to merge for current test type. ' |
| 'If not present, all profdata files will be merged.') |
| parser.add_argument('--sparse', |
| action='store_true', |
| dest='sparse', |
| help='run llvm-profdata with the sparse flag.') |
| parser.add_argument( |
| '--profile-merge-timeout', |
| default=3600, |
| help='Timeout (sec) for the call to merge profiles. Defaults to 3600.') |
| parser.add_argument( |
| '--weight', |
| action='append', |
| default=[], |
| help='The weight to use for a particular benchmark. Format ' |
| 'is benchmark:weight. Matching of benchmark is done using ends with.') |
| return parser |
| |
| |
| def main(): |
| desc = 'Merge profdata files in <--input-dir> into a single profdata.' |
| parser = _merge_steps_argument_parser(description=desc) |
| params = parser.parse_args() |
| |
| weights = {} |
| for name_and_weight in params.weight: |
| parts = name_and_weight.split(':') |
| if len(parts) != 2: |
| logging.error('Invalid weight:\n%r', name_and_weight) |
| return 1 |
| weights[parts[0]] = parts[1] |
| |
| # counter overflow profiles should be logged as warnings as part of the |
| # merger.merge_profiles call. |
| invalid_profiles, _ = merger.merge_profiles( |
| params.input_dir, |
| params.output_file, |
| '.profdata', |
| params.llvm_profdata, |
| params.profdata_filename_pattern, |
| sparse=params.sparse, |
| merge_timeout=params.profile_merge_timeout, |
| weights=weights) |
| if invalid_profiles: |
| logging.error('Invalid profiles were generated:\n%r', invalid_profiles) |
| return 1 |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s', |
| level=logging.INFO) |
| sys.exit(main()) |