blob: 43ed8f88c26c394e47cb9485394b9c3268a9090a [file] [log] [blame]
Andrew Walbran692b3252019-03-07 15:51:31 +00001# Copyright 2018 The Hafnium Authors.
Andrew Scull23e93a82018-10-26 14:56:04 +01002#
Andrew Walbrane959ec12020-06-17 15:01:09 +01003# Use of this source code is governed by a BSD-style
4# license that can be found in the LICENSE file or at
5# https://opensource.org/licenses/BSD-3-Clause.
Andrew Scull23e93a82018-10-26 14:56:04 +01006
7declare_args() {
8 # Set by arch toolchain. Prefix for binutils tools.
9 tool_prefix = ""
Alfredo Mazzinghi8aa8c622019-01-18 17:40:58 +000010
11 # Enable link time optimizations
12 use_lto = true
Andrew Scull23e93a82018-10-26 14:56:04 +010013}
14
15# Template for embedded toolchains; there is no support for C++ or libraries.
16# Instead, use source_set to group source together.
17template("embedded_cc_toolchain") {
18 toolchain(target_name) {
19 assert(defined(invoker.cc), "\"cc\" must be defined for ${target_name}.")
20 assert(defined(invoker.ld), "\"ld\" must be defined for ${target_name}.")
21
22 # Collect extra flags from the toolchain.
23 extra_defines = ""
Alfredo Mazzinghi8aa8c622019-01-18 17:40:58 +000024 extra_cflags = "-ffunction-sections -fdata-sections"
25 if (use_lto) {
26 extra_cflags += " -flto"
27 }
28 extra_ldflags = "-pie --gc-sections"
29
Andrew Scull23e93a82018-10-26 14:56:04 +010030 if (defined(invoker.extra_defines)) {
31 extra_defines += " ${invoker.extra_defines}"
32 }
33 if (defined(invoker.extra_cflags)) {
34 extra_cflags += " ${invoker.extra_cflags}"
35 }
36 if (defined(invoker.extra_ldflags)) {
37 extra_ldflags += " ${invoker.extra_ldflags}"
38 }
39
40 # Define the tools.
41 tool("cc") {
42 depfile = "{{output}}.d"
43 command = "${invoker.cc} -MMD -MF $depfile ${extra_defines} {{defines}} {{include_dirs}} ${extra_cflags} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
44 depsformat = "gcc"
45 description = "CC {{output}}"
46 outputs = [
47 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
48 ]
49 }
50
51 tool("asm") {
52 depfile = "{{output}}.d"
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +000053 command = "${invoker.cc} -MMD -MF $depfile ${extra_defines} {{defines}} {{include_dirs}} ${extra_cflags} {{asmflags}} -c {{source}} -o {{output}}"
Andrew Scull23e93a82018-10-26 14:56:04 +010054 depsformat = "gcc"
55 description = "ASM {{output}}"
56 outputs = [
57 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
58 ]
59 }
60
61 tool("link") {
62 outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
63 rspfile = "$outfile.rsp"
64 command = "${invoker.ld} ${extra_ldflags} {{ldflags}} -o $outfile --start-group @$rspfile --end-group"
65 description = "LINK $outfile"
66 default_output_dir = "{{root_out_dir}}"
67 rspfile_content = "{{inputs}}"
68 outputs = [
69 outfile,
70 ]
71 }
72
David Brazdil863b1502019-10-24 13:55:50 +010073 tool("alink") {
74 outfile = "{{target_out_dir}}/{{target_output_name}}.a"
75 command = "rm -f $outfile && ${invoker.ar} -rc $outfile {{inputs}}"
76 description = "ALINK $outfile"
77 outputs = [
78 outfile,
79 ]
80 }
81
Andrew Scull23e93a82018-10-26 14:56:04 +010082 tool("stamp") {
83 command = "touch {{output}}"
84 description = "STAMP {{output}}"
85 }
86
87 tool("copy") {
88 command = "cp -af {{source}} {{output}}"
89 description = "COPY {{source}} {{output}}"
90 }
91
92 toolchain_args = {
93 forward_variables_from(invoker.toolchain_args, "*")
94 }
95 }
96}
97
98# Specialize for clang.
99template("embedded_clang_toolchain") {
100 assert(defined(invoker.target),
101 "\"target\" must be defined for ${target_name}.")
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000102 assert(defined(invoker.extra_defines),
103 "\"extra_defines\" must be defined for ${target_name}")
104 assert(defined(invoker.extra_cflags),
105 "\"extra_cflags\" must be defined for ${target_name}")
106 assert(defined(invoker.extra_ldflags),
107 "\"extra_ldflags\" must be defined for ${target_name}")
Andrew Scull23e93a82018-10-26 14:56:04 +0100108
109 embedded_cc_toolchain(target_name) {
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000110 cc = "clang"
111 ld = "ld.lld"
David Brazdil863b1502019-10-24 13:55:50 +0100112 ar = "llvm-ar"
Andrew Scull23e93a82018-10-26 14:56:04 +0100113
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000114 forward_variables_from(invoker,
115 [
116 "extra_defines",
117 "extra_cflags",
118 "extra_ldflags",
119 ])
Andrew Walbran883a4b22019-03-05 15:13:56 +0000120
121 # TODO: Remove //inc/system if we can stop using the version of stdatomic.h
122 # from the Android prebuilt Clang.
Olivier Deprez9fa36962021-09-20 14:32:14 +0100123 extra_cflags += " -target ${invoker.target} -fcolor-diagnostics -nostdinc" +
124 " -isystem ${toolchain_lib}/include" + " -isystem " +
125 rebase_path("//inc/system")
Olivier Deprezb9bb6c292021-04-20 13:45:38 +0200126 extra_ldflags += " -O2 --icf=all --fatal-warnings --color-diagnostics"
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000127
128 toolchain_args = {
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000129 if (defined(invoker.toolchain_args)) {
130 forward_variables_from(invoker.toolchain_args, "*")
131 }
Andrew Scull23e93a82018-10-26 14:56:04 +0100132 }
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000133 }
134}
135
136# Specialize for mixed toolchain with clang and bfd linker.
137template("embedded_clang_bfd_toolchain") {
138 assert(defined(invoker.target),
139 "\"target\" must be defined for ${target_name}.")
140 assert(defined(invoker.tool_prefix),
141 "\"tool_prefix\" must be defined for ${target_name}.")
142 assert(defined(invoker.extra_defines),
143 "\"extra_defines\" must be defined for ${target_name}")
144 assert(defined(invoker.extra_cflags),
145 "\"extra_cflags\" must be defined for ${target_name}")
146 assert(defined(invoker.extra_ldflags),
147 "\"extra_ldflags\" must be defined for ${target_name}")
148
149 embedded_cc_toolchain(target_name) {
150 cc = "clang"
151 ld = "${invoker.tool_prefix}ld.bfd"
David Brazdil863b1502019-10-24 13:55:50 +0100152 ar = "llvm-ar"
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000153
154 forward_variables_from(invoker,
155 [
156 "extra_defines",
157 "extra_cflags",
158 "extra_ldflags",
159 ])
160 extra_cflags += " -target ${invoker.target} -fcolor-diagnostics"
Alfredo Mazzinghi8aa8c622019-01-18 17:40:58 +0000161 extra_ldflags += " --fatal-warnings"
162 if (use_lto) {
Olivier Deprezb9bb6c292021-04-20 13:45:38 +0200163 extra_ldflags += " -O2 --icf=all"
Alfredo Mazzinghi8aa8c622019-01-18 17:40:58 +0000164 }
Andrew Scull23e93a82018-10-26 14:56:04 +0100165
166 toolchain_args = {
Andrew Scull23e93a82018-10-26 14:56:04 +0100167 if (defined(invoker.toolchain_args)) {
168 forward_variables_from(invoker.toolchain_args, "*")
169 }
170 }
171 }
172}
173
Andrew Walbranff28f3b2019-10-21 13:00:00 +0100174# Expand to clang variants.
Andrew Scull23e93a82018-10-26 14:56:04 +0100175template("embedded_platform_toolchain") {
176 assert(defined(invoker.arch), "\"arch\" must be defined for ${target_name}.")
177 assert(defined(invoker.target),
178 "\"target\" must be defined for ${target_name}.")
179 assert(defined(invoker.tool_prefix),
180 "\"tool_prefix\" must be defined for ${target_name}.")
181 assert(defined(invoker.origin_address),
182 "\"origin_address\" must be defined for ${target_name}.")
Andrew Walbrande33f082018-12-07 14:10:11 +0000183 assert(defined(invoker.heap_pages),
184 "\"heap_pages\" must be defined for ${target_name}.")
Andrew Scull23e93a82018-10-26 14:56:04 +0100185 assert(defined(invoker.max_cpus),
186 "\"max_cpus\" must be defined for ${target_name}.")
187 assert(defined(invoker.max_vms),
188 "\"max_vms\" must be defined for ${target_name}.")
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000189 assert(defined(invoker.platform_name),
190 "\"platform_name\" must be defined for ${target_name}.")
Andrew Scull23e93a82018-10-26 14:56:04 +0100191
Andrew Walbran8e946692019-05-21 11:22:00 +0100192 extra_defines = ""
193 extra_cflags = "-fno-builtin -ffreestanding -fpic"
194 extra_ldflags = "--defsym=ORIGIN_ADDRESS=${invoker.origin_address}"
Andrew Scull23e93a82018-10-26 14:56:04 +0100195 if (defined(invoker.extra_defines)) {
Andrew Walbran8e946692019-05-21 11:22:00 +0100196 extra_defines += " ${invoker.extra_defines}"
Andrew Scull23e93a82018-10-26 14:56:04 +0100197 }
198 if (defined(invoker.extra_cflags)) {
Andrew Walbran8e946692019-05-21 11:22:00 +0100199 extra_cflags += " ${invoker.extra_cflags}"
Andrew Scull23e93a82018-10-26 14:56:04 +0100200 }
201 if (defined(invoker.extra_ldflags)) {
Andrew Walbran8e946692019-05-21 11:22:00 +0100202 extra_ldflags += " ${invoker.extra_ldflags}"
Andrew Scull23e93a82018-10-26 14:56:04 +0100203 }
Andrew Walbran8e946692019-05-21 11:22:00 +0100204 toolchain_args = {
205 use_platform = true
206 plat_name = invoker.platform_name
207 plat_arch = invoker.arch
208 plat_heap_pages = invoker.heap_pages
209 plat_max_cpus = invoker.max_cpus
210 plat_max_vms = invoker.max_vms
211 if (defined(invoker.toolchain_args)) {
212 forward_variables_from(invoker.toolchain_args, "*")
213 }
214 }
Andrew Scull23e93a82018-10-26 14:56:04 +0100215
216 embedded_clang_toolchain("${target_name}_clang") {
217 target = invoker.target
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000218 }
219
220 embedded_clang_bfd_toolchain("${target_name}_clang_bfd") {
221 target = invoker.target
Andrew Walbranff28f3b2019-10-21 13:00:00 +0100222 tool_prefix = invoker.tool_prefix
Andrew Scull23e93a82018-10-26 14:56:04 +0100223 }
224}
225
226# Specialize for different architectures.
227
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000228template("aarch64_common_toolchain") {
Andrew Walbran549a9f22019-05-09 17:29:00 +0100229 assert(defined(invoker.cpu), "\"cpu\" must be defined for ${target_name}.")
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000230 assert(defined(invoker.target),
231 "\"target\" must be defined for ${target_name}")
232 assert(defined(invoker.tool_prefix),
233 "\"tool_prefix\" must be defined for ${target_name}")
Andrew Scull23e93a82018-10-26 14:56:04 +0100234 assert(defined(invoker.origin_address),
235 "\"origin_address\" must be defined for ${target_name}.")
Andrew Walbran48699362019-05-20 14:38:00 +0100236 assert(defined(invoker.console),
237 "\"console\" must be defined for ${target_name}.")
Andrew Walbrande33f082018-12-07 14:10:11 +0000238 assert(defined(invoker.heap_pages),
239 "\"heap_pages\" must be defined for ${target_name}.")
Andrew Scull23e93a82018-10-26 14:56:04 +0100240 assert(defined(invoker.max_cpus),
241 "\"max_cpus\" must be defined for ${target_name}.")
242 assert(defined(invoker.max_vms),
243 "\"max_vms\" must be defined for ${target_name}.")
Andrew Walbran53f38762018-12-07 15:21:29 +0000244 if (invoker.gic_version == 3 || invoker.gic_version == 4) {
245 assert(defined(invoker.gicd_base_address),
246 "\"gicd_base_address\" must be defined for ${target_name}.")
247 assert(defined(invoker.gicr_base_address),
248 "\"gicr_base_address\" must be defined for ${target_name}.")
249 }
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000250 assert(defined(invoker.platform_name),
251 "\"platform_name\" must be defined for ${target_name}.")
Andrew Scull23e93a82018-10-26 14:56:04 +0100252
253 embedded_platform_toolchain(target_name) {
254 forward_variables_from(invoker,
255 [
256 "origin_address",
Andrew Walbrande33f082018-12-07 14:10:11 +0000257 "heap_pages",
Andrew Scull23e93a82018-10-26 14:56:04 +0100258 "max_cpus",
259 "max_vms",
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000260 "platform_name",
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000261 "extra_ldflags",
Andrew Scull23e93a82018-10-26 14:56:04 +0100262 ])
263 arch = "aarch64"
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000264 target = invoker.target
265 tool_prefix = invoker.tool_prefix
Andrew Scull23e93a82018-10-26 14:56:04 +0100266 extra_cflags = "-mcpu=${invoker.cpu} -mstrict-align"
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000267 if (defined(invoker.extra_cflags)) {
268 extra_cflags += " ${invoker.extra_cflags}"
269 }
Andrew Scull23e93a82018-10-26 14:56:04 +0100270
Andrew Walbran53f38762018-12-07 15:21:29 +0000271 extra_defines = ""
Alfredo Mazzinghi62e91562019-02-13 17:11:23 +0000272 if (defined(invoker.extra_defines)) {
273 extra_defines += " ${invoker.extra_defines}"
274 }
275
Andrew Walbran53f38762018-12-07 15:21:29 +0000276 if (invoker.gic_version > 0) {
277 extra_defines += " -DGIC_VERSION=${invoker.gic_version}"
278 }
279 if (invoker.gic_version == 3 || invoker.gic_version == 4) {
280 extra_defines += " -DGICD_BASE=${invoker.gicd_base_address} -DGICR_BASE=${invoker.gicr_base_address}"
Andrew Scull23e93a82018-10-26 14:56:04 +0100281 }
282
Raghu Krishnamurthy75ebf8c2021-11-28 07:22:12 -0800283 if (defined(invoker.branch_protection)) {
284 extra_cflags += " -mbranch-protection=${invoker.branch_protection}"
285 extra_defines += " -DBRANCH_PROTECTION=1"
286 }
287
Andrew Scull23e93a82018-10-26 14:56:04 +0100288 toolchain_args = {
David Brazdil0dbb41f2019-09-09 18:03:35 +0100289 plat_boot_flow = invoker.boot_flow
Andrew Walbran48699362019-05-20 14:38:00 +0100290 plat_console = invoker.console
Andrew Scull3c257452019-11-26 13:32:50 +0000291 plat_iommu = invoker.iommu
David Brazdil52230432020-01-27 15:08:34 +0000292 if (defined(invoker.stdout)) {
293 stdout = invoker.stdout
294 }
David Brazdila2f45212020-01-20 13:19:31 +0000295 if (defined(invoker.max_image_size)) {
296 plat_max_image_size = invoker.max_image_size
297 }
Andrew Walbran48699362019-05-20 14:38:00 +0100298 forward_variables_from(invoker.toolchain_args, "*")
Andrew Scull23e93a82018-10-26 14:56:04 +0100299 }
300 }
301}
Alfredo Mazzinghi880f5b22019-02-07 15:42:41 +0000302
303template("aarch64_toolchain") {
304 aarch64_common_toolchain("${target_name}") {
305 forward_variables_from(invoker, "*")
306 target = "aarch64-none-eabi"
307 tool_prefix = "aarch64-linux-gnu-" # TODO: this isn't right for bare metal but it works.
308 platform_name = target_name
309 }
310}
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100311
312template("aarch64_toolchains") {
313 aarch64_toolchain("${target_name}") {
314 forward_variables_from(invoker,
315 [
316 "origin_address",
David Brazdil0dbb41f2019-09-09 18:03:35 +0100317 "boot_flow",
Andrew Walbran48699362019-05-20 14:38:00 +0100318 "console",
Andrew Scull3c257452019-11-26 13:32:50 +0000319 "iommu",
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100320 "gic_version",
321 "gicd_base_address",
322 "gicr_base_address",
323 "heap_pages",
324 "max_cpus",
David Brazdila2f45212020-01-20 13:19:31 +0000325 "max_image_size",
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100326 "max_vms",
Andrew Walbran48699362019-05-20 14:38:00 +0100327 "toolchain_args",
Raghu Krishnamurthy75ebf8c2021-11-28 07:22:12 -0800328 "branch_protection",
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100329 ])
330 cpu = "${invoker.cpu}+nofp"
David Brazdil711fbe92019-08-06 13:39:58 +0100331
332 # Add a macro so files can tell whether they are not being built for a VM.
333 extra_defines = " -DVM_TOOLCHAIN=0"
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100334 }
335
336 # Toolchain for building test VMs which run under Hafnium.
337 aarch64_toolchain("${target_name}_vm") {
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100338 forward_variables_from(invoker,
339 [
340 "origin_address",
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100341 "gic_version",
342 "gicd_base_address",
343 "gicr_base_address",
Andrew Walbranafabe852019-03-20 17:55:11 +0000344 "max_cpus",
Andrew Walbran48699362019-05-20 14:38:00 +0100345 "toolchain_args",
David Brazdil52230432020-01-27 15:08:34 +0000346 "console",
Raghu Krishnamurthy75ebf8c2021-11-28 07:22:12 -0800347 "branch_protection",
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100348 ])
349 cpu = "${invoker.cpu}+fp"
David Brazdil0dbb41f2019-09-09 18:03:35 +0100350 boot_flow = "//src/arch/fake:boot_flow"
Andrew Scull3c257452019-11-26 13:32:50 +0000351 iommu = "//src/iommu:absent"
David Brazdil52230432020-01-27 15:08:34 +0000352 stdout = "//src/arch/aarch64/hftest:stdout"
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100353
354 # Nonsense values because they are required but shouldn't be used.
355 heap_pages = 0
Andrew Walbran7f904bf2019-07-12 16:38:38 +0100356 max_vms = 0
David Brazdil711fbe92019-08-06 13:39:58 +0100357
358 # Add a macro so files can tell whether they are being built for a VM.
359 extra_defines = " -DVM_TOOLCHAIN=1"
Andrew Walbran7559fcf2019-05-09 17:11:20 +0100360 }
361}