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