Hexagon build infrastructure
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. Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <1612763186-18161-35-git-send-email-tsimpson@quicinc.com> [rth: Use top-level python variable] Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
703c08d98a
commit
3e7a84eecc
1
default-configs/targets/hexagon-linux-user.mak
Normal file
1
default-configs/targets/hexagon-linux-user.mak
Normal file
@ -0,0 +1 @@
|
|||||||
|
TARGET_ARCH=hexagon
|
@ -1188,6 +1188,7 @@ disassemblers = {
|
|||||||
'arm' : ['CONFIG_ARM_DIS'],
|
'arm' : ['CONFIG_ARM_DIS'],
|
||||||
'avr' : ['CONFIG_AVR_DIS'],
|
'avr' : ['CONFIG_AVR_DIS'],
|
||||||
'cris' : ['CONFIG_CRIS_DIS'],
|
'cris' : ['CONFIG_CRIS_DIS'],
|
||||||
|
'hexagon' : ['CONFIG_HEXAGON_DIS'],
|
||||||
'hppa' : ['CONFIG_HPPA_DIS'],
|
'hppa' : ['CONFIG_HPPA_DIS'],
|
||||||
'i386' : ['CONFIG_I386_DIS'],
|
'i386' : ['CONFIG_I386_DIS'],
|
||||||
'x86_64' : ['CONFIG_I386_DIS'],
|
'x86_64' : ['CONFIG_I386_DIS'],
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \
|
qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \
|
||||||
ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \
|
ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \
|
||||||
sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \
|
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_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'
|
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_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff'
|
||||||
or1k_family=or1k
|
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() {
|
qemu_get_family() {
|
||||||
cpu=${HOST_ARCH:-$(uname -m)}
|
cpu=${HOST_ARCH:-$(uname -m)}
|
||||||
case "$cpu" in
|
case "$cpu" in
|
||||||
|
191
target/hexagon/meson.build
Normal file
191
target/hexagon/meson.build
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
##
|
||||||
|
## 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()
|
||||||
|
|
||||||
|
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'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Step 1
|
||||||
|
# We use a C program to create semantics_generated.pyinc
|
||||||
|
#
|
||||||
|
gen_semantics = executable(
|
||||||
|
'gen_semantics',
|
||||||
|
'gen_semantics.c',
|
||||||
|
native: true, build_by_default: false)
|
||||||
|
|
||||||
|
semantics_generated = custom_target(
|
||||||
|
'semantics_generated.pyinc',
|
||||||
|
output: 'semantics_generated.pyinc',
|
||||||
|
input: gen_semantics,
|
||||||
|
command: ['@INPUT@', '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
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
|
||||||
|
# opcodes_def_generated.h.inc
|
||||||
|
#
|
||||||
|
shortcode_generated = custom_target(
|
||||||
|
'shortcode_generated.h.inc',
|
||||||
|
output: 'shortcode_generated.h.inc',
|
||||||
|
input: 'gen_shortcode.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(shortcode_generated)
|
||||||
|
|
||||||
|
helper_protos_generated = custom_target(
|
||||||
|
'helper_protos_generated.h.inc',
|
||||||
|
output: 'helper_protos_generated.h.inc',
|
||||||
|
input: 'gen_helper_protos.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def, gen_tcg_h],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(helper_protos_generated)
|
||||||
|
|
||||||
|
tcg_funcs_generated = custom_target(
|
||||||
|
'tcg_funcs_generated.c.inc',
|
||||||
|
output: 'tcg_funcs_generated.c.inc',
|
||||||
|
input: 'gen_tcg_funcs.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def, gen_tcg_h],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, gen_tcg_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',
|
||||||
|
input: 'gen_tcg_func_table.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(tcg_func_table_generated)
|
||||||
|
|
||||||
|
helper_funcs_generated = custom_target(
|
||||||
|
'helper_funcs_generated.c.inc',
|
||||||
|
output: 'helper_funcs_generated.c.inc',
|
||||||
|
input: 'gen_helper_funcs.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def, gen_tcg_h],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(helper_funcs_generated)
|
||||||
|
|
||||||
|
printinsn_generated = custom_target(
|
||||||
|
'printinsn_generated.h.inc',
|
||||||
|
output: 'printinsn_generated.h.inc',
|
||||||
|
input: 'gen_printinsn.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(printinsn_generated)
|
||||||
|
|
||||||
|
op_regs_generated = custom_target(
|
||||||
|
'op_regs_generated.h.inc',
|
||||||
|
output: 'op_regs_generated.h.inc',
|
||||||
|
input: 'gen_op_regs.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(op_regs_generated)
|
||||||
|
|
||||||
|
op_attribs_generated = custom_target(
|
||||||
|
'op_attribs_generated.h.inc',
|
||||||
|
output: 'op_attribs_generated.h.inc',
|
||||||
|
input: 'gen_op_attribs.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(op_attribs_generated)
|
||||||
|
|
||||||
|
opcodes_def_generated = custom_target(
|
||||||
|
'opcodes_def_generated.h.inc',
|
||||||
|
output: 'opcodes_def_generated.h.inc',
|
||||||
|
input: 'gen_opcodes_def.py',
|
||||||
|
depends: [semantics_generated],
|
||||||
|
depend_files: [hex_common_py, attribs_def],
|
||||||
|
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(opcodes_def_generated)
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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_generated, op_regs_generated,
|
||||||
|
native: true, build_by_default: false)
|
||||||
|
|
||||||
|
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_generated = custom_target(
|
||||||
|
'dectree_generated.h.inc',
|
||||||
|
output: 'dectree_generated.h.inc',
|
||||||
|
input: 'dectree.py',
|
||||||
|
depends: [iset_py],
|
||||||
|
command: ['PYTHONPATH=' + meson.current_build_dir(), '@INPUT@', '@OUTPUT@'],
|
||||||
|
)
|
||||||
|
hexagon_ss.add(dectree_generated)
|
||||||
|
|
||||||
|
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}
|
@ -2,6 +2,7 @@ subdir('alpha')
|
|||||||
subdir('arm')
|
subdir('arm')
|
||||||
subdir('avr')
|
subdir('avr')
|
||||||
subdir('cris')
|
subdir('cris')
|
||||||
|
subdir('hexagon')
|
||||||
subdir('hppa')
|
subdir('hppa')
|
||||||
subdir('i386')
|
subdir('i386')
|
||||||
subdir('lm32')
|
subdir('lm32')
|
||||||
|
Loading…
Reference in New Issue
Block a user