1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors 2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 4*8975f5c5SAndroid Build Coastguard Worker 5*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/chromeos/ui_mode.gni") 6*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/v8_target_cpu.gni") 7*8975f5c5SAndroid Build Coastguard Worker 8*8975f5c5SAndroid Build Coastguard Worker# These are primarily relevant in current_cpu == "arm" contexts, where 9*8975f5c5SAndroid Build Coastguard Worker# ARM code is being compiled. But they can also be relevant in the 10*8975f5c5SAndroid Build Coastguard Worker# other contexts when the code will change its behavior based on the 11*8975f5c5SAndroid Build Coastguard Worker# cpu it wants to generate code for. 12*8975f5c5SAndroid Build Coastguard Workerif (current_cpu == "arm" || v8_current_cpu == "arm") { 13*8975f5c5SAndroid Build Coastguard Worker declare_args() { 14*8975f5c5SAndroid Build Coastguard Worker # Version of the ARM processor when compiling on ARM. Ignored on non-ARM 15*8975f5c5SAndroid Build Coastguard Worker # platforms. 16*8975f5c5SAndroid Build Coastguard Worker arm_version = 7 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker # The ARM architecture. This will be a string like "armv6" or "armv7-a". 19*8975f5c5SAndroid Build Coastguard Worker # An empty string means to use the default for the arm_version. 20*8975f5c5SAndroid Build Coastguard Worker arm_arch = "" 21*8975f5c5SAndroid Build Coastguard Worker 22*8975f5c5SAndroid Build Coastguard Worker # The ARM floating point hardware. This will be a string like "neon" or 23*8975f5c5SAndroid Build Coastguard Worker # "vfpv3". An empty string means to use the default for the arm_version. 24*8975f5c5SAndroid Build Coastguard Worker arm_fpu = "" 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Worker # The ARM variant-specific tuning mode. This will be a string like "armv6" 27*8975f5c5SAndroid Build Coastguard Worker # or "cortex-a15". An empty string means to use the default for the 28*8975f5c5SAndroid Build Coastguard Worker # arm_version. 29*8975f5c5SAndroid Build Coastguard Worker arm_tune = "" 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker # Whether to use the neon FPU instruction set or not. 32*8975f5c5SAndroid Build Coastguard Worker arm_use_neon = "" 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker # Whether to enable optional NEON code paths. 35*8975f5c5SAndroid Build Coastguard Worker arm_optionally_use_neon = false 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker # Thumb is a reduced instruction set available on some ARM processors that 38*8975f5c5SAndroid Build Coastguard Worker # has increased code density. 39*8975f5c5SAndroid Build Coastguard Worker arm_use_thumb = true 40*8975f5c5SAndroid Build Coastguard Worker } 41*8975f5c5SAndroid Build Coastguard Worker 42*8975f5c5SAndroid Build Coastguard Worker # For lacros build, we use ARM v8 by default. 43*8975f5c5SAndroid Build Coastguard Worker if (is_chromeos_lacros && arm_arch == "") { 44*8975f5c5SAndroid Build Coastguard Worker # TODO(crbug.com/40276884) Enable i8mm and dotprod instructions for ffmpeg 45*8975f5c5SAndroid Build Coastguard Worker # if ever we update to a version of arm that supports these instructions. 46*8975f5c5SAndroid Build Coastguard Worker arm_version = 8 47*8975f5c5SAndroid Build Coastguard Worker arm_arch = "armv8-a+crc" 48*8975f5c5SAndroid Build Coastguard Worker } 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Worker if (current_os == "android" || target_os == "android") { 51*8975f5c5SAndroid Build Coastguard Worker arm_float_abi = "softfp" 52*8975f5c5SAndroid Build Coastguard Worker } else { 53*8975f5c5SAndroid Build Coastguard Worker declare_args() { 54*8975f5c5SAndroid Build Coastguard Worker # The ARM floating point mode. This is either the string "hard", "soft", 55*8975f5c5SAndroid Build Coastguard Worker # or "softfp". An empty string means to use the default one for the 56*8975f5c5SAndroid Build Coastguard Worker # arm_version. 57*8975f5c5SAndroid Build Coastguard Worker arm_float_abi = "" 58*8975f5c5SAndroid Build Coastguard Worker } 59*8975f5c5SAndroid Build Coastguard Worker } 60*8975f5c5SAndroid Build Coastguard Worker assert(arm_float_abi == "" || arm_float_abi == "hard" || 61*8975f5c5SAndroid Build Coastguard Worker arm_float_abi == "soft" || arm_float_abi == "softfp") 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker if (arm_use_neon == "") { 64*8975f5c5SAndroid Build Coastguard Worker if (current_os == "linux" && target_cpu != v8_target_cpu) { 65*8975f5c5SAndroid Build Coastguard Worker # Don't use neon on V8 simulator builds as a default. 66*8975f5c5SAndroid Build Coastguard Worker arm_use_neon = false 67*8975f5c5SAndroid Build Coastguard Worker } else { 68*8975f5c5SAndroid Build Coastguard Worker arm_use_neon = true 69*8975f5c5SAndroid Build Coastguard Worker } 70*8975f5c5SAndroid Build Coastguard Worker } 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker if (arm_version == 6) { 73*8975f5c5SAndroid Build Coastguard Worker if (arm_arch == "") { 74*8975f5c5SAndroid Build Coastguard Worker # v8 can still with version 6 but only with the armv6k extension. 75*8975f5c5SAndroid Build Coastguard Worker arm_arch = "armv6k" 76*8975f5c5SAndroid Build Coastguard Worker } 77*8975f5c5SAndroid Build Coastguard Worker if (arm_tune != "") { 78*8975f5c5SAndroid Build Coastguard Worker arm_tune = "" 79*8975f5c5SAndroid Build Coastguard Worker } 80*8975f5c5SAndroid Build Coastguard Worker if (arm_float_abi == "") { 81*8975f5c5SAndroid Build Coastguard Worker arm_float_abi = "softfp" 82*8975f5c5SAndroid Build Coastguard Worker } 83*8975f5c5SAndroid Build Coastguard Worker if (arm_fpu == "") { 84*8975f5c5SAndroid Build Coastguard Worker arm_fpu = "vfp" 85*8975f5c5SAndroid Build Coastguard Worker } 86*8975f5c5SAndroid Build Coastguard Worker arm_use_thumb = false 87*8975f5c5SAndroid Build Coastguard Worker arm_use_neon = false 88*8975f5c5SAndroid Build Coastguard Worker } else if (arm_version == 7) { 89*8975f5c5SAndroid Build Coastguard Worker if (arm_arch == "") { 90*8975f5c5SAndroid Build Coastguard Worker arm_arch = "armv7-a" 91*8975f5c5SAndroid Build Coastguard Worker } 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker if (arm_float_abi == "") { 94*8975f5c5SAndroid Build Coastguard Worker if (current_os == "linux" && target_cpu != v8_target_cpu) { 95*8975f5c5SAndroid Build Coastguard Worker # Default to the same as Android for V8 simulator builds. 96*8975f5c5SAndroid Build Coastguard Worker arm_float_abi = "softfp" 97*8975f5c5SAndroid Build Coastguard Worker } else { 98*8975f5c5SAndroid Build Coastguard Worker arm_float_abi = "hard" 99*8975f5c5SAndroid Build Coastguard Worker } 100*8975f5c5SAndroid Build Coastguard Worker } 101*8975f5c5SAndroid Build Coastguard Worker 102*8975f5c5SAndroid Build Coastguard Worker if (arm_fpu == "") { 103*8975f5c5SAndroid Build Coastguard Worker if (arm_use_neon) { 104*8975f5c5SAndroid Build Coastguard Worker arm_fpu = "neon" 105*8975f5c5SAndroid Build Coastguard Worker } else { 106*8975f5c5SAndroid Build Coastguard Worker arm_fpu = "vfpv3-d16" 107*8975f5c5SAndroid Build Coastguard Worker } 108*8975f5c5SAndroid Build Coastguard Worker } 109*8975f5c5SAndroid Build Coastguard Worker } else if (arm_version == 8) { 110*8975f5c5SAndroid Build Coastguard Worker if (arm_arch == "") { 111*8975f5c5SAndroid Build Coastguard Worker arm_arch = "armv8-a" 112*8975f5c5SAndroid Build Coastguard Worker } 113*8975f5c5SAndroid Build Coastguard Worker if (arm_tune == "") { 114*8975f5c5SAndroid Build Coastguard Worker arm_tune = "generic-armv8-a" 115*8975f5c5SAndroid Build Coastguard Worker } 116*8975f5c5SAndroid Build Coastguard Worker 117*8975f5c5SAndroid Build Coastguard Worker if (arm_float_abi == "") { 118*8975f5c5SAndroid Build Coastguard Worker arm_float_abi = "hard" 119*8975f5c5SAndroid Build Coastguard Worker } 120*8975f5c5SAndroid Build Coastguard Worker 121*8975f5c5SAndroid Build Coastguard Worker if (arm_fpu == "") { 122*8975f5c5SAndroid Build Coastguard Worker if (arm_use_neon) { 123*8975f5c5SAndroid Build Coastguard Worker arm_fpu = "neon" 124*8975f5c5SAndroid Build Coastguard Worker } else { 125*8975f5c5SAndroid Build Coastguard Worker arm_fpu = "vfpv3-d16" 126*8975f5c5SAndroid Build Coastguard Worker } 127*8975f5c5SAndroid Build Coastguard Worker } 128*8975f5c5SAndroid Build Coastguard Worker } 129*8975f5c5SAndroid Build Coastguard Worker} else if (current_cpu == "arm64" || v8_current_cpu == "arm64") { 130*8975f5c5SAndroid Build Coastguard Worker # arm64 supports only "hard". 131*8975f5c5SAndroid Build Coastguard Worker arm_float_abi = "hard" 132*8975f5c5SAndroid Build Coastguard Worker arm_use_neon = true 133*8975f5c5SAndroid Build Coastguard Worker declare_args() { 134*8975f5c5SAndroid Build Coastguard Worker # Enables the new Armv8 branch protection features. Valid strings are: 135*8975f5c5SAndroid Build Coastguard Worker # - "pac": Enables Pointer Authentication Code (PAC, featured in Armv8.3) 136*8975f5c5SAndroid Build Coastguard Worker # - "standard": Enables both PAC and Branch Target Identification (Armv8.5). 137*8975f5c5SAndroid Build Coastguard Worker # - "none": No branch protection. 138*8975f5c5SAndroid Build Coastguard Worker arm_control_flow_integrity = "none" 139*8975f5c5SAndroid Build Coastguard Worker 140*8975f5c5SAndroid Build Coastguard Worker if ((is_android || is_linux) && target_cpu == "arm64") { 141*8975f5c5SAndroid Build Coastguard Worker # Enable PAC and BTI on AArch64 Linux/Android systems. 142*8975f5c5SAndroid Build Coastguard Worker # target_cpu == "arm64" filters out some cases (e.g. the ChromeOS x64 143*8975f5c5SAndroid Build Coastguard Worker # MSAN build) where the target platform is x64, but V8 is configured to 144*8975f5c5SAndroid Build Coastguard Worker # use the arm64 simulator. 145*8975f5c5SAndroid Build Coastguard Worker arm_control_flow_integrity = "standard" 146*8975f5c5SAndroid Build Coastguard Worker } 147*8975f5c5SAndroid Build Coastguard Worker 148*8975f5c5SAndroid Build Coastguard Worker if (host_os == "mac" && host_cpu == "arm64") { 149*8975f5c5SAndroid Build Coastguard Worker # Disable ARM integrity flow or build 150*8975f5c5SAndroid Build Coastguard Worker # will fail because of this issue 151*8975f5c5SAndroid Build Coastguard Worker # https://groups.google.com/g/v8-users/c/rykJ2F9RIcc/m/QKpWNoeJDgAJ 152*8975f5c5SAndroid Build Coastguard Worker arm_control_flow_integrity = "none" 153*8975f5c5SAndroid Build Coastguard Worker } 154*8975f5c5SAndroid Build Coastguard Worker } 155*8975f5c5SAndroid Build Coastguard Worker assert(arm_control_flow_integrity == "none" || 156*8975f5c5SAndroid Build Coastguard Worker arm_control_flow_integrity == "standard" || 157*8975f5c5SAndroid Build Coastguard Worker arm_control_flow_integrity == "pac", 158*8975f5c5SAndroid Build Coastguard Worker "Invalid branch protection option") 159*8975f5c5SAndroid Build Coastguard Worker} 160