blob: 25edb798d4a3c9e84669748d83f7713a263de304 [file] [log] [blame]
Colin Crossb0cba6a2015-11-20 15:35:26 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Crossb98c8b02016-07-29 13:44:28 -070015package config
Colin Cross3f40fa42015-01-30 17:27:36 -080016
17import (
Dan Willemsen110a89d2016-01-14 15:17:19 -080018 "fmt"
Colin Cross3f40fa42015-01-30 17:27:36 -080019 "strings"
20
Colin Cross635c3b02016-05-18 15:37:25 -070021 "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -080022)
23
24var (
25 arm64Cflags = []string{
Colin Cross3f40fa42015-01-30 17:27:36 -080026 // Help catch common 32/64-bit errors.
Dan Willemsen162d08f2016-05-06 17:13:56 -070027 "-Werror=implicit-function-declaration",
Colin Cross3f40fa42015-01-30 17:27:36 -080028 }
29
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070030 arm64ArchVariantCflags = map[string][]string{
31 "armv8-a": []string{
32 "-march=armv8-a",
33 },
Tamas Petzbca786d2021-01-20 18:56:33 +010034 "armv8-a-branchprot": []string{
35 "-march=armv8-a",
Elliott Hughes7c306532022-03-10 18:09:25 +000036 "-mbranch-protection=standard",
Tamas Petzbca786d2021-01-20 18:56:33 +010037 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070038 "armv8-2a": []string{
Stephen Hines502f9012020-06-16 02:40:40 -070039 "-march=armv8.2-a",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070040 },
Raphael Gault70b96b02020-06-18 09:56:53 +000041 "armv8-2a-dotprod": []string{
42 "-march=armv8.2-a+dotprod",
43 },
Krzysztof Kosiński918d2652024-09-04 21:24:06 +000044 // On ARMv9 and later, Pointer Authentication Codes (PAC) are mandatory,
45 // so -fstack-protector is unnecessary.
Evgenii Stepanov80d74922023-02-10 19:13:49 -080046 "armv9-a": []string{
Jake Weinstein70660392023-08-07 14:51:00 +090047 "-march=armv9-a",
Evgenii Stepanov80d74922023-02-10 19:13:49 -080048 "-mbranch-protection=standard",
49 "-fno-stack-protector",
50 },
Krzysztof Kosiński918d2652024-09-04 21:24:06 +000051 "armv9-2a": []string{
52 "-march=armv9.2-a",
53 "-mbranch-protection=standard",
54 "-fno-stack-protector",
55 },
Krzysztof Kosiński8f607c72025-03-17 16:07:50 +000056 "armv9-3a": []string{
57 "-march=armv9.3-a",
58 "-mbranch-protection=standard",
59 "-fno-stack-protector",
60 },
61 "armv9-4a": []string{
62 "-march=armv9.4-a",
63 "-mbranch-protection=standard",
64 "-fno-stack-protector",
65 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070066 }
67
Colin Cross3f40fa42015-01-30 17:27:36 -080068 arm64Ldflags = []string{
Ivan Lozanoc80bbb42020-03-02 16:48:15 -050069 "-Wl,-z,separate-code",
Kalesh Singhfa1ebf52024-03-12 16:45:18 -070070 "-Wl,-z,separate-loadable-segments",
Colin Cross3f40fa42015-01-30 17:27:36 -080071 }
72
Juan Yescas05d4d902023-04-07 10:35:35 -070073 arm64Lldflags = arm64Ldflags
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -070074
Colin Cross26f14502017-11-06 13:59:48 -080075 arm64Cppflags = []string{}
Dan Willemsen110a89d2016-01-14 15:17:19 -080076
Colin Cross33bac242021-07-14 17:03:16 -070077 arm64CpuVariantCflags = map[string][]string{
Dan Willemsen110a89d2016-01-14 15:17:19 -080078 "cortex-a53": []string{
79 "-mcpu=cortex-a53",
80 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070081 "cortex-a55": []string{
Yi Kong9c633632018-06-15 15:46:11 -070082 "-mcpu=cortex-a55",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070083 },
84 "cortex-a75": []string{
Yi Kong9c633632018-06-15 15:46:11 -070085 // Use the cortex-a55 since it is similar to the little
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070086 // core (cortex-a55) and is sensitive to ordering.
Yi Kong9c633632018-06-15 15:46:11 -070087 "-mcpu=cortex-a55",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070088 },
Haibo Huanga31e2bd2018-10-09 14:27:28 -070089 "cortex-a76": []string{
90 // Use the cortex-a55 since it is similar to the little
91 // core (cortex-a55) and is sensitive to ordering.
92 "-mcpu=cortex-a55",
93 },
Alex Naidisac01ff52016-08-30 15:56:33 +020094 "kryo": []string{
Dan Willemsenbd4abf52018-10-07 21:06:36 -070095 "-mcpu=kryo",
Alex Naidisac01ff52016-08-30 15:56:33 +020096 },
Artem Serovd3072b02018-11-15 15:21:51 +000097 "kryo385": []string{
Colin Cross4fa894d2022-09-30 15:44:45 -070098 // Use cortex-a53 because kryo385 is not supported in clang.
Artem Serovd3072b02018-11-15 15:21:51 +000099 "-mcpu=cortex-a53",
100 },
Junmo Park8ea49592017-07-24 07:14:55 +0900101 "exynos-m1": []string{
102 "-mcpu=exynos-m1",
103 },
Junmo Parkd86c9022017-07-21 09:07:47 +0900104 "exynos-m2": []string{
105 "-mcpu=exynos-m2",
106 },
Dan Willemsen110a89d2016-01-14 15:17:19 -0800107 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800108)
109
110func init() {
Cole Faust8982b1c2024-04-08 16:54:45 -0700111 pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " "))
Juan Yescas05d4d902023-04-07 10:35:35 -0700112
Juan Yescas05d4d902023-04-07 10:35:35 -0700113 pctx.VariableFunc("Arm64Lldflags", func(ctx android.PackageVarContext) string {
114 maxPageSizeFlag := "-Wl,-z,max-page-size=" + ctx.Config().MaxPageSizeSupported()
115 flags := append(arm64Lldflags, maxPageSizeFlag)
116 return strings.Join(flags, " ")
117 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800118
Juan Yescas01065602023-08-09 08:34:37 -0700119 pctx.VariableFunc("Arm64Cflags", func(ctx android.PackageVarContext) string {
120 flags := arm64Cflags
Juan Yescasfc5cdcb2024-04-11 23:58:29 -0700121 if ctx.Config().NoBionicPageSizeMacro() {
122 flags = append(flags, "-D__BIONIC_NO_PAGE_SIZE_MACRO")
123 } else {
Steven Moreland2a481362024-04-08 18:59:10 +0000124 flags = append(flags, "-D__BIONIC_DEPRECATED_PAGE_SIZE_MACRO")
Juan Yescas01065602023-08-09 08:34:37 -0700125 }
126 return strings.Join(flags, " ")
127 })
128
Cole Faust8982b1c2024-04-08 16:54:45 -0700129 pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " "))
Liz Kammer82ad8cc2021-08-02 10:41:48 -0400130
Krzysztof Kosińskib8c5e952024-09-07 00:01:55 +0000131 for variant, cflags := range arm64ArchVariantCflags {
132 pctx.StaticVariable("Arm64"+variant+"VariantCflags", strings.Join(cflags, " "))
133 }
Dan Willemsen110a89d2016-01-14 15:17:19 -0800134
Cole Faust8982b1c2024-04-08 16:54:45 -0700135 pctx.StaticVariable("Arm64CortexA53Cflags", strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
136 pctx.StaticVariable("Arm64CortexA55Cflags", strings.Join(arm64CpuVariantCflags["cortex-a55"], " "))
137 pctx.StaticVariable("Arm64KryoCflags", strings.Join(arm64CpuVariantCflags["kryo"], " "))
138 pctx.StaticVariable("Arm64ExynosM1Cflags", strings.Join(arm64CpuVariantCflags["exynos-m1"], " "))
139 pctx.StaticVariable("Arm64ExynosM2Cflags", strings.Join(arm64CpuVariantCflags["exynos-m2"], " "))
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700140
Cole Faust8982b1c2024-04-08 16:54:45 -0700141 pctx.StaticVariable("Arm64FixCortexA53Ldflags", "-Wl,--fix-cortex-a53-843419")
Colin Cross3f40fa42015-01-30 17:27:36 -0800142}
143
Dan Willemsen110a89d2016-01-14 15:17:19 -0800144var (
Colin Cross33bac242021-07-14 17:03:16 -0700145 arm64CpuVariantCflagsVar = map[string]string{
Colin Cross0523ba22021-07-14 18:45:05 -0700146 "cortex-a53": "${config.Arm64CortexA53Cflags}",
147 "cortex-a55": "${config.Arm64CortexA55Cflags}",
148 "cortex-a72": "${config.Arm64CortexA53Cflags}",
149 "cortex-a73": "${config.Arm64CortexA53Cflags}",
150 "cortex-a75": "${config.Arm64CortexA55Cflags}",
151 "cortex-a76": "${config.Arm64CortexA55Cflags}",
152 "kryo": "${config.Arm64KryoCflags}",
153 "kryo385": "${config.Arm64CortexA53Cflags}",
154 "exynos-m1": "${config.Arm64ExynosM1Cflags}",
155 "exynos-m2": "${config.Arm64ExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800156 }
Liz Kammere8303bd2022-02-16 09:02:48 -0500157
158 arm64CpuVariantLdflags = map[string]string{
159 "cortex-a53": "${config.Arm64FixCortexA53Ldflags}",
160 "cortex-a72": "${config.Arm64FixCortexA53Ldflags}",
161 "cortex-a73": "${config.Arm64FixCortexA53Ldflags}",
162 "kryo": "${config.Arm64FixCortexA53Ldflags}",
163 "exynos-m1": "${config.Arm64FixCortexA53Ldflags}",
164 "exynos-m2": "${config.Arm64FixCortexA53Ldflags}",
165 }
Dan Willemsen110a89d2016-01-14 15:17:19 -0800166)
167
Colin Cross3f40fa42015-01-30 17:27:36 -0800168type toolchainArm64 struct {
Colin Crosse3fee342021-06-21 17:28:25 -0700169 toolchainBionic
Colin Cross3f40fa42015-01-30 17:27:36 -0800170 toolchain64Bit
Colin Cross3f40fa42015-01-30 17:27:36 -0800171
Colin Cross33bac242021-07-14 17:03:16 -0700172 ldflags string
173 lldflags string
174 toolchainCflags string
Dan Willemsen110a89d2016-01-14 15:17:19 -0800175}
Colin Cross3f40fa42015-01-30 17:27:36 -0800176
Dan Albertbe961682015-03-18 23:38:50 -0700177func (t *toolchainArm64) Name() string {
178 return "arm64"
179}
180
Colin Cross3f40fa42015-01-30 17:27:36 -0800181func (t *toolchainArm64) IncludeFlags() string {
Martin Stjernholm41ab2512020-04-08 01:06:07 +0100182 return ""
Colin Cross3f40fa42015-01-30 17:27:36 -0800183}
184
185func (t *toolchainArm64) ClangTriple() string {
Colin Cross4fa894d2022-09-30 15:44:45 -0700186 return "aarch64-linux-android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800187}
188
Colin Cross33bac242021-07-14 17:03:16 -0700189func (t *toolchainArm64) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700190 return "${config.Arm64Cflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800191}
192
Colin Cross33bac242021-07-14 17:03:16 -0700193func (t *toolchainArm64) Cppflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700194 return "${config.Arm64Cppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800195}
196
Colin Cross33bac242021-07-14 17:03:16 -0700197func (t *toolchainArm64) Ldflags() string {
Christopher Ferris79dff702018-05-11 18:23:54 -0700198 return t.ldflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800199}
200
Colin Cross33bac242021-07-14 17:03:16 -0700201func (t *toolchainArm64) Lldflags() string {
Dan Willemsene28663f2018-10-09 14:42:06 -0700202 return t.lldflags
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700203}
204
Colin Cross33bac242021-07-14 17:03:16 -0700205func (t *toolchainArm64) ToolchainCflags() string {
206 return t.toolchainCflags
Dan Willemsen110a89d2016-01-14 15:17:19 -0800207}
208
Yi Kong924adc42018-08-31 14:27:44 -0700209func (toolchainArm64) LibclangRuntimeLibraryArch() string {
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700210 return "aarch64"
Colin Cross16b23492016-01-06 14:41:07 -0800211}
212
Colin Cross635c3b02016-05-18 15:37:25 -0700213func arm64ToolchainFactory(arch android.Arch) Toolchain {
Krzysztof Kosińskib8c5e952024-09-07 00:01:55 +0000214 // Error now rather than having a confusing Ninja error
215 if _, ok := arm64ArchVariantCflags[arch.ArchVariant]; !ok {
216 panic(fmt.Sprintf("Unknown ARM64 architecture version: %q", arch.ArchVariant))
Dan Willemsen110a89d2016-01-14 15:17:19 -0800217 }
218
Krzysztof Kosińskib8c5e952024-09-07 00:01:55 +0000219 toolchainCflags := []string{"${config.Arm64" + arch.ArchVariant + "VariantCflags}"}
Colin Cross33bac242021-07-14 17:03:16 -0700220 toolchainCflags = append(toolchainCflags,
221 variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant))
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700222
Liz Kammere8303bd2022-02-16 09:02:48 -0500223 extraLdflags := variantOrDefault(arm64CpuVariantLdflags, arch.CpuVariant)
Dan Willemsen110a89d2016-01-14 15:17:19 -0800224 return &toolchainArm64{
Christopher Ferris79dff702018-05-11 18:23:54 -0700225 ldflags: strings.Join([]string{
226 "${config.Arm64Ldflags}",
227 extraLdflags,
228 }, " "),
Dan Willemsene28663f2018-10-09 14:42:06 -0700229 lldflags: strings.Join([]string{
230 "${config.Arm64Lldflags}",
231 extraLdflags,
232 }, " "),
Colin Cross33bac242021-07-14 17:03:16 -0700233 toolchainCflags: strings.Join(toolchainCflags, " "),
Dan Willemsen110a89d2016-01-14 15:17:19 -0800234 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800235}
236
237func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700238 registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -0800239}