mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 10:35:12 +08:00
* rs6000-tdep.c: Changes throughout for multi-arch 64-bit
support. Incorporate most of tm-rs6000.h. (find_toc_address_hook): Rename to rs6000_find_toc_address_hook. (rs6000_set_host_arch_hook): Declare. (read_memory_addr): Define. (pop_frame): Rename to rs6000_pop_frame. (rs6000_pop_frame, rs6000_fix_call_dummy, rs6000_push_arguments, rs6000_frame_saved_pc, rs6000_frame_chain): Remove non-generic dummy frame handling. (branch_dest, rs6000_pop_frame, rs6000_skip_trampoline_code, rs6000_frame_saved_pc, frame_get_saved_regs, frame_initial_stack_address, rs6000_frame_chain, rs6000_convert_from_func_ptr_addr): Call read_memory_addr instead of read_memory_integer. (branch_dest, rs6000_pop_frame, rs6000_push_arguments, rs6000_skip_trampoline_code, rs6000_frame_saved_pc, frame_get_saved_regs, frame_initial_stack_address, rs6000_frame_chain): Replace 4 with TDEP->wordsize. (skip_prologue): Recognize some 64-bit stack adjustments. (push_dummy_frame, pop_dummy_frame, set_processor, show_processor): Delete. (frame_get_saved_regs): Manipulate saved register addresses using CORE_ADDR instead of int. (rs6000_create_inferior): New function. (register_names_*[]): Change to struct reg registers_*[]. (variants[]): Assimilate into multi-arch approach. (register_names_*[], variants[]): Refer to pre-PowerPC architectures as POWER instead of RS6000. * rs6000-nat.c: Ubiquitous changes for 64-bit support. (vmap_secs, xcoff_relocate_symtab): Cast addresses to unsigned long to avoid sign-extension errors. (set_host_arch): New function. (xcoff_relocate_symtab): Try disabling usleep(36000) workaround. (rs6000_core_fns): Use new bfd_target_xcoff_flavour. (_initialize_core_rs6000): Initialize rs6000_set_host_arch_hook. * symfile.c (find_sym_fns): Remove special xcoff kludge. * xcoffread.c (secnum_to_bfd_section): Initialize args.objfile. (process_linenos): Query line struct size from coff backend instead of using compile-time constant. (enter_line_range): Likewise. (read_xcoff_symtab): Pass "XCOFF64" instead of "XCOFF" to record_debugformat() if appropriate. (process_xcoff_symbol): Access symbol addresses using SYMBOL_VALUE_ADDRESS instead of SYMBOL_VALUE. (read_symbol_lineno): Retrieve XCOFF64 symbol names from strtbl. (scan_xcoff_symtab): Likewise. Query syment struct size from coff backend instead of using compile-time constant. (xcoff_sym_fns): Set flavour to bfd_target_xcoff_flavour. * Makefile.in (INTERNAL_LDFLAGS): Add $(MH_LDFLAGS) to list of flags that this Makefile variable get set to. (From Kevin Buettner.) * config/powerpc/aix.mh (MH_LDFLAGS): Add linker flags so that the TOC doesn't overflow. (From Kevin Buettner.) * config/powerpc/tm-ppc-aix.h: Move config decisions to multi-arched rs6000-tdep.c. * config/rs6000/tm-rs6000.h: Likewise. (GDB_MULTI_ARCH): Define. (skip_trampoline_code): Rename to rs6000_skip_trampoline_code. (is_magic_function_pointer): Replace with rs6000_convert_from_func_ptr_addr. (TARGET_CREATE_INFERIOR_HOOK): Define. (find_toc_address_hook): Rename to rs6000_find_toc_address_hook. (rs6000_set_host_arch_hook): Declare. * config/rs6000/nm-rs6000.h (CHILD_XFER_MEMORY): Define.
This commit is contained in:
parent
39c20e8f1e
commit
7a78ae4e6b
@ -1,3 +1,69 @@
|
||||
2000-06-16 Nicholas Duffek <nsd@redhat.com>
|
||||
|
||||
* rs6000-tdep.c: Changes throughout for multi-arch 64-bit
|
||||
support. Incorporate most of tm-rs6000.h.
|
||||
(find_toc_address_hook): Rename to rs6000_find_toc_address_hook.
|
||||
(rs6000_set_host_arch_hook): Declare.
|
||||
(read_memory_addr): Define.
|
||||
(pop_frame): Rename to rs6000_pop_frame.
|
||||
(rs6000_pop_frame, rs6000_fix_call_dummy, rs6000_push_arguments,
|
||||
rs6000_frame_saved_pc, rs6000_frame_chain): Remove non-generic
|
||||
dummy frame handling.
|
||||
(branch_dest, rs6000_pop_frame, rs6000_skip_trampoline_code,
|
||||
rs6000_frame_saved_pc, frame_get_saved_regs,
|
||||
frame_initial_stack_address, rs6000_frame_chain,
|
||||
rs6000_convert_from_func_ptr_addr): Call read_memory_addr instead
|
||||
of read_memory_integer.
|
||||
(branch_dest, rs6000_pop_frame, rs6000_push_arguments,
|
||||
rs6000_skip_trampoline_code, rs6000_frame_saved_pc,
|
||||
frame_get_saved_regs, frame_initial_stack_address,
|
||||
rs6000_frame_chain): Replace 4 with TDEP->wordsize.
|
||||
(skip_prologue): Recognize some 64-bit stack adjustments.
|
||||
(push_dummy_frame, pop_dummy_frame, set_processor,
|
||||
show_processor): Delete.
|
||||
(frame_get_saved_regs): Manipulate saved register addresses using
|
||||
CORE_ADDR instead of int.
|
||||
(rs6000_create_inferior): New function.
|
||||
(register_names_*[]): Change to struct reg registers_*[].
|
||||
(variants[]): Assimilate into multi-arch approach.
|
||||
(register_names_*[], variants[]): Refer to pre-PowerPC
|
||||
architectures as POWER instead of RS6000.
|
||||
* rs6000-nat.c: Ubiquitous changes for 64-bit support.
|
||||
(vmap_secs, xcoff_relocate_symtab): Cast addresses
|
||||
to unsigned long to avoid sign-extension errors.
|
||||
(set_host_arch): New function.
|
||||
(xcoff_relocate_symtab): Try disabling usleep(36000) workaround.
|
||||
(rs6000_core_fns): Use new bfd_target_xcoff_flavour.
|
||||
(_initialize_core_rs6000): Initialize rs6000_set_host_arch_hook.
|
||||
* symfile.c (find_sym_fns): Remove special xcoff kludge.
|
||||
* xcoffread.c (secnum_to_bfd_section): Initialize args.objfile.
|
||||
(process_linenos): Query line struct size from coff
|
||||
backend instead of using compile-time constant.
|
||||
(enter_line_range): Likewise.
|
||||
(read_xcoff_symtab): Pass "XCOFF64" instead of "XCOFF" to
|
||||
record_debugformat() if appropriate.
|
||||
(process_xcoff_symbol): Access symbol addresses using
|
||||
SYMBOL_VALUE_ADDRESS instead of SYMBOL_VALUE.
|
||||
(read_symbol_lineno): Retrieve XCOFF64 symbol names from strtbl.
|
||||
(scan_xcoff_symtab): Likewise. Query syment struct size from
|
||||
coff backend instead of using compile-time constant.
|
||||
(xcoff_sym_fns): Set flavour to bfd_target_xcoff_flavour.
|
||||
* Makefile.in (INTERNAL_LDFLAGS): Add $(MH_LDFLAGS) to list of flags
|
||||
that this Makefile variable get set to. (From Kevin Buettner.)
|
||||
* config/powerpc/aix.mh (MH_LDFLAGS): Add linker flags so that
|
||||
the TOC doesn't overflow. (From Kevin Buettner.)
|
||||
* config/powerpc/tm-ppc-aix.h: Move config decisions to
|
||||
multi-arched rs6000-tdep.c.
|
||||
* config/rs6000/tm-rs6000.h: Likewise.
|
||||
(GDB_MULTI_ARCH): Define.
|
||||
(skip_trampoline_code): Rename to rs6000_skip_trampoline_code.
|
||||
(is_magic_function_pointer): Replace with
|
||||
rs6000_convert_from_func_ptr_addr.
|
||||
(TARGET_CREATE_INFERIOR_HOOK): Define.
|
||||
(find_toc_address_hook): Rename to rs6000_find_toc_address_hook.
|
||||
(rs6000_set_host_arch_hook): Declare.
|
||||
* config/rs6000/nm-rs6000.h (CHILD_XFER_MEMORY): Define.
|
||||
|
||||
2000-06-15 Kevin Buettner <kevinb@redhat.com>
|
||||
|
||||
* v850ice.c: Eliminate use of PARAMS from this file.
|
||||
|
@ -299,7 +299,7 @@ INTERNAL_CFLAGS = $(INTERNAL_WARN_CFLAGS) $(GDB_WERROR_CFLAGS)
|
||||
# Profiling options need to go here to work.
|
||||
# I think it's perfectly reasonable for a user to set -pg in CFLAGS
|
||||
# and have it work; that's why CFLAGS is here.
|
||||
INTERNAL_LDFLAGS = $(CFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) $(LDFLAGS) $(CONFIG_LDFLAGS) @HLDFLAGS@
|
||||
INTERNAL_LDFLAGS = $(CFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) $(MH_LDFLAGS) $(LDFLAGS) $(CONFIG_LDFLAGS) @HLDFLAGS@
|
||||
HLDENV = @HLDENV@
|
||||
|
||||
# If your system is missing alloca(), or, more likely, it's there but
|
||||
@ -342,7 +342,7 @@ RUNTESTFLAGS=
|
||||
# part of libiberty) a POSIX interface. But at least for now the
|
||||
# host-dependent makefile fragment might need to use something else
|
||||
# besides ser-unix.o
|
||||
SER_HARDWIRE = @SER_HARDWIRE@
|
||||
SER_HARDWIRE = ser-unix.o ser-pipe.o
|
||||
|
||||
# The `remote' debugging target is supported for most architectures,
|
||||
# but not all (e.g. 960)
|
||||
|
@ -9,3 +9,6 @@ NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o rs6000-nat.o xcoffread
|
||||
# When compiled with cc, for debugging, this argument should be passed.
|
||||
# We have no idea who our current compiler is though, so we skip it.
|
||||
# MH_CFLAGS = -bnodelcsect
|
||||
|
||||
# gdb is too big for all of its external symbols to fit in a small TOC
|
||||
MH_LDFLAGS = -Wl,-bbigtoc
|
||||
|
@ -24,23 +24,4 @@
|
||||
/* Use generic RS6000 definitions. */
|
||||
#include "rs6000/tm-rs6000.h"
|
||||
|
||||
#define GDB_TARGET_POWERPC
|
||||
|
||||
#undef PUSH_DUMMY_FRAME
|
||||
#define PUSH_DUMMY_FRAME generic_push_dummy_frame ()
|
||||
|
||||
#define PUSH_RETURN_ADDRESS(PC, SP) ppc_push_return_address (PC, SP)
|
||||
|
||||
/* override the standard get_saved_register function with
|
||||
one that takes account of generic CALL_DUMMY frames */
|
||||
#define GET_SAVED_REGISTER(raw_buffer, optimized, addrp, frame, regnum, lval) \
|
||||
generic_get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval)
|
||||
|
||||
#define USE_GENERIC_DUMMY_FRAMES 1
|
||||
#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
|
||||
#define CALL_DUMMY_LOCATION AT_ENTRY_POINT
|
||||
#define CALL_DUMMY_ADDRESS() entry_point_address ()
|
||||
#undef CALL_DUMMY_START_OFFSET
|
||||
#define CALL_DUMMY_START_OFFSET 0
|
||||
|
||||
#endif /* TM_PPC_AIX_H */
|
||||
|
@ -29,6 +29,10 @@
|
||||
|
||||
#define FETCH_INFERIOR_REGISTERS
|
||||
|
||||
/* Override child_xfer_memory in infptrace.c. */
|
||||
|
||||
#define CHILD_XFER_MEMORY
|
||||
|
||||
/* When a child process is just starting, we sneak in and relocate
|
||||
the symbol table (and other stuff) after the dynamic linker has
|
||||
figured out where they go. */
|
||||
|
@ -20,10 +20,7 @@
|
||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Forward decls for prototypes */
|
||||
struct frame_info;
|
||||
struct type;
|
||||
struct value;
|
||||
#define GDB_MULTI_ARCH 1
|
||||
|
||||
/* Minimum possible text address in AIX */
|
||||
|
||||
@ -34,83 +31,16 @@ struct value;
|
||||
#define PC_LOAD_SEGMENT(PC) pc_load_segment_name(PC)
|
||||
extern char *pc_load_segment_name (CORE_ADDR);
|
||||
|
||||
/* AIX cc seems to get this right. */
|
||||
|
||||
#define BELIEVE_PCC_PROMOTION 1
|
||||
|
||||
/* return true if a given `pc' value is in `call dummy' function. */
|
||||
/* FIXME: This just checks for the end of the stack, which is broken
|
||||
for things like stepping through gcc nested function stubs. */
|
||||
#define PC_IN_CALL_DUMMY(STOP_PC, STOP_SP, STOP_FRAME_ADDR) \
|
||||
(STOP_SP < STOP_PC && STOP_PC < STACK_END_ADDR)
|
||||
|
||||
#if 0
|
||||
extern unsigned int text_start, data_start;
|
||||
extern char *corefile;
|
||||
#endif
|
||||
extern int inferior_pid;
|
||||
|
||||
/* We are missing register descriptions in the system header files. Sigh! */
|
||||
|
||||
struct regs
|
||||
{
|
||||
int gregs[32]; /* general purpose registers */
|
||||
int pc; /* program conter */
|
||||
int ps; /* processor status, or machine state */
|
||||
};
|
||||
|
||||
struct fp_status
|
||||
{
|
||||
double fpregs[32]; /* floating GP registers */
|
||||
};
|
||||
|
||||
|
||||
/* To be used by skip_prologue. */
|
||||
|
||||
struct rs6000_framedata
|
||||
{
|
||||
int offset; /* total size of frame --- the distance
|
||||
by which we decrement sp to allocate
|
||||
the frame */
|
||||
int saved_gpr; /* smallest # of saved gpr */
|
||||
int saved_fpr; /* smallest # of saved fpr */
|
||||
int alloca_reg; /* alloca register number (frame ptr) */
|
||||
char frameless; /* true if frameless functions. */
|
||||
char nosavedpc; /* true if pc not saved. */
|
||||
int gpr_offset; /* offset of saved gprs from prev sp */
|
||||
int fpr_offset; /* offset of saved fprs from prev sp */
|
||||
int lr_offset; /* offset of saved lr */
|
||||
int cr_offset; /* offset of saved cr */
|
||||
};
|
||||
|
||||
/* Define the byte order of the machine. */
|
||||
|
||||
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
|
||||
|
||||
/* AIX'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. */
|
||||
|
||||
#define FUNCTION_START_OFFSET 0
|
||||
|
||||
/* Advance PC across any function entry prologue instructions
|
||||
to reach some "real" code. */
|
||||
|
||||
extern CORE_ADDR rs6000_skip_prologue (CORE_ADDR);
|
||||
#define SKIP_PROLOGUE(pc) (rs6000_skip_prologue (pc))
|
||||
|
||||
extern CORE_ADDR skip_prologue (CORE_ADDR, struct rs6000_framedata *);
|
||||
|
||||
|
||||
/* If PC is in some function-call trampoline code, return the PC
|
||||
where the function itself actually starts. If not, return NULL. */
|
||||
|
||||
#define SKIP_TRAMPOLINE_CODE(pc) skip_trampoline_code (pc)
|
||||
extern CORE_ADDR skip_trampoline_code (CORE_ADDR);
|
||||
#define SKIP_TRAMPOLINE_CODE(pc) rs6000_skip_trampoline_code (pc)
|
||||
extern CORE_ADDR rs6000_skip_trampoline_code (CORE_ADDR);
|
||||
|
||||
/* Number of trap signals we need to skip over, once the inferior process
|
||||
starts running. */
|
||||
@ -138,57 +68,6 @@ extern CORE_ADDR skip_trampoline_code (CORE_ADDR);
|
||||
#define PROCESS_LINENUMBER_HOOK() aix_process_linenos ()
|
||||
extern void aix_process_linenos (void);
|
||||
|
||||
/* 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 SAVED_PC_AFTER_CALL(frame) read_register (LR_REGNUM)
|
||||
|
||||
/* Address of end of stack space. */
|
||||
|
||||
#define STACK_END_ADDR 0x2ff80000
|
||||
|
||||
/* Stack grows downward. */
|
||||
|
||||
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
|
||||
|
||||
/* This is how arguments pushed onto stack or passed in registers.
|
||||
Stack must be aligned on 64-bit boundaries when synthesizing
|
||||
function calls. We don't need STACK_ALIGN, PUSH_ARGUMENTS will
|
||||
handle it. */
|
||||
|
||||
#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
|
||||
(rs6000_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr)))
|
||||
extern CORE_ADDR rs6000_push_arguments (int, struct value **, CORE_ADDR, int,
|
||||
CORE_ADDR);
|
||||
|
||||
/* BREAKPOINT_FROM_PC uses the program counter value to determine the
|
||||
breakpoint that should be used */
|
||||
extern breakpoint_from_pc_fn rs6000_breakpoint_from_pc;
|
||||
#define BREAKPOINT_FROM_PC(pcptr, lenptr) rs6000_breakpoint_from_pc (pcptr, lenptr)
|
||||
|
||||
/* 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
|
||||
|
||||
/* 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 REGISTER_SIZE 4
|
||||
|
||||
|
||||
/* Return the name of register number REG. This may return "" to
|
||||
indicate a register number that's not used on this variant.
|
||||
(Register numbers may be sparse for consistency between variants.) */
|
||||
#define REGISTER_NAME(reg) (rs6000_register_name(reg))
|
||||
extern char *rs6000_register_name (int reg);
|
||||
|
||||
/* Number of machine registers */
|
||||
#define NUM_REGS 183
|
||||
|
||||
/* 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,
|
||||
@ -196,331 +75,24 @@ extern char *rs6000_register_name (int reg);
|
||||
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 FP_REGNUM 1 /* Contains address of executing stack frame */
|
||||
#define SP_REGNUM 1 /* Contains address of top of stack */
|
||||
#define TOC_REGNUM 2 /* TOC register */
|
||||
#define FP0_REGNUM 32 /* Floating point register 0 */
|
||||
#define GP0_REGNUM 0 /* GPR register 0 */
|
||||
#define FP0_REGNUM 32 /* FPR (Floating point) register 0 */
|
||||
#define FPLAST_REGNUM 63 /* Last floating point register */
|
||||
|
||||
/* Special purpose registers... */
|
||||
/* P.S. keep these in the same order as in /usr/mstsave.h `mstsave'
|
||||
structure, for easier processing */
|
||||
|
||||
#define PC_REGNUM 64 /* Program counter (instruction address %iar) */
|
||||
#define PS_REGNUM 65 /* Processor (or machine) status (%msr) */
|
||||
#define CR_REGNUM 66 /* Condition register */
|
||||
#define LR_REGNUM 67 /* Link register */
|
||||
#define CTR_REGNUM 68 /* Count register */
|
||||
#define XER_REGNUM 69 /* Fixed point exception registers */
|
||||
#define MQ_REGNUM 70 /* Multiply/quotient register */
|
||||
|
||||
/* These #defines are used to parse core files and talk to ptrace, so they
|
||||
must remain fixed. */
|
||||
#define FIRST_UISA_SP_REGNUM 64 /* first special register number */
|
||||
#define LAST_UISA_SP_REGNUM 70 /* last special register number */
|
||||
|
||||
/* This is the offset in REG_NAMES at which the `set processor'
|
||||
command starts plugging in its names. */
|
||||
#define FIRST_VARIANT_REGISTER 66
|
||||
|
||||
/* Total amount of space needed to store our copies of the machine's
|
||||
register state, the array `registers'.
|
||||
32 4-byte gpr's
|
||||
32 8-byte fpr's
|
||||
7 4-byte UISA special purpose registers,
|
||||
16 4-byte segment registers,
|
||||
32 4-byte standard OEA special-purpose registers,
|
||||
and up to 64 4-byte non-standard OEA special purpose regs.
|
||||
total: (+ (* 32 4) (* 32 8) (* 7 4) (* 16 4) (* 32 4) (* 64 4)) 860 bytes
|
||||
Keep some extra space for now, in case to add more. */
|
||||
#define REGISTER_BYTES 880
|
||||
|
||||
|
||||
/* Index within `registers' of the first byte of the space for
|
||||
register N. */
|
||||
|
||||
#define REGISTER_BYTE(N) \
|
||||
( \
|
||||
((N) > FPLAST_REGNUM) ? ((((N) - FPLAST_REGNUM -1) * 4) + 384)\
|
||||
:((N) >= FP0_REGNUM) ? ((((N) - FP0_REGNUM) * 8) + 128) \
|
||||
:((N) * 4) )
|
||||
|
||||
/* Number of bytes of storage in the actual machine representation
|
||||
for register N. */
|
||||
/* Note that the unsigned cast here forces the result of the
|
||||
subtraction to very high positive values if N < FP0_REGNUM */
|
||||
|
||||
#define REGISTER_RAW_SIZE(N) (((unsigned)(N) - FP0_REGNUM) < 32 ? 8 : 4)
|
||||
|
||||
/* Number of bytes of storage in the program's representation
|
||||
for register N. On the RS6000, all regs are 4 bytes
|
||||
except the floating point regs which are 8-byte doubles. */
|
||||
|
||||
#define REGISTER_VIRTUAL_SIZE(N) (((unsigned)(N) - FP0_REGNUM) < 32 ? 8 : 4)
|
||||
|
||||
/* Largest value REGISTER_RAW_SIZE can have. */
|
||||
|
||||
#define MAX_REGISTER_RAW_SIZE 8
|
||||
|
||||
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
|
||||
|
||||
#define MAX_REGISTER_VIRTUAL_SIZE 8
|
||||
|
||||
/* convert a dbx stab register number (from `r' declaration) to a gdb REGNUM */
|
||||
|
||||
#define STAB_REG_TO_REGNUM(value) (value)
|
||||
|
||||
/* Nonzero if register N requires conversion
|
||||
from raw format to virtual format.
|
||||
The register format for rs6000 floating point registers is always
|
||||
double, we need a conversion if the memory format is float. */
|
||||
|
||||
#define REGISTER_CONVERTIBLE(N) ((N) >= FP0_REGNUM && (N) <= FPLAST_REGNUM)
|
||||
|
||||
/* Convert data from raw format for register REGNUM in buffer FROM
|
||||
to virtual format with type TYPE in buffer TO. */
|
||||
|
||||
#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \
|
||||
{ \
|
||||
if (TYPE_LENGTH (TYPE) != REGISTER_RAW_SIZE (REGNUM)) \
|
||||
{ \
|
||||
double val = extract_floating ((FROM), REGISTER_RAW_SIZE (REGNUM)); \
|
||||
store_floating ((TO), TYPE_LENGTH (TYPE), val); \
|
||||
} \
|
||||
else \
|
||||
memcpy ((TO), (FROM), REGISTER_RAW_SIZE (REGNUM)); \
|
||||
}
|
||||
|
||||
/* Convert data from virtual format with type TYPE in buffer FROM
|
||||
to raw format for register REGNUM in buffer TO. */
|
||||
|
||||
#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \
|
||||
{ \
|
||||
if (TYPE_LENGTH (TYPE) != REGISTER_RAW_SIZE (REGNUM)) \
|
||||
{ \
|
||||
double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \
|
||||
store_floating ((TO), REGISTER_RAW_SIZE (REGNUM), val); \
|
||||
} \
|
||||
else \
|
||||
memcpy ((TO), (FROM), REGISTER_RAW_SIZE (REGNUM)); \
|
||||
}
|
||||
|
||||
/* Return the GDB type object for the "standard" data type
|
||||
of data in register N. */
|
||||
|
||||
#define REGISTER_VIRTUAL_TYPE(N) \
|
||||
(((unsigned)(N) - FP0_REGNUM) < 32 ? builtin_type_double : 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. */
|
||||
/* in RS6000, struct return addresses are passed as an extra parameter in r3.
|
||||
In function return, callee is not responsible of returning this address back.
|
||||
Since gdb needs to find it, we will store in a designated variable
|
||||
`rs6000_struct_return_address'. */
|
||||
|
||||
extern CORE_ADDR rs6000_struct_return_address;
|
||||
|
||||
#define STORE_STRUCT_RETURN(ADDR, SP) \
|
||||
{ write_register (3, (ADDR)); \
|
||||
rs6000_struct_return_address = (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. */
|
||||
|
||||
/* #define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
|
||||
memcpy (VALBUF, REGBUF, TYPE_LENGTH (TYPE)) */
|
||||
|
||||
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
|
||||
extract_return_value(TYPE,REGBUF,VALBUF)
|
||||
extern void extract_return_value (struct type *, char[], char *);
|
||||
|
||||
/* Write into appropriate registers a function return value
|
||||
of type TYPE, given in virtual format. */
|
||||
|
||||
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
|
||||
{ \
|
||||
if (TYPE_CODE (TYPE) == TYPE_CODE_FLT) \
|
||||
\
|
||||
/* Floating point values are returned starting from FPR1 and up. \
|
||||
Say a double_double_double type could be returned in \
|
||||
FPR1/FPR2/FPR3 triple. */ \
|
||||
\
|
||||
write_register_bytes (REGISTER_BYTE (FP0_REGNUM+1), (VALBUF), \
|
||||
TYPE_LENGTH (TYPE)); \
|
||||
else \
|
||||
/* Everything else is returned in GPR3 and up. */ \
|
||||
write_register_bytes (REGISTER_BYTE (GP0_REGNUM+3), (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) rs6000_struct_return_address
|
||||
|
||||
/* 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. */
|
||||
|
||||
/* In the case of the RS6000, the frame's nominal address
|
||||
is the address of a 4-byte word containing the calling frame's address. */
|
||||
|
||||
#define FRAME_CHAIN(thisframe) rs6000_frame_chain (thisframe)
|
||||
CORE_ADDR rs6000_frame_chain (struct frame_info *);
|
||||
|
||||
/* 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. */
|
||||
|
||||
extern int rs6000_frameless_function_invocation (struct frame_info *);
|
||||
#define FRAMELESS_FUNCTION_INVOCATION(FI) \
|
||||
(rs6000_frameless_function_invocation (FI))
|
||||
|
||||
#define INIT_FRAME_PC_FIRST(fromleaf, prev) \
|
||||
prev->pc = (fromleaf ? SAVED_PC_AFTER_CALL (prev->next) : \
|
||||
prev->next ? FRAME_SAVED_PC (prev->next) : read_pc ());
|
||||
#define INIT_FRAME_PC(fromleaf, prev) /* nothing */
|
||||
extern void rs6000_init_extra_frame_info (int fromleaf, struct frame_info *);
|
||||
#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) rs6000_init_extra_frame_info (fromleaf, fi)
|
||||
|
||||
/* If the kernel has to deliver a signal, it pushes a sigcontext
|
||||
structure on the stack and then calls the signal handler, passing
|
||||
the address of the sigcontext in an argument register. Usually
|
||||
the signal handler doesn't save this register, so we have to
|
||||
access the sigcontext structure via an offset from the signal handler
|
||||
frame.
|
||||
The following constants were determined by experimentation on AIX 3.2. */
|
||||
#define SIG_FRAME_PC_OFFSET 96
|
||||
#define SIG_FRAME_LR_OFFSET 108
|
||||
#define SIG_FRAME_FP_OFFSET 284
|
||||
|
||||
/* Default offset from SP where the LR is stored */
|
||||
#define DEFAULT_LR_SAVE 8
|
||||
|
||||
/* Return saved PC from a frame */
|
||||
#define FRAME_SAVED_PC(FRAME) rs6000_frame_saved_pc (FRAME)
|
||||
|
||||
extern unsigned long rs6000_frame_saved_pc (struct frame_info *);
|
||||
|
||||
extern CORE_ADDR rs6000_frame_args_address (struct frame_info *);
|
||||
#define FRAME_ARGS_ADDRESS(FI) rs6000_frame_args_address (FI)
|
||||
|
||||
#define FRAME_LOCALS_ADDRESS(FI) FRAME_ARGS_ADDRESS(FI)
|
||||
|
||||
|
||||
/* Set VAL to the number of args passed to frame described by FI.
|
||||
Can set VAL to -1, meaning no way to tell. */
|
||||
|
||||
/* We can't tell how many args there are
|
||||
now that the C compiler delays popping them. */
|
||||
|
||||
#define FRAME_NUM_ARGS(fi) (-1)
|
||||
|
||||
/* Return number of bytes at start of arglist that are not really args. */
|
||||
|
||||
#define FRAME_ARGS_SKIP 8 /* Not sure on this. FIXMEmgo */
|
||||
|
||||
/* 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. */
|
||||
/* In the following implementation for RS6000, we did *not* save sp. I am
|
||||
not sure if it will be needed. The following macro takes care of gpr's
|
||||
and fpr's only. */
|
||||
|
||||
extern void rs6000_frame_init_saved_regs (struct frame_info *);
|
||||
#define FRAME_INIT_SAVED_REGS(FI) rs6000_frame_init_saved_regs (FI)
|
||||
|
||||
/* Things needed for making the inferior call functions. */
|
||||
|
||||
/* Push an empty stack frame, to record the current PC, etc. */
|
||||
/* Change these names into rs6k_{push, pop}_frame(). FIXMEmgo. */
|
||||
|
||||
#define PUSH_DUMMY_FRAME push_dummy_frame ()
|
||||
extern void push_dummy_frame (void);
|
||||
|
||||
/* Discard from the stack the innermost frame,
|
||||
restoring all saved registers. */
|
||||
|
||||
#define POP_FRAME pop_frame ()
|
||||
extern void pop_frame (void);
|
||||
|
||||
/* This sequence of words is the instructions:
|
||||
|
||||
mflr r0 // 0x7c0802a6
|
||||
// save fpr's
|
||||
stfd r?, num(r1) // 0xd8010000 there should be 32 of this??
|
||||
// save gpr's
|
||||
stm r0, num(r1) // 0xbc010000
|
||||
stu r1, num(r1) // 0x94210000
|
||||
|
||||
// the function we want to branch might be in a different load
|
||||
// segment. reset the toc register. Note that the actual toc address
|
||||
// will be fix by fix_call_dummy () along with function address.
|
||||
|
||||
st r2, 0x14(r1) // 0x90410014 save toc register
|
||||
liu r2, 0x1234 // 0x3c401234 reset a new toc value 0x12345678
|
||||
oril r2, r2,0x5678 // 0x60425678
|
||||
|
||||
// load absolute address 0x12345678 to r0
|
||||
liu r0, 0x1234 // 0x3c001234
|
||||
oril r0, r0,0x5678 // 0x60005678
|
||||
mtctr r0 // 0x7c0903a6 ctr <- r0
|
||||
bctrl // 0x4e800421 jump subroutine 0x12345678 (%ctr)
|
||||
cror 0xf, 0xf, 0xf // 0x4def7b82
|
||||
brpt // 0x7d821008, breakpoint
|
||||
cror 0xf, 0xf, 0xf // 0x4def7b82 (for 8 byte alignment)
|
||||
|
||||
|
||||
We actually start executing by saving the toc register first, since the pushing
|
||||
of the registers is done by PUSH_DUMMY_FRAME. If this were real code,
|
||||
the arguments for the function called by the `bctrl' would be pushed
|
||||
between the `stu' and the `bctrl', and we could allow it to execute through.
|
||||
But the arguments have to be pushed by GDB after the PUSH_DUMMY_FRAME is done,
|
||||
and we cannot allow to push the registers again.
|
||||
*/
|
||||
|
||||
#define CALL_DUMMY {0x7c0802a6, 0xd8010000, 0xbc010000, 0x94210000, \
|
||||
0x90410014, 0x3c401234, 0x60425678, \
|
||||
0x3c001234, 0x60005678, 0x7c0903a6, 0x4e800421, \
|
||||
0x4def7b82, 0x7d821008, 0x4def7b82 }
|
||||
|
||||
|
||||
/* keep this as multiple of 8 (%sp requires 8 byte alignment) */
|
||||
#define CALL_DUMMY_LENGTH 56
|
||||
|
||||
#define CALL_DUMMY_START_OFFSET 16
|
||||
|
||||
/* 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) \
|
||||
rs6000_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
|
||||
extern void rs6000_fix_call_dummy (char *, CORE_ADDR, CORE_ADDR,
|
||||
int, struct value **, struct type *, int);
|
||||
|
||||
/* Hook in rs6000-tdep.c for determining the TOC address when
|
||||
calling functions in the inferior. */
|
||||
extern
|
||||
CORE_ADDR (*find_toc_address_hook) (CORE_ADDR);
|
||||
|
||||
/* xcoffread.c provides a function to determine the TOC offset
|
||||
for a given object file.
|
||||
It is used under native AIX configurations for determining the
|
||||
TOC address when calling functions in the inferior. */
|
||||
|
||||
struct objfile;
|
||||
extern CORE_ADDR get_toc_offset (struct objfile *);
|
||||
|
||||
/* Usually a function pointer's representation is simply the address
|
||||
of the function. On the RS/6000 however, a function pointer is
|
||||
@ -536,9 +108,8 @@ extern CORE_ADDR get_toc_offset (struct objfile *);
|
||||
function pointers), find_function_addr uses this macro to get the
|
||||
function address from a function pointer. */
|
||||
|
||||
#define CONVERT_FROM_FUNC_PTR_ADDR(ADDR) \
|
||||
(is_magic_function_pointer (ADDR) ? read_memory_integer (ADDR, 4) : (ADDR))
|
||||
extern int is_magic_function_pointer (CORE_ADDR);
|
||||
#define CONVERT_FROM_FUNC_PTR_ADDR rs6000_convert_from_func_ptr_addr
|
||||
extern CORE_ADDR rs6000_convert_from_func_ptr_addr (CORE_ADDR);
|
||||
|
||||
/* Flag for machine-specific stuff in shared files. FIXME */
|
||||
#define IBM6000_TARGET
|
||||
@ -549,14 +120,17 @@ extern int is_magic_function_pointer (CORE_ADDR);
|
||||
extern void rs6000_software_single_step (unsigned int, int);
|
||||
#define SOFTWARE_SINGLE_STEP(sig,bp_p) rs6000_software_single_step (sig, bp_p)
|
||||
|
||||
/* If the current gcc for for this target does not produce correct debugging
|
||||
information for float parameters, both prototyped and unprototyped, then
|
||||
define this macro. This forces gdb to always assume that floats are
|
||||
passed as doubles and then converted in the callee.
|
||||
/* Notice when a new child process is started. */
|
||||
|
||||
For the PowerPC, it appears that the debug info marks the parameters as
|
||||
floats regardless of whether the function is prototyped, but the actual
|
||||
values are always passed in as doubles. Thus by setting this to 1, both
|
||||
types of calls will work. */
|
||||
#define TARGET_CREATE_INFERIOR_HOOK rs6000_create_inferior
|
||||
extern void rs6000_create_inferior (int);
|
||||
|
||||
#define COERCE_FLOAT_TO_DOUBLE(formal, actual) (1)
|
||||
/* Hook in rs6000-tdep.c for determining the TOC address when
|
||||
calling functions in the inferior. */
|
||||
|
||||
extern CORE_ADDR (*rs6000_find_toc_address_hook) (CORE_ADDR);
|
||||
|
||||
/* Hook in rs6000-tdep.c to set the current architecture when starting a
|
||||
child process. */
|
||||
|
||||
extern void (*rs6000_set_host_arch_hook) (int);
|
||||
|
768
gdb/rs6000-nat.c
768
gdb/rs6000-nat.c
File diff suppressed because it is too large
Load Diff
1543
gdb/rs6000-tdep.c
1543
gdb/rs6000-tdep.c
File diff suppressed because it is too large
Load Diff
@ -1143,11 +1143,6 @@ find_sym_fns (objfile)
|
||||
enum bfd_flavour our_flavour = bfd_get_flavour (objfile->obfd);
|
||||
char *our_target = bfd_get_target (objfile->obfd);
|
||||
|
||||
/* Special kludge for RS/6000 and PowerMac. See xcoffread.c. */
|
||||
if (STREQ (our_target, "aixcoff-rs6000") ||
|
||||
STREQ (our_target, "xcoff-powermac"))
|
||||
our_flavour = (enum bfd_flavour) -1;
|
||||
|
||||
/* Special kludge for apollo. See dstread.c. */
|
||||
if (STREQN (our_target, "apollo", 6))
|
||||
our_flavour = (enum bfd_flavour) -2;
|
||||
@ -1492,51 +1487,54 @@ add_symbol_file_command (args, from_tty)
|
||||
filename = tilde_expand (arg);
|
||||
my_cleanups = make_cleanup (free, filename);
|
||||
}
|
||||
else if (argcnt == 1)
|
||||
{
|
||||
/* The second argument is always the text address at which
|
||||
to load the program. */
|
||||
sect_opts[section_index].name = ".text";
|
||||
sect_opts[section_index].value = arg;
|
||||
section_index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* It's an option (starting with '-') or it's an argument
|
||||
to an option */
|
||||
if (argcnt == 1)
|
||||
{
|
||||
/* The second argument is always the text address at which
|
||||
to load the program. */
|
||||
sect_opts[section_index].name = ".text";
|
||||
sect_opts[section_index].value = arg;
|
||||
section_index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* It's an option (starting with '-') or it's an argument
|
||||
to an option */
|
||||
|
||||
if (*arg == '-')
|
||||
{
|
||||
if (strcmp (arg, "-mapped") == 0)
|
||||
flags |= OBJF_MAPPED;
|
||||
else if (strcmp (arg, "-readnow") == 0)
|
||||
flags |= OBJF_READNOW;
|
||||
else if (strcmp (arg, "-s") == 0)
|
||||
{
|
||||
if (section_index >= SECT_OFF_MAX)
|
||||
error ("Too many sections specified.");
|
||||
expecting_sec_name = 1;
|
||||
expecting_sec_addr = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (expecting_sec_name)
|
||||
{
|
||||
sect_opts[section_index].name = arg;
|
||||
expecting_sec_name = 0;
|
||||
}
|
||||
else
|
||||
if (expecting_sec_addr)
|
||||
if (*arg == '-')
|
||||
{
|
||||
if (strcmp (arg, "-mapped") == 0)
|
||||
flags |= OBJF_MAPPED;
|
||||
else
|
||||
if (strcmp (arg, "-readnow") == 0)
|
||||
flags |= OBJF_READNOW;
|
||||
else
|
||||
if (strcmp (arg, "-s") == 0)
|
||||
{
|
||||
if (section_index >= SECT_OFF_MAX)
|
||||
error ("Too many sections specified.");
|
||||
expecting_sec_name = 1;
|
||||
expecting_sec_addr = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (expecting_sec_name)
|
||||
{
|
||||
sect_opts[section_index].value = arg;
|
||||
expecting_sec_addr = 0;
|
||||
section_index++;
|
||||
sect_opts[section_index].name = arg;
|
||||
expecting_sec_name = 0;
|
||||
}
|
||||
else
|
||||
error ("USAGE: add-symbol-file <filename> <textaddress> [-mapped] [-readnow] [-s <secname> <addr>]*");
|
||||
}
|
||||
}
|
||||
if (expecting_sec_addr)
|
||||
{
|
||||
sect_opts[section_index].value = arg;
|
||||
expecting_sec_addr = 0;
|
||||
section_index++;
|
||||
}
|
||||
else
|
||||
error ("USAGE: add-symbol-file <filename> <textaddress> [-mapped] [-readnow] [-s <secname> <addr>]*");
|
||||
}
|
||||
}
|
||||
argcnt++;
|
||||
}
|
||||
|
||||
|
@ -311,6 +311,7 @@ secnum_to_bfd_section (secnum, objfile)
|
||||
args.targ_index = secnum;
|
||||
args.resultp = &off;
|
||||
args.bfd_sect = §
|
||||
args.objfile = objfile;
|
||||
bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
|
||||
return sect;
|
||||
}
|
||||
@ -628,7 +629,11 @@ process_linenos (start, end)
|
||||
else
|
||||
{
|
||||
/* There was source with line numbers in include files. */
|
||||
|
||||
int linesz =
|
||||
coff_data (this_symtab_psymtab->objfile->obfd)->local_linesz;
|
||||
main_source_baseline = 0;
|
||||
|
||||
for (ii = 0; ii < inclIndx; ++ii)
|
||||
{
|
||||
struct subfile *tmpSubfile;
|
||||
@ -637,7 +642,7 @@ process_linenos (start, end)
|
||||
if (offset < inclTable[ii].begin)
|
||||
{
|
||||
enter_line_range
|
||||
(&main_subfile, offset, inclTable[ii].begin - LINESZ,
|
||||
(&main_subfile, offset, inclTable[ii].begin - linesz,
|
||||
start, 0, &main_source_baseline);
|
||||
}
|
||||
|
||||
@ -654,12 +659,12 @@ process_linenos (start, end)
|
||||
inclTable[ii].end, start, 0, firstLine);
|
||||
|
||||
if (offset <= inclTable[ii].end)
|
||||
offset = inclTable[ii].end + LINESZ;
|
||||
offset = inclTable[ii].end + linesz;
|
||||
}
|
||||
|
||||
/* All the include files' line have been processed at this point. Now,
|
||||
enter remaining lines of the main file, if any left. */
|
||||
if (offset < max_offset + 1 - LINESZ)
|
||||
if (offset < max_offset + 1 - linesz)
|
||||
{
|
||||
enter_line_range (&main_subfile, offset, 0, start, end,
|
||||
&main_source_baseline);
|
||||
@ -795,10 +800,11 @@ enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr,
|
||||
{
|
||||
unsigned int curoffset;
|
||||
CORE_ADDR addr;
|
||||
struct external_lineno ext_lnno;
|
||||
void *ext_lnno;
|
||||
struct internal_lineno int_lnno;
|
||||
unsigned int limit_offset;
|
||||
bfd *abfd;
|
||||
int linesz;
|
||||
|
||||
if (endoffset == 0 && startaddr == 0 && endaddr == 0)
|
||||
return;
|
||||
@ -820,13 +826,16 @@ enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr,
|
||||
}
|
||||
else
|
||||
limit_offset -= 1;
|
||||
|
||||
abfd = this_symtab_psymtab->objfile->obfd;
|
||||
linesz = coff_data (abfd)->local_linesz;
|
||||
ext_lnno = alloca (linesz);
|
||||
|
||||
while (curoffset <= limit_offset)
|
||||
{
|
||||
bfd_seek (abfd, curoffset, SEEK_SET);
|
||||
bfd_read (&ext_lnno, sizeof (struct external_lineno), 1, abfd);
|
||||
bfd_coff_swap_lineno_in (abfd, &ext_lnno, &int_lnno);
|
||||
bfd_read (ext_lnno, linesz, 1, abfd);
|
||||
bfd_coff_swap_lineno_in (abfd, ext_lnno, &int_lnno);
|
||||
|
||||
/* Find the address this line represents. */
|
||||
addr = (int_lnno.l_lnno
|
||||
@ -846,7 +855,7 @@ enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr,
|
||||
}
|
||||
else
|
||||
record_line (subfile, *firstLine + int_lnno.l_lnno, addr);
|
||||
curoffset += LINESZ;
|
||||
curoffset += linesz;
|
||||
}
|
||||
}
|
||||
|
||||
@ -954,6 +963,7 @@ read_xcoff_symtab (pst)
|
||||
char *strtbl = ((struct coff_symfile_info *) objfile->sym_private)->strtbl;
|
||||
char *debugsec =
|
||||
((struct coff_symfile_info *) objfile->sym_private)->debugsec;
|
||||
char *debugfmt = xcoff_data (abfd)->xcoff64 ? "XCOFF64" : "XCOFF";
|
||||
|
||||
struct internal_syment symbol[1];
|
||||
union internal_auxent main_aux;
|
||||
@ -991,7 +1001,7 @@ read_xcoff_symtab (pst)
|
||||
|
||||
start_stabs ();
|
||||
start_symtab (filestring, (char *) NULL, file_start_addr);
|
||||
record_debugformat ("XCOFF");
|
||||
record_debugformat (debugfmt);
|
||||
symnum = ((struct symloc *) pst->read_symtab_private)->first_symnum;
|
||||
max_symnum =
|
||||
symnum + ((struct symloc *) pst->read_symtab_private)->numsyms;
|
||||
@ -1055,7 +1065,7 @@ read_xcoff_symtab (pst)
|
||||
cs->c_secnum = symbol->n_scnum;
|
||||
cs->c_type = (unsigned) symbol->n_type;
|
||||
|
||||
raw_symbol += coff_data (abfd)->local_symesz;
|
||||
raw_symbol += local_symesz;
|
||||
++symnum;
|
||||
|
||||
/* Save addr of first aux entry. */
|
||||
@ -1085,7 +1095,7 @@ read_xcoff_symtab (pst)
|
||||
|
||||
start_stabs ();
|
||||
start_symtab ("_globals_", (char *) NULL, (CORE_ADDR) 0);
|
||||
record_debugformat ("XCOFF");
|
||||
record_debugformat (debugfmt);
|
||||
cur_src_end_addr = first_object_file_end;
|
||||
/* done with all files, everything from here on is globals */
|
||||
}
|
||||
@ -1150,7 +1160,7 @@ read_xcoff_symtab (pst)
|
||||
/* Give all csects for this source file the same
|
||||
name. */
|
||||
start_symtab (filestring, NULL, (CORE_ADDR) 0);
|
||||
record_debugformat ("XCOFF");
|
||||
record_debugformat (debugfmt);
|
||||
}
|
||||
|
||||
/* If this is the very first csect seen,
|
||||
@ -1279,7 +1289,7 @@ read_xcoff_symtab (pst)
|
||||
|
||||
start_stabs ();
|
||||
start_symtab (filestring, (char *) NULL, (CORE_ADDR) 0);
|
||||
record_debugformat ("XCOFF");
|
||||
record_debugformat (debugfmt);
|
||||
last_csect_name = 0;
|
||||
|
||||
/* reset file start and end addresses. A compilation unit with no text
|
||||
@ -1510,7 +1520,7 @@ process_xcoff_symbol (cs, objfile)
|
||||
memset (sym, '\0', sizeof (struct symbol));
|
||||
|
||||
/* default assumptions */
|
||||
SYMBOL_VALUE (sym) = cs->c_value + off;
|
||||
SYMBOL_VALUE_ADDRESS (sym) = cs->c_value + off;
|
||||
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
|
||||
SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
|
||||
|
||||
@ -1603,7 +1613,7 @@ process_xcoff_symbol (cs, objfile)
|
||||
cs->c_name, 0, 0, objfile);
|
||||
if (sym != NULL)
|
||||
{
|
||||
SYMBOL_VALUE (sym) += static_block_base;
|
||||
SYMBOL_VALUE_ADDRESS (sym) += static_block_base;
|
||||
SYMBOL_SECTION (sym) = static_block_section;
|
||||
}
|
||||
return sym;
|
||||
@ -1681,12 +1691,15 @@ static int
|
||||
read_symbol_lineno (symno)
|
||||
int symno;
|
||||
{
|
||||
int nsyms =
|
||||
((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
|
||||
->symtbl_num_syms;
|
||||
char *stbl =
|
||||
((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
|
||||
->symtbl;
|
||||
struct objfile *objfile = this_symtab_psymtab->objfile;
|
||||
boolean xcoff64 = xcoff_data (objfile->obfd)->xcoff64;
|
||||
|
||||
struct coff_symfile_info *info =
|
||||
(struct coff_symfile_info *)objfile->sym_private;
|
||||
int nsyms = info->symtbl_num_syms;
|
||||
char *stbl = info->symtbl;
|
||||
char *strtbl = info->strtbl;
|
||||
|
||||
struct internal_syment symbol[1];
|
||||
union internal_auxent main_aux[1];
|
||||
|
||||
@ -1716,8 +1729,12 @@ read_symbol_lineno (symno)
|
||||
{
|
||||
bfd_coff_swap_sym_in (symfile_bfd,
|
||||
stbl + (symno * local_symesz), symbol);
|
||||
if (symbol->n_sclass == C_FCN && STREQ (symbol->n_name, ".bf"))
|
||||
goto gotit;
|
||||
if (symbol->n_sclass == C_FCN)
|
||||
{
|
||||
char *name = xcoff64 ? strtbl + symbol->n_offset : symbol->n_name;
|
||||
if (STREQ (name, ".bf"))
|
||||
goto gotit;
|
||||
}
|
||||
symno += symbol->n_numaux + 1;
|
||||
}
|
||||
|
||||
@ -1727,8 +1744,7 @@ read_symbol_lineno (symno)
|
||||
gotit:
|
||||
/* take aux entry and return its lineno */
|
||||
symno++;
|
||||
bfd_coff_swap_aux_in (this_symtab_psymtab->objfile->obfd,
|
||||
stbl + symno * local_symesz,
|
||||
bfd_coff_swap_aux_in (objfile->obfd, stbl + symno * local_symesz,
|
||||
symbol->n_type, symbol->n_sclass,
|
||||
0, symbol->n_numaux, main_aux);
|
||||
|
||||
@ -2242,7 +2258,7 @@ scan_xcoff_symtab (objfile)
|
||||
ssymnum = 0;
|
||||
while (ssymnum < nsyms)
|
||||
{
|
||||
int sclass = ((struct external_syment *) sraw_symbol)->e_sclass[0] & 0xff;
|
||||
int sclass;
|
||||
/* This is the type we pass to partial-stab.h. A less kludgy solution
|
||||
would be to break out partial-stab.h into its various parts--shuffle
|
||||
off the DBXREAD_ONLY stuff to dbxread.c, and make separate
|
||||
@ -2251,6 +2267,9 @@ scan_xcoff_symtab (objfile)
|
||||
|
||||
QUIT;
|
||||
|
||||
bfd_coff_swap_sym_in (abfd, sraw_symbol, &symbol);
|
||||
sclass = symbol.n_sclass;
|
||||
|
||||
switch (sclass)
|
||||
{
|
||||
case C_EXT:
|
||||
@ -2558,10 +2577,9 @@ scan_xcoff_symtab (objfile)
|
||||
{
|
||||
/* We probably could save a few instructions by assuming that
|
||||
C_LSYM, C_PSYM, etc., never have auxents. */
|
||||
int naux1 =
|
||||
((struct external_syment *) sraw_symbol)->e_numaux[0] + 1;
|
||||
int naux1 = symbol.n_numaux + 1;
|
||||
ssymnum += naux1;
|
||||
sraw_symbol += sizeof (struct external_syment) * naux1;
|
||||
sraw_symbol += bfd_coff_symesz (abfd) * naux1;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2580,7 +2598,7 @@ scan_xcoff_symtab (objfile)
|
||||
case C_DECL:
|
||||
case C_STSYM:
|
||||
stype = N_LSYM;
|
||||
pstab:;
|
||||
pstab:
|
||||
swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
|
||||
&ssymnum, objfile);
|
||||
#define CUR_SYMBOL_TYPE stype
|
||||
@ -2790,8 +2808,7 @@ xcoff_symfile_offsets (objfile, addrs)
|
||||
static struct sym_fns xcoff_sym_fns =
|
||||
{
|
||||
|
||||
/* Because the bfd uses coff_flavour, we need to specially kludge
|
||||
the flavour. It is possible that coff and xcoff should be merged as
|
||||
/* It is possible that coff and xcoff should be merged as
|
||||
they do have fundamental similarities (for example, the extra storage
|
||||
classes used for stabs could presumably be recognized in any COFF file).
|
||||
However, in addition to obvious things like all the csect hair, there are
|
||||
@ -2800,7 +2817,7 @@ static struct sym_fns xcoff_sym_fns =
|
||||
xcoffread.c reads all the symbols and does in fact randomly access them
|
||||
(in C_BSTAT and line number processing). */
|
||||
|
||||
(enum bfd_flavour) -1,
|
||||
bfd_target_xcoff_flavour,
|
||||
|
||||
xcoff_new_init, /* sym_new_init: init anything gbl to entire symtab */
|
||||
xcoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
|
||||
|
Loading…
Reference in New Issue
Block a user