1*3f982cf4SFabien Sanglard#!/usr/bin/env python3 2*3f982cf4SFabien Sanglard# Copyright 2020 The Chromium Authors. All rights reserved. 3*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be 4*3f982cf4SFabien Sanglard# found in the LICENSE file. 5*3f982cf4SFabien Sanglard"""This script merges code coverage profiles from multiple steps. 6*3f982cf4SFabien Sanglard 7*3f982cf4SFabien SanglardThis script is taken from the chromium build tools and is synced 8*3f982cf4SFabien Sanglardmanually on an as-needed basis: 9*3f982cf4SFabien Sanglardhttps://source.chromium.org/chromium/chromium/src/+/master:testing/merge_scripts/code_coverage/merge_steps.py?q=merge_steps.py&ss=chromium 10*3f982cf4SFabien Sanglard""" 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglardimport argparse 13*3f982cf4SFabien Sanglardimport os 14*3f982cf4SFabien Sanglardimport sys 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglardimport merge_lib as merger 17*3f982cf4SFabien Sanglard 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglarddef _merge_steps_argument_parser(*args, **kwargs): 20*3f982cf4SFabien Sanglard parser = argparse.ArgumentParser(*args, **kwargs) 21*3f982cf4SFabien Sanglard parser.add_argument('--input-dir', required=True, help=argparse.SUPPRESS) 22*3f982cf4SFabien Sanglard parser.add_argument( 23*3f982cf4SFabien Sanglard '--output-file', required=True, help='where to store the merged data') 24*3f982cf4SFabien Sanglard parser.add_argument( 25*3f982cf4SFabien Sanglard '--llvm-profdata', required=True, help='path to llvm-profdata executable') 26*3f982cf4SFabien Sanglard parser.add_argument( 27*3f982cf4SFabien Sanglard '--profdata-filename-pattern', 28*3f982cf4SFabien Sanglard default='.*', 29*3f982cf4SFabien Sanglard help='regex pattern of profdata filename to merge for current test type. ' 30*3f982cf4SFabien Sanglard 'If not present, all profdata files will be merged.') 31*3f982cf4SFabien Sanglard # TODO(crbug.com/1077304) - migrate this to sparse=False as default, and have 32*3f982cf4SFabien Sanglard # --sparse to set sparse 33*3f982cf4SFabien Sanglard parser.add_argument( 34*3f982cf4SFabien Sanglard '--no-sparse', 35*3f982cf4SFabien Sanglard action='store_false', 36*3f982cf4SFabien Sanglard dest='sparse', 37*3f982cf4SFabien Sanglard help='run llvm-profdata without the sparse flag.') 38*3f982cf4SFabien Sanglard # TODO(crbug.com/1077304) - The intended behaviour is to default sparse to 39*3f982cf4SFabien Sanglard # false. --no-sparse above was added as a workaround, and will be removed. 40*3f982cf4SFabien Sanglard # This is being introduced now in support of the migration to intended 41*3f982cf4SFabien Sanglard # behavior. Ordering of args matters here, as the default is set by the former 42*3f982cf4SFabien Sanglard # (sparse defaults to False because of ordering. See merge_results unit tests 43*3f982cf4SFabien Sanglard # for details) 44*3f982cf4SFabien Sanglard parser.add_argument( 45*3f982cf4SFabien Sanglard '--sparse', 46*3f982cf4SFabien Sanglard action='store_true', 47*3f982cf4SFabien Sanglard dest='sparse', 48*3f982cf4SFabien Sanglard help='run llvm-profdata with the sparse flag.') 49*3f982cf4SFabien Sanglard return parser 50*3f982cf4SFabien Sanglard 51*3f982cf4SFabien Sanglard 52*3f982cf4SFabien Sanglarddef main(): 53*3f982cf4SFabien Sanglard desc = "Merge profdata files in <--input-dir> into a single profdata." 54*3f982cf4SFabien Sanglard parser = _merge_steps_argument_parser(description=desc) 55*3f982cf4SFabien Sanglard params = parser.parse_args() 56*3f982cf4SFabien Sanglard merger.merge_profiles(params.input_dir, params.output_file, '.profdata', 57*3f982cf4SFabien Sanglard params.llvm_profdata, params.profdata_filename_pattern, 58*3f982cf4SFabien Sanglard sparse=params.sparse) 59*3f982cf4SFabien Sanglard 60*3f982cf4SFabien Sanglard 61*3f982cf4SFabien Sanglardif __name__ == '__main__': 62*3f982cf4SFabien Sanglard sys.exit(main()) 63