blob: c206675fefb7352568129f5abcd47a4ff124934b [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 "-fdata-sections",
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "-fno-short-enums",
Colin Cross3f40fa42015-01-30 17:27:36 -080028
29 // Help catch common 32/64-bit errors.
Dan Willemsen162d08f2016-05-06 17:13:56 -070030 "-Werror=implicit-function-declaration",
Colin Cross3f40fa42015-01-30 17:27:36 -080031
32 "-fno-strict-volatile-bitfields",
33
34 // TARGET_RELEASE_CFLAGS
Colin Cross3f40fa42015-01-30 17:27:36 -080035 "-fgcse-after-reload",
36 "-frerun-cse-after-loop",
37 "-frename-registers",
38 }
39
40 arm64Ldflags = []string{
Stephen Craneb3c21542017-06-26 19:22:02 -070041 "-Wl,-m,aarch64_elf64_le_vec",
Colin Cross3f40fa42015-01-30 17:27:36 -080042 "-Wl,--hash-style=gnu",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070043 "-Wl,--fix-cortex-a53-843419",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080044 "-fuse-ld=gold",
45 "-Wl,--icf=safe",
Colin Cross3f40fa42015-01-30 17:27:36 -080046 }
47
Colin Cross26f14502017-11-06 13:59:48 -080048 arm64Cppflags = []string{}
Dan Willemsen110a89d2016-01-14 15:17:19 -080049
50 arm64CpuVariantCflags = map[string][]string{
51 "cortex-a53": []string{
52 "-mcpu=cortex-a53",
53 },
Alex Naidisac01ff52016-08-30 15:56:33 +020054 "kryo": []string{
Alex Naidis5df73d02017-04-05 20:08:41 +020055 // Use the cortex-a57 cpu since some compilers
56 // don't support a Kryo specific target yet.
Alex Naidisac01ff52016-08-30 15:56:33 +020057 "-mcpu=cortex-a57",
58 },
Junmo Park8ea49592017-07-24 07:14:55 +090059 "exynos-m1": []string{
60 "-mcpu=exynos-m1",
61 },
Junmo Parkd86c9022017-07-21 09:07:47 +090062 "exynos-m2": []string{
63 "-mcpu=exynos-m2",
64 },
Dan Willemsen110a89d2016-01-14 15:17:19 -080065 }
66
67 arm64ClangCpuVariantCflags = copyVariantFlags(arm64CpuVariantCflags)
Colin Cross3f40fa42015-01-30 17:27:36 -080068)
69
Dan Willemsen34fc3b12015-12-07 12:30:44 -080070const (
71 arm64GccVersion = "4.9"
72)
73
Colin Cross3f40fa42015-01-30 17:27:36 -080074func init() {
Dan Willemsenb1957a52016-06-23 23:44:54 -070075 android.RegisterArchVariants(android.Arm64,
76 "armv8_a",
Christopher Ferris6df46f52017-05-08 12:08:40 -070077 "cortex-a53",
78 "cortex-a73",
Alex Naidisac01ff52016-08-30 15:56:33 +020079 "kryo",
Junmo Park8ea49592017-07-24 07:14:55 +090080 "exynos-m1",
Junmo Parkd86c9022017-07-21 09:07:47 +090081 "exynos-m2",
Dan Willemsenb1957a52016-06-23 23:44:54 -070082 "denver64")
83
Alex Naidis5df73d02017-04-05 20:08:41 +020084 // Clang supports specific Kryo targeting
85 replaceFirst(arm64ClangCpuVariantCflags["kryo"], "-mcpu=cortex-a57", "-mcpu=kryo")
86
Dan Willemsen34fc3b12015-12-07 12:30:44 -080087 pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
Colin Cross3f40fa42015-01-30 17:27:36 -080088
Colin Crossb98c8b02016-07-29 13:44:28 -070089 pctx.SourcePathVariable("Arm64GccRoot",
Dan Willemsen87b17d12015-07-14 00:39:06 -070090 "prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
Colin Cross3f40fa42015-01-30 17:27:36 -080091
Colin Crossb98c8b02016-07-29 13:44:28 -070092 pctx.StaticVariable("Arm64Cflags", strings.Join(arm64Cflags, " "))
93 pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " "))
94 pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " "))
Elliott Hughesde28deb2017-10-12 09:07:53 -070095 pctx.StaticVariable("Arm64IncludeFlags", bionicHeaders("arm64"))
Colin Cross3f40fa42015-01-30 17:27:36 -080096
Colin Crossb98c8b02016-07-29 13:44:28 -070097 pctx.StaticVariable("Arm64ClangCflags", strings.Join(ClangFilterUnknownCflags(arm64Cflags), " "))
98 pctx.StaticVariable("Arm64ClangLdflags", strings.Join(ClangFilterUnknownCflags(arm64Ldflags), " "))
99 pctx.StaticVariable("Arm64ClangCppflags", strings.Join(ClangFilterUnknownCflags(arm64Cppflags), " "))
Dan Willemsen110a89d2016-01-14 15:17:19 -0800100
Colin Crossb98c8b02016-07-29 13:44:28 -0700101 pctx.StaticVariable("Arm64CortexA53Cflags",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800102 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700103 pctx.StaticVariable("Arm64ClangCortexA53Cflags",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800104 strings.Join(arm64ClangCpuVariantCflags["cortex-a53"], " "))
Alex Naidisac01ff52016-08-30 15:56:33 +0200105
106 pctx.StaticVariable("Arm64KryoCflags",
107 strings.Join(arm64CpuVariantCflags["kryo"], " "))
108 pctx.StaticVariable("Arm64ClangKryoCflags",
109 strings.Join(arm64ClangCpuVariantCflags["kryo"], " "))
Junmo Parkd86c9022017-07-21 09:07:47 +0900110
Junmo Park8ea49592017-07-24 07:14:55 +0900111 pctx.StaticVariable("Arm64ExynosM1Cflags",
112 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
113 pctx.StaticVariable("Arm64ClangExynosM1Cflags",
114 strings.Join(arm64ClangCpuVariantCflags["exynos-m1"], " "))
115
Junmo Parkd86c9022017-07-21 09:07:47 +0900116 pctx.StaticVariable("Arm64ExynosM2Cflags",
117 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
118 pctx.StaticVariable("Arm64ClangExynosM2Cflags",
119 strings.Join(arm64ClangCpuVariantCflags["exynos-m2"], " "))
Colin Cross3f40fa42015-01-30 17:27:36 -0800120}
121
Dan Willemsen110a89d2016-01-14 15:17:19 -0800122var (
123 arm64CpuVariantCflagsVar = map[string]string{
124 "": "",
Colin Crossb98c8b02016-07-29 13:44:28 -0700125 "cortex-a53": "${config.Arm64CortexA53Cflags}",
Christopher Ferris6df46f52017-05-08 12:08:40 -0700126 "cortex-a73": "${config.Arm64CortexA53Cflags}",
Alex Naidisac01ff52016-08-30 15:56:33 +0200127 "kryo": "${config.Arm64KryoCflags}",
Junmo Park8ea49592017-07-24 07:14:55 +0900128 "exynos-m1": "${config.Arm64ExynosM1Cflags}",
Junmo Parkd86c9022017-07-21 09:07:47 +0900129 "exynos-m2": "${config.Arm64ExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800130 }
131
132 arm64ClangCpuVariantCflagsVar = map[string]string{
133 "": "",
Colin Crossb98c8b02016-07-29 13:44:28 -0700134 "cortex-a53": "${config.Arm64ClangCortexA53Cflags}",
Christopher Ferris6df46f52017-05-08 12:08:40 -0700135 "cortex-a73": "${config.Arm64ClangCortexA53Cflags}",
Alex Naidisac01ff52016-08-30 15:56:33 +0200136 "kryo": "${config.Arm64ClangKryoCflags}",
Junmo Park8ea49592017-07-24 07:14:55 +0900137 "exynos-m1": "${config.Arm64ClangExynosM1Cflags}",
Junmo Parkd86c9022017-07-21 09:07:47 +0900138 "exynos-m2": "${config.Arm64ClangExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800139 }
140)
141
Colin Cross3f40fa42015-01-30 17:27:36 -0800142type toolchainArm64 struct {
143 toolchain64Bit
Colin Cross3f40fa42015-01-30 17:27:36 -0800144
Dan Willemsen110a89d2016-01-14 15:17:19 -0800145 toolchainCflags string
146 toolchainClangCflags string
147}
Colin Cross3f40fa42015-01-30 17:27:36 -0800148
Dan Albertbe961682015-03-18 23:38:50 -0700149func (t *toolchainArm64) Name() string {
150 return "arm64"
151}
152
Colin Cross3f40fa42015-01-30 17:27:36 -0800153func (t *toolchainArm64) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700154 return "${config.Arm64GccRoot}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800155}
156
157func (t *toolchainArm64) GccTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700158 return "aarch64-linux-android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800159}
160
Dan Albertbe961682015-03-18 23:38:50 -0700161func (t *toolchainArm64) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800162 return arm64GccVersion
Dan Albertbe961682015-03-18 23:38:50 -0700163}
164
Dan Willemsen110a89d2016-01-14 15:17:19 -0800165func (t *toolchainArm64) ToolchainCflags() string {
166 return t.toolchainCflags
167}
168
Colin Cross3f40fa42015-01-30 17:27:36 -0800169func (t *toolchainArm64) Cflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700170 return "${config.Arm64Cflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800171}
172
173func (t *toolchainArm64) Cppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700174 return "${config.Arm64Cppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800175}
176
177func (t *toolchainArm64) Ldflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700178 return "${config.Arm64Ldflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800179}
180
181func (t *toolchainArm64) IncludeFlags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700182 return "${config.Arm64IncludeFlags}"
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
189func (t *toolchainArm64) ClangCflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700190 return "${config.Arm64ClangCflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800191}
192
193func (t *toolchainArm64) ClangCppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700194 return "${config.Arm64ClangCppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800195}
196
197func (t *toolchainArm64) ClangLdflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700198 return "${config.Arm64Ldflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800199}
200
Dan Willemsen110a89d2016-01-14 15:17:19 -0800201func (t *toolchainArm64) ToolchainClangCflags() string {
202 return t.toolchainClangCflags
203}
204
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700205func (toolchainArm64) SanitizerRuntimeLibraryArch() string {
206 return "aarch64"
Colin Cross16b23492016-01-06 14:41:07 -0800207}
208
Colin Cross635c3b02016-05-18 15:37:25 -0700209func arm64ToolchainFactory(arch android.Arch) Toolchain {
Dan Willemsen110a89d2016-01-14 15:17:19 -0800210 if arch.ArchVariant != "armv8-a" {
211 panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
212 }
213
214 return &toolchainArm64{
215 toolchainCflags: variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant),
216 toolchainClangCflags: variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant),
217 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800218}
219
220func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700221 registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -0800222}