xref: /qemu/target/hexagon/meson.build (revision 658178c3)
1##
2##  Copyright(c) 2020-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
3##
4##  This program is free software; you can redistribute it and/or modify
5##  it under the terms of the GNU General Public License as published by
6##  the Free Software Foundation; either version 2 of the License, or
7##  (at your option) any later version.
8##
9##  This program is distributed in the hope that it will be useful,
10##  but WITHOUT ANY WARRANTY; without even the implied warranty of
11##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12##  GNU General Public License for more details.
13##
14##  You should have received a copy of the GNU General Public License
15##  along with this program; if not, see <http://www.gnu.org/licenses/>.
16##
17
18hexagon_ss = ss.source_set()
19
20hex_common_py = 'hex_common.py'
21attribs_def = meson.current_source_dir() / 'attribs_def.h.inc'
22gen_tcg_h = meson.current_source_dir() / 'gen_tcg.h'
23gen_tcg_hvx_h = meson.current_source_dir() / 'gen_tcg_hvx.h'
24idef_parser_dir = meson.current_source_dir() / 'idef-parser'
25
26#
27#  Step 1
28#  We use a C program to create semantics_generated.pyinc
29#
30gen_semantics = executable(
31    'gen_semantics',
32    'gen_semantics.c',
33    native: true, build_by_default: false)
34
35semantics_generated = custom_target(
36    'semantics_generated.pyinc',
37    output: 'semantics_generated.pyinc',
38    command: [gen_semantics, '@OUTPUT@'],
39)
40hexagon_ss.add(semantics_generated)
41
42#
43# Step 2
44# We use Python scripts to generate the following files
45#     shortcode_generated.h.inc
46#     tcg_func_table_generated.c.inc
47#     printinsn_generated.h.inc
48#     op_regs_generated.h.inc
49#     op_attribs_generated.h.inc
50#     opcodes_def_generated.h.inc
51#
52shortcode_generated = custom_target(
53    'shortcode_generated.h.inc',
54    output: 'shortcode_generated.h.inc',
55    depends: [semantics_generated],
56    depend_files: [hex_common_py, attribs_def],
57    command: [python, files('gen_shortcode.py'), semantics_generated, attribs_def, '@OUTPUT@'],
58)
59hexagon_ss.add(shortcode_generated)
60
61tcg_func_table_generated = custom_target(
62    'tcg_func_table_generated.c.inc',
63    output: 'tcg_func_table_generated.c.inc',
64    depends: [semantics_generated],
65    depend_files: [hex_common_py, attribs_def],
66    command: [python, files('gen_tcg_func_table.py'), semantics_generated, attribs_def, '@OUTPUT@'],
67)
68hexagon_ss.add(tcg_func_table_generated)
69
70printinsn_generated = custom_target(
71    'printinsn_generated.h.inc',
72    output: 'printinsn_generated.h.inc',
73    depends: [semantics_generated],
74    depend_files: [hex_common_py, attribs_def],
75    command: [python, files('gen_printinsn.py'), semantics_generated, attribs_def, '@OUTPUT@'],
76)
77hexagon_ss.add(printinsn_generated)
78
79op_regs_generated = custom_target(
80    'op_regs_generated.h.inc',
81    output: 'op_regs_generated.h.inc',
82    depends: [semantics_generated],
83    depend_files: [hex_common_py, attribs_def],
84    command: [python, files('gen_op_regs.py'), semantics_generated, attribs_def, '@OUTPUT@'],
85)
86hexagon_ss.add(op_regs_generated)
87
88op_attribs_generated = custom_target(
89    'op_attribs_generated.h.inc',
90    output: 'op_attribs_generated.h.inc',
91    depends: [semantics_generated],
92    depend_files: [hex_common_py, attribs_def],
93    command: [python, files('gen_op_attribs.py'), semantics_generated, attribs_def, '@OUTPUT@'],
94)
95hexagon_ss.add(op_attribs_generated)
96
97opcodes_def_generated = custom_target(
98    'opcodes_def_generated.h.inc',
99    output: 'opcodes_def_generated.h.inc',
100    depends: [semantics_generated],
101    depend_files: [hex_common_py, attribs_def],
102    command: [python, files('gen_opcodes_def.py'), semantics_generated, attribs_def, '@OUTPUT@'],
103)
104hexagon_ss.add(opcodes_def_generated)
105
106#
107# Step 3
108# We use a C program to create iset.py which is imported into dectree.py
109# to create the decode tree
110#
111gen_dectree_import = executable(
112    'gen_dectree_import',
113    'gen_dectree_import.c', opcodes_def_generated, op_regs_generated,
114    native: true, build_by_default: false)
115
116iset_py = custom_target(
117    'iset.py',
118    output: 'iset.py',
119    command: [gen_dectree_import, '@OUTPUT@'],
120)
121hexagon_ss.add(iset_py)
122
123#
124# Step 4
125# Generate the input to the QEMU decodetree.py script
126#
127normal_decode_generated = custom_target(
128    'normal_decode_generated',
129    output: 'normal_decode_generated',
130    depends: [iset_py, semantics_generated],
131    env: {'PYTHONPATH': meson.current_build_dir()},
132    command: [python, files('gen_decodetree.py'), semantics_generated, 'NORMAL', '@OUTPUT@'],
133)
134hexagon_ss.add(normal_decode_generated)
135
136hvx_decode_generated = custom_target(
137    'hvx_decode_generated',
138    output: 'hvx_decode_generated',
139    depends: [iset_py, semantics_generated],
140    env: {'PYTHONPATH': meson.current_build_dir()},
141    command: [python, files('gen_decodetree.py'), semantics_generated, 'EXT_mmvec', '@OUTPUT@'],
142)
143hexagon_ss.add(hvx_decode_generated)
144
145subinsn_a_decode_generated = custom_target(
146    'subinsn_a_decode_generated',
147    output: 'subinsn_a_decode_generated',
148    depends: [iset_py, semantics_generated],
149    env: {'PYTHONPATH': meson.current_build_dir()},
150    command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_A', '@OUTPUT@'],
151)
152hexagon_ss.add(subinsn_a_decode_generated)
153
154subinsn_l1_decode_generated = custom_target(
155    'subinsn_l1_decode_generated',
156    output: 'subinsn_l1_decode_generated',
157    depends: [iset_py, semantics_generated],
158    env: {'PYTHONPATH': meson.current_build_dir()},
159    command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_L1', '@OUTPUT@'],
160)
161hexagon_ss.add(subinsn_l1_decode_generated)
162
163subinsn_l2_decode_generated = custom_target(
164    'subinsn_l2_decode_generated',
165    output: 'subinsn_l2_decode_generated',
166    depends: [iset_py, semantics_generated],
167    env: {'PYTHONPATH': meson.current_build_dir()},
168    command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_L2', '@OUTPUT@'],
169)
170hexagon_ss.add(subinsn_l2_decode_generated)
171
172subinsn_s1_decode_generated = custom_target(
173    'subinsn_s1_decode_generated',
174    output: 'subinsn_s1_decode_generated',
175    depends: [iset_py, semantics_generated],
176    env: {'PYTHONPATH': meson.current_build_dir()},
177    command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_S1', '@OUTPUT@'],
178)
179hexagon_ss.add(subinsn_s1_decode_generated)
180
181subinsn_s2_decode_generated = custom_target(
182    'subinsn_s2_decode_generated',
183    output: 'subinsn_s2_decode_generated',
184    depends: [iset_py, semantics_generated],
185    env: {'PYTHONPATH': meson.current_build_dir()},
186    command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_S2', '@OUTPUT@'],
187)
188hexagon_ss.add(subinsn_s2_decode_generated)
189
190#
191# Run the QEMU decodetree.py script to produce the instruction decoder
192#
193decodetree_py = meson.current_source_dir() / '../../scripts/decodetree.py'
194decode_normal_generated = custom_target(
195    'decode_normal_generated.c.inc',
196    output: 'decode_normal_generated.c.inc',
197    input: normal_decode_generated,
198    env: {'PYTHONPATH': meson.current_build_dir()},
199    command: [python, files(decodetree_py), normal_decode_generated, '--static-decode=decode_normal', '-o', '@OUTPUT@'],
200)
201hexagon_ss.add(decode_normal_generated)
202
203decode_hvx_generated = custom_target(
204    'decode_hvx_generated.c.inc',
205    output: 'decode_hvx_generated.c.inc',
206    input: hvx_decode_generated,
207    env: {'PYTHONPATH': meson.current_build_dir()},
208    command: [python, files(decodetree_py), hvx_decode_generated, '--static-decode=decode_hvx', '-o', '@OUTPUT@'],
209)
210hexagon_ss.add(decode_hvx_generated)
211
212decode_subinsn_a_generated = custom_target(
213    'decode_subinsn_a_generated.c.inc',
214    output: 'decode_subinsn_a_generated.c.inc',
215    input: subinsn_a_decode_generated,
216    env: {'PYTHONPATH': meson.current_build_dir()},
217    command: [python, files(decodetree_py), subinsn_a_decode_generated, ['--static-decode=decode_subinsn_a', '--insnwidth=16'], '-o', '@OUTPUT@'],
218)
219hexagon_ss.add(decode_subinsn_a_generated)
220
221decode_subinsn_l1_generated = custom_target(
222    'decode_subinsn_l1_generated.c.inc',
223    output: 'decode_subinsn_l1_generated.c.inc',
224    input: subinsn_l1_decode_generated,
225    env: {'PYTHONPATH': meson.current_build_dir()},
226    command: [python, files(decodetree_py), subinsn_l1_decode_generated, ['--static-decode=decode_subinsn_l1', '--insnwidth=16'], '-o', '@OUTPUT@'],
227)
228hexagon_ss.add(decode_subinsn_l1_generated)
229
230decode_subinsn_l2_generated = custom_target(
231    'decode_subinsn_l2_generated.c.inc',
232    output: 'decode_subinsn_l2_generated.c.inc',
233    input: subinsn_l2_decode_generated,
234    env: {'PYTHONPATH': meson.current_build_dir()},
235    command: [python, files(decodetree_py), subinsn_l2_decode_generated, ['--static-decode=decode_subinsn_l2', '--insnwidth=16'], '-o', '@OUTPUT@'],
236)
237hexagon_ss.add(decode_subinsn_l2_generated)
238
239decode_subinsn_s1_generated = custom_target(
240    'decode_subinsn_s1_generated.c.inc',
241    output: 'decode_subinsn_s1_generated.c.inc',
242    input: subinsn_s1_decode_generated,
243    env: {'PYTHONPATH': meson.current_build_dir()},
244    command: [python, files(decodetree_py), subinsn_s1_decode_generated, ['--static-decode=decode_subinsn_s1', '--insnwidth=16'], '-o', '@OUTPUT@'],
245)
246hexagon_ss.add(decode_subinsn_s1_generated)
247
248decode_subinsn_s2_generated = custom_target(
249    'decode_subinsn_s2_generated.c.inc',
250    output: 'decode_subinsn_s2_generated.c.inc',
251    input: subinsn_s2_decode_generated,
252    env: {'PYTHONPATH': meson.current_build_dir()},
253    command: [python, files(decodetree_py), subinsn_s2_decode_generated, ['--static-decode=decode_subinsn_s2', '--insnwidth=16'], '-o', '@OUTPUT@'],
254)
255hexagon_ss.add(decode_subinsn_s2_generated)
256
257#
258# Generate the trans_* functions that the decoder will use
259#
260decodetree_trans_funcs_generated = custom_target(
261    'decodetree_trans_funcs_generated.c.inc',
262    output: 'decodetree_trans_funcs_generated.c.inc',
263    depends: [iset_py, semantics_generated],
264    env: {'PYTHONPATH': meson.current_build_dir()},
265    command: [python, files('gen_trans_funcs.py'), semantics_generated, '@OUTPUT@'],
266)
267hexagon_ss.add(decodetree_trans_funcs_generated)
268
269hexagon_ss.add(files(
270    'cpu.c',
271    'translate.c',
272    'op_helper.c',
273    'gdbstub.c',
274    'genptr.c',
275    'reg_fields.c',
276    'decode.c',
277    'iclass.c',
278    'opcodes.c',
279    'printinsn.c',
280    'arch.c',
281    'fma_emu.c',
282    'mmvec/decode_ext_mmvec.c',
283    'mmvec/system_ext_mmvec.c',
284))
285
286#
287# Step 4.5
288# We use flex/bison based idef-parser to generate TCG code for a lot
289# of instructions. idef-parser outputs
290#     idef-generated-emitter.c
291#     idef-generated-emitter.h.inc
292#     idef-generated-enabled-instructions
293#
294idef_parser_enabled = get_option('hexagon_idef_parser')
295if idef_parser_enabled and 'hexagon-linux-user' in target_dirs
296    idef_parser_input_generated = custom_target(
297        'idef_parser_input.h.inc',
298        output: 'idef_parser_input.h.inc',
299        depends: [semantics_generated],
300        depend_files: [hex_common_py],
301        command: [python, files('gen_idef_parser_funcs.py'), semantics_generated, attribs_def, '@OUTPUT@'],
302    )
303
304    preprocessed_idef_parser_input_generated = custom_target(
305        'idef_parser_input.preprocessed.h.inc',
306        output: 'idef_parser_input.preprocessed.h.inc',
307        input: idef_parser_input_generated,
308        depend_files: [idef_parser_dir / 'macros.inc'],
309        command: [idef_parser_dir / 'prepare', '@INPUT@', '-I' + idef_parser_dir, '-o', '@OUTPUT@'],
310    )
311
312    flex = generator(
313        find_program('flex'),
314        output: ['@BASENAME@.yy.c', '@BASENAME@.yy.h'],
315        arguments: ['-o', '@OUTPUT0@', '--header-file=@OUTPUT1@', '@INPUT@']
316    )
317
318    bison = generator(
319        find_program('bison', version: '>=3.0'),
320        output: ['@BASENAME@.tab.c', '@BASENAME@.tab.h'],
321        arguments: ['@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@']
322    )
323
324    glib_dep = dependency('glib-2.0', native: true)
325
326    idef_parser = executable(
327        'idef-parser',
328        [flex.process(idef_parser_dir / 'idef-parser.lex'),
329         bison.process(idef_parser_dir / 'idef-parser.y'),
330         idef_parser_dir / 'parser-helpers.c'],
331        include_directories: ['idef-parser', '../../include/'],
332        dependencies: [glib_dep],
333        native: true
334    )
335
336    idef_generated_tcg = custom_target(
337        'idef-generated-tcg',
338        output: ['idef-generated-emitter.c',
339                 'idef-generated-emitter.h.inc',
340                 'idef-generated-enabled-instructions'],
341        input: preprocessed_idef_parser_input_generated,
342        depend_files: [hex_common_py],
343        command: [idef_parser, '@INPUT@', '@OUTPUT0@', '@OUTPUT1@', '@OUTPUT2@']
344    )
345
346    indent = find_program('indent', required: false)
347    if indent.found()
348        idef_generated_tcg_c = custom_target(
349            'indent',
350            input: idef_generated_tcg[0],
351            output: 'idef-generated-emitter.indented.c',
352            command: [indent, '-linux', '@INPUT@', '-o', '@OUTPUT@']
353        )
354    else
355        idef_generated_tcg_c = custom_target(
356            'copy',
357            input: idef_generated_tcg[0],
358            output: 'idef-generated-emitter.indented.c',
359            command: ['cp', '@INPUT@', '@OUTPUT@']
360        )
361    endif
362
363    idef_generated_list = idef_generated_tcg[2].full_path()
364
365    hexagon_ss.add(idef_generated_tcg_c)
366
367    # Setup input and dependencies for the next step, this depends on whether or
368    # not idef-parser is enabled
369    helper_dep = [semantics_generated, idef_generated_tcg_c, idef_generated_tcg]
370    helper_in = [semantics_generated, attribs_def, gen_tcg_h, gen_tcg_hvx_h, idef_generated_list]
371else
372    # Setup input and dependencies for the next step, this depends on whether or
373    # not idef-parser is enabled
374    helper_dep = [semantics_generated]
375    helper_in = [semantics_generated, attribs_def, gen_tcg_h, gen_tcg_hvx_h]
376endif
377
378#
379# Step 5
380# We use Python scripts to generate the following files
381#     helper_protos_generated.h.inc
382#     helper_funcs_generated.c.inc
383#     tcg_funcs_generated.c.inc
384#
385helper_protos_generated = custom_target(
386    'helper_protos_generated.h.inc',
387    output: 'helper_protos_generated.h.inc',
388    depends: helper_dep,
389    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
390    command: [python, files('gen_helper_protos.py'), helper_in, '@OUTPUT@'],
391)
392hexagon_ss.add(helper_protos_generated)
393
394helper_funcs_generated = custom_target(
395    'helper_funcs_generated.c.inc',
396    output: 'helper_funcs_generated.c.inc',
397    depends: helper_dep,
398    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
399    command: [python, files('gen_helper_funcs.py'), helper_in, '@OUTPUT@'],
400)
401hexagon_ss.add(helper_funcs_generated)
402
403tcg_funcs_generated = custom_target(
404    'tcg_funcs_generated.c.inc',
405    output: 'tcg_funcs_generated.c.inc',
406    depends: helper_dep,
407    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
408    command: [python, files('gen_tcg_funcs.py'), helper_in, '@OUTPUT@'],
409)
410hexagon_ss.add(tcg_funcs_generated)
411
412analyze_funcs_generated = custom_target(
413    'analyze_funcs_generated.c.inc',
414    output: 'analyze_funcs_generated.c.inc',
415    depends: helper_dep,
416    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
417    command: [python, files('gen_analyze_funcs.py'), helper_in, '@OUTPUT@'],
418)
419hexagon_ss.add(analyze_funcs_generated)
420
421target_arch += {'hexagon': hexagon_ss}
422