blob: 73d9e3b6514a156add1591c3d34f8671848eadfd [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 },
34 "armv8-2a": []string{
35 "-march=armv8.2a",
36 },
37 }
38
Colin Cross3f40fa42015-01-30 17:27:36 -080039 arm64Ldflags = []string{
Stephen Craneb3c21542017-06-26 19:22:02 -070040 "-Wl,-m,aarch64_elf64_le_vec",
Colin Cross3f40fa42015-01-30 17:27:36 -080041 "-Wl,--hash-style=gnu",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070042 "-Wl,--fix-cortex-a53-843419",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080043 "-fuse-ld=gold",
44 "-Wl,--icf=safe",
Colin Cross3f40fa42015-01-30 17:27:36 -080045 }
46
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -070047 arm64Lldflags = append(ClangFilterUnknownLldflags(arm64Ldflags),
48 "-Wl,-z,max-page-size=4096")
49
Colin Cross26f14502017-11-06 13:59:48 -080050 arm64Cppflags = []string{}
Dan Willemsen110a89d2016-01-14 15:17:19 -080051
52 arm64CpuVariantCflags = map[string][]string{
53 "cortex-a53": []string{
54 "-mcpu=cortex-a53",
55 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070056 "cortex-a55": []string{
57 // The cortex-a55 target is not yet supported,
58 // so use cortex-a53.
59 "-mcpu=cortex-a53",
60 },
61 "cortex-a75": []string{
62 // Use the cortex-a53 since it is similar to the little
63 // core (cortex-a55) and is sensitive to ordering.
64 // The cortex-a55 target is not yet supported.
65 "-mcpu=cortex-a53",
66 },
Alex Naidisac01ff52016-08-30 15:56:33 +020067 "kryo": []string{
Alex Naidis5df73d02017-04-05 20:08:41 +020068 // Use the cortex-a57 cpu since some compilers
69 // don't support a Kryo specific target yet.
Alex Naidisac01ff52016-08-30 15:56:33 +020070 "-mcpu=cortex-a57",
71 },
Junmo Park8ea49592017-07-24 07:14:55 +090072 "exynos-m1": []string{
73 "-mcpu=exynos-m1",
74 },
Junmo Parkd86c9022017-07-21 09:07:47 +090075 "exynos-m2": []string{
76 "-mcpu=exynos-m2",
77 },
Dan Willemsen110a89d2016-01-14 15:17:19 -080078 }
79
80 arm64ClangCpuVariantCflags = copyVariantFlags(arm64CpuVariantCflags)
Colin Cross3f40fa42015-01-30 17:27:36 -080081)
82
Dan Willemsen34fc3b12015-12-07 12:30:44 -080083const (
84 arm64GccVersion = "4.9"
85)
86
Colin Cross3f40fa42015-01-30 17:27:36 -080087func init() {
Dan Willemsenb1957a52016-06-23 23:44:54 -070088 android.RegisterArchVariants(android.Arm64,
89 "armv8_a",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070090 "armv8_2a",
Christopher Ferris6df46f52017-05-08 12:08:40 -070091 "cortex-a53",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070092 "cortex-a55",
Christopher Ferris6df46f52017-05-08 12:08:40 -070093 "cortex-a73",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070094 "cortex-a75",
Alex Naidisac01ff52016-08-30 15:56:33 +020095 "kryo",
Junmo Park8ea49592017-07-24 07:14:55 +090096 "exynos-m1",
Junmo Parkd86c9022017-07-21 09:07:47 +090097 "exynos-m2",
Dan Willemsenb1957a52016-06-23 23:44:54 -070098 "denver64")
99
Alex Naidis5df73d02017-04-05 20:08:41 +0200100 // Clang supports specific Kryo targeting
101 replaceFirst(arm64ClangCpuVariantCflags["kryo"], "-mcpu=cortex-a57", "-mcpu=kryo")
102
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800103 pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
Colin Cross3f40fa42015-01-30 17:27:36 -0800104
Colin Crossb98c8b02016-07-29 13:44:28 -0700105 pctx.SourcePathVariable("Arm64GccRoot",
Dan Willemsen87b17d12015-07-14 00:39:06 -0700106 "prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
Colin Cross3f40fa42015-01-30 17:27:36 -0800107
Colin Crossb98c8b02016-07-29 13:44:28 -0700108 pctx.StaticVariable("Arm64Cflags", strings.Join(arm64Cflags, " "))
109 pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " "))
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700110 pctx.StaticVariable("Arm64Lldflags", strings.Join(arm64Lldflags, " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700111 pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " "))
Elliott Hughesde28deb2017-10-12 09:07:53 -0700112 pctx.StaticVariable("Arm64IncludeFlags", bionicHeaders("arm64"))
Colin Cross3f40fa42015-01-30 17:27:36 -0800113
Colin Crossb98c8b02016-07-29 13:44:28 -0700114 pctx.StaticVariable("Arm64ClangCflags", strings.Join(ClangFilterUnknownCflags(arm64Cflags), " "))
115 pctx.StaticVariable("Arm64ClangLdflags", strings.Join(ClangFilterUnknownCflags(arm64Ldflags), " "))
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700116 pctx.StaticVariable("Arm64ClangLldflags", strings.Join(ClangFilterUnknownCflags(arm64Lldflags), " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700117 pctx.StaticVariable("Arm64ClangCppflags", strings.Join(ClangFilterUnknownCflags(arm64Cppflags), " "))
Dan Willemsen110a89d2016-01-14 15:17:19 -0800118
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700119 pctx.StaticVariable("Arm64ClangArmv8ACflags", strings.Join(arm64ArchVariantCflags["armv8-a"], " "))
120 pctx.StaticVariable("Arm64ClangArmv82ACflags", strings.Join(arm64ArchVariantCflags["armv8-2a"], " "))
121
Colin Crossb98c8b02016-07-29 13:44:28 -0700122 pctx.StaticVariable("Arm64CortexA53Cflags",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800123 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700124 pctx.StaticVariable("Arm64ClangCortexA53Cflags",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800125 strings.Join(arm64ClangCpuVariantCflags["cortex-a53"], " "))
Alex Naidisac01ff52016-08-30 15:56:33 +0200126
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700127 pctx.StaticVariable("Arm64CortexA55Cflags",
128 strings.Join(arm64CpuVariantCflags["cortex-a55"], " "))
129 pctx.StaticVariable("Arm64ClangCortexA55Cflags",
130 strings.Join(arm64ClangCpuVariantCflags["cortex-a55"], " "))
131
Alex Naidisac01ff52016-08-30 15:56:33 +0200132 pctx.StaticVariable("Arm64KryoCflags",
133 strings.Join(arm64CpuVariantCflags["kryo"], " "))
134 pctx.StaticVariable("Arm64ClangKryoCflags",
135 strings.Join(arm64ClangCpuVariantCflags["kryo"], " "))
Junmo Parkd86c9022017-07-21 09:07:47 +0900136
Junmo Park8ea49592017-07-24 07:14:55 +0900137 pctx.StaticVariable("Arm64ExynosM1Cflags",
138 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
139 pctx.StaticVariable("Arm64ClangExynosM1Cflags",
140 strings.Join(arm64ClangCpuVariantCflags["exynos-m1"], " "))
141
Junmo Parkd86c9022017-07-21 09:07:47 +0900142 pctx.StaticVariable("Arm64ExynosM2Cflags",
143 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
144 pctx.StaticVariable("Arm64ClangExynosM2Cflags",
145 strings.Join(arm64ClangCpuVariantCflags["exynos-m2"], " "))
Colin Cross3f40fa42015-01-30 17:27:36 -0800146}
147
Dan Willemsen110a89d2016-01-14 15:17:19 -0800148var (
149 arm64CpuVariantCflagsVar = map[string]string{
150 "": "",
Colin Crossb98c8b02016-07-29 13:44:28 -0700151 "cortex-a53": "${config.Arm64CortexA53Cflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700152 "cortex-a55": "${config.Arm64CortexA55Cflags}",
Christopher Ferris6df46f52017-05-08 12:08:40 -0700153 "cortex-a73": "${config.Arm64CortexA53Cflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700154 "cortex-a75": "${config.Arm64CortexA55Cflags}",
Alex Naidisac01ff52016-08-30 15:56:33 +0200155 "kryo": "${config.Arm64KryoCflags}",
Junmo Park8ea49592017-07-24 07:14:55 +0900156 "exynos-m1": "${config.Arm64ExynosM1Cflags}",
Junmo Parkd86c9022017-07-21 09:07:47 +0900157 "exynos-m2": "${config.Arm64ExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800158 }
159
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700160 arm64ClangArchVariantCflagsVar = map[string]string{
161 "armv8-a": "${config.Arm64ClangArmv8ACflags}",
162 "armv8-2a": "${config.Arm64ClangArmv82ACflags}",
163 }
164
Dan Willemsen110a89d2016-01-14 15:17:19 -0800165 arm64ClangCpuVariantCflagsVar = map[string]string{
166 "": "",
Colin Crossb98c8b02016-07-29 13:44:28 -0700167 "cortex-a53": "${config.Arm64ClangCortexA53Cflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700168 "cortex-a55": "${config.Arm64ClangCortexA55Cflags}",
Christopher Ferris6df46f52017-05-08 12:08:40 -0700169 "cortex-a73": "${config.Arm64ClangCortexA53Cflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700170 "cortex-a75": "${config.Arm64ClangCortexA55Cflags}",
Alex Naidisac01ff52016-08-30 15:56:33 +0200171 "kryo": "${config.Arm64ClangKryoCflags}",
Junmo Park8ea49592017-07-24 07:14:55 +0900172 "exynos-m1": "${config.Arm64ClangExynosM1Cflags}",
Junmo Parkd86c9022017-07-21 09:07:47 +0900173 "exynos-m2": "${config.Arm64ClangExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800174 }
175)
176
Colin Cross3f40fa42015-01-30 17:27:36 -0800177type toolchainArm64 struct {
178 toolchain64Bit
Colin Cross3f40fa42015-01-30 17:27:36 -0800179
Dan Willemsen110a89d2016-01-14 15:17:19 -0800180 toolchainCflags string
181 toolchainClangCflags string
182}
Colin Cross3f40fa42015-01-30 17:27:36 -0800183
Dan Albertbe961682015-03-18 23:38:50 -0700184func (t *toolchainArm64) Name() string {
185 return "arm64"
186}
187
Colin Cross3f40fa42015-01-30 17:27:36 -0800188func (t *toolchainArm64) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700189 return "${config.Arm64GccRoot}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800190}
191
192func (t *toolchainArm64) GccTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700193 return "aarch64-linux-android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800194}
195
Dan Albertbe961682015-03-18 23:38:50 -0700196func (t *toolchainArm64) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800197 return arm64GccVersion
Dan Albertbe961682015-03-18 23:38:50 -0700198}
199
Dan Willemsen110a89d2016-01-14 15:17:19 -0800200func (t *toolchainArm64) ToolchainCflags() string {
201 return t.toolchainCflags
202}
203
Colin Cross3f40fa42015-01-30 17:27:36 -0800204func (t *toolchainArm64) Cflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700205 return "${config.Arm64Cflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800206}
207
208func (t *toolchainArm64) Cppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700209 return "${config.Arm64Cppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800210}
211
212func (t *toolchainArm64) Ldflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700213 return "${config.Arm64Ldflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800214}
215
216func (t *toolchainArm64) IncludeFlags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700217 return "${config.Arm64IncludeFlags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800218}
219
220func (t *toolchainArm64) ClangTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700221 return t.GccTriple()
Colin Cross3f40fa42015-01-30 17:27:36 -0800222}
223
224func (t *toolchainArm64) ClangCflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700225 return "${config.Arm64ClangCflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800226}
227
228func (t *toolchainArm64) ClangCppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700229 return "${config.Arm64ClangCppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800230}
231
232func (t *toolchainArm64) ClangLdflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700233 return "${config.Arm64Ldflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800234}
235
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700236func (t *toolchainArm64) ClangLldflags() string {
237 return "${config.Arm64Lldflags}"
238}
239
Dan Willemsen110a89d2016-01-14 15:17:19 -0800240func (t *toolchainArm64) ToolchainClangCflags() string {
241 return t.toolchainClangCflags
242}
243
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700244func (toolchainArm64) SanitizerRuntimeLibraryArch() string {
245 return "aarch64"
Colin Cross16b23492016-01-06 14:41:07 -0800246}
247
Colin Cross635c3b02016-05-18 15:37:25 -0700248func arm64ToolchainFactory(arch android.Arch) Toolchain {
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700249 switch arch.ArchVariant {
250 case "armv8-a":
251 case "armv8-2a":
252 // Nothing extra for armv8-a/armv8-2a
253 default:
Dan Willemsen110a89d2016-01-14 15:17:19 -0800254 panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
255 }
256
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700257 toolchainClangCflags := []string{arm64ClangArchVariantCflagsVar[arch.ArchVariant]}
258 toolchainClangCflags = append(toolchainClangCflags,
259 variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant))
260
Dan Willemsen110a89d2016-01-14 15:17:19 -0800261 return &toolchainArm64{
262 toolchainCflags: variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant),
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700263 toolchainClangCflags: strings.Join(toolchainClangCflags, " "),
Dan Willemsen110a89d2016-01-14 15:17:19 -0800264 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800265}
266
267func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700268 registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -0800269}