1*333d2b36SAndroid Build Coastguard Worker// Copyright 2022 Google Inc. All rights reserved. 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 cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "runtime" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workertype visitDirectDepsInterface interface { 28*333d2b36SAndroid Build Coastguard Worker VisitDirectDeps(blueprint.Module, func(dep blueprint.Module)) 29*333d2b36SAndroid Build Coastguard Worker} 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerfunc hasDirectDep(ctx visitDirectDepsInterface, m android.Module, wantDep android.Module) bool { 32*333d2b36SAndroid Build Coastguard Worker var found bool 33*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(m, func(dep blueprint.Module) { 34*333d2b36SAndroid Build Coastguard Worker if dep == wantDep { 35*333d2b36SAndroid Build Coastguard Worker found = true 36*333d2b36SAndroid Build Coastguard Worker } 37*333d2b36SAndroid Build Coastguard Worker }) 38*333d2b36SAndroid Build Coastguard Worker return found 39*333d2b36SAndroid Build Coastguard Worker} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workerfunc TestAfdoDeps(t *testing.T) { 42*333d2b36SAndroid Build Coastguard Worker t.Parallel() 43*333d2b36SAndroid Build Coastguard Worker bp := ` 44*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 45*333d2b36SAndroid Build Coastguard Worker name: "libTest", 46*333d2b36SAndroid Build Coastguard Worker host_supported: true, 47*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 48*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 49*333d2b36SAndroid Build Coastguard Worker afdo: true, 50*333d2b36SAndroid Build Coastguard Worker lto: { 51*333d2b36SAndroid Build Coastguard Worker thin: true, 52*333d2b36SAndroid Build Coastguard Worker }, 53*333d2b36SAndroid Build Coastguard Worker } 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker cc_library_static { 56*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 57*333d2b36SAndroid Build Coastguard Worker host_supported: true, 58*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 59*333d2b36SAndroid Build Coastguard Worker static_libs: ["libBar"], 60*333d2b36SAndroid Build Coastguard Worker } 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker cc_library_static { 63*333d2b36SAndroid Build Coastguard Worker name: "libBar", 64*333d2b36SAndroid Build Coastguard Worker host_supported: true, 65*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 66*333d2b36SAndroid Build Coastguard Worker } 67*333d2b36SAndroid Build Coastguard Worker ` 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 70*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFdoProfile, 71*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 72*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("afdo_profiles_package/libTest.afdo", ""), 73*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 74*333d2b36SAndroid Build Coastguard Worker variables.AfdoProfiles = []string{ 75*333d2b36SAndroid Build Coastguard Worker "libTest://afdo_profiles_package:libTest_afdo", 76*333d2b36SAndroid Build Coastguard Worker } 77*333d2b36SAndroid Build Coastguard Worker }), 78*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 79*333d2b36SAndroid Build Coastguard Worker "afdo_profiles_package/Android.bp": []byte(` 80*333d2b36SAndroid Build Coastguard Worker fdo_profile { 81*333d2b36SAndroid Build Coastguard Worker name: "libTest_afdo", 82*333d2b36SAndroid Build Coastguard Worker arch: { 83*333d2b36SAndroid Build Coastguard Worker arm64: { 84*333d2b36SAndroid Build Coastguard Worker profile: "libTest.afdo", 85*333d2b36SAndroid Build Coastguard Worker }, 86*333d2b36SAndroid Build Coastguard Worker }, 87*333d2b36SAndroid Build Coastguard Worker } 88*333d2b36SAndroid Build Coastguard Worker `), 89*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 90*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker profileSampleCFlag := "-fprofile-sample-use=afdo_profiles_package/libTest.afdo" 93*333d2b36SAndroid Build Coastguard Worker uniqueInternalLinkageNamesCFlag := "-funique-internal-linkage-names" 94*333d2b36SAndroid Build Coastguard Worker afdoLtoLdFlag := "-Wl,-plugin-opt,-import-instr-limit=40" 95*333d2b36SAndroid Build Coastguard Worker noAfdoLtoLdFlag := "-Wl,-plugin-opt,-import-instr-limit=5" 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 98*333d2b36SAndroid Build Coastguard Worker libFooAfdoVariant := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libTest") 99*333d2b36SAndroid Build Coastguard Worker libBarAfdoVariant := result.ModuleForTests("libBar", "android_arm64_armv8-a_static_afdo-libTest") 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker // Check cFlags of afdo-enabled module and the afdo-variant of its static deps 102*333d2b36SAndroid Build Coastguard Worker cFlags := libTest.Rule("cc").Args["cFlags"] 103*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, profileSampleCFlag) { 104*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable afdo profile, but did not find %q in cflags %q", profileSampleCFlag, cFlags) 105*333d2b36SAndroid Build Coastguard Worker } 106*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 107*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable afdo, but did not find %q in cflags %q", profileSampleCFlag, cFlags) 108*333d2b36SAndroid Build Coastguard Worker } 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker ldFlags := libTest.Rule("ld").Args["ldFlags"] 111*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, afdoLtoLdFlag) { 112*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable afdo, but did not find %q in ldflags %q", afdoLtoLdFlag, ldFlags) 113*333d2b36SAndroid Build Coastguard Worker } 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker cFlags = libFooAfdoVariant.Rule("cc").Args["cFlags"] 116*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, profileSampleCFlag) { 117*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFooAfdoVariant' to enable afdo profile, but did not find %q in cflags %q", profileSampleCFlag, cFlags) 118*333d2b36SAndroid Build Coastguard Worker } 119*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 120*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFooAfdoVariant' to enable afdo, but did not find %q in cflags %q", profileSampleCFlag, cFlags) 121*333d2b36SAndroid Build Coastguard Worker } 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker cFlags = libBarAfdoVariant.Rule("cc").Args["cFlags"] 124*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, profileSampleCFlag) { 125*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBarAfdoVariant' to enable afdo profile, but did not find %q in cflags %q", profileSampleCFlag, cFlags) 126*333d2b36SAndroid Build Coastguard Worker } 127*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 128*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBarAfdoVariant' to enable afdo, but did not find %q in cflags %q", profileSampleCFlag, cFlags) 129*333d2b36SAndroid Build Coastguard Worker } 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from afdo-enabled module to static deps 132*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest.Module(), libFooAfdoVariant.Module()) { 133*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on afdo variant of libFoo") 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFooAfdoVariant.Module(), libBarAfdoVariant.Module()) { 137*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on afdo variant of libBar") 138*333d2b36SAndroid Build Coastguard Worker } 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker // Verify non-afdo variant exists and doesn't contain afdo 141*333d2b36SAndroid Build Coastguard Worker libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") 142*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Worker cFlags = libFoo.Rule("cc").Args["cFlags"] 145*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 146*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFoo' to not enable afdo profile, but found %q in cflags %q", profileSampleCFlag, cFlags) 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 149*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFoo' to not enable afdo, but found %q in cflags %q", profileSampleCFlag, cFlags) 150*333d2b36SAndroid Build Coastguard Worker } 151*333d2b36SAndroid Build Coastguard Worker cFlags = libBar.Rule("cc").Args["cFlags"] 152*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 153*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBar' to not enable afdo profile, but found %q in cflags %q", profileSampleCFlag, cFlags) 154*333d2b36SAndroid Build Coastguard Worker } 155*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 156*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBar' to not enable afdo, but found %q in cflags %q", profileSampleCFlag, cFlags) 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker // Check dependency edges of static deps 160*333d2b36SAndroid Build Coastguard Worker if hasDirectDep(result, libTest.Module(), libFoo.Module()) { 161*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest should not depend on non-afdo variant of libFoo") 162*333d2b36SAndroid Build Coastguard Worker } 163*333d2b36SAndroid Build Coastguard Worker 164*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFoo.Module(), libBar.Module()) { 165*333d2b36SAndroid Build Coastguard Worker t.Errorf("libFoo missing dependency on non-afdo variant of libBar") 166*333d2b36SAndroid Build Coastguard Worker } 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Worker // Verify that the arm variant does not have FDO since the fdo_profile module only has a profile for arm64 169*333d2b36SAndroid Build Coastguard Worker libTest32 := result.ModuleForTests("libTest", "android_arm_armv7-a-neon_shared") 170*333d2b36SAndroid Build Coastguard Worker libFooAfdoVariant32 := result.ModuleForTests("libFoo", "android_arm_armv7-a-neon_static_afdo-libTest_lto-thin") 171*333d2b36SAndroid Build Coastguard Worker libBarAfdoVariant32 := result.ModuleForTests("libBar", "android_arm_armv7-a-neon_static_afdo-libTest_lto-thin") 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker cFlags = libTest32.Rule("cc").Args["cFlags"] 174*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 175*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libTest' not to enable afdo, but found %q in cflags %q", profileSampleCFlag, cFlags) 176*333d2b36SAndroid Build Coastguard Worker } 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Worker // TODO(b/324141705): when the fdo_profile module doesn't provide a source file the dependencies don't get 179*333d2b36SAndroid Build Coastguard Worker // -funique-internal-linkage-names but the module does. 180*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 181*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libTest' to enable -funique-internal-linkage-names but did not find %q in cflags %q", 182*333d2b36SAndroid Build Coastguard Worker uniqueInternalLinkageNamesCFlag, cFlags) 183*333d2b36SAndroid Build Coastguard Worker } 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker ldFlags = libTest32.Rule("ld").Args["ldFlags"] 186*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, noAfdoLtoLdFlag) { 187*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libTest' to not enable afdo, but did not find %q in ldflags %q", noAfdoLtoLdFlag, ldFlags) 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker if strings.Contains(ldFlags, afdoLtoLdFlag) { 190*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libTest' to not enable afdo, but found %q in ldflags %q", afdoLtoLdFlag, ldFlags) 191*333d2b36SAndroid Build Coastguard Worker } 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from afdo-enabled module to static deps 194*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest32.Module(), libFooAfdoVariant32.Module()) { 195*333d2b36SAndroid Build Coastguard Worker t.Errorf("arm32 libTest missing dependency on afdo variant of libFoo") 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFooAfdoVariant32.Module(), libBarAfdoVariant32.Module()) { 199*333d2b36SAndroid Build Coastguard Worker t.Errorf("arm32 libTest missing dependency on afdo variant of libBar") 200*333d2b36SAndroid Build Coastguard Worker } 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Worker cFlags = libFooAfdoVariant32.Rule("cc").Args["cFlags"] 203*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 204*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libFoo' to not enable afdo profile, but found %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 207*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libFoo' to enable afdo, but did not find %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 208*333d2b36SAndroid Build Coastguard Worker } 209*333d2b36SAndroid Build Coastguard Worker cFlags = libBarAfdoVariant32.Rule("cc").Args["cFlags"] 210*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 211*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libBar' to not enable afdo profile, but found %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 214*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected arm32 'libBar' to enable afdo, but did not find %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 215*333d2b36SAndroid Build Coastguard Worker } 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Worker // Verify that the host variants don't enable afdo 218*333d2b36SAndroid Build Coastguard Worker libTestHost := result.ModuleForTests("libTest", result.Config.BuildOSTarget.String()+"_shared") 219*333d2b36SAndroid Build Coastguard Worker libFooHost := result.ModuleForTests("libFoo", result.Config.BuildOSTarget.String()+"_static_lto-thin") 220*333d2b36SAndroid Build Coastguard Worker libBarHost := result.ModuleForTests("libBar", result.Config.BuildOSTarget.String()+"_static_lto-thin") 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker cFlags = libTestHost.Rule("cc").Args["cFlags"] 223*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 224*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libTest' to not enable afdo profile, but found %q in cflags %q", profileSampleCFlag, cFlags) 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 228*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libTest' to not enable afdo but found %q in cflags %q", 229*333d2b36SAndroid Build Coastguard Worker uniqueInternalLinkageNamesCFlag, cFlags) 230*333d2b36SAndroid Build Coastguard Worker } 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS != "darwin" { 233*333d2b36SAndroid Build Coastguard Worker ldFlags := libTestHost.Rule("ld").Args["ldFlags"] 234*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, noAfdoLtoLdFlag) { 235*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libTest' to not enable afdo, but did not find %q in ldflags %q", noAfdoLtoLdFlag, ldFlags) 236*333d2b36SAndroid Build Coastguard Worker } 237*333d2b36SAndroid Build Coastguard Worker if strings.Contains(ldFlags, afdoLtoLdFlag) { 238*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libTest' to not enable afdo, but found %q in ldflags %q", afdoLtoLdFlag, ldFlags) 239*333d2b36SAndroid Build Coastguard Worker } 240*333d2b36SAndroid Build Coastguard Worker } 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from afdo-enabled module to static deps 243*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTestHost.Module(), libFooHost.Module()) { 244*333d2b36SAndroid Build Coastguard Worker t.Errorf("host libTest missing dependency on non-afdo variant of libFoo") 245*333d2b36SAndroid Build Coastguard Worker } 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFooHost.Module(), libBarHost.Module()) { 248*333d2b36SAndroid Build Coastguard Worker t.Errorf("host libTest missing dependency on non-afdo variant of libBar") 249*333d2b36SAndroid Build Coastguard Worker } 250*333d2b36SAndroid Build Coastguard Worker 251*333d2b36SAndroid Build Coastguard Worker cFlags = libFooHost.Rule("cc").Args["cFlags"] 252*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 253*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libFoo' to not enable afdo profile, but found %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 254*333d2b36SAndroid Build Coastguard Worker } 255*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 256*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libFoo' to not enable afdo, but found %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 257*333d2b36SAndroid Build Coastguard Worker } 258*333d2b36SAndroid Build Coastguard Worker cFlags = libBarHost.Rule("cc").Args["cFlags"] 259*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, profileSampleCFlag) { 260*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libBar' to not enable afdo profile, but found %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 261*333d2b36SAndroid Build Coastguard Worker } 262*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, uniqueInternalLinkageNamesCFlag) { 263*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected host 'libBar' to not enable afdo, but found %q in cflags %q", uniqueInternalLinkageNamesCFlag, cFlags) 264*333d2b36SAndroid Build Coastguard Worker } 265*333d2b36SAndroid Build Coastguard Worker} 266*333d2b36SAndroid Build Coastguard Worker 267*333d2b36SAndroid Build Coastguard Workerfunc TestAfdoEnabledOnStaticDepNoAfdo(t *testing.T) { 268*333d2b36SAndroid Build Coastguard Worker t.Parallel() 269*333d2b36SAndroid Build Coastguard Worker bp := ` 270*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 271*333d2b36SAndroid Build Coastguard Worker name: "libTest", 272*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 273*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 274*333d2b36SAndroid Build Coastguard Worker } 275*333d2b36SAndroid Build Coastguard Worker 276*333d2b36SAndroid Build Coastguard Worker cc_library_static { 277*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 278*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 279*333d2b36SAndroid Build Coastguard Worker static_libs: ["libBar"], 280*333d2b36SAndroid Build Coastguard Worker afdo: true, // TODO(b/256670524): remove support for enabling afdo from static only libraries, this can only propagate from shared libraries/binaries 281*333d2b36SAndroid Build Coastguard Worker } 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Worker cc_library_static { 284*333d2b36SAndroid Build Coastguard Worker name: "libBar", 285*333d2b36SAndroid Build Coastguard Worker } 286*333d2b36SAndroid Build Coastguard Worker ` 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 289*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 290*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFdoProfile, 291*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("toolchain/pgo-profiles/sampling/libFoo.afdo", ""), 292*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 293*333d2b36SAndroid Build Coastguard Worker "afdo_profiles_package/Android.bp": []byte(` 294*333d2b36SAndroid Build Coastguard Worker soong_namespace { 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker fdo_profile { 297*333d2b36SAndroid Build Coastguard Worker name: "libFoo_afdo", 298*333d2b36SAndroid Build Coastguard Worker profile: "libFoo.afdo", 299*333d2b36SAndroid Build Coastguard Worker } 300*333d2b36SAndroid Build Coastguard Worker `), 301*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 302*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared").Module() 305*333d2b36SAndroid Build Coastguard Worker libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") 306*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static").Module() 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest, libFoo.Module()) { 309*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on non-afdo variant of libFoo") 310*333d2b36SAndroid Build Coastguard Worker } 311*333d2b36SAndroid Build Coastguard Worker 312*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFoo.Module(), libBar) { 313*333d2b36SAndroid Build Coastguard Worker t.Errorf("libFoo missing dependency on non-afdo variant of libBar") 314*333d2b36SAndroid Build Coastguard Worker } 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker fooVariants := result.ModuleVariantsForTests("foo") 317*333d2b36SAndroid Build Coastguard Worker for _, v := range fooVariants { 318*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "afdo-") { 319*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected no afdo variant of 'foo', got %q", v) 320*333d2b36SAndroid Build Coastguard Worker } 321*333d2b36SAndroid Build Coastguard Worker } 322*333d2b36SAndroid Build Coastguard Worker 323*333d2b36SAndroid Build Coastguard Worker cFlags := libFoo.Rule("cc").Args["cFlags"] 324*333d2b36SAndroid Build Coastguard Worker if w := "-fprofile-sample-accurate"; strings.Contains(cFlags, w) { 325*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'foo' to not enable afdo, but found %q in cflags %q", w, cFlags) 326*333d2b36SAndroid Build Coastguard Worker } 327*333d2b36SAndroid Build Coastguard Worker 328*333d2b36SAndroid Build Coastguard Worker barVariants := result.ModuleVariantsForTests("bar") 329*333d2b36SAndroid Build Coastguard Worker for _, v := range barVariants { 330*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "afdo-") { 331*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected no afdo variant of 'bar', got %q", v) 332*333d2b36SAndroid Build Coastguard Worker } 333*333d2b36SAndroid Build Coastguard Worker } 334*333d2b36SAndroid Build Coastguard Worker} 335*333d2b36SAndroid Build Coastguard Worker 336*333d2b36SAndroid Build Coastguard Workerfunc TestAfdoEnabledWithRuntimeDepNoAfdo(t *testing.T) { 337*333d2b36SAndroid Build Coastguard Worker bp := ` 338*333d2b36SAndroid Build Coastguard Worker cc_library { 339*333d2b36SAndroid Build Coastguard Worker name: "libTest", 340*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 341*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libFoo"], 342*333d2b36SAndroid Build Coastguard Worker afdo: true, 343*333d2b36SAndroid Build Coastguard Worker } 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker cc_library { 346*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 347*333d2b36SAndroid Build Coastguard Worker } 348*333d2b36SAndroid Build Coastguard Worker ` 349*333d2b36SAndroid Build Coastguard Worker 350*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 351*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 352*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFdoProfile, 353*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("afdo_profiles_package/libTest.afdo", ""), 354*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 355*333d2b36SAndroid Build Coastguard Worker variables.AfdoProfiles = []string{ 356*333d2b36SAndroid Build Coastguard Worker "libTest://afdo_profiles_package:libTest_afdo", 357*333d2b36SAndroid Build Coastguard Worker } 358*333d2b36SAndroid Build Coastguard Worker }), 359*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 360*333d2b36SAndroid Build Coastguard Worker "afdo_profiles_package/Android.bp": []byte(` 361*333d2b36SAndroid Build Coastguard Worker fdo_profile { 362*333d2b36SAndroid Build Coastguard Worker name: "libTest_afdo", 363*333d2b36SAndroid Build Coastguard Worker profile: "libTest.afdo", 364*333d2b36SAndroid Build Coastguard Worker } 365*333d2b36SAndroid Build Coastguard Worker `), 366*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 367*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 368*333d2b36SAndroid Build Coastguard Worker 369*333d2b36SAndroid Build Coastguard Worker libFooVariants := result.ModuleVariantsForTests("libFoo") 370*333d2b36SAndroid Build Coastguard Worker for _, v := range libFooVariants { 371*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "afdo-") { 372*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected no afdo variant of 'foo', got %q", v) 373*333d2b36SAndroid Build Coastguard Worker } 374*333d2b36SAndroid Build Coastguard Worker } 375*333d2b36SAndroid Build Coastguard Worker} 376*333d2b36SAndroid Build Coastguard Worker 377*333d2b36SAndroid Build Coastguard Workerfunc TestAfdoEnabledWithMultiArchs(t *testing.T) { 378*333d2b36SAndroid Build Coastguard Worker bp := ` 379*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 380*333d2b36SAndroid Build Coastguard Worker name: "foo", 381*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 382*333d2b36SAndroid Build Coastguard Worker afdo: true, 383*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 384*333d2b36SAndroid Build Coastguard Worker } 385*333d2b36SAndroid Build Coastguard Worker` 386*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 387*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFdoProfile, 388*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 389*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("afdo_profiles_package/foo_arm.afdo", ""), 390*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("afdo_profiles_package/foo_arm64.afdo", ""), 391*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 392*333d2b36SAndroid Build Coastguard Worker variables.AfdoProfiles = []string{ 393*333d2b36SAndroid Build Coastguard Worker "foo://afdo_profiles_package:foo_afdo", 394*333d2b36SAndroid Build Coastguard Worker } 395*333d2b36SAndroid Build Coastguard Worker }), 396*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 397*333d2b36SAndroid Build Coastguard Worker "afdo_profiles_package/Android.bp": []byte(` 398*333d2b36SAndroid Build Coastguard Worker soong_namespace { 399*333d2b36SAndroid Build Coastguard Worker } 400*333d2b36SAndroid Build Coastguard Worker fdo_profile { 401*333d2b36SAndroid Build Coastguard Worker name: "foo_afdo", 402*333d2b36SAndroid Build Coastguard Worker arch: { 403*333d2b36SAndroid Build Coastguard Worker arm: { 404*333d2b36SAndroid Build Coastguard Worker profile: "foo_arm.afdo", 405*333d2b36SAndroid Build Coastguard Worker }, 406*333d2b36SAndroid Build Coastguard Worker arm64: { 407*333d2b36SAndroid Build Coastguard Worker profile: "foo_arm64.afdo", 408*333d2b36SAndroid Build Coastguard Worker } 409*333d2b36SAndroid Build Coastguard Worker } 410*333d2b36SAndroid Build Coastguard Worker } 411*333d2b36SAndroid Build Coastguard Worker `), 412*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 413*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 414*333d2b36SAndroid Build Coastguard Worker 415*333d2b36SAndroid Build Coastguard Worker fooArm := result.ModuleForTests("foo", "android_arm_armv7-a-neon_shared") 416*333d2b36SAndroid Build Coastguard Worker fooArmCFlags := fooArm.Rule("cc").Args["cFlags"] 417*333d2b36SAndroid Build Coastguard Worker if w := "-fprofile-sample-use=afdo_profiles_package/foo_arm.afdo"; !strings.Contains(fooArmCFlags, w) { 418*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'foo' to enable afdo, but did not find %q in cflags %q", w, fooArmCFlags) 419*333d2b36SAndroid Build Coastguard Worker } 420*333d2b36SAndroid Build Coastguard Worker 421*333d2b36SAndroid Build Coastguard Worker fooArm64 := result.ModuleForTests("foo", "android_arm64_armv8-a_shared") 422*333d2b36SAndroid Build Coastguard Worker fooArm64CFlags := fooArm64.Rule("cc").Args["cFlags"] 423*333d2b36SAndroid Build Coastguard Worker if w := "-fprofile-sample-use=afdo_profiles_package/foo_arm64.afdo"; !strings.Contains(fooArm64CFlags, w) { 424*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'foo' to enable afdo, but did not find %q in cflags %q", w, fooArm64CFlags) 425*333d2b36SAndroid Build Coastguard Worker } 426*333d2b36SAndroid Build Coastguard Worker} 427*333d2b36SAndroid Build Coastguard Worker 428*333d2b36SAndroid Build Coastguard Workerfunc TestMultipleAfdoRDeps(t *testing.T) { 429*333d2b36SAndroid Build Coastguard Worker t.Parallel() 430*333d2b36SAndroid Build Coastguard Worker bp := ` 431*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 432*333d2b36SAndroid Build Coastguard Worker name: "libTest", 433*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 434*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 435*333d2b36SAndroid Build Coastguard Worker afdo: true, 436*333d2b36SAndroid Build Coastguard Worker } 437*333d2b36SAndroid Build Coastguard Worker 438*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 439*333d2b36SAndroid Build Coastguard Worker name: "libBar", 440*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 441*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 442*333d2b36SAndroid Build Coastguard Worker afdo: true, 443*333d2b36SAndroid Build Coastguard Worker } 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Worker cc_library_static { 446*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 447*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 448*333d2b36SAndroid Build Coastguard Worker } 449*333d2b36SAndroid Build Coastguard Worker ` 450*333d2b36SAndroid Build Coastguard Worker 451*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 452*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFdoProfile, 453*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 454*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("afdo_profiles_package/libTest.afdo", ""), 455*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("afdo_profiles_package/libBar.afdo", ""), 456*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 457*333d2b36SAndroid Build Coastguard Worker variables.AfdoProfiles = []string{ 458*333d2b36SAndroid Build Coastguard Worker "libTest://afdo_profiles_package:libTest_afdo", 459*333d2b36SAndroid Build Coastguard Worker "libBar://afdo_profiles_package:libBar_afdo", 460*333d2b36SAndroid Build Coastguard Worker } 461*333d2b36SAndroid Build Coastguard Worker }), 462*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 463*333d2b36SAndroid Build Coastguard Worker "afdo_profiles_package/Android.bp": []byte(` 464*333d2b36SAndroid Build Coastguard Worker fdo_profile { 465*333d2b36SAndroid Build Coastguard Worker name: "libTest_afdo", 466*333d2b36SAndroid Build Coastguard Worker profile: "libTest.afdo", 467*333d2b36SAndroid Build Coastguard Worker } 468*333d2b36SAndroid Build Coastguard Worker fdo_profile { 469*333d2b36SAndroid Build Coastguard Worker name: "libBar_afdo", 470*333d2b36SAndroid Build Coastguard Worker profile: "libBar.afdo", 471*333d2b36SAndroid Build Coastguard Worker } 472*333d2b36SAndroid Build Coastguard Worker `), 473*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 474*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Worker expectedCFlagLibTest := "-fprofile-sample-use=afdo_profiles_package/libTest.afdo" 477*333d2b36SAndroid Build Coastguard Worker expectedCFlagLibBar := "-fprofile-sample-use=afdo_profiles_package/libBar.afdo" 478*333d2b36SAndroid Build Coastguard Worker 479*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 480*333d2b36SAndroid Build Coastguard Worker libFooAfdoVariantWithLibTest := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libTest") 481*333d2b36SAndroid Build Coastguard Worker 482*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_shared") 483*333d2b36SAndroid Build Coastguard Worker libFooAfdoVariantWithLibBar := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libBar") 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker // Check cFlags of afdo-enabled module and the afdo-variant of its static deps 486*333d2b36SAndroid Build Coastguard Worker cFlags := libTest.Rule("cc").Args["cFlags"] 487*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlagLibTest) { 488*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable afdo, but did not find %q in cflags %q", expectedCFlagLibTest, cFlags) 489*333d2b36SAndroid Build Coastguard Worker } 490*333d2b36SAndroid Build Coastguard Worker cFlags = libBar.Rule("cc").Args["cFlags"] 491*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlagLibBar) { 492*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable afdo, but did not find %q in cflags %q", expectedCFlagLibBar, cFlags) 493*333d2b36SAndroid Build Coastguard Worker } 494*333d2b36SAndroid Build Coastguard Worker 495*333d2b36SAndroid Build Coastguard Worker cFlags = libFooAfdoVariantWithLibTest.Rule("cc").Args["cFlags"] 496*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlagLibTest) { 497*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFooAfdoVariantWithLibTest' to enable afdo, but did not find %q in cflags %q", expectedCFlagLibTest, cFlags) 498*333d2b36SAndroid Build Coastguard Worker } 499*333d2b36SAndroid Build Coastguard Worker 500*333d2b36SAndroid Build Coastguard Worker cFlags = libFooAfdoVariantWithLibBar.Rule("cc").Args["cFlags"] 501*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlagLibBar) { 502*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBarAfdoVariant' to enable afdo, but did not find %q in cflags %q", expectedCFlagLibBar, cFlags) 503*333d2b36SAndroid Build Coastguard Worker } 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Worker // Check dependency edges of static deps 506*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest.Module(), libFooAfdoVariantWithLibTest.Module()) { 507*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on afdo variant of libFoo") 508*333d2b36SAndroid Build Coastguard Worker } 509*333d2b36SAndroid Build Coastguard Worker 510*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libBar.Module(), libFooAfdoVariantWithLibBar.Module()) { 511*333d2b36SAndroid Build Coastguard Worker t.Errorf("libFoo missing dependency on non-afdo variant of libBar") 512*333d2b36SAndroid Build Coastguard Worker } 513*333d2b36SAndroid Build Coastguard Worker} 514*333d2b36SAndroid Build Coastguard Worker 515*333d2b36SAndroid Build Coastguard Workerfunc TestAfdoDepsWithoutProfile(t *testing.T) { 516*333d2b36SAndroid Build Coastguard Worker t.Parallel() 517*333d2b36SAndroid Build Coastguard Worker bp := ` 518*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 519*333d2b36SAndroid Build Coastguard Worker name: "libTest", 520*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 521*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 522*333d2b36SAndroid Build Coastguard Worker afdo: true, 523*333d2b36SAndroid Build Coastguard Worker } 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Worker cc_library_static { 526*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 527*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 528*333d2b36SAndroid Build Coastguard Worker static_libs: ["libBar"], 529*333d2b36SAndroid Build Coastguard Worker } 530*333d2b36SAndroid Build Coastguard Worker 531*333d2b36SAndroid Build Coastguard Worker cc_library_static { 532*333d2b36SAndroid Build Coastguard Worker name: "libBar", 533*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 534*333d2b36SAndroid Build Coastguard Worker } 535*333d2b36SAndroid Build Coastguard Worker ` 536*333d2b36SAndroid Build Coastguard Worker 537*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 538*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFdoProfile, 539*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 540*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 541*333d2b36SAndroid Build Coastguard Worker 542*333d2b36SAndroid Build Coastguard Worker // Even without a profile path, the afdo enabled libraries should be built with 543*333d2b36SAndroid Build Coastguard Worker // -funique-internal-linkage-names. 544*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-funique-internal-linkage-names" 545*333d2b36SAndroid Build Coastguard Worker 546*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 547*333d2b36SAndroid Build Coastguard Worker libFooAfdoVariant := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libTest") 548*333d2b36SAndroid Build Coastguard Worker libBarAfdoVariant := result.ModuleForTests("libBar", "android_arm64_armv8-a_static_afdo-libTest") 549*333d2b36SAndroid Build Coastguard Worker 550*333d2b36SAndroid Build Coastguard Worker // Check cFlags of afdo-enabled module and the afdo-variant of its static deps 551*333d2b36SAndroid Build Coastguard Worker cFlags := libTest.Rule("cc").Args["cFlags"] 552*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 553*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable afdo, but did not find %q in cflags %q", expectedCFlag, cFlags) 554*333d2b36SAndroid Build Coastguard Worker } 555*333d2b36SAndroid Build Coastguard Worker 556*333d2b36SAndroid Build Coastguard Worker cFlags = libFooAfdoVariant.Rule("cc").Args["cFlags"] 557*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 558*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFooAfdoVariant' to enable afdo, but did not find %q in cflags %q", expectedCFlag, cFlags) 559*333d2b36SAndroid Build Coastguard Worker } 560*333d2b36SAndroid Build Coastguard Worker 561*333d2b36SAndroid Build Coastguard Worker cFlags = libBarAfdoVariant.Rule("cc").Args["cFlags"] 562*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 563*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBarAfdoVariant' to enable afdo, but did not find %q in cflags %q", expectedCFlag, cFlags) 564*333d2b36SAndroid Build Coastguard Worker } 565*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from afdo-enabled module to static deps 566*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest.Module(), libFooAfdoVariant.Module()) { 567*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on afdo variant of libFoo") 568*333d2b36SAndroid Build Coastguard Worker } 569*333d2b36SAndroid Build Coastguard Worker 570*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFooAfdoVariant.Module(), libBarAfdoVariant.Module()) { 571*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on afdo variant of libBar") 572*333d2b36SAndroid Build Coastguard Worker } 573*333d2b36SAndroid Build Coastguard Worker 574*333d2b36SAndroid Build Coastguard Worker // Verify non-afdo variant exists and doesn't contain afdo 575*333d2b36SAndroid Build Coastguard Worker libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") 576*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") 577*333d2b36SAndroid Build Coastguard Worker 578*333d2b36SAndroid Build Coastguard Worker cFlags = libFoo.Rule("cc").Args["cFlags"] 579*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 580*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFoo' to not enable afdo, but found %q in cflags %q", expectedCFlag, cFlags) 581*333d2b36SAndroid Build Coastguard Worker } 582*333d2b36SAndroid Build Coastguard Worker cFlags = libBar.Rule("cc").Args["cFlags"] 583*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 584*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBar' to not enable afdo, but found %q in cflags %q", expectedCFlag, cFlags) 585*333d2b36SAndroid Build Coastguard Worker } 586*333d2b36SAndroid Build Coastguard Worker 587*333d2b36SAndroid Build Coastguard Worker // Check dependency edges of static deps 588*333d2b36SAndroid Build Coastguard Worker if hasDirectDep(result, libTest.Module(), libFoo.Module()) { 589*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest should not depend on non-afdo variant of libFoo") 590*333d2b36SAndroid Build Coastguard Worker } 591*333d2b36SAndroid Build Coastguard Worker 592*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFoo.Module(), libBar.Module()) { 593*333d2b36SAndroid Build Coastguard Worker t.Errorf("libFoo missing dependency on non-afdo variant of libBar") 594*333d2b36SAndroid Build Coastguard Worker } 595*333d2b36SAndroid Build Coastguard Worker} 596