2004-03-07 Andrew Cagney <cagney@redhat.com>

* hppa-tdep.c: Replace DEPRECATED_FP_REGNUM with HPPA_FP_REGNUM,
	FP0_REGNUM with HPPA_FP0_REGNUM, and SP_REGNUM with
	HPPA_SP_REGNUM.
	(hppa_register_raw_size, hppa_register_byte, hppa_read_fp)
	(hppa_target_read_fp): Delete.
	(hppa_gdbarch_init): Do not set deprecated register_raw_size,
	register_virtual_size, max_register_raw_size,
	max_register_virtual_size, register_byte, register_size,
	target_read_fp, fp_regnum, and register_bytes.  Set register_type
	instead of register_virtual_type.
	(hppa32_register_type, hppa64_register_type): Replace
	hppa32_register_virtual_type and hppa64_register_virtual_type.
	* config/pa/tm-hppa.h (HPPA_FP0_REGNUM, HPPA_SP_REGNUM)
	(HPPA_FP_REGNUM): Define.
This commit is contained in:
Andrew Cagney 2004-03-07 19:58:27 +00:00
parent f5f907e2a9
commit eded0a3148
3 changed files with 42 additions and 86 deletions

View file

@ -1,5 +1,20 @@
2004-03-07 Andrew Cagney <cagney@redhat.com> 2004-03-07 Andrew Cagney <cagney@redhat.com>
* hppa-tdep.c: Replace DEPRECATED_FP_REGNUM with HPPA_FP_REGNUM,
FP0_REGNUM with HPPA_FP0_REGNUM, and SP_REGNUM with
HPPA_SP_REGNUM.
(hppa_register_raw_size, hppa_register_byte, hppa_read_fp)
(hppa_target_read_fp): Delete.
(hppa_gdbarch_init): Do not set deprecated register_raw_size,
register_virtual_size, max_register_raw_size,
max_register_virtual_size, register_byte, register_size,
target_read_fp, fp_regnum, and register_bytes. Set register_type
instead of register_virtual_type.
(hppa32_register_type, hppa64_register_type): Replace
hppa32_register_virtual_type and hppa64_register_virtual_type.
* config/pa/tm-hppa.h (HPPA_FP0_REGNUM, HPPA_SP_REGNUM)
(HPPA_FP_REGNUM): Define.
* hppa-tdep.c (hppa_gdbarch_init): Add missing "break". * hppa-tdep.c (hppa_gdbarch_init): Add missing "break".
* config/pa/tm-hppa.h (DEPRECATED_DO_REGISTERS_INFO) * config/pa/tm-hppa.h (DEPRECATED_DO_REGISTERS_INFO)

View file

@ -59,6 +59,8 @@ extern int hppa_pc_requires_run_before_use (CORE_ADDR pc);
other r registers. */ other r registers. */
#define FLAGS_REGNUM 0 /* Various status flags */ #define FLAGS_REGNUM 0 /* Various status flags */
#define RP_REGNUM 2 /* return pointer */ #define RP_REGNUM 2 /* return pointer */
#define HPPA_FP_REGNUM 3 /* The ABI's frame pointer, when used */
#define HPPA_SP_REGNUM 30 /* Stack pointer. */
#define SAR_REGNUM 32 /* Shift Amount Register */ #define SAR_REGNUM 32 /* Shift Amount Register */
#define IPSW_REGNUM 41 /* Interrupt Processor Status Word */ #define IPSW_REGNUM 41 /* Interrupt Processor Status Word */
#define PCOQ_HEAD_REGNUM 33 /* instruction offset queue head */ #define PCOQ_HEAD_REGNUM 33 /* instruction offset queue head */
@ -73,6 +75,7 @@ extern int hppa_pc_requires_run_before_use (CORE_ADDR pc);
#define CCR_REGNUM 54 /* Coprocessor Configuration Register */ #define CCR_REGNUM 54 /* Coprocessor Configuration Register */
#define TR0_REGNUM 57 /* Temporary Registers (cr24 -> cr31) */ #define TR0_REGNUM 57 /* Temporary Registers (cr24 -> cr31) */
#define CR27_REGNUM 60 /* Base register for thread-local storage, cr27 */ #define CR27_REGNUM 60 /* Base register for thread-local storage, cr27 */
#define HPPA_FP0_REGNUM 64 /* First floating-point. */
#define FP4_REGNUM 72 #define FP4_REGNUM 72
#define ARG0_REGNUM 26 /* The first argument of a callee. */ #define ARG0_REGNUM 26 /* The first argument of a callee. */

View file

@ -147,15 +147,10 @@ int hppa_in_solib_return_trampoline (CORE_ADDR pc, char *name);
int hppa_inner_than (CORE_ADDR lhs, CORE_ADDR rhs); int hppa_inner_than (CORE_ADDR lhs, CORE_ADDR rhs);
int hppa_pc_requires_run_before_use (CORE_ADDR pc); int hppa_pc_requires_run_before_use (CORE_ADDR pc);
int hppa_instruction_nullified (void); int hppa_instruction_nullified (void);
int hppa_register_raw_size (int reg_nr);
int hppa_register_byte (int reg_nr);
struct type * hppa32_register_virtual_type (int reg_nr);
struct type * hppa64_register_virtual_type (int reg_nr);
int hppa_cannot_store_register (int regnum); int hppa_cannot_store_register (int regnum);
CORE_ADDR hppa_smash_text_address (CORE_ADDR addr); CORE_ADDR hppa_smash_text_address (CORE_ADDR addr);
CORE_ADDR hppa_target_read_pc (ptid_t ptid); CORE_ADDR hppa_target_read_pc (ptid_t ptid);
void hppa_target_write_pc (CORE_ADDR v, ptid_t ptid); void hppa_target_write_pc (CORE_ADDR v, ptid_t ptid);
CORE_ADDR hppa_target_read_fp (void);
typedef struct typedef struct
{ {
@ -1155,31 +1150,6 @@ cover_find_stub_with_shl_get (void *args_untyped)
return 0; return 0;
} }
/* If the pid is in a syscall, then the FP register is not readable.
We'll return zero in that case, rather than attempting to read it
and cause a warning. */
CORE_ADDR
hppa_read_fp (int pid)
{
int flags = read_register (FLAGS_REGNUM);
if (flags & 2)
{
return (CORE_ADDR) 0;
}
/* This is the only site that may directly read_register () the FP
register. All others must use deprecated_read_fp (). */
return read_register (DEPRECATED_FP_REGNUM);
}
CORE_ADDR
hppa_target_read_fp (void)
{
return hppa_read_fp (PIDGET (inferior_ptid));
}
/* Get the PC from %r31 if currently in a syscall. Also mask out privilege /* Get the PC from %r31 if currently in a syscall. Also mask out privilege
bits. */ bits. */
@ -1725,7 +1695,7 @@ hppa_skip_trampoline_code (CORE_ADDR pc)
rp from sp - 8. */ rp from sp - 8. */
if (prev_inst == 0x4bc23ff1) if (prev_inst == 0x4bc23ff1)
return (read_memory_integer return (read_memory_integer
(read_register (SP_REGNUM) - 8, 4)) & ~0x3; (read_register (HPPA_SP_REGNUM) - 8, 4)) & ~0x3;
else else
{ {
warning ("Unable to find restore of %%rp before bv (%%rp)."); warning ("Unable to find restore of %%rp before bv (%%rp).");
@ -1739,7 +1709,7 @@ hppa_skip_trampoline_code (CORE_ADDR pc)
else if ((curr_inst & 0xffe0f000) == 0xe840d000) else if ((curr_inst & 0xffe0f000) == 0xe840d000)
{ {
return (read_memory_integer return (read_memory_integer
(read_register (SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3; (read_register (HPPA_SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3;
} }
/* What about be,n 0(sr0,%rp)? It's just another way we return to /* What about be,n 0(sr0,%rp)? It's just another way we return to
@ -1751,7 +1721,7 @@ hppa_skip_trampoline_code (CORE_ADDR pc)
I guess we could check for the previous instruction being I guess we could check for the previous instruction being
mtsp %r1,%sr0 if we want to do sanity checking. */ mtsp %r1,%sr0 if we want to do sanity checking. */
return (read_memory_integer return (read_memory_integer
(read_register (SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3; (read_register (HPPA_SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3;
} }
/* Haven't found the branch yet, but we're still in the stub. /* Haven't found the branch yet, but we're still in the stub.
@ -1938,7 +1908,7 @@ restart:
for (i = 3; i < u->Entry_GR + 3; i++) for (i = 3; i < u->Entry_GR + 3; i++)
{ {
/* Frame pointer gets saved into a special location. */ /* Frame pointer gets saved into a special location. */
if (u->Save_SP && i == DEPRECATED_FP_REGNUM) if (u->Save_SP && i == HPPA_FP_REGNUM)
continue; continue;
save_gr |= (1 << i); save_gr |= (1 << i);
@ -2232,7 +2202,7 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
for (i = 3; i < u->Entry_GR + 3; i++) for (i = 3; i < u->Entry_GR + 3; i++)
{ {
/* Frame pointer gets saved into a special location. */ /* Frame pointer gets saved into a special location. */
if (u->Save_SP && i == DEPRECATED_FP_REGNUM) if (u->Save_SP && i == HPPA_FP_REGNUM)
continue; continue;
saved_gr_mask |= (1 << i); saved_gr_mask |= (1 << i);
@ -2302,13 +2272,13 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
|| (inst & 0xffffc00c) == 0x73c10008) /* std,ma r1,N(sr0,sp) */ || (inst & 0xffffc00c) == 0x73c10008) /* std,ma r1,N(sr0,sp) */
{ {
looking_for_sp = 0; looking_for_sp = 0;
cache->saved_regs[DEPRECATED_FP_REGNUM].addr = 0; cache->saved_regs[HPPA_FP_REGNUM].addr = 0;
} }
/* Account for general and floating-point register saves. */ /* Account for general and floating-point register saves. */
reg = inst_saves_gr (inst); reg = inst_saves_gr (inst);
if (reg >= 3 && reg <= 18 if (reg >= 3 && reg <= 18
&& (!u->Save_SP || reg != DEPRECATED_FP_REGNUM)) && (!u->Save_SP || reg != HPPA_FP_REGNUM))
{ {
saved_gr_mask &= ~(1 << reg); saved_gr_mask &= ~(1 << reg);
if ((inst >> 26) == 0x1b && extract_14 (inst) >= 0) if ((inst >> 26) == 0x1b && extract_14 (inst) >= 0)
@ -2368,7 +2338,7 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
} }
else else
{ {
cache->saved_regs[reg + FP0_REGNUM + 4].addr = fp_loc; cache->saved_regs[reg + HPPA_FP0_REGNUM + 4].addr = fp_loc;
fp_loc += 8; fp_loc += 8;
} }
} }
@ -2387,10 +2357,10 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
/* The frame base always represents the value of %sp at entry to /* The frame base always represents the value of %sp at entry to
the current function (and is thus equivalent to the "saved" the current function (and is thus equivalent to the "saved"
stack pointer. */ stack pointer. */
CORE_ADDR this_sp = frame_unwind_register_unsigned (next_frame, SP_REGNUM); CORE_ADDR this_sp = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
/* FIXME: cagney/2004-02-22: This assumes that the frame has been /* FIXME: cagney/2004-02-22: This assumes that the frame has been
created. If it hasn't everything will be out-of-wack. */ created. If it hasn't everything will be out-of-wack. */
if (u->Save_SP && trad_frame_addr_p (cache->saved_regs, SP_REGNUM)) if (u->Save_SP && trad_frame_addr_p (cache->saved_regs, HPPA_SP_REGNUM))
/* Both we're expecting the SP to be saved and the SP has been /* Both we're expecting the SP to be saved and the SP has been
saved. The entry SP value is saved at this frame's SP saved. The entry SP value is saved at this frame's SP
address. */ address. */
@ -2399,7 +2369,7 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
/* The prologue has been slowly allocating stack space. Adjust /* The prologue has been slowly allocating stack space. Adjust
the SP back. */ the SP back. */
cache->base = this_sp - frame_size; cache->base = this_sp - frame_size;
trad_frame_set_value (cache->saved_regs, SP_REGNUM, cache->base); trad_frame_set_value (cache->saved_regs, HPPA_SP_REGNUM, cache->base);
} }
/* The PC is found in the "return register", "Millicode" uses "r31" /* The PC is found in the "return register", "Millicode" uses "r31"
@ -2509,7 +2479,7 @@ static struct frame_id
hppa_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame) hppa_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
{ {
return frame_id_build (frame_unwind_register_unsigned (next_frame, return frame_id_build (frame_unwind_register_unsigned (next_frame,
SP_REGNUM), HPPA_SP_REGNUM),
frame_pc_unwind (next_frame)); frame_pc_unwind (next_frame));
} }
@ -3125,46 +3095,28 @@ hppa_instruction_nullified (void)
return ((ipsw & 0x00200000) && !(flags & 0x2)); return ((ipsw & 0x00200000) && !(flags & 0x2));
} }
int
hppa_register_raw_size (int reg_nr)
{
/* All registers have the same size. */
return DEPRECATED_REGISTER_SIZE;
}
/* Index within the register vector of the first byte of the space i
used for register REG_NR. */
int
hppa_register_byte (int reg_nr)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
return reg_nr * tdep->bytes_per_address;
}
/* Return the GDB type object for the "standard" data type of data /* Return the GDB type object for the "standard" data type of data
in register N. */ in register N. */
struct type * static struct type *
hppa32_register_virtual_type (int reg_nr) hppa32_register_type (struct gdbarch *gdbarch, int reg_nr)
{ {
if (reg_nr < FP4_REGNUM) if (reg_nr < FP4_REGNUM)
return builtin_type_int; return builtin_type_uint32;
else else
return builtin_type_float; return builtin_type_ieee_single_big;
} }
/* Return the GDB type object for the "standard" data type of data /* Return the GDB type object for the "standard" data type of data
in register N. hppa64 version. */ in register N. hppa64 version. */
struct type * static struct type *
hppa64_register_virtual_type (int reg_nr) hppa64_register_type (struct gdbarch *gdbarch, int reg_nr)
{ {
if (reg_nr < FP4_REGNUM) if (reg_nr < FP4_REGNUM)
return builtin_type_unsigned_long_long; return builtin_type_uint64;
else else
return builtin_type_double; return builtin_type_ieee_double_big;
} }
/* Return True if REGNUM is not a register available to the user /* Return True if REGNUM is not a register available to the user
@ -3277,24 +3229,18 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
case 4: case 4:
set_gdbarch_num_regs (gdbarch, hppa32_num_regs); set_gdbarch_num_regs (gdbarch, hppa32_num_regs);
set_gdbarch_register_name (gdbarch, hppa32_register_name); set_gdbarch_register_name (gdbarch, hppa32_register_name);
set_gdbarch_deprecated_register_virtual_type set_gdbarch_register_type (gdbarch, hppa32_register_type);
(gdbarch, hppa32_register_virtual_type);
break; break;
case 8: case 8:
set_gdbarch_num_regs (gdbarch, hppa64_num_regs); set_gdbarch_num_regs (gdbarch, hppa64_num_regs);
set_gdbarch_register_name (gdbarch, hppa64_register_name); set_gdbarch_register_name (gdbarch, hppa64_register_name);
set_gdbarch_deprecated_register_virtual_type set_gdbarch_register_type (gdbarch, hppa64_register_type);
(gdbarch, hppa64_register_virtual_type);
break; break;
default: default:
internal_error (__FILE__, __LINE__, "Unsupported address size: %d", internal_error (__FILE__, __LINE__, "Unsupported address size: %d",
tdep->bytes_per_address); tdep->bytes_per_address);
} }
/* The following gdbarch vector elements depend on other parts of this
vector which have been set above, depending on the ABI. */
set_gdbarch_deprecated_register_bytes
(gdbarch, gdbarch_num_regs (gdbarch) * tdep->bytes_per_address);
set_gdbarch_long_bit (gdbarch, tdep->bytes_per_address * TARGET_CHAR_BIT); set_gdbarch_long_bit (gdbarch, tdep->bytes_per_address * TARGET_CHAR_BIT);
set_gdbarch_ptr_bit (gdbarch, tdep->bytes_per_address * TARGET_CHAR_BIT); set_gdbarch_ptr_bit (gdbarch, tdep->bytes_per_address * TARGET_CHAR_BIT);
@ -3312,22 +3258,14 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_in_solib_return_trampoline (gdbarch, set_gdbarch_in_solib_return_trampoline (gdbarch,
hppa_in_solib_return_trampoline); hppa_in_solib_return_trampoline);
set_gdbarch_inner_than (gdbarch, hppa_inner_than); set_gdbarch_inner_than (gdbarch, hppa_inner_than);
set_gdbarch_deprecated_register_size (gdbarch, tdep->bytes_per_address); set_gdbarch_sp_regnum (gdbarch, HPPA_SP_REGNUM);
set_gdbarch_deprecated_fp_regnum (gdbarch, 3); set_gdbarch_fp0_regnum (gdbarch, HPPA_FP0_REGNUM);
set_gdbarch_sp_regnum (gdbarch, 30);
set_gdbarch_fp0_regnum (gdbarch, 64);
set_gdbarch_deprecated_register_raw_size (gdbarch, hppa_register_raw_size);
set_gdbarch_deprecated_register_byte (gdbarch, hppa_register_byte);
set_gdbarch_deprecated_register_virtual_size (gdbarch, hppa_register_raw_size);
set_gdbarch_deprecated_max_register_raw_size (gdbarch, tdep->bytes_per_address);
set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 8);
set_gdbarch_cannot_store_register (gdbarch, hppa_cannot_store_register); set_gdbarch_cannot_store_register (gdbarch, hppa_cannot_store_register);
set_gdbarch_addr_bits_remove (gdbarch, hppa_smash_text_address); set_gdbarch_addr_bits_remove (gdbarch, hppa_smash_text_address);
set_gdbarch_smash_text_address (gdbarch, hppa_smash_text_address); set_gdbarch_smash_text_address (gdbarch, hppa_smash_text_address);
set_gdbarch_believe_pcc_promotion (gdbarch, 1); set_gdbarch_believe_pcc_promotion (gdbarch, 1);
set_gdbarch_read_pc (gdbarch, hppa_target_read_pc); set_gdbarch_read_pc (gdbarch, hppa_target_read_pc);
set_gdbarch_write_pc (gdbarch, hppa_target_write_pc); set_gdbarch_write_pc (gdbarch, hppa_target_write_pc);
set_gdbarch_deprecated_target_read_fp (gdbarch, hppa_target_read_fp);
/* Helper for function argument information. */ /* Helper for function argument information. */
set_gdbarch_fetch_pointer_argument (gdbarch, hppa_fetch_pointer_argument); set_gdbarch_fetch_pointer_argument (gdbarch, hppa_fetch_pointer_argument);