1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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 config 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "strings" 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 Workervar ( 25*333d2b36SAndroid Build Coastguard Worker arm64Cflags = []string{ 26*333d2b36SAndroid Build Coastguard Worker // Help catch common 32/64-bit errors. 27*333d2b36SAndroid Build Coastguard Worker "-Werror=implicit-function-declaration", 28*333d2b36SAndroid Build Coastguard Worker } 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Worker arm64ArchVariantCflags = map[string][]string{ 31*333d2b36SAndroid Build Coastguard Worker "armv8-a": []string{ 32*333d2b36SAndroid Build Coastguard Worker "-march=armv8-a", 33*333d2b36SAndroid Build Coastguard Worker }, 34*333d2b36SAndroid Build Coastguard Worker "armv8-a-branchprot": []string{ 35*333d2b36SAndroid Build Coastguard Worker "-march=armv8-a", 36*333d2b36SAndroid Build Coastguard Worker "-mbranch-protection=standard", 37*333d2b36SAndroid Build Coastguard Worker }, 38*333d2b36SAndroid Build Coastguard Worker "armv8-2a": []string{ 39*333d2b36SAndroid Build Coastguard Worker "-march=armv8.2-a", 40*333d2b36SAndroid Build Coastguard Worker }, 41*333d2b36SAndroid Build Coastguard Worker "armv8-2a-dotprod": []string{ 42*333d2b36SAndroid Build Coastguard Worker "-march=armv8.2-a+dotprod", 43*333d2b36SAndroid Build Coastguard Worker }, 44*333d2b36SAndroid Build Coastguard Worker // On ARMv9 and later, Pointer Authentication Codes (PAC) are mandatory, 45*333d2b36SAndroid Build Coastguard Worker // so -fstack-protector is unnecessary. 46*333d2b36SAndroid Build Coastguard Worker "armv9-a": []string{ 47*333d2b36SAndroid Build Coastguard Worker "-march=armv8.2-a+dotprod", 48*333d2b36SAndroid Build Coastguard Worker "-mbranch-protection=standard", 49*333d2b36SAndroid Build Coastguard Worker "-fno-stack-protector", 50*333d2b36SAndroid Build Coastguard Worker }, 51*333d2b36SAndroid Build Coastguard Worker "armv9-2a": []string{ 52*333d2b36SAndroid Build Coastguard Worker "-march=armv9.2-a", 53*333d2b36SAndroid Build Coastguard Worker "-mbranch-protection=standard", 54*333d2b36SAndroid Build Coastguard Worker "-fno-stack-protector", 55*333d2b36SAndroid Build Coastguard Worker }, 56*333d2b36SAndroid Build Coastguard Worker } 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker arm64Ldflags = []string{ 59*333d2b36SAndroid Build Coastguard Worker "-Wl,-z,separate-code", 60*333d2b36SAndroid Build Coastguard Worker "-Wl,-z,separate-loadable-segments", 61*333d2b36SAndroid Build Coastguard Worker } 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker arm64Lldflags = arm64Ldflags 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker arm64Cppflags = []string{} 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker arm64CpuVariantCflags = map[string][]string{ 68*333d2b36SAndroid Build Coastguard Worker "cortex-a53": []string{ 69*333d2b36SAndroid Build Coastguard Worker "-mcpu=cortex-a53", 70*333d2b36SAndroid Build Coastguard Worker }, 71*333d2b36SAndroid Build Coastguard Worker "cortex-a55": []string{ 72*333d2b36SAndroid Build Coastguard Worker "-mcpu=cortex-a55", 73*333d2b36SAndroid Build Coastguard Worker }, 74*333d2b36SAndroid Build Coastguard Worker "cortex-a75": []string{ 75*333d2b36SAndroid Build Coastguard Worker // Use the cortex-a55 since it is similar to the little 76*333d2b36SAndroid Build Coastguard Worker // core (cortex-a55) and is sensitive to ordering. 77*333d2b36SAndroid Build Coastguard Worker "-mcpu=cortex-a55", 78*333d2b36SAndroid Build Coastguard Worker }, 79*333d2b36SAndroid Build Coastguard Worker "cortex-a76": []string{ 80*333d2b36SAndroid Build Coastguard Worker // Use the cortex-a55 since it is similar to the little 81*333d2b36SAndroid Build Coastguard Worker // core (cortex-a55) and is sensitive to ordering. 82*333d2b36SAndroid Build Coastguard Worker "-mcpu=cortex-a55", 83*333d2b36SAndroid Build Coastguard Worker }, 84*333d2b36SAndroid Build Coastguard Worker "kryo": []string{ 85*333d2b36SAndroid Build Coastguard Worker "-mcpu=kryo", 86*333d2b36SAndroid Build Coastguard Worker }, 87*333d2b36SAndroid Build Coastguard Worker "kryo385": []string{ 88*333d2b36SAndroid Build Coastguard Worker // Use cortex-a53 because kryo385 is not supported in clang. 89*333d2b36SAndroid Build Coastguard Worker "-mcpu=cortex-a53", 90*333d2b36SAndroid Build Coastguard Worker }, 91*333d2b36SAndroid Build Coastguard Worker "exynos-m1": []string{ 92*333d2b36SAndroid Build Coastguard Worker "-mcpu=exynos-m1", 93*333d2b36SAndroid Build Coastguard Worker }, 94*333d2b36SAndroid Build Coastguard Worker "exynos-m2": []string{ 95*333d2b36SAndroid Build Coastguard Worker "-mcpu=exynos-m2", 96*333d2b36SAndroid Build Coastguard Worker }, 97*333d2b36SAndroid Build Coastguard Worker } 98*333d2b36SAndroid Build Coastguard Worker) 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Workerfunc init() { 101*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " ")) 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("Arm64Lldflags", func(ctx android.PackageVarContext) string { 104*333d2b36SAndroid Build Coastguard Worker maxPageSizeFlag := "-Wl,-z,max-page-size=" + ctx.Config().MaxPageSizeSupported() 105*333d2b36SAndroid Build Coastguard Worker flags := append(arm64Lldflags, maxPageSizeFlag) 106*333d2b36SAndroid Build Coastguard Worker return strings.Join(flags, " ") 107*333d2b36SAndroid Build Coastguard Worker }) 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("Arm64Cflags", func(ctx android.PackageVarContext) string { 110*333d2b36SAndroid Build Coastguard Worker flags := arm64Cflags 111*333d2b36SAndroid Build Coastguard Worker if ctx.Config().NoBionicPageSizeMacro() { 112*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "-D__BIONIC_NO_PAGE_SIZE_MACRO") 113*333d2b36SAndroid Build Coastguard Worker } else { 114*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "-D__BIONIC_DEPRECATED_PAGE_SIZE_MACRO") 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker return strings.Join(flags, " ") 117*333d2b36SAndroid Build Coastguard Worker }) 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " ")) 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Worker for variant, cflags := range arm64ArchVariantCflags { 122*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64"+variant+"VariantCflags", strings.Join(cflags, " ")) 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64CortexA53Cflags", strings.Join(arm64CpuVariantCflags["cortex-a53"], " ")) 126*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64CortexA55Cflags", strings.Join(arm64CpuVariantCflags["cortex-a55"], " ")) 127*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64KryoCflags", strings.Join(arm64CpuVariantCflags["kryo"], " ")) 128*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64ExynosM1Cflags", strings.Join(arm64CpuVariantCflags["exynos-m1"], " ")) 129*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64ExynosM2Cflags", strings.Join(arm64CpuVariantCflags["exynos-m2"], " ")) 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("Arm64FixCortexA53Ldflags", "-Wl,--fix-cortex-a53-843419") 132*333d2b36SAndroid Build Coastguard Worker} 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Workervar ( 135*333d2b36SAndroid Build Coastguard Worker arm64CpuVariantCflagsVar = map[string]string{ 136*333d2b36SAndroid Build Coastguard Worker "cortex-a53": "${config.Arm64CortexA53Cflags}", 137*333d2b36SAndroid Build Coastguard Worker "cortex-a55": "${config.Arm64CortexA55Cflags}", 138*333d2b36SAndroid Build Coastguard Worker "cortex-a72": "${config.Arm64CortexA53Cflags}", 139*333d2b36SAndroid Build Coastguard Worker "cortex-a73": "${config.Arm64CortexA53Cflags}", 140*333d2b36SAndroid Build Coastguard Worker "cortex-a75": "${config.Arm64CortexA55Cflags}", 141*333d2b36SAndroid Build Coastguard Worker "cortex-a76": "${config.Arm64CortexA55Cflags}", 142*333d2b36SAndroid Build Coastguard Worker "kryo": "${config.Arm64KryoCflags}", 143*333d2b36SAndroid Build Coastguard Worker "kryo385": "${config.Arm64CortexA53Cflags}", 144*333d2b36SAndroid Build Coastguard Worker "exynos-m1": "${config.Arm64ExynosM1Cflags}", 145*333d2b36SAndroid Build Coastguard Worker "exynos-m2": "${config.Arm64ExynosM2Cflags}", 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker arm64CpuVariantLdflags = map[string]string{ 149*333d2b36SAndroid Build Coastguard Worker "cortex-a53": "${config.Arm64FixCortexA53Ldflags}", 150*333d2b36SAndroid Build Coastguard Worker "cortex-a72": "${config.Arm64FixCortexA53Ldflags}", 151*333d2b36SAndroid Build Coastguard Worker "cortex-a73": "${config.Arm64FixCortexA53Ldflags}", 152*333d2b36SAndroid Build Coastguard Worker "kryo": "${config.Arm64FixCortexA53Ldflags}", 153*333d2b36SAndroid Build Coastguard Worker "exynos-m1": "${config.Arm64FixCortexA53Ldflags}", 154*333d2b36SAndroid Build Coastguard Worker "exynos-m2": "${config.Arm64FixCortexA53Ldflags}", 155*333d2b36SAndroid Build Coastguard Worker } 156*333d2b36SAndroid Build Coastguard Worker) 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Workertype toolchainArm64 struct { 159*333d2b36SAndroid Build Coastguard Worker toolchainBionic 160*333d2b36SAndroid Build Coastguard Worker toolchain64Bit 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker ldflags string 163*333d2b36SAndroid Build Coastguard Worker lldflags string 164*333d2b36SAndroid Build Coastguard Worker toolchainCflags string 165*333d2b36SAndroid Build Coastguard Worker} 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Name() string { 168*333d2b36SAndroid Build Coastguard Worker return "arm64" 169*333d2b36SAndroid Build Coastguard Worker} 170*333d2b36SAndroid Build Coastguard Worker 171*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) IncludeFlags() string { 172*333d2b36SAndroid Build Coastguard Worker return "" 173*333d2b36SAndroid Build Coastguard Worker} 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) ClangTriple() string { 176*333d2b36SAndroid Build Coastguard Worker return "aarch64-linux-android" 177*333d2b36SAndroid Build Coastguard Worker} 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Cflags() string { 180*333d2b36SAndroid Build Coastguard Worker return "${config.Arm64Cflags}" 181*333d2b36SAndroid Build Coastguard Worker} 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Cppflags() string { 184*333d2b36SAndroid Build Coastguard Worker return "${config.Arm64Cppflags}" 185*333d2b36SAndroid Build Coastguard Worker} 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Ldflags() string { 188*333d2b36SAndroid Build Coastguard Worker return t.ldflags 189*333d2b36SAndroid Build Coastguard Worker} 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Lldflags() string { 192*333d2b36SAndroid Build Coastguard Worker return t.lldflags 193*333d2b36SAndroid Build Coastguard Worker} 194*333d2b36SAndroid Build Coastguard Worker 195*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) ToolchainCflags() string { 196*333d2b36SAndroid Build Coastguard Worker return t.toolchainCflags 197*333d2b36SAndroid Build Coastguard Worker} 198*333d2b36SAndroid Build Coastguard Worker 199*333d2b36SAndroid Build Coastguard Workerfunc (toolchainArm64) LibclangRuntimeLibraryArch() string { 200*333d2b36SAndroid Build Coastguard Worker return "aarch64" 201*333d2b36SAndroid Build Coastguard Worker} 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Workerfunc arm64ToolchainFactory(arch android.Arch) Toolchain { 204*333d2b36SAndroid Build Coastguard Worker // Error now rather than having a confusing Ninja error 205*333d2b36SAndroid Build Coastguard Worker if _, ok := arm64ArchVariantCflags[arch.ArchVariant]; !ok { 206*333d2b36SAndroid Build Coastguard Worker panic(fmt.Sprintf("Unknown ARM64 architecture version: %q", arch.ArchVariant)) 207*333d2b36SAndroid Build Coastguard Worker } 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker toolchainCflags := []string{"${config.Arm64" + arch.ArchVariant + "VariantCflags}"} 210*333d2b36SAndroid Build Coastguard Worker toolchainCflags = append(toolchainCflags, 211*333d2b36SAndroid Build Coastguard Worker variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant)) 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Worker extraLdflags := variantOrDefault(arm64CpuVariantLdflags, arch.CpuVariant) 214*333d2b36SAndroid Build Coastguard Worker return &toolchainArm64{ 215*333d2b36SAndroid Build Coastguard Worker ldflags: strings.Join([]string{ 216*333d2b36SAndroid Build Coastguard Worker "${config.Arm64Ldflags}", 217*333d2b36SAndroid Build Coastguard Worker extraLdflags, 218*333d2b36SAndroid Build Coastguard Worker }, " "), 219*333d2b36SAndroid Build Coastguard Worker lldflags: strings.Join([]string{ 220*333d2b36SAndroid Build Coastguard Worker "${config.Arm64Lldflags}", 221*333d2b36SAndroid Build Coastguard Worker extraLdflags, 222*333d2b36SAndroid Build Coastguard Worker }, " "), 223*333d2b36SAndroid Build Coastguard Worker toolchainCflags: strings.Join(toolchainCflags, " "), 224*333d2b36SAndroid Build Coastguard Worker } 225*333d2b36SAndroid Build Coastguard Worker} 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Workerfunc init() { 228*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory) 229*333d2b36SAndroid Build Coastguard Worker} 230