Add initial compile command support to RISC-V port.

This adds initial compile command support to the RISC-V port.  This fixes
about 228 testsuite failures on a riscv64-linux machine.  We need to get
the triplet right which is normally riscv64 or riscv32 instead of the
default riscv.  Also, we need to get the compiler options right, since we
don't accept the default -m64 and -mcmodel=large options, so we need to
construct -march and -mabi options which are correct for the target.  We
currently don't have info about all extensions used by the target, so this
may need to be adjusted later.  For now, I'm assuming that we have all
extensions required by the linux platform spec.

	gdb/
	* riscv-tdep.c (riscv_gcc_target_options): New.
	(riscv_gnu_triplet_regexp): New.
	(riscv_gdbarch_init): Call set_gdbarch_gcc_triplet_options and
	set_gdbarch_gnu_triplet_regexp.

Change-Id: I315ce8de7789ddf7bdd3b532f917519464941294
This commit is contained in:
Jim Wilson 2019-10-16 10:58:37 -07:00
parent fec4e896d6
commit ff371ec999
2 changed files with 63 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2019-10-16 Jim Wilson <jimw@sifive.com>
* riscv-tdep.c (riscv_gcc_target_options): New.
(riscv_gnu_triplet_regexp): New.
(riscv_gdbarch_init): Call set_gdbarch_gcc_triplet_options and
set_gdbarch_gnu_triplet_regexp.
2019-10-16 Christian Biesinger <cbiesinger@google.com>
* Makefile.in: Add xml-builtin.h.

View File

@ -3055,6 +3055,58 @@ riscv_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
return -1;
}
/* Implement the gcc_target_options method. We have to select the arch and abi
from the feature info. We have enough feature info to select the abi, but
not enough info for the arch given all of the possible architecture
extensions. So choose reasonable defaults for now. */
static std::string
riscv_gcc_target_options (struct gdbarch *gdbarch)
{
int isa_xlen = riscv_isa_xlen (gdbarch);
int isa_flen = riscv_isa_flen (gdbarch);
int abi_xlen = riscv_abi_xlen (gdbarch);
int abi_flen = riscv_abi_flen (gdbarch);
std::string target_options;
target_options = "-march=rv";
if (isa_xlen == 8)
target_options += "64";
else
target_options += "32";
if (isa_flen == 8)
target_options += "gc";
else if (isa_flen == 4)
target_options += "imafc";
else
target_options += "imac";
target_options += " -mabi=";
if (abi_xlen == 8)
target_options += "lp64";
else
target_options += "ilp32";
if (abi_flen == 8)
target_options += "d";
else if (abi_flen == 4)
target_options += "f";
/* The gdb loader doesn't handle link-time relaxation relocations. */
target_options += " -mno-relax";
return target_options;
}
/* Implement the gnu_triplet_regexp method. A single compiler supports both
32-bit and 64-bit code, and may be named riscv32 or riscv64 or (not
recommended) riscv. */
static const char *
riscv_gnu_triplet_regexp (struct gdbarch *gdbarch)
{
return "riscv(32|64)?";
}
/* Initialize the current architecture based on INFO. If possible,
re-use an architecture from ARCHES, which is a list of
architectures already created during this debugging session.
@ -3299,6 +3351,10 @@ riscv_gdbarch_init (struct gdbarch_info info,
riscv_setup_register_aliases (gdbarch, &riscv_freg_feature);
riscv_setup_register_aliases (gdbarch, &riscv_csr_feature);
/* Compile command hooks. */
set_gdbarch_gcc_target_options (gdbarch, riscv_gcc_target_options);
set_gdbarch_gnu_triplet_regexp (gdbarch, riscv_gnu_triplet_regexp);
/* Hook in OS ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);