blob: 8adbc2915e8e2791a49b4543af76e49d6d26be31 [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",
Colin Cross3f40fa42015-01-30 17:27:36 -080052 }
53
54 armArmCflags = []string{
55 "-O2",
56 "-fomit-frame-pointer",
57 "-fstrict-aliasing",
58 "-funswitch-loops",
59 }
60
61 armThumbCflags = []string{
62 "-mthumb",
63 "-Os",
64 "-fomit-frame-pointer",
65 "-fno-strict-aliasing",
66 }
67
68 armArchVariantCflags = map[string][]string{
69 "armv5te": []string{
70 "-march=armv5te",
71 "-mtune=xscale",
72 "-D__ARM_ARCH_5__",
73 "-D__ARM_ARCH_5T__",
74 "-D__ARM_ARCH_5E__",
75 "-D__ARM_ARCH_5TE__",
76 },
77 "armv7-a": []string{
78 "-march=armv7-a",
79 "-mfloat-abi=softfp",
80 "-mfpu=vfpv3-d16",
81 },
82 "armv7-a-neon": []string{
83 "-mfloat-abi=softfp",
84 "-mfpu=neon",
85 },
86 }
87
Colin Cross3f40fa42015-01-30 17:27:36 -080088 armCpuVariantCflags = map[string][]string{
89 "cortex-a7": []string{
90 "-mcpu=cortex-a7",
91 },
92 "cortex-a8": []string{
93 "-mcpu=cortex-a8",
94 },
95 "cortex-a15": []string{
96 "-mcpu=cortex-a15",
97 // Fake an ARM compiler flag as these processors support LPAE which GCC/clang
98 // don't advertise.
99 "-D__ARM_FEATURE_LPAE=1",
100 },
101 }
102
103 armClangCpuVariantCflags = armCpuVariantCflags
104 armClangArchVariantCflags = armArchVariantCflags
105)
106
107func init() {
108 replaceFirst := func(slice []string, from, to string) {
109 if slice[0] != from {
110 panic(fmt.Errorf("Expected %q, found %q", from, to))
111 }
112
113 slice[0] = to
114 }
115
116 replaceFirst(armClangArchVariantCflags["armv5te"], "-march=armv5te", "-march=armv5t")
117 replaceFirst(armClangCpuVariantCflags["cortex-a15"], "-mcpu=cortex-a15", "-march=armv7-a")
118 armClangCpuVariantCflags["krait"] = []string{
119 "-mcpu=krait",
120 }
121
122 pctx.StaticVariable("armGccVersion", "4.9")
123
124 pctx.StaticVariable("armGccRoot",
125 "${SrcDir}/prebuilts/gcc/${HostPrebuiltTag}/arm/arm-linux-androideabi-${armGccVersion}")
126
127 pctx.StaticVariable("armGccTriple", "arm-linux-androideabi")
128
129 pctx.StaticVariable("armCflags", strings.Join(armCflags, " "))
130 pctx.StaticVariable("armLdflags", strings.Join(armLdflags, " "))
131 pctx.StaticVariable("armCppflags", strings.Join(armCppflags, " "))
132 pctx.StaticVariable("armIncludeFlags", strings.Join([]string{
133 "-isystem ${LibcRoot}/arch-arm/include",
134 "-isystem ${LibcRoot}/include",
135 "-isystem ${LibcRoot}/kernel/uapi",
136 "-isystem ${LibcRoot}/kernel/uapi/asm-arm",
137 "-isystem ${LibmRoot}/include",
138 "-isystem ${LibmRoot}/include/arm",
139 }, " "))
140
141 // Extended cflags
142
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700143 // ARM vs. Thumb instruction set flags
Colin Cross3f40fa42015-01-30 17:27:36 -0800144 pctx.StaticVariable("armArmCflags", strings.Join(armArmCflags, " "))
145 pctx.StaticVariable("armThumbCflags", strings.Join(armThumbCflags, " "))
146
147 // Architecture variant cflags
148 pctx.StaticVariable("armArmv5TECflags", strings.Join(armArchVariantCflags["armv5te"], " "))
149 pctx.StaticVariable("armArmv7ACflags", strings.Join(armArchVariantCflags["armv7-a"], " "))
150 pctx.StaticVariable("armArmv7ANeonCflags", strings.Join(armArchVariantCflags["armv7-a-neon"], " "))
151
Colin Cross3f40fa42015-01-30 17:27:36 -0800152 // Cpu variant cflags
153 pctx.StaticVariable("armCortexA7Cflags", strings.Join(armCpuVariantCflags["cortex-a7"], " "))
154 pctx.StaticVariable("armCortexA8Cflags", strings.Join(armCpuVariantCflags["cortex-a8"], " "))
155 pctx.StaticVariable("armCortexA15Cflags", strings.Join(armCpuVariantCflags["cortex-a15"], " "))
156
157 // Clang cflags
158 pctx.StaticVariable("armClangCflags", strings.Join(clangFilterUnknownCflags(armCflags), " "))
159 pctx.StaticVariable("armClangLdflags", strings.Join(clangFilterUnknownCflags(armLdflags), " "))
160 pctx.StaticVariable("armClangCppflags", strings.Join(clangFilterUnknownCflags(armCppflags), " "))
161
162 // Clang cpu variant cflags
163 pctx.StaticVariable("armClangArmv5TECflags",
164 strings.Join(armClangArchVariantCflags["armv5te"], " "))
165 pctx.StaticVariable("armClangArmv7ACflags",
166 strings.Join(armClangArchVariantCflags["armv7-a"], " "))
167 pctx.StaticVariable("armClangArmv7ANeonCflags",
168 strings.Join(armClangArchVariantCflags["armv7-a-neon"], " "))
169
170 // Clang cpu variant cflags
171 pctx.StaticVariable("armClangCortexA7Cflags",
172 strings.Join(armClangCpuVariantCflags["cortex-a7"], " "))
173 pctx.StaticVariable("armClangCortexA8Cflags",
174 strings.Join(armClangCpuVariantCflags["cortex-a8"], " "))
175 pctx.StaticVariable("armClangCortexA15Cflags",
176 strings.Join(armClangCpuVariantCflags["cortex-a15"], " "))
177 pctx.StaticVariable("armClangKraitCflags",
178 strings.Join(armClangCpuVariantCflags["krait"], " "))
179}
180
181var (
182 armArchVariantCflagsVar = map[string]string{
183 "armv5te": "${armArmv5TECflags}",
184 "armv7-a": "${armArmv7ACflags}",
185 "armv7-a-neon": "${armArmv7ANeonCflags}",
186 }
187
Colin Cross3f40fa42015-01-30 17:27:36 -0800188 armCpuVariantCflagsVar = map[string]string{
189 "": "",
190 "cortex-a7": "${armCortexA7Cflags}",
191 "cortex-a8": "${armCortexA8Cflags}",
192 "cortex-a15": "${armCortexA15Cflags}",
193 "krait": "${armCortexA15Cflags}",
194 "denver": "${armCortexA15Cflags}",
195 }
196
197 armClangArchVariantCflagsVar = map[string]string{
198 "armv5te": "${armClangArmv5TECflags}",
199 "armv7-a": "${armClangArmv7ACflags}",
200 "armv7-a-neon": "${armClangArmv7ANeonCflags}",
201 }
202
203 armClangCpuVariantCflagsVar = map[string]string{
204 "": "",
205 "cortex-a7": "${armClangCortexA7Cflags}",
206 "cortex-a8": "${armClangCortexA8Cflags}",
207 "cortex-a15": "${armClangCortexA15Cflags}",
208 "krait": "${armClangKraitCflags}",
209 "denver": "${armClangCortexA15Cflags}",
210 }
211)
212
213type toolchainArm struct {
214 toolchain32Bit
215 cflags, ldflags, clangCflags string
216}
217
Dan Albertbe961682015-03-18 23:38:50 -0700218func (t *toolchainArm) Name() string {
219 return "arm"
220}
221
Colin Cross3f40fa42015-01-30 17:27:36 -0800222func (t *toolchainArm) GccRoot() string {
223 return "${armGccRoot}"
224}
225
226func (t *toolchainArm) GccTriple() string {
227 return "${armGccTriple}"
228}
229
Dan Albertbe961682015-03-18 23:38:50 -0700230func (t *toolchainArm) GccVersion() string {
231 return "${armGccVersion}"
232}
233
Colin Cross3f40fa42015-01-30 17:27:36 -0800234func (t *toolchainArm) Cflags() string {
235 return t.cflags
236}
237
238func (t *toolchainArm) Cppflags() string {
239 return "${armCppflags}"
240}
241
242func (t *toolchainArm) Ldflags() string {
243 return t.ldflags
244}
245
246func (t *toolchainArm) IncludeFlags() string {
247 return "${armIncludeFlags}"
248}
249
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700250func (t *toolchainArm) InstructionSetFlags(isa string) (string, error) {
251 switch isa {
252 case "arm":
253 return "${armArmCflags}", nil
254 case "thumb", "":
255 return "${armThumbCflags}", nil
256 default:
257 return t.toolchainBase.InstructionSetFlags(isa)
258 }
259}
260
Colin Cross3f40fa42015-01-30 17:27:36 -0800261func (t *toolchainArm) ClangTriple() string {
262 return "${armGccTriple}"
263}
264
265func (t *toolchainArm) ClangCflags() string {
266 return t.clangCflags
267}
268
269func (t *toolchainArm) ClangCppflags() string {
270 return "${armClangCppflags}"
271}
272
273func (t *toolchainArm) ClangLdflags() string {
274 return t.ldflags
275}
276
Colin Cross97ba0732015-03-23 17:50:24 -0700277func armToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Crossc1e814d2015-04-28 13:15:59 -0700278 var fixCortexA8 string
279 switch cpuVariant {
280 case "cortex-a8", "":
281 // Generic ARM might be a Cortex A8 -- better safe than sorry
282 fixCortexA8 = "-Wl,--fix-cortex-a8"
283 default:
284 fixCortexA8 = "-Wl,--no-fix-cortex-a8"
285 }
286
Colin Cross3f40fa42015-01-30 17:27:36 -0800287 return &toolchainArm{
288 cflags: strings.Join([]string{
289 "${armCflags}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800290 armArchVariantCflagsVar[archVariant],
291 armCpuVariantCflagsVar[cpuVariant],
292 }, " "),
293 ldflags: strings.Join([]string{
294 "${armLdflags}",
Colin Crossc1e814d2015-04-28 13:15:59 -0700295 fixCortexA8,
Colin Cross3f40fa42015-01-30 17:27:36 -0800296 }, " "),
297 clangCflags: strings.Join([]string{
298 "${armClangCflags}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800299 armClangArchVariantCflagsVar[archVariant],
300 armClangCpuVariantCflagsVar[cpuVariant],
301 }, " "),
302 }
303}
304
305func init() {
306 registerToolchainFactory(common.Device, common.Arm, armToolchainFactory)
307}