diff options
author | Daniel Jacobowitz <dan@debian.org> | 2007-10-15 19:45:31 +0000 |
---|---|---|
committer | Daniel Jacobowitz <dan@debian.org> | 2007-10-15 19:45:31 +0000 |
commit | f0b15d92f8c3b56749b1365fc05b6151bcb17aee (patch) | |
tree | 20aae73acc8d0d961edb92c748ff6c8c99f2ec62 /gdb/target-descriptions.c | |
parent | dd3b42c15a0f556bde9ce5fb5a887dc92bd50a59 (diff) | |
download | gdb-f0b15d92f8c3b56749b1365fc05b6151bcb17aee.tar.gz |
* NEWS: Document target described register support for PowerPC.
* ppc-tdep.h: Remove ppc_spr constants.
(struct gdbarch_tdep): Remove regs, ppc_sr0_regnum, and
ppc_builtin_type_vec128 members.
(PPC_R0_REGNUM, PPC_F0_REGNUM, PPC_PC_REGNUM, PPC_MSR_REGNUM)
(PPC_CR_REGNUM, PPC_LR_REGNUM, PPC_CTR_REGNUM, PPC_XER_REGNUM)
(PPC_FPSCR_REGNUM, PPC_MQ_REGNUM, PPC_SPE_UPPER_GP0_REGNUM)
(PPC_SPE_ACC_REGNUM, PPC_SPE_FSCR_REGNUM, PPC_VR0_REGNUM)
(PPC_VSCR_REGNUM, PPC_VRSAVE_REGNUM, PPC_NUM_REGS): New constants.
* rs6000-tdep.c: Include preparsed descriptions.
(init_sim_regno_table): Do not iterate over pseudo registers.
Look up segment registers by name. Use sim_spr_register_name
for SPRs.
(rs6000_register_sim_regno): Call init_sim_regno_table here.
(rs6000_builtin_type_vec128): Delete.
(rs6000_register_name): Only handle SPE pseudo registers and upper
halves. Call tdesc_register_name for everything else.
(rs6000_register_type): Delete. Replace with...
(rs6000_pseudo_register_type): ...this new function. Only handle
SPE pseudo registers.
(rs6000_register_reggroup_p): Delete. Replace with...
(rs6000_pseudo_register_reggroup_p): ...this new function. Only
handle SPE pseudo registers.
(rs6000_convert_register_p): Use ppc_fp0_regnum instead of
"struct reg".
(rs6000_register_to_value, rs6000_value_to_register): Remove check
of reg->fpr.
(e500_register_reggroup_p): Delete.
(STR, R, R4, R8, R16, F, P8, R32, R64, R0, A4, S, S4, SN4, S64)
(COMMON_UISA_REGS, PPC_UISA_SPRS, PPC_UISA_NOFP_SPRS)
(PPC_SEGMENT_REGS, PPC_OEA_SPRS, PPC_ALTIVEC_REGS, PPC_SPE_GP_REGS)
(PPC_SPE_UPPER_GP_REGS, PPC_EV_PSEUDO_REGS): Delete macros.
(registers_powerpc, registers_403, registers_403GC, registers_505)
(registers_860, registers_601, registers_602, registers_603)
(registers_604, registers_750, registers_7400, registers_e500): Delete
variables.
(struct variant): Delete nregs, npregs, num_tot_regs, and regs. Add
tdesc.
(tot_num_registers, num_registers, num_pseudo_registers): Delete.
(variants): Delete outdated comment. Use standard target descriptions
instead of "struct reg" arrays.
(init_variants): Delete.
(rs6000_gdbarch_init): Do not guess word size from the BFD
architecture if we have a target description. Select a variant
before creating a new architecture. Use the variant's target
description if the target did not define a register layout.
Validate target-supplied registers. Reject mismatches. Use
fixed register numbers and new constants instead of magic
numbers. Call set_gdbarch_ps_regnum. Call tdesc_use_registers.
(_initialize_rs6000_tdep): Initialize the preparsed target
descriptions.
* target-descriptions.c (tdesc_predefined_types): Add int128 and
uint128.
(tdesc_find_register_early): New function.
(tdesc_numbered_register): Use it.
(tdesc_register_size): New function.
(tdesc_use_registers): Take a target_desc argument. Do not use
gdbarch_target_desc.
* target-descriptions.h (tdesc_use_registers): Update prototype
and comment.
(tdesc_register_size): New prototype.
* Makefile.in (powerpc_32_c, powerpc_403_c, powerpc_403gc_c)
(powerpc_505_c, powerpc_601_c, powerpc_602_c, powerpc_603_c)
(powerpc_604_c, powerpc_64_c, powerpc_7400_c, powerpc_750_c)
(powerpc_860_c, powerpc_e500_c, rs6000_c): New macros.
(rs6000-tdep.o): Update.
* arm-tdep.c (arm_gdbarch_init): Update call to tdesc_use_registers.
* m68k-tdep.c (m68k_gdbarch_init): Likewise.
* mips-tdep.c (mips_gdbarch_init): Likewise.
* gdb.texinfo (Predefined Target Types): Add int128
and uint128.
(Standard Target Features): Add PowerPC features.
* gdb.xml/tdesc-regs.exp: Add PowerPC support.
* sim-ppc.h (sim_spr_register_name): New prototype.
* gdb-sim.c (regnum2spr): Rename to...
(sim_spr_register_name): ... this. Make global.
Diffstat (limited to 'gdb/target-descriptions.c')
-rw-r--r-- | gdb/target-descriptions.c | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index 2f1b82e4c55..bb5b8ab5f42 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -352,10 +352,12 @@ static struct { "int16", &builtin_type_int16 }, { "int32", &builtin_type_int32 }, { "int64", &builtin_type_int64 }, + { "int128", &builtin_type_int128 }, { "uint8", &builtin_type_uint8 }, { "uint16", &builtin_type_uint16 }, { "uint32", &builtin_type_uint32 }, { "uint64", &builtin_type_uint64 }, + { "uint128", &builtin_type_uint128 }, { "ieee_single", &builtin_type_ieee_single }, { "ieee_double", &builtin_type_ieee_double }, { "arm_fpa_ext", &builtin_type_arm_ext } @@ -421,10 +423,9 @@ tdesc_data_cleanup (void *data_untyped) /* Search FEATURE for a register named NAME. */ -int -tdesc_numbered_register (const struct tdesc_feature *feature, - struct tdesc_arch_data *data, - int regno, const char *name) +static struct tdesc_reg * +tdesc_find_register_early (const struct tdesc_feature *feature, + const char *name) { int ixr; struct tdesc_reg *reg; @@ -433,18 +434,32 @@ tdesc_numbered_register (const struct tdesc_feature *feature, VEC_iterate (tdesc_reg_p, feature->registers, ixr, reg); ixr++) if (strcasecmp (reg->name, name) == 0) - { - /* Make sure the vector includes a REGNO'th element. */ - while (regno >= VEC_length (tdesc_reg_p, data->registers)) - VEC_safe_push (tdesc_reg_p, data->registers, NULL); - VEC_replace (tdesc_reg_p, data->registers, regno, reg); - return 1; - } + return reg; - return 0; + return NULL; } -/* Search FEATURE for a register whose name is in NAMES. */ +/* Search FEATURE for a register named NAME. Assign REGNO to it. */ + +int +tdesc_numbered_register (const struct tdesc_feature *feature, + struct tdesc_arch_data *data, + int regno, const char *name) +{ + struct tdesc_reg *reg = tdesc_find_register_early (feature, name); + + if (reg == NULL) + return 0; + + /* Make sure the vector includes a REGNO'th element. */ + while (regno >= VEC_length (tdesc_reg_p, data->registers)) + VEC_safe_push (tdesc_reg_p, data->registers, NULL); + VEC_replace (tdesc_reg_p, data->registers, regno, reg); + return 1; +} + +/* Search FEATURE for a register whose name is in NAMES and assign + REGNO to it. */ int tdesc_numbered_register_choices (const struct tdesc_feature *feature, @@ -460,6 +475,19 @@ tdesc_numbered_register_choices (const struct tdesc_feature *feature, return 0; } +/* Search FEATURE for a register named NAME, and return its size in + bits. The register must exist. */ + +int +tdesc_register_size (const struct tdesc_feature *feature, + const char *name) +{ + struct tdesc_reg *reg = tdesc_find_register_early (feature, name); + + gdb_assert (reg != NULL); + return reg->bitsize; +} + /* Look up a register by its GDB internal register number. */ static struct tdesc_reg * @@ -682,18 +710,16 @@ set_tdesc_pseudo_register_reggroup_p void tdesc_use_registers (struct gdbarch *gdbarch, + const struct target_desc *target_desc, struct tdesc_arch_data *early_data) { int num_regs = gdbarch_num_regs (gdbarch); int i, ixf, ixr; - const struct target_desc *target_desc; struct tdesc_feature *feature; struct tdesc_reg *reg; struct tdesc_arch_data *data; htab_t reg_hash; - target_desc = gdbarch_target_desc (gdbarch); - /* We can't use the description for registers if it doesn't describe any. This function should only be called after validating registers, so the caller should know that registers are |