xref: /aosp_15_r20/build/soong/rust/afdo.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2022 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage rust
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerconst afdoFlagFormat = "-Zprofile-sample-use=%s"
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workertype afdo struct {
29*333d2b36SAndroid Build Coastguard Worker	Properties cc.AfdoProperties
30*333d2b36SAndroid Build Coastguard Worker}
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workerfunc (afdo *afdo) props() []interface{} {
33*333d2b36SAndroid Build Coastguard Worker	return []interface{}{&afdo.Properties}
34*333d2b36SAndroid Build Coastguard Worker}
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Workerfunc (afdo *afdo) addDep(ctx BaseModuleContext, actx android.BottomUpMutatorContext) {
37*333d2b36SAndroid Build Coastguard Worker	// afdo is not supported outside of Android
38*333d2b36SAndroid Build Coastguard Worker	if ctx.Host() {
39*333d2b36SAndroid Build Coastguard Worker		return
40*333d2b36SAndroid Build Coastguard Worker	}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker	if mod, ok := ctx.Module().(*Module); ok && mod.Enabled(ctx) {
43*333d2b36SAndroid Build Coastguard Worker		fdoProfileName, err := actx.DeviceConfig().AfdoProfile(actx.ModuleName())
44*333d2b36SAndroid Build Coastguard Worker		if err != nil {
45*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("%s", err.Error())
46*333d2b36SAndroid Build Coastguard Worker		}
47*333d2b36SAndroid Build Coastguard Worker		if fdoProfileName != "" {
48*333d2b36SAndroid Build Coastguard Worker			actx.AddFarVariationDependencies(
49*333d2b36SAndroid Build Coastguard Worker				[]blueprint.Variation{
50*333d2b36SAndroid Build Coastguard Worker					{Mutator: "arch", Variation: actx.Target().ArchVariation()},
51*333d2b36SAndroid Build Coastguard Worker					{Mutator: "os", Variation: "android"},
52*333d2b36SAndroid Build Coastguard Worker				},
53*333d2b36SAndroid Build Coastguard Worker				cc.FdoProfileTag,
54*333d2b36SAndroid Build Coastguard Worker				[]string{fdoProfileName}...,
55*333d2b36SAndroid Build Coastguard Worker			)
56*333d2b36SAndroid Build Coastguard Worker		}
57*333d2b36SAndroid Build Coastguard Worker	}
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Workerfunc (afdo *afdo) flags(ctx android.ModuleContext, flags Flags, deps PathDeps) (Flags, PathDeps) {
61*333d2b36SAndroid Build Coastguard Worker	if ctx.Host() {
62*333d2b36SAndroid Build Coastguard Worker		return flags, deps
63*333d2b36SAndroid Build Coastguard Worker	}
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	if !afdo.Properties.Afdo {
66*333d2b36SAndroid Build Coastguard Worker		return flags, deps
67*333d2b36SAndroid Build Coastguard Worker	}
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(cc.FdoProfileTag, func(m android.Module) {
70*333d2b36SAndroid Build Coastguard Worker		if info, ok := android.OtherModuleProvider(ctx, m, cc.FdoProfileProvider); ok {
71*333d2b36SAndroid Build Coastguard Worker			path := info.Path
72*333d2b36SAndroid Build Coastguard Worker			profileUseFlag := fmt.Sprintf(afdoFlagFormat, path.String())
73*333d2b36SAndroid Build Coastguard Worker			flags.RustFlags = append(flags.RustFlags, profileUseFlag)
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker			deps.AfdoProfiles = append(deps.AfdoProfiles, path)
76*333d2b36SAndroid Build Coastguard Worker		}
77*333d2b36SAndroid Build Coastguard Worker	})
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	return flags, deps
80*333d2b36SAndroid Build Coastguard Worker}
81