1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 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 Workerload(":cc_constants.bzl", "transition_constants") 15*7594170eSAndroid Build Coastguard Workerload(":cfi_transitions.bzl", "CFI_ASSEMBLY_FEATURE", "CFI_FEATURE", "apply_cfi_deps", "apply_drop_cfi") 16*7594170eSAndroid Build Coastguard Workerload( 17*7594170eSAndroid Build Coastguard Worker ":fdo_profile_transitions.bzl", 18*7594170eSAndroid Build Coastguard Worker "CLI_CODECOV_KEY", 19*7594170eSAndroid Build Coastguard Worker "CLI_FDO_KEY", 20*7594170eSAndroid Build Coastguard Worker "FDO_PROFILE_ATTR_KEY", 21*7594170eSAndroid Build Coastguard Worker "apply_drop_fdo_profile", 22*7594170eSAndroid Build Coastguard Worker "apply_fdo_profile", 23*7594170eSAndroid Build Coastguard Worker) 24*7594170eSAndroid Build Coastguard Workerload(":lto_transitions.bzl", "apply_drop_lto", "apply_lto_deps") 25*7594170eSAndroid Build Coastguard Workerload(":memtag_heap_transitions.bzl", "apply_drop_memtag_heap", "apply_memtag_heap_transition") 26*7594170eSAndroid Build Coastguard Workerload( 27*7594170eSAndroid Build Coastguard Worker ":sanitizer_enablement_transition.bzl", 28*7594170eSAndroid Build Coastguard Worker "apply_sanitizer_enablement_transition", 29*7594170eSAndroid Build Coastguard Worker) 30*7594170eSAndroid Build Coastguard Worker 31*7594170eSAndroid Build Coastguard Worker# LTO, sanitizers, and FDO require an incoming transition on cc_library_shared 32*7594170eSAndroid Build Coastguard Worker# FDO is applied, while LTO and sanitizers are dropped. 33*7594170eSAndroid Build Coastguard Workerdef _lto_and_fdo_profile_incoming_transition_impl(settings, attr): 34*7594170eSAndroid Build Coastguard Worker new_fdo_settings = apply_fdo_profile( 35*7594170eSAndroid Build Coastguard Worker settings[CLI_CODECOV_KEY], 36*7594170eSAndroid Build Coastguard Worker getattr(attr, FDO_PROFILE_ATTR_KEY), 37*7594170eSAndroid Build Coastguard Worker ) 38*7594170eSAndroid Build Coastguard Worker 39*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_drop_lto( 40*7594170eSAndroid Build Coastguard Worker settings[transition_constants.cli_features_key], 41*7594170eSAndroid Build Coastguard Worker ) 42*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_drop_cfi(new_cli_features) 43*7594170eSAndroid Build Coastguard Worker new_cli_setting = { 44*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key: new_cli_features, 45*7594170eSAndroid Build Coastguard Worker } 46*7594170eSAndroid Build Coastguard Worker 47*7594170eSAndroid Build Coastguard Worker return new_fdo_settings | new_cli_setting | { 48*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_assembly_key: False, 49*7594170eSAndroid Build Coastguard Worker # TODO: b/294868620 - This can be removed when completing the bug 50*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key: False, 51*7594170eSAndroid Build Coastguard Worker } 52*7594170eSAndroid Build Coastguard Worker 53*7594170eSAndroid Build Coastguard Workerlto_and_fdo_profile_incoming_transition = transition( 54*7594170eSAndroid Build Coastguard Worker implementation = _lto_and_fdo_profile_incoming_transition_impl, 55*7594170eSAndroid Build Coastguard Worker inputs = [ 56*7594170eSAndroid Build Coastguard Worker CLI_CODECOV_KEY, 57*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 58*7594170eSAndroid Build Coastguard Worker ], 59*7594170eSAndroid Build Coastguard Worker outputs = [ 60*7594170eSAndroid Build Coastguard Worker CLI_FDO_KEY, 61*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 62*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_assembly_key, 63*7594170eSAndroid Build Coastguard Worker # TODO: b/294868620 - This can be removed when completing the bug 64*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key, 65*7594170eSAndroid Build Coastguard Worker ], 66*7594170eSAndroid Build Coastguard Worker) 67*7594170eSAndroid Build Coastguard Worker 68*7594170eSAndroid Build Coastguard Worker# This transition applies LTO and sanitizer propagation down static dependencies 69*7594170eSAndroid Build Coastguard Workerdef _lto_and_sanitizer_deps_transition_impl(settings, attr): 70*7594170eSAndroid Build Coastguard Worker features = getattr(attr, transition_constants.features_attr_key) 71*7594170eSAndroid Build Coastguard Worker old_cli_features = settings[transition_constants.cli_features_key] 72*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_lto_deps(features, old_cli_features) 73*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_memtag_heap_transition(settings, attr, new_cli_features) 74*7594170eSAndroid Build Coastguard Worker cfi_include_paths = settings[transition_constants.cfi_include_paths_key] 75*7594170eSAndroid Build Coastguard Worker cfi_exclude_paths = settings[transition_constants.cfi_exclude_paths_key] 76*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_cfi_deps( 77*7594170eSAndroid Build Coastguard Worker features, 78*7594170eSAndroid Build Coastguard Worker new_cli_features, 79*7594170eSAndroid Build Coastguard Worker attr.package_name, 80*7594170eSAndroid Build Coastguard Worker cfi_include_paths, 81*7594170eSAndroid Build Coastguard Worker cfi_exclude_paths, 82*7594170eSAndroid Build Coastguard Worker settings[transition_constants.enable_cfi_key], 83*7594170eSAndroid Build Coastguard Worker settings[transition_constants.cli_platforms_key], 84*7594170eSAndroid Build Coastguard Worker ) 85*7594170eSAndroid Build Coastguard Worker cfi_assembly = CFI_FEATURE in new_cli_features and CFI_ASSEMBLY_FEATURE in features 86*7594170eSAndroid Build Coastguard Worker 87*7594170eSAndroid Build Coastguard Worker # TODO: b/294868620 - This can be removed when completing the bug 88*7594170eSAndroid Build Coastguard Worker sanitizers_enabled = apply_sanitizer_enablement_transition( 89*7594170eSAndroid Build Coastguard Worker features + new_cli_features, 90*7594170eSAndroid Build Coastguard Worker ) 91*7594170eSAndroid Build Coastguard Worker return { 92*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key: new_cli_features, 93*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_assembly_key: cfi_assembly, 94*7594170eSAndroid Build Coastguard Worker # TODO: b/294868620 - This can be removed when completing the bug 95*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key: sanitizers_enabled, 96*7594170eSAndroid Build Coastguard Worker } 97*7594170eSAndroid Build Coastguard Worker 98*7594170eSAndroid Build Coastguard Workerlto_and_sanitizer_deps_transition = transition( 99*7594170eSAndroid Build Coastguard Worker implementation = _lto_and_sanitizer_deps_transition_impl, 100*7594170eSAndroid Build Coastguard Worker inputs = [ 101*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 102*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_include_paths_key, 103*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_exclude_paths_key, 104*7594170eSAndroid Build Coastguard Worker transition_constants.enable_cfi_key, 105*7594170eSAndroid Build Coastguard Worker transition_constants.cli_platforms_key, 106*7594170eSAndroid Build Coastguard Worker transition_constants.memtag_heap_async_include_paths_key, 107*7594170eSAndroid Build Coastguard Worker transition_constants.memtag_heap_sync_include_paths_key, 108*7594170eSAndroid Build Coastguard Worker transition_constants.memtag_heap_exclude_paths_key, 109*7594170eSAndroid Build Coastguard Worker ], 110*7594170eSAndroid Build Coastguard Worker outputs = [ 111*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 112*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_assembly_key, 113*7594170eSAndroid Build Coastguard Worker # TODO: b/294868620 - This can be removed when completing the bug 114*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key, 115*7594170eSAndroid Build Coastguard Worker ], 116*7594170eSAndroid Build Coastguard Worker) 117*7594170eSAndroid Build Coastguard Worker 118*7594170eSAndroid Build Coastguard Worker# TODO: b/294868620 - This can be removed when completing the bug 119*7594170eSAndroid Build Coastguard Workerdef _lto_and_sanitizer_static_transition_impl(settings, attr): 120*7594170eSAndroid Build Coastguard Worker features = getattr(attr, transition_constants.features_attr_key) 121*7594170eSAndroid Build Coastguard Worker old_cli_features = settings[transition_constants.cli_features_key] 122*7594170eSAndroid Build Coastguard Worker return { 123*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key: apply_lto_deps( 124*7594170eSAndroid Build Coastguard Worker features, 125*7594170eSAndroid Build Coastguard Worker old_cli_features, 126*7594170eSAndroid Build Coastguard Worker ), 127*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key: ( 128*7594170eSAndroid Build Coastguard Worker apply_sanitizer_enablement_transition(features + old_cli_features) 129*7594170eSAndroid Build Coastguard Worker ), 130*7594170eSAndroid Build Coastguard Worker } 131*7594170eSAndroid Build Coastguard Worker 132*7594170eSAndroid Build Coastguard Worker# TODO: b/294868620 - This can be removed when completing the bug 133*7594170eSAndroid Build Coastguard Workerlto_and_sanitizer_static_transition = transition( 134*7594170eSAndroid Build Coastguard Worker implementation = _lto_and_sanitizer_static_transition_impl, 135*7594170eSAndroid Build Coastguard Worker inputs = [ 136*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 137*7594170eSAndroid Build Coastguard Worker ], 138*7594170eSAndroid Build Coastguard Worker outputs = [ 139*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 140*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key, 141*7594170eSAndroid Build Coastguard Worker ], 142*7594170eSAndroid Build Coastguard Worker) 143*7594170eSAndroid Build Coastguard Worker 144*7594170eSAndroid Build Coastguard Workerdef _apply_drop_lto_and_sanitizers(old_cli_features): 145*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_drop_lto(old_cli_features) 146*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_drop_cfi(new_cli_features) 147*7594170eSAndroid Build Coastguard Worker new_cli_features = apply_drop_memtag_heap(new_cli_features) 148*7594170eSAndroid Build Coastguard Worker 149*7594170eSAndroid Build Coastguard Worker return { 150*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key: new_cli_features, 151*7594170eSAndroid Build Coastguard Worker } 152*7594170eSAndroid Build Coastguard Worker 153*7594170eSAndroid Build Coastguard Worker# This transition drops LTO and sanitizer enablement from cc_binary 154*7594170eSAndroid Build Coastguard Workerdef _drop_lto_and_sanitizer_transition_impl(settings, _): 155*7594170eSAndroid Build Coastguard Worker return _apply_drop_lto_and_sanitizers( 156*7594170eSAndroid Build Coastguard Worker settings[transition_constants.cli_features_key], 157*7594170eSAndroid Build Coastguard Worker ) | {transition_constants.cfi_assembly_key: False} 158*7594170eSAndroid Build Coastguard Worker 159*7594170eSAndroid Build Coastguard Workerdrop_lto_and_sanitizer_transition = transition( 160*7594170eSAndroid Build Coastguard Worker implementation = _drop_lto_and_sanitizer_transition_impl, 161*7594170eSAndroid Build Coastguard Worker inputs = [transition_constants.cli_features_key], 162*7594170eSAndroid Build Coastguard Worker outputs = [ 163*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 164*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_assembly_key, 165*7594170eSAndroid Build Coastguard Worker ], 166*7594170eSAndroid Build Coastguard Worker) 167*7594170eSAndroid Build Coastguard Worker 168*7594170eSAndroid Build Coastguard Worker# Drop lto, sanitizer, and fdo transitions in order to avoid duplicate 169*7594170eSAndroid Build Coastguard Worker# dependency error. 170*7594170eSAndroid Build Coastguard Worker# Currently used for cc stub libraries. 171*7594170eSAndroid Build Coastguard Workerdef _drop_lto_sanitizer_and_fdo_profile_transition_impl(settings, _): 172*7594170eSAndroid Build Coastguard Worker new_cli_features = _apply_drop_lto_and_sanitizers( 173*7594170eSAndroid Build Coastguard Worker settings[transition_constants.cli_features_key], 174*7594170eSAndroid Build Coastguard Worker ) 175*7594170eSAndroid Build Coastguard Worker 176*7594170eSAndroid Build Coastguard Worker new_fdo_setting = apply_drop_fdo_profile() 177*7594170eSAndroid Build Coastguard Worker 178*7594170eSAndroid Build Coastguard Worker return ( 179*7594170eSAndroid Build Coastguard Worker new_cli_features | 180*7594170eSAndroid Build Coastguard Worker new_fdo_setting | 181*7594170eSAndroid Build Coastguard Worker { 182*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_assembly_key: False, 183*7594170eSAndroid Build Coastguard Worker # TODO: b/294868620 - This can be removed when completing the bug 184*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key: False, 185*7594170eSAndroid Build Coastguard Worker } 186*7594170eSAndroid Build Coastguard Worker ) 187*7594170eSAndroid Build Coastguard Worker 188*7594170eSAndroid Build Coastguard Workerdrop_lto_sanitizer_and_fdo_profile_incoming_transition = transition( 189*7594170eSAndroid Build Coastguard Worker implementation = _drop_lto_sanitizer_and_fdo_profile_transition_impl, 190*7594170eSAndroid Build Coastguard Worker inputs = [ 191*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 192*7594170eSAndroid Build Coastguard Worker CLI_FDO_KEY, 193*7594170eSAndroid Build Coastguard Worker ], 194*7594170eSAndroid Build Coastguard Worker outputs = [ 195*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key, 196*7594170eSAndroid Build Coastguard Worker CLI_FDO_KEY, 197*7594170eSAndroid Build Coastguard Worker transition_constants.cfi_assembly_key, 198*7594170eSAndroid Build Coastguard Worker # TODO: b/294868620 - This can be removed when completing the bug 199*7594170eSAndroid Build Coastguard Worker transition_constants.sanitizers_enabled_key, 200*7594170eSAndroid Build Coastguard Worker ], 201*7594170eSAndroid Build Coastguard Worker) 202*7594170eSAndroid Build Coastguard Worker 203*7594170eSAndroid Build Coastguard Workerdef _drop_sanitizer_transition_impl(settings, _): 204*7594170eSAndroid Build Coastguard Worker return { 205*7594170eSAndroid Build Coastguard Worker transition_constants.cli_features_key: apply_drop_cfi( 206*7594170eSAndroid Build Coastguard Worker settings[transition_constants.cli_features_key], 207*7594170eSAndroid Build Coastguard Worker ), 208*7594170eSAndroid Build Coastguard Worker } 209*7594170eSAndroid Build Coastguard Worker 210*7594170eSAndroid Build Coastguard Workerdrop_sanitizer_transition = transition( 211*7594170eSAndroid Build Coastguard Worker implementation = _drop_sanitizer_transition_impl, 212*7594170eSAndroid Build Coastguard Worker inputs = [transition_constants.cli_features_key], 213*7594170eSAndroid Build Coastguard Worker outputs = [transition_constants.cli_features_key], 214*7594170eSAndroid Build Coastguard Worker) 215