* config/mips/tm-irix3.h: Clean up, use tm-bigmips.h and redefine

the necessary bits.
	* findvar.c (value_from_register): Fix uninitialized first_addr
	which caused problems with assignment of doubles to register variables
	on some targets.
	* mipsread.c: Remove TM_FILE_OVERRIDE, include tm.h and provide the
	missing mips definitions if necessary.

	Fix handling of double register variables for mips targets and big
	endian hosts. These patches are from Paul Flinders <ptf@delcam.co.uk>.
	* config/mips/tm-mips.h: Increase MAX_REGISTER_{RAW,VIRTUAL}_SIZE to
	  8 bytes for doubles.
	* config/mips/tm-mips.h (REGISTER_CONVERT_TO_TYPE): New macro for
	  conversion of type held in multiple registers to host format.
	* config/mips/tm-mips.h (REGISTER_CONVERT_FROM_TYPE): New macro,
	  companion to REGISTER_CONVERT_TO_TYPE.
	* config/mips/tm-mips.h (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE):
	  Convert to function calls.
	* config/mips/tm-mips.h (FIX_CALL_DUMMY): New code for big endian
	  mips targets.
	* mips-tdep.c (mips_print_register): Raw buffer now needs just
	  MAX_REGISTER_RAW_SIZE bytes.
	* mips-tdep.c (mips_print_register): Use REGISTER_CONVERT_TO_TYPE
	  (if defined) for doubles.
	* mips-tdep.c: (mips_extract_return_value, mips_store_return_value):
	  New functions, take care of REGISTER_CONVERT_TO/FROM_TYPE.
	* valops.c (value_assign): Use REGISTER_CONVERT_TO_TYPE if
	  defined.
	* findvar.c (value_from_register): Use REGISTER_CONVERT_TO_TYPE if
	  defined.
This commit is contained in:
Peter Schauer 1993-05-22 07:26:25 +00:00
parent 43152fe57b
commit ac8cf67dca
5 changed files with 172 additions and 274 deletions

View File

@ -1,3 +1,36 @@
Sat May 22 00:21:41 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* config/mips/tm-irix3.h: Clean up, use tm-bigmips.h and redefine
the necessary bits.
* findvar.c (value_from_register): Fix uninitialized first_addr
which caused problems with assignment of doubles to register variables
on some targets.
* mipsread.c: Remove TM_FILE_OVERRIDE, include tm.h and provide the
missing mips definitions if necessary.
Fix handling of double register variables for mips targets and big
endian hosts. These patches are from Paul Flinders <ptf@delcam.co.uk>.
* config/mips/tm-mips.h: Increase MAX_REGISTER_{RAW,VIRTUAL}_SIZE to
8 bytes for doubles.
* config/mips/tm-mips.h (REGISTER_CONVERT_TO_TYPE): New macro for
conversion of type held in multiple registers to host format.
* config/mips/tm-mips.h (REGISTER_CONVERT_FROM_TYPE): New macro,
companion to REGISTER_CONVERT_TO_TYPE.
* config/mips/tm-mips.h (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE):
Convert to function calls.
* config/mips/tm-mips.h (FIX_CALL_DUMMY): New code for big endian
mips targets.
* mips-tdep.c (mips_print_register): Raw buffer now needs just
MAX_REGISTER_RAW_SIZE bytes.
* mips-tdep.c (mips_print_register): Use REGISTER_CONVERT_TO_TYPE
(if defined) for doubles.
* mips-tdep.c: (mips_extract_return_value, mips_store_return_value):
New functions, take care of REGISTER_CONVERT_TO/FROM_TYPE.
* valops.c (value_assign): Use REGISTER_CONVERT_TO_TYPE if
defined.
* findvar.c (value_from_register): Use REGISTER_CONVERT_TO_TYPE if
defined.
Fri May 21 09:04:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* configure.in: Add i[34]86-*-isc*.

View File

@ -17,67 +17,24 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "coff/sym.h" /* Needed for PDR below. */
#include "coff/symconst.h"
#define TARGET_BYTE_ORDER BIG_ENDIAN
/* Floating point is IEEE compliant */
#define IEEE_FLOAT
#include "mips/tm-bigmips.h"
/* SGI's assembler doesn't grok dollar signs in identifiers.
So we use dots instead. This item must be coordinated with G++. */
#undef CPLUS_MARKER
#define CPLUS_MARKER '.'
/* Offset from address of function to start of its code.
Zero on most machines. */
/* Redefine register numbers for SGI. */
#define FUNCTION_START_OFFSET 0
/* Advance PC across any function entry prologue instructions
to reach some "real" code. */
#define SKIP_PROLOGUE(pc) pc = mips_skip_prologue(pc)
/* Immediately after a function call, return the saved pc.
Can't always 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 SAVED_PC_AFTER_CALL(frame) read_register(RA_REGNUM)
/* Are we currently handling a signal */
#define IN_SIGTRAMP(pc, name) in_sigtramp(pc, name)
/* Address of end of stack space. */
#define STACK_END_ADDR (0x7ffff000)
/* Stack grows downward. */
#define INNER_THAN <
#define BREAKPOINT {0, 0x5, 0, 0xd}
/* Amount PC must be decremented by after a breakpoint.
This is often the number of bytes in BREAKPOINT
but not always. */
#define DECR_PC_AFTER_BREAK 0
/* Nonzero if instruction at PC is a return instruction. "j ra" on mips. */
#define ABOUT_TO_RETURN(pc) (read_memory_integer (pc, 4) == 0x3e00008)
/* Return 1 if P points to an invalid floating point value. */
#define INVALID_FLOAT(p,l) isa_NAN(p,l)
/* Say how long (all) registers are. */
#define REGISTER_TYPE long
#undef NUM_REGS
#undef REGISTER_NAMES
#undef FP0_REGNUM
#undef PC_REGNUM
#undef PS_REGNUM
#undef HI_REGNUM
#undef LO_REGNUM
#undef FCRCS_REGNUM
#undef FCRIR_REGNUM
/* Number of machine registers */
@ -105,11 +62,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
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. */
#define ZERO_REGNUM 0 /* read-only register, always 0 */
#define A0_REGNUM 4 /* Loc of first arg during a subr call */
#define SP_REGNUM 29 /* Contains address of top of stack */
#define FP_REGNUM 30 /* Pseudo register that contains true address of executing stack frame */
#define RA_REGNUM 31 /* Contains return address value */
#define FP0_REGNUM 32 /* Floating point register 0 (single float) */
#define PC_REGNUM 64 /* Contains program counter */
#define PS_REGNUM 65 /* Contains processor status */
@ -117,205 +69,3 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define LO_REGNUM 68 /* ... */
#define FCRCS_REGNUM 69 /* FP control/status */
#define FCRIR_REGNUM 70 /* FP implementation/revision */
/* Define DO_REGISTERS_INFO() to do machine-specific formatting
of register dumps. */
#define DO_REGISTERS_INFO(_regnum, fp) mips_do_registers_info(_regnum, fp)
/* Total amount of space needed to store our copies of the machine's
register state, the array `registers'. */
#define REGISTER_BYTES (NUM_REGS*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 mips, all regs are 4 bytes. */
#define REGISTER_RAW_SIZE(N) 4
/* Number of bytes of storage in the program's representation
for register N. On mips, all regs are 4 bytes. */
#define REGISTER_VIRTUAL_SIZE(N) 4
/* Largest value REGISTER_RAW_SIZE can have. */
#define MAX_REGISTER_RAW_SIZE 4
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
#define MAX_REGISTER_VIRTUAL_SIZE 4
/* Nonzero if register N requires conversion
from raw format to virtual format. */
#define REGISTER_CONVERTIBLE(N) 0
/* Convert data from raw format for register REGNUM
to virtual format for register REGNUM. */
#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,FROM,TO) \
bcopy ((FROM), (TO), 4);
/* Convert data from virtual format for register REGNUM
to raw format for register REGNUM. */
#define REGISTER_CONVERT_TO_RAW(REGNUM,FROM,TO) \
bcopy ((FROM), (TO), 4);
/* Return the GDB type object for the "standard" data type
of data in register N. */
#define REGISTER_VIRTUAL_TYPE(N) builtin_type_int
/* Store the address of the place in which to copy the structure the
subroutine will return. This is called from call_function. */
#define STORE_STRUCT_RETURN(addr, sp) \
{ sp = push_word(sp, addr);}
/* 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. XXX floats */
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
bcopy (REGBUF+REGISTER_BYTE (TYPE_CODE (TYPE) == TYPE_CODE_FLT ? FP0_REGNUM : 2), VALBUF, TYPE_LENGTH (TYPE))
/* Write into appropriate registers a function return value
of type TYPE, given in virtual format. */
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
write_register_bytes (REGISTER_BYTE (TYPE_CODE (TYPE) == TYPE_CODE_FLT ? FP0_REGNUM : 2), VALBUF, TYPE_LENGTH (TYPE))
/* Extract from an array REGBUF containing the (raw) register state
the address in which a function should return its structure value,
as a CORE_ADDR (or an expression that can be used as one). */
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(int *)(REGBUF+16))
/* Structures are returned by ref in extra arg0 */
#define USE_STRUCT_CONVENTION(gcc_p, type) 1
/* Describe the pointer in each stack frame to the previous stack frame
(its caller). */
/* FRAME_CHAIN takes a frame's nominal address
and produces the frame's chain-pointer. */
#define FRAME_CHAIN(thisframe) (FRAME_ADDR)mips_frame_chain(thisframe)
/* Define other aspects of the stack frame. */
/* 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. */
/* We handle this differently for mips, and maybe we should not */
#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) {(FRAMELESS) = 0;}
/* Saved Pc. */
#define FRAME_SAVED_PC(FRAME) (mips_frame_saved_pc(FRAME))
#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
/* Return number of args passed to a frame.
Can return -1, meaning no way to tell. */
#define FRAME_NUM_ARGS(num, fi) (num = mips_frame_num_args(fi))
/* Return number of bytes at start of arglist that are not really args. */
#define FRAME_ARGS_SKIP 0
/* Put here the code to store, into a struct frame_saved_regs,
the addresses of the saved registers of frame described by FRAME_INFO.
This includes special registers such as pc and fp saved in special
ways in the stack frame. sp is even more special:
the address we return for it IS the sp for the next frame. */
#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) ( \
(frame_saved_regs) = *(frame_info)->saved_regs, \
(frame_saved_regs).regs[SP_REGNUM] = (frame_info)->frame)
/* Things needed for making the inferior call functions. */
/* Stack has strict alignment. However, use PUSH_ARGUMENTS
to take care of it. */
/*#define STACK_ALIGN(addr) (((addr)+3)&~3)*/
#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
sp = mips_push_arguments(nargs, args, sp, struct_return, struct_addr)
/* Push an empty stack frame, to record the current PC, etc. */
#define PUSH_DUMMY_FRAME mips_push_dummy_frame()
/* Discard from the stack the innermost frame, restoring all registers. */
#define POP_FRAME mips_pop_frame()
#define MK_OP(op,rs,rt,offset) (((op)<<26)|((rs)<<21)|((rt)<<16)|(offset))
#define CALL_DUMMY_SIZE (16*4)
#define Dest_Reg 2
#define CALL_DUMMY {\
MK_OP(0,RA_REGNUM,0,8), /* jr $ra # Fake ABOUT_TO_RETURN ...*/\
0, /* nop # ... to stop raw backtrace*/\
0x27bd0000, /* addu sp,?0 # Pseudo prologue */\
/* Start here: */\
MK_OP(061,SP_REGNUM,12,0), /* lwc1 $f12,0(sp) # Reload first 4 args*/\
MK_OP(061,SP_REGNUM,13,4), /* lwc1 $f13,4(sp) */\
MK_OP(061,SP_REGNUM,14,8), /* lwc1 $f14,8(sp) */\
MK_OP(061,SP_REGNUM,15,12), /* lwc1 $f15,12(sp) */\
MK_OP(043,SP_REGNUM,4,0), /* lw $r4,0(sp) # Re-load FP regs*/\
MK_OP(043,SP_REGNUM,5,4), /* lw $r5,4(sp) */\
MK_OP(043,SP_REGNUM,6,8), /* lw $r6,8(sp) */\
MK_OP(043,SP_REGNUM,7,12), /* lw $r7,12(sp) */\
(017<<26)| (Dest_Reg << 16), /* lui $r31,<target upper 16 bits>*/\
MK_OP(13,Dest_Reg,Dest_Reg,0), /* ori $r31,$r31,<lower 16 bits>*/ \
(Dest_Reg<<21) | (31<<11) | 9, /* jalr $r31 */\
MK_OP(043,SP_REGNUM,7,12), /* lw $r7,12(sp) */\
0x5000d, /* bpt */\
}
#define CALL_DUMMY_START_OFFSET 12
/* 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, start_sp, fun, nargs, args, rettype, gcc_p)\
(((int*)dummyname)[11] |= (((unsigned long)(fun)) >> 16), \
((int*)dummyname)[12] |= (unsigned short)(fun))
/* Specific information about a procedure.
This overlays the MIPS's PDR records,
mipsread.c (ab)uses this to save memory */
typedef struct mips_extra_func_info {
long numargs; /* number of args to procedure (was iopt) */
PDR pdr; /* Procedure descriptor record */
} *mips_extra_func_info_t;
#define EXTRA_FRAME_INFO \
mips_extra_func_info_t proc_desc; \
int num_args;\
struct frame_saved_regs *saved_regs;
#define INIT_EXTRA_FRAME_INFO(fromleaf, fci) init_extra_frame_info(fci)
/* Special symbol found in blocks associated with routines. We can hang
mips_extra_func_info_t's off of this. */
#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__"
/* Convert a dbx stab register number (from `r' declaration) to a gdb REGNUM */
#define STAB_REG_TO_REGNUM(num) ((num) < 32 ? (num) : (num)+FP0_REGNUM-38)

View File

@ -159,11 +159,11 @@ extern int mips_fpu;
/* Largest value REGISTER_RAW_SIZE can have. */
#define MAX_REGISTER_RAW_SIZE 4
#define MAX_REGISTER_RAW_SIZE 8
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
#define MAX_REGISTER_VIRTUAL_SIZE 4
#define MAX_REGISTER_VIRTUAL_SIZE 8
/* Nonzero if register N requires conversion
from raw format to virtual format. */
@ -189,6 +189,29 @@ extern int mips_fpu;
(((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32) \
? builtin_type_float : builtin_type_int) \
#if HOST_BYTE_ORDER == BIG_ENDIAN
/* All mips targets store doubles in a register pair with the least
significant register in the lower numbered register.
If the host is big endian, double register values need conversion between
memory and register formats. */
#define REGISTER_CONVERT_TO_TYPE(n, type, buffer) \
do {if ((n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32 && \
TYPE_CODE(type) == TYPE_CODE_FLT && TYPE_LENGTH(type) == 8) { \
char __temp[4]; \
memcpy (__temp, ((char *)(buffer))+4, 4); \
memcpy (((char *)(buffer))+4, (buffer), 4); \
memcpy (((char *)(buffer)), __temp, 4); }} while (0)
#define REGISTER_CONVERT_FROM_TYPE(n, type, buffer) \
do {if ((n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32 && \
TYPE_CODE(type) == TYPE_CODE_FLT && TYPE_LENGTH(type) == 8) { \
char __temp[4]; \
memcpy (__temp, ((char *)(buffer))+4, 4); \
memcpy (((char *)(buffer))+4, (buffer), 4); \
memcpy (((char *)(buffer)), __temp, 4); }} while (0)
#endif
/* Store the address of the place in which to copy the structure the
subroutine will return. This is called from call_function. */
@ -200,13 +223,13 @@ extern int mips_fpu;
into VALBUF. XXX floats */
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
bcopy (REGBUF + REGISTER_BYTE ((TYPE_CODE (TYPE) == TYPE_CODE_FLT && mips_fpu) ? FP0_REGNUM : 2), VALBUF, TYPE_LENGTH (TYPE))
mips_extract_return_value(TYPE, REGBUF, VALBUF)
/* Write into appropriate registers a function return value
of type TYPE, given in virtual format. */
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
write_register_bytes (REGISTER_BYTE ((TYPE_CODE (TYPE) == TYPE_CODE_FLT && mips_fpu) ? FP0_REGNUM : 2), VALBUF, TYPE_LENGTH (TYPE))
mips_store_return_value(TYPE, VALBUF)
/* Extract from an array REGBUF containing the (raw) register state
the address in which a function should return its structure value,
@ -309,6 +332,32 @@ extern int mips_fpu;
/* Insert the specified number of args and function address
into a call sequence of the above form stored at DUMMYNAME. */
#if TARGET_BYTE_ORDER == BIG_ENDIAN
/* For big endian mips machines the loading of FP values depends on whether
they are single or double precision. */
#define FIX_CALL_DUMMY(dummyname, start_sp, fun, nargs, args, rettype, gcc_p) \
do { \
((int*)(dummyname))[11] |= ((unsigned long)(fun)) >> 16; \
((int*)(dummyname))[12] |= (unsigned short)(fun); \
if (! mips_fpu) { \
((int *) (dummyname))[3] = 0; ((int *) (dummyname))[4] = 0; \
((int *) (dummyname))[5] = 0; ((int *) (dummyname))[6] = 0; \
} else { \
if (nargs > 0 && \
TYPE_CODE(VALUE_TYPE(args[0])) == TYPE_CODE_FLT && \
TYPE_LENGTH(VALUE_TYPE(args[0])) == 8) { \
((int *) (dummyname))[3] = MK_OP(061,SP_REGNUM,12,4); \
((int *) (dummyname))[4] = MK_OP(061,SP_REGNUM,13,0); \
} \
if (nargs > 1 && \
TYPE_CODE(VALUE_TYPE(args[1])) == TYPE_CODE_FLT && \
TYPE_LENGTH(VALUE_TYPE(args[1])) == 8) { \
((int *) (dummyname))[5] = MK_OP(061,SP_REGNUM,14,12); \
((int *) (dummyname))[6] = MK_OP(061,SP_REGNUM,15,8); \
} \
} \
} while (0)
#else
#define FIX_CALL_DUMMY(dummyname, start_sp, fun, nargs, args, rettype, gcc_p)\
do \
{ \
@ -323,6 +372,7 @@ extern int mips_fpu;
} \
} \
while (0)
#endif
/* There's a mess in stack frame creation. See comments in blockframe.c
near reference to INIT_FRAME_PC_FIRST. */

View File

@ -32,7 +32,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#endif
#include <sys/param.h>
#include <sys/dir.h>
#include <signal.h>
#include <sys/ioctl.h>
@ -613,7 +612,7 @@ static void
mips_print_register (regnum, all)
int regnum, all;
{
unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE * 2]; /* *2 for doubles */
unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE];
REGISTER_TYPE val;
/* Get the data in raw format. */
@ -626,9 +625,15 @@ mips_print_register (regnum, all)
/* If an even floating pointer register, also print as double. */
if (regnum >= FP0_REGNUM && regnum < FP0_REGNUM+32
&& !((regnum-FP0_REGNUM) & 1)) {
read_relative_register_raw_bytes (regnum+1, raw_buffer+4);
char dbuffer[MAX_REGISTER_RAW_SIZE];
read_relative_register_raw_bytes (regnum, dbuffer);
read_relative_register_raw_bytes (regnum+1, dbuffer+4);
#ifdef REGISTER_CONVERT_TO_TYPE
REGISTER_CONVERT_TO_TYPE(regnum, builtin_type_double, dbuffer);
#endif
printf_filtered ("(d%d: ", regnum-FP0_REGNUM);
val_print (builtin_type_double, raw_buffer, 0,
val_print (builtin_type_double, dbuffer, 0,
stdout, 0, 1, 0, Val_pretty_default);
printf_filtered ("); ");
}
@ -801,6 +806,44 @@ mips_skip_prologue(pc)
#endif
}
/* Given a return value in `regbuf' with a type `valtype',
extract and copy its value into `valbuf'. */
void
mips_extract_return_value (valtype, regbuf, valbuf)
struct type *valtype;
char regbuf[REGISTER_BYTES];
char *valbuf;
{
int regnum;
regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2;
memcpy (valbuf, regbuf + REGISTER_BYTE (regnum), TYPE_LENGTH (valtype));
#ifdef REGISTER_CONVERT_TO_TYPE
REGISTER_CONVERT_TO_TYPE(regnum, valtype, valbuf);
#endif
}
/* Given a return value in `regbuf' with a type `valtype',
write it's value into the appropriate register. */
void
mips_store_return_value (valtype, valbuf)
struct type *valtype;
char *valbuf;
{
int regnum;
char raw_buffer[MAX_REGISTER_RAW_SIZE];
regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2;
memcpy(raw_buffer, valbuf, TYPE_LENGTH (valtype));
#ifdef REGISTER_CONVERT_FROM_TYPE
REGISTER_CONVERT_FROM_TYPE(regnum, valtype, raw_buffer);
#endif
write_register_bytes(REGISTER_BYTE (regnum), raw_buffer, TYPE_LENGTH (valtype));
}
/* Let the user turn off floating point and set the fence post for
heuristic_proc_start. */
@ -819,7 +862,7 @@ or dealing with return values.", &setlist),
(add_set_cmd ("heuristic-fence-post", class_support, var_uinteger,
(char *) &heuristic_fence_post,
"Set the distance searched for the start of a function.\n\
Set number of bytes to be searched backward to find the beginning of a
Set number of bytes to be searched backward to find the beginning of a\n\
function without symbols.", &setlist),
&showlist);
}

View File

@ -45,9 +45,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
This module can read all four of the known byte-order combinations,
on any type of host. */
#define TM_FILE_OVERRIDE
#include "defs.h"
#include "mips/tm-mips.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbcore.h"
@ -58,6 +56,25 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "stabsread.h"
#include "complaints.h"
/* These are needed if the tm.h file does not contain the necessary
mips specific definitions. */
#ifndef MIPS_EFI_SYMBOL_NAME
#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__"
#include "coff/sym.h"
#include "coff/symconst.h"
typedef struct mips_extra_func_info {
long numargs;
PDR pdr;
} *mips_extra_func_info_t;
#ifndef RA_REGNUM
#define RA_REGNUM 0
#endif
#ifndef FP0_REGNUM
#define FP0_REGNUM 0
#endif
#endif
#ifdef USG
#include <sys/types.h>
#define L_SET 0
@ -415,8 +432,6 @@ mipscoff_psymtab_to_symtab (pst)
printf_filtered ("Reading in symbols for %s...", pst->filename);
fflush (stdout);
}
/* Get the BFD and list of pending typedefs */
cur_bfd = CUR_BFD (pst);
next_symbol_text_func = mips_next_symbol_text;
@ -2392,8 +2407,15 @@ psymtab_to_symtab_1 (pst, filename)
pst->dependencies[i]->filename);
}
/* Do nothing if this is a dummy psymtab. */
if (pst->n_global_syms == 0 && pst->n_static_syms == 0
&& pst->textlow == 0 && pst->texthigh == 0)
return;
/* Now read the symbols for this symtab */
cur_bfd = CUR_BFD (pst);
current_objfile = pst->objfile;
cur_fd = FDR_IDX (pst);
fh = (cur_fd == -1) ? (FDR *) NULL : ecoff_data (cur_bfd)->fdr + cur_fd;