[AMDGPU] Test codegen'ing True16 additions.
[llvm-project.git] / llvm / utils / gn / build / toolchain / BUILD.gn
blob8f4a5d2e3e41a825acf019839d40aed3e713e758
1 import("//llvm/utils/gn/build/toolchain/compiler.gni")
3 declare_args() {
4   # If is_goma is true, the location of the goma client install.
5   # Set this to the output of `goma_ctl goma_dir`.
6   goma_dir = ""
9 assert(!use_goma || goma_dir != "",
10        "set `goma_dir` to the output of `goma_ctl goma_dir` in your args.gn")
12 unix_copy_command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
14 template("unix_toolchain") {
15   toolchain(target_name) {
16     # https://groups.google.com/a/chromium.org/g/gn-dev/c/F_lv5T-tNDM
17     forward_variables_from(invoker.toolchain_args, "*")
18     not_needed("*")
20     forward_variables_from(invoker, "*")
22     cc = "cc"
23     cxx = "c++"
25     if (clang_base_path != "") {
26       cc = rebase_path(clang_base_path, root_build_dir) + "/bin/clang"
27       cxx = rebase_path(clang_base_path, root_build_dir) + "/bin/clang++"
28     }
30     ld = cxx  # Don't use goma wrapper for linking.
31     if (use_goma) {
32       cc = "$goma_dir/gomacc $cc"
33       cxx = "$goma_dir/gomacc $cxx"
34     }
36     tool("cc") {
37       depfile = "{{output}}.d"
38       command = "$cc -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
39       depsformat = "gcc"
40       description = "CC {{output}}"
41       outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]
42     }
44     tool("cxx") {
45       depfile = "{{output}}.d"
46       command = "$cxx -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"
47       depsformat = "gcc"
48       description = "CXX {{output}}"
49       outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]
50     }
52     tool("objcxx") {
53       depfile = "{{output}}.d"
54       command = "$cxx -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_objcc}}"
55       depsformat = "gcc"
56       description = "OBJCXX {{output}}"
57       outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]
58     }
60     tool("asm") {
61       depfile = "{{output}}.d"
62       command = "$cc -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{asmflags}}"
63       depsformat = "gcc"
64       description = "ASM {{output}}"
65       outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]
66     }
68     tool("alink") {
69       if (current_os == "ios" || current_os == "mac") {
70         command = "libtool -D -static -no_warning_for_no_symbols {{arflags}} -o {{output}} {{inputs}}"
71       } else {
72         # Remove the output file first so that ar doesn't try to modify the
73         # existing file.
74         command =
75             "rm -f {{output}} && $ar rcsD {{arflags}} {{output}} {{inputs}}"
76       }
77       description = "AR {{output}}"
78       outputs = [ "{{output_dir}}/{{target_output_name}}.a" ]
79       output_prefix = "lib"
80       default_output_dir = "{{root_out_dir}}/lib"
81     }
83     if (current_os == "ios" || current_os == "mac") {
84       # gn < 1693 (e214b5d35898) doesn't support |frameworks|, requiring
85       # frameworks to be listed in |libs|, but gn >= 1808 (3028c6a426a4) forbids
86       # frameworks from appearing in |libs|. This assertion provides a helpful
87       # cue to upgrade, and is much more user-friendly than the failure that
88       # occurs when an older gn encounters |frameworks|.
89       #
90       # gn_version doesn’t actually exist in gn < 1709 (52cb644a3fb4), and
91       # defined(gn_version) doesn't actually work as expected
92       # (https://crbug.com/gn/183), so 1709 is the true minimum enforced by
93       # this construct, and if gn_version is not available, this line will still
94       # be blamed, making the resolution somewhat discoverable.
95       assert(gn_version >= 1693,
96              "Your GN is too old! " +
97                  "Update it, perhaps by running llvm/utils/gn/get.py")
98     }
100     # Make these apply to all tools below.
101     lib_switch = "-l"
102     lib_dir_switch = "-L"
104     tool("solink") {
105       outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
106       if (current_os == "ios" || current_os == "mac") {
107         command = "$ld -shared {{ldflags}} -o $outfile {{inputs}} {{libs}} {{frameworks}}"
108         default_output_extension = ".dylib"
109       } else {
110         command = "$ld -shared {{ldflags}} -Wl,-soname,{{target_output_name}}{{output_extension}} -o $outfile {{inputs}} {{libs}}"
111         default_output_extension = ".so"
112       }
113       description = "SOLINK $outfile"
114       outputs = [ outfile ]
115       output_prefix = "lib"
116       default_output_dir = "{{root_out_dir}}/lib"
117     }
119     tool("solink_module") {
120       outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
121       if (current_os == "ios" || current_os == "mac") {
122         command = "$ld -shared {{ldflags}} -Wl,-flat_namespace -Wl,-undefined,suppress -o $outfile {{inputs}} {{libs}} {{frameworks}}"
123         default_output_extension = ".dylib"
124       } else {
125         command = "$ld -shared {{ldflags}} -Wl,-soname,{{target_output_name}}{{output_extension}} -o $outfile {{inputs}} {{libs}}"
126         default_output_extension = ".so"
127       }
128       description = "SOLINK $outfile"
129       outputs = [ outfile ]
130       default_output_dir = "{{root_out_dir}}/lib"
131     }
133     tool("link") {
134       outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
135       if (current_os == "ios" || current_os == "mac") {
136         command =
137             "$ld {{ldflags}} -o $outfile {{inputs}} {{libs}} {{frameworks}}"
138       } else {
139         command = "$ld {{ldflags}} -o $outfile -Wl,--start-group {{inputs}} -Wl,--end-group {{libs}}"
140       }
141       description = "LINK $outfile"
142       outputs = [ outfile ]
144       # Setting this allows targets to override the default executable output by
145       # setting output_dir.
146       default_output_dir = "{{root_out_dir}}/bin"
147     }
149     tool("copy") {
150       command = unix_copy_command
151       description = "COPY {{source}} {{output}}"
152     }
154     if (current_os == "ios" || current_os == "mac") {
155       tool("copy_bundle_data") {
156         # https://github.com/nico/hack/blob/master/notes/copydir.md
157         _copydir = "cd {{source}} && " +
158                    "find . | cpio -pdl \"\$OLDPWD\"/{{output}} 2>/dev/null"
159         command = "rm -rf {{output}} && if [[ -d {{source}} ]]; then " +
160                   _copydir + "; else " + unix_copy_command + "; fi"
161         description = "COPY_BUNDLE_DATA {{source}} {{output}}"
162       }
163       tool("compile_xcassets") {
164         command = "false"
165         description = "The LLVM build doesn't use any xcasset files"
166       }
167     }
169     tool("stamp") {
170       command = "touch {{output}}"
171       description = "STAMP {{output}}"
172     }
173   }
176 unix_toolchain("unix") {
177   if (current_os != "ios" && current_os != "mac") {
178     if (clang_base_path != "") {
179       ar = rebase_path(clang_base_path, root_build_dir) + "/bin/llvm-ar"
180     } else {
181       ar = "ar"
182     }
183   }
185   toolchain_args = {
186     current_os = host_os
187     current_cpu = host_cpu
188   }
191 # This template defines a toolchain that uses just-built clang and lld
192 # as compiler and linker.
193 template("stage2_unix_toolchain") {
194   unix_toolchain(target_name) {
195     toolchain_args = {
196       forward_variables_from(invoker.toolchain_args, "*")
198       clang_base_path = root_build_dir
199       use_goma = false
200     }
202     deps = [
203       "//:clang($host_toolchain)",
204       "//:lld($host_toolchain)",
205     ]
206     if (toolchain_args.current_os != "ios" &&
207         toolchain_args.current_os != "mac") {
208       ar = "bin/llvm-ar"
209       deps += [ "//:llvm-ar($host_toolchain)" ]
210     }
211   }
214 stage2_unix_toolchain("stage2_unix") {
215   toolchain_args = {
216     current_os = host_os
217     current_cpu = host_cpu
218   }
221 if (android_ndk_path != "") {
222   # Android compiler-rt libraries don't really work with per-target runtime
223   # directories yet so force it off.
224   # https://discourse.llvm.org/t/handling-version-numbers-in-per-target-runtime-directories/62717.
225   stage2_unix_toolchain("stage2_android_aarch64") {
226     toolchain_args = {
227       current_os = "android"
228       current_cpu = "arm64"
229       clang_enable_per_target_runtime_dir = false
230     }
231   }
233   stage2_unix_toolchain("stage2_android_arm") {
234     toolchain_args = {
235       current_os = "android"
236       current_cpu = "arm"
237       clang_enable_per_target_runtime_dir = false
238     }
239   }
241   stage2_unix_toolchain("stage2_android_x64") {
242     toolchain_args = {
243       current_os = "android"
244       current_cpu = "x64"
245       clang_enable_per_target_runtime_dir = false
246     }
247   }
249   stage2_unix_toolchain("stage2_android_x86") {
250     toolchain_args = {
251       current_os = "android"
252       current_cpu = "x86"
253       clang_enable_per_target_runtime_dir = false
254     }
255   }
258 if (host_os == "mac") {
259   stage2_unix_toolchain("stage2_ios_aarch64") {
260     toolchain_args = {
261       current_os = "ios"
262       current_cpu = "arm64"
263     }
264   }
266   stage2_unix_toolchain("stage2_iossim_x64") {
267     toolchain_args = {
268       current_os = "ios"
269       current_cpu = "x64"
270     }
271   }
274 stage2_unix_toolchain("stage2_baremetal_aarch64") {
275   toolchain_args = {
276     current_os = "baremetal"
277     current_cpu = "arm64"
279     # FIXME: These should be set in all toolchains building sanitizers,
280     # see discussion at https://reviews.llvm.org/D127906#3587329
281     use_asan = false
282     use_tsan = false
283     use_ubsan = false
284   }
287 template("win_toolchain") {
288   toolchain(target_name) {
289     # https://groups.google.com/a/chromium.org/d/msg/gn-dev/F_lv5T-tNDM
290     forward_variables_from(invoker.toolchain_args, "*")
291     not_needed("*")
293     forward_variables_from(invoker, "*")
295     cl = "cl"
296     link = "link"
298     if (clang_base_path != "") {
299       cl = rebase_path(clang_base_path, root_build_dir) + "/bin/clang-cl"
300       if (use_lld) {
301         link = rebase_path(clang_base_path, root_build_dir) + "/bin/lld-link"
302       }
303     }
305     if (use_goma) {
306       cl = "$goma_dir/gomacc $cl"
307     }
309     tool("cc") {
310       command = "$cl /nologo /showIncludes /Fo{{output}} /c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
311       depsformat = "msvc"
312       description = "CC {{output}}"
313       outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj" ]
314     }
316     tool("cxx") {
317       command = "$cl /nologo /showIncludes /Fo{{output}} /c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"
318       depsformat = "msvc"
319       description = "CXX {{output}}"
320       outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj" ]
321     }
323     tool("alink") {
324       command = "$link /lib /nologo {{arflags}} /out:{{output}} {{inputs}}"
325       description = "LIB {{output}}"
326       outputs = [ "{{output_dir}}/{{target_output_name}}.lib" ]
327       default_output_dir = "{{root_out_dir}}/lib"
328     }
330     # Make these apply to all tools below.
331     lib_switch = ""
332     lib_dir_switch = "/LIBPATH:"
334     tool("solink") {
335       outprefix = "{{output_dir}}/{{target_output_name}}"
336       dllfile = "$outprefix{{output_extension}}"
337       libfile = "$outprefix.lib"
338       pdbfile = "$outprefix.pdb"
339       command = "$link /nologo /dll {{ldflags}} /out:$dllfile /implib:$libfile /pdb:$pdbfile {{inputs}} {{libs}} "
340       description = "LINK $dllfile"
341       link_output = libfile
342       depend_output = libfile
343       runtime_outputs = [ dllfile ]
344       outputs = [
345         dllfile,
346         libfile,
347       ]
348       default_output_extension = ".dll"
349       restat = true
351       # Put dlls next to the executables in bin/ on Windows, since Windows
352       # doesn't have a configurable rpath. This matches initialization of
353       # module_dir to bin/ in AddLLVM.cmake's set_output_directory().
354       default_output_dir = "{{root_out_dir}}/bin"
355     }
357     # Plugins for opt and clang and so on don't work in LLVM's Windows build
358     # since the code doesn't have export annotations, but there are a few
359     # standalone loadable modules used for unit-testing LLVM's dynamic library
360     # loading code.
361     tool("solink_module") {
362       outprefix = "{{output_dir}}/{{target_output_name}}"
363       dllfile = "$outprefix{{output_extension}}"
364       pdbfile = "$outprefix.pdb"
365       command = "$link /nologo /dll {{ldflags}} /out:$dllfile /pdb:$pdbfile {{inputs}} {{libs}} "
366       description = "LINK_MODULE $dllfile"
367       outputs = [ dllfile ]
368       runtime_outputs = outputs
369       default_output_extension = ".dll"
371       # No default_output_dir, all clients set output_dir.
372     }
374     tool("link") {
375       outprefix = "{{output_dir}}/{{target_output_name}}"
376       outfile = "$outprefix{{output_extension}}"
377       pdbfile = "$outprefix.pdb"
378       command = "$link /nologo {{ldflags}} /out:$outfile /pdb:$pdbfile {{inputs}} {{libs}}"
379       description = "LINK $outfile"
380       outputs = [ outfile ]
381       default_output_extension = ".exe"
383       # Setting this allows targets to override the default executable output by
384       # setting output_dir.
385       default_output_dir = "{{root_out_dir}}/bin"
386     }
388     tool("copy") {
389       if (host_os == "win") {
390         # GN hands out slash-using paths, but cmd's copy needs backslashes.
391         # Use cmd's %foo:a=b% substitution feature to convert.
392         command = "cmd /c set source=\"{{source}}\" & set output=\"{{output}}\" & call copy /Y %source:/=\% %output:\=/% > nul"
393       } else {
394         command = unix_copy_command
395       }
397       description = "COPY {{source}} {{output}}"
398     }
400     tool("stamp") {
401       if (host_os == "win") {
402         command = "cmd /c type nul > {{output}}"
403       } else {
404         command = "touch {{output}}"
405       }
406       description = "STAMP {{output}}"
407     }
408   }
411 win_toolchain("win") {
412   toolchain_args = {
413     current_os = "win"
414     current_cpu = host_cpu
415   }
418 win_toolchain("stage2_win_x64") {
419   toolchain_args = {
420     current_os = "win"
421     current_cpu = "x64"
423     if (host_os != "win") {
424       sysroot = win_sysroot
425     }
426     clang_base_path = root_build_dir
427     use_goma = false
428   }
429   deps = [
430     "//:clang($host_toolchain)",
431     "//:lld($host_toolchain)",
432   ]
435 win_toolchain("stage2_win_x86") {
436   toolchain_args = {
437     current_os = "win"
438     current_cpu = "x86"
440     if (host_os != "win") {
441       sysroot = win_sysroot
442     }
443     clang_base_path = root_build_dir
444     use_goma = false
445   }
446   deps = [
447     "//:clang($host_toolchain)",
448     "//:lld($host_toolchain)",
449   ]