blob: 139c901c4b5808c9317f3c70c04882cb8a4fadf5 [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{
26 "-fno-exceptions", // from build/core/combo/select.mk
27 "-Wno-multichar", // from build/core/combo/select.mk
28 "-fno-strict-aliasing",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080029 "-fstack-protector-strong",
Colin Cross3f40fa42015-01-30 17:27:36 -080030 "-ffunction-sections",
31 "-fdata-sections",
32 "-funwind-tables",
33 "-Wa,--noexecstack",
34 "-Werror=format-security",
35 "-D_FORTIFY_SOURCE=2",
36 "-fno-short-enums",
37 "-no-canonical-prefixes",
38 "-fno-canonical-system-headers",
Colin Cross3f40fa42015-01-30 17:27:36 -080039
40 // Help catch common 32/64-bit errors.
41 "-Werror=pointer-to-int-cast",
42 "-Werror=int-to-pointer-cast",
Dan Willemsen162d08f2016-05-06 17:13:56 -070043 "-Werror=implicit-function-declaration",
Colin Cross3f40fa42015-01-30 17:27:36 -080044
45 "-fno-strict-volatile-bitfields",
46
47 // TARGET_RELEASE_CFLAGS
48 "-DNDEBUG",
49 "-O2 -g",
50 "-Wstrict-aliasing=2",
51 "-fgcse-after-reload",
52 "-frerun-cse-after-loop",
53 "-frename-registers",
54 }
55
56 arm64Ldflags = []string{
57 "-Wl,-z,noexecstack",
58 "-Wl,-z,relro",
59 "-Wl,-z,now",
60 "-Wl,--build-id=md5",
61 "-Wl,--warn-shared-textrel",
62 "-Wl,--fatal-warnings",
63 "-Wl,-maarch64linux",
64 "-Wl,--hash-style=gnu",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070065 "-Wl,--fix-cortex-a53-843419",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080066 "-fuse-ld=gold",
67 "-Wl,--icf=safe",
Dan Willemsenc7e45972015-12-09 13:05:28 -080068 "-Wl,--no-undefined-version",
Colin Cross3f40fa42015-01-30 17:27:36 -080069 }
70
71 arm64Cppflags = []string{
72 "-fvisibility-inlines-hidden",
73 }
Dan Willemsen110a89d2016-01-14 15:17:19 -080074
75 arm64CpuVariantCflags = map[string][]string{
76 "cortex-a53": []string{
77 "-mcpu=cortex-a53",
78 },
Alex Naidisac01ff52016-08-30 15:56:33 +020079 "kryo": []string{
Alex Naidis5df73d02017-04-05 20:08:41 +020080 // Use the cortex-a57 cpu since some compilers
81 // don't support a Kryo specific target yet.
Alex Naidisac01ff52016-08-30 15:56:33 +020082 "-mcpu=cortex-a57",
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 }
88
89 arm64ClangCpuVariantCflags = copyVariantFlags(arm64CpuVariantCflags)
Colin Cross3f40fa42015-01-30 17:27:36 -080090)
91
Dan Willemsen34fc3b12015-12-07 12:30:44 -080092const (
93 arm64GccVersion = "4.9"
94)
95
Colin Cross3f40fa42015-01-30 17:27:36 -080096func init() {
Dan Willemsenb1957a52016-06-23 23:44:54 -070097 android.RegisterArchVariants(android.Arm64,
98 "armv8_a",
Christopher Ferris6df46f52017-05-08 12:08:40 -070099 "cortex-a53",
100 "cortex-a73",
Alex Naidisac01ff52016-08-30 15:56:33 +0200101 "kryo",
Junmo Parkd86c9022017-07-21 09:07:47 +0900102 "exynos-m2",
Dan Willemsenb1957a52016-06-23 23:44:54 -0700103 "denver64")
104
Alex Naidis5df73d02017-04-05 20:08:41 +0200105 // Clang supports specific Kryo targeting
106 replaceFirst(arm64ClangCpuVariantCflags["kryo"], "-mcpu=cortex-a57", "-mcpu=kryo")
107
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800108 pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
Colin Cross3f40fa42015-01-30 17:27:36 -0800109
Colin Crossb98c8b02016-07-29 13:44:28 -0700110 pctx.SourcePathVariable("Arm64GccRoot",
Dan Willemsen87b17d12015-07-14 00:39:06 -0700111 "prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
Colin Cross3f40fa42015-01-30 17:27:36 -0800112
Colin Crossb98c8b02016-07-29 13:44:28 -0700113 pctx.StaticVariable("Arm64Cflags", strings.Join(arm64Cflags, " "))
114 pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " "))
115 pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " "))
116 pctx.StaticVariable("Arm64IncludeFlags", bionicHeaders("arm64", "arm64"))
Colin Cross3f40fa42015-01-30 17:27:36 -0800117
Colin Crossb98c8b02016-07-29 13:44:28 -0700118 pctx.StaticVariable("Arm64ClangCflags", strings.Join(ClangFilterUnknownCflags(arm64Cflags), " "))
119 pctx.StaticVariable("Arm64ClangLdflags", strings.Join(ClangFilterUnknownCflags(arm64Ldflags), " "))
120 pctx.StaticVariable("Arm64ClangCppflags", strings.Join(ClangFilterUnknownCflags(arm64Cppflags), " "))
Dan Willemsen110a89d2016-01-14 15:17:19 -0800121
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
127 pctx.StaticVariable("Arm64KryoCflags",
128 strings.Join(arm64CpuVariantCflags["kryo"], " "))
129 pctx.StaticVariable("Arm64ClangKryoCflags",
130 strings.Join(arm64ClangCpuVariantCflags["kryo"], " "))
Junmo Parkd86c9022017-07-21 09:07:47 +0900131
132 pctx.StaticVariable("Arm64ExynosM2Cflags",
133 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
134 pctx.StaticVariable("Arm64ClangExynosM2Cflags",
135 strings.Join(arm64ClangCpuVariantCflags["exynos-m2"], " "))
Colin Cross3f40fa42015-01-30 17:27:36 -0800136}
137
Dan Willemsen110a89d2016-01-14 15:17:19 -0800138var (
139 arm64CpuVariantCflagsVar = map[string]string{
140 "": "",
Colin Crossb98c8b02016-07-29 13:44:28 -0700141 "cortex-a53": "${config.Arm64CortexA53Cflags}",
Christopher Ferris6df46f52017-05-08 12:08:40 -0700142 "cortex-a73": "${config.Arm64CortexA53Cflags}",
Alex Naidisac01ff52016-08-30 15:56:33 +0200143 "kryo": "${config.Arm64KryoCflags}",
Junmo Parkd86c9022017-07-21 09:07:47 +0900144 "exynos-m2": "${config.Arm64ExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800145 }
146
147 arm64ClangCpuVariantCflagsVar = map[string]string{
148 "": "",
Colin Crossb98c8b02016-07-29 13:44:28 -0700149 "cortex-a53": "${config.Arm64ClangCortexA53Cflags}",
Christopher Ferris6df46f52017-05-08 12:08:40 -0700150 "cortex-a73": "${config.Arm64ClangCortexA53Cflags}",
Alex Naidisac01ff52016-08-30 15:56:33 +0200151 "kryo": "${config.Arm64ClangKryoCflags}",
Junmo Parkd86c9022017-07-21 09:07:47 +0900152 "exynos-m2": "${config.Arm64ClangExynosM2Cflags}",
Dan Willemsen110a89d2016-01-14 15:17:19 -0800153 }
154)
155
Colin Cross3f40fa42015-01-30 17:27:36 -0800156type toolchainArm64 struct {
157 toolchain64Bit
Colin Cross3f40fa42015-01-30 17:27:36 -0800158
Dan Willemsen110a89d2016-01-14 15:17:19 -0800159 toolchainCflags string
160 toolchainClangCflags string
161}
Colin Cross3f40fa42015-01-30 17:27:36 -0800162
Dan Albertbe961682015-03-18 23:38:50 -0700163func (t *toolchainArm64) Name() string {
164 return "arm64"
165}
166
Colin Cross3f40fa42015-01-30 17:27:36 -0800167func (t *toolchainArm64) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700168 return "${config.Arm64GccRoot}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800169}
170
171func (t *toolchainArm64) GccTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700172 return "aarch64-linux-android"
Colin Cross3f40fa42015-01-30 17:27:36 -0800173}
174
Dan Albertbe961682015-03-18 23:38:50 -0700175func (t *toolchainArm64) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800176 return arm64GccVersion
Dan Albertbe961682015-03-18 23:38:50 -0700177}
178
Dan Willemsen110a89d2016-01-14 15:17:19 -0800179func (t *toolchainArm64) ToolchainCflags() string {
180 return t.toolchainCflags
181}
182
Colin Cross3f40fa42015-01-30 17:27:36 -0800183func (t *toolchainArm64) Cflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700184 return "${config.Arm64Cflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800185}
186
187func (t *toolchainArm64) Cppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700188 return "${config.Arm64Cppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800189}
190
191func (t *toolchainArm64) Ldflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700192 return "${config.Arm64Ldflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800193}
194
195func (t *toolchainArm64) IncludeFlags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700196 return "${config.Arm64IncludeFlags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800197}
198
199func (t *toolchainArm64) ClangTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700200 return t.GccTriple()
Colin Cross3f40fa42015-01-30 17:27:36 -0800201}
202
203func (t *toolchainArm64) ClangCflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700204 return "${config.Arm64ClangCflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800205}
206
207func (t *toolchainArm64) ClangCppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700208 return "${config.Arm64ClangCppflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800209}
210
211func (t *toolchainArm64) ClangLdflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700212 return "${config.Arm64Ldflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800213}
214
Dan Willemsen110a89d2016-01-14 15:17:19 -0800215func (t *toolchainArm64) ToolchainClangCflags() string {
216 return t.toolchainClangCflags
217}
218
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700219func (toolchainArm64) SanitizerRuntimeLibraryArch() string {
220 return "aarch64"
Colin Cross16b23492016-01-06 14:41:07 -0800221}
222
Colin Cross635c3b02016-05-18 15:37:25 -0700223func arm64ToolchainFactory(arch android.Arch) Toolchain {
Dan Willemsen110a89d2016-01-14 15:17:19 -0800224 if arch.ArchVariant != "armv8-a" {
225 panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
226 }
227
228 return &toolchainArm64{
229 toolchainCflags: variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant),
230 toolchainClangCflags: variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant),
231 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800232}
233
234func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700235 registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -0800236}