* breakpoint.c, breakpoint.h, c-valprint.c, ch-valprint.c,
cp-valprint.c, eval.c, expprint.c, findvar.c, language.c, objfiles.h, infcmd.c, printcmd.c, stack.c, typeprint.c, valarith.c, valops.c, valprint.c, value.h, values.c: Replace value with value_ptr. This is for the ptx compiler. * objfiles.h, target.h: Don't declare a "sec_ptr" field using a "sec_ptr" typedef. * symm-nat.c: Add a bunch of stuff for symmetry's ptrace stuff. #if 0 i386_float_info. * symm-tdep.c (round): Remove. Also remove sgttyb. * symm-tdep.c: Remove lots of stuff which duplicates stuff from i386-tdep.c. Remove register_addr and ptx_coff_regno_to_gdb. * i386-tdep.c (i386_frame_find_saved_regs): Put in I386_REGNO_TO_SYMMETRY check in case it is needed for Dynix someday. * config/i386/nm-symmetry.h: Change KERNEL_U_ADDR. Move stuff from PTRACE_READ_REGS, PTRACE_WRITE_REGS macros to symm-nat.c. Define CHILD_WAIT and declare child_wait(). * config/i386/tm-symmetry.h: Remove call function stuff; stuff in tm-i386v.h is apparently OK. * config/i386/xm-symmetry.h [_SEQUENT_]: Define HAVE_TERMIOS not HAVE_TERMIO. Define MEM_FNS_DECLARED, NEED_POSIX_SETPGID, and USE_O_NOCTTY.
This commit is contained in:
parent
4e64845ca5
commit
82a2edfbcf
@ -1,3 +1,29 @@
|
||||
Wed Mar 2 09:17:55 1994 Jim Kingdon (kingdon@deneb.cygnus.com)
|
||||
|
||||
* breakpoint.c, breakpoint.h, c-valprint.c, ch-valprint.c,
|
||||
cp-valprint.c, eval.c, expprint.c, findvar.c, language.c,
|
||||
objfiles.h, infcmd.c, printcmd.c, stack.c, typeprint.c,
|
||||
valarith.c, valops.c, valprint.c, value.h, values.c: Replace
|
||||
value with value_ptr. This is for the ptx compiler.
|
||||
* objfiles.h, target.h: Don't declare a "sec_ptr" field using a
|
||||
"sec_ptr" typedef.
|
||||
* symm-nat.c: Add a bunch of stuff for symmetry's ptrace stuff.
|
||||
#if 0 i386_float_info.
|
||||
* symm-tdep.c (round): Remove. Also remove sgttyb.
|
||||
* symm-tdep.c: Remove lots of stuff which duplicates stuff from
|
||||
i386-tdep.c. Remove register_addr and ptx_coff_regno_to_gdb.
|
||||
* i386-tdep.c (i386_frame_find_saved_regs): Put in
|
||||
I386_REGNO_TO_SYMMETRY check in case it is needed for Dynix
|
||||
someday.
|
||||
* config/i386/nm-symmetry.h: Change KERNEL_U_ADDR. Move
|
||||
stuff from PTRACE_READ_REGS, PTRACE_WRITE_REGS macros to
|
||||
symm-nat.c. Define CHILD_WAIT and declare child_wait().
|
||||
* config/i386/tm-symmetry.h: Remove call function stuff; stuff in
|
||||
tm-i386v.h is apparently OK.
|
||||
* config/i386/xm-symmetry.h [_SEQUENT_]: Define HAVE_TERMIOS not
|
||||
HAVE_TERMIO. Define MEM_FNS_DECLARED, NEED_POSIX_SETPGID, and
|
||||
USE_O_NOCTTY.
|
||||
|
||||
Wed Mar 2 11:31:08 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||
|
||||
* osfsolib.c (xfer_link_map_member): Update to use new
|
||||
|
@ -207,7 +207,7 @@ get_number (pp)
|
||||
to pass to lookup_internalvar(). */
|
||||
char *varname;
|
||||
char *start = ++p;
|
||||
value val;
|
||||
value_ptr val;
|
||||
|
||||
while (isalnum (*p) || *p == '_')
|
||||
p++;
|
||||
@ -1012,8 +1012,8 @@ watchpoint_check (p)
|
||||
call free_all_values. We can't call free_all_values because
|
||||
we might be in the middle of evaluating a function call. */
|
||||
|
||||
value mark = value_mark ();
|
||||
value new_val = evaluate_expression (bs->breakpoint_at->exp);
|
||||
value_ptr mark = value_mark ();
|
||||
value_ptr new_val = evaluate_expression (bs->breakpoint_at->exp);
|
||||
if (!value_equal (bs->breakpoint_at->val, new_val))
|
||||
{
|
||||
release_value (new_val);
|
||||
|
@ -200,7 +200,7 @@ c_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
||||
}
|
||||
if (vt_address && vtblprint)
|
||||
{
|
||||
value vt_val;
|
||||
value_ptr vt_val;
|
||||
struct symbol *wsym = (struct symbol *)NULL;
|
||||
struct type *wtype;
|
||||
struct symtab *s;
|
||||
@ -263,7 +263,7 @@ c_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
||||
{
|
||||
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
|
||||
{
|
||||
value deref_val =
|
||||
value_ptr deref_val =
|
||||
value_at
|
||||
(TYPE_TARGET_TYPE (type),
|
||||
unpack_pointer (lookup_pointer_type (builtin_type_void),
|
||||
|
@ -279,7 +279,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
||||
{
|
||||
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
|
||||
{
|
||||
value deref_val =
|
||||
value_ptr deref_val =
|
||||
value_at
|
||||
(TYPE_TARGET_TYPE (type),
|
||||
unpack_pointer (lookup_pointer_type (builtin_type_void),
|
||||
@ -375,7 +375,7 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
|
||||
fputs_filtered (": ", stream);
|
||||
if (TYPE_FIELD_PACKED (type, i))
|
||||
{
|
||||
value v;
|
||||
value_ptr v;
|
||||
|
||||
/* Bitfields require special handling, especially due to byte
|
||||
order problems. */
|
||||
|
@ -18,27 +18,25 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef _SEQUENT_
|
||||
/* ptx */
|
||||
#define PTRACE_READ_REGS(pid,regaddr) mptrace (XPT_RREGS, (pid), (regaddr), 0)
|
||||
#define PTRACE_WRITE_REGS(pid,regaddr) \
|
||||
mptrace (XPT_WREGS, (pid), (regadddr), 0)
|
||||
#else
|
||||
/* dynix */
|
||||
#define PTRACE_READ_REGS(pid,regaddr) ptrace (XPT_RREGS, (pid), (regaddr), 0)
|
||||
#define PTRACE_WRITE_REGS(pid,regaddr) \
|
||||
ptrace (XPT_WREGS, (pid), (regadddr), 0)
|
||||
#endif
|
||||
|
||||
/* Override copies of {fetch,store}_inferior_registers in infptrace.c. */
|
||||
|
||||
#define FETCH_INFERIOR_REGISTERS
|
||||
|
||||
#ifdef _SEQUENT_
|
||||
#define CHILD_WAIT
|
||||
extern int child_wait PARAMS ((int, struct target_waitstatus *));
|
||||
#endif
|
||||
|
||||
/* This is the amount to subtract from u.u_ar0
|
||||
to get the offset in the core file of the register values. */
|
||||
|
||||
#ifdef _SEQUENT_
|
||||
#define KERNEL_U_ADDR (0xffffe000) /* VA_UBLOCK */ /* ptx */
|
||||
#include <sys/param.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/mc_vmparam.h>
|
||||
/* VA_UAREA is defined in <sys/mc_vmparam.h>, and is dependant upon
|
||||
sizeof(struct user) */
|
||||
#define KERNEL_U_ADDR (VA_UAREA) /* ptx */
|
||||
#else
|
||||
#define KERNEL_U_ADDR (0x80000000 - (UPAGES * NBPG)) /* dynix */
|
||||
#endif
|
||||
|
@ -33,6 +33,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
/* ptx, not dynix */
|
||||
#define SDB_REG_TO_REGNUM(value) ptx_coff_regno_to_gdb(value)
|
||||
extern int ptx_coff_regno_to_gdb();
|
||||
|
||||
#endif /* _SEQUENT_ */
|
||||
|
||||
#define START_INFERIOR_TRAPS_EXPECTED 2
|
||||
@ -49,7 +50,7 @@ extern int ptx_coff_regno_to_gdb();
|
||||
/* For Symmetry, this is really the 'leave' instruction, which */
|
||||
/* is right before the ret */
|
||||
|
||||
#undef
|
||||
#undef ABOUT_TO_RETURN
|
||||
#define ABOUT_TO_RETURN(pc) (read_memory_integer (pc, 1) == 0xc9)
|
||||
|
||||
#if 0
|
||||
@ -113,13 +114,17 @@ extern int ptx_coff_regno_to_gdb();
|
||||
/* Get %fp2 - %fp31 by addition, since they are contiguous */
|
||||
|
||||
#undef SP_REGNUM
|
||||
#define SP_REGNUM 14 /* Contains address of top of stack */
|
||||
#define SP_REGNUM 14 /* esp--Contains address of top of stack */
|
||||
#define ESP_REGNUM 14
|
||||
#undef FP_REGNUM
|
||||
#define FP_REGNUM 15 /* Contains address of executing stack frame */
|
||||
#define FP_REGNUM 15 /* ebp--Contains address of executing stack frame */
|
||||
#define EBP_REGNUM 15
|
||||
#undef PC_REGNUM
|
||||
#define PC_REGNUM 16 /* Contains program counter */
|
||||
#define PC_REGNUM 16 /* eip--Contains program counter */
|
||||
#define EIP_REGNUM 16
|
||||
#undef PS_REGNUM
|
||||
#define PS_REGNUM 17 /* Contains processor status */
|
||||
#define PS_REGNUM 17 /* eflags--Contains processor status */
|
||||
#define EFLAGS_REGNUM 17
|
||||
|
||||
#ifndef _SEQUENT_
|
||||
/* dynix, not ptx. For ptx, see register_addr in symm-tdep.c */
|
||||
@ -221,8 +226,123 @@ switch (regno) { \
|
||||
((int) &foo.u_fpasave.fpa_regs[(regno)-18] - (int)&foo); \
|
||||
} \
|
||||
}
|
||||
#endif /* not _SEQUENT_ */
|
||||
|
||||
#ifdef _SEQUENT_
|
||||
/* ptx. For Dynix, see above */
|
||||
|
||||
/*
|
||||
* For ptx, this is a little bit bizarre, since the register block
|
||||
* is below the u area in memory. This means that blockend here ends
|
||||
* up being negative (for the call from coredep.c) since the value in
|
||||
* u.u_ar0 will be less than KERNEL_U_ADDR (and coredep.c passes us
|
||||
* u.u_ar0 - KERNEL_U_ADDR in blockend). Since we also define
|
||||
* FETCH_INFERIOR_REGISTERS (and supply our own functions for that),
|
||||
* the core file case will be the only use of this function.
|
||||
*/
|
||||
|
||||
#define REGISTER_U_ADDR(addr, blockend, regno) \
|
||||
{ struct user foo; /* needed for finding fpu regs */ \
|
||||
switch (regno) { \
|
||||
case 0: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (EAX * sizeof(int)); break; \
|
||||
case 1: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (EDX * sizeof(int)); break; \
|
||||
case 2: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (ECX * sizeof(int)); break; \
|
||||
case 3: /* st(0) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int)&foo.u_fpusave.fpu_stack[0][0] - (int)&foo); \
|
||||
break; \
|
||||
case 4: /* st(1) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpusave.fpu_stack[1][0] - (int)&foo); \
|
||||
break; \
|
||||
case 5: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (EBX * sizeof(int)); break; \
|
||||
case 6: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (ESI * sizeof(int)); break; \
|
||||
case 7: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (EDI * sizeof(int)); break; \
|
||||
case 8: /* st(2) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpusave.fpu_stack[2][0] - (int)&foo); \
|
||||
break; \
|
||||
case 9: /* st(3) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpusave.fpu_stack[3][0] - (int)&foo); \
|
||||
break; \
|
||||
case 10: /* st(4) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpusave.fpu_stack[4][0] - (int)&foo); \
|
||||
break; \
|
||||
case 11: /* st(5) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpusave.fpu_stack[5][0] - (int)&foo); \
|
||||
break; \
|
||||
case 12: /* st(6) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpusave.fpu_stack[6][0] - (int)&foo); \
|
||||
break; \
|
||||
case 13: /* st(7) */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpusave.fpu_stack[7][0] - (int)&foo); \
|
||||
break; \
|
||||
case 14: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (ESP * sizeof(int)); break; \
|
||||
case 15: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (EBP * sizeof(int)); break; \
|
||||
case 16: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (EIP * sizeof(int)); break; \
|
||||
case 17: \
|
||||
addr = blockend + (NBPG * UPAGES) - sizeof(struct user) + (FLAGS * sizeof(int)); break; \
|
||||
case 18: /* fp1 */ \
|
||||
case 19: /* fp2 */ \
|
||||
case 20: /* fp3 */ \
|
||||
case 21: /* fp4 */ \
|
||||
case 22: /* fp5 */ \
|
||||
case 23: /* fp6 */ \
|
||||
case 24: /* fp7 */ \
|
||||
case 25: /* fp8 */ \
|
||||
case 26: /* fp9 */ \
|
||||
case 27: /* fp10 */ \
|
||||
case 28: /* fp11 */ \
|
||||
case 29: /* fp12 */ \
|
||||
case 30: /* fp13 */ \
|
||||
case 31: /* fp14 */ \
|
||||
case 32: /* fp15 */ \
|
||||
case 33: /* fp16 */ \
|
||||
case 34: /* fp17 */ \
|
||||
case 35: /* fp18 */ \
|
||||
case 36: /* fp19 */ \
|
||||
case 37: /* fp20 */ \
|
||||
case 38: /* fp21 */ \
|
||||
case 39: /* fp22 */ \
|
||||
case 40: /* fp23 */ \
|
||||
case 41: /* fp24 */ \
|
||||
case 42: /* fp25 */ \
|
||||
case 43: /* fp26 */ \
|
||||
case 44: /* fp27 */ \
|
||||
case 45: /* fp28 */ \
|
||||
case 46: /* fp29 */ \
|
||||
case 47: /* fp30 */ \
|
||||
case 48: /* fp31 */ \
|
||||
addr = blockend - KERNEL_U_ADDR + \
|
||||
((int) &foo.u_fpasave.fpa_regs[(regno)-18] - (int)&foo); \
|
||||
} \
|
||||
}
|
||||
#endif /* _SEQUENT_ */
|
||||
|
||||
#undef FRAME_CHAIN
|
||||
#define FRAME_CHAIN(thisframe) ((thisframe)->pc == 0 ? \
|
||||
0 : read_memory_integer((thisframe)->frame, 4))
|
||||
|
||||
#define FRAME_CHAIN_VALID(chain, thisframe) \
|
||||
((chain) != 0)
|
||||
|
||||
#undef FRAME_ARGS_SKIP
|
||||
#define FRAME_ARGS_SKIP 0
|
||||
|
||||
/* Total amount of space needed to store our copies of the machine's
|
||||
register state, the array `registers'. */
|
||||
/* 10 i386 registers, 8 i387 registers, and 31 Weitek 1167 registers */
|
||||
@ -326,70 +446,6 @@ double_to_i387 PARAMS ((char *, char *));
|
||||
symmetry_extract_return_value(TYPE, REGBUF, VALBUF)
|
||||
|
||||
|
||||
/* Things needed for making the inferior call functions. FIXME: Merge
|
||||
this with the main 386 stuff. */
|
||||
|
||||
#define PUSH_DUMMY_FRAME \
|
||||
{ CORE_ADDR sp = read_register (SP_REGNUM); \
|
||||
int regnum; \
|
||||
sp = push_word (sp, read_register (PC_REGNUM)); \
|
||||
sp = push_word (sp, read_register (FP_REGNUM)); \
|
||||
write_register (FP_REGNUM, sp); \
|
||||
for (regnum = 0; regnum < NUM_REGS; regnum++) \
|
||||
sp = push_word (sp, read_register (regnum)); \
|
||||
write_register (SP_REGNUM, sp); \
|
||||
}
|
||||
|
||||
#define POP_FRAME \
|
||||
{ \
|
||||
FRAME frame = get_current_frame (); \
|
||||
CORE_ADDR fp; \
|
||||
int regnum; \
|
||||
struct frame_saved_regs fsr; \
|
||||
struct frame_info *fi; \
|
||||
fi = get_frame_info (frame); \
|
||||
fp = fi->frame; \
|
||||
get_frame_saved_regs (fi, &fsr); \
|
||||
for (regnum = 0; regnum < NUM_REGS; regnum++) { \
|
||||
CORE_ADDR adr; \
|
||||
adr = fsr.regs[regnum]; \
|
||||
if (adr) \
|
||||
write_register (regnum, read_memory_integer (adr, 4)); \
|
||||
} \
|
||||
write_register (FP_REGNUM, read_memory_integer (fp, 4)); \
|
||||
write_register (PC_REGNUM, read_memory_integer (fp + 4, 4)); \
|
||||
write_register (SP_REGNUM, fp + 8); \
|
||||
flush_cached_frames (); \
|
||||
set_current_frame ( create_new_frame (read_register (FP_REGNUM), \
|
||||
read_pc ())); \
|
||||
}
|
||||
|
||||
/* from i386-dep.c, worked better than my original... */
|
||||
/* This sequence of words is the instructions
|
||||
* call (32-bit offset)
|
||||
* int 3
|
||||
* This is 6 bytes.
|
||||
*/
|
||||
|
||||
#define CALL_DUMMY { 0x223344e8, 0xcc11 }
|
||||
|
||||
#define CALL_DUMMY_LENGTH 8
|
||||
|
||||
#define CALL_DUMMY_START_OFFSET 0 /* Start execution at beginning of dummy */
|
||||
|
||||
/* Insert the specified number of args and function address
|
||||
into a call sequence of the above form stored at DUMMYNAME. */
|
||||
|
||||
#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
|
||||
{ \
|
||||
int from, to, delta, loc; \
|
||||
loc = (int)(read_register (SP_REGNUM) - CALL_DUMMY_LENGTH); \
|
||||
from = loc + 5; \
|
||||
to = (int)(fun); \
|
||||
delta = to - from; \
|
||||
*(int *)((char *)(dummyname) + 1) = delta; \
|
||||
}
|
||||
|
||||
extern void
|
||||
print_387_control_word PARAMS ((unsigned int));
|
||||
|
||||
|
@ -27,8 +27,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef _SEQUENT_
|
||||
/* ptx */
|
||||
#define HAVE_TERMIO
|
||||
#define HAVE_TERMIOS
|
||||
#define USG
|
||||
|
||||
#define MEM_FNS_DECLARED
|
||||
|
||||
#define NEED_POSIX_SETPGID
|
||||
|
||||
#define USE_O_NOCTTY
|
||||
|
||||
#else
|
||||
/* dynix */
|
||||
|
||||
@ -43,6 +50,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#define PTRACE_DETACH XPT_UNDEBUG
|
||||
#define ATTACH_DETACH */
|
||||
|
||||
#ifdef _SEQUENT_
|
||||
/* ptx does attach as of ptx version 2.1 */
|
||||
#define ATTACH_DETACH 1
|
||||
|
||||
#define HOST_BYTE_ORDER LITTLE_ENDIAN
|
||||
|
||||
/* We must fetch all the regs before storing, since we store all at once. */
|
||||
|
@ -283,7 +283,7 @@ cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
|
||||
}
|
||||
if (TYPE_FIELD_PACKED (type, i))
|
||||
{
|
||||
value v;
|
||||
value_ptr v;
|
||||
|
||||
/* Bitfields require special handling, especially due to byte
|
||||
order problems. */
|
||||
|
@ -428,8 +428,8 @@ language_info (quietly)
|
||||
#if 0 /* Currently unused */
|
||||
|
||||
struct type *
|
||||
binop_result_type(v1,v2)
|
||||
value v1,v2;
|
||||
binop_result_type (v1, v2)
|
||||
value_ptr v1, v2;
|
||||
{
|
||||
int l1,l2,size,uns;
|
||||
|
||||
@ -760,7 +760,7 @@ structured_type(type)
|
||||
/* Returns non-zero if the value VAL represents a true value. */
|
||||
int
|
||||
value_true (val)
|
||||
value val;
|
||||
value_ptr val;
|
||||
{
|
||||
/* It is possible that we should have some sort of error if a non-boolean
|
||||
value is used in this context. Possibly dependent on some kind of
|
||||
@ -778,7 +778,7 @@ value_true (val)
|
||||
|
||||
void
|
||||
binop_type_check(arg1,arg2,op)
|
||||
value arg1,arg2;
|
||||
value_ptr arg1,arg2;
|
||||
int op;
|
||||
{
|
||||
struct type *t1, *t2;
|
||||
@ -788,7 +788,7 @@ binop_type_check(arg1,arg2,op)
|
||||
return;
|
||||
|
||||
t1=VALUE_TYPE(arg1);
|
||||
if (arg2!=(value)NULL)
|
||||
if (arg2 != NULL)
|
||||
t2=VALUE_TYPE(arg2);
|
||||
else
|
||||
t2=NULL;
|
||||
|
@ -139,8 +139,11 @@ struct obj_section {
|
||||
addresses", but that's not true; addr & endaddr are actual memory
|
||||
addresses. */
|
||||
CORE_ADDR offset;
|
||||
|
||||
sec_ptr sec_ptr; /* BFD section pointer */
|
||||
|
||||
/* For the ptx compiler, we can't use the sec_ptr typedef when the field's
|
||||
name is sec_ptr. We really should rename the field (or better yet,
|
||||
the typedef should be bfd_sec_ptr). */
|
||||
struct sec *sec_ptr; /* BFD section pointer */
|
||||
|
||||
/* Objfile this section is part of. Not currently used, but I'm sure
|
||||
that someone will want the bfd that the sec_ptr goes with or something
|
||||
|
@ -63,7 +63,7 @@ static CORE_ADDR last_examine_address;
|
||||
/* Contents of last address examined.
|
||||
This is not valid past the end of the `x' command! */
|
||||
|
||||
static value last_examine_value;
|
||||
static value_ptr last_examine_value;
|
||||
|
||||
/* Largest offset between a symbolic value and an address, that will be
|
||||
printed as `0x1234 <symbol+offset>'. */
|
||||
@ -182,7 +182,7 @@ static void
|
||||
do_examine PARAMS ((struct format_data, CORE_ADDR));
|
||||
|
||||
static void
|
||||
print_formatted PARAMS ((value, int, int));
|
||||
print_formatted PARAMS ((value_ptr, int, int));
|
||||
|
||||
static struct format_data
|
||||
decode_format PARAMS ((char **, int, int));
|
||||
@ -227,13 +227,6 @@ decode_format (string_ptr, oformat, osize)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifndef CC_HAS_LONG_LONG
|
||||
/* Make sure 'g' size is not used on integer types.
|
||||
Well, actually, we can handle hex. */
|
||||
if (val.size == 'g' && val.format != 'f' && val.format != 'x')
|
||||
val.size = 'w';
|
||||
#endif
|
||||
|
||||
while (*p == ' ' || *p == '\t') p++;
|
||||
*string_ptr = p;
|
||||
|
||||
@ -256,9 +249,24 @@ decode_format (string_ptr, oformat, osize)
|
||||
{
|
||||
case 'a':
|
||||
case 's':
|
||||
/* Addresses must be words. */
|
||||
/* Pick the appropriate size for an address. */
|
||||
#if TARGET_PTR_BIT == 64
|
||||
val.size = osize ? 'g' : osize;
|
||||
break;
|
||||
#else /* Not 64 */
|
||||
#if TARGET_PTR_BIT == 32
|
||||
val.size = osize ? 'w' : osize;
|
||||
break;
|
||||
#else /* Not 32 */
|
||||
#if TARGET_PTR_BIT == 16
|
||||
val.size = osize ? 'h' : osize;
|
||||
break;
|
||||
#else /* Not 16 */
|
||||
#error Bad value for TARGET_PTR_BIT
|
||||
#endif /* Not 16 */
|
||||
#endif /* Not 32 */
|
||||
#endif /* Not 64 */
|
||||
break;
|
||||
case 'f':
|
||||
/* Floating point has to be word or giantword. */
|
||||
if (osize == 'w' || osize == 'g')
|
||||
@ -288,7 +296,7 @@ decode_format (string_ptr, oformat, osize)
|
||||
|
||||
static void
|
||||
print_formatted (val, format, size)
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
register int format;
|
||||
int size;
|
||||
{
|
||||
@ -750,7 +758,7 @@ print_command_1 (exp, inspect, voidprint)
|
||||
struct expression *expr;
|
||||
register struct cleanup *old_chain = 0;
|
||||
register char format = 0;
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
struct format_data fmt;
|
||||
int cleanup = 0;
|
||||
|
||||
@ -789,7 +797,7 @@ print_command_1 (exp, inspect, voidprint)
|
||||
&& ( TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT
|
||||
|| TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_UNION))
|
||||
{
|
||||
value v;
|
||||
value_ptr v;
|
||||
|
||||
v = value_from_vtable_info (val, TYPE_TARGET_TYPE (type));
|
||||
if (v != 0)
|
||||
@ -863,7 +871,7 @@ output_command (exp, from_tty)
|
||||
struct expression *expr;
|
||||
register struct cleanup *old_chain;
|
||||
register char format = 0;
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
struct format_data fmt;
|
||||
|
||||
if (exp && *exp == '/')
|
||||
@ -1453,7 +1461,7 @@ print_variable_value (var, frame, stream)
|
||||
FRAME frame;
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
value val = read_var_value (var, frame);
|
||||
value_ptr val = read_var_value (var, frame);
|
||||
value_print (val, stream, 0, Val_pretty_default);
|
||||
}
|
||||
|
||||
@ -1477,7 +1485,7 @@ print_frame_args (func, fi, num, stream)
|
||||
int first = 1;
|
||||
register int i;
|
||||
register struct symbol *sym;
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
/* Offset of next stack argument beyond the one we have seen that is
|
||||
at the highest offset.
|
||||
-1 if we haven't come to a stack argument yet. */
|
||||
@ -1683,14 +1691,14 @@ printf_command (arg, from_tty)
|
||||
register char *f;
|
||||
register char *s = arg;
|
||||
char *string;
|
||||
value *val_args;
|
||||
value_ptr *val_args;
|
||||
char *substrings;
|
||||
char *current_substring;
|
||||
int nargs = 0;
|
||||
int allocated_args = 20;
|
||||
struct cleanup *old_cleanups;
|
||||
|
||||
val_args = (value *) xmalloc (allocated_args * sizeof (value));
|
||||
val_args = (value_ptr *) xmalloc (allocated_args * sizeof (value_ptr));
|
||||
old_cleanups = make_cleanup (free_current_contents, &val_args);
|
||||
|
||||
if (s == 0)
|
||||
@ -1722,21 +1730,38 @@ printf_command (arg, from_tty)
|
||||
case '\\':
|
||||
*f++ = '\\';
|
||||
break;
|
||||
case 'a':
|
||||
#ifdef __STDC__
|
||||
*f++ = '\a';
|
||||
#else
|
||||
*f++ = '\007'; /* Bell */
|
||||
#endif
|
||||
break;
|
||||
case 'b':
|
||||
*f++ = '\b';
|
||||
break;
|
||||
case 'f':
|
||||
*f++ = '\f';
|
||||
break;
|
||||
case 'n':
|
||||
*f++ = '\n';
|
||||
break;
|
||||
case 'r':
|
||||
*f++ = '\r';
|
||||
break;
|
||||
case 't':
|
||||
*f++ = '\t';
|
||||
break;
|
||||
case 'r':
|
||||
*f++ = '\r';
|
||||
case 'v':
|
||||
*f++ = '\v';
|
||||
break;
|
||||
case '"':
|
||||
*f++ = '"';
|
||||
break;
|
||||
default:
|
||||
/* ??? TODO: handle other escape sequences */
|
||||
error ("Unrecognized \\ escape character in format string.");
|
||||
error ("Unrecognized escape character \\%c in format string.",
|
||||
c);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1834,9 +1859,9 @@ printf_command (arg, from_tty)
|
||||
{
|
||||
char *s1;
|
||||
if (nargs == allocated_args)
|
||||
val_args = (value *) xrealloc ((char *) val_args,
|
||||
(allocated_args *= 2)
|
||||
* sizeof (value));
|
||||
val_args = (value_ptr *) xrealloc ((char *) val_args,
|
||||
(allocated_args *= 2)
|
||||
* sizeof (value_ptr));
|
||||
s1 = s;
|
||||
val_args[nargs] = parse_to_comma_and_eval (&s1);
|
||||
|
||||
|
503
gdb/symm-nat.c
503
gdb/symm-nat.c
@ -1,5 +1,5 @@
|
||||
/* Sequent Symmetry host interface, for GDB when running under Unix.
|
||||
Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
|
||||
Copyright 1986, 1987, 1989, 1991, 1992, 1994 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -24,13 +24,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include "frame.h"
|
||||
#include "inferior.h"
|
||||
#include "symtab.h"
|
||||
#include "target.h"
|
||||
|
||||
/* FIXME: What is the _INKERNEL define for? */
|
||||
#define _INKERNEL
|
||||
#include <signal.h>
|
||||
#undef _INKERNEL
|
||||
#include <sys/wait.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/dir.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include "gdbcore.h"
|
||||
#include <fcntl.h>
|
||||
#include <sgtty.h>
|
||||
@ -61,7 +68,7 @@ int regno;
|
||||
regs.pr_fpa.fpa_regs[i] =
|
||||
*(int *)®isters[REGISTER_BYTE(FP1_REGNUM+i)];
|
||||
}
|
||||
PTRACE_WRITE_REGS (inferior_pid, (PTRACE_ARG3_TYPE) ®s);
|
||||
mptrace (XPT_WREGS, inferior_pid, (PTRACE_ARG3_TYPE) ®s, 0);
|
||||
}
|
||||
|
||||
void
|
||||
@ -74,7 +81,7 @@ fetch_inferior_registers (regno)
|
||||
|
||||
registers_fetched ();
|
||||
|
||||
PTRACE_READ_REGS (inferior_pid, (PTRACE_ARG3_TYPE) ®s);
|
||||
mptrace (XPT_RREGS, (pid), (regaddr), 0);
|
||||
*(int *)®isters[REGISTER_BYTE(EAX_REGNUM)] = regs.pr_eax;
|
||||
*(int *)®isters[REGISTER_BYTE(EBX_REGNUM)] = regs.pr_ebx;
|
||||
*(int *)®isters[REGISTER_BYTE(ECX_REGNUM)] = regs.pr_ecx;
|
||||
@ -146,7 +153,7 @@ struct pt_regset ep;
|
||||
for (i = 9; i >= 0; i--)
|
||||
printf_unfiltered ("%02x", ep.pr_fpu.fpu_stack[fpreg][i]);
|
||||
|
||||
i387_to_double (ep.pr_fpu.fpu_stack[fpreg], (char *)&val);
|
||||
i387_to_double ((char *)ep.pr_fpu.fpu_stack[fpreg], (char *)&val);
|
||||
printf_unfiltered (" %g\n", val);
|
||||
}
|
||||
if (ep.pr_fpu.fpu_rsvd1)
|
||||
@ -203,24 +210,46 @@ unsigned int pcr;
|
||||
if (pcr_tmp & FPA_PCR_20MHZ) printf_unfiltered(" 20MHZ");
|
||||
if (pcr_tmp & FPA_PCR_CC_Z) printf_unfiltered(" Z");
|
||||
if (pcr_tmp & FPA_PCR_CC_C2) printf_unfiltered(" C2");
|
||||
|
||||
/* Dynix defines FPA_PCR_CC_C0 to 0x100 and ptx defines
|
||||
FPA_PCR_CC_C1 to 0x100. Use whichever is defined and assume
|
||||
the OS knows what it is doing. */
|
||||
#ifdef FPA_PCR_CC_C1
|
||||
if (pcr_tmp & FPA_PCR_CC_C1) printf_unfiltered(" C1");
|
||||
switch (pcr_tmp) {
|
||||
case FPA_PCR_CC_Z:
|
||||
#endif
|
||||
#ifdef FPA_PCR_CC_C0
|
||||
if (pcr_tmp & FPA_PCR_CC_C1) printf_unfiltered(" C0");
|
||||
#endif
|
||||
|
||||
switch (pcr_tmp)
|
||||
{
|
||||
case FPA_PCR_CC_Z:
|
||||
printf_unfiltered(" (Equal)");
|
||||
break;
|
||||
case FPA_PCR_CC_C1:
|
||||
#ifdef FPA_PCR_CC_C1
|
||||
case FPA_PCR_CC_C1:
|
||||
#endif
|
||||
#ifdef FPA_PCR_CC_C0
|
||||
case FPA_PCR_CC_C0:
|
||||
#endif
|
||||
printf_unfiltered(" (Less than)");
|
||||
break;
|
||||
case 0:
|
||||
case 0:
|
||||
printf_unfiltered(" (Greater than)");
|
||||
break;
|
||||
case FPA_PCR_CC_Z | FPA_PCR_CC_C1 | FPA_PCR_CC_C2:
|
||||
case FPA_PCR_CC_Z |
|
||||
#ifdef FPA_PCR_CC_C1
|
||||
FPA_PCR_CC_C1
|
||||
#else
|
||||
FPA_PCR_CC_C0
|
||||
#endif
|
||||
| FPA_PCR_CC_C2:
|
||||
printf_unfiltered(" (Unordered)");
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
printf_unfiltered(" (Undefined)");
|
||||
break;
|
||||
}
|
||||
}
|
||||
printf_unfiltered("\n");
|
||||
pcr_tmp = pcr & FPA_PCR_AE;
|
||||
printf_unfiltered("\tAE= %#x", pcr_tmp);
|
||||
@ -279,6 +308,7 @@ struct pt_regset ep;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* disabled because it doesn't go through the target vector. */
|
||||
i386_float_info ()
|
||||
{
|
||||
char ubuf[UPAGES*NBPG];
|
||||
@ -306,3 +336,454 @@ i386_float_info ()
|
||||
print_fpu_status(regset);
|
||||
print_fpa_status(regset);
|
||||
}
|
||||
#endif
|
||||
|
||||
static volatile int got_sigchld;
|
||||
|
||||
/*ARGSUSED*/
|
||||
/* This will eventually be more interesting. */
|
||||
void
|
||||
sigchld_handler(signo)
|
||||
int signo;
|
||||
{
|
||||
got_sigchld++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Signals for which the default action does not cause the process
|
||||
* to die. See <sys/signal.h> for where this came from (alas, we
|
||||
* can't use those macros directly)
|
||||
*/
|
||||
#ifndef sigmask
|
||||
#define sigmask(s) (1 << ((s) - 1))
|
||||
#endif
|
||||
#define SIGNALS_DFL_SAFE sigmask(SIGSTOP) | sigmask(SIGTSTP) | \
|
||||
sigmask(SIGTTIN) | sigmask(SIGTTOU) | sigmask(SIGCHLD) | \
|
||||
sigmask(SIGCONT) | sigmask(SIGWINCH) | sigmask(SIGPWR) | \
|
||||
sigmask(SIGURG) | sigmask(SIGPOLL)
|
||||
|
||||
|
||||
/*
|
||||
* Thanks to XPT_MPDEBUGGER, we have to mange child_wait().
|
||||
*/
|
||||
int
|
||||
child_wait(pid, status)
|
||||
int pid;
|
||||
struct target_waitstatus *status;
|
||||
{
|
||||
int save_errno, rv, xvaloff, saoff, sa_hand;
|
||||
struct pt_stop pt;
|
||||
struct user u;
|
||||
sigset_t set;
|
||||
/* Host signal number for a signal which the inferior terminates with, or
|
||||
0 if it hasn't terminated due to a signal. */
|
||||
static int death_by_signal = 0;
|
||||
#ifdef SVR4_SHARED_LIBS /* use this to distinguish ptx 2 vs ptx 4 */
|
||||
prstatus_t pstatus;
|
||||
#endif
|
||||
|
||||
do {
|
||||
if (attach_flag)
|
||||
set_sigint_trap(); /* Causes SIGINT to be passed on to the
|
||||
attached process. */
|
||||
save_errno = errno;
|
||||
|
||||
got_sigchld = 0;
|
||||
|
||||
sigemptyset(&set);
|
||||
|
||||
while (got_sigchld == 0) {
|
||||
sigsuspend(&set);
|
||||
}
|
||||
|
||||
if (attach_flag)
|
||||
clear_sigint_trap();
|
||||
|
||||
rv = mptrace(XPT_STOPSTAT, 0, (char *)&pt, 0);
|
||||
if (-1 == rv) {
|
||||
printf("XPT_STOPSTAT: errno %d\n", errno); /* DEBUG */
|
||||
continue;
|
||||
}
|
||||
|
||||
pid = pt.ps_pid;
|
||||
|
||||
if (pid != inferior_pid) {
|
||||
/* NOTE: the mystery fork in csh/tcsh needs to be ignored.
|
||||
* We should not return new children for the initial run
|
||||
* of a process until it has done the exec.
|
||||
*/
|
||||
/* inferior probably forked; send it on its way */
|
||||
rv = mptrace(XPT_UNDEBUG, pid, 0, 0);
|
||||
if (-1 == rv) {
|
||||
printf("child_wait: XPT_UNDEBUG: pid %d: %s\n", pid,
|
||||
safe_strerror(errno));
|
||||
}
|
||||
continue;
|
||||
}
|
||||
/* FIXME: Do we deal with fork notification correctly? */
|
||||
switch (pt.ps_reason) {
|
||||
case PTS_FORK:
|
||||
/* multi proc: treat like PTS_EXEC */
|
||||
/*
|
||||
* Pretend this didn't happen, since gdb isn't set up
|
||||
* to deal with stops on fork.
|
||||
*/
|
||||
rv = ptrace(PT_CONTSIG, pid, 1, 0);
|
||||
if (-1 == rv) {
|
||||
printf("PTS_FORK: PT_CONTSIG: error %d\n", errno);
|
||||
}
|
||||
continue;
|
||||
case PTS_EXEC:
|
||||
/*
|
||||
* Pretend this is a SIGTRAP.
|
||||
*/
|
||||
status->kind = TARGET_WAITKIND_STOPPED;
|
||||
status->value.sig = TARGET_SIGNAL_TRAP;
|
||||
break;
|
||||
case PTS_EXIT:
|
||||
/*
|
||||
* Note: we stop before the exit actually occurs. Extract
|
||||
* the exit code from the uarea. If we're stopped in the
|
||||
* exit() system call, the exit code will be in
|
||||
* u.u_ap[0]. An exit due to an uncaught signal will have
|
||||
* something else in here, see the comment in the default:
|
||||
* case, below. Finally,let the process exit.
|
||||
*/
|
||||
if (death_by_signal)
|
||||
{
|
||||
status->kind = TARGET_WAITKIND_SIGNALED;
|
||||
status->value.sig = target_signal_from_host (death_by_signal);
|
||||
death_by_signal = 0;
|
||||
break;
|
||||
}
|
||||
xvaloff = (unsigned long)&u.u_ap[0] - (unsigned long)&u;
|
||||
errno = 0;
|
||||
rv = ptrace(PT_RUSER, pid, (char *)xvaloff, 0);
|
||||
status->kind = TARGET_WAITKIND_EXITED;
|
||||
status->value.integer = rv;
|
||||
/*
|
||||
* addr & data to mptrace() don't matter here, since
|
||||
* the process is already dead.
|
||||
*/
|
||||
rv = mptrace(XPT_UNDEBUG, pid, 0, 0);
|
||||
if (-1 == rv) {
|
||||
printf("child_wait: PTS_EXIT: XPT_UNDEBUG: pid %d error %d\n", pid,
|
||||
errno);
|
||||
}
|
||||
break;
|
||||
case PTS_WATCHPT_HIT:
|
||||
fatal("PTS_WATCHPT_HIT\n");
|
||||
break;
|
||||
default:
|
||||
/* stopped by signal */
|
||||
status->kind = TARGET_WAITKIND_STOPPED;
|
||||
status->value.sig = target_signal_from_host (pt.ps_reason);
|
||||
death_by_signal = 0;
|
||||
|
||||
if (0 == (SIGNALS_DFL_SAFE & sigmask(pt.ps_reason))) {
|
||||
break;
|
||||
}
|
||||
/* else default action of signal is to die */
|
||||
#ifdef SVR4_SHARED_LIBS
|
||||
rv = ptrace(PT_GET_PRSTATUS, pid, (char *)&pstatus, 0);
|
||||
if (-1 == rv)
|
||||
error("child_wait: signal %d PT_GET_PRSTATUS: %s\n",
|
||||
pt.ps_reason, safe_strerror(errno));
|
||||
if (pstatus.pr_cursig != pt.ps_reason) {
|
||||
printf("pstatus signal %d, pt signal %d\n",
|
||||
pstatus.pr_cursig, pt.ps_reason);
|
||||
}
|
||||
sa_hand = (int)pstatus.pr_action.sa_handler;
|
||||
#else
|
||||
saoff = (unsigned long)&u.u_sa[0] - (unsigned long)&u;
|
||||
saoff += sizeof(struct sigaction) * (pt.ps_reason - 1);
|
||||
errno = 0;
|
||||
sa_hand = ptrace(PT_RUSER, pid, (char *)saoff, 0);
|
||||
if (errno)
|
||||
error("child_wait: signal %d: RUSER: %s\n",
|
||||
pt.ps_reason, safe_strerror(errno));
|
||||
#endif
|
||||
if ((int)SIG_DFL == sa_hand) {
|
||||
/* we will be dying */
|
||||
death_by_signal = pt.ps_reason;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
} while (pid != inferior_pid); /* Some other child died or stopped */
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* This function simply calls ptrace with the given arguments.
|
||||
It exists so that all calls to ptrace are isolated in this
|
||||
machine-dependent file. */
|
||||
int
|
||||
call_ptrace (request, pid, addr, data)
|
||||
int request, pid;
|
||||
PTRACE_ARG3_TYPE addr;
|
||||
int data;
|
||||
{
|
||||
return ptrace (request, pid, addr, data);
|
||||
}
|
||||
|
||||
int
|
||||
call_mptrace(request, pid, addr, data)
|
||||
int request, pid;
|
||||
PTRACE_ARG3_TYPE addr;
|
||||
int data;
|
||||
{
|
||||
return mptrace(request, pid, addr, data);
|
||||
}
|
||||
|
||||
#if defined (DEBUG_PTRACE)
|
||||
/* For the rest of the file, use an extra level of indirection */
|
||||
/* This lets us breakpoint usefully on call_ptrace. */
|
||||
#define ptrace call_ptrace
|
||||
#define mptrace call_mptrace
|
||||
#endif
|
||||
|
||||
void
|
||||
kill_inferior ()
|
||||
{
|
||||
if (inferior_pid == 0)
|
||||
return;
|
||||
/*
|
||||
* Don't use PT_KILL, since the child will stop again with a PTS_EXIT.
|
||||
* Just hit him with SIGKILL (so he stops) and detach.
|
||||
*/
|
||||
kill (inferior_pid, SIGKILL);
|
||||
detach(SIGKILL);
|
||||
target_mourn_inferior ();
|
||||
}
|
||||
|
||||
/* Resume execution of the inferior process.
|
||||
If STEP is nonzero, single-step it.
|
||||
If SIGNAL is nonzero, give it that signal. */
|
||||
|
||||
void
|
||||
child_resume (pid, step, signal)
|
||||
int pid;
|
||||
int step;
|
||||
int signal;
|
||||
{
|
||||
errno = 0;
|
||||
|
||||
if (pid == -1)
|
||||
pid = inferior_pid;
|
||||
|
||||
/* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where
|
||||
it was. (If GDB wanted it to start some other way, we have already
|
||||
written a new PC value to the child.)
|
||||
|
||||
If this system does not support PT_SSTEP, a higher level function will
|
||||
have called single_step() to transmute the step request into a
|
||||
continue request (by setting breakpoints on all possible successor
|
||||
instructions), so we don't have to worry about that here. */
|
||||
|
||||
if (step)
|
||||
ptrace (PT_SSTEP, pid, (PTRACE_ARG3_TYPE) 1, signal);
|
||||
else
|
||||
ptrace (PT_CONTSIG, pid, (PTRACE_ARG3_TYPE) 1, signal);
|
||||
|
||||
if (errno)
|
||||
perror_with_name ("ptrace");
|
||||
}
|
||||
|
||||
#ifdef ATTACH_DETACH
|
||||
/* Start debugging the process whose number is PID. */
|
||||
int
|
||||
attach (pid)
|
||||
int pid;
|
||||
{
|
||||
sigset_t set;
|
||||
int rv;
|
||||
|
||||
rv = mptrace(XPT_DEBUG, pid, 0, 0);
|
||||
if (-1 == rv) {
|
||||
error("mptrace(XPT_DEBUG): %s", safe_strerror(errno));
|
||||
}
|
||||
rv = mptrace(XPT_SIGNAL, pid, 0, SIGSTOP);
|
||||
if (-1 == rv) {
|
||||
error("mptrace(XPT_SIGNAL): %s", safe_strerror(errno));
|
||||
}
|
||||
attach_flag = 1;
|
||||
return pid;
|
||||
}
|
||||
|
||||
void
|
||||
detach (signo)
|
||||
int signo;
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv = mptrace(XPT_UNDEBUG, inferior_pid, 1, signo);
|
||||
if (-1 == rv) {
|
||||
error("mptrace(XPT_UNDEBUG): %s", safe_strerror(errno));
|
||||
}
|
||||
attach_flag = 0;
|
||||
}
|
||||
|
||||
#endif /* ATTACH_DETACH */
|
||||
|
||||
/* Default the type of the ptrace transfer to int. */
|
||||
#ifndef PTRACE_XFER_TYPE
|
||||
#define PTRACE_XFER_TYPE int
|
||||
#endif
|
||||
|
||||
|
||||
/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
|
||||
in the NEW_SUN_PTRACE case.
|
||||
It ought to be straightforward. But it appears that writing did
|
||||
not write the data that I specified. I cannot understand where
|
||||
it got the data that it actually did write. */
|
||||
|
||||
/* Copy LEN bytes to or from inferior's memory starting at MEMADDR
|
||||
to debugger memory starting at MYADDR. Copy to inferior if
|
||||
WRITE is nonzero.
|
||||
|
||||
Returns the length copied, which is either the LEN argument or zero.
|
||||
This xfer function does not do partial moves, since child_ops
|
||||
doesn't allow memory operations to cross below us in the target stack
|
||||
anyway. */
|
||||
|
||||
int
|
||||
child_xfer_memory (memaddr, myaddr, len, write, target)
|
||||
CORE_ADDR memaddr;
|
||||
char *myaddr;
|
||||
int len;
|
||||
int write;
|
||||
struct target_ops *target; /* ignored */
|
||||
{
|
||||
register int i;
|
||||
/* Round starting address down to longword boundary. */
|
||||
register CORE_ADDR addr = memaddr & - sizeof (PTRACE_XFER_TYPE);
|
||||
/* Round ending address up; get number of longwords that makes. */
|
||||
register int count
|
||||
= (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
|
||||
/ sizeof (PTRACE_XFER_TYPE);
|
||||
/* Allocate buffer of that many longwords. */
|
||||
register PTRACE_XFER_TYPE *buffer
|
||||
= (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
|
||||
|
||||
if (write)
|
||||
{
|
||||
/* Fill start and end extra bytes of buffer with existing memory data. */
|
||||
|
||||
if (addr != memaddr || len < (int) sizeof (PTRACE_XFER_TYPE)) {
|
||||
/* Need part of initial word -- fetch it. */
|
||||
buffer[0] = ptrace (PT_RTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr,
|
||||
0);
|
||||
}
|
||||
|
||||
if (count > 1) /* FIXME, avoid if even boundary */
|
||||
{
|
||||
buffer[count - 1]
|
||||
= ptrace (PT_RTEXT, inferior_pid,
|
||||
((PTRACE_ARG3_TYPE)
|
||||
(addr + (count - 1) * sizeof (PTRACE_XFER_TYPE))),
|
||||
0);
|
||||
}
|
||||
|
||||
/* Copy data to be written over corresponding part of buffer */
|
||||
|
||||
memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
|
||||
myaddr,
|
||||
len);
|
||||
|
||||
/* Write the entire buffer. */
|
||||
|
||||
for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
|
||||
{
|
||||
errno = 0;
|
||||
ptrace (PT_WRITE_D, inferior_pid, (PTRACE_ARG3_TYPE) addr,
|
||||
buffer[i]);
|
||||
if (errno)
|
||||
{
|
||||
/* Using the appropriate one (I or D) is necessary for
|
||||
Gould NP1, at least. */
|
||||
errno = 0;
|
||||
ptrace (PT_WTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr,
|
||||
buffer[i]);
|
||||
}
|
||||
if (errno)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Read all the longwords */
|
||||
for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
|
||||
{
|
||||
errno = 0;
|
||||
buffer[i] = ptrace (PT_RTEXT, inferior_pid,
|
||||
(PTRACE_ARG3_TYPE) addr, 0);
|
||||
if (errno)
|
||||
return 0;
|
||||
QUIT;
|
||||
}
|
||||
|
||||
/* Copy appropriate bytes out of the buffer. */
|
||||
memcpy (myaddr,
|
||||
(char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
|
||||
len);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_initialize_symm_nat ()
|
||||
{
|
||||
/*
|
||||
* the MPDEBUGGER is necessary for process tree debugging and attach
|
||||
* to work, but it alters the behavior of debugged processes, so other
|
||||
* things (at least child_wait()) will have to change to accomodate
|
||||
* that.
|
||||
*
|
||||
* Note that attach is not implemented in dynix 3, and not in ptx
|
||||
* until version 2.1 of the OS.
|
||||
*/
|
||||
int rv;
|
||||
sigset_t set;
|
||||
struct sigaction sact;
|
||||
|
||||
rv = mptrace(XPT_MPDEBUGGER, 0, 0, 0);
|
||||
if (-1 == rv) {
|
||||
fatal("_initialize_symm_nat(): mptrace(XPT_MPDEBUGGER): %s",
|
||||
safe_strerror(errno));
|
||||
}
|
||||
|
||||
/*
|
||||
* Under MPDEBUGGER, we get SIGCLHD when a traced process does
|
||||
* anything of interest.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Block SIGCHLD. We leave it blocked all the time, and then
|
||||
* call sigsuspend() in child_wait() to wait for the child
|
||||
* to do something. None of these ought to fail, but check anyway.
|
||||
*/
|
||||
sigemptyset(&set);
|
||||
rv = sigaddset(&set, SIGCHLD);
|
||||
if (-1 == rv) {
|
||||
fatal("_initialize_symm_nat(): sigaddset(SIGCHLD): %s",
|
||||
safe_strerror(errno));
|
||||
}
|
||||
rv = sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
|
||||
if (-1 == rv) {
|
||||
fatal("_initialize_symm_nat(): sigprocmask(SIG_BLOCK): %s",
|
||||
safe_strerror(errno));
|
||||
}
|
||||
|
||||
sact.sa_handler = sigchld_handler;
|
||||
sigemptyset(&sact.sa_mask);
|
||||
sact.sa_flags = SA_NOCLDWAIT; /* keep the zombies away */
|
||||
rv = sigaction(SIGCHLD, &sact, (struct sigaction *)NULL);
|
||||
if (-1 == rv) {
|
||||
fatal("_initialize_symm_nat(): sigaction(SIGCHLD): %s",
|
||||
safe_strerror(errno));
|
||||
}
|
||||
}
|
||||
|
388
gdb/symm-tdep.c
388
gdb/symm-tdep.c
@ -1,5 +1,5 @@
|
||||
/* Sequent Symmetry target interface, for GDB when running under Unix.
|
||||
Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
|
||||
/* Sequent Symmetry target interface, for GDB.
|
||||
Copyright (C) 1986, 1987, 1989, 1991, 1994 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -33,79 +33,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include "gdbcore.h"
|
||||
#include <fcntl.h>
|
||||
|
||||
static long i386_get_frame_setup ();
|
||||
static i386_follow_jump ();
|
||||
|
||||
#include <sgtty.h>
|
||||
#define TERMINAL struct sgttyb
|
||||
|
||||
/* rounds 'one' up to divide evenly by 'two' */
|
||||
|
||||
int
|
||||
round(one,two)
|
||||
register int one, two;
|
||||
|
||||
{
|
||||
register int temp;
|
||||
temp = (one/two)*two;
|
||||
if (one != temp) {
|
||||
temp += two;
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
static CORE_ADDR codestream_next_addr;
|
||||
static CORE_ADDR codestream_addr;
|
||||
static unsigned char codestream_buf[sizeof (int)];
|
||||
static int codestream_off;
|
||||
static int codestream_cnt;
|
||||
|
||||
#define codestream_tell() (codestream_addr + codestream_off)
|
||||
#define codestream_peek() (codestream_cnt == 0 ? \
|
||||
codestream_fill(1): codestream_buf[codestream_off])
|
||||
#define codestream_get() (codestream_cnt-- == 0 ? \
|
||||
codestream_fill(0) : codestream_buf[codestream_off++])
|
||||
|
||||
|
||||
static unsigned char
|
||||
codestream_fill (peek_flag)
|
||||
{
|
||||
codestream_addr = codestream_next_addr;
|
||||
codestream_next_addr += sizeof (int);
|
||||
codestream_off = 0;
|
||||
codestream_cnt = sizeof (int);
|
||||
read_memory (codestream_addr,
|
||||
(unsigned char *)codestream_buf,
|
||||
sizeof (int));
|
||||
|
||||
if (peek_flag)
|
||||
return (codestream_peek());
|
||||
else
|
||||
return (codestream_get());
|
||||
}
|
||||
|
||||
static void
|
||||
codestream_seek (place)
|
||||
{
|
||||
codestream_next_addr = place & -sizeof (int);
|
||||
codestream_cnt = 0;
|
||||
codestream_fill (1);
|
||||
while (codestream_tell() != place)
|
||||
codestream_get ();
|
||||
}
|
||||
|
||||
static void
|
||||
codestream_read (buf, count)
|
||||
unsigned char *buf;
|
||||
{
|
||||
unsigned char *p;
|
||||
int i;
|
||||
p = buf;
|
||||
for (i = 0; i < count; i++)
|
||||
*p++ = codestream_get ();
|
||||
}
|
||||
|
||||
/*
|
||||
* Following macro translates i386 opcode register numbers to Symmetry
|
||||
* register numbers. This is used by FRAME_FIND_SAVED_REGS.
|
||||
@ -118,223 +45,6 @@ codestream_read (buf, count)
|
||||
#define I386_REGNO_TO_SYMMETRY(n) \
|
||||
((n)==0?0 :(n)==1?2 :(n)==2?1 :(n)==3?5 :(n)==4?14 :(n)==5?15 :(n))
|
||||
|
||||
/* from i386-dep.c */
|
||||
i386_frame_find_saved_regs (fip, fsrp)
|
||||
struct frame_info *fip;
|
||||
struct frame_saved_regs *fsrp;
|
||||
{
|
||||
unsigned long locals;
|
||||
unsigned char *p;
|
||||
unsigned char op;
|
||||
CORE_ADDR dummy_bottom;
|
||||
CORE_ADDR adr;
|
||||
int i;
|
||||
|
||||
memset (fsrp, 0, sizeof *fsrp);
|
||||
|
||||
/* if frame is the end of a dummy, compute where the
|
||||
* beginning would be
|
||||
*/
|
||||
dummy_bottom = fip->frame - 4 - NUM_REGS*4 - CALL_DUMMY_LENGTH;
|
||||
|
||||
/* check if the PC is in the stack, in a dummy frame */
|
||||
if (dummy_bottom <= fip->pc && fip->pc <= fip->frame)
|
||||
{
|
||||
/* all regs were saved by push_call_dummy () */
|
||||
adr = fip->frame - 4;
|
||||
for (i = 0; i < NUM_REGS; i++)
|
||||
{
|
||||
fsrp->regs[i] = adr;
|
||||
adr -= 4;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
locals = i386_get_frame_setup (get_pc_function_start (fip->pc));
|
||||
|
||||
if (locals >= 0)
|
||||
{
|
||||
adr = fip->frame - 4 - locals;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
op = codestream_get ();
|
||||
if (op < 0x50 || op > 0x57)
|
||||
break;
|
||||
fsrp->regs[I386_REGNO_TO_SYMMETRY(op - 0x50)] = adr;
|
||||
adr -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
fsrp->regs[PC_REGNUM] = fip->frame + 4;
|
||||
fsrp->regs[FP_REGNUM] = fip->frame;
|
||||
}
|
||||
|
||||
static long
|
||||
i386_get_frame_setup (pc)
|
||||
{
|
||||
unsigned char op;
|
||||
|
||||
codestream_seek (pc);
|
||||
|
||||
i386_follow_jump ();
|
||||
|
||||
op = codestream_get ();
|
||||
|
||||
if (op == 0x58) /* popl %eax */
|
||||
{
|
||||
/*
|
||||
* this function must start with
|
||||
*
|
||||
* popl %eax 0x58
|
||||
* xchgl %eax, (%esp) 0x87 0x04 0x24
|
||||
* or xchgl %eax, 0(%esp) 0x87 0x44 0x24 0x00
|
||||
*
|
||||
* (the system 5 compiler puts out the second xchg
|
||||
* inst, and the assembler doesn't try to optimize it,
|
||||
* so the 'sib' form gets generated)
|
||||
*
|
||||
* this sequence is used to get the address of the return
|
||||
* buffer for a function that returns a structure
|
||||
*/
|
||||
int pos;
|
||||
unsigned char buf[4];
|
||||
static unsigned char proto1[3] = { 0x87,0x04,0x24 };
|
||||
static unsigned char proto2[4] = { 0x87,0x44,0x24,0x00 };
|
||||
pos = codestream_tell ();
|
||||
codestream_read (buf, 4);
|
||||
if (memcmp (buf, proto1, 3) == 0)
|
||||
pos += 3;
|
||||
else if (memcmp (buf, proto2, 4) == 0)
|
||||
pos += 4;
|
||||
|
||||
codestream_seek (pos);
|
||||
op = codestream_get (); /* update next opcode */
|
||||
}
|
||||
|
||||
if (op == 0x55) /* pushl %esp */
|
||||
{
|
||||
if (codestream_get () != 0x8b) /* movl %esp, %ebp (2bytes) */
|
||||
return (-1);
|
||||
if (codestream_get () != 0xec)
|
||||
return (-1);
|
||||
/*
|
||||
* check for stack adjustment
|
||||
*
|
||||
* subl $XXX, %esp
|
||||
*
|
||||
* note: you can't subtract a 16 bit immediate
|
||||
* from a 32 bit reg, so we don't have to worry
|
||||
* about a data16 prefix
|
||||
*/
|
||||
op = codestream_peek ();
|
||||
if (op == 0x83) /* subl with 8 bit immed */
|
||||
{
|
||||
codestream_get ();
|
||||
if (codestream_get () != 0xec)
|
||||
return (-1);
|
||||
/* subl with signed byte immediate
|
||||
* (though it wouldn't make sense to be negative)
|
||||
*/
|
||||
return (codestream_get());
|
||||
}
|
||||
else if (op == 0x81) /* subl with 32 bit immed */
|
||||
{
|
||||
int locals;
|
||||
if (codestream_get () != 0xec)
|
||||
return (-1);
|
||||
/* subl with 32 bit immediate */
|
||||
codestream_read ((unsigned char *)&locals, 4);
|
||||
return (locals);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
else if (op == 0xc8)
|
||||
{
|
||||
/* enter instruction: arg is 16 unsigned immed */
|
||||
unsigned short slocals;
|
||||
codestream_read ((unsigned char *)&slocals, 2);
|
||||
codestream_get (); /* flush final byte of enter instruction */
|
||||
return (slocals);
|
||||
}
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* next instruction is a jump, move to target */
|
||||
static
|
||||
i386_follow_jump ()
|
||||
{
|
||||
int long_delta;
|
||||
short short_delta;
|
||||
char byte_delta;
|
||||
int data16;
|
||||
int pos;
|
||||
|
||||
pos = codestream_tell ();
|
||||
|
||||
data16 = 0;
|
||||
if (codestream_peek () == 0x66)
|
||||
{
|
||||
codestream_get ();
|
||||
data16 = 1;
|
||||
}
|
||||
|
||||
switch (codestream_get ())
|
||||
{
|
||||
case 0xe9:
|
||||
/* relative jump: if data16 == 0, disp32, else disp16 */
|
||||
if (data16)
|
||||
{
|
||||
codestream_read ((unsigned char *)&short_delta, 2);
|
||||
pos += short_delta + 3; /* include size of jmp inst */
|
||||
}
|
||||
else
|
||||
{
|
||||
codestream_read ((unsigned char *)&long_delta, 4);
|
||||
pos += long_delta + 5;
|
||||
}
|
||||
break;
|
||||
case 0xeb:
|
||||
/* relative jump, disp8 (ignore data16) */
|
||||
codestream_read ((unsigned char *)&byte_delta, 1);
|
||||
pos += byte_delta + 2;
|
||||
break;
|
||||
}
|
||||
codestream_seek (pos + data16);
|
||||
}
|
||||
|
||||
/* return pc of first real instruction */
|
||||
/* from i386-dep.c */
|
||||
|
||||
i386_skip_prologue (pc)
|
||||
{
|
||||
unsigned char op;
|
||||
int i;
|
||||
|
||||
if (i386_get_frame_setup (pc) < 0)
|
||||
return (pc);
|
||||
|
||||
/* found valid frame setup - codestream now points to
|
||||
* start of push instructions for saving registers
|
||||
*/
|
||||
|
||||
/* skip over register saves */
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
op = codestream_peek ();
|
||||
/* break if not pushl inst */
|
||||
if (op < 0x50 || op > 0x57)
|
||||
break;
|
||||
codestream_get ();
|
||||
}
|
||||
|
||||
i386_follow_jump ();
|
||||
|
||||
return (codestream_tell ());
|
||||
}
|
||||
|
||||
void
|
||||
symmetry_extract_return_value(type, regbuf, valbuf)
|
||||
struct type *type;
|
||||
@ -393,97 +103,3 @@ symmetry_extract_return_value(type, regbuf, valbuf)
|
||||
memcpy (valbuf, regbuf, TYPE_LENGTH (type));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _SEQUENT_ /* ptx, not dynix */
|
||||
/*
|
||||
* Convert compiler register number to gdb internal
|
||||
* register number. The PTX C compiler only really
|
||||
* puts things in %edi, %esi and %ebx, but it can't hurt
|
||||
* to be complete here.
|
||||
*/
|
||||
int
|
||||
ptx_coff_regno_to_gdb(regno)
|
||||
int regno;
|
||||
{
|
||||
return I386_REGNO_TO_SYMMETRY(regno);
|
||||
}
|
||||
|
||||
/* For ptx, the value in blockend will be meaningless. This function
|
||||
merely returns the proper offset given the register number. This
|
||||
is much easier, because under ptx, the upage is set up with the
|
||||
user struct on "top", and the registers "beneath" it (and thus defines
|
||||
TRAD_CORE_USER_OFFSET in bfd). */
|
||||
|
||||
/* The following table is for ptx 1.3. In theory it should not change with
|
||||
the OS version, but if it does we should (if possible) figure out a way
|
||||
to accept both the old and the new formats. */
|
||||
|
||||
static unsigned int reg_offsets[NUM_REGS] = {
|
||||
/*
|
||||
* u.u_ar0 = 0xfffff8d0
|
||||
* VA_UBLOCK = 0xffffe000
|
||||
* VA_UAREA = 0xfffff8e8
|
||||
* struct user at ublock offset 0x18e8
|
||||
* registers at ublock offset 0x18d0
|
||||
*/
|
||||
0x18d0, /* eax */
|
||||
0x18c8, /* eax */
|
||||
0x18cc, /* eax */
|
||||
0x1be0, /* st0 */
|
||||
0x1bea, /* st1 */
|
||||
0x18c4, /* ebx */
|
||||
0x18b8, /* esi */
|
||||
0x18b4, /* edi */
|
||||
0x1bf4, /* st2 */
|
||||
0x1bfe, /* st3 */
|
||||
0x1c08, /* st4 */
|
||||
0x1c12, /* st5 */
|
||||
0x1c1c, /* st6 */
|
||||
0x1c26, /* st7 */
|
||||
0x18e0, /* esp */
|
||||
0x18bc, /* ebp */
|
||||
0x18d4, /* eip */
|
||||
0x18dc, /* flags */
|
||||
0x1c38, /* fp1 */
|
||||
0x1c3c, /* fp2 */
|
||||
0x1c40, /* fp3 */
|
||||
0x1c44, /* fp4 */
|
||||
0x1c48, /* fp5 */
|
||||
0x1c4c, /* fp6 */
|
||||
0x1c50, /* fp7 */
|
||||
0x1c54, /* fp8 */
|
||||
0x1c58, /* fp9 */
|
||||
0x1c5c, /* fp10 */
|
||||
0x1c60, /* fp11 */
|
||||
0x1c64, /* fp12 */
|
||||
0x1c68, /* fp13 */
|
||||
0x1c6c, /* fp14 */
|
||||
0x1c70, /* fp15 */
|
||||
0x1c74, /* fp16 */
|
||||
0x1c78, /* fp17 */
|
||||
0x1c7c, /* fp18 */
|
||||
0x1c80, /* fp19 */
|
||||
0x1c84, /* fp20 */
|
||||
0x1c88, /* fp21 */
|
||||
0x1c8c, /* fp22 */
|
||||
0x1c90, /* fp23 */
|
||||
0x1c94, /* fp24 */
|
||||
0x1c98, /* fp25 */
|
||||
0x1c9c, /* fp26 */
|
||||
0x1ca0, /* fp27 */
|
||||
0x1ca4, /* fp28 */
|
||||
0x1ca8, /* fp29 */
|
||||
0x1cac, /* fp30 */
|
||||
0x1cb0, /* fp31 */
|
||||
};
|
||||
|
||||
unsigned int
|
||||
register_addr (regno, blockend)
|
||||
int regno, blockend;
|
||||
{
|
||||
if ((regno < 0) || (regno >= NUM_REGS)) {
|
||||
error("Invalid register number %d.", regno);
|
||||
}
|
||||
return reg_offsets[regno];
|
||||
}
|
||||
#endif /* _SEQUENT_ */
|
||||
|
@ -579,7 +579,12 @@ pop_target PARAMS ((void));
|
||||
struct section_table {
|
||||
CORE_ADDR addr; /* Lowest address in section */
|
||||
CORE_ADDR endaddr; /* 1+highest address in section */
|
||||
sec_ptr sec_ptr; /* BFD section pointer */
|
||||
|
||||
/* For the ptx compiler, we can't use the sec_ptr typedef when the field's
|
||||
name is sec_ptr. We really should rename the field (or better yet,
|
||||
the typedef should be bfd_sec_ptr). */
|
||||
struct sec *sec_ptr; /* BFD section pointer */
|
||||
|
||||
bfd *bfd; /* BFD file pointer */
|
||||
};
|
||||
|
||||
|
@ -72,7 +72,7 @@ whatis_exp (exp, show)
|
||||
int show;
|
||||
{
|
||||
struct expression *expr;
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
register struct cleanup *old_chain = NULL;
|
||||
|
||||
if (exp)
|
||||
@ -249,7 +249,7 @@ maintenance_print_type (typename, from_tty)
|
||||
char *typename;
|
||||
int from_tty;
|
||||
{
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
register struct type *type;
|
||||
register struct cleanup *old_chain;
|
||||
struct expression *expr;
|
||||
|
@ -60,8 +60,8 @@ set_output_radix PARAMS ((char *, int, struct cmd_list_element *));
|
||||
static void
|
||||
set_output_radix_1 PARAMS ((int, unsigned));
|
||||
|
||||
static void
|
||||
value_print_array_elements PARAMS ((value, GDB_FILE *, int, enum val_prettyprint));
|
||||
static void value_print_array_elements PARAMS ((value_ptr, GDB_FILE *, int,
|
||||
enum val_prettyprint));
|
||||
|
||||
/* Maximum number of chars to print for a string pointer value or vector
|
||||
contents, or UINT_MAX for no limit. Note that "set print elements 0"
|
||||
@ -158,7 +158,7 @@ val_print (type, valaddr, address, stream, format, deref_ref, recurse, pretty)
|
||||
|
||||
int
|
||||
value_print (val, stream, format, pretty)
|
||||
value val;
|
||||
value_ptr val;
|
||||
GDB_FILE *stream;
|
||||
int format;
|
||||
enum val_prettyprint pretty;
|
||||
@ -650,7 +650,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
|
||||
|
||||
static void
|
||||
value_print_array_elements (val, stream, format, pretty)
|
||||
value val;
|
||||
value_ptr val;
|
||||
GDB_FILE *stream;
|
||||
int format;
|
||||
enum val_prettyprint pretty;
|
||||
|
261
gdb/value.h
261
gdb/value.h
@ -109,7 +109,7 @@ struct value
|
||||
|
||||
};
|
||||
|
||||
typedef struct value *value;
|
||||
typedef struct value *value_ptr;
|
||||
|
||||
#define VALUE_TYPE(val) (val)->type
|
||||
#define VALUE_LAZY(val) (val)->lazy
|
||||
@ -123,8 +123,7 @@ typedef struct value *value;
|
||||
#define VALUE_CONTENTS_RAW(val) ((char *) (val)->aligner.contents)
|
||||
#define VALUE_CONTENTS(val) ((void)(VALUE_LAZY(val) && value_fetch_lazy(val)),\
|
||||
VALUE_CONTENTS_RAW(val))
|
||||
extern int
|
||||
value_fetch_lazy PARAMS ((value val));
|
||||
extern int value_fetch_lazy PARAMS ((value_ptr val));
|
||||
|
||||
#define VALUE_LVAL(val) (val)->lval
|
||||
#define VALUE_ADDRESS(val) (val)->location.address
|
||||
@ -180,7 +179,7 @@ struct internalvar
|
||||
{
|
||||
struct internalvar *next;
|
||||
char *name;
|
||||
value value;
|
||||
value_ptr value;
|
||||
};
|
||||
|
||||
/* Pointer to member function. Depends on compiler implementation. */
|
||||
@ -202,222 +201,198 @@ struct fn_field;
|
||||
extern void
|
||||
print_address_demangle PARAMS ((CORE_ADDR, GDB_FILE *, int));
|
||||
|
||||
extern LONGEST
|
||||
value_as_long PARAMS ((value val));
|
||||
extern LONGEST value_as_long PARAMS ((value_ptr val));
|
||||
|
||||
extern double
|
||||
value_as_double PARAMS ((value val));
|
||||
extern double value_as_double PARAMS ((value_ptr val));
|
||||
|
||||
extern CORE_ADDR
|
||||
value_as_pointer PARAMS ((value val));
|
||||
extern CORE_ADDR value_as_pointer PARAMS ((value_ptr val));
|
||||
|
||||
extern LONGEST
|
||||
unpack_long PARAMS ((struct type *type, char *valaddr));
|
||||
extern LONGEST unpack_long PARAMS ((struct type *type, char *valaddr));
|
||||
|
||||
extern double
|
||||
unpack_double PARAMS ((struct type *type, char *valaddr, int *invp));
|
||||
extern double unpack_double PARAMS ((struct type *type, char *valaddr,
|
||||
int *invp));
|
||||
|
||||
extern CORE_ADDR unpack_pointer PARAMS ((struct type *type, char *valaddr));
|
||||
|
||||
extern LONGEST unpack_field_as_long PARAMS ((struct type *type, char *valaddr,
|
||||
int fieldno));
|
||||
|
||||
extern value value_from_longest PARAMS ((struct type *type, LONGEST num));
|
||||
extern value_ptr value_from_longest PARAMS ((struct type *type, LONGEST num));
|
||||
|
||||
extern value value_from_double PARAMS ((struct type *type, double num));
|
||||
extern value_ptr value_from_double PARAMS ((struct type *type, double num));
|
||||
|
||||
extern value value_at PARAMS ((struct type *type, CORE_ADDR addr));
|
||||
extern value_ptr value_at PARAMS ((struct type *type, CORE_ADDR addr));
|
||||
|
||||
extern value value_at_lazy PARAMS ((struct type *type, CORE_ADDR addr));
|
||||
extern value_ptr value_at_lazy PARAMS ((struct type *type, CORE_ADDR addr));
|
||||
|
||||
/* FIXME: Assumes equivalence of "struct frame_info *" and "FRAME" */
|
||||
extern value value_from_register PARAMS ((struct type *type, int regnum,
|
||||
extern value_ptr value_from_register PARAMS ((struct type *type, int regnum,
|
||||
struct frame_info * frame));
|
||||
|
||||
extern value value_of_variable PARAMS ((struct symbol *var, struct block *b));
|
||||
extern value_ptr value_of_variable PARAMS ((struct symbol *var,
|
||||
struct block *b));
|
||||
|
||||
extern value value_of_register PARAMS ((int regnum));
|
||||
extern value_ptr value_of_register PARAMS ((int regnum));
|
||||
|
||||
extern int symbol_read_needs_frame PARAMS ((struct symbol *));
|
||||
|
||||
/* FIXME: Assumes equivalence of "struct frame_info *" and "FRAME" */
|
||||
extern value read_var_value PARAMS ((struct symbol *var,
|
||||
struct frame_info *frame));
|
||||
extern value_ptr read_var_value PARAMS ((struct symbol *var,
|
||||
struct frame_info *frame));
|
||||
|
||||
/* FIXME: Assumes equivalence of "struct frame_info *" and "FRAME" */
|
||||
extern value locate_var_value PARAMS ((struct symbol *var,
|
||||
extern value_ptr locate_var_value PARAMS ((struct symbol *var,
|
||||
struct frame_info *frame));
|
||||
|
||||
extern value allocate_value PARAMS ((struct type *type));
|
||||
extern value_ptr allocate_value PARAMS ((struct type *type));
|
||||
|
||||
extern value allocate_repeat_value PARAMS ((struct type *type, int count));
|
||||
extern value_ptr allocate_repeat_value PARAMS ((struct type *type, int count));
|
||||
|
||||
extern value value_mark PARAMS ((void));
|
||||
extern value_ptr value_mark PARAMS ((void));
|
||||
|
||||
extern void value_free_to_mark PARAMS ((value mark));
|
||||
extern void value_free_to_mark PARAMS ((value_ptr mark));
|
||||
|
||||
extern value value_string PARAMS ((char *ptr, int len));
|
||||
extern value_ptr value_string PARAMS ((char *ptr, int len));
|
||||
|
||||
extern value value_array PARAMS ((int lowbound, int highbound,
|
||||
value *elemvec));
|
||||
extern value_ptr value_array PARAMS ((int lowbound, int highbound,
|
||||
value_ptr *elemvec));
|
||||
|
||||
extern value value_concat PARAMS ((value arg1, value arg2));
|
||||
extern value_ptr value_concat PARAMS ((value_ptr arg1, value_ptr arg2));
|
||||
|
||||
extern value value_binop PARAMS ((value arg1, value arg2, enum exp_opcode op));
|
||||
extern value_ptr value_binop PARAMS ((value_ptr arg1, value_ptr arg2,
|
||||
enum exp_opcode op));
|
||||
|
||||
extern value value_add PARAMS ((value arg1, value arg2));
|
||||
extern value_ptr value_add PARAMS ((value_ptr arg1, value_ptr arg2));
|
||||
|
||||
extern value value_sub PARAMS ((value arg1, value arg2));
|
||||
extern value_ptr value_sub PARAMS ((value_ptr arg1, value_ptr arg2));
|
||||
|
||||
extern value value_coerce_array PARAMS ((value arg1));
|
||||
extern value_ptr value_coerce_array PARAMS ((value_ptr arg1));
|
||||
|
||||
extern value value_coerce_function PARAMS ((value arg1));
|
||||
extern value_ptr value_coerce_function PARAMS ((value_ptr arg1));
|
||||
|
||||
extern value value_ind PARAMS ((value arg1));
|
||||
extern value_ptr value_ind PARAMS ((value_ptr arg1));
|
||||
|
||||
extern value value_addr PARAMS ((value arg1));
|
||||
extern value_ptr value_addr PARAMS ((value_ptr arg1));
|
||||
|
||||
extern value value_assign PARAMS ((value toval, value fromval));
|
||||
extern value_ptr value_assign PARAMS ((value_ptr toval, value_ptr fromval));
|
||||
|
||||
extern value value_neg PARAMS ((value arg1));
|
||||
extern value_ptr value_neg PARAMS ((value_ptr arg1));
|
||||
|
||||
extern value value_complement PARAMS ((value arg1));
|
||||
extern value_ptr value_complement PARAMS ((value_ptr arg1));
|
||||
|
||||
extern value value_struct_elt PARAMS ((value *argp, value *args, char *name,
|
||||
int *static_memfuncp, char *err));
|
||||
extern value_ptr value_struct_elt PARAMS ((value_ptr *argp, value *args,
|
||||
char *name,
|
||||
int *static_memfuncp, char *err));
|
||||
|
||||
extern value value_struct_elt_for_reference PARAMS ((struct type *domain,
|
||||
int offset,
|
||||
struct type *curtype,
|
||||
char *name,
|
||||
struct type *intype));
|
||||
extern value_ptr value_struct_elt_for_reference PARAMS ((struct type *domain,
|
||||
int offset,
|
||||
struct type *curtype,
|
||||
char *name,
|
||||
struct type *intype));
|
||||
|
||||
extern value value_field PARAMS ((value arg1, int fieldno));
|
||||
extern value_ptr value_field PARAMS ((value_ptr arg1, int fieldno));
|
||||
|
||||
extern value value_primitive_field PARAMS ((value arg1, int offset,
|
||||
int fieldno,
|
||||
struct type *arg_type));
|
||||
extern value_ptr value_primitive_field PARAMS ((value_ptr arg1, int offset,
|
||||
int fieldno,
|
||||
struct type *arg_type));
|
||||
|
||||
extern value value_cast PARAMS ((struct type *type, value arg2));
|
||||
extern value_ptr value_cast PARAMS ((struct type *type, value_ptr arg2));
|
||||
|
||||
extern value value_zero PARAMS ((struct type *type, enum lval_type lv));
|
||||
extern value_ptr value_zero PARAMS ((struct type *type, enum lval_type lv));
|
||||
|
||||
extern value value_repeat PARAMS ((value arg1, int count));
|
||||
extern value_ptr value_repeat PARAMS ((value_ptr arg1, int count));
|
||||
|
||||
extern value value_subscript PARAMS ((value array, value idx));
|
||||
extern value_ptr value_subscript PARAMS ((value_ptr array, value_ptr idx));
|
||||
|
||||
extern value value_from_vtable_info PARAMS ((value arg, struct type *type));
|
||||
extern value_ptr value_from_vtable_info PARAMS ((value_ptr arg,
|
||||
struct type *type));
|
||||
|
||||
extern value value_being_returned PARAMS ((struct type *valtype,
|
||||
char retbuf[REGISTER_BYTES],
|
||||
int struct_return));
|
||||
extern value_ptr value_being_returned PARAMS ((struct type *valtype,
|
||||
char retbuf[REGISTER_BYTES],
|
||||
int struct_return));
|
||||
|
||||
extern value value_in PARAMS ((value element, value set));
|
||||
extern value_ptr value_in PARAMS ((value_ptr element, value_ptr set));
|
||||
|
||||
extern int value_bit_index PARAMS ((struct type *type, char *addr, int index));
|
||||
|
||||
extern int
|
||||
using_struct_return PARAMS ((value function, CORE_ADDR funcaddr,
|
||||
struct type *value_type, int gcc_p));
|
||||
extern int using_struct_return PARAMS ((value_ptr function, CORE_ADDR funcaddr,
|
||||
struct type *value_type, int gcc_p));
|
||||
|
||||
extern void
|
||||
set_return_value PARAMS ((value val));
|
||||
extern void set_return_value PARAMS ((value_ptr val));
|
||||
|
||||
extern value
|
||||
evaluate_expression PARAMS ((struct expression *exp));
|
||||
extern value_ptr evaluate_expression PARAMS ((struct expression *exp));
|
||||
|
||||
extern value
|
||||
evaluate_type PARAMS ((struct expression *exp));
|
||||
extern value_ptr evaluate_type PARAMS ((struct expression *exp));
|
||||
|
||||
extern value
|
||||
parse_and_eval PARAMS ((char *exp));
|
||||
extern value_ptr parse_and_eval PARAMS ((char *exp));
|
||||
|
||||
extern value
|
||||
parse_to_comma_and_eval PARAMS ((char **expp));
|
||||
extern value_ptr parse_to_comma_and_eval PARAMS ((char **expp));
|
||||
|
||||
extern struct type *
|
||||
parse_and_eval_type PARAMS ((char *p, int length));
|
||||
extern struct type *parse_and_eval_type PARAMS ((char *p, int length));
|
||||
|
||||
extern CORE_ADDR
|
||||
parse_and_eval_address PARAMS ((char *exp));
|
||||
extern CORE_ADDR parse_and_eval_address PARAMS ((char *exp));
|
||||
|
||||
extern CORE_ADDR
|
||||
parse_and_eval_address_1 PARAMS ((char **expptr));
|
||||
extern CORE_ADDR parse_and_eval_address_1 PARAMS ((char **expptr));
|
||||
|
||||
extern value
|
||||
access_value_history PARAMS ((int num));
|
||||
extern value_ptr access_value_history PARAMS ((int num));
|
||||
|
||||
extern value
|
||||
value_of_internalvar PARAMS ((struct internalvar *var));
|
||||
extern value_ptr value_of_internalvar PARAMS ((struct internalvar *var));
|
||||
|
||||
extern void
|
||||
set_internalvar PARAMS ((struct internalvar *var, value val));
|
||||
extern void set_internalvar PARAMS ((struct internalvar *var, value_ptr val));
|
||||
|
||||
extern void
|
||||
set_internalvar_component PARAMS ((struct internalvar *var, int offset,
|
||||
int bitpos, int bitsize,
|
||||
value newvalue));
|
||||
extern void set_internalvar_component PARAMS ((struct internalvar *var,
|
||||
int offset,
|
||||
int bitpos, int bitsize,
|
||||
value_ptr newvalue));
|
||||
|
||||
extern struct internalvar *
|
||||
lookup_internalvar PARAMS ((char *name));
|
||||
extern struct internalvar *lookup_internalvar PARAMS ((char *name));
|
||||
|
||||
extern int
|
||||
value_equal PARAMS ((value arg1, value arg2));
|
||||
extern int value_equal PARAMS ((value_ptr arg1, value_ptr arg2));
|
||||
|
||||
extern int
|
||||
value_less PARAMS ((value arg1, value arg2));
|
||||
extern int value_less PARAMS ((value_ptr arg1, value_ptr arg2));
|
||||
|
||||
extern int
|
||||
value_logical_not PARAMS ((value arg1));
|
||||
extern int value_logical_not PARAMS ((value_ptr arg1));
|
||||
|
||||
/* C++ */
|
||||
|
||||
extern value
|
||||
value_of_this PARAMS ((int complain));
|
||||
extern value_ptr value_of_this PARAMS ((int complain));
|
||||
|
||||
extern value
|
||||
value_x_binop PARAMS ((value arg1, value arg2, enum exp_opcode op,
|
||||
enum exp_opcode otherop));
|
||||
extern value_ptr value_x_binop PARAMS ((value_ptr arg1, value_ptr arg2,
|
||||
enum exp_opcode op,
|
||||
enum exp_opcode otherop));
|
||||
|
||||
extern value
|
||||
value_x_unop PARAMS ((value arg1, enum exp_opcode op));
|
||||
extern value_ptr value_x_unop PARAMS ((value_ptr arg1, enum exp_opcode op));
|
||||
|
||||
extern value
|
||||
value_fn_field PARAMS ((value *arg1p, struct fn_field *f, int j,
|
||||
struct type* type, int offset));
|
||||
extern value_ptr value_fn_field PARAMS ((value_ptr *arg1p, struct fn_field *f,
|
||||
int j,
|
||||
struct type* type, int offset));
|
||||
|
||||
extern value
|
||||
value_virtual_fn_field PARAMS ((value *arg1p, struct fn_field *f, int j,
|
||||
struct type *type, int offset));
|
||||
extern value_ptr value_virtual_fn_field PARAMS ((value_ptr *arg1p,
|
||||
struct fn_field *f, int j,
|
||||
struct type *type,
|
||||
int offset));
|
||||
|
||||
extern int
|
||||
binop_user_defined_p PARAMS ((enum exp_opcode op, value arg1, value arg2));
|
||||
extern int binop_user_defined_p PARAMS ((enum exp_opcode op,
|
||||
value_ptr arg1, value_ptr arg2));
|
||||
|
||||
extern int
|
||||
unop_user_defined_p PARAMS ((enum exp_opcode op, value arg1));
|
||||
extern int unop_user_defined_p PARAMS ((enum exp_opcode op, value_ptr arg1));
|
||||
|
||||
extern int
|
||||
destructor_name_p PARAMS ((const char *name, const struct type *type));
|
||||
extern int destructor_name_p PARAMS ((const char *name,
|
||||
const struct type *type));
|
||||
|
||||
#define value_free(val) free ((PTR)val)
|
||||
|
||||
extern void
|
||||
free_all_values PARAMS ((void));
|
||||
extern void free_all_values PARAMS ((void));
|
||||
|
||||
extern void
|
||||
release_value PARAMS ((value val));
|
||||
extern void release_value PARAMS ((value_ptr val));
|
||||
|
||||
extern int
|
||||
record_latest_value PARAMS ((value val));
|
||||
extern int record_latest_value PARAMS ((value_ptr val));
|
||||
|
||||
extern void
|
||||
registers_changed PARAMS ((void));
|
||||
extern void registers_changed PARAMS ((void));
|
||||
|
||||
extern void
|
||||
read_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
||||
extern void read_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
||||
|
||||
extern void
|
||||
write_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
||||
extern void write_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
||||
|
||||
extern void
|
||||
read_register_gen PARAMS ((int regno, char *myaddr));
|
||||
@ -444,9 +419,9 @@ extern void
|
||||
type_print PARAMS ((struct type *type, char *varstring, GDB_FILE *stream,
|
||||
int show));
|
||||
|
||||
extern char *
|
||||
baseclass_addr PARAMS ((struct type *type, int index, char *valaddr,
|
||||
value *valuep, int *errp));
|
||||
extern char *baseclass_addr PARAMS ((struct type *type, int index,
|
||||
char *valaddr,
|
||||
value_ptr *valuep, int *errp));
|
||||
|
||||
extern void
|
||||
print_longest PARAMS ((GDB_FILE *stream, int format, int use_local,
|
||||
@ -455,9 +430,8 @@ print_longest PARAMS ((GDB_FILE *stream, int format, int use_local,
|
||||
extern void
|
||||
print_floating PARAMS ((char *valaddr, struct type *type, GDB_FILE *stream));
|
||||
|
||||
extern int
|
||||
value_print PARAMS ((value val, GDB_FILE *stream, int format,
|
||||
enum val_prettyprint pretty));
|
||||
extern int value_print PARAMS ((value_ptr val, GDB_FILE *stream, int format,
|
||||
enum val_prettyprint pretty));
|
||||
|
||||
extern int
|
||||
val_print PARAMS ((struct type *type, char *valaddr, CORE_ADDR address,
|
||||
@ -472,11 +446,9 @@ extern void
|
||||
print_variable_value PARAMS ((struct symbol *var, struct frame_info *frame,
|
||||
GDB_FILE *stream));
|
||||
|
||||
extern value
|
||||
value_arg_coerce PARAMS ((value));
|
||||
extern value_ptr value_arg_coerce PARAMS ((value_ptr));
|
||||
|
||||
extern int
|
||||
check_field PARAMS ((value, const char *));
|
||||
extern int check_field PARAMS ((value_ptr, const char *));
|
||||
|
||||
extern void
|
||||
c_typedef_print PARAMS ((struct type *type, struct symbol *new, GDB_FILE *stream));
|
||||
@ -492,15 +464,12 @@ clear_internalvars PARAMS ((void));
|
||||
|
||||
/* From values.c */
|
||||
|
||||
extern value
|
||||
value_copy PARAMS ((value));
|
||||
extern value_ptr value_copy PARAMS ((value_ptr));
|
||||
|
||||
extern int
|
||||
baseclass_offset PARAMS ((struct type *, int, value, int));
|
||||
extern int baseclass_offset PARAMS ((struct type *, int, value_ptr, int));
|
||||
|
||||
/* From valops.c */
|
||||
|
||||
extern value
|
||||
call_function_by_hand PARAMS ((value, int, value *));
|
||||
extern value_ptr call_function_by_hand PARAMS ((value_ptr, int, value_ptr *));
|
||||
|
||||
#endif /* !defined (VALUE_H) */
|
||||
|
128
gdb/values.c
128
gdb/values.c
@ -31,14 +31,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Local function prototypes. */
|
||||
|
||||
static value
|
||||
value_headof PARAMS ((value, struct type *, struct type *));
|
||||
static value_ptr value_headof PARAMS ((value, struct type *, struct type *));
|
||||
|
||||
static void
|
||||
show_values PARAMS ((char *, int));
|
||||
static void show_values PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
show_convenience PARAMS ((char *, int));
|
||||
static void show_convenience PARAMS ((char *, int));
|
||||
|
||||
/* The value-history records all the values printed
|
||||
by print commands during this session. Each chunk
|
||||
@ -51,7 +48,7 @@ show_convenience PARAMS ((char *, int));
|
||||
struct value_history_chunk
|
||||
{
|
||||
struct value_history_chunk *next;
|
||||
value values[VALUE_HISTORY_CHUNK];
|
||||
value_ptr values[VALUE_HISTORY_CHUNK];
|
||||
};
|
||||
|
||||
/* Chain of chunks now in use. */
|
||||
@ -64,19 +61,19 @@ static int value_history_count; /* Abs number of last entry stored */
|
||||
(except for those released by calls to release_value)
|
||||
This is so they can be freed after each command. */
|
||||
|
||||
static value all_values;
|
||||
static value_ptr all_values;
|
||||
|
||||
/* Allocate a value that has the correct length for type TYPE. */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
allocate_value (type)
|
||||
struct type *type;
|
||||
{
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
|
||||
check_stub_type (type);
|
||||
|
||||
val = (value) xmalloc (sizeof (struct value) + TYPE_LENGTH (type));
|
||||
val = (struct value *) xmalloc (sizeof (struct value) + TYPE_LENGTH (type));
|
||||
VALUE_NEXT (val) = all_values;
|
||||
all_values = val;
|
||||
VALUE_TYPE (val) = type;
|
||||
@ -98,14 +95,15 @@ allocate_value (type)
|
||||
/* Allocate a value that has the correct length
|
||||
for COUNT repetitions type TYPE. */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
allocate_repeat_value (type, count)
|
||||
struct type *type;
|
||||
int count;
|
||||
{
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
|
||||
val = (value) xmalloc (sizeof (struct value) + TYPE_LENGTH (type) * count);
|
||||
val =
|
||||
(value_ptr) xmalloc (sizeof (struct value) + TYPE_LENGTH (type) * count);
|
||||
VALUE_NEXT (val) = all_values;
|
||||
all_values = val;
|
||||
VALUE_TYPE (val) = type;
|
||||
@ -126,7 +124,7 @@ allocate_repeat_value (type, count)
|
||||
/* Return a mark in the value chain. All values allocated after the
|
||||
mark is obtained (except for those released) are subject to being freed
|
||||
if a subsequent value_free_to_mark is passed the mark. */
|
||||
value
|
||||
value_ptr
|
||||
value_mark ()
|
||||
{
|
||||
return all_values;
|
||||
@ -136,9 +134,9 @@ value_mark ()
|
||||
(except for those released). */
|
||||
void
|
||||
value_free_to_mark (mark)
|
||||
value mark;
|
||||
value_ptr mark;
|
||||
{
|
||||
value val, next;
|
||||
value_ptr val, next;
|
||||
|
||||
for (val = all_values; val && val != mark; val = next)
|
||||
{
|
||||
@ -154,7 +152,7 @@ value_free_to_mark (mark)
|
||||
void
|
||||
free_all_values ()
|
||||
{
|
||||
register value val, next;
|
||||
register value_ptr val, next;
|
||||
|
||||
for (val = all_values; val; val = next)
|
||||
{
|
||||
@ -170,9 +168,9 @@ free_all_values ()
|
||||
|
||||
void
|
||||
release_value (val)
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
{
|
||||
register value v;
|
||||
register value_ptr v;
|
||||
|
||||
if (all_values == val)
|
||||
{
|
||||
@ -194,11 +192,11 @@ release_value (val)
|
||||
It contains the same contents, for same memory address,
|
||||
but it's a different block of storage. */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_copy (arg)
|
||||
value arg;
|
||||
value_ptr arg;
|
||||
{
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
register struct type *type = VALUE_TYPE (arg);
|
||||
if (VALUE_REPEATED (arg))
|
||||
val = allocate_repeat_value (type, VALUE_REPETITIONS (arg));
|
||||
@ -230,7 +228,7 @@ value_copy (arg)
|
||||
|
||||
int
|
||||
record_latest_value (val)
|
||||
value val;
|
||||
value_ptr val;
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -278,7 +276,7 @@ record_latest_value (val)
|
||||
|
||||
/* Return a copy of the value in the history with sequence number NUM. */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
access_value_history (num)
|
||||
int num;
|
||||
{
|
||||
@ -322,7 +320,7 @@ clear_value_history ()
|
||||
{
|
||||
register struct value_history_chunk *next;
|
||||
register int i;
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
|
||||
while (value_history_chain)
|
||||
{
|
||||
@ -342,7 +340,7 @@ show_values (num_exp, from_tty)
|
||||
int from_tty;
|
||||
{
|
||||
register int i;
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
static int num = 1;
|
||||
|
||||
if (num_exp)
|
||||
@ -414,11 +412,11 @@ lookup_internalvar (name)
|
||||
return var;
|
||||
}
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_of_internalvar (var)
|
||||
struct internalvar *var;
|
||||
{
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
|
||||
#ifdef IS_TRAPPED_INTERNALVAR
|
||||
if (IS_TRAPPED_INTERNALVAR (var->name))
|
||||
@ -437,7 +435,7 @@ void
|
||||
set_internalvar_component (var, offset, bitpos, bitsize, newval)
|
||||
struct internalvar *var;
|
||||
int offset, bitpos, bitsize;
|
||||
value newval;
|
||||
value_ptr newval;
|
||||
{
|
||||
register char *addr = VALUE_CONTENTS (var->value) + offset;
|
||||
|
||||
@ -456,7 +454,7 @@ set_internalvar_component (var, offset, bitpos, bitsize, newval)
|
||||
void
|
||||
set_internalvar (var, val)
|
||||
struct internalvar *var;
|
||||
value val;
|
||||
value_ptr val;
|
||||
{
|
||||
#ifdef IS_TRAPPED_INTERNALVAR
|
||||
if (IS_TRAPPED_INTERNALVAR (var->name))
|
||||
@ -533,7 +531,7 @@ use \"set\" as in \"set $foo = 5\" to define them.\n");
|
||||
|
||||
LONGEST
|
||||
value_as_long (val)
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
{
|
||||
/* This coerces arrays and functions, which is necessary (e.g.
|
||||
in disassemble_command). It also dereferences references, which
|
||||
@ -545,7 +543,7 @@ value_as_long (val)
|
||||
|
||||
double
|
||||
value_as_double (val)
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
{
|
||||
double foo;
|
||||
int inv;
|
||||
@ -559,7 +557,7 @@ value_as_double (val)
|
||||
Does not deallocate the value. */
|
||||
CORE_ADDR
|
||||
value_as_pointer (val)
|
||||
value val;
|
||||
value_ptr val;
|
||||
{
|
||||
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
|
||||
whether we want this to be true eventually. */
|
||||
@ -696,14 +694,14 @@ unpack_pointer (type, valaddr)
|
||||
|
||||
For C++, must also be able to return values from static fields */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_primitive_field (arg1, offset, fieldno, arg_type)
|
||||
register value arg1;
|
||||
register value_ptr arg1;
|
||||
int offset;
|
||||
register int fieldno;
|
||||
register struct type *arg_type;
|
||||
{
|
||||
register value v;
|
||||
register value_ptr v;
|
||||
register struct type *type;
|
||||
|
||||
check_stub_type (arg_type);
|
||||
@ -744,9 +742,9 @@ value_primitive_field (arg1, offset, fieldno, arg_type)
|
||||
|
||||
For C++, must also be able to return values from static fields */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_field (arg1, fieldno)
|
||||
register value arg1;
|
||||
register value_ptr arg1;
|
||||
register int fieldno;
|
||||
{
|
||||
return value_primitive_field (arg1, 0, fieldno, VALUE_TYPE (arg1));
|
||||
@ -756,22 +754,22 @@ value_field (arg1, fieldno)
|
||||
F is the list of member functions which contains the desired method.
|
||||
J is an index into F which provides the desired method. */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_fn_field (arg1p, f, j, type, offset)
|
||||
value *arg1p;
|
||||
value_ptr *arg1p;
|
||||
struct fn_field *f;
|
||||
int j;
|
||||
struct type *type;
|
||||
int offset;
|
||||
{
|
||||
register value v;
|
||||
register value_ptr v;
|
||||
register struct type *ftype = TYPE_FN_FIELD_TYPE (f, j);
|
||||
struct symbol *sym;
|
||||
|
||||
sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
|
||||
0, VAR_NAMESPACE, 0, NULL);
|
||||
if (! sym)
|
||||
return (value)NULL;
|
||||
return NULL;
|
||||
/*
|
||||
error ("Internal error: could not find physical method named %s",
|
||||
TYPE_FN_FIELD_PHYSNAME (f, j));
|
||||
@ -803,22 +801,22 @@ value_fn_field (arg1p, f, j, type, offset)
|
||||
J is an index into F which provides the desired virtual function.
|
||||
|
||||
TYPE is the type in which F is located. */
|
||||
value
|
||||
value_ptr
|
||||
value_virtual_fn_field (arg1p, f, j, type, offset)
|
||||
value *arg1p;
|
||||
value_ptr *arg1p;
|
||||
struct fn_field *f;
|
||||
int j;
|
||||
struct type *type;
|
||||
int offset;
|
||||
{
|
||||
value arg1 = *arg1p;
|
||||
value_ptr arg1 = *arg1p;
|
||||
/* First, get the virtual function table pointer. That comes
|
||||
with a strange type, so cast it to type `pointer to long' (which
|
||||
should serve just fine as a function type). Then, index into
|
||||
the table, and convert final value to appropriate function type. */
|
||||
value entry, vfn, vtbl;
|
||||
value vi = value_from_longest (builtin_type_int,
|
||||
(LONGEST) TYPE_FN_FIELD_VOFFSET (f, j));
|
||||
value_ptr entry, vfn, vtbl;
|
||||
value_ptr vi = value_from_longest (builtin_type_int,
|
||||
(LONGEST) TYPE_FN_FIELD_VOFFSET (f, j));
|
||||
struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
|
||||
struct type *context;
|
||||
if (fcontext == NULL)
|
||||
@ -879,14 +877,14 @@ value_virtual_fn_field (arg1p, f, j, type, offset)
|
||||
|
||||
FIXME-tiemann: should work with dossier entries as well. */
|
||||
|
||||
static value
|
||||
static value_ptr
|
||||
value_headof (in_arg, btype, dtype)
|
||||
value in_arg;
|
||||
value_ptr in_arg;
|
||||
struct type *btype, *dtype;
|
||||
{
|
||||
/* First collect the vtables we must look at for this object. */
|
||||
/* FIXME-tiemann: right now, just look at top-most vtable. */
|
||||
value arg, vtbl, entry, best_entry = 0;
|
||||
value_ptr arg, vtbl, entry, best_entry = 0;
|
||||
int i, nelems;
|
||||
int offset, best_offset = 0;
|
||||
struct symbol *sym;
|
||||
@ -968,9 +966,9 @@ value_headof (in_arg, btype, dtype)
|
||||
of its baseclasses) to figure out the most derived type that ARG
|
||||
could actually be a pointer to. */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_from_vtable_info (arg, type)
|
||||
value arg;
|
||||
value_ptr arg;
|
||||
struct type *type;
|
||||
{
|
||||
/* Take care of preliminaries. */
|
||||
@ -1043,7 +1041,7 @@ int
|
||||
baseclass_offset (type, index, arg, offset)
|
||||
struct type *type;
|
||||
int index;
|
||||
value arg;
|
||||
value_ptr arg;
|
||||
int offset;
|
||||
{
|
||||
struct type *basetype = TYPE_BASECLASS (type, index);
|
||||
@ -1105,7 +1103,7 @@ baseclass_addr (type, index, valaddr, valuep, errp)
|
||||
struct type *type;
|
||||
int index;
|
||||
char *valaddr;
|
||||
value *valuep;
|
||||
value_ptr *valuep;
|
||||
int *errp;
|
||||
{
|
||||
struct type *basetype = TYPE_BASECLASS (type, index);
|
||||
@ -1125,7 +1123,7 @@ baseclass_addr (type, index, valaddr, valuep, errp)
|
||||
{
|
||||
if (vb_match (type, i, basetype))
|
||||
{
|
||||
value val = allocate_value (basetype);
|
||||
value_ptr val = allocate_value (basetype);
|
||||
CORE_ADDR addr;
|
||||
int status;
|
||||
|
||||
@ -1275,12 +1273,12 @@ modify_field (addr, fieldval, bitpos, bitsize)
|
||||
|
||||
/* Convert C numbers into newly allocated values */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_from_longest (type, num)
|
||||
struct type *type;
|
||||
register LONGEST num;
|
||||
{
|
||||
register value val = allocate_value (type);
|
||||
register value_ptr val = allocate_value (type);
|
||||
register enum type_code code = TYPE_CODE (type);
|
||||
register int len = TYPE_LENGTH (type);
|
||||
|
||||
@ -1306,12 +1304,12 @@ value_from_longest (type, num)
|
||||
return val;
|
||||
}
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_from_double (type, num)
|
||||
struct type *type;
|
||||
double num;
|
||||
{
|
||||
register value val = allocate_value (type);
|
||||
register value_ptr val = allocate_value (type);
|
||||
register enum type_code code = TYPE_CODE (type);
|
||||
register int len = TYPE_LENGTH (type);
|
||||
|
||||
@ -1339,14 +1337,14 @@ value_from_double (type, num)
|
||||
0 when it is using the value returning conventions (this often
|
||||
means returning pointer to where structure is vs. returning value). */
|
||||
|
||||
value
|
||||
value_ptr
|
||||
value_being_returned (valtype, retbuf, struct_return)
|
||||
register struct type *valtype;
|
||||
char retbuf[REGISTER_BYTES];
|
||||
int struct_return;
|
||||
/*ARGSUSED*/
|
||||
{
|
||||
register value val;
|
||||
register value_ptr val;
|
||||
CORE_ADDR addr;
|
||||
|
||||
#if defined (EXTRACT_STRUCT_VALUE_ADDRESS)
|
||||
@ -1398,7 +1396,7 @@ value_being_returned (valtype, retbuf, struct_return)
|
||||
|
||||
int
|
||||
using_struct_return (function, funcaddr, value_type, gcc_p)
|
||||
value function;
|
||||
value_ptr function;
|
||||
CORE_ADDR funcaddr;
|
||||
struct type *value_type;
|
||||
int gcc_p;
|
||||
@ -1423,7 +1421,7 @@ using_struct_return (function, funcaddr, value_type, gcc_p)
|
||||
|
||||
void
|
||||
set_return_value (val)
|
||||
value val;
|
||||
value_ptr val;
|
||||
{
|
||||
register enum type_code code = TYPE_CODE (VALUE_TYPE (val));
|
||||
double dbuf;
|
||||
|
Loading…
x
Reference in New Issue
Block a user