summary refs log tree commit diff stats
path: root/target/hexagon/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'target/hexagon/meson.build')
-rw-r--r--target/hexagon/meson.build158
1 files changed, 128 insertions, 30 deletions
diff --git a/target/hexagon/meson.build b/target/hexagon/meson.build
index b61243103f..e8f250fcac 100644
--- a/target/hexagon/meson.build
+++ b/target/hexagon/meson.build
@@ -21,6 +21,7 @@ hex_common_py = 'hex_common.py'
 attribs_def = meson.current_source_dir() / 'attribs_def.h.inc'
 gen_tcg_h = meson.current_source_dir() / 'gen_tcg.h'
 gen_tcg_hvx_h = meson.current_source_dir() / 'gen_tcg_hvx.h'
+idef_parser_dir = meson.current_source_dir() / 'idef-parser'
 
 #
 #  Step 1
@@ -42,10 +43,7 @@ hexagon_ss.add(semantics_generated)
 # Step 2
 # We use Python scripts to generate the following files
 #     shortcode_generated.h.inc
-#     helper_protos_generated.h.inc
-#     tcg_funcs_generated.c.inc
 #     tcg_func_table_generated.c.inc
-#     helper_funcs_generated.c.inc
 #     printinsn_generated.h.inc
 #     op_regs_generated.h.inc
 #     op_attribs_generated.h.inc
@@ -60,24 +58,6 @@ shortcode_generated = custom_target(
 )
 hexagon_ss.add(shortcode_generated)
 
-helper_protos_generated = custom_target(
-    'helper_protos_generated.h.inc',
-    output: 'helper_protos_generated.h.inc',
-    depends: [semantics_generated],
-    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
-    command: [python, files('gen_helper_protos.py'), semantics_generated, attribs_def, gen_tcg_h, gen_tcg_hvx_h, '@OUTPUT@'],
-)
-hexagon_ss.add(helper_protos_generated)
-
-tcg_funcs_generated = custom_target(
-    'tcg_funcs_generated.c.inc',
-    output: 'tcg_funcs_generated.c.inc',
-    depends: [semantics_generated],
-    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
-    command: [python, files('gen_tcg_funcs.py'), semantics_generated, attribs_def, gen_tcg_h, gen_tcg_hvx_h, '@OUTPUT@'],
-)
-hexagon_ss.add(tcg_funcs_generated)
-
 tcg_func_table_generated = custom_target(
     'tcg_func_table_generated.c.inc',
     output: 'tcg_func_table_generated.c.inc',
@@ -87,15 +67,6 @@ tcg_func_table_generated = custom_target(
 )
 hexagon_ss.add(tcg_func_table_generated)
 
-helper_funcs_generated = custom_target(
-    'helper_funcs_generated.c.inc',
-    output: 'helper_funcs_generated.c.inc',
-    depends: [semantics_generated],
-    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
-    command: [python, files('gen_helper_funcs.py'), semantics_generated, attribs_def, gen_tcg_h, gen_tcg_hvx_h, '@OUTPUT@'],
-)
-hexagon_ss.add(helper_funcs_generated)
-
 printinsn_generated = custom_target(
     'printinsn_generated.h.inc',
     output: 'printinsn_generated.h.inc',
@@ -179,4 +150,131 @@ hexagon_ss.add(files(
     'mmvec/system_ext_mmvec.c',
 ))
 
+#
+# Step 4.5
+# We use flex/bison based idef-parser to generate TCG code for a lot
+# of instructions. idef-parser outputs
+#     idef-generated-emitter.c
+#     idef-generated-emitter.h.inc
+#     idef-generated-enabled-instructions
+#
+idef_parser_enabled = get_option('hexagon_idef_parser')
+if idef_parser_enabled and 'hexagon-linux-user' in target_dirs
+    idef_parser_input_generated = custom_target(
+        'idef_parser_input.h.inc',
+        output: 'idef_parser_input.h.inc',
+        depends: [semantics_generated],
+        depend_files: [hex_common_py],
+        command: [python, files('gen_idef_parser_funcs.py'), semantics_generated, attribs_def, '@OUTPUT@'],
+    )
+
+    preprocessed_idef_parser_input_generated = custom_target(
+        'idef_parser_input.preprocessed.h.inc',
+        output: 'idef_parser_input.preprocessed.h.inc',
+        input: idef_parser_input_generated,
+        depend_files: [idef_parser_dir / 'macros.inc'],
+        command: [idef_parser_dir / 'prepare', '@INPUT@', '-I' + idef_parser_dir, '-o', '@OUTPUT@'],
+    )
+
+    flex = generator(
+        find_program('flex'),
+        output: ['@BASENAME@.yy.c', '@BASENAME@.yy.h'],
+        arguments: ['-o', '@OUTPUT0@', '--header-file=@OUTPUT1@', '@INPUT@']
+    )
+
+    bison = generator(
+        find_program('bison'),
+        output: ['@BASENAME@.tab.c', '@BASENAME@.tab.h'],
+        arguments: ['@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@']
+    )
+
+    glib_dep = dependency('glib-2.0', native: true)
+
+    idef_parser = executable(
+        'idef-parser',
+        [flex.process(idef_parser_dir / 'idef-parser.lex'),
+         bison.process(idef_parser_dir / 'idef-parser.y'),
+         idef_parser_dir / 'parser-helpers.c'],
+        include_directories: ['idef-parser', '../../include/'],
+        dependencies: [glib_dep],
+        c_args: ['-Wextra'],
+        native: true
+    )
+
+    idef_generated_tcg = custom_target(
+        'idef-generated-tcg',
+        output: ['idef-generated-emitter.c',
+                 'idef-generated-emitter.h.inc',
+                 'idef-generated-enabled-instructions'],
+        input: preprocessed_idef_parser_input_generated,
+        depend_files: [hex_common_py],
+        command: [idef_parser, '@INPUT@', '@OUTPUT0@', '@OUTPUT1@', '@OUTPUT2@']
+    )
+
+    indent = find_program('indent', required: false)
+    if indent.found()
+        idef_generated_tcg_c = custom_target(
+            'indent',
+            input: idef_generated_tcg[0],
+            output: 'idef-generated-emitter.indented.c',
+            command: [indent, '-linux', '@INPUT@', '-o', '@OUTPUT@']
+        )
+    else
+        idef_generated_tcg_c = custom_target(
+            'copy',
+            input: idef_generated_tcg[0],
+            output: 'idef-generated-emitter.indented.c',
+            command: ['cp', '@INPUT@', '@OUTPUT@']
+        )
+    endif
+
+    idef_generated_list = idef_generated_tcg[2].full_path()
+
+    hexagon_ss.add(idef_generated_tcg_c)
+
+    # Setup input and dependencies for the next step, this depends on whether or
+    # not idef-parser is enabled
+    helper_dep = [semantics_generated, idef_generated_tcg_c, idef_generated_tcg]
+    helper_in = [semantics_generated, attribs_def, gen_tcg_h, gen_tcg_hvx_h, idef_generated_list]
+else
+    # Setup input and dependencies for the next step, this depends on whether or
+    # not idef-parser is enabled
+    helper_dep = [semantics_generated]
+    helper_in = [semantics_generated, attribs_def, gen_tcg_h, gen_tcg_hvx_h]
+endif
+
+#
+# Step 5
+# We use Python scripts to generate the following files
+#     helper_protos_generated.h.inc
+#     helper_funcs_generated.c.inc
+#     tcg_funcs_generated.c.inc
+#
+helper_protos_generated = custom_target(
+    'helper_protos_generated.h.inc',
+    output: 'helper_protos_generated.h.inc',
+    depends: helper_dep,
+    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
+    command: [python, files('gen_helper_protos.py'), helper_in, '@OUTPUT@'],
+)
+hexagon_ss.add(helper_protos_generated)
+
+helper_funcs_generated = custom_target(
+    'helper_funcs_generated.c.inc',
+    output: 'helper_funcs_generated.c.inc',
+    depends: helper_dep,
+    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
+    command: [python, files('gen_helper_funcs.py'), helper_in, '@OUTPUT@'],
+)
+hexagon_ss.add(helper_funcs_generated)
+
+tcg_funcs_generated = custom_target(
+    'tcg_funcs_generated.c.inc',
+    output: 'tcg_funcs_generated.c.inc',
+    depends: helper_dep,
+    depend_files: [hex_common_py, attribs_def, gen_tcg_h, gen_tcg_hvx_h],
+    command: [python, files('gen_tcg_funcs.py'), helper_in, '@OUTPUT@'],
+)
+hexagon_ss.add(tcg_funcs_generated)
+
 target_arch += {'hexagon': hexagon_ss}