blob: 641f96e5c13ed585ea68f0082127ad6b29bfe2f9 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001package cc
2
3import (
4 "fmt"
5 "strings"
6
7 "android/soong/common"
8)
9
10var (
11 armCflags = []string{
12 "-fno-exceptions", // from build/core/combo/select.mk
13 "-Wno-multichar", // from build/core/combo/select.mk
Colin Cross13af54d2015-03-16 16:12:05 -070014 "-msoft-float",
Colin Cross3f40fa42015-01-30 17:27:36 -080015 "-ffunction-sections",
16 "-fdata-sections",
17 "-funwind-tables",
18 "-fstack-protector",
19 "-Wa,--noexecstack",
20 "-Werror=format-security",
21 "-D_FORTIFY_SOURCE=2",
22 "-fno-short-enums",
23 "-no-canonical-prefixes",
24 "-fno-canonical-system-headers",
25 "-include ${SrcDir}/build/core/combo/include/arch/linux-arm/AndroidConfig.h",
26
27 "-fno-builtin-sin",
28 "-fno-strict-volatile-bitfields",
29
30 // TARGET_RELEASE_CFLAGS
31 "-DNDEBUG",
32 "-g",
33 "-Wstrict-aliasing=2",
34 "-fgcse-after-reload",
35 "-frerun-cse-after-loop",
36 "-frename-registers",
37 }
38
39 armCppflags = []string{
40 "-fvisibility-inlines-hidden",
41 }
42
43 armLdflags = []string{
44 "-Wl,-z,noexecstack",
45 "-Wl,-z,relro",
46 "-Wl,-z,now",
47 "-Wl,--build-id=md5",
48 "-Wl,--warn-shared-textrel",
49 "-Wl,--fatal-warnings",
Colin Cross13af54d2015-03-16 16:12:05 -070050 "-Wl,--icf=safe",
Colin Cross3f40fa42015-01-30 17:27:36 -080051 "-Wl,--hash-style=gnu",
52
53 // Disable transitive dependency library symbol resolving.
54 "-Wl,--allow-shlib-undefined",
55 }
56
57 armArmCflags = []string{
58 "-O2",
59 "-fomit-frame-pointer",
60 "-fstrict-aliasing",
61 "-funswitch-loops",
62 }
63
64 armThumbCflags = []string{
65 "-mthumb",
66 "-Os",
67 "-fomit-frame-pointer",
68 "-fno-strict-aliasing",
69 }
70
71 armArchVariantCflags = map[string][]string{
72 "armv5te": []string{
73 "-march=armv5te",
74 "-mtune=xscale",
75 "-D__ARM_ARCH_5__",
76 "-D__ARM_ARCH_5T__",
77 "-D__ARM_ARCH_5E__",
78 "-D__ARM_ARCH_5TE__",
79 },
80 "armv7-a": []string{
81 "-march=armv7-a",
82 "-mfloat-abi=softfp",
83 "-mfpu=vfpv3-d16",
84 },
85 "armv7-a-neon": []string{
86 "-mfloat-abi=softfp",
87 "-mfpu=neon",
88 },
89 }
90
Colin Cross3f40fa42015-01-30 17:27:36 -080091 armCpuVariantCflags = map[string][]string{
92 "cortex-a7": []string{
93 "-mcpu=cortex-a7",
94 },
95 "cortex-a8": []string{
96 "-mcpu=cortex-a8",
97 },
98 "cortex-a15": []string{
99 "-mcpu=cortex-a15",
100 // Fake an ARM compiler flag as these processors support LPAE which GCC/clang
101 // don't advertise.
102 "-D__ARM_FEATURE_LPAE=1",
103 },
104 }
105
106 armClangCpuVariantCflags = armCpuVariantCflags
107 armClangArchVariantCflags = armArchVariantCflags
108)
109
110func init() {
111 replaceFirst := func(slice []string, from, to string) {
112 if slice[0] != from {
113 panic(fmt.Errorf("Expected %q, found %q", from, to))
114 }
115
116 slice[0] = to
117 }
118
119 replaceFirst(armClangArchVariantCflags["armv5te"], "-march=armv5te", "-march=armv5t")
120 replaceFirst(armClangCpuVariantCflags["cortex-a15"], "-mcpu=cortex-a15", "-march=armv7-a")
121 armClangCpuVariantCflags["krait"] = []string{
122 "-mcpu=krait",
123 }
124
125 pctx.StaticVariable("armGccVersion", "4.9")
126
127 pctx.StaticVariable("armGccRoot",
128 "${SrcDir}/prebuilts/gcc/${HostPrebuiltTag}/arm/arm-linux-androideabi-${armGccVersion}")
129
130 pctx.StaticVariable("armGccTriple", "arm-linux-androideabi")
131
132 pctx.StaticVariable("armCflags", strings.Join(armCflags, " "))
133 pctx.StaticVariable("armLdflags", strings.Join(armLdflags, " "))
134 pctx.StaticVariable("armCppflags", strings.Join(armCppflags, " "))
135 pctx.StaticVariable("armIncludeFlags", strings.Join([]string{
136 "-isystem ${LibcRoot}/arch-arm/include",
137 "-isystem ${LibcRoot}/include",
138 "-isystem ${LibcRoot}/kernel/uapi",
139 "-isystem ${LibcRoot}/kernel/uapi/asm-arm",
140 "-isystem ${LibmRoot}/include",
141 "-isystem ${LibmRoot}/include/arm",
142 }, " "))
143
144 // Extended cflags
145
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700146 // ARM vs. Thumb instruction set flags
Colin Cross3f40fa42015-01-30 17:27:36 -0800147 pctx.StaticVariable("armArmCflags", strings.Join(armArmCflags, " "))
148 pctx.StaticVariable("armThumbCflags", strings.Join(armThumbCflags, " "))
149
150 // Architecture variant cflags
151 pctx.StaticVariable("armArmv5TECflags", strings.Join(armArchVariantCflags["armv5te"], " "))
152 pctx.StaticVariable("armArmv7ACflags", strings.Join(armArchVariantCflags["armv7-a"], " "))
153 pctx.StaticVariable("armArmv7ANeonCflags", strings.Join(armArchVariantCflags["armv7-a-neon"], " "))
154
Colin Cross3f40fa42015-01-30 17:27:36 -0800155 // Cpu variant cflags
156 pctx.StaticVariable("armCortexA7Cflags", strings.Join(armCpuVariantCflags["cortex-a7"], " "))
157 pctx.StaticVariable("armCortexA8Cflags", strings.Join(armCpuVariantCflags["cortex-a8"], " "))
158 pctx.StaticVariable("armCortexA15Cflags", strings.Join(armCpuVariantCflags["cortex-a15"], " "))
159
160 // Clang cflags
161 pctx.StaticVariable("armClangCflags", strings.Join(clangFilterUnknownCflags(armCflags), " "))
162 pctx.StaticVariable("armClangLdflags", strings.Join(clangFilterUnknownCflags(armLdflags), " "))
163 pctx.StaticVariable("armClangCppflags", strings.Join(clangFilterUnknownCflags(armCppflags), " "))
164
165 // Clang cpu variant cflags
166 pctx.StaticVariable("armClangArmv5TECflags",
167 strings.Join(armClangArchVariantCflags["armv5te"], " "))
168 pctx.StaticVariable("armClangArmv7ACflags",
169 strings.Join(armClangArchVariantCflags["armv7-a"], " "))
170 pctx.StaticVariable("armClangArmv7ANeonCflags",
171 strings.Join(armClangArchVariantCflags["armv7-a-neon"], " "))
172
173 // Clang cpu variant cflags
174 pctx.StaticVariable("armClangCortexA7Cflags",
175 strings.Join(armClangCpuVariantCflags["cortex-a7"], " "))
176 pctx.StaticVariable("armClangCortexA8Cflags",
177 strings.Join(armClangCpuVariantCflags["cortex-a8"], " "))
178 pctx.StaticVariable("armClangCortexA15Cflags",
179 strings.Join(armClangCpuVariantCflags["cortex-a15"], " "))
180 pctx.StaticVariable("armClangKraitCflags",
181 strings.Join(armClangCpuVariantCflags["krait"], " "))
182}
183
184var (
185 armArchVariantCflagsVar = map[string]string{
186 "armv5te": "${armArmv5TECflags}",
187 "armv7-a": "${armArmv7ACflags}",
188 "armv7-a-neon": "${armArmv7ANeonCflags}",
189 }
190
Colin Cross3f40fa42015-01-30 17:27:36 -0800191 armCpuVariantCflagsVar = map[string]string{
192 "": "",
193 "cortex-a7": "${armCortexA7Cflags}",
194 "cortex-a8": "${armCortexA8Cflags}",
195 "cortex-a15": "${armCortexA15Cflags}",
196 "krait": "${armCortexA15Cflags}",
197 "denver": "${armCortexA15Cflags}",
198 }
199
200 armClangArchVariantCflagsVar = map[string]string{
201 "armv5te": "${armClangArmv5TECflags}",
202 "armv7-a": "${armClangArmv7ACflags}",
203 "armv7-a-neon": "${armClangArmv7ANeonCflags}",
204 }
205
206 armClangCpuVariantCflagsVar = map[string]string{
207 "": "",
208 "cortex-a7": "${armClangCortexA7Cflags}",
209 "cortex-a8": "${armClangCortexA8Cflags}",
210 "cortex-a15": "${armClangCortexA15Cflags}",
211 "krait": "${armClangKraitCflags}",
212 "denver": "${armClangCortexA15Cflags}",
213 }
214)
215
216type toolchainArm struct {
217 toolchain32Bit
218 cflags, ldflags, clangCflags string
219}
220
Dan Albertbe961682015-03-18 23:38:50 -0700221func (t *toolchainArm) Name() string {
222 return "arm"
223}
224
Colin Cross3f40fa42015-01-30 17:27:36 -0800225func (t *toolchainArm) GccRoot() string {
226 return "${armGccRoot}"
227}
228
229func (t *toolchainArm) GccTriple() string {
230 return "${armGccTriple}"
231}
232
Dan Albertbe961682015-03-18 23:38:50 -0700233func (t *toolchainArm) GccVersion() string {
234 return "${armGccVersion}"
235}
236
Colin Cross3f40fa42015-01-30 17:27:36 -0800237func (t *toolchainArm) Cflags() string {
238 return t.cflags
239}
240
241func (t *toolchainArm) Cppflags() string {
242 return "${armCppflags}"
243}
244
245func (t *toolchainArm) Ldflags() string {
246 return t.ldflags
247}
248
249func (t *toolchainArm) IncludeFlags() string {
250 return "${armIncludeFlags}"
251}
252
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700253func (t *toolchainArm) InstructionSetFlags(isa string) (string, error) {
254 switch isa {
255 case "arm":
256 return "${armArmCflags}", nil
257 case "thumb", "":
258 return "${armThumbCflags}", nil
259 default:
260 return t.toolchainBase.InstructionSetFlags(isa)
261 }
262}
263
Colin Cross3f40fa42015-01-30 17:27:36 -0800264func (t *toolchainArm) ClangTriple() string {
265 return "${armGccTriple}"
266}
267
268func (t *toolchainArm) ClangCflags() string {
269 return t.clangCflags
270}
271
272func (t *toolchainArm) ClangCppflags() string {
273 return "${armClangCppflags}"
274}
275
276func (t *toolchainArm) ClangLdflags() string {
277 return t.ldflags
278}
279
Colin Cross97ba0732015-03-23 17:50:24 -0700280func armToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Crossc1e814d2015-04-28 13:15:59 -0700281 var fixCortexA8 string
282 switch cpuVariant {
283 case "cortex-a8", "":
284 // Generic ARM might be a Cortex A8 -- better safe than sorry
285 fixCortexA8 = "-Wl,--fix-cortex-a8"
286 default:
287 fixCortexA8 = "-Wl,--no-fix-cortex-a8"
288 }
289
Colin Cross3f40fa42015-01-30 17:27:36 -0800290 return &toolchainArm{
291 cflags: strings.Join([]string{
292 "${armCflags}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800293 armArchVariantCflagsVar[archVariant],
294 armCpuVariantCflagsVar[cpuVariant],
295 }, " "),
296 ldflags: strings.Join([]string{
297 "${armLdflags}",
Colin Crossc1e814d2015-04-28 13:15:59 -0700298 fixCortexA8,
Colin Cross3f40fa42015-01-30 17:27:36 -0800299 }, " "),
300 clangCflags: strings.Join([]string{
301 "${armClangCflags}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800302 armClangArchVariantCflagsVar[archVariant],
303 armClangCpuVariantCflagsVar[cpuVariant],
304 }, " "),
305 }
306}
307
308func init() {
309 registerToolchainFactory(common.Device, common.Arm, armToolchainFactory)
310}