• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import("//build_overrides/clspv.gni")
2import("//build_overrides/spirv_tools.gni")
3
4declare_args() {
5  # spirv namespace
6  spirv_namespace_strings = "spv"
7  spirv_namespace_glsl = "glsl"
8  spirv_namespace_reflection = "reflection"
9
10  # bake file variable names
11  clspv_bake_file_data_variable_name = "clspv_builtins_header_data"
12  clspv_bake_file_size_variable_name = "clspv_builtins_header_size"
13  clspv_bake_file_data_base_variable_name = "opencl_base_builtins_header_data"
14  clspv_bake_file_size_base_variable_name = "opencl_base_builtins_header_size"
15
16  # clspv builtin library variable names
17  clspv_library_data_var_name = "clspv_builtin_library_data"
18  clspv_library_size_var_name = "clspv_builtin_library_size"
19  clspv64_library_data_var_name = "clspv64_builtin_library_data"
20  clspv64_library_size_var_name = "clspv64_builtin_library_size"
21}
22
23# Action scripts to generate headers
24action("clspv_c_strings") {
25  script = "src/cmake/spirv_c_strings.py"
26
27  inputs =
28      [ "${spirv_tools_spirv_headers_dir}/include/spirv/unified1/spirv.hpp" ]
29
30  outputs = [ "$target_gen_dir/clspv/spirv_c_strings.hpp" ]
31
32  args = [
33    "--input-file=" + rebase_path(inputs[0], root_build_dir),
34    "--output-file=" + rebase_path(outputs[0], root_build_dir),
35    "--namespace=" + spirv_namespace_strings,
36  ]
37}
38
39action("clspv_glsl") {
40  script = "src/cmake/spirv_ext_inst.py"
41
42  inputs = [ "${spirv_tools_spirv_headers_dir}/include/spirv/unified1/extinst.glsl.std.450.grammar.json" ]
43
44  outputs = [ "$target_gen_dir/clspv/spirv_glsl.hpp" ]
45
46  args = [
47    "--input-file=" + rebase_path(inputs[0], root_build_dir),
48    "--output-file=" + rebase_path(outputs[0], root_build_dir),
49    "--namespace=" + spirv_namespace_glsl,
50  ]
51}
52
53action("clspv_reflection") {
54  script = "src/cmake/spirv_ext_inst.py"
55
56  inputs = [ "${spirv_tools_spirv_headers_dir}/include/spirv/unified1/extinst.nonsemantic.clspvreflection.grammar.json" ]
57
58  outputs = [ "$target_gen_dir/clspv/spirv_reflection.hpp" ]
59
60  args = [
61    "--input-file=" + rebase_path(inputs[0], root_build_dir),
62    "--output-file=" + rebase_path(outputs[0], root_build_dir),
63    "--namespace=" + spirv_namespace_reflection,
64  ]
65}
66
67action("clspv-builtins") {
68  script = "src/cmake/define_clspv_builtins.py"
69
70  outputs = [ "$target_gen_dir/clspv-builtins.h" ]
71
72  args = [ "--output-file=" + rebase_path(outputs[0], root_build_dir) ]
73}
74
75# The *.bc files are prebuilt binaries in the clspv. If these need to be regenerated, please refer
76# to the clspv README.md file for instructions.
77action("clspv_builtin_library") {
78  script = "src/cmake/bake_file.py"
79
80  #  TODO(hoonee.cho): fix the GN script to build libclc libraries with clspv
81  # The recent CLSPV's commit changed a way to get clspv--.bc and clspv64--.bc when building CLSPV.
82  # https://github.com/google/clspv/commit/769daac0f9b7ace2d6fb9839f18ba82f9751aefd
83  # Before: use prebuilt clspv--.bc and clspv64--.bc
84  # After: build clang/libclc with target set to clspv--.bc and clspv64--.bc
85  inputs = [ "gn/clspv--.bc" ]
86  outputs = [ "$target_gen_dir/clspv/clspv_builtin_library.h" ]
87
88  args = [
89    "--input-header-file=" + rebase_path(inputs[0], root_build_dir),
90    "--output-file=" + rebase_path(outputs[0], root_build_dir),
91    "--header-var=" + clspv_library_data_var_name,
92    "--header-size=" + clspv_library_size_var_name,
93  ]
94}
95
96action("clspv64_builtin_library") {
97  script = "src/cmake/bake_file.py"
98  inputs = [ "gn/clspv64--.bc" ]
99  outputs = [ "$target_gen_dir/clspv/clspv64_builtin_library.h" ]
100
101  args = [
102    "--input-header-file=" + rebase_path(inputs[0], root_build_dir),
103    "--output-file=" + rebase_path(outputs[0], root_build_dir),
104    "--header-var=" + clspv64_library_data_var_name,
105    "--header-size=" + clspv64_library_size_var_name,
106  ]
107}
108
109action("clspv_baked_opencl_header") {
110  script =
111      "src/cmake/bake_file.py"  # cannot use data_deps as that's a rutime dep
112  deps = [ ":clspv-builtins" ]
113
114  inputs = [
115    "$target_gen_dir/clspv-builtins.h",
116    "//$clspv_llvm_dir/clang/lib/Headers/opencl-c-base.h",
117  ]
118
119  outputs = [ "$target_gen_dir/clspv/opencl_builtins_header.h" ]
120
121  args = [
122    "--input-header-file=" + rebase_path(inputs[0], root_build_dir),
123    "--input-base-file=" + rebase_path(inputs[1], root_build_dir),
124    "--output-file=" + rebase_path(outputs[0], root_build_dir),
125    "--header-var=" + clspv_bake_file_data_variable_name,
126    "--header-size-var=" + clspv_bake_file_size_variable_name,
127    "--base-var=" + clspv_bake_file_data_base_variable_name,
128    "--base-size-var=" + clspv_bake_file_size_base_variable_name,
129  ]
130}
131
132# CLSPV Lib Targets
133# a common config that will be used by all the clspv targets
134config("clspv_common_config") {
135  include_dirs = [
136    "src/include",
137    "${spirv_tools_spirv_headers_dir}/include",
138    "$root_gen_dir",
139    "$target_gen_dir/../",
140  ]
141  if (current_os != "win") {
142    cflags = [ "-Wno-deprecated-declarations" ]
143  }
144}
145
146source_set("clspv_passes") {
147  sources = [
148    "src/lib/AddFunctionAttributesPass.cpp",
149    "src/lib/AllocateDescriptorsPass.cpp",
150    "src/lib/AnnotationToMetadataPass.cpp",
151    "src/lib/ArgKind.cpp",
152    "src/lib/AutoPodArgsPass.cpp",
153    "src/lib/BitcastUtils.cpp",
154    "src/lib/Builtins.cpp",
155    "src/lib/CallGraphOrderedFunctions.cpp",
156    "src/lib/ClusterConstants.cpp",
157    "src/lib/ClusterPodKernelArgumentsPass.cpp",
158    "src/lib/ComputeStructuredOrder.cpp",
159    "src/lib/ConstantEmitter.cpp",
160    "src/lib/Constants.cpp",
161    "src/lib/DeclarePushConstantsPass.cpp",
162    "src/lib/DefineOpenCLWorkItemBuiltinsPass.cpp",
163    "src/lib/DescriptorCounter.cpp",
164    "src/lib/DirectResourceAccessPass.cpp",
165    "src/lib/FeatureMacro.cpp",
166    "src/lib/FixupBuiltinsPass.cpp",
167    "src/lib/FixupStructuredCFGPass.cpp",
168    "src/lib/FunctionInternalizerPass.cpp",
169    "src/lib/HideConstantLoadsPass.cpp",
170    "src/lib/InlineEntryPointsPass.cpp",
171    "src/lib/InlineFuncWithImageMetadataGetterPass.cpp",
172    "src/lib/InlineFuncWithPointerBitCastArgPass.cpp",
173    "src/lib/InlineFuncWithPointerToFunctionArgPass.cpp",
174    "src/lib/InlineFuncWithReadImage3DNonLiteralSampler.cpp",
175    "src/lib/InlineFuncWithSingleCallSitePass.cpp",
176    "src/lib/KernelArgNamesToMetadataPass.cpp",
177    "src/lib/Layout.cpp",
178    "src/lib/LogicalPointerToIntPass.cpp",
179    "src/lib/LongVectorLoweringPass.cpp",
180    "src/lib/LowerAddrSpaceCastPass.cpp",
181    "src/lib/LowerPrivatePointerPHIPass.cpp",
182    "src/lib/MultiVersionUBOFunctionsPass.cpp",
183    "src/lib/NativeMathPass.cpp",
184    "src/lib/NormalizeGlobalVariable.cpp",
185    "src/lib/OpenCLInlinerPass.cpp",
186    "src/lib/Option.cpp",
187    "src/lib/Passes.cpp",
188    "src/lib/PhysicalPointerArgsPass.cpp",
189    "src/lib/PrintfPass.cpp",
190    "src/lib/PushConstant.cpp",
191    "src/lib/RemoveUnusedArguments.cpp",
192    "src/lib/ReorderBasicBlocksPass.cpp",
193    "src/lib/ReplaceLLVMIntrinsicsPass.cpp",
194    "src/lib/ReplaceOpenCLBuiltinPass.cpp",
195    "src/lib/ReplacePointerBitcastPass.cpp",
196    "src/lib/RewriteInsertsPass.cpp",
197    "src/lib/RewritePackedStructs.cpp",
198    "src/lib/SPIRVOp.cpp",
199    "src/lib/SPIRVProducerPass.cpp",
200    "src/lib/SamplerUtils.cpp",
201    "src/lib/ScalarizePass.cpp",
202    "src/lib/SetImageMetadataPass.cpp",
203    "src/lib/ShareModuleScopeVariables.cpp",
204    "src/lib/SignedCompareFixupPass.cpp",
205    "src/lib/SimplifyPointerBitcastPass.cpp",
206    "src/lib/SpecConstant.cpp",
207    "src/lib/SpecializeImageTypes.cpp",
208    "src/lib/SplatArgPass.cpp",
209    "src/lib/SplatSelectCondition.cpp",
210    "src/lib/StripFreezePass.cpp",
211    "src/lib/ThreeElementVectorLoweringPass.cpp",
212    "src/lib/Types.cpp",
213    "src/lib/UBOTypeTransformPass.cpp",
214    "src/lib/UndoBoolPass.cpp",
215    "src/lib/UndoByvalPass.cpp",
216    "src/lib/UndoGetElementPtrConstantExprPass.cpp",
217    "src/lib/UndoInstCombinePass.cpp",
218    "src/lib/UndoSRetPass.cpp",
219    "src/lib/UndoTranslateSamplerFoldPass.cpp",
220    "src/lib/UndoTruncateToOddIntegerPass.cpp",
221    "src/lib/WrapKernelPass.cpp",
222    "src/lib/ZeroInitializeAllocasPass.cpp",
223  ]
224
225  deps = [
226    ":clspv_c_strings",
227    ":clspv_glsl",
228    ":clspv_reflection",
229    "gn/llvm/config:llvm-config",
230    "gn/llvm/sources:clspv_llvm_components",
231    "//third_party/spirv-headers/src:spv_headers",
232  ]
233
234  configs += [
235    ":clspv_common_config",
236    "gn/llvm/sources:clspv_llvm_private_config",
237  ]
238
239  configs += clspv_configs_to_append
240  configs -= clspv_configs_to_remove
241
242  include_dirs = [ "$root_gen_dir/$clspv_llvm_dir" ]
243}
244
245static_library("clspv_core") {
246  configs += [ ":clspv_common_config" ]
247  configs += clspv_configs_to_append
248  configs -= clspv_configs_to_remove
249  deps = [
250    "gn/llvm/sources:clspv_clang_lib_ast",
251    "gn/llvm/sources:clspv_clang_lib_basic",
252    "gn/llvm/sources:clspv_clang_lib_codegen",
253    "gn/llvm/sources:clspv_clang_lib_frontend",
254    "gn/llvm/sources:clspv_clang_lib_serialization",
255
256    # llvm/clang
257    ":clspv64_builtin_library",
258    ":clspv_baked_opencl_header",
259    ":clspv_builtin_library",
260    ":clspv_passes",
261    "gn/llvm/sources:clspv_llvm_components",
262    "gn/llvm/sources:clspv_llvm_lib_irreader",
263    "gn/llvm/sources:clspv_llvm_lib_linker",
264  ]
265  sources = [
266    "src/lib/Compiler.cpp",
267    "src/lib/FrontendPlugin.cpp",
268    "src/lib/Sampler.cpp",
269  ]
270  include_dirs = [
271    "//$clspv_llvm_dir/clang/include",
272    "//$clspv_llvm_dir/llvm/include",
273    "$root_gen_dir/$clspv_llvm_dir/",
274    "$target_gen_dir",
275    "$root_gen_dir/$clspv_llvm_dir/clang/include",
276  ]
277}
278
279shared_library("clspv_core_shared") {
280  configs += [ ":clspv_common_config" ]
281  configs += clspv_configs_to_append
282  configs -= clspv_configs_to_remove
283
284  if (is_android) {
285    # Removing this config, otherwise clspv API will not be visable
286    configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
287  }
288
289  deps = [
290    "gn/llvm/sources:clspv_clang_lib_ast",
291    "gn/llvm/sources:clspv_clang_lib_basic",
292    "gn/llvm/sources:clspv_clang_lib_codegen",
293    "gn/llvm/sources:clspv_clang_lib_frontend",
294    "gn/llvm/sources:clspv_clang_lib_serialization",
295
296    # llvm/clang
297    ":clspv64_builtin_library",
298    ":clspv_baked_opencl_header",
299    ":clspv_builtin_library",
300    ":clspv_passes",
301    "gn/llvm/sources:clspv_llvm_components",
302    "gn/llvm/sources:clspv_llvm_lib_irreader",
303    "gn/llvm/sources:clspv_llvm_lib_linker",
304  ]
305  sources = [
306    "src/lib/Compiler.cpp",
307    "src/lib/FrontendPlugin.cpp",
308    "src/lib/Sampler.cpp",
309  ]
310  include_dirs = [
311    "//$clspv_llvm_dir/clang/include",
312    "//$clspv_llvm_dir/llvm/include",
313    "$root_gen_dir/$clspv_llvm_dir/",
314    "$target_gen_dir",
315    "$root_gen_dir/$clspv_llvm_dir/clang/include",
316  ]
317}
318
319# CLSPV Tools Targets
320config("clspv_opt_config") {
321  include_dirs = [
322    "src/include",
323    "$clspv_llvm_dir/llvm/tools/opt",
324    "$root_gen_dir/$clspv_llvm_dir",
325  ]
326  configs = [ "gn/build:llvm_code" ]
327}
328
329executable("clspv-opt") {
330  sources = [ "src/tools/clspv-opt/main.cpp" ]
331
332  configs += [ ":clspv_opt_config" ]
333  configs += clspv_configs_to_append
334  configs -= clspv_configs_to_remove
335
336  deps = [ ":clspv_passes" ]
337}
338
339executable("clspv") {
340  sources = [ "src/tools/driver/main.cpp" ]
341
342  configs += [ ":clspv_common_config" ]
343  configs += clspv_configs_to_append
344  configs -= clspv_configs_to_remove
345
346  include_dirs = [
347    "$target_gen_dir",
348    "$root_gen_dir/$clspv_llvm_dir",
349  ]
350
351  deps = [ ":clspv_core" ]
352}
353
354executable("clspv-reflection") {
355  sources = [
356    "src/tools/reflection/ReflectionParser.cpp",
357    "src/tools/reflection/main.cpp",
358  ]
359
360  configs += [ ":clspv_common_config" ]
361  configs += clspv_configs_to_append
362  configs -= clspv_configs_to_remove
363
364  deps = [
365    ":clspv_core",
366    ":clspv_reflection",
367    "${spirv_tools_dir}:spvtools_link",
368    "//third_party/spirv-headers/src:spv_headers",
369  ]
370
371  include_dirs = [
372    "$spirv_tools_spirv_headers_dir/include",
373    "$target_gen_dir",
374  ]
375}
376
377group("default") {
378  deps = [
379    ":clspv",
380    ":clspv-opt",
381    ":clspv-reflection",
382  ]
383}
384