1*795d594fSAndroid Build Coastguard Worker// Copyright (C) 2016 The Android Open Source Project 2*795d594fSAndroid Build Coastguard Worker// 3*795d594fSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*795d594fSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*795d594fSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*795d594fSAndroid Build Coastguard Worker// 7*795d594fSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*795d594fSAndroid Build Coastguard Worker// 9*795d594fSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*795d594fSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*795d594fSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*795d594fSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*795d594fSAndroid Build Coastguard Worker// limitations under the License. 14*795d594fSAndroid Build Coastguard Worker 15*795d594fSAndroid Build Coastguard Workerpackage art 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Workerimport ( 18*795d594fSAndroid Build Coastguard Worker "fmt" 19*795d594fSAndroid Build Coastguard Worker "path/filepath" 20*795d594fSAndroid Build Coastguard Worker "strings" 21*795d594fSAndroid Build Coastguard Worker "sync" 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker "android/soong/android" 26*795d594fSAndroid Build Coastguard Worker "android/soong/cc" 27*795d594fSAndroid Build Coastguard Worker "android/soong/cc/config" 28*795d594fSAndroid Build Coastguard Worker) 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Workervar supportedArches = []string{"arm", "arm64", "riscv64", "x86", "x86_64"} 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Workerfunc globalFlags(ctx android.LoadHookContext) ([]string, []string) { 33*795d594fSAndroid Build Coastguard Worker var cflags []string 34*795d594fSAndroid Build Coastguard Worker var asflags []string 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker opt := ctx.Config().GetenvWithDefault("ART_NDEBUG_OPT_FLAG", "-O3") 37*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, opt) 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker tlab := false 40*795d594fSAndroid Build Coastguard Worker gcType := ctx.Config().GetenvWithDefault("ART_DEFAULT_GC_TYPE", "CMC") 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_TEST_DEBUG_GC") { 43*795d594fSAndroid Build Coastguard Worker gcType = "SS" 44*795d594fSAndroid Build Coastguard Worker tlab = true 45*795d594fSAndroid Build Coastguard Worker } 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_DEFAULT_GC_TYPE_IS_"+gcType) 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_HEAP_POISONING") { 50*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_HEAP_POISONING=1") 51*795d594fSAndroid Build Coastguard Worker asflags = append(asflags, "-DART_HEAP_POISONING=1") 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_USE_CXX_INTERPRETER") { 54*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_USE_CXX_INTERPRETER=1") 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker 57*795d594fSAndroid Build Coastguard Worker if !ctx.Config().IsEnvFalse("ART_USE_READ_BARRIER") && ctx.Config().ArtUseReadBarrier() { 58*795d594fSAndroid Build Coastguard Worker // Used to change the read barrier type. Valid values are BAKER, TABLELOOKUP. 59*795d594fSAndroid Build Coastguard Worker // The default is BAKER. 60*795d594fSAndroid Build Coastguard Worker barrierType := ctx.Config().GetenvWithDefault("ART_READ_BARRIER_TYPE", "BAKER") 61*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, 62*795d594fSAndroid Build Coastguard Worker "-DART_USE_READ_BARRIER=1", 63*795d594fSAndroid Build Coastguard Worker "-DART_READ_BARRIER_TYPE_IS_"+barrierType+"=1") 64*795d594fSAndroid Build Coastguard Worker asflags = append(asflags, 65*795d594fSAndroid Build Coastguard Worker "-DART_USE_READ_BARRIER=1", 66*795d594fSAndroid Build Coastguard Worker "-DART_READ_BARRIER_TYPE_IS_"+barrierType+"=1") 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker if !ctx.Config().IsEnvFalse("ART_USE_GENERATIONAL_CC") { 69*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_USE_GENERATIONAL_CC=1") 70*795d594fSAndroid Build Coastguard Worker } 71*795d594fSAndroid Build Coastguard Worker // Force CC only if ART_USE_READ_BARRIER was set to true explicitly during 72*795d594fSAndroid Build Coastguard Worker // build time. 73*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_USE_READ_BARRIER") { 74*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_FORCE_USE_READ_BARRIER=1") 75*795d594fSAndroid Build Coastguard Worker } 76*795d594fSAndroid Build Coastguard Worker tlab = true 77*795d594fSAndroid Build Coastguard Worker } else if gcType == "CMC" { 78*795d594fSAndroid Build Coastguard Worker tlab = true 79*795d594fSAndroid Build Coastguard Worker } 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker if tlab { 82*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_USE_TLAB=1") 83*795d594fSAndroid Build Coastguard Worker } 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_FORCE_TRY_PREDICATED_SIMD") { 86*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_FORCE_TRY_PREDICATED_SIMD=1") 87*795d594fSAndroid Build Coastguard Worker } 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker // We need larger stack overflow guards for ASAN, as the compiled code will have 90*795d594fSAndroid Build Coastguard Worker // larger frame sizes. For simplicity, just use global not-target-specific cflags. 91*795d594fSAndroid Build Coastguard Worker // Note: We increase this for both debug and non-debug, as the overflow gap will 92*795d594fSAndroid Build Coastguard Worker // be compiled into managed code. We always preopt (and build core images) with 93*795d594fSAndroid Build Coastguard Worker // the debug version. So make the gap consistent (and adjust for the worst). 94*795d594fSAndroid Build Coastguard Worker if len(ctx.Config().SanitizeDevice()) > 0 || len(ctx.Config().SanitizeHost()) > 0 { 95*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, 96*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_arm=16384", 97*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_arm64=16384", 98*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_riscv64=16384", 99*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_x86=16384", 100*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_x86_64=20480") 101*795d594fSAndroid Build Coastguard Worker } else { 102*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, 103*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_arm=8192", 104*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_arm64=8192", 105*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_riscv64=8192", 106*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_x86=8192", 107*795d594fSAndroid Build Coastguard Worker "-DART_STACK_OVERFLOW_GAP_x86_64=8192") 108*795d594fSAndroid Build Coastguard Worker } 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Worker // This was originally coupled to targets, with the no bionic page size 111*795d594fSAndroid Build Coastguard Worker // macro. However, we want all devices to have the same layout for Art 112*795d594fSAndroid Build Coastguard Worker // targets. This is important to share optimizations across devices as 113*795d594fSAndroid Build Coastguard Worker // well as to make sure all test configurations are consistent (Android 114*795d594fSAndroid Build Coastguard Worker // shares tests between targets, and tests built with this option will 115*795d594fSAndroid Build Coastguard Worker // only work on devices with this option. 116*795d594fSAndroid Build Coastguard Worker // Previously contingent on ctx.Config().NoBionicPageSizeMacro() 117*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_PAGE_SIZE_AGNOSTIC=1") 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_ENABLE_ADDRESS_SANITIZER") { 120*795d594fSAndroid Build Coastguard Worker // Used to enable full sanitization, i.e., user poisoning, under ASAN. 121*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_ENABLE_ADDRESS_SANITIZER=1") 122*795d594fSAndroid Build Coastguard Worker asflags = append(asflags, "-DART_ENABLE_ADDRESS_SANITIZER=1") 123*795d594fSAndroid Build Coastguard Worker } 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker if !ctx.Config().IsEnvFalse("USE_D8_DESUGAR") { 126*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DUSE_D8_DESUGAR=1") 127*795d594fSAndroid Build Coastguard Worker } 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker return cflags, asflags 130*795d594fSAndroid Build Coastguard Worker} 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Workerfunc deviceFlags(ctx android.LoadHookContext) []string { 133*795d594fSAndroid Build Coastguard Worker var cflags []string 134*795d594fSAndroid Build Coastguard Worker deviceFrameSizeLimit := 1744 135*795d594fSAndroid Build Coastguard Worker if len(ctx.Config().SanitizeDevice()) > 0 { 136*795d594fSAndroid Build Coastguard Worker deviceFrameSizeLimit = 7400 137*795d594fSAndroid Build Coastguard Worker } 138*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, 139*795d594fSAndroid Build Coastguard Worker fmt.Sprintf("-Wframe-larger-than=%d", deviceFrameSizeLimit), 140*795d594fSAndroid Build Coastguard Worker fmt.Sprintf("-DART_FRAME_SIZE_LIMIT=%d", deviceFrameSizeLimit), 141*795d594fSAndroid Build Coastguard Worker ) 142*795d594fSAndroid Build Coastguard Worker 143*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_BASE_ADDRESS="+ctx.Config().LibartImgDeviceBaseAddress()) 144*795d594fSAndroid Build Coastguard Worker minDelta := ctx.Config().GetenvWithDefault("LIBART_IMG_TARGET_MIN_BASE_ADDRESS_DELTA", "(-0x1000000)") 145*795d594fSAndroid Build Coastguard Worker maxDelta := ctx.Config().GetenvWithDefault("LIBART_IMG_TARGET_MAX_BASE_ADDRESS_DELTA", "0x1000000") 146*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_BASE_ADDRESS_MIN_DELTA="+minDelta) 147*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_BASE_ADDRESS_MAX_DELTA="+maxDelta) 148*795d594fSAndroid Build Coastguard Worker 149*795d594fSAndroid Build Coastguard Worker return cflags 150*795d594fSAndroid Build Coastguard Worker} 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Workerfunc hostFlags(ctx android.LoadHookContext) []string { 153*795d594fSAndroid Build Coastguard Worker var cflags []string 154*795d594fSAndroid Build Coastguard Worker hostFrameSizeLimit := 1744 155*795d594fSAndroid Build Coastguard Worker if len(ctx.Config().SanitizeHost()) > 0 { 156*795d594fSAndroid Build Coastguard Worker // art/test/137-cfi/cfi.cc 157*795d594fSAndroid Build Coastguard Worker // error: stack frame size of 1944 bytes in function 'Java_Main_unwindInProcess' 158*795d594fSAndroid Build Coastguard Worker // b/249586057, need larger stack frame for newer clang compilers 159*795d594fSAndroid Build Coastguard Worker hostFrameSizeLimit = 10000 160*795d594fSAndroid Build Coastguard Worker // cannot add "-fsanitize-address-use-after-return=never" everywhere, 161*795d594fSAndroid Build Coastguard Worker // or some file like compiler_driver.o can have stack frame of 30072 bytes. 162*795d594fSAndroid Build Coastguard Worker // cflags = append(cflags, "-fsanitize-address-use-after-return=never") 163*795d594fSAndroid Build Coastguard Worker } 164*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, 165*795d594fSAndroid Build Coastguard Worker fmt.Sprintf("-Wframe-larger-than=%d", hostFrameSizeLimit), 166*795d594fSAndroid Build Coastguard Worker fmt.Sprintf("-DART_FRAME_SIZE_LIMIT=%d", hostFrameSizeLimit), 167*795d594fSAndroid Build Coastguard Worker ) 168*795d594fSAndroid Build Coastguard Worker 169*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_BASE_ADDRESS="+ctx.Config().LibartImgHostBaseAddress()) 170*795d594fSAndroid Build Coastguard Worker minDelta := ctx.Config().GetenvWithDefault("LIBART_IMG_HOST_MIN_BASE_ADDRESS_DELTA", "(-0x1000000)") 171*795d594fSAndroid Build Coastguard Worker maxDelta := ctx.Config().GetenvWithDefault("LIBART_IMG_HOST_MAX_BASE_ADDRESS_DELTA", "0x1000000") 172*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_BASE_ADDRESS_MIN_DELTA="+minDelta) 173*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_BASE_ADDRESS_MAX_DELTA="+maxDelta) 174*795d594fSAndroid Build Coastguard Worker 175*795d594fSAndroid Build Coastguard Worker if len(ctx.Config().SanitizeHost()) > 0 && !ctx.Config().IsEnvFalse("ART_ENABLE_ADDRESS_SANITIZER") { 176*795d594fSAndroid Build Coastguard Worker // We enable full sanitization on the host by default. 177*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, "-DART_ENABLE_ADDRESS_SANITIZER=1") 178*795d594fSAndroid Build Coastguard Worker } 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker clang_path := filepath.Join(config.ClangDefaultBase, ctx.Config().PrebuiltOS(), config.ClangDefaultVersion) 181*795d594fSAndroid Build Coastguard Worker cflags = append(cflags, fmt.Sprintf("-DART_CLANG_PATH=\"%s\"", clang_path)) 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker return cflags 184*795d594fSAndroid Build Coastguard Worker} 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Workerfunc globalDefaults(ctx android.LoadHookContext) { 187*795d594fSAndroid Build Coastguard Worker type props struct { 188*795d594fSAndroid Build Coastguard Worker Target struct { 189*795d594fSAndroid Build Coastguard Worker Android struct { 190*795d594fSAndroid Build Coastguard Worker Cflags []string 191*795d594fSAndroid Build Coastguard Worker } 192*795d594fSAndroid Build Coastguard Worker Host struct { 193*795d594fSAndroid Build Coastguard Worker Cflags []string 194*795d594fSAndroid Build Coastguard Worker } 195*795d594fSAndroid Build Coastguard Worker } 196*795d594fSAndroid Build Coastguard Worker Cflags []string 197*795d594fSAndroid Build Coastguard Worker Asflags []string 198*795d594fSAndroid Build Coastguard Worker Sanitize struct { 199*795d594fSAndroid Build Coastguard Worker Recover []string 200*795d594fSAndroid Build Coastguard Worker } 201*795d594fSAndroid Build Coastguard Worker } 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker p := &props{} 204*795d594fSAndroid Build Coastguard Worker p.Cflags, p.Asflags = globalFlags(ctx) 205*795d594fSAndroid Build Coastguard Worker p.Target.Android.Cflags = deviceFlags(ctx) 206*795d594fSAndroid Build Coastguard Worker p.Target.Host.Cflags = hostFlags(ctx) 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_DEX_FILE_ACCESS_TRACKING") { 209*795d594fSAndroid Build Coastguard Worker p.Cflags = append(p.Cflags, "-DART_DEX_FILE_ACCESS_TRACKING") 210*795d594fSAndroid Build Coastguard Worker p.Sanitize.Recover = []string{ 211*795d594fSAndroid Build Coastguard Worker "address", 212*795d594fSAndroid Build Coastguard Worker } 213*795d594fSAndroid Build Coastguard Worker } 214*795d594fSAndroid Build Coastguard Worker 215*795d594fSAndroid Build Coastguard Worker ctx.AppendProperties(p) 216*795d594fSAndroid Build Coastguard Worker} 217*795d594fSAndroid Build Coastguard Worker 218*795d594fSAndroid Build Coastguard Worker// Hook that adds flags that are implicit for all cc_art_* modules. 219*795d594fSAndroid Build Coastguard Workerfunc addImplicitFlags(ctx android.LoadHookContext) { 220*795d594fSAndroid Build Coastguard Worker type props struct { 221*795d594fSAndroid Build Coastguard Worker Target struct { 222*795d594fSAndroid Build Coastguard Worker Android struct { 223*795d594fSAndroid Build Coastguard Worker Cflags []string 224*795d594fSAndroid Build Coastguard Worker } 225*795d594fSAndroid Build Coastguard Worker } 226*795d594fSAndroid Build Coastguard Worker } 227*795d594fSAndroid Build Coastguard Worker 228*795d594fSAndroid Build Coastguard Worker p := &props{} 229*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("ART_TARGET_LINUX") { 230*795d594fSAndroid Build Coastguard Worker p.Target.Android.Cflags = []string{"-DART_TARGET", "-DART_TARGET_LINUX"} 231*795d594fSAndroid Build Coastguard Worker } else { 232*795d594fSAndroid Build Coastguard Worker p.Target.Android.Cflags = []string{"-DART_TARGET", "-DART_TARGET_ANDROID"} 233*795d594fSAndroid Build Coastguard Worker } 234*795d594fSAndroid Build Coastguard Worker 235*795d594fSAndroid Build Coastguard Worker ctx.AppendProperties(p) 236*795d594fSAndroid Build Coastguard Worker} 237*795d594fSAndroid Build Coastguard Worker 238*795d594fSAndroid Build Coastguard Workerfunc customLinker(ctx android.LoadHookContext) { 239*795d594fSAndroid Build Coastguard Worker linker := ctx.Config().Getenv("CUSTOM_TARGET_LINKER") 240*795d594fSAndroid Build Coastguard Worker type props struct { 241*795d594fSAndroid Build Coastguard Worker DynamicLinker string 242*795d594fSAndroid Build Coastguard Worker } 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker p := &props{} 245*795d594fSAndroid Build Coastguard Worker if linker != "" { 246*795d594fSAndroid Build Coastguard Worker p.DynamicLinker = linker 247*795d594fSAndroid Build Coastguard Worker } 248*795d594fSAndroid Build Coastguard Worker 249*795d594fSAndroid Build Coastguard Worker ctx.AppendProperties(p) 250*795d594fSAndroid Build Coastguard Worker} 251*795d594fSAndroid Build Coastguard Worker 252*795d594fSAndroid Build Coastguard Workerfunc prefer32Bit(ctx android.LoadHookContext) { 253*795d594fSAndroid Build Coastguard Worker type props struct { 254*795d594fSAndroid Build Coastguard Worker Target struct { 255*795d594fSAndroid Build Coastguard Worker Host struct { 256*795d594fSAndroid Build Coastguard Worker Compile_multilib *string 257*795d594fSAndroid Build Coastguard Worker } 258*795d594fSAndroid Build Coastguard Worker } 259*795d594fSAndroid Build Coastguard Worker } 260*795d594fSAndroid Build Coastguard Worker 261*795d594fSAndroid Build Coastguard Worker p := &props{} 262*795d594fSAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("HOST_PREFER_32_BIT") { 263*795d594fSAndroid Build Coastguard Worker p.Target.Host.Compile_multilib = proptools.StringPtr("prefer32") 264*795d594fSAndroid Build Coastguard Worker } 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker // Prepend to make it overridable in the blueprints. Note that it doesn't work 267*795d594fSAndroid Build Coastguard Worker // to override the property in a cc_defaults module. 268*795d594fSAndroid Build Coastguard Worker ctx.PrependProperties(p) 269*795d594fSAndroid Build Coastguard Worker} 270*795d594fSAndroid Build Coastguard Worker 271*795d594fSAndroid Build Coastguard Workervar testMapKey = android.NewOnceKey("artTests") 272*795d594fSAndroid Build Coastguard Worker 273*795d594fSAndroid Build Coastguard Workerfunc testMap(config android.Config) map[string][]string { 274*795d594fSAndroid Build Coastguard Worker return config.Once(testMapKey, func() interface{} { 275*795d594fSAndroid Build Coastguard Worker return make(map[string][]string) 276*795d594fSAndroid Build Coastguard Worker }).(map[string][]string) 277*795d594fSAndroid Build Coastguard Worker} 278*795d594fSAndroid Build Coastguard Worker 279*795d594fSAndroid Build Coastguard Workerfunc testInstall(ctx android.InstallHookContext) { 280*795d594fSAndroid Build Coastguard Worker testMap := testMap(ctx.Config()) 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker var name string 283*795d594fSAndroid Build Coastguard Worker if ctx.Host() { 284*795d594fSAndroid Build Coastguard Worker name = "host_" 285*795d594fSAndroid Build Coastguard Worker } else { 286*795d594fSAndroid Build Coastguard Worker name = "device_" 287*795d594fSAndroid Build Coastguard Worker } 288*795d594fSAndroid Build Coastguard Worker name += ctx.Arch().ArchType.String() + "_" + ctx.ModuleName() 289*795d594fSAndroid Build Coastguard Worker 290*795d594fSAndroid Build Coastguard Worker artTestMutex.Lock() 291*795d594fSAndroid Build Coastguard Worker defer artTestMutex.Unlock() 292*795d594fSAndroid Build Coastguard Worker 293*795d594fSAndroid Build Coastguard Worker tests := testMap[name] 294*795d594fSAndroid Build Coastguard Worker tests = append(tests, ctx.Path().String()) 295*795d594fSAndroid Build Coastguard Worker testMap[name] = tests 296*795d594fSAndroid Build Coastguard Worker} 297*795d594fSAndroid Build Coastguard Worker 298*795d594fSAndroid Build Coastguard Workervar testcasesContentKey = android.NewOnceKey("artTestcasesContent") 299*795d594fSAndroid Build Coastguard Worker 300*795d594fSAndroid Build Coastguard Workerfunc testcasesContent(config android.Config) map[string]string { 301*795d594fSAndroid Build Coastguard Worker return config.Once(testcasesContentKey, func() interface{} { 302*795d594fSAndroid Build Coastguard Worker return make(map[string]string) 303*795d594fSAndroid Build Coastguard Worker }).(map[string]string) 304*795d594fSAndroid Build Coastguard Worker} 305*795d594fSAndroid Build Coastguard Worker 306*795d594fSAndroid Build Coastguard Worker// Binaries and libraries also need to be copied in the testcases directory for 307*795d594fSAndroid Build Coastguard Worker// running tests on host. This method adds module to the list of needed files. 308*795d594fSAndroid Build Coastguard Worker// The 'key' is the file in testcases and 'value' is the path to copy it from. 309*795d594fSAndroid Build Coastguard Worker// The actual copy will be done in make since soong does not do installations. 310*795d594fSAndroid Build Coastguard Workerfunc addTestcasesFile(ctx android.InstallHookContext) { 311*795d594fSAndroid Build Coastguard Worker if ctx.Os() != ctx.Config().BuildOS || ctx.Target().HostCross || ctx.Module().IsSkipInstall() { 312*795d594fSAndroid Build Coastguard Worker return 313*795d594fSAndroid Build Coastguard Worker } 314*795d594fSAndroid Build Coastguard Worker 315*795d594fSAndroid Build Coastguard Worker testcasesContent := testcasesContent(ctx.Config()) 316*795d594fSAndroid Build Coastguard Worker 317*795d594fSAndroid Build Coastguard Worker artTestMutex.Lock() 318*795d594fSAndroid Build Coastguard Worker defer artTestMutex.Unlock() 319*795d594fSAndroid Build Coastguard Worker 320*795d594fSAndroid Build Coastguard Worker src := ctx.SrcPath().String() 321*795d594fSAndroid Build Coastguard Worker path := strings.Split(ctx.Path().String(), "/") 322*795d594fSAndroid Build Coastguard Worker // Keep last two parts of the install path (e.g. bin/dex2oat). 323*795d594fSAndroid Build Coastguard Worker dst := strings.Join(path[len(path)-2:], "/") 324*795d594fSAndroid Build Coastguard Worker if oldSrc, ok := testcasesContent[dst]; ok { 325*795d594fSAndroid Build Coastguard Worker ctx.ModuleErrorf("Conflicting sources for %s: %s and %s", dst, oldSrc, src) 326*795d594fSAndroid Build Coastguard Worker } 327*795d594fSAndroid Build Coastguard Worker testcasesContent[dst] = src 328*795d594fSAndroid Build Coastguard Worker} 329*795d594fSAndroid Build Coastguard Worker 330*795d594fSAndroid Build Coastguard Workervar artTestMutex sync.Mutex 331*795d594fSAndroid Build Coastguard Worker 332*795d594fSAndroid Build Coastguard Workerfunc init() { 333*795d594fSAndroid Build Coastguard Worker artModuleTypes := []string{ 334*795d594fSAndroid Build Coastguard Worker "art_cc_library", 335*795d594fSAndroid Build Coastguard Worker "art_cc_library_static", 336*795d594fSAndroid Build Coastguard Worker "art_cc_binary", 337*795d594fSAndroid Build Coastguard Worker "art_cc_test", 338*795d594fSAndroid Build Coastguard Worker "art_cc_test_library", 339*795d594fSAndroid Build Coastguard Worker "art_cc_defaults", 340*795d594fSAndroid Build Coastguard Worker "art_global_defaults", 341*795d594fSAndroid Build Coastguard Worker } 342*795d594fSAndroid Build Coastguard Worker android.AddNeverAllowRules( 343*795d594fSAndroid Build Coastguard Worker android.NeverAllow(). 344*795d594fSAndroid Build Coastguard Worker NotIn("art", "external/vixl"). 345*795d594fSAndroid Build Coastguard Worker ModuleType(artModuleTypes...)) 346*795d594fSAndroid Build Coastguard Worker 347*795d594fSAndroid Build Coastguard Worker android.RegisterModuleType("art_cc_library", artLibrary) 348*795d594fSAndroid Build Coastguard Worker android.RegisterModuleType("art_cc_library_static", artStaticLibrary) 349*795d594fSAndroid Build Coastguard Worker android.RegisterModuleType("art_cc_binary", artBinary) 350*795d594fSAndroid Build Coastguard Worker android.RegisterModuleType("art_cc_test", artTest) 351*795d594fSAndroid Build Coastguard Worker android.RegisterModuleType("art_cc_test_library", artTestLibrary) 352*795d594fSAndroid Build Coastguard Worker android.RegisterModuleType("art_cc_defaults", artDefaultsFactory) 353*795d594fSAndroid Build Coastguard Worker android.RegisterModuleType("art_global_defaults", artGlobalDefaultsFactory) 354*795d594fSAndroid Build Coastguard Worker} 355*795d594fSAndroid Build Coastguard Worker 356*795d594fSAndroid Build Coastguard Workerfunc artGlobalDefaultsFactory() android.Module { 357*795d594fSAndroid Build Coastguard Worker module := artDefaultsFactory() 358*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, addImplicitFlags) 359*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, globalDefaults) 360*795d594fSAndroid Build Coastguard Worker 361*795d594fSAndroid Build Coastguard Worker return module 362*795d594fSAndroid Build Coastguard Worker} 363*795d594fSAndroid Build Coastguard Worker 364*795d594fSAndroid Build Coastguard Workerfunc artDefaultsFactory() android.Module { 365*795d594fSAndroid Build Coastguard Worker c := &codegenProperties{} 366*795d594fSAndroid Build Coastguard Worker module := cc.DefaultsFactory(c) 367*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, func(ctx android.LoadHookContext) { codegen(ctx, c, staticAndSharedLibrary) }) 368*795d594fSAndroid Build Coastguard Worker 369*795d594fSAndroid Build Coastguard Worker return module 370*795d594fSAndroid Build Coastguard Worker} 371*795d594fSAndroid Build Coastguard Worker 372*795d594fSAndroid Build Coastguard Workerfunc artLibrary() android.Module { 373*795d594fSAndroid Build Coastguard Worker module := cc.LibraryFactory() 374*795d594fSAndroid Build Coastguard Worker 375*795d594fSAndroid Build Coastguard Worker installCodegenCustomizer(module, staticAndSharedLibrary) 376*795d594fSAndroid Build Coastguard Worker 377*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, addImplicitFlags) 378*795d594fSAndroid Build Coastguard Worker android.AddInstallHook(module, addTestcasesFile) 379*795d594fSAndroid Build Coastguard Worker return module 380*795d594fSAndroid Build Coastguard Worker} 381*795d594fSAndroid Build Coastguard Worker 382*795d594fSAndroid Build Coastguard Workerfunc artStaticLibrary() android.Module { 383*795d594fSAndroid Build Coastguard Worker module := cc.LibraryStaticFactory() 384*795d594fSAndroid Build Coastguard Worker 385*795d594fSAndroid Build Coastguard Worker installCodegenCustomizer(module, staticLibrary) 386*795d594fSAndroid Build Coastguard Worker 387*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, addImplicitFlags) 388*795d594fSAndroid Build Coastguard Worker return module 389*795d594fSAndroid Build Coastguard Worker} 390*795d594fSAndroid Build Coastguard Worker 391*795d594fSAndroid Build Coastguard Workerfunc artBinary() android.Module { 392*795d594fSAndroid Build Coastguard Worker module := cc.BinaryFactory() 393*795d594fSAndroid Build Coastguard Worker 394*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, addImplicitFlags) 395*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, customLinker) 396*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, prefer32Bit) 397*795d594fSAndroid Build Coastguard Worker android.AddInstallHook(module, addTestcasesFile) 398*795d594fSAndroid Build Coastguard Worker return module 399*795d594fSAndroid Build Coastguard Worker} 400*795d594fSAndroid Build Coastguard Worker 401*795d594fSAndroid Build Coastguard Workerfunc artTest() android.Module { 402*795d594fSAndroid Build Coastguard Worker module := cc.NewTest(android.HostAndDeviceSupported).Init() 403*795d594fSAndroid Build Coastguard Worker 404*795d594fSAndroid Build Coastguard Worker installCodegenCustomizer(module, binary) 405*795d594fSAndroid Build Coastguard Worker 406*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, addImplicitFlags) 407*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, customLinker) 408*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, prefer32Bit) 409*795d594fSAndroid Build Coastguard Worker android.AddInstallHook(module, testInstall) 410*795d594fSAndroid Build Coastguard Worker return module 411*795d594fSAndroid Build Coastguard Worker} 412*795d594fSAndroid Build Coastguard Worker 413*795d594fSAndroid Build Coastguard Workerfunc artTestLibrary() android.Module { 414*795d594fSAndroid Build Coastguard Worker module := cc.TestLibraryFactory() 415*795d594fSAndroid Build Coastguard Worker 416*795d594fSAndroid Build Coastguard Worker installCodegenCustomizer(module, staticAndSharedLibrary) 417*795d594fSAndroid Build Coastguard Worker 418*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, addImplicitFlags) 419*795d594fSAndroid Build Coastguard Worker android.AddLoadHook(module, prefer32Bit) 420*795d594fSAndroid Build Coastguard Worker android.AddInstallHook(module, testInstall) 421*795d594fSAndroid Build Coastguard Worker return module 422*795d594fSAndroid Build Coastguard Worker} 423