mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
2542804022
This commit started as adding rv32e support to gdb. The rv32e architecture is a cut-down rv32i, it only has 16 x-registers compared to the usual 32, and an rv32e target should not have any floating point registers. In order to add this I needed to adjust the target description validation checks that are performed from riscv_gdbarch_init, and I finally got fed up with the current scheme of doing these checks and rewrote this code. Unfortunately the rv32e changes are currently mixed in with the rewrite of the validation scheme. I could split these apart if anyone is really interested in seeing these two ideas as separate patches. The main idea behind this change is that where previously I tried to have a purely data driven approach, a set of tables one for each expected feature, and then a single generic function that would validate a feature given a table, I have created a new class for each feature. Each class has its own check member function which allows the logic for how to check each feature to be different. I think the new scheme is much easier to follow. There are some other changes that I made to the validation code as part of this commit. I've relaxed some of the checks related to the floating point CSRs. Previously the 3 CSRs fflags, frm, and fcsr all had to be present in either the fpu feature or the csr feature. This requirement is now relaxed, if the CSRs are not present then gdb will not reject the target description. My thinking here is that there's no gdb functionality that specifically requires these registers, and so, if a target offers a description without these registers nothing else in gdb should stop working. And as part of the rv32e support targets now only have to provide the first 16 x-registers and $pc. The second half of the x-registers (x16 -> x31) are now optional. gdb/ChangeLog: * arch/riscv.c: Include 'rv32e-xregs.c'. (riscv_create_target_description): Update to handle rv32e. * arch/riscv.h (struct riscv_gdbarch_features) <embedded>: New member variable. <operator==>: Update to account for new field. <hash>: Likewise. * features/Makefile (FEATURE_XMLFILES): Add riscv/rv32e-xregs.xml. * features/riscv/rv32e-xregs.c: Generated. * features/riscv/rv32e-xregs.xml: New file. * riscv-tdep.c (riscv_debug_breakpoints): Move from later in the file. (riscv_debug_infcall): Likewise. (riscv_debug_unwinder): Likewise. (riscv_debug_gdbarch): Likewise. (enum riscv_register_required_status): Delete. (struct riscv_register_feature): Add constructor, delete default constructor, copy, and assign constructors. (struct riscv_register_feature::register_info) <required>: Delete. <check>: Update comment and arguments. (struct riscv_register_feature) <name>: Change to member function. <prefer_first_name>: Delete. <tdesc_feature>: New member function. <registers>: Rename to... <m_registers>: ...this. <m_feature_name>: New member variable. (riscv_register_feature::register_info::check): Update arguments. (riscv_xreg_feature): Rewrite as class, create a single static instance of the class. (riscv_freg_feature): Likewise. (riscv_virtual_feature): Likewise. (riscv_csr_feature): Likewise. (riscv_create_csr_aliases): Has become a member function inside riscv_csr_feature class. (riscv_abi_embedded): New function definition. (riscv_register_name): Adjust to use new feature objects. (struct riscv_call_info) <riscv_call_info>: Check for rv32e abi, and adjust available argument registers. (riscv_features_from_gdbarch_info): Check for EF_RISCV_RVE flag. (riscv_check_tdesc_feature): Delete. (riscv_tdesc_unknown_reg): Adjust to use new feature objects. (riscv_gdbarch_init): Delete target description checking code, and instead call to the new feature objects to perform the checks. Reorder handling of no abi information case, allows small code simplification. (_initialize_riscv_tdep): Remove call, this is now done in the riscv_csr_feature constructor. * riscv-tdep.h (riscv_abi_embedded): Declare.
274 lines
8.6 KiB
Makefile
274 lines
8.6 KiB
Makefile
# Copyright (C) 2007-2020 Free Software Foundation, Inc.
|
|
|
|
# This file is part of GDB.
|
|
|
|
# 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 3 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/>.
|
|
|
|
|
|
# This file requires GNU make!
|
|
|
|
# This Makefile updates files in ../regformats from their XML master
|
|
# copies. Because this relies on xsltproc, it is not normally run
|
|
# during the build process; it should be run by hand when one of the
|
|
# affected XML files is changed, and the results should be kept in the
|
|
# GDB repository.
|
|
|
|
# It can also update the C files in the features directory from their
|
|
# XML master copies. This relies on a GDB linked with expat and that
|
|
# is configured to include support for the architecture, so the files
|
|
# are kept in the GDB repository.
|
|
#
|
|
# By default we'll generate all C files, and you must point make at a
|
|
# GDB that has been configured with --enable-targets=all:
|
|
#
|
|
# make GDB=/path/to/gdb cfiles
|
|
#
|
|
# To regenerate all C files from scratch:
|
|
#
|
|
# make GDB=/path/to/gdb clean-cfiles cfiles
|
|
#
|
|
# To generate specific C files, you can override the XMLTOC and
|
|
# FEATURE_XMLFILES make variables:
|
|
#
|
|
# make GDB=/path/to/gdb XMLTOC="xml files" FEATURE_XMLFILES="xml files" cfiles
|
|
|
|
# List of .dat files to create in ../regformats/
|
|
WHICH = mips-linux mips-dsp-linux \
|
|
microblaze-with-stack-protect \
|
|
mips64-linux mips64-dsp-linux \
|
|
nios2-linux \
|
|
rs6000/powerpc-32 \
|
|
rs6000/powerpc-32l rs6000/powerpc-altivec32l rs6000/powerpc-e500l \
|
|
rs6000/powerpc-64l rs6000/powerpc-altivec64l rs6000/powerpc-vsx32l \
|
|
rs6000/powerpc-vsx64l \
|
|
rs6000/powerpc-isa205-32l rs6000/powerpc-isa205-64l \
|
|
rs6000/powerpc-isa205-altivec32l rs6000/powerpc-isa205-altivec64l \
|
|
rs6000/powerpc-isa205-vsx32l rs6000/powerpc-isa205-vsx64l \
|
|
rs6000/powerpc-isa205-ppr-dscr-vsx32l \
|
|
rs6000/powerpc-isa205-ppr-dscr-vsx64l \
|
|
rs6000/powerpc-isa207-vsx32l rs6000/powerpc-isa207-vsx64l \
|
|
rs6000/powerpc-isa207-htm-vsx32l \
|
|
rs6000/powerpc-isa207-htm-vsx64l \
|
|
s390-linux32 s390-linux64 s390x-linux64 \
|
|
s390-linux32v1 s390-linux64v1 s390x-linux64v1 \
|
|
s390-linux32v2 s390-linux64v2 s390x-linux64v2 \
|
|
s390-te-linux64 s390x-te-linux64 s390-vx-linux64 s390x-vx-linux64 \
|
|
s390-tevx-linux64 s390x-tevx-linux64 \
|
|
s390-gs-linux64 s390x-gs-linux64 \
|
|
tic6x-c64xp-linux tic6x-c64x-linux tic6x-c62x-linux
|
|
|
|
# Record which registers should be sent to GDB by default after stop.
|
|
aarch64-expedite = x29,sp,pc
|
|
arm-expedite = r11,sp,pc
|
|
i386-expedite = ebp,esp,eip
|
|
amd64-expedite = rbp,rsp,rip
|
|
x32-expedite = rbp,rsp,rip
|
|
mips-expedite = r29,pc
|
|
mips-dsp-expedite = r29,pc
|
|
mips64-expedite = r29,pc
|
|
mips64-dsp-expedite = r29,pc
|
|
microblaze-expedite = r1,rpc
|
|
nios2-linux-expedite = sp,pc
|
|
or1k-expedite = r1,npc
|
|
powerpc-expedite = r1,pc
|
|
s390-linux32-expedite = r14,r15,pswa
|
|
s390-linux32v1-expedite = r14,r15,pswa
|
|
s390-linux32v2-expedite = r14,r15,pswa
|
|
s390-linux64-expedite = r14l,r15l,pswa
|
|
s390-linux64v1-expedite = r14l,r15l,pswa
|
|
s390-linux64v2-expedite = r14l,r15l,pswa
|
|
s390-te-linux64-expedite = r14l,r15l,pswa
|
|
s390-vx-linux64-expedite = r14l,r15l,pswa
|
|
s390-tevx-linux64-expedite = r14l,r15l,pswa
|
|
s390-gs-linux64-expedite = r14,r15,pswa
|
|
s390x-expedite = r14,r15,pswa
|
|
tic6x-expedite = A15,PC
|
|
|
|
|
|
XSLTPROC = xsltproc
|
|
outdir = ../regformats
|
|
OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
|
|
|
|
# For targets without feature based target descriptions,
|
|
# the set of xml files we'll generate .c files for GDB from. By
|
|
# default we'll build all .c files, which requires an
|
|
# --enable-targets=all GDB. You can override this by passing XMLTOC
|
|
# to make on the command line.
|
|
XMLTOC = \
|
|
microblaze-with-stack-protect.xml \
|
|
microblaze.xml \
|
|
mips-dsp-linux.xml \
|
|
mips-linux.xml \
|
|
mips64-dsp-linux.xml \
|
|
mips64-linux.xml \
|
|
nds32.xml \
|
|
nios2.xml \
|
|
or1k.xml \
|
|
rs6000/powerpc-32.xml \
|
|
rs6000/powerpc-32l.xml \
|
|
rs6000/powerpc-403.xml \
|
|
rs6000/powerpc-403gc.xml \
|
|
rs6000/powerpc-405.xml \
|
|
rs6000/powerpc-505.xml \
|
|
rs6000/powerpc-601.xml \
|
|
rs6000/powerpc-602.xml \
|
|
rs6000/powerpc-603.xml \
|
|
rs6000/powerpc-604.xml \
|
|
rs6000/powerpc-64.xml \
|
|
rs6000/powerpc-64l.xml \
|
|
rs6000/powerpc-7400.xml \
|
|
rs6000/powerpc-750.xml \
|
|
rs6000/powerpc-860.xml \
|
|
rs6000/powerpc-altivec32.xml \
|
|
rs6000/powerpc-altivec32l.xml \
|
|
rs6000/powerpc-altivec64.xml \
|
|
rs6000/powerpc-altivec64l.xml \
|
|
rs6000/powerpc-e500.xml \
|
|
rs6000/powerpc-e500l.xml \
|
|
rs6000/powerpc-isa205-32l.xml \
|
|
rs6000/powerpc-isa205-64l.xml \
|
|
rs6000/powerpc-isa205-altivec32l.xml \
|
|
rs6000/powerpc-isa205-altivec64l.xml \
|
|
rs6000/powerpc-isa205-vsx32l.xml \
|
|
rs6000/powerpc-isa205-vsx64l.xml \
|
|
rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml \
|
|
rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml \
|
|
rs6000/powerpc-isa207-vsx32l.xml \
|
|
rs6000/powerpc-isa207-vsx64l.xml \
|
|
rs6000/powerpc-isa207-htm-vsx32l.xml \
|
|
rs6000/powerpc-isa207-htm-vsx64l.xml \
|
|
rs6000/powerpc-vsx32.xml \
|
|
rs6000/powerpc-vsx32l.xml \
|
|
rs6000/powerpc-vsx64.xml \
|
|
rs6000/powerpc-vsx64l.xml \
|
|
rs6000/rs6000.xml \
|
|
rx.xml \
|
|
s390-linux32.xml \
|
|
s390-linux32v1.xml \
|
|
s390-linux32v2.xml \
|
|
s390-linux64.xml \
|
|
s390-linux64v1.xml \
|
|
s390-linux64v2.xml \
|
|
s390-te-linux64.xml \
|
|
s390x-linux64.xml \
|
|
s390x-linux64v1.xml \
|
|
s390x-linux64v2.xml \
|
|
s390x-te-linux64.xml \
|
|
s390-tevx-linux64.xml \
|
|
s390-vx-linux64.xml \
|
|
s390x-tevx-linux64.xml \
|
|
s390x-vx-linux64.xml \
|
|
s390-gs-linux64.xml \
|
|
s390x-gs-linux64.xml
|
|
|
|
TDESC_CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
|
|
GDB = false
|
|
|
|
#Targets which use feature based target descriptions.
|
|
aarch64-feature = 1
|
|
arm-feature = 1
|
|
i386-feature = 1
|
|
riscv-feature = 1
|
|
tic6x-feature = 1
|
|
|
|
all: $(OUTPUTS)
|
|
|
|
$(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
|
|
echo "# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:" > $(outdir)/$*.tmp
|
|
echo "# Generated from: $<" >> $(outdir)/$*.tmp
|
|
echo "name:`echo $(notdir $*) | sed 's/-/_/g'`" >> $(outdir)/$*.tmp
|
|
$(if $($(firstword $(subst /, ,$(subst -, ,$*)))-feature), echo "feature:1") >> $(outdir)/$*.tmp
|
|
echo "xmltarget:$(<F)" >> $(outdir)/$*.tmp
|
|
echo "expedite:$(if $($*-expedite),$($*-expedite),$($(firstword $(subst -, ,$(notdir $*)))-expedite))" \
|
|
>> $(outdir)/$*.tmp
|
|
$(XSLTPROC) --path "$(PWD)" --xinclude number-regs.xsl $< | \
|
|
$(XSLTPROC) sort-regs.xsl - | \
|
|
$(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp
|
|
sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat
|
|
|
|
# For targets with feature based target descriptions,
|
|
# the set of xml files we'll generate .c files for GDB from.
|
|
FEATURE_XMLFILES = aarch64-core.xml \
|
|
aarch64-fpu.xml \
|
|
aarch64-pauth.xml \
|
|
arc/v1-core.xml \
|
|
arc/v1-aux.xml \
|
|
arc/v2-core.xml \
|
|
arc/v2-aux.xml \
|
|
arm/arm-core.xml \
|
|
arm/arm-fpa.xml \
|
|
arm/arm-m-profile.xml \
|
|
arm/arm-m-profile-with-fpa.xml \
|
|
arm/arm-vfpv2.xml \
|
|
arm/arm-vfpv3.xml \
|
|
arm/xscale-iwmmxt.xml \
|
|
i386/32bit-core.xml \
|
|
i386/32bit-sse.xml \
|
|
i386/32bit-linux.xml \
|
|
i386/32bit-avx.xml \
|
|
i386/32bit-mpx.xml \
|
|
i386/32bit-avx512.xml \
|
|
i386/32bit-pkeys.xml \
|
|
i386/64bit-avx512.xml \
|
|
i386/64bit-core.xml \
|
|
i386/64bit-mpx.xml \
|
|
i386/64bit-segments.xml \
|
|
i386/64bit-avx.xml \
|
|
i386/64bit-linux.xml \
|
|
i386/64bit-pkeys.xml \
|
|
i386/64bit-sse.xml \
|
|
i386/x32-core.xml \
|
|
riscv/rv32e-xregs.xml \
|
|
riscv/32bit-cpu.xml \
|
|
riscv/32bit-fpu.xml \
|
|
riscv/64bit-cpu.xml \
|
|
riscv/64bit-fpu.xml \
|
|
tic6x-c6xp.xml \
|
|
tic6x-core.xml \
|
|
tic6x-gp.xml
|
|
|
|
FEATURE_CFILES = $(patsubst %.xml,%.c,$(FEATURE_XMLFILES))
|
|
|
|
cfiles: $(TDESC_CFILES) $(FEATURE_CFILES)
|
|
|
|
$(TDESC_CFILES): %.c: %.xml
|
|
$(GDB) -nx -q -batch -ex 'maint print c-tdesc $<' > $@.tmp
|
|
sh ../../move-if-change $@.tmp $@
|
|
|
|
$(FEATURE_CFILES): %.c: %.xml.tmp
|
|
$(GDB) -nx -q -batch \
|
|
-ex 'maint print c-tdesc -single-feature $<' > $@.tmp
|
|
sh ../../move-if-change $@.tmp $@
|
|
rm $<
|
|
|
|
# %.xml is the XML file for each target description feature, and
|
|
# %.xml.tmp is the XML file target description which only includes
|
|
# one target description feature.
|
|
|
|
%.xml.tmp: %.xml
|
|
echo "<?xml version=\"1.0\"?>" > $@.tmp
|
|
echo "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">" >> $@.tmp
|
|
echo "<target>" >> $@.tmp
|
|
echo " <xi:include href=\"$(notdir $<)\"/>" >> $@.tmp
|
|
echo "</target>" >> $@.tmp
|
|
sh ../../move-if-change $@.tmp $@
|
|
|
|
# 'all' doesn't build the C files, so don't delete them in 'clean'
|
|
# either.
|
|
clean-cfiles:
|
|
rm -f $(TDESC_CFILES) $(FEATURE_CFILES)
|
|
|
|
clean:
|
|
rm -f $(OUTPUTS)
|