2003-08-21 Andrew Cagney <cagney@redhat.com>

* config/sparc/tm-sp64.h: Delete #if !GDB_MULTI_ARCH and #if 0 code.
	* config/sparc/tm-sparc.h: Ditto.
	* config/arm/tm-arm.h (GDB_MULTI_ARCH): Define GDB_MULTI_ARCH
	unconditionally.
	* config/pa/tm-hppa.h (GDB_MULTI_ARCH): Ditto.
This commit is contained in:
Andrew Cagney 2003-08-22 00:35:32 +00:00
parent 9839561f87
commit 435ac22849
5 changed files with 8 additions and 711 deletions

View File

@ -1,3 +1,11 @@
2003-08-21 Andrew Cagney <cagney@redhat.com>
* config/sparc/tm-sp64.h: Delete #if !GDB_MULTI_ARCH and #if 0 code.
* config/sparc/tm-sparc.h: Ditto.
* config/arm/tm-arm.h (GDB_MULTI_ARCH): Define GDB_MULTI_ARCH
unconditionally.
* config/pa/tm-hppa.h (GDB_MULTI_ARCH): Ditto.
2003-07-13 Mark Kettenis <kettenis@gnu.org>
* objfiles.h (struct objfile): Add memebers `data' and `num_data'.

View File

@ -22,9 +22,7 @@
#ifndef TM_ARM_H
#define TM_ARM_H
#ifndef GDB_MULTI_ARCH
#define GDB_MULTI_ARCH 1
#endif
/* Specify that for the native compiler variables for a particular
lexical context are listed after the beginning LBRAC instead of

View File

@ -27,9 +27,7 @@
/* Wonder if this is correct? Should be using push_dummy_call(). */
#define DEPRECATED_DUMMY_WRITE_SP(SP) deprecated_write_sp (SP)
#ifndef GDB_MULTI_ARCH
#define GDB_MULTI_ARCH 1
#endif
/* NOTE: cagney/2002-11-24: This is a guess. */
#define DEPRECATED_USE_GENERIC_DUMMY_FRAMES 0

View File

@ -77,365 +77,6 @@ struct type;
nop
*/
#if !defined (GDB_MULTI_ARCH) || (GDB_MULTI_ARCH == 0)
/*
* The following defines must go away for MULTI_ARCH.
*/
#ifndef DO_CALL_DUMMY_ON_STACK
/*
* These defines will suffice for the AT_ENTRY_POINT call dummy method.
*/
#undef CALL_DUMMY
#define CALL_DUMMY {0}
#undef DEPRECATED_CALL_DUMMY_LENGTH
#define DEPRECATED_CALL_DUMMY_LENGTH 0
#undef CALL_DUMMY_CALL_OFFSET
#define CALL_DUMMY_CALL_OFFSET 0
#undef DEPRECATED_CALL_DUMMY_START_OFFSET
#define DEPRECATED_CALL_DUMMY_START_OFFSET 0
#undef DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET
#define DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET 0
#undef CALL_DUMMY_LOCATION
#define CALL_DUMMY_LOCATION AT_ENTRY_POINT
#undef DEPRECATED_PC_IN_CALL_DUMMY
#define DEPRECATED_PC_IN_CALL_DUMMY(pc, sp, frame_address) deprecated_pc_in_call_dummy_at_entry_point (pc, sp, frame_address)
#undef DEPRECATED_CALL_DUMMY_STACK_ADJUST
#define DEPRECATED_CALL_DUMMY_STACK_ADJUST 128
#undef DEPRECATED_SIZEOF_CALL_DUMMY_WORDS
#define DEPRECATED_SIZEOF_CALL_DUMMY_WORDS 0
#undef CALL_DUMMY_ADDRESS
#define CALL_DUMMY_ADDRESS() entry_point_address()
#undef DEPRECATED_FIX_CALL_DUMMY
#define DEPRECATED_FIX_CALL_DUMMY(DUMMYNAME, PC, FUN, NARGS, ARGS, TYPE, GCC_P)
#undef DEPRECATED_PUSH_RETURN_ADDRESS
#define DEPRECATED_PUSH_RETURN_ADDRESS(PC, SP) sparc_at_entry_push_return_address (PC, SP)
extern CORE_ADDR sparc_at_entry_push_return_address (CORE_ADDR pc,
CORE_ADDR sp);
#undef STORE_STRUCT_RETURN
#define STORE_STRUCT_RETURN(ADDR, SP) \
sparc_at_entry_store_struct_return (ADDR, SP)
extern void sparc_at_entry_store_struct_return (CORE_ADDR addr, CORE_ADDR sp);
#else
/*
* Old call dummy method, with CALL_DUMMY on the stack.
*/
#undef CALL_DUMMY
#define CALL_DUMMY { 0x9de3bec0fd3fa7f7LL, 0xf93fa7eff53fa7e7LL,\
0xf13fa7dfed3fa7d7LL, 0xe93fa7cfe53fa7c7LL,\
0xe13fa7bfdd3fa7b7LL, 0xd93fa7afd53fa7a7LL,\
0xd13fa79fcd3fa797LL, 0xc93fa78fc53fa787LL,\
0xc13fa77fcc3fa777LL, 0xc83fa76fc43fa767LL,\
0xc03fa75ffc3fa757LL, 0xf83fa74ff43fa747LL,\
0xf03fa73f01000000LL, 0x0100000001000000LL,\
0x0100000091580000LL, 0xd027a72b93500000LL,\
0xd027a72791480000LL, 0xd027a72391400000LL,\
0xd027a71fda5ba8a7LL, 0xd85ba89fd65ba897LL,\
0xd45ba88fd25ba887LL, 0x9fc02000d05ba87fLL,\
0x0100000091d02001LL, 0x0100000001000000LL }
/* 128 is to reserve space to write the %i/%l registers that will be restored
when we resume. */
#undef DEPRECATED_CALL_DUMMY_STACK_ADJUST
#define DEPRECATED_CALL_DUMMY_STACK_ADJUST 128
/* Size of the call dummy in bytes. */
#undef DEPRECATED_CALL_DUMMY_LENGTH
#define DEPRECATED_CALL_DUMMY_LENGTH 192
/* Offset within CALL_DUMMY of the 'call' instruction. */
#undef DEPRECATED_CALL_DUMMY_START_OFFSET
#define DEPRECATED_CALL_DUMMY_START_OFFSET 148
/* Offset within CALL_DUMMY of the 'call' instruction. */
#undef CALL_DUMMY_CALL_OFFSET
#define CALL_DUMMY_CALL_OFFSET (DEPRECATED_CALL_DUMMY_START_OFFSET + (5 * 4))
/* Offset within CALL_DUMMY of the 'ta 1' instruction. */
#undef DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET
#define DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET (DEPRECATED_CALL_DUMMY_START_OFFSET + (8 * 4))
/* Call dummy will be located on the stack. */
#undef CALL_DUMMY_LOCATION
#define CALL_DUMMY_LOCATION ON_STACK
#undef DEPRECATED_PC_IN_CALL_DUMMY
#define DEPRECATED_PC_IN_CALL_DUMMY(pc, sp, frame_address) deprecated_pc_in_call_dummy_on_stack (pc, sp, frame_address)
/* Insert the function address into the call dummy. */
#undef DEPRECATED_FIX_CALL_DUMMY
#define DEPRECATED_FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
sparc_fix_call_dummy (dummyname, pc, fun, type, gcc_p)
void sparc_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun,
struct type *value_type, int using_gcc);
/* The remainder of these will accept the default definition. */
#undef DEPRECATED_SIZEOF_CALL_DUMMY_WORDS
#undef DEPRECATED_PUSH_RETURN_ADDRESS
#undef CALL_DUMMY_ADDRESS
#undef STORE_STRUCT_RETURN
#endif
/* Does the specified function use the "struct returning" convention
or the "value returning" convention? The "value returning" convention
almost invariably returns the entire value in registers. The
"struct returning" convention often returns the entire value in
memory, and passes a pointer (out of or into the function) saying
where the value (is or should go).
Since this sometimes depends on whether it was compiled with GCC,
this is also an argument. This is used in call_function to build a
stack, and in value_being_returned to print return values.
On Sparc64, we only pass pointers to structs if they're larger than
32 bytes. Otherwise they're stored in %o0-%o3 (floating-point
values go into %fp0-%fp3). */
#undef USE_STRUCT_CONVENTION
#define USE_STRUCT_CONVENTION(gcc_p, type) (TYPE_LENGTH (type) > 32)
CORE_ADDR sparc64_push_arguments (int,
struct value **, CORE_ADDR, int, CORE_ADDR);
#undef DEPRECATED_PUSH_ARGUMENTS
#define DEPRECATED_PUSH_ARGUMENTS(A,B,C,D,E) \
(sparc64_push_arguments ((A), (B), (C), (D), (E)))
/* Store the address of the place in which to copy the structure the
subroutine will return. This is called from call_function. */
/* FIXME: V9 uses %o0 for this. */
#undef STORE_STRUCT_RETURN
#define STORE_STRUCT_RETURN(ADDR, SP) \
{ target_write_memory ((SP)+(16*8), (char *)&(ADDR), 8); }
/* Stack must be aligned on 128-bit boundaries when synthesizing
function calls. */
#undef STACK_ALIGN
#define STACK_ALIGN(ADDR) (((ADDR) + 15 ) & -16)
/* Initializer for an array of names of registers.
There should be NUM_REGS strings in this initializer. */
/* Some of these registers are only accessible from priviledged mode.
They are here for kernel debuggers, etc. */
/* FIXME: icc and xcc are currently considered separate registers.
This may have to change and consider them as just one (ccr).
Let's postpone this as long as we can. It's nice to be able to set
them individually. */
/* FIXME: fcc0-3 are currently separate, even though they are also part of
fsr. May have to remove them but let's postpone this as long as
possible. It's nice to be able to set them individually. */
/* FIXME: Whether to include f33, f35, etc. here is not clear.
There are advantages and disadvantages. */
#undef REGISTER_NAMES
#define REGISTER_NAMES \
{ "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7", \
"o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7", \
"l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", \
"i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7", \
\
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
"f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46", \
"f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62", \
\
"pc", "npc", "ccr", "fsr", "fprs", "y", "asi", \
"ver", "tick", "pil", "pstate", \
"tstate", "tba", "tl", "tt", "tpc", "tnpc", "wstate", \
"cwp", "cansave", "canrestore", "cleanwin", "otherwin", \
"asr16", "asr17", "asr18", "asr19", "asr20", "asr21", \
"asr22", "asr23", "asr24", "asr25", "asr26", "asr27", \
"asr28", "asr29", "asr30", "asr31", \
/* These are here at the end to simplify removing them if we have to. */ \
"icc", "xcc", "fcc0", "fcc1", "fcc2", "fcc3" \
}
extern const char *legacy_register_name (int i);
#define REGISTER_NAME legacy_register_name
#undef REG_STRUCT_HAS_ADDR
#define REG_STRUCT_HAS_ADDR(gcc_p,type) (TYPE_LENGTH (type) > 32)
extern CORE_ADDR sparc64_read_sp ();
extern CORE_ADDR sparc64_read_fp ();
extern void sparc64_write_sp (CORE_ADDR);
#define TARGET_READ_SP() (sparc64_read_sp ())
#define DEPRECATED_TARGET_READ_FP() (sparc64_read_fp ())
#define DEPRECATED_DUMMY_WRITE_SP(X) (sparc64_write_sp (X))
#undef DEPRECATED_EXTRACT_RETURN_VALUE
#define DEPRECATED_EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
sp64_extract_return_value(TYPE, REGBUF, VALBUF, 0)
extern void sp64_extract_return_value (struct type *, char[], char *, int);
/* Register numbers of various important registers.
Note that some of these values are "real" register numbers,
and correspond to the general registers of the machine,
and some are "phony" register numbers which are too large
to be actual register numbers as far as the user is concerned
but do serve to get the desired values when passed to read_register. */
#if 0 /* defined in tm-sparc.h, replicated
for doc purposes */
#define G0_REGNUM 0 /* %g0 */
#define G1_REGNUM 1 /* %g1 */
#define O0_REGNUM 8 /* %o0 */
#define SP_REGNUM 14 /* Contains address of top of stack, \
which is also the bottom of the frame. */
#define RP_REGNUM 15 /* Contains return address value, *before* \
any windows get switched. */
#define O7_REGNUM 15 /* Last local reg not saved on stack frame */
#define L0_REGNUM 16 /* First local reg that's saved on stack frame
rather than in machine registers */
#define I0_REGNUM 24 /* %i0 */
#define DEPRECATED_FP_REGNUM 30 /* Contains address of executing stack frame */
#define I7_REGNUM 31 /* Last local reg saved on stack frame */
#define FP0_REGNUM 32 /* Floating point register 0 */
#endif
/*#define FP_MAX_REGNUM 80*/ /* 1 + last fp reg number */
/* #undef v8 misc. regs */
#undef Y_REGNUM
#undef PS_REGNUM
#undef WIM_REGNUM
#undef TBR_REGNUM
#undef PC_REGNUM
#undef NPC_REGNUM
#undef FPS_REGNUM
#undef CPS_REGNUM
/* v9 misc. and priv. regs */
#define C0_REGNUM 80 /* Start of control registers */
#define PC_REGNUM (C0_REGNUM + 0) /* Current PC */
#define NPC_REGNUM (C0_REGNUM + 1) /* Next PC */
#define CCR_REGNUM (C0_REGNUM + 2) /* Condition Code Register (%xcc,%icc) */
#define FSR_REGNUM (C0_REGNUM + 3) /* Floating Point State */
#define FPRS_REGNUM (C0_REGNUM + 4) /* Floating Point Registers State */
#define Y_REGNUM (C0_REGNUM + 5) /* Temp register for multiplication, etc. */
#define ASI_REGNUM (C0_REGNUM + 6) /* Alternate Space Identifier */
#define VER_REGNUM (C0_REGNUM + 7) /* Version register */
#define TICK_REGNUM (C0_REGNUM + 8) /* Tick register */
#define PIL_REGNUM (C0_REGNUM + 9) /* Processor Interrupt Level */
#define PSTATE_REGNUM (C0_REGNUM + 10) /* Processor State */
#define TSTATE_REGNUM (C0_REGNUM + 11) /* Trap State */
#define TBA_REGNUM (C0_REGNUM + 12) /* Trap Base Address */
#define TL_REGNUM (C0_REGNUM + 13) /* Trap Level */
#define TT_REGNUM (C0_REGNUM + 14) /* Trap Type */
#define TPC_REGNUM (C0_REGNUM + 15) /* Trap pc */
#define TNPC_REGNUM (C0_REGNUM + 16) /* Trap npc */
#define WSTATE_REGNUM (C0_REGNUM + 17) /* Window State */
#define CWP_REGNUM (C0_REGNUM + 18) /* Current Window Pointer */
#define CANSAVE_REGNUM (C0_REGNUM + 19) /* Savable Windows */
#define CANRESTORE_REGNUM (C0_REGNUM + 20) /* Restorable Windows */
#define CLEANWIN_REGNUM (C0_REGNUM + 21) /* Clean Windows */
#define OTHERWIN_REGNUM (C0_REGNUM + 22) /* Other Windows */
#define ASR_REGNUM(n) (C0_REGNUM+(23-16)+(n)) /* Ancillary State Register
(n = 16...31) */
#define ICC_REGNUM (C0_REGNUM + 39) /* 32 bit condition codes */
#define XCC_REGNUM (C0_REGNUM + 40) /* 64 bit condition codes */
#define FCC0_REGNUM (C0_REGNUM + 41) /* fp cc reg 0 */
#define FCC1_REGNUM (C0_REGNUM + 42) /* fp cc reg 1 */
#define FCC2_REGNUM (C0_REGNUM + 43) /* fp cc reg 2 */
#define FCC3_REGNUM (C0_REGNUM + 44) /* fp cc reg 3 */
/* Number of machine registers. */
#undef NUM_REGS
#define NUM_REGS 125
/* Total amount of space needed to store our copies of the machine's
register state, the array `registers'.
Some of the registers aren't 64 bits, but it's a lot simpler just to assume
they all are (since most of them are). */
#undef DEPRECATED_REGISTER_BYTES
#define DEPRECATED_REGISTER_BYTES (32*8+32*8+45*8)
/* Index within `registers' of the first byte of the space for
register N. */
#undef REGISTER_BYTE
#define REGISTER_BYTE(N) \
((N) < 32 ? (N)*8 \
: (N) < 64 ? 32*8 + ((N)-32)*4 \
: (N) < C0_REGNUM ? 32*8 + 32*4 + ((N)-64)*8 \
: 64*8 + ((N)-C0_REGNUM)*8)
/* Say how long (ordinary) registers are. This is a piece of bogosity
used in push_word and a few other places; REGISTER_RAW_SIZE is the
real way to know how big a register is. */
#undef DEPRECATED_REGISTER_SIZE
#define DEPRECATED_REGISTER_SIZE 8
/* Number of bytes of storage in the actual machine representation
for register N. */
#undef REGISTER_RAW_SIZE
#define REGISTER_RAW_SIZE(N) \
((N) < 32 ? 8 : (N) < 64 ? 4 : 8)
/* Number of bytes of storage in the program's representation
for register N. */
#undef REGISTER_VIRTUAL_SIZE
#define REGISTER_VIRTUAL_SIZE(N) \
((N) < 32 ? 8 : (N) < 64 ? 4 : 8)
/* Largest value REGISTER_RAW_SIZE can have. */
/* tm-sparc.h defines this as 8, but play it safe. */
#undef DEPRECATED_MAX_REGISTER_RAW_SIZE
#define DEPRECATED_MAX_REGISTER_RAW_SIZE 8
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
/* tm-sparc.h defines this as 8, but play it safe. */
#undef DEPRECATED_MAX_REGISTER_VIRTUAL_SIZE
#define DEPRECATED_MAX_REGISTER_VIRTUAL_SIZE 8
/* Return the GDB type object for the "standard" data type
of data in register N. */
#undef REGISTER_VIRTUAL_TYPE
#define REGISTER_VIRTUAL_TYPE(N) \
((N) < 32 ? builtin_type_long_long \
: (N) < 64 ? builtin_type_float \
: (N) < 80 ? builtin_type_double \
: builtin_type_long_long)
/* We use to support both 32 bit and 64 bit pointers.
We can't anymore because TARGET_PTR_BIT must now be a constant. */
#undef TARGET_PTR_BIT
#define TARGET_PTR_BIT 64
/* Longs are 64 bits. */
#undef TARGET_LONG_BIT
#define TARGET_LONG_BIT 64
#undef TARGET_LONG_LONG_BIT
#define TARGET_LONG_LONG_BIT 64
/* Return number of bytes at start of arglist that are not really args. */
#undef FRAME_ARGS_SKIP
#define FRAME_ARGS_SKIP 136
#endif /* GDB_MULTI_ARCH */
/* Offsets into jmp_buf.
FIXME: This was borrowed from the v8 stuff and will probably have to change
for v9. */

View File

@ -118,8 +118,6 @@ enum { /* Sparc64 control registers, excluding Y, PC, and NPC. */
* Make sparc target multi-archable: April 2000
*/
#if defined (GDB_MULTI_ARCH) && (GDB_MULTI_ARCH > 0)
/* Multi-arch definition of TARGET_IS_SPARC64, TARGET_ELF64 */
#undef GDB_TARGET_IS_SPARC64
#define GDB_TARGET_IS_SPARC64 \
@ -128,190 +126,7 @@ enum { /* Sparc64 control registers, excluding Y, PC, and NPC. */
#define TARGET_ELF64 \
(sparc_intreg_size () == 8)
extern int sparc_intreg_size (void);
#else
/* Non-multi-arch: if it isn't defined, define it to zero. */
#ifndef GDB_TARGET_IS_SPARC64
#define GDB_TARGET_IS_SPARC64 0
#endif
#ifndef TARGET_ELF64
#define TARGET_ELF64 0
#endif
#endif
#if !defined (GDB_MULTI_ARCH) || (GDB_MULTI_ARCH == 0)
/*
* The following defines must go away for MULTI_ARCH
*/
/* Initializer for an array of names of registers.
There should be NUM_REGS strings in this initializer. */
#define REGISTER_NAMES \
{ "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7", \
"o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7", \
"l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", \
"i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7", \
\
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
\
"y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr" \
}
extern const char *legacy_register_name (int i);
#define REGISTER_NAME legacy_register_name
/* Offset from address of function to start of its code.
Zero on most machines. */
#define FUNCTION_START_OFFSET 0
/* Amount PC must be decremented by after a breakpoint. This is often
the number of bytes returned by BREAKPOINT_FROM_PC but not always. */
#define DECR_PC_AFTER_BREAK 0
/* Say how long (ordinary) registers are. This is a piece of bogosity
used in push_word and a few other places; REGISTER_RAW_SIZE is the
real way to know how big a register is. */
#define DEPRECATED_REGISTER_SIZE 4
/* Number of machine registers */
#define NUM_REGS 72
#define SP_REGNUM 14 /* Contains address of top of stack, \
which is also the bottom of the frame. */
#define DEPRECATED_FP_REGNUM 30 /* Contains address of executing stack frame */
#define FP0_REGNUM 32 /* Floating point register 0 */
#define Y_REGNUM 64 /* Temp register for multiplication, etc. */
#define PC_REGNUM 68 /* Contains program counter */
#define NPC_REGNUM 69 /* Contains next PC */
/* Total amount of space needed to store our copies of the machine's
register state, the array `registers'. On the sparc, `registers'
contains the ins and locals, even though they are saved on the
stack rather than with the other registers, and this causes hair
and confusion in places like pop_frame. It might be better to
remove the ins and locals from `registers', make sure that
frame_register() can get them from the stack (even in the innermost
frame), and make this the way to access them. For the frame
pointer we would do that via DEPRECATED_TARGET_READ_FP. On the
other hand, that is likely to be confusing or worse for flat
frames. */
#define DEPRECATED_REGISTER_BYTES (32*4+32*4+8*4)
/* Index within `registers' of the first byte of the space for
register N. */
#define REGISTER_BYTE(N) ((N)*4)
/* Number of bytes of storage in the actual machine representation for
register N. */
/* On the SPARC, all regs are 4 bytes (except Sparc64, where they're 8). */
#define REGISTER_RAW_SIZE(N) (4)
/* Number of bytes of storage in the program's representation
for register N. */
/* On the SPARC, all regs are 4 bytes (except Sparc64, where they're 8). */
#define REGISTER_VIRTUAL_SIZE(N) (4)
/* Largest value REGISTER_RAW_SIZE can have. */
#define DEPRECATED_MAX_REGISTER_RAW_SIZE 8
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
#define DEPRECATED_MAX_REGISTER_VIRTUAL_SIZE 8
/* Return the GDB type object for the "standard" data type
of data in register N. */
#define REGISTER_VIRTUAL_TYPE(N) \
((N) < 32 ? builtin_type_int : (N) < 64 ? builtin_type_float : \
builtin_type_int)
/* Sun /bin/cc gets this right as of SunOS 4.1.x. We need to define
BELIEVE_PCC_PROMOTION to get this right now that the code which
detects gcc2_compiled. is broken. This loses for SunOS 4.0.x and
earlier. */
#define BELIEVE_PCC_PROMOTION 1
/* Advance PC across any function entry prologue instructions
to reach some "real" code. */
extern CORE_ADDR sparc_skip_prologue (CORE_ADDR);
#define SKIP_PROLOGUE(PC) sparc_skip_prologue (PC)
/* Immediately after a function call, return the saved pc.
Can't go through the frames for this because on some machines
the new frame is not set up until the new function executes
some instructions. */
#define DEPRECATED_SAVED_PC_AFTER_CALL(FRAME) PC_ADJUST (read_register (RP_REGNUM))
/* Stack grows downward. */
#define INNER_THAN(LHS,RHS) ((LHS) < (RHS))
/* Write into appropriate registers a function return value of type
TYPE, given in virtual format. */
#define STORE_RETURN_VALUE(TYPE, REGCACHE, VALBUF) \
sparc32_store_return_value (TYPE, REGCACHE, VALBUF)
extern void sparc32_store_return_value (struct type *, struct regcache *,
const void *);
/* Extract from REGCACHE the address in which a function should return
its structure value. */
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGCACHE) \
sparc_extract_struct_value_address (REGCACHE)
extern CORE_ADDR sparc_extract_struct_value_address (struct regcache *);
/* Stack must be aligned on 64-bit boundaries when synthesizing
function calls (128-bit for sparc64). */
#define STACK_ALIGN(ADDR) sparc32_stack_align (ADDR)
extern CORE_ADDR sparc32_stack_align (CORE_ADDR addr);
/* The Sparc returns long doubles on the stack. */
#define RETURN_VALUE_ON_STACK(TYPE) \
(TYPE_CODE(TYPE) == TYPE_CODE_FLT \
&& TYPE_LENGTH(TYPE) > 8)
/* When passing a structure to a function, Sun cc passes the address
not the structure itself. It (under SunOS4) creates two symbols,
which we need to combine to a LOC_REGPARM. Gcc version two (as of
1.92) behaves like sun cc. REG_STRUCT_HAS_ADDR is smart enough to
distinguish between Sun cc, gcc version 1 and gcc version 2. */
#define REG_STRUCT_HAS_ADDR(GCC_P, TYPE) \
sparc_reg_struct_has_addr (GCC_P, TYPE)
extern int sparc_reg_struct_has_addr (int, struct type *);
/* Is the prologue at PC frameless? */
#define PROLOGUE_FRAMELESS_P(PC) sparc_prologue_frameless_p (PC)
extern int sparc_prologue_frameless_p (CORE_ADDR);
#endif /* GDB_MULTI_ARCH */
#if defined (GDB_MULTI_ARCH) && (GDB_MULTI_ARCH > 0)
/*
* The following defines should ONLY appear for MULTI_ARCH.
*/
@ -319,8 +134,6 @@ extern int sparc_prologue_frameless_p (CORE_ADDR);
/* Multi-arch the nPC and Y registers. */
#define Y_REGNUM (sparc_y_regnum ())
#endif /* GDB_MULTI_ARCH */
/* On the Sun 4 under SunOS, the compile will leave a fake insn which
encodes the structure size being returned. If we detect such
a fake insn, step past it. */
@ -393,69 +206,6 @@ extern const unsigned char *sparc_breakpoint_from_pc (CORE_ADDR *pc, int *len);
#define CANNOT_STORE_REGISTER(regno) ((regno) == G0_REGNUM)
/*
* DEPRECATED_FRAME_CHAIN and FRAME_INFO definitions, collected here
* for convenience. */
#if !defined (GDB_MULTI_ARCH) || (GDB_MULTI_ARCH == 0)
/*
* The following defines must go away for MULTI_ARCH.
*/
/* Describe the pointer in each stack frame to the previous stack frame
(its caller). */
/* DEPRECATED_FRAME_CHAIN takes a frame's nominal address and produces
the frame's chain-pointer. */
/* We need to override DEPRECATED_GET_SAVED_REGISTER so that we can
deal with the way outs change into ins in different frames. */
void sparc_get_saved_register (char *raw_buffer,
int *optimized,
CORE_ADDR * addrp,
struct frame_info *frame,
int regnum, enum lval_type *lvalp);
#define DEPRECATED_GET_SAVED_REGISTER(RAW_BUFFER, OPTIMIZED, ADDRP, FRAME, REGNUM, LVAL) \
sparc_get_saved_register (RAW_BUFFER, OPTIMIZED, ADDRP, \
FRAME, REGNUM, LVAL)
#define DEPRECATED_FRAME_INIT_SAVED_REGS(FP) /*no-op */
#define DEPRECATED_INIT_EXTRA_FRAME_INFO(FROMLEAF, FCI) \
sparc_init_extra_frame_info (FROMLEAF, FCI)
extern void sparc_init_extra_frame_info (int, struct frame_info *);
#define DEPRECATED_FRAME_CHAIN(THISFRAME) (sparc_frame_chain (THISFRAME))
extern CORE_ADDR sparc_frame_chain (struct frame_info *);
/* A macro that tells us whether the function invocation represented
by FI does not have a frame on the stack associated with it. If it
does not, FRAMELESS is set to 1, else 0. */
#define FRAMELESS_FUNCTION_INVOCATION(FI) \
frameless_look_for_prologue (FI)
/* Where is the PC for a specific frame */
#define DEPRECATED_FRAME_SAVED_PC(FRAME) sparc_frame_saved_pc (FRAME)
extern CORE_ADDR sparc_frame_saved_pc (struct frame_info *);
/* If the argument is on the stack, it will be here. */
#define DEPRECATED_FRAME_ARGS_ADDRESS(FI) (get_frame_base (FI))
#define DEPRECATED_FRAME_LOCALS_ADDRESS(FI) (get_frame_base (FI))
/* Set VAL to the number of args passed to frame described by FI.
Can set VAL to -1, meaning no way to tell. */
/* Return number of bytes at start of arglist that are not really args. */
#define FRAME_ARGS_SKIP 68
#endif /* GDB_MULTI_ARCH */
#define PRINT_EXTRA_FRAME_INFO(FI) \
sparc_print_extra_frame_info (FI)
extern void sparc_print_extra_frame_info (struct frame_info *);
@ -573,106 +323,8 @@ extern CORE_ADDR init_frame_pc_noop (int fromleaf, struct frame_info *prev);
clobbering things (if NPC pointed to garbage instead).
*/
#if !defined (GDB_MULTI_ARCH) || (GDB_MULTI_ARCH == 0)
/*
* The following defines must go away for MULTI_ARCH.
*/
#define CALL_DUMMY { 0xbc100001, 0x9de38000, 0xbc100002, 0xbe100003, \
0xda03a058, 0xd803a054, 0xd603a050, 0xd403a04c, \
0xd203a048, 0x40000000, 0xd003a044, 0x01000000, \
0x91d02001, 0x01000000 }
/* Size of the call dummy in bytes. */
#define DEPRECATED_CALL_DUMMY_LENGTH 0x38
/* Offset within call dummy of first instruction to execute. */
#define DEPRECATED_CALL_DUMMY_START_OFFSET 0
/* Offset within CALL_DUMMY of the 'call' instruction. */
#define CALL_DUMMY_CALL_OFFSET (DEPRECATED_CALL_DUMMY_START_OFFSET + 0x24)
/* Offset within CALL_DUMMY of the 'ta 1' trap instruction. */
#define DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET (DEPRECATED_CALL_DUMMY_START_OFFSET + 0x30)
#define DEPRECATED_CALL_DUMMY_STACK_ADJUST 68
/* Call dummy method (eg. on stack, at entry point, etc.) */
#define CALL_DUMMY_LOCATION ON_STACK
/* Method for detecting dummy frames. */
#define DEPRECATED_PC_IN_CALL_DUMMY(PC, SP, FRAME_ADDRESS) \
deprecated_pc_in_call_dummy_on_stack (PC, SP, FRAME_ADDRESS)
#endif /* GDB_MULTI_ARCH */
#endif /* CALL_DUMMY */
#if !defined (GDB_MULTI_ARCH) || (GDB_MULTI_ARCH == 0)
/*
* The following defines must go away for MULTI_ARCH.
*/
/* Insert the specified number of args and function address
into a call sequence of the above form stored at DUMMYNAME. */
#define DEPRECATED_FIX_CALL_DUMMY(DUMMYNAME, PC, FUN, NARGS, ARGS, TYPE, GCC_P) \
sparc_fix_call_dummy (DUMMYNAME, PC, FUN, TYPE, GCC_P)
void sparc_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun,
struct type *value_type, int using_gcc);
/* Arguments smaller than an int must be promoted to ints when
synthesizing function calls. */
/* Push an empty stack frame, to record the current PC, etc. */
#define DEPRECATED_PUSH_DUMMY_FRAME sparc_push_dummy_frame ()
#define DEPRECATED_POP_FRAME sparc_pop_frame ()
void sparc_push_dummy_frame (void);
void sparc_pop_frame (void);
#define DEPRECATED_PUSH_ARGUMENTS(NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR) \
sparc32_push_arguments (NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR)
extern CORE_ADDR sparc32_push_arguments (int, struct value **, CORE_ADDR, int,
CORE_ADDR);
/* Store the address of the place in which to copy the structure the
subroutine will return. This is called from call_function_by_hand.
The ultimate mystery is, tho, what is the value "16"? */
#define STORE_STRUCT_RETURN(ADDR, SP) \
{ char val[4]; \
store_unsigned_integer (val, 4, (ADDR)); \
write_memory ((SP)+(16*4), val, 4); }
/* Default definition of USE_STRUCT_CONVENTION. */
#ifndef USE_STRUCT_CONVENTION
#define USE_STRUCT_CONVENTION(GCC_P, TYPE) \
generic_use_struct_convention (GCC_P, TYPE)
#endif
/* Extract from an array REGBUF containing the (raw) register state a
function return value of type TYPE, and copy that, in virtual
format, into VALBUF. */
#define EXTRACT_RETURN_VALUE(TYPE, REGCACHE, VALBUF) \
sparc32_extract_return_value (TYPE, REGCACHE, VALBUF)
extern void sparc32_extract_return_value (struct type *, struct regcache *,
void *valbuf);
#endif /* GDB_MULTI_ARCH */
/* Sparc has no reliable single step ptrace call */
#define SOFTWARE_SINGLE_STEP_P() 1