1*333d2b36SAndroid Build Coastguard Worker// Copyright 2023 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 "strings" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfileSharedLibrary(t *testing.T) { 25*333d2b36SAndroid Build Coastguard Worker t.Parallel() 26*333d2b36SAndroid Build Coastguard Worker bp := ` 27*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 28*333d2b36SAndroid Build Coastguard Worker name: "libTest", 29*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 30*333d2b36SAndroid Build Coastguard Worker orderfile : { 31*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 32*333d2b36SAndroid Build Coastguard Worker load_order_file: false, 33*333d2b36SAndroid Build Coastguard Worker order_file_path: "", 34*333d2b36SAndroid Build Coastguard Worker }, 35*333d2b36SAndroid Build Coastguard Worker } 36*333d2b36SAndroid Build Coastguard Worker ` 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 39*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 40*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-forder-file-instrumentation" 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker // Check cFlags of orderfile-enabled module 47*333d2b36SAndroid Build Coastguard Worker cFlags := libTest.Rule("cc").Args["cFlags"] 48*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 49*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags) 50*333d2b36SAndroid Build Coastguard Worker } 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker // Check ldFlags of orderfile-enabled module 53*333d2b36SAndroid Build Coastguard Worker ldFlags := libTest.Rule("ld").Args["ldFlags"] 54*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, expectedCFlag) { 55*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags) 56*333d2b36SAndroid Build Coastguard Worker } 57*333d2b36SAndroid Build Coastguard Worker} 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileLoadSharedLibrary(t *testing.T) { 60*333d2b36SAndroid Build Coastguard Worker t.Parallel() 61*333d2b36SAndroid Build Coastguard Worker bp := ` 62*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 63*333d2b36SAndroid Build Coastguard Worker name: "libTest", 64*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 65*333d2b36SAndroid Build Coastguard Worker orderfile : { 66*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 67*333d2b36SAndroid Build Coastguard Worker load_order_file: true, 68*333d2b36SAndroid Build Coastguard Worker order_file_path: "libTest.orderfile", 69*333d2b36SAndroid Build Coastguard Worker }, 70*333d2b36SAndroid Build Coastguard Worker } 71*333d2b36SAndroid Build Coastguard Worker ` 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 74*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 75*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("toolchain/pgo-profiles/orderfiles/libTest.orderfile", "TEST"), 76*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/libTest.orderfile" 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker // Check ldFlags of orderfile-enabled module 83*333d2b36SAndroid Build Coastguard Worker ldFlags := libTest.Rule("ld").Args["ldFlags"] 84*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, expectedCFlag) { 85*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to load orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags) 86*333d2b36SAndroid Build Coastguard Worker } 87*333d2b36SAndroid Build Coastguard Worker} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfileBinary(t *testing.T) { 90*333d2b36SAndroid Build Coastguard Worker t.Parallel() 91*333d2b36SAndroid Build Coastguard Worker bp := ` 92*333d2b36SAndroid Build Coastguard Worker cc_binary { 93*333d2b36SAndroid Build Coastguard Worker name: "test", 94*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 95*333d2b36SAndroid Build Coastguard Worker orderfile : { 96*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 97*333d2b36SAndroid Build Coastguard Worker load_order_file: false, 98*333d2b36SAndroid Build Coastguard Worker order_file_path: "", 99*333d2b36SAndroid Build Coastguard Worker }, 100*333d2b36SAndroid Build Coastguard Worker } 101*333d2b36SAndroid Build Coastguard Worker ` 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 104*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 105*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-forder-file-instrumentation" 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker test := result.ModuleForTests("test", "android_arm64_armv8-a") 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker // Check cFlags of orderfile-enabled module 112*333d2b36SAndroid Build Coastguard Worker cFlags := test.Rule("cc").Args["cFlags"] 113*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 114*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'test' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags) 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker // Check ldFlags of orderfile-enabled module 118*333d2b36SAndroid Build Coastguard Worker ldFlags := test.Rule("ld").Args["ldFlags"] 119*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, expectedCFlag) { 120*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'test' to enable orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags) 121*333d2b36SAndroid Build Coastguard Worker } 122*333d2b36SAndroid Build Coastguard Worker} 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileLoadBinary(t *testing.T) { 125*333d2b36SAndroid Build Coastguard Worker t.Parallel() 126*333d2b36SAndroid Build Coastguard Worker bp := ` 127*333d2b36SAndroid Build Coastguard Worker cc_binary { 128*333d2b36SAndroid Build Coastguard Worker name: "test", 129*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 130*333d2b36SAndroid Build Coastguard Worker orderfile : { 131*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 132*333d2b36SAndroid Build Coastguard Worker load_order_file: true, 133*333d2b36SAndroid Build Coastguard Worker order_file_path: "test.orderfile", 134*333d2b36SAndroid Build Coastguard Worker }, 135*333d2b36SAndroid Build Coastguard Worker } 136*333d2b36SAndroid Build Coastguard Worker ` 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 139*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 140*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("toolchain/pgo-profiles/orderfiles/test.orderfile", "TEST"), 141*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/test.orderfile" 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker test := result.ModuleForTests("test", "android_arm64_armv8-a") 146*333d2b36SAndroid Build Coastguard Worker 147*333d2b36SAndroid Build Coastguard Worker // Check ldFlags of orderfile-enabled module 148*333d2b36SAndroid Build Coastguard Worker ldFlags := test.Rule("ld").Args["ldFlags"] 149*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, expectedCFlag) { 150*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'test' to load orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags) 151*333d2b36SAndroid Build Coastguard Worker } 152*333d2b36SAndroid Build Coastguard Worker} 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker// Profile flags should propagate through static libraries 155*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfilePropagateStaticDeps(t *testing.T) { 156*333d2b36SAndroid Build Coastguard Worker t.Parallel() 157*333d2b36SAndroid Build Coastguard Worker bp := ` 158*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 159*333d2b36SAndroid Build Coastguard Worker name: "libTest", 160*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 161*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 162*333d2b36SAndroid Build Coastguard Worker orderfile : { 163*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 164*333d2b36SAndroid Build Coastguard Worker load_order_file: false, 165*333d2b36SAndroid Build Coastguard Worker order_file_path: "", 166*333d2b36SAndroid Build Coastguard Worker }, 167*333d2b36SAndroid Build Coastguard Worker } 168*333d2b36SAndroid Build Coastguard Worker 169*333d2b36SAndroid Build Coastguard Worker cc_library_static { 170*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 171*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 172*333d2b36SAndroid Build Coastguard Worker static_libs: ["libBar"], 173*333d2b36SAndroid Build Coastguard Worker } 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Worker cc_library_static { 176*333d2b36SAndroid Build Coastguard Worker name: "libBar", 177*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 178*333d2b36SAndroid Build Coastguard Worker } 179*333d2b36SAndroid Build Coastguard Worker ` 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 182*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 183*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-forder-file-instrumentation" 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Worker // Check cFlags of orderfile-enabled module 188*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker cFlags := libTest.Rule("cc").Args["cFlags"] 191*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 192*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags) 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker 195*333d2b36SAndroid Build Coastguard Worker // Check cFlags of orderfile variant static libraries 196*333d2b36SAndroid Build Coastguard Worker libFooOfVariant := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_orderfile") 197*333d2b36SAndroid Build Coastguard Worker libBarOfVariant := result.ModuleForTests("libBar", "android_arm64_armv8-a_static_orderfile") 198*333d2b36SAndroid Build Coastguard Worker 199*333d2b36SAndroid Build Coastguard Worker cFlags = libFooOfVariant.Rule("cc").Args["cFlags"] 200*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 201*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFooOfVariant' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags) 202*333d2b36SAndroid Build Coastguard Worker } 203*333d2b36SAndroid Build Coastguard Worker 204*333d2b36SAndroid Build Coastguard Worker cFlags = libBarOfVariant.Rule("cc").Args["cFlags"] 205*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 206*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBarOfVariant' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags) 207*333d2b36SAndroid Build Coastguard Worker } 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from orderfile-enabled module to orderfile variant static libraries 210*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest.Module(), libFooOfVariant.Module()) { 211*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on orderfile variant of libFoo") 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFooOfVariant.Module(), libBarOfVariant.Module()) { 215*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on orderfile variant of libBar") 216*333d2b36SAndroid Build Coastguard Worker } 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Worker // Check cFlags of the non-orderfile variant static libraries 219*333d2b36SAndroid Build Coastguard Worker libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") 220*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker cFlags = libFoo.Rule("cc").Args["cFlags"] 223*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 224*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFoo' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags) 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker cFlags = libBar.Rule("cc").Args["cFlags"] 228*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 229*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBar' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags) 230*333d2b36SAndroid Build Coastguard Worker } 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Worker // Check no dependency edge from orderfile-enabled module to non-orderfile variant static libraries 233*333d2b36SAndroid Build Coastguard Worker if hasDirectDep(result, libTest.Module(), libFoo.Module()) { 234*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest has dependency on non-orderfile variant of libFoo") 235*333d2b36SAndroid Build Coastguard Worker } 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFoo.Module(), libBar.Module()) { 238*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest has dependency on non-orderfile variant of libBar") 239*333d2b36SAndroid Build Coastguard Worker } 240*333d2b36SAndroid Build Coastguard Worker} 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker// Load flags should never propagate 243*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileLoadPropagateStaticDeps(t *testing.T) { 244*333d2b36SAndroid Build Coastguard Worker t.Parallel() 245*333d2b36SAndroid Build Coastguard Worker bp := ` 246*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 247*333d2b36SAndroid Build Coastguard Worker name: "libTest", 248*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 249*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 250*333d2b36SAndroid Build Coastguard Worker orderfile : { 251*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 252*333d2b36SAndroid Build Coastguard Worker load_order_file: true, 253*333d2b36SAndroid Build Coastguard Worker order_file_path: "test.orderfile", 254*333d2b36SAndroid Build Coastguard Worker }, 255*333d2b36SAndroid Build Coastguard Worker } 256*333d2b36SAndroid Build Coastguard Worker 257*333d2b36SAndroid Build Coastguard Worker cc_library_static { 258*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 259*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 260*333d2b36SAndroid Build Coastguard Worker static_libs: ["libBar"], 261*333d2b36SAndroid Build Coastguard Worker } 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Worker cc_library_static { 264*333d2b36SAndroid Build Coastguard Worker name: "libBar", 265*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 266*333d2b36SAndroid Build Coastguard Worker } 267*333d2b36SAndroid Build Coastguard Worker ` 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 270*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 271*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("toolchain/pgo-profiles/orderfiles/test.orderfile", "TEST"), 272*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/test.orderfile" 275*333d2b36SAndroid Build Coastguard Worker 276*333d2b36SAndroid Build Coastguard Worker // Check ldFlags of orderfile-enabled module 277*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 278*333d2b36SAndroid Build Coastguard Worker 279*333d2b36SAndroid Build Coastguard Worker ldFlags := libTest.Rule("ld").Args["ldFlags"] 280*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(ldFlags, expectedCFlag) { 281*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to load orderfile, but did not find %q in ldFlags %q", expectedCFlag, ldFlags) 282*333d2b36SAndroid Build Coastguard Worker } 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") 285*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from orderfile-enabled module to non-orderfile variant static libraries 288*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest.Module(), libFoo.Module()) { 289*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on non-orderfile variant of libFoo") 290*333d2b36SAndroid Build Coastguard Worker } 291*333d2b36SAndroid Build Coastguard Worker 292*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFoo.Module(), libBar.Module()) { 293*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on non-orderfile variant of libBar") 294*333d2b36SAndroid Build Coastguard Worker } 295*333d2b36SAndroid Build Coastguard Worker 296*333d2b36SAndroid Build Coastguard Worker // Make sure no orderfile variants are created for static libraries because the flags were not propagated 297*333d2b36SAndroid Build Coastguard Worker libFooVariants := result.ModuleVariantsForTests("libFoo") 298*333d2b36SAndroid Build Coastguard Worker for _, v := range libFooVariants { 299*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "orderfile") { 300*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected variants for 'libFoo' to not contain 'orderfile', but found %q", v) 301*333d2b36SAndroid Build Coastguard Worker } 302*333d2b36SAndroid Build Coastguard Worker } 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker libBarVariants := result.ModuleVariantsForTests("libBar") 305*333d2b36SAndroid Build Coastguard Worker for _, v := range libBarVariants { 306*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "orderfile") { 307*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected variants for 'libBar' to not contain 'orderfile', but found %q", v) 308*333d2b36SAndroid Build Coastguard Worker } 309*333d2b36SAndroid Build Coastguard Worker } 310*333d2b36SAndroid Build Coastguard Worker} 311*333d2b36SAndroid Build Coastguard Worker 312*333d2b36SAndroid Build Coastguard Worker// Profile flags should not propagate through shared libraries 313*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfilePropagateSharedDeps(t *testing.T) { 314*333d2b36SAndroid Build Coastguard Worker t.Parallel() 315*333d2b36SAndroid Build Coastguard Worker bp := ` 316*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 317*333d2b36SAndroid Build Coastguard Worker name: "libTest", 318*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 319*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libFoo"], 320*333d2b36SAndroid Build Coastguard Worker orderfile : { 321*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 322*333d2b36SAndroid Build Coastguard Worker load_order_file: false, 323*333d2b36SAndroid Build Coastguard Worker order_file_path: "", 324*333d2b36SAndroid Build Coastguard Worker }, 325*333d2b36SAndroid Build Coastguard Worker } 326*333d2b36SAndroid Build Coastguard Worker 327*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 328*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 329*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 330*333d2b36SAndroid Build Coastguard Worker static_libs: ["libBar"], 331*333d2b36SAndroid Build Coastguard Worker } 332*333d2b36SAndroid Build Coastguard Worker 333*333d2b36SAndroid Build Coastguard Worker cc_library_static { 334*333d2b36SAndroid Build Coastguard Worker name: "libBar", 335*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 336*333d2b36SAndroid Build Coastguard Worker } 337*333d2b36SAndroid Build Coastguard Worker ` 338*333d2b36SAndroid Build Coastguard Worker 339*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 340*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 341*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 342*333d2b36SAndroid Build Coastguard Worker 343*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-forder-file-instrumentation" 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker // Check cFlags of orderfile-enabled module 346*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker cFlags := libTest.Rule("cc").Args["cFlags"] 349*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, expectedCFlag) { 350*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags) 351*333d2b36SAndroid Build Coastguard Worker } 352*333d2b36SAndroid Build Coastguard Worker 353*333d2b36SAndroid Build Coastguard Worker // Check cFlags of the static and shared libraries 354*333d2b36SAndroid Build Coastguard Worker libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_shared") 355*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") 356*333d2b36SAndroid Build Coastguard Worker 357*333d2b36SAndroid Build Coastguard Worker cFlags = libFoo.Rule("cc").Args["cFlags"] 358*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 359*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFoo' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags) 360*333d2b36SAndroid Build Coastguard Worker } 361*333d2b36SAndroid Build Coastguard Worker 362*333d2b36SAndroid Build Coastguard Worker cFlags = libBar.Rule("cc").Args["cFlags"] 363*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 364*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBar' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags) 365*333d2b36SAndroid Build Coastguard Worker } 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from orderfile-enabled module to non-orderfile variant static libraries 368*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest.Module(), libFoo.Module()) { 369*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on non-orderfile variant of libFoo") 370*333d2b36SAndroid Build Coastguard Worker } 371*333d2b36SAndroid Build Coastguard Worker 372*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFoo.Module(), libBar.Module()) { 373*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on non-orderfile variant of libBar") 374*333d2b36SAndroid Build Coastguard Worker } 375*333d2b36SAndroid Build Coastguard Worker 376*333d2b36SAndroid Build Coastguard Worker // Make sure no orderfile variants are created for libraries because the flags were not propagated 377*333d2b36SAndroid Build Coastguard Worker libFooVariants := result.ModuleVariantsForTests("libFoo") 378*333d2b36SAndroid Build Coastguard Worker for _, v := range libFooVariants { 379*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "orderfile") { 380*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected variants for 'libFoo' to not contain 'orderfile', but found %q", v) 381*333d2b36SAndroid Build Coastguard Worker } 382*333d2b36SAndroid Build Coastguard Worker } 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Worker libBarVariants := result.ModuleVariantsForTests("libBar") 385*333d2b36SAndroid Build Coastguard Worker for _, v := range libBarVariants { 386*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "orderfile") { 387*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected variants for 'libBar' to not contain 'orderfile', but found %q", v) 388*333d2b36SAndroid Build Coastguard Worker } 389*333d2b36SAndroid Build Coastguard Worker } 390*333d2b36SAndroid Build Coastguard Worker} 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Worker// Profile flags should not work or be propagated if orderfile flags start at a static library 393*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfileStaticLibrary(t *testing.T) { 394*333d2b36SAndroid Build Coastguard Worker t.Parallel() 395*333d2b36SAndroid Build Coastguard Worker bp := ` 396*333d2b36SAndroid Build Coastguard Worker cc_library_static { 397*333d2b36SAndroid Build Coastguard Worker name: "libTest", 398*333d2b36SAndroid Build Coastguard Worker srcs: ["test.c"], 399*333d2b36SAndroid Build Coastguard Worker static_libs: ["libFoo"], 400*333d2b36SAndroid Build Coastguard Worker orderfile : { 401*333d2b36SAndroid Build Coastguard Worker instrumentation: true, 402*333d2b36SAndroid Build Coastguard Worker load_order_file: false, 403*333d2b36SAndroid Build Coastguard Worker order_file_path: "", 404*333d2b36SAndroid Build Coastguard Worker }, 405*333d2b36SAndroid Build Coastguard Worker } 406*333d2b36SAndroid Build Coastguard Worker 407*333d2b36SAndroid Build Coastguard Worker cc_library_static { 408*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 409*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 410*333d2b36SAndroid Build Coastguard Worker static_libs: ["libBar"], 411*333d2b36SAndroid Build Coastguard Worker } 412*333d2b36SAndroid Build Coastguard Worker 413*333d2b36SAndroid Build Coastguard Worker cc_library_static { 414*333d2b36SAndroid Build Coastguard Worker name: "libBar", 415*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 416*333d2b36SAndroid Build Coastguard Worker } 417*333d2b36SAndroid Build Coastguard Worker ` 418*333d2b36SAndroid Build Coastguard Worker 419*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 420*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 421*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Worker expectedCFlag := "-forder-file-instrumentation" 424*333d2b36SAndroid Build Coastguard Worker 425*333d2b36SAndroid Build Coastguard Worker // Check cFlags of module 426*333d2b36SAndroid Build Coastguard Worker libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_static") 427*333d2b36SAndroid Build Coastguard Worker 428*333d2b36SAndroid Build Coastguard Worker cFlags := libTest.Rule("cc").Args["cFlags"] 429*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 430*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libTest' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags) 431*333d2b36SAndroid Build Coastguard Worker } 432*333d2b36SAndroid Build Coastguard Worker 433*333d2b36SAndroid Build Coastguard Worker // Check cFlags of the static libraries 434*333d2b36SAndroid Build Coastguard Worker libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") 435*333d2b36SAndroid Build Coastguard Worker libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") 436*333d2b36SAndroid Build Coastguard Worker 437*333d2b36SAndroid Build Coastguard Worker cFlags = libFoo.Rule("cc").Args["cFlags"] 438*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 439*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libFoo' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags) 440*333d2b36SAndroid Build Coastguard Worker } 441*333d2b36SAndroid Build Coastguard Worker 442*333d2b36SAndroid Build Coastguard Worker cFlags = libBar.Rule("cc").Args["cFlags"] 443*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags, expectedCFlag) { 444*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 'libBar' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags) 445*333d2b36SAndroid Build Coastguard Worker } 446*333d2b36SAndroid Build Coastguard Worker 447*333d2b36SAndroid Build Coastguard Worker // Check dependency edge from orderfile-enabled module to non-orderfile variant libraries 448*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libTest.Module(), libFoo.Module()) { 449*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on non-orderfile variant of libFoo") 450*333d2b36SAndroid Build Coastguard Worker } 451*333d2b36SAndroid Build Coastguard Worker 452*333d2b36SAndroid Build Coastguard Worker if !hasDirectDep(result, libFoo.Module(), libBar.Module()) { 453*333d2b36SAndroid Build Coastguard Worker t.Errorf("libTest missing dependency on non-orderfile variant of libBar") 454*333d2b36SAndroid Build Coastguard Worker } 455*333d2b36SAndroid Build Coastguard Worker 456*333d2b36SAndroid Build Coastguard Worker // Make sure no orderfile variants are created for static libraries because the flags were not propagated 457*333d2b36SAndroid Build Coastguard Worker libFooVariants := result.ModuleVariantsForTests("libFoo") 458*333d2b36SAndroid Build Coastguard Worker for _, v := range libFooVariants { 459*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "orderfile") { 460*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected variants for 'libFoo' to not contain 'orderfile', but found %q", v) 461*333d2b36SAndroid Build Coastguard Worker } 462*333d2b36SAndroid Build Coastguard Worker } 463*333d2b36SAndroid Build Coastguard Worker 464*333d2b36SAndroid Build Coastguard Worker libBarVariants := result.ModuleVariantsForTests("libBar") 465*333d2b36SAndroid Build Coastguard Worker for _, v := range libBarVariants { 466*333d2b36SAndroid Build Coastguard Worker if strings.Contains(v, "orderfile") { 467*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected variants for 'libBar' to not contain 'orderfile', but found %q", v) 468*333d2b36SAndroid Build Coastguard Worker } 469*333d2b36SAndroid Build Coastguard Worker } 470*333d2b36SAndroid Build Coastguard Worker} 471