* 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
18 changed files with 925 additions and 737 deletions
|
@ -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)
|
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
|
* osfsolib.c (xfer_link_map_member): Update to use new
|
||||||
|
|
|
@ -207,7 +207,7 @@ get_number (pp)
|
||||||
to pass to lookup_internalvar(). */
|
to pass to lookup_internalvar(). */
|
||||||
char *varname;
|
char *varname;
|
||||||
char *start = ++p;
|
char *start = ++p;
|
||||||
value val;
|
value_ptr val;
|
||||||
|
|
||||||
while (isalnum (*p) || *p == '_')
|
while (isalnum (*p) || *p == '_')
|
||||||
p++;
|
p++;
|
||||||
|
@ -1012,8 +1012,8 @@ watchpoint_check (p)
|
||||||
call free_all_values. We can't call free_all_values because
|
call free_all_values. We can't call free_all_values because
|
||||||
we might be in the middle of evaluating a function call. */
|
we might be in the middle of evaluating a function call. */
|
||||||
|
|
||||||
value mark = value_mark ();
|
value_ptr mark = value_mark ();
|
||||||
value new_val = evaluate_expression (bs->breakpoint_at->exp);
|
value_ptr new_val = evaluate_expression (bs->breakpoint_at->exp);
|
||||||
if (!value_equal (bs->breakpoint_at->val, new_val))
|
if (!value_equal (bs->breakpoint_at->val, new_val))
|
||||||
{
|
{
|
||||||
release_value (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)
|
if (vt_address && vtblprint)
|
||||||
{
|
{
|
||||||
value vt_val;
|
value_ptr vt_val;
|
||||||
struct symbol *wsym = (struct symbol *)NULL;
|
struct symbol *wsym = (struct symbol *)NULL;
|
||||||
struct type *wtype;
|
struct type *wtype;
|
||||||
struct symtab *s;
|
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)
|
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
|
||||||
{
|
{
|
||||||
value deref_val =
|
value_ptr deref_val =
|
||||||
value_at
|
value_at
|
||||||
(TYPE_TARGET_TYPE (type),
|
(TYPE_TARGET_TYPE (type),
|
||||||
unpack_pointer (lookup_pointer_type (builtin_type_void),
|
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)
|
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
|
||||||
{
|
{
|
||||||
value deref_val =
|
value_ptr deref_val =
|
||||||
value_at
|
value_at
|
||||||
(TYPE_TARGET_TYPE (type),
|
(TYPE_TARGET_TYPE (type),
|
||||||
unpack_pointer (lookup_pointer_type (builtin_type_void),
|
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);
|
fputs_filtered (": ", stream);
|
||||||
if (TYPE_FIELD_PACKED (type, i))
|
if (TYPE_FIELD_PACKED (type, i))
|
||||||
{
|
{
|
||||||
value v;
|
value_ptr v;
|
||||||
|
|
||||||
/* Bitfields require special handling, especially due to byte
|
/* Bitfields require special handling, especially due to byte
|
||||||
order problems. */
|
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
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
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. */
|
/* Override copies of {fetch,store}_inferior_registers in infptrace.c. */
|
||||||
|
|
||||||
#define FETCH_INFERIOR_REGISTERS
|
#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
|
/* This is the amount to subtract from u.u_ar0
|
||||||
to get the offset in the core file of the register values. */
|
to get the offset in the core file of the register values. */
|
||||||
|
|
||||||
#ifdef _SEQUENT_
|
#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
|
#else
|
||||||
#define KERNEL_U_ADDR (0x80000000 - (UPAGES * NBPG)) /* dynix */
|
#define KERNEL_U_ADDR (0x80000000 - (UPAGES * NBPG)) /* dynix */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,6 +33,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
/* ptx, not dynix */
|
/* ptx, not dynix */
|
||||||
#define SDB_REG_TO_REGNUM(value) ptx_coff_regno_to_gdb(value)
|
#define SDB_REG_TO_REGNUM(value) ptx_coff_regno_to_gdb(value)
|
||||||
extern int ptx_coff_regno_to_gdb();
|
extern int ptx_coff_regno_to_gdb();
|
||||||
|
|
||||||
#endif /* _SEQUENT_ */
|
#endif /* _SEQUENT_ */
|
||||||
|
|
||||||
#define START_INFERIOR_TRAPS_EXPECTED 2
|
#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 */
|
/* For Symmetry, this is really the 'leave' instruction, which */
|
||||||
/* is right before the ret */
|
/* is right before the ret */
|
||||||
|
|
||||||
#undef
|
#undef ABOUT_TO_RETURN
|
||||||
#define ABOUT_TO_RETURN(pc) (read_memory_integer (pc, 1) == 0xc9)
|
#define ABOUT_TO_RETURN(pc) (read_memory_integer (pc, 1) == 0xc9)
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -113,13 +114,17 @@ extern int ptx_coff_regno_to_gdb();
|
||||||
/* Get %fp2 - %fp31 by addition, since they are contiguous */
|
/* Get %fp2 - %fp31 by addition, since they are contiguous */
|
||||||
|
|
||||||
#undef SP_REGNUM
|
#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
|
#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
|
#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
|
#undef PS_REGNUM
|
||||||
#define PS_REGNUM 17 /* Contains processor status */
|
#define PS_REGNUM 17 /* eflags--Contains processor status */
|
||||||
|
#define EFLAGS_REGNUM 17
|
||||||
|
|
||||||
#ifndef _SEQUENT_
|
#ifndef _SEQUENT_
|
||||||
/* dynix, not ptx. For ptx, see register_addr in symm-tdep.c */
|
/* 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); \
|
((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_ */
|
#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
|
/* Total amount of space needed to store our copies of the machine's
|
||||||
register state, the array `registers'. */
|
register state, the array `registers'. */
|
||||||
/* 10 i386 registers, 8 i387 registers, and 31 Weitek 1167 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)
|
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
|
extern void
|
||||||
print_387_control_word PARAMS ((unsigned int));
|
print_387_control_word PARAMS ((unsigned int));
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#ifdef _SEQUENT_
|
#ifdef _SEQUENT_
|
||||||
/* ptx */
|
/* ptx */
|
||||||
#define HAVE_TERMIO
|
#define HAVE_TERMIOS
|
||||||
#define USG
|
#define USG
|
||||||
|
|
||||||
|
#define MEM_FNS_DECLARED
|
||||||
|
|
||||||
|
#define NEED_POSIX_SETPGID
|
||||||
|
|
||||||
|
#define USE_O_NOCTTY
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* dynix */
|
/* dynix */
|
||||||
|
|
||||||
|
@ -43,6 +50,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#define PTRACE_DETACH XPT_UNDEBUG
|
#define PTRACE_DETACH XPT_UNDEBUG
|
||||||
#define ATTACH_DETACH */
|
#define ATTACH_DETACH */
|
||||||
|
|
||||||
|
#ifdef _SEQUENT_
|
||||||
|
/* ptx does attach as of ptx version 2.1 */
|
||||||
|
#define ATTACH_DETACH 1
|
||||||
|
|
||||||
#define HOST_BYTE_ORDER LITTLE_ENDIAN
|
#define HOST_BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
|
||||||
/* We must fetch all the regs before storing, since we store all at once. */
|
/* 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))
|
if (TYPE_FIELD_PACKED (type, i))
|
||||||
{
|
{
|
||||||
value v;
|
value_ptr v;
|
||||||
|
|
||||||
/* Bitfields require special handling, especially due to byte
|
/* Bitfields require special handling, especially due to byte
|
||||||
order problems. */
|
order problems. */
|
||||||
|
|
|
@ -428,8 +428,8 @@ language_info (quietly)
|
||||||
#if 0 /* Currently unused */
|
#if 0 /* Currently unused */
|
||||||
|
|
||||||
struct type *
|
struct type *
|
||||||
binop_result_type(v1,v2)
|
binop_result_type (v1, v2)
|
||||||
value v1,v2;
|
value_ptr v1, v2;
|
||||||
{
|
{
|
||||||
int l1,l2,size,uns;
|
int l1,l2,size,uns;
|
||||||
|
|
||||||
|
@ -760,7 +760,7 @@ structured_type(type)
|
||||||
/* Returns non-zero if the value VAL represents a true value. */
|
/* Returns non-zero if the value VAL represents a true value. */
|
||||||
int
|
int
|
||||||
value_true (val)
|
value_true (val)
|
||||||
value val;
|
value_ptr val;
|
||||||
{
|
{
|
||||||
/* It is possible that we should have some sort of error if a non-boolean
|
/* 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
|
value is used in this context. Possibly dependent on some kind of
|
||||||
|
@ -778,7 +778,7 @@ value_true (val)
|
||||||
|
|
||||||
void
|
void
|
||||||
binop_type_check(arg1,arg2,op)
|
binop_type_check(arg1,arg2,op)
|
||||||
value arg1,arg2;
|
value_ptr arg1,arg2;
|
||||||
int op;
|
int op;
|
||||||
{
|
{
|
||||||
struct type *t1, *t2;
|
struct type *t1, *t2;
|
||||||
|
@ -788,7 +788,7 @@ binop_type_check(arg1,arg2,op)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
t1=VALUE_TYPE(arg1);
|
t1=VALUE_TYPE(arg1);
|
||||||
if (arg2!=(value)NULL)
|
if (arg2 != NULL)
|
||||||
t2=VALUE_TYPE(arg2);
|
t2=VALUE_TYPE(arg2);
|
||||||
else
|
else
|
||||||
t2=NULL;
|
t2=NULL;
|
||||||
|
|
|
@ -139,8 +139,11 @@ struct obj_section {
|
||||||
addresses", but that's not true; addr & endaddr are actual memory
|
addresses", but that's not true; addr & endaddr are actual memory
|
||||||
addresses. */
|
addresses. */
|
||||||
CORE_ADDR offset;
|
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
|
/* 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
|
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.
|
/* Contents of last address examined.
|
||||||
This is not valid past the end of the `x' command! */
|
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
|
/* Largest offset between a symbolic value and an address, that will be
|
||||||
printed as `0x1234 <symbol+offset>'. */
|
printed as `0x1234 <symbol+offset>'. */
|
||||||
|
@ -182,7 +182,7 @@ static void
|
||||||
do_examine PARAMS ((struct format_data, CORE_ADDR));
|
do_examine PARAMS ((struct format_data, CORE_ADDR));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_formatted PARAMS ((value, int, int));
|
print_formatted PARAMS ((value_ptr, int, int));
|
||||||
|
|
||||||
static struct format_data
|
static struct format_data
|
||||||
decode_format PARAMS ((char **, int, int));
|
decode_format PARAMS ((char **, int, int));
|
||||||
|
@ -227,13 +227,6 @@ decode_format (string_ptr, oformat, osize)
|
||||||
break;
|
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++;
|
while (*p == ' ' || *p == '\t') p++;
|
||||||
*string_ptr = p;
|
*string_ptr = p;
|
||||||
|
|
||||||
|
@ -256,9 +249,24 @@ decode_format (string_ptr, oformat, osize)
|
||||||
{
|
{
|
||||||
case 'a':
|
case 'a':
|
||||||
case 's':
|
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;
|
val.size = osize ? 'w' : osize;
|
||||||
break;
|
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':
|
case 'f':
|
||||||
/* Floating point has to be word or giantword. */
|
/* Floating point has to be word or giantword. */
|
||||||
if (osize == 'w' || osize == 'g')
|
if (osize == 'w' || osize == 'g')
|
||||||
|
@ -288,7 +296,7 @@ decode_format (string_ptr, oformat, osize)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_formatted (val, format, size)
|
print_formatted (val, format, size)
|
||||||
register value val;
|
register value_ptr val;
|
||||||
register int format;
|
register int format;
|
||||||
int size;
|
int size;
|
||||||
{
|
{
|
||||||
|
@ -750,7 +758,7 @@ print_command_1 (exp, inspect, voidprint)
|
||||||
struct expression *expr;
|
struct expression *expr;
|
||||||
register struct cleanup *old_chain = 0;
|
register struct cleanup *old_chain = 0;
|
||||||
register char format = 0;
|
register char format = 0;
|
||||||
register value val;
|
register value_ptr val;
|
||||||
struct format_data fmt;
|
struct format_data fmt;
|
||||||
int cleanup = 0;
|
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_STRUCT
|
||||||
|| TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_UNION))
|
|| TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_UNION))
|
||||||
{
|
{
|
||||||
value v;
|
value_ptr v;
|
||||||
|
|
||||||
v = value_from_vtable_info (val, TYPE_TARGET_TYPE (type));
|
v = value_from_vtable_info (val, TYPE_TARGET_TYPE (type));
|
||||||
if (v != 0)
|
if (v != 0)
|
||||||
|
@ -863,7 +871,7 @@ output_command (exp, from_tty)
|
||||||
struct expression *expr;
|
struct expression *expr;
|
||||||
register struct cleanup *old_chain;
|
register struct cleanup *old_chain;
|
||||||
register char format = 0;
|
register char format = 0;
|
||||||
register value val;
|
register value_ptr val;
|
||||||
struct format_data fmt;
|
struct format_data fmt;
|
||||||
|
|
||||||
if (exp && *exp == '/')
|
if (exp && *exp == '/')
|
||||||
|
@ -1453,7 +1461,7 @@ print_variable_value (var, frame, stream)
|
||||||
FRAME frame;
|
FRAME frame;
|
||||||
GDB_FILE *stream;
|
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);
|
value_print (val, stream, 0, Val_pretty_default);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1477,7 +1485,7 @@ print_frame_args (func, fi, num, stream)
|
||||||
int first = 1;
|
int first = 1;
|
||||||
register int i;
|
register int i;
|
||||||
register struct symbol *sym;
|
register struct symbol *sym;
|
||||||
register value val;
|
register value_ptr val;
|
||||||
/* Offset of next stack argument beyond the one we have seen that is
|
/* Offset of next stack argument beyond the one we have seen that is
|
||||||
at the highest offset.
|
at the highest offset.
|
||||||
-1 if we haven't come to a stack argument yet. */
|
-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 *f;
|
||||||
register char *s = arg;
|
register char *s = arg;
|
||||||
char *string;
|
char *string;
|
||||||
value *val_args;
|
value_ptr *val_args;
|
||||||
char *substrings;
|
char *substrings;
|
||||||
char *current_substring;
|
char *current_substring;
|
||||||
int nargs = 0;
|
int nargs = 0;
|
||||||
int allocated_args = 20;
|
int allocated_args = 20;
|
||||||
struct cleanup *old_cleanups;
|
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);
|
old_cleanups = make_cleanup (free_current_contents, &val_args);
|
||||||
|
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
|
@ -1722,21 +1730,38 @@ printf_command (arg, from_tty)
|
||||||
case '\\':
|
case '\\':
|
||||||
*f++ = '\\';
|
*f++ = '\\';
|
||||||
break;
|
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':
|
case 'n':
|
||||||
*f++ = '\n';
|
*f++ = '\n';
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
*f++ = '\r';
|
||||||
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
*f++ = '\t';
|
*f++ = '\t';
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'v':
|
||||||
*f++ = '\r';
|
*f++ = '\v';
|
||||||
break;
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
*f++ = '"';
|
*f++ = '"';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* ??? TODO: handle other escape sequences */
|
/* ??? TODO: handle other escape sequences */
|
||||||
error ("Unrecognized \\ escape character in format string.");
|
error ("Unrecognized escape character \\%c in format string.",
|
||||||
|
c);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1834,9 +1859,9 @@ printf_command (arg, from_tty)
|
||||||
{
|
{
|
||||||
char *s1;
|
char *s1;
|
||||||
if (nargs == allocated_args)
|
if (nargs == allocated_args)
|
||||||
val_args = (value *) xrealloc ((char *) val_args,
|
val_args = (value_ptr *) xrealloc ((char *) val_args,
|
||||||
(allocated_args *= 2)
|
(allocated_args *= 2)
|
||||||
* sizeof (value));
|
* sizeof (value_ptr));
|
||||||
s1 = s;
|
s1 = s;
|
||||||
val_args[nargs] = parse_to_comma_and_eval (&s1);
|
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.
|
/* 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.
|
This file is part of GDB.
|
||||||
|
|
||||||
|
@ -24,13 +24,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "inferior.h"
|
#include "inferior.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
#include "target.h"
|
||||||
|
|
||||||
|
/* FIXME: What is the _INKERNEL define for? */
|
||||||
|
#define _INKERNEL
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#undef _INKERNEL
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
|
#include <sys/proc.h>
|
||||||
#include <sys/dir.h>
|
#include <sys/dir.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/ptrace.h>
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sgtty.h>
|
#include <sgtty.h>
|
||||||
|
@ -61,7 +68,7 @@ int regno;
|
||||||
regs.pr_fpa.fpa_regs[i] =
|
regs.pr_fpa.fpa_regs[i] =
|
||||||
*(int *)®isters[REGISTER_BYTE(FP1_REGNUM+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
|
void
|
||||||
|
@ -74,7 +81,7 @@ fetch_inferior_registers (regno)
|
||||||
|
|
||||||
registers_fetched ();
|
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(EAX_REGNUM)] = regs.pr_eax;
|
||||||
*(int *)®isters[REGISTER_BYTE(EBX_REGNUM)] = regs.pr_ebx;
|
*(int *)®isters[REGISTER_BYTE(EBX_REGNUM)] = regs.pr_ebx;
|
||||||
*(int *)®isters[REGISTER_BYTE(ECX_REGNUM)] = regs.pr_ecx;
|
*(int *)®isters[REGISTER_BYTE(ECX_REGNUM)] = regs.pr_ecx;
|
||||||
|
@ -146,7 +153,7 @@ struct pt_regset ep;
|
||||||
for (i = 9; i >= 0; i--)
|
for (i = 9; i >= 0; i--)
|
||||||
printf_unfiltered ("%02x", ep.pr_fpu.fpu_stack[fpreg][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);
|
printf_unfiltered (" %g\n", val);
|
||||||
}
|
}
|
||||||
if (ep.pr_fpu.fpu_rsvd1)
|
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_20MHZ) printf_unfiltered(" 20MHZ");
|
||||||
if (pcr_tmp & FPA_PCR_CC_Z) printf_unfiltered(" Z");
|
if (pcr_tmp & FPA_PCR_CC_Z) printf_unfiltered(" Z");
|
||||||
if (pcr_tmp & FPA_PCR_CC_C2) printf_unfiltered(" C2");
|
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");
|
if (pcr_tmp & FPA_PCR_CC_C1) printf_unfiltered(" C1");
|
||||||
switch (pcr_tmp) {
|
#endif
|
||||||
case FPA_PCR_CC_Z:
|
#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)");
|
printf_unfiltered(" (Equal)");
|
||||||
break;
|
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)");
|
printf_unfiltered(" (Less than)");
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
printf_unfiltered(" (Greater than)");
|
printf_unfiltered(" (Greater than)");
|
||||||
break;
|
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)");
|
printf_unfiltered(" (Unordered)");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf_unfiltered(" (Undefined)");
|
printf_unfiltered(" (Undefined)");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf_unfiltered("\n");
|
printf_unfiltered("\n");
|
||||||
pcr_tmp = pcr & FPA_PCR_AE;
|
pcr_tmp = pcr & FPA_PCR_AE;
|
||||||
printf_unfiltered("\tAE= %#x", pcr_tmp);
|
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 ()
|
i386_float_info ()
|
||||||
{
|
{
|
||||||
char ubuf[UPAGES*NBPG];
|
char ubuf[UPAGES*NBPG];
|
||||||
|
@ -306,3 +336,454 @@ i386_float_info ()
|
||||||
print_fpu_status(regset);
|
print_fpu_status(regset);
|
||||||
print_fpa_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.
|
/* Sequent Symmetry target interface, for GDB.
|
||||||
Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1986, 1987, 1989, 1991, 1994 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
|
@ -33,79 +33,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include <fcntl.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
|
* Following macro translates i386 opcode register numbers to Symmetry
|
||||||
* register numbers. This is used by FRAME_FIND_SAVED_REGS.
|
* register numbers. This is used by FRAME_FIND_SAVED_REGS.
|
||||||
|
@ -118,223 +45,6 @@ codestream_read (buf, count)
|
||||||
#define I386_REGNO_TO_SYMMETRY(n) \
|
#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))
|
((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
|
void
|
||||||
symmetry_extract_return_value(type, regbuf, valbuf)
|
symmetry_extract_return_value(type, regbuf, valbuf)
|
||||||
struct type *type;
|
struct type *type;
|
||||||
|
@ -393,97 +103,3 @@ symmetry_extract_return_value(type, regbuf, valbuf)
|
||||||
memcpy (valbuf, regbuf, TYPE_LENGTH (type));
|
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 {
|
struct section_table {
|
||||||
CORE_ADDR addr; /* Lowest address in section */
|
CORE_ADDR addr; /* Lowest address in section */
|
||||||
CORE_ADDR endaddr; /* 1+highest 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 */
|
bfd *bfd; /* BFD file pointer */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ whatis_exp (exp, show)
|
||||||
int show;
|
int show;
|
||||||
{
|
{
|
||||||
struct expression *expr;
|
struct expression *expr;
|
||||||
register value val;
|
register value_ptr val;
|
||||||
register struct cleanup *old_chain = NULL;
|
register struct cleanup *old_chain = NULL;
|
||||||
|
|
||||||
if (exp)
|
if (exp)
|
||||||
|
@ -249,7 +249,7 @@ maintenance_print_type (typename, from_tty)
|
||||||
char *typename;
|
char *typename;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
register value val;
|
register value_ptr val;
|
||||||
register struct type *type;
|
register struct type *type;
|
||||||
register struct cleanup *old_chain;
|
register struct cleanup *old_chain;
|
||||||
struct expression *expr;
|
struct expression *expr;
|
||||||
|
|
|
@ -60,8 +60,8 @@ set_output_radix PARAMS ((char *, int, struct cmd_list_element *));
|
||||||
static void
|
static void
|
||||||
set_output_radix_1 PARAMS ((int, unsigned));
|
set_output_radix_1 PARAMS ((int, unsigned));
|
||||||
|
|
||||||
static void
|
static void value_print_array_elements PARAMS ((value_ptr, GDB_FILE *, int,
|
||||||
value_print_array_elements PARAMS ((value, GDB_FILE *, int, enum val_prettyprint));
|
enum val_prettyprint));
|
||||||
|
|
||||||
/* Maximum number of chars to print for a string pointer value or vector
|
/* 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"
|
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
|
int
|
||||||
value_print (val, stream, format, pretty)
|
value_print (val, stream, format, pretty)
|
||||||
value val;
|
value_ptr val;
|
||||||
GDB_FILE *stream;
|
GDB_FILE *stream;
|
||||||
int format;
|
int format;
|
||||||
enum val_prettyprint pretty;
|
enum val_prettyprint pretty;
|
||||||
|
@ -650,7 +650,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
|
||||||
|
|
||||||
static void
|
static void
|
||||||
value_print_array_elements (val, stream, format, pretty)
|
value_print_array_elements (val, stream, format, pretty)
|
||||||
value val;
|
value_ptr val;
|
||||||
GDB_FILE *stream;
|
GDB_FILE *stream;
|
||||||
int format;
|
int format;
|
||||||
enum val_prettyprint pretty;
|
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_TYPE(val) (val)->type
|
||||||
#define VALUE_LAZY(val) (val)->lazy
|
#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_RAW(val) ((char *) (val)->aligner.contents)
|
||||||
#define VALUE_CONTENTS(val) ((void)(VALUE_LAZY(val) && value_fetch_lazy(val)),\
|
#define VALUE_CONTENTS(val) ((void)(VALUE_LAZY(val) && value_fetch_lazy(val)),\
|
||||||
VALUE_CONTENTS_RAW(val))
|
VALUE_CONTENTS_RAW(val))
|
||||||
extern int
|
extern int value_fetch_lazy PARAMS ((value_ptr val));
|
||||||
value_fetch_lazy PARAMS ((value val));
|
|
||||||
|
|
||||||
#define VALUE_LVAL(val) (val)->lval
|
#define VALUE_LVAL(val) (val)->lval
|
||||||
#define VALUE_ADDRESS(val) (val)->location.address
|
#define VALUE_ADDRESS(val) (val)->location.address
|
||||||
|
@ -180,7 +179,7 @@ struct internalvar
|
||||||
{
|
{
|
||||||
struct internalvar *next;
|
struct internalvar *next;
|
||||||
char *name;
|
char *name;
|
||||||
value value;
|
value_ptr value;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Pointer to member function. Depends on compiler implementation. */
|
/* Pointer to member function. Depends on compiler implementation. */
|
||||||
|
@ -202,222 +201,198 @@ struct fn_field;
|
||||||
extern void
|
extern void
|
||||||
print_address_demangle PARAMS ((CORE_ADDR, GDB_FILE *, int));
|
print_address_demangle PARAMS ((CORE_ADDR, GDB_FILE *, int));
|
||||||
|
|
||||||
extern LONGEST
|
extern LONGEST value_as_long PARAMS ((value_ptr val));
|
||||||
value_as_long PARAMS ((value val));
|
|
||||||
|
|
||||||
extern double
|
extern double value_as_double PARAMS ((value_ptr val));
|
||||||
value_as_double PARAMS ((value val));
|
|
||||||
|
|
||||||
extern CORE_ADDR
|
extern CORE_ADDR value_as_pointer PARAMS ((value_ptr val));
|
||||||
value_as_pointer PARAMS ((value val));
|
|
||||||
|
|
||||||
extern LONGEST
|
extern LONGEST unpack_long PARAMS ((struct type *type, char *valaddr));
|
||||||
unpack_long PARAMS ((struct type *type, char *valaddr));
|
|
||||||
|
|
||||||
extern double
|
extern double unpack_double PARAMS ((struct type *type, char *valaddr,
|
||||||
unpack_double PARAMS ((struct type *type, char *valaddr, int *invp));
|
int *invp));
|
||||||
|
|
||||||
extern CORE_ADDR unpack_pointer PARAMS ((struct type *type, char *valaddr));
|
extern CORE_ADDR unpack_pointer PARAMS ((struct type *type, char *valaddr));
|
||||||
|
|
||||||
extern LONGEST unpack_field_as_long PARAMS ((struct type *type, char *valaddr,
|
extern LONGEST unpack_field_as_long PARAMS ((struct type *type, char *valaddr,
|
||||||
int fieldno));
|
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" */
|
/* 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));
|
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 *));
|
extern int symbol_read_needs_frame PARAMS ((struct symbol *));
|
||||||
|
|
||||||
/* FIXME: Assumes equivalence of "struct frame_info *" and "FRAME" */
|
/* FIXME: Assumes equivalence of "struct frame_info *" and "FRAME" */
|
||||||
extern value read_var_value PARAMS ((struct symbol *var,
|
extern value_ptr read_var_value PARAMS ((struct symbol *var,
|
||||||
struct frame_info *frame));
|
struct frame_info *frame));
|
||||||
|
|
||||||
/* FIXME: Assumes equivalence of "struct frame_info *" and "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));
|
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,
|
extern value_ptr value_array PARAMS ((int lowbound, int highbound,
|
||||||
value *elemvec));
|
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,
|
extern value_ptr value_struct_elt PARAMS ((value_ptr *argp, value *args,
|
||||||
int *static_memfuncp, char *err));
|
char *name,
|
||||||
|
int *static_memfuncp, char *err));
|
||||||
|
|
||||||
extern value value_struct_elt_for_reference PARAMS ((struct type *domain,
|
extern value_ptr value_struct_elt_for_reference PARAMS ((struct type *domain,
|
||||||
int offset,
|
int offset,
|
||||||
struct type *curtype,
|
struct type *curtype,
|
||||||
char *name,
|
char *name,
|
||||||
struct type *intype));
|
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,
|
extern value_ptr value_primitive_field PARAMS ((value_ptr arg1, int offset,
|
||||||
int fieldno,
|
int fieldno,
|
||||||
struct type *arg_type));
|
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,
|
extern value_ptr value_being_returned PARAMS ((struct type *valtype,
|
||||||
char retbuf[REGISTER_BYTES],
|
char retbuf[REGISTER_BYTES],
|
||||||
int struct_return));
|
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 value_bit_index PARAMS ((struct type *type, char *addr, int index));
|
||||||
|
|
||||||
extern int
|
extern int using_struct_return PARAMS ((value_ptr function, CORE_ADDR funcaddr,
|
||||||
using_struct_return PARAMS ((value function, CORE_ADDR funcaddr,
|
struct type *value_type, int gcc_p));
|
||||||
struct type *value_type, int gcc_p));
|
|
||||||
|
|
||||||
extern void
|
extern void set_return_value PARAMS ((value_ptr val));
|
||||||
set_return_value PARAMS ((value val));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr evaluate_expression PARAMS ((struct expression *exp));
|
||||||
evaluate_expression PARAMS ((struct expression *exp));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr evaluate_type PARAMS ((struct expression *exp));
|
||||||
evaluate_type PARAMS ((struct expression *exp));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr parse_and_eval PARAMS ((char *exp));
|
||||||
parse_and_eval PARAMS ((char *exp));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr parse_to_comma_and_eval PARAMS ((char **expp));
|
||||||
parse_to_comma_and_eval PARAMS ((char **expp));
|
|
||||||
|
|
||||||
extern struct type *
|
extern struct type *parse_and_eval_type PARAMS ((char *p, int length));
|
||||||
parse_and_eval_type PARAMS ((char *p, int length));
|
|
||||||
|
|
||||||
extern CORE_ADDR
|
extern CORE_ADDR parse_and_eval_address PARAMS ((char *exp));
|
||||||
parse_and_eval_address PARAMS ((char *exp));
|
|
||||||
|
|
||||||
extern CORE_ADDR
|
extern CORE_ADDR parse_and_eval_address_1 PARAMS ((char **expptr));
|
||||||
parse_and_eval_address_1 PARAMS ((char **expptr));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr access_value_history PARAMS ((int num));
|
||||||
access_value_history PARAMS ((int num));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_of_internalvar PARAMS ((struct internalvar *var));
|
||||||
value_of_internalvar PARAMS ((struct internalvar *var));
|
|
||||||
|
|
||||||
extern void
|
extern void set_internalvar PARAMS ((struct internalvar *var, value_ptr val));
|
||||||
set_internalvar PARAMS ((struct internalvar *var, value val));
|
|
||||||
|
|
||||||
extern void
|
extern void set_internalvar_component PARAMS ((struct internalvar *var,
|
||||||
set_internalvar_component PARAMS ((struct internalvar *var, int offset,
|
int offset,
|
||||||
int bitpos, int bitsize,
|
int bitpos, int bitsize,
|
||||||
value newvalue));
|
value_ptr newvalue));
|
||||||
|
|
||||||
extern struct internalvar *
|
extern struct internalvar *lookup_internalvar PARAMS ((char *name));
|
||||||
lookup_internalvar PARAMS ((char *name));
|
|
||||||
|
|
||||||
extern int
|
extern int value_equal PARAMS ((value_ptr arg1, value_ptr arg2));
|
||||||
value_equal PARAMS ((value arg1, value arg2));
|
|
||||||
|
|
||||||
extern int
|
extern int value_less PARAMS ((value_ptr arg1, value_ptr arg2));
|
||||||
value_less PARAMS ((value arg1, value arg2));
|
|
||||||
|
|
||||||
extern int
|
extern int value_logical_not PARAMS ((value_ptr arg1));
|
||||||
value_logical_not PARAMS ((value arg1));
|
|
||||||
|
|
||||||
/* C++ */
|
/* C++ */
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_of_this PARAMS ((int complain));
|
||||||
value_of_this PARAMS ((int complain));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_x_binop PARAMS ((value_ptr arg1, value_ptr arg2,
|
||||||
value_x_binop PARAMS ((value arg1, value arg2, enum exp_opcode op,
|
enum exp_opcode op,
|
||||||
enum exp_opcode otherop));
|
enum exp_opcode otherop));
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_x_unop PARAMS ((value_ptr arg1, enum exp_opcode op));
|
||||||
value_x_unop PARAMS ((value arg1, enum exp_opcode op));
|
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_fn_field PARAMS ((value_ptr *arg1p, struct fn_field *f,
|
||||||
value_fn_field PARAMS ((value *arg1p, struct fn_field *f, int j,
|
int j,
|
||||||
struct type* type, int offset));
|
struct type* type, int offset));
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_virtual_fn_field PARAMS ((value_ptr *arg1p,
|
||||||
value_virtual_fn_field PARAMS ((value *arg1p, struct fn_field *f, int j,
|
struct fn_field *f, int j,
|
||||||
struct type *type, int offset));
|
struct type *type,
|
||||||
|
int offset));
|
||||||
|
|
||||||
extern int
|
extern int binop_user_defined_p PARAMS ((enum exp_opcode op,
|
||||||
binop_user_defined_p PARAMS ((enum exp_opcode op, value arg1, value arg2));
|
value_ptr arg1, value_ptr arg2));
|
||||||
|
|
||||||
extern int
|
extern int unop_user_defined_p PARAMS ((enum exp_opcode op, value_ptr arg1));
|
||||||
unop_user_defined_p PARAMS ((enum exp_opcode op, value arg1));
|
|
||||||
|
|
||||||
extern int
|
extern int destructor_name_p PARAMS ((const char *name,
|
||||||
destructor_name_p PARAMS ((const char *name, const struct type *type));
|
const struct type *type));
|
||||||
|
|
||||||
#define value_free(val) free ((PTR)val)
|
#define value_free(val) free ((PTR)val)
|
||||||
|
|
||||||
extern void
|
extern void free_all_values PARAMS ((void));
|
||||||
free_all_values PARAMS ((void));
|
|
||||||
|
|
||||||
extern void
|
extern void release_value PARAMS ((value_ptr val));
|
||||||
release_value PARAMS ((value val));
|
|
||||||
|
|
||||||
extern int
|
extern int record_latest_value PARAMS ((value_ptr val));
|
||||||
record_latest_value PARAMS ((value val));
|
|
||||||
|
|
||||||
extern void
|
extern void registers_changed PARAMS ((void));
|
||||||
registers_changed PARAMS ((void));
|
|
||||||
|
|
||||||
extern void
|
extern void read_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
||||||
read_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
|
||||||
|
|
||||||
extern void
|
extern void write_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
||||||
write_register_bytes PARAMS ((int regbyte, char *myaddr, int len));
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
read_register_gen PARAMS ((int regno, char *myaddr));
|
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,
|
type_print PARAMS ((struct type *type, char *varstring, GDB_FILE *stream,
|
||||||
int show));
|
int show));
|
||||||
|
|
||||||
extern char *
|
extern char *baseclass_addr PARAMS ((struct type *type, int index,
|
||||||
baseclass_addr PARAMS ((struct type *type, int index, char *valaddr,
|
char *valaddr,
|
||||||
value *valuep, int *errp));
|
value_ptr *valuep, int *errp));
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
print_longest PARAMS ((GDB_FILE *stream, int format, int use_local,
|
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
|
extern void
|
||||||
print_floating PARAMS ((char *valaddr, struct type *type, GDB_FILE *stream));
|
print_floating PARAMS ((char *valaddr, struct type *type, GDB_FILE *stream));
|
||||||
|
|
||||||
extern int
|
extern int value_print PARAMS ((value_ptr val, GDB_FILE *stream, int format,
|
||||||
value_print PARAMS ((value val, GDB_FILE *stream, int format,
|
enum val_prettyprint pretty));
|
||||||
enum val_prettyprint pretty));
|
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
val_print PARAMS ((struct type *type, char *valaddr, CORE_ADDR address,
|
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,
|
print_variable_value PARAMS ((struct symbol *var, struct frame_info *frame,
|
||||||
GDB_FILE *stream));
|
GDB_FILE *stream));
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_arg_coerce PARAMS ((value_ptr));
|
||||||
value_arg_coerce PARAMS ((value));
|
|
||||||
|
|
||||||
extern int
|
extern int check_field PARAMS ((value_ptr, const char *));
|
||||||
check_field PARAMS ((value, const char *));
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
c_typedef_print PARAMS ((struct type *type, struct symbol *new, GDB_FILE *stream));
|
c_typedef_print PARAMS ((struct type *type, struct symbol *new, GDB_FILE *stream));
|
||||||
|
@ -492,15 +464,12 @@ clear_internalvars PARAMS ((void));
|
||||||
|
|
||||||
/* From values.c */
|
/* From values.c */
|
||||||
|
|
||||||
extern value
|
extern value_ptr value_copy PARAMS ((value_ptr));
|
||||||
value_copy PARAMS ((value));
|
|
||||||
|
|
||||||
extern int
|
extern int baseclass_offset PARAMS ((struct type *, int, value_ptr, int));
|
||||||
baseclass_offset PARAMS ((struct type *, int, value, int));
|
|
||||||
|
|
||||||
/* From valops.c */
|
/* From valops.c */
|
||||||
|
|
||||||
extern value
|
extern value_ptr call_function_by_hand PARAMS ((value_ptr, int, value_ptr *));
|
||||||
call_function_by_hand PARAMS ((value, int, value *));
|
|
||||||
|
|
||||||
#endif /* !defined (VALUE_H) */
|
#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. */
|
/* Local function prototypes. */
|
||||||
|
|
||||||
static value
|
static value_ptr value_headof PARAMS ((value, struct type *, struct type *));
|
||||||
value_headof PARAMS ((value, struct type *, struct type *));
|
|
||||||
|
|
||||||
static void
|
static void show_values PARAMS ((char *, int));
|
||||||
show_values PARAMS ((char *, int));
|
|
||||||
|
|
||||||
static void
|
static void show_convenience PARAMS ((char *, int));
|
||||||
show_convenience PARAMS ((char *, int));
|
|
||||||
|
|
||||||
/* The value-history records all the values printed
|
/* The value-history records all the values printed
|
||||||
by print commands during this session. Each chunk
|
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
|
||||||
{
|
{
|
||||||
struct value_history_chunk *next;
|
struct value_history_chunk *next;
|
||||||
value values[VALUE_HISTORY_CHUNK];
|
value_ptr values[VALUE_HISTORY_CHUNK];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Chain of chunks now in use. */
|
/* 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)
|
(except for those released by calls to release_value)
|
||||||
This is so they can be freed after each command. */
|
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. */
|
/* Allocate a value that has the correct length for type TYPE. */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
allocate_value (type)
|
allocate_value (type)
|
||||||
struct type *type;
|
struct type *type;
|
||||||
{
|
{
|
||||||
register value val;
|
register value_ptr val;
|
||||||
|
|
||||||
check_stub_type (type);
|
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;
|
VALUE_NEXT (val) = all_values;
|
||||||
all_values = val;
|
all_values = val;
|
||||||
VALUE_TYPE (val) = type;
|
VALUE_TYPE (val) = type;
|
||||||
|
@ -98,14 +95,15 @@ allocate_value (type)
|
||||||
/* Allocate a value that has the correct length
|
/* Allocate a value that has the correct length
|
||||||
for COUNT repetitions type TYPE. */
|
for COUNT repetitions type TYPE. */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
allocate_repeat_value (type, count)
|
allocate_repeat_value (type, count)
|
||||||
struct type *type;
|
struct type *type;
|
||||||
int count;
|
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;
|
VALUE_NEXT (val) = all_values;
|
||||||
all_values = val;
|
all_values = val;
|
||||||
VALUE_TYPE (val) = type;
|
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
|
/* Return a mark in the value chain. All values allocated after the
|
||||||
mark is obtained (except for those released) are subject to being freed
|
mark is obtained (except for those released) are subject to being freed
|
||||||
if a subsequent value_free_to_mark is passed the mark. */
|
if a subsequent value_free_to_mark is passed the mark. */
|
||||||
value
|
value_ptr
|
||||||
value_mark ()
|
value_mark ()
|
||||||
{
|
{
|
||||||
return all_values;
|
return all_values;
|
||||||
|
@ -136,9 +134,9 @@ value_mark ()
|
||||||
(except for those released). */
|
(except for those released). */
|
||||||
void
|
void
|
||||||
value_free_to_mark (mark)
|
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)
|
for (val = all_values; val && val != mark; val = next)
|
||||||
{
|
{
|
||||||
|
@ -154,7 +152,7 @@ value_free_to_mark (mark)
|
||||||
void
|
void
|
||||||
free_all_values ()
|
free_all_values ()
|
||||||
{
|
{
|
||||||
register value val, next;
|
register value_ptr val, next;
|
||||||
|
|
||||||
for (val = all_values; val; val = next)
|
for (val = all_values; val; val = next)
|
||||||
{
|
{
|
||||||
|
@ -170,9 +168,9 @@ free_all_values ()
|
||||||
|
|
||||||
void
|
void
|
||||||
release_value (val)
|
release_value (val)
|
||||||
register value val;
|
register value_ptr val;
|
||||||
{
|
{
|
||||||
register value v;
|
register value_ptr v;
|
||||||
|
|
||||||
if (all_values == val)
|
if (all_values == val)
|
||||||
{
|
{
|
||||||
|
@ -194,11 +192,11 @@ release_value (val)
|
||||||
It contains the same contents, for same memory address,
|
It contains the same contents, for same memory address,
|
||||||
but it's a different block of storage. */
|
but it's a different block of storage. */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_copy (arg)
|
value_copy (arg)
|
||||||
value arg;
|
value_ptr arg;
|
||||||
{
|
{
|
||||||
register value val;
|
register value_ptr val;
|
||||||
register struct type *type = VALUE_TYPE (arg);
|
register struct type *type = VALUE_TYPE (arg);
|
||||||
if (VALUE_REPEATED (arg))
|
if (VALUE_REPEATED (arg))
|
||||||
val = allocate_repeat_value (type, VALUE_REPETITIONS (arg));
|
val = allocate_repeat_value (type, VALUE_REPETITIONS (arg));
|
||||||
|
@ -230,7 +228,7 @@ value_copy (arg)
|
||||||
|
|
||||||
int
|
int
|
||||||
record_latest_value (val)
|
record_latest_value (val)
|
||||||
value val;
|
value_ptr val;
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -278,7 +276,7 @@ record_latest_value (val)
|
||||||
|
|
||||||
/* Return a copy of the value in the history with sequence number NUM. */
|
/* Return a copy of the value in the history with sequence number NUM. */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
access_value_history (num)
|
access_value_history (num)
|
||||||
int num;
|
int num;
|
||||||
{
|
{
|
||||||
|
@ -322,7 +320,7 @@ clear_value_history ()
|
||||||
{
|
{
|
||||||
register struct value_history_chunk *next;
|
register struct value_history_chunk *next;
|
||||||
register int i;
|
register int i;
|
||||||
register value val;
|
register value_ptr val;
|
||||||
|
|
||||||
while (value_history_chain)
|
while (value_history_chain)
|
||||||
{
|
{
|
||||||
|
@ -342,7 +340,7 @@ show_values (num_exp, from_tty)
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
register value val;
|
register value_ptr val;
|
||||||
static int num = 1;
|
static int num = 1;
|
||||||
|
|
||||||
if (num_exp)
|
if (num_exp)
|
||||||
|
@ -414,11 +412,11 @@ lookup_internalvar (name)
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_of_internalvar (var)
|
value_of_internalvar (var)
|
||||||
struct internalvar *var;
|
struct internalvar *var;
|
||||||
{
|
{
|
||||||
register value val;
|
register value_ptr val;
|
||||||
|
|
||||||
#ifdef IS_TRAPPED_INTERNALVAR
|
#ifdef IS_TRAPPED_INTERNALVAR
|
||||||
if (IS_TRAPPED_INTERNALVAR (var->name))
|
if (IS_TRAPPED_INTERNALVAR (var->name))
|
||||||
|
@ -437,7 +435,7 @@ void
|
||||||
set_internalvar_component (var, offset, bitpos, bitsize, newval)
|
set_internalvar_component (var, offset, bitpos, bitsize, newval)
|
||||||
struct internalvar *var;
|
struct internalvar *var;
|
||||||
int offset, bitpos, bitsize;
|
int offset, bitpos, bitsize;
|
||||||
value newval;
|
value_ptr newval;
|
||||||
{
|
{
|
||||||
register char *addr = VALUE_CONTENTS (var->value) + offset;
|
register char *addr = VALUE_CONTENTS (var->value) + offset;
|
||||||
|
|
||||||
|
@ -456,7 +454,7 @@ set_internalvar_component (var, offset, bitpos, bitsize, newval)
|
||||||
void
|
void
|
||||||
set_internalvar (var, val)
|
set_internalvar (var, val)
|
||||||
struct internalvar *var;
|
struct internalvar *var;
|
||||||
value val;
|
value_ptr val;
|
||||||
{
|
{
|
||||||
#ifdef IS_TRAPPED_INTERNALVAR
|
#ifdef IS_TRAPPED_INTERNALVAR
|
||||||
if (IS_TRAPPED_INTERNALVAR (var->name))
|
if (IS_TRAPPED_INTERNALVAR (var->name))
|
||||||
|
@ -533,7 +531,7 @@ use \"set\" as in \"set $foo = 5\" to define them.\n");
|
||||||
|
|
||||||
LONGEST
|
LONGEST
|
||||||
value_as_long (val)
|
value_as_long (val)
|
||||||
register value val;
|
register value_ptr val;
|
||||||
{
|
{
|
||||||
/* This coerces arrays and functions, which is necessary (e.g.
|
/* This coerces arrays and functions, which is necessary (e.g.
|
||||||
in disassemble_command). It also dereferences references, which
|
in disassemble_command). It also dereferences references, which
|
||||||
|
@ -545,7 +543,7 @@ value_as_long (val)
|
||||||
|
|
||||||
double
|
double
|
||||||
value_as_double (val)
|
value_as_double (val)
|
||||||
register value val;
|
register value_ptr val;
|
||||||
{
|
{
|
||||||
double foo;
|
double foo;
|
||||||
int inv;
|
int inv;
|
||||||
|
@ -559,7 +557,7 @@ value_as_double (val)
|
||||||
Does not deallocate the value. */
|
Does not deallocate the value. */
|
||||||
CORE_ADDR
|
CORE_ADDR
|
||||||
value_as_pointer (val)
|
value_as_pointer (val)
|
||||||
value val;
|
value_ptr val;
|
||||||
{
|
{
|
||||||
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
|
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
|
||||||
whether we want this to be true eventually. */
|
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 */
|
For C++, must also be able to return values from static fields */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_primitive_field (arg1, offset, fieldno, arg_type)
|
value_primitive_field (arg1, offset, fieldno, arg_type)
|
||||||
register value arg1;
|
register value_ptr arg1;
|
||||||
int offset;
|
int offset;
|
||||||
register int fieldno;
|
register int fieldno;
|
||||||
register struct type *arg_type;
|
register struct type *arg_type;
|
||||||
{
|
{
|
||||||
register value v;
|
register value_ptr v;
|
||||||
register struct type *type;
|
register struct type *type;
|
||||||
|
|
||||||
check_stub_type (arg_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 */
|
For C++, must also be able to return values from static fields */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_field (arg1, fieldno)
|
value_field (arg1, fieldno)
|
||||||
register value arg1;
|
register value_ptr arg1;
|
||||||
register int fieldno;
|
register int fieldno;
|
||||||
{
|
{
|
||||||
return value_primitive_field (arg1, 0, fieldno, VALUE_TYPE (arg1));
|
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.
|
F is the list of member functions which contains the desired method.
|
||||||
J is an index into F which provides 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_fn_field (arg1p, f, j, type, offset)
|
||||||
value *arg1p;
|
value_ptr *arg1p;
|
||||||
struct fn_field *f;
|
struct fn_field *f;
|
||||||
int j;
|
int j;
|
||||||
struct type *type;
|
struct type *type;
|
||||||
int offset;
|
int offset;
|
||||||
{
|
{
|
||||||
register value v;
|
register value_ptr v;
|
||||||
register struct type *ftype = TYPE_FN_FIELD_TYPE (f, j);
|
register struct type *ftype = TYPE_FN_FIELD_TYPE (f, j);
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
|
||||||
sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
|
sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
|
||||||
0, VAR_NAMESPACE, 0, NULL);
|
0, VAR_NAMESPACE, 0, NULL);
|
||||||
if (! sym)
|
if (! sym)
|
||||||
return (value)NULL;
|
return NULL;
|
||||||
/*
|
/*
|
||||||
error ("Internal error: could not find physical method named %s",
|
error ("Internal error: could not find physical method named %s",
|
||||||
TYPE_FN_FIELD_PHYSNAME (f, j));
|
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.
|
J is an index into F which provides the desired virtual function.
|
||||||
|
|
||||||
TYPE is the type in which F is located. */
|
TYPE is the type in which F is located. */
|
||||||
value
|
value_ptr
|
||||||
value_virtual_fn_field (arg1p, f, j, type, offset)
|
value_virtual_fn_field (arg1p, f, j, type, offset)
|
||||||
value *arg1p;
|
value_ptr *arg1p;
|
||||||
struct fn_field *f;
|
struct fn_field *f;
|
||||||
int j;
|
int j;
|
||||||
struct type *type;
|
struct type *type;
|
||||||
int offset;
|
int offset;
|
||||||
{
|
{
|
||||||
value arg1 = *arg1p;
|
value_ptr arg1 = *arg1p;
|
||||||
/* First, get the virtual function table pointer. That comes
|
/* First, get the virtual function table pointer. That comes
|
||||||
with a strange type, so cast it to type `pointer to long' (which
|
with a strange type, so cast it to type `pointer to long' (which
|
||||||
should serve just fine as a function type). Then, index into
|
should serve just fine as a function type). Then, index into
|
||||||
the table, and convert final value to appropriate function type. */
|
the table, and convert final value to appropriate function type. */
|
||||||
value entry, vfn, vtbl;
|
value_ptr entry, vfn, vtbl;
|
||||||
value vi = value_from_longest (builtin_type_int,
|
value_ptr vi = value_from_longest (builtin_type_int,
|
||||||
(LONGEST) TYPE_FN_FIELD_VOFFSET (f, j));
|
(LONGEST) TYPE_FN_FIELD_VOFFSET (f, j));
|
||||||
struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
|
struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
|
||||||
struct type *context;
|
struct type *context;
|
||||||
if (fcontext == NULL)
|
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. */
|
FIXME-tiemann: should work with dossier entries as well. */
|
||||||
|
|
||||||
static value
|
static value_ptr
|
||||||
value_headof (in_arg, btype, dtype)
|
value_headof (in_arg, btype, dtype)
|
||||||
value in_arg;
|
value_ptr in_arg;
|
||||||
struct type *btype, *dtype;
|
struct type *btype, *dtype;
|
||||||
{
|
{
|
||||||
/* First collect the vtables we must look at for this object. */
|
/* First collect the vtables we must look at for this object. */
|
||||||
/* FIXME-tiemann: right now, just look at top-most vtable. */
|
/* 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 i, nelems;
|
||||||
int offset, best_offset = 0;
|
int offset, best_offset = 0;
|
||||||
struct symbol *sym;
|
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
|
of its baseclasses) to figure out the most derived type that ARG
|
||||||
could actually be a pointer to. */
|
could actually be a pointer to. */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_from_vtable_info (arg, type)
|
value_from_vtable_info (arg, type)
|
||||||
value arg;
|
value_ptr arg;
|
||||||
struct type *type;
|
struct type *type;
|
||||||
{
|
{
|
||||||
/* Take care of preliminaries. */
|
/* Take care of preliminaries. */
|
||||||
|
@ -1043,7 +1041,7 @@ int
|
||||||
baseclass_offset (type, index, arg, offset)
|
baseclass_offset (type, index, arg, offset)
|
||||||
struct type *type;
|
struct type *type;
|
||||||
int index;
|
int index;
|
||||||
value arg;
|
value_ptr arg;
|
||||||
int offset;
|
int offset;
|
||||||
{
|
{
|
||||||
struct type *basetype = TYPE_BASECLASS (type, index);
|
struct type *basetype = TYPE_BASECLASS (type, index);
|
||||||
|
@ -1105,7 +1103,7 @@ baseclass_addr (type, index, valaddr, valuep, errp)
|
||||||
struct type *type;
|
struct type *type;
|
||||||
int index;
|
int index;
|
||||||
char *valaddr;
|
char *valaddr;
|
||||||
value *valuep;
|
value_ptr *valuep;
|
||||||
int *errp;
|
int *errp;
|
||||||
{
|
{
|
||||||
struct type *basetype = TYPE_BASECLASS (type, index);
|
struct type *basetype = TYPE_BASECLASS (type, index);
|
||||||
|
@ -1125,7 +1123,7 @@ baseclass_addr (type, index, valaddr, valuep, errp)
|
||||||
{
|
{
|
||||||
if (vb_match (type, i, basetype))
|
if (vb_match (type, i, basetype))
|
||||||
{
|
{
|
||||||
value val = allocate_value (basetype);
|
value_ptr val = allocate_value (basetype);
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
@ -1275,12 +1273,12 @@ modify_field (addr, fieldval, bitpos, bitsize)
|
||||||
|
|
||||||
/* Convert C numbers into newly allocated values */
|
/* Convert C numbers into newly allocated values */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_from_longest (type, num)
|
value_from_longest (type, num)
|
||||||
struct type *type;
|
struct type *type;
|
||||||
register LONGEST num;
|
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 enum type_code code = TYPE_CODE (type);
|
||||||
register int len = TYPE_LENGTH (type);
|
register int len = TYPE_LENGTH (type);
|
||||||
|
|
||||||
|
@ -1306,12 +1304,12 @@ value_from_longest (type, num)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_from_double (type, num)
|
value_from_double (type, num)
|
||||||
struct type *type;
|
struct type *type;
|
||||||
double num;
|
double num;
|
||||||
{
|
{
|
||||||
register value val = allocate_value (type);
|
register value_ptr val = allocate_value (type);
|
||||||
register enum type_code code = TYPE_CODE (type);
|
register enum type_code code = TYPE_CODE (type);
|
||||||
register int len = TYPE_LENGTH (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
|
0 when it is using the value returning conventions (this often
|
||||||
means returning pointer to where structure is vs. returning value). */
|
means returning pointer to where structure is vs. returning value). */
|
||||||
|
|
||||||
value
|
value_ptr
|
||||||
value_being_returned (valtype, retbuf, struct_return)
|
value_being_returned (valtype, retbuf, struct_return)
|
||||||
register struct type *valtype;
|
register struct type *valtype;
|
||||||
char retbuf[REGISTER_BYTES];
|
char retbuf[REGISTER_BYTES];
|
||||||
int struct_return;
|
int struct_return;
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
{
|
{
|
||||||
register value val;
|
register value_ptr val;
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
|
|
||||||
#if defined (EXTRACT_STRUCT_VALUE_ADDRESS)
|
#if defined (EXTRACT_STRUCT_VALUE_ADDRESS)
|
||||||
|
@ -1398,7 +1396,7 @@ value_being_returned (valtype, retbuf, struct_return)
|
||||||
|
|
||||||
int
|
int
|
||||||
using_struct_return (function, funcaddr, value_type, gcc_p)
|
using_struct_return (function, funcaddr, value_type, gcc_p)
|
||||||
value function;
|
value_ptr function;
|
||||||
CORE_ADDR funcaddr;
|
CORE_ADDR funcaddr;
|
||||||
struct type *value_type;
|
struct type *value_type;
|
||||||
int gcc_p;
|
int gcc_p;
|
||||||
|
@ -1423,7 +1421,7 @@ using_struct_return (function, funcaddr, value_type, gcc_p)
|
||||||
|
|
||||||
void
|
void
|
||||||
set_return_value (val)
|
set_return_value (val)
|
||||||
value val;
|
value_ptr val;
|
||||||
{
|
{
|
||||||
register enum type_code code = TYPE_CODE (VALUE_TYPE (val));
|
register enum type_code code = TYPE_CODE (VALUE_TYPE (val));
|
||||||
double dbuf;
|
double dbuf;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue