diff mbox series

[v7,34/35] Hexagon build infrastructure

Message ID 1611113349-24906-35-git-send-email-tsimpson@quicinc.com
State New
Headers show
Series [v7,01/35] Hexagon Update MAINTAINERS file | expand

Commit Message

Taylor Simpson Jan. 20, 2021, 3:29 a.m. UTC
Add file to default-configs
Add hexagon to meson.build
Add hexagon to target/meson.build
Add target/hexagon/meson.build
Change scripts/qemu-binfmt-conf.sh

We can build a hexagon-linux-user target and run programs on the Hexagon
scalar core.  With hexagon-linux-clang installed, "make check-tcg" will
pass.

Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
---
 default-configs/targets/hexagon-linux-user.mak |   1 +
 meson.build                                    |   1 +
 scripts/qemu-binfmt-conf.sh                    |   6 +-
 target/hexagon/meson.build                     | 187 +++++++++++++++++++++++++
 target/meson.build                             |   1 +
 5 files changed, 195 insertions(+), 1 deletion(-)
 create mode 100644 default-configs/targets/hexagon-linux-user.mak
 create mode 100644 target/hexagon/meson.build

Comments

Philippe Mathieu-Daudé Jan. 22, 2021, 10:34 p.m. UTC | #1
On 1/20/21 4:29 AM, Taylor Simpson wrote:
> Add file to default-configs
> Add hexagon to meson.build
> Add hexagon to target/meson.build
> Add target/hexagon/meson.build
> Change scripts/qemu-binfmt-conf.sh
> 
> We can build a hexagon-linux-user target and run programs on the Hexagon
> scalar core.  With hexagon-linux-clang installed, "make check-tcg" will
> pass.
> 
> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
> ---
>  default-configs/targets/hexagon-linux-user.mak |   1 +
>  meson.build                                    |   1 +
>  scripts/qemu-binfmt-conf.sh                    |   6 +-
>  target/hexagon/meson.build                     | 187 +++++++++++++++++++++++++
>  target/meson.build                             |   1 +
>  5 files changed, 195 insertions(+), 1 deletion(-)
>  create mode 100644 default-configs/targets/hexagon-linux-user.mak
>  create mode 100644 target/hexagon/meson.build
...

> +++ b/target/hexagon/meson.build
> @@ -0,0 +1,187 @@
> +##
> +##  Copyright(c) 2020-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
> +##
> +##  This program is free software; you can redistribute it and/or modify
> +##  it under the terms of the GNU General Public License as published by
> +##  the Free Software Foundation; either version 2 of the License, or
> +##  (at your option) any later version.
> +##
> +##  This program is distributed in the hope that it will be useful,
> +##  but WITHOUT ANY WARRANTY; without even the implied warranty of
> +##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +##  GNU General Public License for more details.
> +##
> +##  You should have received a copy of the GNU General Public License
> +##  along with this program; if not, see <http://www.gnu.org/licenses/>.
> +##
> +
> +hexagon_ss = ss.source_set()
> +
> +prog_python = import('python').find_installation('python3')
> +
> +hex_common_py = 'hex_common.py'
> +attribs_def_h = meson.current_source_dir() / 'attribs_def.h'
> +gen_tcg_h = meson.current_source_dir() / 'gen_tcg.h'
> +
> +#
> +#  Step 1
> +#  We use a C program to create semantics_generated.pyinc
> +#
> +gen_semantics = executable('gen_semantics', 'gen_semantics.c')
> +
> +semantics = custom_target(
> +    'semantics_generated.pyinc',
> +    output: 'semantics_generated.pyinc',
> +    input: gen_semantics,
> +    command: ['@INPUT@', '@OUTPUT@'],
> +)
> +hexagon_ss.add(semantics)

Is something missing here?

$ make -j8
[316/1048] Generating semantics_generated.pyinc with a custom command
FAILED: target/hexagon/semantics_generated.pyinc
target/hexagon/gen_semantics target/hexagon/semantics_generated.pyinc
/bin/sh: 1: target/hexagon/gen_semantics: not found
ninja: build stopped: subcommand failed.

$ make target/hexagon/semantics_generated.pyinc V=1
/usr/bin/ninja -v   -j1  target/hexagon/semantics_generated.pyinc | cat
[1/1] target/hexagon/gen_semantics target/hexagon/semantics_generated.pyinc
FAILED: target/hexagon/semantics_generated.pyinc
target/hexagon/gen_semantics target/hexagon/semantics_generated.pyinc
/bin/sh: 1: target/hexagon/gen_semantics: not found
ninja: build stopped: subcommand failed.
make: *** [Makefile:172: run-ninja] Error 1

OK, I'm cross-compiling, target/hexagon/gen_semantics has been generated
but with as target, and we want it linked for the host...

Cc'ing Paolo in case he figures the issue simply looking at this patch
:)

Phil.
Philippe Mathieu-Daudé Jan. 22, 2021, 10:41 p.m. UTC | #2
On 1/22/21 11:34 PM, Philippe Mathieu-Daudé wrote:
> On 1/20/21 4:29 AM, Taylor Simpson wrote:
>> Add file to default-configs
>> Add hexagon to meson.build
>> Add hexagon to target/meson.build
>> Add target/hexagon/meson.build
>> Change scripts/qemu-binfmt-conf.sh
>>
>> We can build a hexagon-linux-user target and run programs on the Hexagon
>> scalar core.  With hexagon-linux-clang installed, "make check-tcg" will
>> pass.
>>
>> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
>> ---
>>  default-configs/targets/hexagon-linux-user.mak |   1 +
>>  meson.build                                    |   1 +
>>  scripts/qemu-binfmt-conf.sh                    |   6 +-
>>  target/hexagon/meson.build                     | 187 +++++++++++++++++++++++++
>>  target/meson.build                             |   1 +
>>  5 files changed, 195 insertions(+), 1 deletion(-)
>>  create mode 100644 default-configs/targets/hexagon-linux-user.mak
>>  create mode 100644 target/hexagon/meson.build
> ...
> 
>> +++ b/target/hexagon/meson.build
>> @@ -0,0 +1,187 @@
>> +##
>> +##  Copyright(c) 2020-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
>> +##
>> +##  This program is free software; you can redistribute it and/or modify
>> +##  it under the terms of the GNU General Public License as published by
>> +##  the Free Software Foundation; either version 2 of the License, or
>> +##  (at your option) any later version.
>> +##
>> +##  This program is distributed in the hope that it will be useful,
>> +##  but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +##  GNU General Public License for more details.
>> +##
>> +##  You should have received a copy of the GNU General Public License
>> +##  along with this program; if not, see <http://www.gnu.org/licenses/>.
>> +##
>> +
>> +hexagon_ss = ss.source_set()
>> +
>> +prog_python = import('python').find_installation('python3')
>> +
>> +hex_common_py = 'hex_common.py'
>> +attribs_def_h = meson.current_source_dir() / 'attribs_def.h'
>> +gen_tcg_h = meson.current_source_dir() / 'gen_tcg.h'
>> +
>> +#
>> +#  Step 1
>> +#  We use a C program to create semantics_generated.pyinc
>> +#
>> +gen_semantics = executable('gen_semantics', 'gen_semantics.c')
>> +
>> +semantics = custom_target(
>> +    'semantics_generated.pyinc',
>> +    output: 'semantics_generated.pyinc',
>> +    input: gen_semantics,
>> +    command: ['@INPUT@', '@OUTPUT@'],
>> +)
>> +hexagon_ss.add(semantics)
> 
> Is something missing here?
> 
> $ make -j8
> [316/1048] Generating semantics_generated.pyinc with a custom command
> FAILED: target/hexagon/semantics_generated.pyinc
> target/hexagon/gen_semantics target/hexagon/semantics_generated.pyinc
> /bin/sh: 1: target/hexagon/gen_semantics: not found
> ninja: build stopped: subcommand failed.
> 
> $ make target/hexagon/semantics_generated.pyinc V=1
> /usr/bin/ninja -v   -j1  target/hexagon/semantics_generated.pyinc | cat
> [1/1] target/hexagon/gen_semantics target/hexagon/semantics_generated.pyinc
> FAILED: target/hexagon/semantics_generated.pyinc
> target/hexagon/gen_semantics target/hexagon/semantics_generated.pyinc
> /bin/sh: 1: target/hexagon/gen_semantics: not found
> ninja: build stopped: subcommand failed.
> make: *** [Makefile:172: run-ninja] Error 1
> 
> OK, I'm cross-compiling, target/hexagon/gen_semantics has been generated
> but with as target, and we want it linked for the host...

So I compiled it manually using:

$ gcc -o target/hexagon/gen_semantics
~/source/qemu/target/hexagon/gen_semantics.c

Then same story:

[14/68] Generating iset.py with a custom command
FAILED: target/hexagon/iset.py
target/hexagon/gen_dectree_import target/hexagon/iset.py
/bin/sh: 1: target/hexagon/gen_dectree_import: not found
ninja: build stopped: subcommand failed.

$ gcc -o target/hexagon/gen_dectree_import
~/source/qemu/target/hexagon/gen_dectree_import.c
target/hexagon/gen_dectree_import.c:24:10: fatal error: qemu/osdep.h: No
such file or directory
 #include "qemu/osdep.h"
          ^~~~~~~~~~~~~~

It is late here, so enough testing for today. TBC ;)

BTW you should test your branch on gitlab-ci, I'm pretty sure
various jobs fail.

Regards,

Phil.
Philippe Mathieu-Daudé Jan. 22, 2021, 10:44 p.m. UTC | #3
On 1/22/21 11:41 PM, Philippe Mathieu-Daudé wrote:
> On 1/22/21 11:34 PM, Philippe Mathieu-Daudé wrote:
>> On 1/20/21 4:29 AM, Taylor Simpson wrote:
>>> Add file to default-configs
>>> Add hexagon to meson.build
>>> Add hexagon to target/meson.build
>>> Add target/hexagon/meson.build
>>> Change scripts/qemu-binfmt-conf.sh
>>>
>>> We can build a hexagon-linux-user target and run programs on the Hexagon
>>> scalar core.  With hexagon-linux-clang installed, "make check-tcg" will
>>> pass.
>>>
>>> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
>>> ---
>>>  default-configs/targets/hexagon-linux-user.mak |   1 +
>>>  meson.build                                    |   1 +
>>>  scripts/qemu-binfmt-conf.sh                    |   6 +-
>>>  target/hexagon/meson.build                     | 187 +++++++++++++++++++++++++
>>>  target/meson.build                             |   1 +
>>>  5 files changed, 195 insertions(+), 1 deletion(-)
>>>  create mode 100644 default-configs/targets/hexagon-linux-user.mak
>>>  create mode 100644 target/hexagon/meson.build
>> ...
> 
> BTW you should test your branch on gitlab-ci, I'm pretty sure
> various jobs fail.

Forgot to paste this link:
https://wiki.qemu.org/Testing/CI/GitLabCI
Taylor Simpson Jan. 27, 2021, 7:16 p.m. UTC | #4
> -----Original Message-----
> From: Philippe Mathieu-Daudé <philippe.mathieu.daude@gmail.com> On
> Behalf Of Philippe Mathieu-Daudé
> Sent: Friday, January 22, 2021 4:42 PM
> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org;
> Paolo Bonzini <pbonzini@redhat.com>
> Cc: ale@rev.ng; alex.bennee@linaro.org; richard.henderson@linaro.org;
> laurent@vivier.eu; Brian Cain <bcain@quicinc.com>
> Subject: Re: [PATCH v7 34/35] Hexagon build infrastructure
>
> On 1/22/21 11:34 PM, Philippe Mathieu-Daudé wrote:
> > On 1/20/21 4:29 AM, Taylor Simpson wrote:
> >> Add file to default-configs
> >> Add hexagon to meson.build
> >> Add hexagon to target/meson.build
> >> Add target/hexagon/meson.build
> >> Change scripts/qemu-binfmt-conf.sh
> >>
> >> We can build a hexagon-linux-user target and run programs on the
> Hexagon
> >> scalar core.  With hexagon-linux-clang installed, "make check-tcg" will
> >> pass.
> >>
> >> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
> >> ---
> >>  default-configs/targets/hexagon-linux-user.mak |   1 +
> >>  meson.build                                    |   1 +
> >>  scripts/qemu-binfmt-conf.sh                    |   6 +-
> >>  target/hexagon/meson.build                     | 187
> +++++++++++++++++++++++++
> >>  target/meson.build                             |   1 +
> >>  5 files changed, 195 insertions(+), 1 deletion(-)
> >>  create mode 100644 default-configs/targets/hexagon-linux-user.mak
> >>  create mode 100644 target/hexagon/meson.build
> > ...
> >
> >> +++ b/target/hexagon/meson.build
> >> +hexagon_ss = ss.source_set()
> >> +
> >> +prog_python = import('python').find_installation('python3')
> >> +
> >> +hex_common_py = 'hex_common.py'
> >> +attribs_def_h = meson.current_source_dir() / 'attribs_def.h'
> >> +gen_tcg_h = meson.current_source_dir() / 'gen_tcg.h'
> >> +
> >> +#
> >> +#  Step 1
> >> +#  We use a C program to create semantics_generated.pyinc
> >> +#
> >> +gen_semantics = executable('gen_semantics', 'gen_semantics.c')
> >> +
> >> +semantics = custom_target(
> >> +    'semantics_generated.pyinc',
> >> +    output: 'semantics_generated.pyinc',
> >> +    input: gen_semantics,
> >> +    command: ['@INPUT@', '@OUTPUT@'],
> >> +)
> >> +hexagon_ss.add(semantics)
> >
> > Is something missing here?
> >
> > $ make -j8
> > [316/1048] Generating semantics_generated.pyinc with a custom
> command
> > FAILED: target/hexagon/semantics_generated.pyinc
> > target/hexagon/gen_semantics
> target/hexagon/semantics_generated.pyinc
> > /bin/sh: 1: target/hexagon/gen_semantics: not found
> > ninja: build stopped: subcommand failed.
> >
> > $ make target/hexagon/semantics_generated.pyinc V=1
> > /usr/bin/ninja -v   -j1  target/hexagon/semantics_generated.pyinc | cat
> > [1/1] target/hexagon/gen_semantics
> target/hexagon/semantics_generated.pyinc
> > FAILED: target/hexagon/semantics_generated.pyinc
> > target/hexagon/gen_semantics
> target/hexagon/semantics_generated.pyinc
> > /bin/sh: 1: target/hexagon/gen_semantics: not found
> > ninja: build stopped: subcommand failed.
> > make: *** [Makefile:172: run-ninja] Error 1
> >
> > OK, I'm cross-compiling, target/hexagon/gen_semantics has been
> generated
> > but with as target, and we want it linked for the host...
>
> So I compiled it manually using:
>
> $ gcc -o target/hexagon/gen_semantics
> ~/source/qemu/target/hexagon/gen_semantics.c
>
> Then same story:
>
> [14/68] Generating iset.py with a custom command
> FAILED: target/hexagon/iset.py
> target/hexagon/gen_dectree_import target/hexagon/iset.py
> /bin/sh: 1: target/hexagon/gen_dectree_import: not found
> ninja: build stopped: subcommand failed.
>
> $ gcc -o target/hexagon/gen_dectree_import
> ~/source/qemu/target/hexagon/gen_dectree_import.c
> target/hexagon/gen_dectree_import.c:24:10: fatal error: qemu/osdep.h: No
> such file or directory
>  #include "qemu/osdep.h"
>           ^~~~~~~~~~~~~~

I'm able to reproduce and fix these problems by building with debian-armel-cross.  The solution is
- Add "native: true" to the executable functions
- Don't include "qemu/osdep.h", use the std header files instead.

I also see the 32-bit printf formatting errors you mentioned in this build.

These fixes will be included in the next iteration of the series.

> BTW you should test your branch on gitlab-ci, I'm pretty sure
> various jobs fail.

I'll look into that as well.

Thanks,
Taylor
diff mbox series

Patch

diff --git a/default-configs/targets/hexagon-linux-user.mak b/default-configs/targets/hexagon-linux-user.mak
new file mode 100644
index 0000000..003ed0a
--- /dev/null
+++ b/default-configs/targets/hexagon-linux-user.mak
@@ -0,0 +1 @@ 
+TARGET_ARCH=hexagon
diff --git a/meson.build b/meson.build
index 3d88985..1cc6823 100644
--- a/meson.build
+++ b/meson.build
@@ -1156,6 +1156,7 @@  disassemblers = {
   'arm' : ['CONFIG_ARM_DIS'],
   'avr' : ['CONFIG_AVR_DIS'],
   'cris' : ['CONFIG_CRIS_DIS'],
+  'hexagon' : ['CONFIG_HEXAGON_DIS'],
   'hppa' : ['CONFIG_HPPA_DIS'],
   'i386' : ['CONFIG_I386_DIS'],
   'x86_64' : ['CONFIG_I386_DIS'],
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index 9f1580a..7b5d54b 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -4,7 +4,7 @@ 
 qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \
 ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \
 sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \
-microblaze microblazeel or1k x86_64"
+microblaze microblazeel or1k x86_64 hexagon"
 
 i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00'
 i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
@@ -136,6 +136,10 @@  or1k_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\
 or1k_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
 or1k_family=or1k
 
+hexagon_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xa4\x00'
+hexagon_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
+hexagon_family=hexagon
+
 qemu_get_family() {
     cpu=${HOST_ARCH:-$(uname -m)}
     case "$cpu" in
diff --git a/target/hexagon/meson.build b/target/hexagon/meson.build
new file mode 100644
index 0000000..48adab5
--- /dev/null
+++ b/target/hexagon/meson.build
@@ -0,0 +1,187 @@ 
+##
+##  Copyright(c) 2020-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
+##
+##  This program is free software; you can redistribute it and/or modify
+##  it under the terms of the GNU General Public License as published by
+##  the Free Software Foundation; either version 2 of the License, or
+##  (at your option) any later version.
+##
+##  This program is distributed in the hope that it will be useful,
+##  but WITHOUT ANY WARRANTY; without even the implied warranty of
+##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+##  GNU General Public License for more details.
+##
+##  You should have received a copy of the GNU General Public License
+##  along with this program; if not, see <http://www.gnu.org/licenses/>.
+##
+
+hexagon_ss = ss.source_set()
+
+prog_python = import('python').find_installation('python3')
+
+hex_common_py = 'hex_common.py'
+attribs_def_h = meson.current_source_dir() / 'attribs_def.h'
+gen_tcg_h = meson.current_source_dir() / 'gen_tcg.h'
+
+#
+#  Step 1
+#  We use a C program to create semantics_generated.pyinc
+#
+gen_semantics = executable('gen_semantics', 'gen_semantics.c')
+
+semantics = custom_target(
+    'semantics_generated.pyinc',
+    output: 'semantics_generated.pyinc',
+    input: gen_semantics,
+    command: ['@INPUT@', '@OUTPUT@'],
+)
+hexagon_ss.add(semantics)
+
+#
+# Step 2
+# We use Python scripts to generate the following files
+#     shortcode_generated.h
+#     helper_protos_generated.h
+#     tcg_funcs_generated.h
+#     tcg_func_table_generated.h
+#     helper_funcs_generated.h
+#     printinsn_generated.h
+#     op_regs_generated.h
+#     op_attribs_generated.h
+#     opcodes_def_generated.h
+#
+shortcode_h = custom_target(
+    'shortcode_generated.h',
+    output: 'shortcode_generated.h',
+    input: 'gen_shortcode.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, '@OUTPUT@'],
+)
+hexagon_ss.add(shortcode_h)
+
+helper_protos_h = custom_target(
+    'helper_protos_generated.h',
+    output: 'helper_protos_generated.h',
+    input: 'gen_helper_protos.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h, gen_tcg_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, gen_tcg_h, '@OUTPUT@'],
+)
+hexagon_ss.add(helper_protos_h)
+
+tcg_funcs_h = custom_target(
+    'tcg_funcs_generated.h',
+    output: 'tcg_funcs_generated.h',
+    input: 'gen_tcg_funcs.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h, gen_tcg_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, gen_tcg_h, '@OUTPUT@'],
+)
+hexagon_ss.add(tcg_funcs_h)
+
+tcg_func_table_h = custom_target(
+    'tcg_func_table_generated.h',
+    output: 'tcg_func_table_generated.h',
+    input: 'gen_tcg_func_table.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, '@OUTPUT@'],
+)
+hexagon_ss.add(tcg_func_table_h)
+
+helper_funcs_h = custom_target(
+    'helper_funcs_generated.h',
+    output: 'helper_funcs_generated.h',
+    input: 'gen_helper_funcs.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h, gen_tcg_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, gen_tcg_h, '@OUTPUT@'],
+)
+hexagon_ss.add(helper_funcs_h)
+
+printinsn_h = custom_target(
+    'printinsn_generated.h',
+    output: 'printinsn_generated.h',
+    input: 'gen_printinsn.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, '@OUTPUT@'],
+)
+hexagon_ss.add(printinsn_h)
+
+op_regs_h = custom_target(
+    'op_regs_generated.h',
+    output: 'op_regs_generated.h',
+    input: 'gen_op_regs.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, '@OUTPUT@'],
+)
+hexagon_ss.add(op_regs_h)
+
+op_attribs_h = custom_target(
+    'op_attribs_generated.h',
+    output: 'op_attribs_generated.h',
+    input: 'gen_op_attribs.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, '@OUTPUT@'],
+)
+hexagon_ss.add(op_attribs_h)
+
+opcodes_def_h = custom_target(
+    'opcodes_def_generated.h',
+    output: 'opcodes_def_generated.h',
+    input: 'gen_opcodes_def.py',
+    depends: [semantics],
+    depend_files: [hex_common_py, attribs_def_h],
+    command: [prog_python, '@INPUT@', semantics, attribs_def_h, '@OUTPUT@'],
+)
+hexagon_ss.add(opcodes_def_h)
+
+#
+# Step 3
+# We use a C program to create iset.py which is imported into dectree.py
+# to create the decode tree
+#
+gen_dectree_import = executable('gen_dectree_import', 'gen_dectree_import.c', opcodes_def_h, op_regs_h)
+
+iset_py = custom_target(
+    'iset.py',
+    output: 'iset.py',
+    input: gen_dectree_import,
+    command: ['@INPUT@', '@OUTPUT@'],
+)
+hexagon_ss.add(iset_py)
+
+#
+# Step 4
+# We use the dectree.py script to generate the decode tree header file
+#
+dectree_h = custom_target(
+    'dectree_generated.h',
+    output: 'dectree_generated.h',
+    input: 'dectree.py',
+    depends: [iset_py],
+    command: ['PYTHONPATH=' + meson.current_build_dir(), '@INPUT@', '@OUTPUT@'],
+)
+hexagon_ss.add(dectree_h)
+
+hexagon_ss.add(files(
+    'cpu.c',
+    'translate.c',
+    'op_helper.c',
+    'gdbstub.c',
+    'genptr.c',
+    'reg_fields.c',
+    'decode.c',
+    'iclass.c',
+    'opcodes.c',
+    'printinsn.c',
+    'arch.c',
+    'fma_emu.c',
+    'conv_emu.c',
+))
+
+target_arch += {'hexagon': hexagon_ss}
diff --git a/target/meson.build b/target/meson.build
index 9f0ae93..c35c1e9 100644
--- a/target/meson.build
+++ b/target/meson.build
@@ -2,6 +2,7 @@  subdir('alpha')
 subdir('arm')
 subdir('avr')
 subdir('cris')
+subdir('hexagon')
 subdir('hppa')
 subdir('i386')
 subdir('lm32')