* Fix two bugs found by deja-gnu. One is the incorrect reporting

of the PC being in a stack dummy when looking at a core file
	without symbols.  The other is the incorrect passing of char
	arguments during expression evaluation (ie: p foo('a','b') would
	mess up the passing of it's args because it wasn't coercing the
	char's to ints).
	* hppah-tdep.c:  Rename global functions to have consistent hppa_
	prefix.  Make more functions static.  Drop hp_ prefix from static
	functions.  (hppa_push_arguments):  Call value_arg_coerce to cast
	char to int args if necessary.  (hppa_fix_call_dummy):  Create
	this routine from FIX_CALL_DUMMY macro in tm-hppa.h.
	* inferior.h (PC_IN_CALL_DUMMY):  Check for frame_address being
	valid (ie: != 0) before doing comparison against PC.
	* valops.c (call_function_by_hand):  Adjust call to FIX_CALL_DUMMY
	to reflect new arguments.
	* config/pa/tm-hppa.h (POP_FRAME, PUSH_ARGUMENTS):  Use new hppa_
	prefix for func	name.  (FIX_CALL_DUMMY):  Move code into
	hppah-tdep.c.

	* testsuite/gdb.t16/gdbme.c, testsuite/gdb.t17/gdbme.c:  Add calls
	to malloc() so that we can test GDB eval of dynamically created
	arrays (like char strings in `print "foo"').
This commit is contained in:
Stu Grossman 1993-04-23 18:01:02 +00:00
parent c156f3c1c9
commit b5728692b4
3 changed files with 98 additions and 12 deletions

View File

@ -1,3 +1,28 @@
Fri Apr 23 10:34:02 1993 Stu Grossman (grossman@cygnus.com)
* Fix two bugs found by deja-gnu. One is the incorrect reporting
of the PC being in a stack dummy when looking at a core file
without symbols. The other is the incorrect passing of char
arguments during expression evaluation (ie: p foo('a','b') would
mess up the passing of it's args because it wasn't coercing the
char's to ints).
* hppah-tdep.c: Rename global functions to have consistent hppa_
prefix. Make more functions static. Drop hp_ prefix from static
functions. (hppa_push_arguments): Call value_arg_coerce to cast
char to int args if necessary. (hppa_fix_call_dummy): Create
this routine from FIX_CALL_DUMMY macro in tm-hppa.h.
* inferior.h (PC_IN_CALL_DUMMY): Check for frame_address being
valid (ie: != 0) before doing comparison against PC.
* valops.c (call_function_by_hand): Adjust call to FIX_CALL_DUMMY
to reflect new arguments.
* config/pa/tm-hppa.h (POP_FRAME, PUSH_ARGUMENTS): Use new hppa_
prefix for func name. (FIX_CALL_DUMMY): Move code into
hppah-tdep.c.
* testsuite/gdb.t16/gdbme.c, testsuite/gdb.t17/gdbme.c: Add calls
to malloc() so that we can test GDB eval of dynamically created
arrays (like char strings in `print "foo"').
Fri Apr 23 01:28:14 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* printcmd.c (print_address_symbolic): Search symtabs as well as the

View File

@ -59,6 +59,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "symfile.h"
#include "objfiles.h"
static int restore_pc_queue PARAMS ((struct frame_saved_regs *fsr));
static int hppa_alignof PARAMS ((struct type *arg));
/* Routines to extract various sized constants out of hppa
instructions. */
@ -534,7 +537,7 @@ find_dummy_frame_regs (frame, frame_saved_regs)
}
int
hp_pop_frame ()
hppa_pop_frame ()
{
register FRAME frame = get_current_frame ();
register CORE_ADDR fp;
@ -548,7 +551,7 @@ hp_pop_frame ()
get_frame_saved_regs (fi, &fsr);
if (fsr.regs[IPSW_REGNUM]) /* Restoring a call dummy frame */
hp_restore_pc_queue (&fsr);
restore_pc_queue (&fsr);
for (regnum = 31; regnum > 0; regnum--)
if (fsr.regs[regnum])
@ -589,8 +592,8 @@ hp_pop_frame ()
* After returning to a dummy on the stack, restore the instruction
* queue space registers. */
int
hp_restore_pc_queue (fsr)
static int
restore_pc_queue (fsr)
struct frame_saved_regs *fsr;
{
CORE_ADDR pc = read_pc ();
@ -638,7 +641,7 @@ hp_restore_pc_queue (fsr)
}
CORE_ADDR
hp_push_arguments (nargs, args, sp, struct_return, struct_addr)
hppa_push_arguments (nargs, args, sp, struct_return, struct_addr)
int nargs;
value *args;
CORE_ADDR sp;
@ -652,11 +655,14 @@ hp_push_arguments (nargs, args, sp, struct_return, struct_addr)
for (i = 0; i < nargs; i++)
{
/* Coerce chars to int & float to double if necessary */
args[i] = value_arg_coerce (args[i]);
cum += TYPE_LENGTH (VALUE_TYPE (args[i]));
/* value must go at proper alignment. Assume alignment is a
power of two.*/
alignment = hp_alignof (VALUE_TYPE (args[i]));
alignment = hppa_alignof (VALUE_TYPE (args[i]));
if (cum % alignment)
cum = (cum + alignment) & -alignment;
offset[i] = -cum;
@ -672,11 +678,56 @@ hp_push_arguments (nargs, args, sp, struct_return, struct_addr)
return sp + 32;
}
/*
* Insert the specified number of args and function address
* into a call sequence of the above form stored at DUMMYNAME.
*
* On the hppa we need to call the stack dummy through $$dyncall.
* Therefore our version of FIX_CALL_DUMMY takes an extra argument,
* real_pc, which is the location where gdb should start up the
* inferior to do the function call.
*/
CORE_ADDR
hppa_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
REGISTER_TYPE *dummy;
CORE_ADDR pc;
CORE_ADDR fun;
int nargs;
value *args;
struct type *type;
int gcc_p;
{
CORE_ADDR dyncall_addr, sr4export_addr;
struct minimal_symbol *msymbol;
msymbol = lookup_minimal_symbol ("$$dyncall", (struct objfile *) NULL);
if (msymbol == NULL)
error ("Can't find an address for $$dyncall trampoline");
dyncall_addr = SYMBOL_VALUE_ADDRESS (msymbol);
msymbol = lookup_minimal_symbol ("_sr4export", (struct objfile *) NULL);
if (msymbol == NULL)
error ("Can't find an address for _sr4export trampoline");
sr4export_addr = SYMBOL_VALUE_ADDRESS (msymbol);
dummy[9] = deposit_21 (fun >> 11, dummy[9]);
dummy[10] = deposit_14 (fun & MASK_11, dummy[10]);
dummy[12] = deposit_21 (sr4export_addr >> 11, dummy[12]);
dummy[13] = deposit_14 (sr4export_addr & MASK_11, dummy[13]);
write_register (22, pc);
return dyncall_addr;
}
/* return the alignment of a type in bytes. Structures have the maximum
alignment required by their fields. */
int
hp_alignof (arg)
static int
hppa_alignof (arg)
struct type *arg;
{
int max_align, align, i;
@ -687,7 +738,7 @@ hp_alignof (arg)
case TYPE_CODE_FLT:
return TYPE_LENGTH (arg);
case TYPE_CODE_ARRAY:
return hp_alignof (TYPE_FIELD_TYPE (arg, 0));
return hppa_alignof (TYPE_FIELD_TYPE (arg, 0));
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
max_align = 2;
@ -696,7 +747,7 @@ hp_alignof (arg)
/* Bit fields have no real alignment. */
if (!TYPE_FIELD_BITPOS (arg, i))
{
align = hp_alignof (TYPE_FIELD_TYPE (arg, i));
align = hppa_alignof (TYPE_FIELD_TYPE (arg, i));
max_align = max (max_align, align);
}
}

View File

@ -31,6 +31,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Local functions. */
static int
typecmp PARAMS ((int staticp, struct type *t1[], value t2[]));
static CORE_ADDR
find_function_addr PARAMS ((value, struct type **));
@ -664,6 +667,13 @@ value_arg_coerce (arg)
register struct type *type;
COERCE_ENUM (arg);
#if 1 /* FIXME: This is only a temporary patch. -fnf */
if (VALUE_REPEATED (arg)
|| TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_ARRAY)
arg = value_coerce_array (arg);
if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FUNC)
arg = value_coerce_function (arg);
#endif
type = VALUE_TYPE (arg);
@ -822,8 +832,8 @@ call_function_by_hand (function, nargs, args)
SWAP_TARGET_AND_HOST (&dummy1[i], sizeof (REGISTER_TYPE));
#ifdef GDB_TARGET_IS_HPPA
FIX_CALL_DUMMY (dummy1, start_sp, real_pc, funaddr, nargs, args,
value_type, using_gcc);
real_pc = FIX_CALL_DUMMY (dummy1, start_sp, funaddr, nargs, args,
value_type, using_gcc);
#else
FIX_CALL_DUMMY (dummy1, start_sp, funaddr, nargs, args,
value_type, using_gcc);