xref: /aosp_15_r20/build/soong/cc/afdo_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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