xref: /aosp_15_r20/external/angle/build/config/arm.gni (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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