xref: /aosp_15_r20/build/bazel/rules/cc/composed_transitions.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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