2004-02-27 Andrew Cagney <cagney@redhat.com>
* hppa-tdep.c (hppa32_push_dummy_call): Fix code reserving inferior stack space - the stack needs to grow upwards. (hppa32_frame_align): New function. (hppa64_frame_align): Replace hppa_frame_align. (hppa_gdbarch_init): Update.
This commit is contained in:
parent
ce11586c0b
commit
1797a8f623
@ -1,3 +1,11 @@
|
|||||||
|
2004-02-27 Andrew Cagney <cagney@redhat.com>
|
||||||
|
|
||||||
|
* hppa-tdep.c (hppa32_push_dummy_call): Fix code reserving
|
||||||
|
inferior stack space - the stack needs to grow upwards.
|
||||||
|
(hppa32_frame_align): New function.
|
||||||
|
(hppa64_frame_align): Replace hppa_frame_align.
|
||||||
|
(hppa_gdbarch_init): Update.
|
||||||
|
|
||||||
2004-02-26 Orjan Friberg <orjanf@axis.com>
|
2004-02-26 Orjan Friberg <orjanf@axis.com>
|
||||||
|
|
||||||
* cris-tdep.c (frame_unwind.h, frame-base.h, trad-frame.h)
|
* cris-tdep.c (frame_unwind.h, frame-base.h, trad-frame.h)
|
||||||
|
@ -2205,8 +2205,8 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
|
|||||||
int write_pass;
|
int write_pass;
|
||||||
for (write_pass = 0; write_pass < 2; write_pass++)
|
for (write_pass = 0; write_pass < 2; write_pass++)
|
||||||
{
|
{
|
||||||
CORE_ADDR struct_ptr = struct_end;
|
CORE_ADDR struct_ptr = 0;
|
||||||
CORE_ADDR param_ptr = param_end;
|
CORE_ADDR param_ptr = 0;
|
||||||
int reg = 27; /* NOTE: Registers go down. */
|
int reg = 27; /* NOTE: Registers go down. */
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < nargs; i++)
|
for (i = 0; i < nargs; i++)
|
||||||
@ -2223,11 +2223,11 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
|
|||||||
/* Large parameter, pass by reference. Store the value
|
/* Large parameter, pass by reference. Store the value
|
||||||
in "struct" area and then pass its address. */
|
in "struct" area and then pass its address. */
|
||||||
param_len = 4;
|
param_len = 4;
|
||||||
struct_ptr -= align_up (TYPE_LENGTH (type), 8);
|
struct_ptr += align_up (TYPE_LENGTH (type), 8);
|
||||||
if (write_pass)
|
if (write_pass)
|
||||||
write_memory (struct_ptr, VALUE_CONTENTS (arg),
|
write_memory (struct_end - struct_ptr, VALUE_CONTENTS (arg),
|
||||||
TYPE_LENGTH (type));
|
TYPE_LENGTH (type));
|
||||||
store_unsigned_integer (param_val, 4, struct_ptr);
|
store_unsigned_integer (param_val, 4, struct_end - struct_ptr);
|
||||||
}
|
}
|
||||||
else if (TYPE_CODE (type) == TYPE_CODE_INT
|
else if (TYPE_CODE (type) == TYPE_CODE_INT
|
||||||
|| TYPE_CODE (type) == TYPE_CODE_ENUM)
|
|| TYPE_CODE (type) == TYPE_CODE_ENUM)
|
||||||
@ -2246,11 +2246,11 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
|
|||||||
memcpy (param_val + param_len - TYPE_LENGTH (type),
|
memcpy (param_val + param_len - TYPE_LENGTH (type),
|
||||||
VALUE_CONTENTS (arg), TYPE_LENGTH (type));
|
VALUE_CONTENTS (arg), TYPE_LENGTH (type));
|
||||||
}
|
}
|
||||||
param_ptr -= param_len;
|
param_ptr += param_len;
|
||||||
reg -= param_len / 4;
|
reg -= param_len / 4;
|
||||||
if (write_pass)
|
if (write_pass)
|
||||||
{
|
{
|
||||||
write_memory (param_ptr, param_val, param_len);
|
write_memory (param_end - param_ptr, param_val, param_len);
|
||||||
if (reg >= 23)
|
if (reg >= 23)
|
||||||
{
|
{
|
||||||
regcache_cooked_write (regcache, reg, param_val);
|
regcache_cooked_write (regcache, reg, param_val);
|
||||||
@ -2412,10 +2412,18 @@ hppa64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CORE_ADDR
|
||||||
|
hppa32_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
|
||||||
|
{
|
||||||
|
/* HP frames are 64-byte (or cache line) aligned (yes that's _byte_
|
||||||
|
and not _bit_)! */
|
||||||
|
return align_up (addr, 64);
|
||||||
|
}
|
||||||
|
|
||||||
/* Force all frames to 16-byte alignment. Better safe than sorry. */
|
/* Force all frames to 16-byte alignment. Better safe than sorry. */
|
||||||
|
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
hppa_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
|
hppa64_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
|
||||||
{
|
{
|
||||||
/* Just always 16-byte align. */
|
/* Just always 16-byte align. */
|
||||||
return align_up (addr, 16);
|
return align_up (addr, 16);
|
||||||
@ -5838,14 +5846,15 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||||||
/* Inferior function call methods. */
|
/* Inferior function call methods. */
|
||||||
if (0)
|
if (0)
|
||||||
{
|
{
|
||||||
set_gdbarch_frame_align (gdbarch, hppa_frame_align);
|
|
||||||
switch (tdep->bytes_per_address)
|
switch (tdep->bytes_per_address)
|
||||||
{
|
{
|
||||||
case 4:
|
case 4:
|
||||||
set_gdbarch_push_dummy_call (gdbarch, hppa32_push_dummy_call);
|
set_gdbarch_push_dummy_call (gdbarch, hppa32_push_dummy_call);
|
||||||
|
set_gdbarch_frame_align (gdbarch, hppa32_frame_align);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
set_gdbarch_push_dummy_call (gdbarch, hppa64_push_dummy_call);
|
set_gdbarch_push_dummy_call (gdbarch, hppa64_push_dummy_call);
|
||||||
|
set_gdbarch_frame_align (gdbarch, hppa64_frame_align);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user