blob: 284e5bd058e098267e2dd25182b0eba452bc812d [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 Cross3f40fa42015-01-30 17:27:36 -080015package cc
16
17import (
Dan Willemsen110a89d2016-01-14 15:17:19 -080018 "fmt"
Colin Cross3f40fa42015-01-30 17:27:36 -080019 "strings"
20
21 "android/soong/common"
22)
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",
43
44 "-fno-strict-volatile-bitfields",
45
46 // TARGET_RELEASE_CFLAGS
47 "-DNDEBUG",
48 "-O2 -g",
49 "-Wstrict-aliasing=2",
50 "-fgcse-after-reload",
51 "-frerun-cse-after-loop",
52 "-frename-registers",
53 }
54
55 arm64Ldflags = []string{
56 "-Wl,-z,noexecstack",
57 "-Wl,-z,relro",
58 "-Wl,-z,now",
59 "-Wl,--build-id=md5",
60 "-Wl,--warn-shared-textrel",
61 "-Wl,--fatal-warnings",
62 "-Wl,-maarch64linux",
63 "-Wl,--hash-style=gnu",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070064 "-Wl,--fix-cortex-a53-843419",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080065 "-fuse-ld=gold",
66 "-Wl,--icf=safe",
Dan Willemsenc7e45972015-12-09 13:05:28 -080067 "-Wl,--no-undefined-version",
Colin Cross3f40fa42015-01-30 17:27:36 -080068
69 // Disable transitive dependency library symbol resolving.
70 "-Wl,--allow-shlib-undefined",
71 }
72
73 arm64Cppflags = []string{
74 "-fvisibility-inlines-hidden",
75 }
Dan Willemsen110a89d2016-01-14 15:17:19 -080076
77 arm64CpuVariantCflags = map[string][]string{
78 "cortex-a53": []string{
79 "-mcpu=cortex-a53",
80 },
81 }
82
83 arm64ClangCpuVariantCflags = copyVariantFlags(arm64CpuVariantCflags)
Colin Cross3f40fa42015-01-30 17:27:36 -080084)
85
Dan Willemsen34fc3b12015-12-07 12:30:44 -080086const (
87 arm64GccVersion = "4.9"
88)
89
Colin Cross3f40fa42015-01-30 17:27:36 -080090func init() {
Dan Willemsen34fc3b12015-12-07 12:30:44 -080091 pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
Colin Cross3f40fa42015-01-30 17:27:36 -080092
Dan Willemsen34cc69e2015-09-23 15:26:20 -070093 pctx.SourcePathVariable("arm64GccRoot",
Dan Willemsen87b17d12015-07-14 00:39:06 -070094 "prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
Colin Cross3f40fa42015-01-30 17:27:36 -080095
96 pctx.StaticVariable("arm64GccTriple", "aarch64-linux-android")
97
98 pctx.StaticVariable("arm64Cflags", strings.Join(arm64Cflags, " "))
99 pctx.StaticVariable("arm64Ldflags", strings.Join(arm64Ldflags, " "))
100 pctx.StaticVariable("arm64Cppflags", strings.Join(arm64Cppflags, " "))
101 pctx.StaticVariable("arm64IncludeFlags", strings.Join([]string{
102 "-isystem ${LibcRoot}/arch-arm64/include",
103 "-isystem ${LibcRoot}/include",
104 "-isystem ${LibcRoot}/kernel/uapi",
105 "-isystem ${LibcRoot}/kernel/uapi/asm-arm64",
106 "-isystem ${LibmRoot}/include",
107 "-isystem ${LibmRoot}/include/arm64",
108 }, " "))
109
110 pctx.StaticVariable("arm64ClangCflags", strings.Join(clangFilterUnknownCflags(arm64Cflags), " "))
111 pctx.StaticVariable("arm64ClangLdflags", strings.Join(clangFilterUnknownCflags(arm64Ldflags), " "))
112 pctx.StaticVariable("arm64ClangCppflags", strings.Join(clangFilterUnknownCflags(arm64Cppflags), " "))
Dan Willemsen110a89d2016-01-14 15:17:19 -0800113
114 pctx.StaticVariable("arm64CortexA53Cflags",
115 strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
116 pctx.StaticVariable("arm64ClangCortexA53Cflags",
117 strings.Join(arm64ClangCpuVariantCflags["cortex-a53"], " "))
Colin Cross3f40fa42015-01-30 17:27:36 -0800118}
119
Dan Willemsen110a89d2016-01-14 15:17:19 -0800120var (
121 arm64CpuVariantCflagsVar = map[string]string{
122 "": "",
123 "cortex-a53": "${arm64CortexA53Cflags}",
124 }
125
126 arm64ClangCpuVariantCflagsVar = map[string]string{
127 "": "",
128 "cortex-a53": "${arm64ClangCortexA53Cflags}",
129 }
130)
131
Colin Cross3f40fa42015-01-30 17:27:36 -0800132type toolchainArm64 struct {
133 toolchain64Bit
Colin Cross3f40fa42015-01-30 17:27:36 -0800134
Dan Willemsen110a89d2016-01-14 15:17:19 -0800135 toolchainCflags string
136 toolchainClangCflags string
137}
Colin Cross3f40fa42015-01-30 17:27:36 -0800138
Dan Albertbe961682015-03-18 23:38:50 -0700139func (t *toolchainArm64) Name() string {
140 return "arm64"
141}
142
Colin Cross3f40fa42015-01-30 17:27:36 -0800143func (t *toolchainArm64) GccRoot() string {
144 return "${arm64GccRoot}"
145}
146
147func (t *toolchainArm64) GccTriple() string {
148 return "${arm64GccTriple}"
149}
150
Dan Albertbe961682015-03-18 23:38:50 -0700151func (t *toolchainArm64) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800152 return arm64GccVersion
Dan Albertbe961682015-03-18 23:38:50 -0700153}
154
Dan Willemsen110a89d2016-01-14 15:17:19 -0800155func (t *toolchainArm64) ToolchainCflags() string {
156 return t.toolchainCflags
157}
158
Colin Cross3f40fa42015-01-30 17:27:36 -0800159func (t *toolchainArm64) Cflags() string {
Colin Cross28344522015-04-22 13:07:53 -0700160 return "${arm64Cflags}"
Colin Cross3f40fa42015-01-30 17:27:36 -0800161}
162
163func (t *toolchainArm64) Cppflags() string {
164 return "${arm64Cppflags}"
165}
166
167func (t *toolchainArm64) Ldflags() string {
168 return "${arm64Ldflags}"
169}
170
171func (t *toolchainArm64) IncludeFlags() string {
172 return "${arm64IncludeFlags}"
173}
174
175func (t *toolchainArm64) ClangTriple() string {
176 return "${arm64GccTriple}"
177}
178
179func (t *toolchainArm64) ClangCflags() string {
180 return "${arm64ClangCflags}"
181}
182
183func (t *toolchainArm64) ClangCppflags() string {
184 return "${arm64ClangCppflags}"
185}
186
187func (t *toolchainArm64) ClangLdflags() string {
188 return "${arm64Ldflags}"
189}
190
Dan Willemsen110a89d2016-01-14 15:17:19 -0800191func (t *toolchainArm64) ToolchainClangCflags() string {
192 return t.toolchainClangCflags
193}
194
Colin Crossc5c24ad2015-11-20 15:35:00 -0800195func arm64ToolchainFactory(arch common.Arch) Toolchain {
Dan Willemsen110a89d2016-01-14 15:17:19 -0800196 if arch.ArchVariant != "armv8-a" {
197 panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
198 }
199
200 return &toolchainArm64{
201 toolchainCflags: variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant),
202 toolchainClangCflags: variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant),
203 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800204}
205
206func init() {
Dan Willemsen490fd492015-11-24 17:53:15 -0800207 registerDeviceToolchainFactory(common.Arm64, arm64ToolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -0800208}