blob: dfe143f95f6c43fdbf8442b8180a289d4b179cdb [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 Hughesc75994d2022-02-02 14:45:41 -080036 // Disable BTI until drm vendors stop using OS libraries as sources
37 // of gadgets (https://issuetracker.google.com/216395195).
38 "-mbranch-protection=pac-ret",
Tamas Petzbca786d2021-01-20 18:56:33 +010039 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070040 "armv8-2a": []string{
Stephen Hines502f9012020-06-16 02:40:40 -070041 "-march=armv8.2-a",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070042 },
Raphael Gault70b96b02020-06-18 09:56:53 +000043 "armv8-2a-dotprod": []string{
44 "-march=armv8.2-a+dotprod",
45 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070046 }
47
Colin Cross3f40fa42015-01-30 17:27:36 -080048 arm64Ldflags = []string{
Colin Cross3f40fa42015-01-30 17:27:36 -080049 "-Wl,--hash-style=gnu",
Ivan Lozanoc80bbb42020-03-02 16:48:15 -050050 "-Wl,-z,separate-code",
Colin Cross3f40fa42015-01-30 17:27:36 -080051 }
52
Colin Cross33bac242021-07-14 17:03:16 -070053 arm64Lldflags = append(arm64Ldflags,
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -070054 "-Wl,-z,max-page-size=4096")
55
Colin Cross26f14502017-11-06 13:59:48 -080056 arm64Cppflags = []string{}
Dan Willemsen110a89d2016-01-14 15:17:19 -080057
Colin Cross33bac242021-07-14 17:03:16 -070058 arm64CpuVariantCflags = map[string][]string{
Dan Willemsen110a89d2016-01-14 15:17:19 -080059 "cortex-a53": []string{
60 "-mcpu=cortex-a53",
61 },
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070062 "cortex-a55": []string{
Yi Kong9c633632018-06-15 15:46:11 -070063 "-mcpu=cortex-a55",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070064 },
65 "cortex-a75": []string{
Yi Kong9c633632018-06-15 15:46:11 -070066 // Use the cortex-a55 since it is similar to the little
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070067 // core (cortex-a55) and is sensitive to ordering.
Yi Kong9c633632018-06-15 15:46:11 -070068 "-mcpu=cortex-a55",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -070069 },
Haibo Huanga31e2bd2018-10-09 14:27:28 -070070 "cortex-a76": []string{
71 // Use the cortex-a55 since it is similar to the little
72 // core (cortex-a55) and is sensitive to ordering.
73 "-mcpu=cortex-a55",
74 },
Alex Naidisac01ff52016-08-30 15:56:33 +020075 "kryo": []string{
Dan Willemsenbd4abf52018-10-07 21:06:36 -070076 "-mcpu=kryo",
Alex Naidisac01ff52016-08-30 15:56:33 +020077 },
Artem Serovd3072b02018-11-15 15:21:51 +000078 "kryo385": []string{
79 // Use cortex-a53 because kryo385 is not supported in GCC/clang.
80 "-mcpu=cortex-a53",
81 },
Junmo Park8ea49592017-07-24 07:14:55 +090082 "exynos-m1": []string{
83 "-mcpu=exynos-m1",
84 },
Junmo Parkd86c9022017-07-21 09:07:47 +090085 "exynos-m2": []string{
86 "-mcpu=exynos-m2",
87 },
Dan Willemsen110a89d2016-01-14 15:17:19 -080088 }
Colin Cross3f40fa42015-01-30 17:27:36 -080089)
90
Dan Willemsen34fc3b12015-12-07 12:30:44 -080091const (
92 arm64GccVersion = "4.9"
93)
94
Colin Cross3f40fa42015-01-30 17:27:36 -080095func init() {
Dan Willemsen34fc3b12015-12-07 12:30:44 -080096 pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
Colin Cross3f40fa42015-01-30 17:27:36 -080097
Colin Crossb98c8b02016-07-29 13:44:28 -070098 pctx.SourcePathVariable("Arm64GccRoot",
Dan Willemsen87b17d12015-07-14 00:39:06 -070099 "prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
Colin Cross3f40fa42015-01-30 17:27:36 -0800100
Sam Delmerico7f889562022-03-25 14:55:40 +0000101 exportedVars.ExportStringListStaticVariable("Arm64Ldflags", arm64Ldflags)
102 exportedVars.ExportStringListStaticVariable("Arm64Lldflags", arm64Lldflags)
Colin Cross3f40fa42015-01-30 17:27:36 -0800103
Sam Delmerico7f889562022-03-25 14:55:40 +0000104 exportedVars.ExportStringListStaticVariable("Arm64Cflags", arm64Cflags)
105 exportedVars.ExportStringListStaticVariable("Arm64Cppflags", arm64Cppflags)
Liz Kammer82ad8cc2021-08-02 10:41:48 -0400106
Sam Delmerico7f889562022-03-25 14:55:40 +0000107 exportedVars.ExportVariableReferenceDict("Arm64ArchVariantCflags", arm64ArchVariantCflagsVar)
108 exportedVars.ExportVariableReferenceDict("Arm64CpuVariantCflags", arm64CpuVariantCflagsVar)
109 exportedVars.ExportVariableReferenceDict("Arm64CpuVariantLdflags", arm64CpuVariantLdflags)
Dan Willemsen110a89d2016-01-14 15:17:19 -0800110
Sam Delmerico7f889562022-03-25 14:55:40 +0000111 exportedVars.ExportStringListStaticVariable("Arm64Armv8ACflags", arm64ArchVariantCflags["armv8-a"])
112 exportedVars.ExportStringListStaticVariable("Arm64Armv8ABranchProtCflags", arm64ArchVariantCflags["armv8-a-branchprot"])
113 exportedVars.ExportStringListStaticVariable("Arm64Armv82ACflags", arm64ArchVariantCflags["armv8-2a"])
114 exportedVars.ExportStringListStaticVariable("Arm64Armv82ADotprodCflags", arm64ArchVariantCflags["armv8-2a-dotprod"])
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700115
Sam Delmerico7f889562022-03-25 14:55:40 +0000116 exportedVars.ExportStringListStaticVariable("Arm64CortexA53Cflags", arm64CpuVariantCflags["cortex-a53"])
117 exportedVars.ExportStringListStaticVariable("Arm64CortexA55Cflags", arm64CpuVariantCflags["cortex-a55"])
118 exportedVars.ExportStringListStaticVariable("Arm64KryoCflags", arm64CpuVariantCflags["kryo"])
119 exportedVars.ExportStringListStaticVariable("Arm64ExynosM1Cflags", arm64CpuVariantCflags["exynos-m1"])
120 exportedVars.ExportStringListStaticVariable("Arm64ExynosM2Cflags", arm64CpuVariantCflags["exynos-m2"])
Liz Kammere8303bd2022-02-16 09:02:48 -0500121
Sam Delmerico7f889562022-03-25 14:55:40 +0000122 exportedVars.ExportStringListStaticVariable("Arm64FixCortexA53Ldflags", []string{"-Wl,--fix-cortex-a53-843419"})
Colin Cross3f40fa42015-01-30 17:27:36 -0800123}
124
Dan Willemsen110a89d2016-01-14 15:17:19 -0800125var (
Colin Cross33bac242021-07-14 17:03:16 -0700126 arm64ArchVariantCflagsVar = map[string]string{
Colin Cross0523ba22021-07-14 18:45:05 -0700127 "armv8-a": "${config.Arm64Armv8ACflags}",
128 "armv8-a-branchprot": "${config.Arm64Armv8ABranchProtCflags}",
129 "armv8-2a": "${config.Arm64Armv82ACflags}",
130 "armv8-2a-dotprod": "${config.Arm64Armv82ADotprodCflags}",
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700131 }
132
Colin Cross33bac242021-07-14 17:03:16 -0700133 arm64CpuVariantCflagsVar = map[string]string{
Colin Cross0523ba22021-07-14 18:45:05 -0700134 "cortex-a53": "${config.Arm64CortexA53Cflags}",
135 "cortex-a55": "${config.Arm64CortexA55Cflags}",
136 "cortex-a72": "${config.Arm64CortexA53Cflags}",
137 "cortex-a73": "${config.Arm64CortexA53Cflags}",
138 "cortex-a75": "${config.Arm64CortexA55Cflags}",
139 "cortex-a76": "${config.Arm64CortexA55Cflags}",
140 "kryo": "${config.Arm64KryoCflags}",
141 "kryo385": "${config.Arm64CortexA53Cflags}",
142 "exynos-m1": "${config.Arm64ExynosM1Cflags}",
143 "exynos-m2": "${config.Arm64ExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800144 }
Liz Kammere8303bd2022-02-16 09:02:48 -0500145
146 arm64CpuVariantLdflags = map[string]string{
147 "cortex-a53": "${config.Arm64FixCortexA53Ldflags}",
148 "cortex-a72": "${config.Arm64FixCortexA53Ldflags}",
149 "cortex-a73": "${config.Arm64FixCortexA53Ldflags}",
150 "kryo": "${config.Arm64FixCortexA53Ldflags}",
151 "exynos-m1": "${config.Arm64FixCortexA53Ldflags}",
152 "exynos-m2": "${config.Arm64FixCortexA53Ldflags}",
153 }
Dan Willemsen110a89d2016-01-14 15:17:19 -0800154)
155
Colin Cross3f40fa42015-01-30 17:27:36 -0800156type toolchainArm64 struct {
Colin Crosse3fee342021-06-21 17:28:25 -0700157 toolchainBionic
Colin Cross3f40fa42015-01-30 17:27:36 -0800158 toolchain64Bit
Colin Cross3f40fa42015-01-30 17:27:36 -0800159
Colin Cross33bac242021-07-14 17:03:16 -0700160 ldflags string
161 lldflags string
162 toolchainCflags string
Dan Willemsen110a89d2016-01-14 15:17:19 -0800163}
Colin Cross3f40fa42015-01-30 17:27:36 -0800164
Dan Albertbe961682015-03-18 23:38:50 -0700165func (t *toolchainArm64) Name() string {
166 return "arm64"
167}
168
Colin Cross3f40fa42015-01-30 17:27:36 -0800169func (t *toolchainArm64) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700170 return "${config.Arm64GccRoot}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800171}
172
173func (t *toolchainArm64) GccTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700174 return "aarch64-linux-android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800175}
176
Dan Albertbe961682015-03-18 23:38:50 -0700177func (t *toolchainArm64) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800178 return arm64GccVersion
Dan Albertbe961682015-03-18 23:38:50 -0700179}
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 {
Dan Albert84f431f2016-07-20 14:44:26 -0700186 return t.GccTriple()
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 {
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700214 switch arch.ArchVariant {
215 case "armv8-a":
Tamas Petzbca786d2021-01-20 18:56:33 +0100216 case "armv8-a-branchprot":
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700217 case "armv8-2a":
Raphael Gault70b96b02020-06-18 09:56:53 +0000218 case "armv8-2a-dotprod":
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700219 // Nothing extra for armv8-a/armv8-2a
220 default:
Dan Willemsen110a89d2016-01-14 15:17:19 -0800221 panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
222 }
223
Colin Cross33bac242021-07-14 17:03:16 -0700224 toolchainCflags := []string{arm64ArchVariantCflagsVar[arch.ArchVariant]}
225 toolchainCflags = append(toolchainCflags,
226 variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant))
Christopher Ferrisba14a8f2018-04-23 18:15:25 -0700227
Liz Kammere8303bd2022-02-16 09:02:48 -0500228 extraLdflags := variantOrDefault(arm64CpuVariantLdflags, arch.CpuVariant)
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 }, " "),
Colin Cross33bac242021-07-14 17:03:16 -0700238 toolchainCflags: strings.Join(toolchainCflags, " "),
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}