blob: d083d2a0b920c8b0d9a6b8e1a11784c2424e82ac [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",
36 "-mbranch-protection=standard",
37 },
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 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070044 }
45
Colin Cross3f40fa42015-01-30 17:27:36 -080046 arm64Ldflags = []string{
Colin Cross3f40fa42015-01-30 17:27:36 -080047 "-Wl,--hash-style=gnu",
Ivan Lozanoc80bbb42020-03-02 16:48:15 -050048 "-Wl,-z,separate-code",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080049 "-Wl,--icf=safe",
Colin Cross3f40fa42015-01-30 17:27:36 -080050 }
51
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -070052 arm64Lldflags = append(ClangFilterUnknownLldflags(arm64Ldflags),
53 "-Wl,-z,max-page-size=4096")
54
Colin Cross26f14502017-11-06 13:59:48 -080055 arm64Cppflags = []string{}
Dan Willemsen110a89d2016-01-14 15:17:19 -080056
Dan Willemsenbd4abf52018-10-07 21:06:36 -070057 arm64ClangCpuVariantCflags = map[string][]string{
Dan Willemsen110a89d2016-01-14 15:17:19 -080058 "cortex-a53": []string{
59 "-mcpu=cortex-a53",
60 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070061 "cortex-a55": []string{
Yi Kong9c633632018-06-15 15:46:11 -070062 "-mcpu=cortex-a55",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070063 },
64 "cortex-a75": []string{
Yi Kong9c633632018-06-15 15:46:11 -070065 // Use the cortex-a55 since it is similar to the little
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070066 // core (cortex-a55) and is sensitive to ordering.
Yi Kong9c633632018-06-15 15:46:11 -070067 "-mcpu=cortex-a55",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070068 },
Haibo Huanga31e2bd2018-10-09 14:27:28 -070069 "cortex-a76": []string{
70 // Use the cortex-a55 since it is similar to the little
71 // core (cortex-a55) and is sensitive to ordering.
72 "-mcpu=cortex-a55",
73 },
Alex Naidisac01ff52016-08-30 15:56:33 +020074 "kryo": []string{
Dan Willemsenbd4abf52018-10-07 21:06:36 -070075 "-mcpu=kryo",
Alex Naidisac01ff52016-08-30 15:56:33 +020076 },
Artem Serovd3072b02018-11-15 15:21:51 +000077 "kryo385": []string{
78 // Use cortex-a53 because kryo385 is not supported in GCC/clang.
79 "-mcpu=cortex-a53",
80 },
Junmo Park8ea49592017-07-24 07:14:55 +090081 "exynos-m1": []string{
82 "-mcpu=exynos-m1",
83 },
Junmo Parkd86c9022017-07-21 09:07:47 +090084 "exynos-m2": []string{
85 "-mcpu=exynos-m2",
86 },
Dan Willemsen110a89d2016-01-14 15:17:19 -080087 }
Colin Cross3f40fa42015-01-30 17:27:36 -080088)
89
Dan Willemsen34fc3b12015-12-07 12:30:44 -080090const (
91 arm64GccVersion = "4.9"
92)
93
Colin Cross3f40fa42015-01-30 17:27:36 -080094func init() {
Dan Willemsen34fc3b12015-12-07 12:30:44 -080095 pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
Colin Cross3f40fa42015-01-30 17:27:36 -080096
Colin Crossb98c8b02016-07-29 13:44:28 -070097 pctx.SourcePathVariable("Arm64GccRoot",
Dan Willemsen87b17d12015-07-14 00:39:06 -070098 "prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
Colin Cross3f40fa42015-01-30 17:27:36 -080099
Colin Crossb98c8b02016-07-29 13:44:28 -0700100 pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " "))
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700101 pctx.StaticVariable("Arm64Lldflags", strings.Join(arm64Lldflags, " "))
Colin Cross3f40fa42015-01-30 17:27:36 -0800102
Colin Crossb98c8b02016-07-29 13:44:28 -0700103 pctx.StaticVariable("Arm64ClangCflags", strings.Join(ClangFilterUnknownCflags(arm64Cflags), " "))
104 pctx.StaticVariable("Arm64ClangLdflags", strings.Join(ClangFilterUnknownCflags(arm64Ldflags), " "))
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700105 pctx.StaticVariable("Arm64ClangLldflags", strings.Join(ClangFilterUnknownCflags(arm64Lldflags), " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700106 pctx.StaticVariable("Arm64ClangCppflags", strings.Join(ClangFilterUnknownCflags(arm64Cppflags), " "))
Dan Willemsen110a89d2016-01-14 15:17:19 -0800107
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700108 pctx.StaticVariable("Arm64ClangArmv8ACflags", strings.Join(arm64ArchVariantCflags["armv8-a"], " "))
Tamas Petzbca786d2021-01-20 18:56:33 +0100109 pctx.StaticVariable("Arm64ClangArmv8ABranchProtCflags", strings.Join(arm64ArchVariantCflags["armv8-a-branchprot"], " "))
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700110 pctx.StaticVariable("Arm64ClangArmv82ACflags", strings.Join(arm64ArchVariantCflags["armv8-2a"], " "))
Raphael Gault70b96b02020-06-18 09:56:53 +0000111 pctx.StaticVariable("Arm64ClangArmv82ADotprodCflags", strings.Join(arm64ArchVariantCflags["armv8-2a-dotprod"], " "))
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700112
Colin Crossb98c8b02016-07-29 13:44:28 -0700113 pctx.StaticVariable("Arm64ClangCortexA53Cflags",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800114 strings.Join(arm64ClangCpuVariantCflags["cortex-a53"], " "))
Alex Naidisac01ff52016-08-30 15:56:33 +0200115
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700116 pctx.StaticVariable("Arm64ClangCortexA55Cflags",
117 strings.Join(arm64ClangCpuVariantCflags["cortex-a55"], " "))
118
Alex Naidisac01ff52016-08-30 15:56:33 +0200119 pctx.StaticVariable("Arm64ClangKryoCflags",
120 strings.Join(arm64ClangCpuVariantCflags["kryo"], " "))
Junmo Parkd86c9022017-07-21 09:07:47 +0900121
Junmo Park8ea49592017-07-24 07:14:55 +0900122 pctx.StaticVariable("Arm64ClangExynosM1Cflags",
123 strings.Join(arm64ClangCpuVariantCflags["exynos-m1"], " "))
124
Junmo Parkd86c9022017-07-21 09:07:47 +0900125 pctx.StaticVariable("Arm64ClangExynosM2Cflags",
126 strings.Join(arm64ClangCpuVariantCflags["exynos-m2"], " "))
Colin Cross3f40fa42015-01-30 17:27:36 -0800127}
128
Dan Willemsen110a89d2016-01-14 15:17:19 -0800129var (
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700130 arm64ClangArchVariantCflagsVar = map[string]string{
131 "armv8-a": "${config.Arm64ClangArmv8ACflags}",
Tamas Petzbca786d2021-01-20 18:56:33 +0100132 "armv8-a-branchprot": "${config.Arm64ClangArmv8ABranchProtCflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700133 "armv8-2a": "${config.Arm64ClangArmv82ACflags}",
Raphael Gault70b96b02020-06-18 09:56:53 +0000134 "armv8-2a-dotprod": "${config.Arm64ClangArmv82ADotprodCflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700135 }
136
Dan Willemsen110a89d2016-01-14 15:17:19 -0800137 arm64ClangCpuVariantCflagsVar = map[string]string{
138 "": "",
Colin Crossb98c8b02016-07-29 13:44:28 -0700139 "cortex-a53": "${config.Arm64ClangCortexA53Cflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700140 "cortex-a55": "${config.Arm64ClangCortexA55Cflags}",
Richard Fungeb37ed32018-09-24 16:33:45 -0700141 "cortex-a72": "${config.Arm64ClangCortexA53Cflags}",
Christopher Ferris6df46f52017-05-08 12:08:40 -0700142 "cortex-a73": "${config.Arm64ClangCortexA53Cflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700143 "cortex-a75": "${config.Arm64ClangCortexA55Cflags}",
Haibo Huanga31e2bd2018-10-09 14:27:28 -0700144 "cortex-a76": "${config.Arm64ClangCortexA55Cflags}",
Alex Naidisac01ff52016-08-30 15:56:33 +0200145 "kryo": "${config.Arm64ClangKryoCflags}",
Artem Serovd3072b02018-11-15 15:21:51 +0000146 "kryo385": "${config.Arm64ClangCortexA53Cflags}",
Junmo Park8ea49592017-07-24 07:14:55 +0900147 "exynos-m1": "${config.Arm64ClangExynosM1Cflags}",
Junmo Parkd86c9022017-07-21 09:07:47 +0900148 "exynos-m2": "${config.Arm64ClangExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800149 }
150)
151
Colin Cross3f40fa42015-01-30 17:27:36 -0800152type toolchainArm64 struct {
153 toolchain64Bit
Colin Cross3f40fa42015-01-30 17:27:36 -0800154
Christopher Ferris79dff702018-05-11 18:23:54 -0700155 ldflags string
Dan Willemsene28663f2018-10-09 14:42:06 -0700156 lldflags string
Dan Willemsen110a89d2016-01-14 15:17:19 -0800157 toolchainClangCflags string
158}
Colin Cross3f40fa42015-01-30 17:27:36 -0800159
Dan Albertbe961682015-03-18 23:38:50 -0700160func (t *toolchainArm64) Name() string {
161 return "arm64"
162}
163
Colin Cross3f40fa42015-01-30 17:27:36 -0800164func (t *toolchainArm64) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700165 return "${config.Arm64GccRoot}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800166}
167
168func (t *toolchainArm64) GccTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700169 return "aarch64-linux-android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800170}
171
Dan Albertbe961682015-03-18 23:38:50 -0700172func (t *toolchainArm64) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800173 return arm64GccVersion
Dan Albertbe961682015-03-18 23:38:50 -0700174}
175
Colin Cross3f40fa42015-01-30 17:27:36 -0800176func (t *toolchainArm64) IncludeFlags() string {
Martin Stjernholm41ab2512020-04-08 01:06:07 +0100177 return ""
Colin Cross3f40fa42015-01-30 17:27:36 -0800178}
179
180func (t *toolchainArm64) ClangTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700181 return t.GccTriple()
Colin Cross3f40fa42015-01-30 17:27:36 -0800182}
183
184func (t *toolchainArm64) ClangCflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700185 return "${config.Arm64ClangCflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800186}
187
188func (t *toolchainArm64) ClangCppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700189 return "${config.Arm64ClangCppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800190}
191
192func (t *toolchainArm64) ClangLdflags() string {
Christopher Ferris79dff702018-05-11 18:23:54 -0700193 return t.ldflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800194}
195
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700196func (t *toolchainArm64) ClangLldflags() string {
Dan Willemsene28663f2018-10-09 14:42:06 -0700197 return t.lldflags
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700198}
199
Dan Willemsen110a89d2016-01-14 15:17:19 -0800200func (t *toolchainArm64) ToolchainClangCflags() string {
201 return t.toolchainClangCflags
202}
203
Yi Kong924adc42018-08-31 14:27:44 -0700204func (toolchainArm64) LibclangRuntimeLibraryArch() string {
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700205 return "aarch64"
Colin Cross16b23492016-01-06 14:41:07 -0800206}
207
Colin Cross635c3b02016-05-18 15:37:25 -0700208func arm64ToolchainFactory(arch android.Arch) Toolchain {
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700209 switch arch.ArchVariant {
210 case "armv8-a":
Tamas Petzbca786d2021-01-20 18:56:33 +0100211 case "armv8-a-branchprot":
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700212 case "armv8-2a":
Raphael Gault70b96b02020-06-18 09:56:53 +0000213 case "armv8-2a-dotprod":
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700214 // Nothing extra for armv8-a/armv8-2a
215 default:
Dan Willemsen110a89d2016-01-14 15:17:19 -0800216 panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
217 }
218
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700219 toolchainClangCflags := []string{arm64ClangArchVariantCflagsVar[arch.ArchVariant]}
220 toolchainClangCflags = append(toolchainClangCflags,
221 variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant))
222
Christopher Ferris79dff702018-05-11 18:23:54 -0700223 var extraLdflags string
224 switch arch.CpuVariant {
Haibo Huangf46b1cb2018-12-03 10:02:45 -0800225 case "cortex-a53", "cortex-a72", "cortex-a73", "kryo", "exynos-m1", "exynos-m2":
Christopher Ferris79dff702018-05-11 18:23:54 -0700226 extraLdflags = "-Wl,--fix-cortex-a53-843419"
227 }
228
Dan Willemsen110a89d2016-01-14 15:17:19 -0800229 return &toolchainArm64{
Christopher Ferris79dff702018-05-11 18:23:54 -0700230 ldflags: strings.Join([]string{
231 "${config.Arm64Ldflags}",
232 extraLdflags,
233 }, " "),
Dan Willemsene28663f2018-10-09 14:42:06 -0700234 lldflags: strings.Join([]string{
235 "${config.Arm64Lldflags}",
236 extraLdflags,
237 }, " "),
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700238 toolchainClangCflags: strings.Join(toolchainClangCflags, " "),
Dan Willemsen110a89d2016-01-14 15:17:19 -0800239 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800240}
241
242func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700243 registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -0800244}