1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker 15*7594170eSAndroid Build Coastguard WorkerFDO_PROFILE_ATTR_KEY = "fdo_profile" 16*7594170eSAndroid Build Coastguard WorkerCLI_FDO_KEY = "//command_line_option:fdo_profile" 17*7594170eSAndroid Build Coastguard WorkerCLI_CODECOV_KEY = "//command_line_option:collect_code_coverage" 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard Worker# https://github.com/bazelbuild/bazel/blob/8a53b0e51506d825d276ea7c9480190bd2287009/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoHelper.java#L170 20*7594170eSAndroid Build Coastguard Worker# Coverage mode is not compatible with FDO optimization in Bazel cc rules 21*7594170eSAndroid Build Coastguard Worker# If both collect_code_coverage is set, disable fdo optimization 22*7594170eSAndroid Build Coastguard Workerdef apply_fdo_profile(codecov_setting, fdo_profile_attr): 23*7594170eSAndroid Build Coastguard Worker if codecov_setting: 24*7594170eSAndroid Build Coastguard Worker return { 25*7594170eSAndroid Build Coastguard Worker CLI_FDO_KEY: None, 26*7594170eSAndroid Build Coastguard Worker } 27*7594170eSAndroid Build Coastguard Worker else: 28*7594170eSAndroid Build Coastguard Worker return { 29*7594170eSAndroid Build Coastguard Worker CLI_FDO_KEY: fdo_profile_attr, 30*7594170eSAndroid Build Coastguard Worker } 31*7594170eSAndroid Build Coastguard Worker 32*7594170eSAndroid Build Coastguard Workerdef fdo_profile_transition_impl(setting, attr): 33*7594170eSAndroid Build Coastguard Worker return apply_fdo_profile( 34*7594170eSAndroid Build Coastguard Worker setting[CLI_CODECOV_KEY], 35*7594170eSAndroid Build Coastguard Worker getattr(attr, FDO_PROFILE_ATTR_KEY), 36*7594170eSAndroid Build Coastguard Worker ) 37*7594170eSAndroid Build Coastguard Worker 38*7594170eSAndroid Build Coastguard Worker# This transition reads the fdo_profile attribute of a rule and set the value 39*7594170eSAndroid Build Coastguard Worker# to //command_line_option:fdo_profile" 40*7594170eSAndroid Build Coastguard Workerfdo_profile_transition = transition( 41*7594170eSAndroid Build Coastguard Worker implementation = fdo_profile_transition_impl, 42*7594170eSAndroid Build Coastguard Worker inputs = [ 43*7594170eSAndroid Build Coastguard Worker CLI_CODECOV_KEY, 44*7594170eSAndroid Build Coastguard Worker ], 45*7594170eSAndroid Build Coastguard Worker outputs = [ 46*7594170eSAndroid Build Coastguard Worker CLI_FDO_KEY, 47*7594170eSAndroid Build Coastguard Worker ], 48*7594170eSAndroid Build Coastguard Worker) 49*7594170eSAndroid Build Coastguard Worker 50*7594170eSAndroid Build Coastguard Workerdef apply_drop_fdo_profile(): 51*7594170eSAndroid Build Coastguard Worker return { 52*7594170eSAndroid Build Coastguard Worker CLI_FDO_KEY: None, 53*7594170eSAndroid Build Coastguard Worker } 54