* infrun.c (wait_for_inferior): Add the symbols for any

newly loaded objects upon a TARGET_WAITKIND_LOADED event.

	Rewrite code which determines the TOC address for calling functions
	in the inferior under AIX.
	* rs6000-nat.c (find_toc_address):  New function to determine
	the required TOC address from a function address.
	(_initialize_core_rs6000):  Set up find_toc_address_hook to point
	to find_toc_address.
	(xcoff_relocate_symtab, xcoff_relocate_core):  Remove
	add_text_to_loadinfo calls.
	(exec_one_dummy_insn):  Change pid and status to int to get rid of
	compiler warnings.
	(xcoff_relocate_symtab):  Cast ldi to `int *' when passing it to
	ptrace to get rid of compiler warnings.
	* rs6000-tdep.c:  Add definition for find_toc_address_hook.
	(rs6000_fix_call_dummy):  If find_toc_address_hook is non zero,
	patch TOC address load code in the call dummy with the value
	returned from find_toc_address_hook.
	(struct loadinfo, loadinfo, loadinfolen,
	loadinfotextindex, xcoff_init_loadinfo, free_loadinfo,
	xcoff_add_toc_to_loadinfo, add_text_to_loadinfo, find_toc_address):
	Remove.
	(_initialize_rs6000_tdep):  Remove initialization of
	coff_add_toc_to_loadinfo_hook and xcoff_init_loadinfo_hook.
	* xcoffread.c (coff_add_toc_to_loadinfo_hook,
	xcoff_init_loadinfo_hook):  Remove.
	(struct coff_symfile_info):  Add toc_offset field.
	(scan_xcoff_symtab):  Record toc_offset value in toc_offset field
	instead of calling xcoff_add_toc_to_loadinfo_hook.
	(get_toc_offset):  New function to return the value of the
	toc_offset field for an object file.
	(xcoff_initial_scan):  Remove call of xcoff_init_loadinfo_hook.
	* xcoffsolib.h (add_text_to_loadinfo):  Remove declaration.
	* config/rs6000/tm-rs6000.h:  Add declarations for
	find_toc_address_hook and get_toc_offset.
This commit is contained in:
Peter Schauer 1997-08-15 21:10:32 +00:00
parent be3d1b6f9e
commit 05d52ace86
5 changed files with 111 additions and 172 deletions

View File

@ -1,3 +1,49 @@
Fri Aug 15 13:59:37 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* infrun.c (wait_for_inferior): Add the symbols for any
newly loaded objects upon a TARGET_WAITKIND_LOADED event.
Rewrite code which determines the TOC address for calling functions
in the inferior under AIX.
* rs6000-nat.c (find_toc_address): New function to determine
the required TOC address from a function address.
(_initialize_core_rs6000): Set up find_toc_address_hook to point
to find_toc_address.
(xcoff_relocate_symtab, xcoff_relocate_core): Remove
add_text_to_loadinfo calls.
(exec_one_dummy_insn): Change pid and status to int to get rid of
compiler warnings.
(xcoff_relocate_symtab): Cast ldi to `int *' when passing it to
ptrace to get rid of compiler warnings.
* rs6000-tdep.c: Add definition for find_toc_address_hook.
(rs6000_fix_call_dummy): If find_toc_address_hook is non zero,
patch TOC address load code in the call dummy with the value
returned from find_toc_address_hook.
(struct loadinfo, loadinfo, loadinfolen,
loadinfotextindex, xcoff_init_loadinfo, free_loadinfo,
xcoff_add_toc_to_loadinfo, add_text_to_loadinfo, find_toc_address):
Remove.
(_initialize_rs6000_tdep): Remove initialization of
coff_add_toc_to_loadinfo_hook and xcoff_init_loadinfo_hook.
* xcoffread.c (coff_add_toc_to_loadinfo_hook,
xcoff_init_loadinfo_hook): Remove.
(struct coff_symfile_info): Add toc_offset field.
(scan_xcoff_symtab): Record toc_offset value in toc_offset field
instead of calling xcoff_add_toc_to_loadinfo_hook.
(get_toc_offset): New function to return the value of the
toc_offset field for an object file.
(xcoff_initial_scan): Remove call of xcoff_init_loadinfo_hook.
* xcoffsolib.h (add_text_to_loadinfo): Remove declaration.
* config/rs6000/tm-rs6000.h: Add declarations for
find_toc_address_hook and get_toc_offset.
Wed Aug 13 19:31:28 1997 Stan Shebs <shebs@andros.cygnus.com>
* remote-sds.c: New file, interface to SDS-compatible monitors.
* Makefile.in (remote-sds.o): Add build rule.
* config/powerpc/ppc-eabi.mt, config/powerpc/ppc-sim.mt
(TDEPFILES): Add remote-sds.o.
Tue Aug 12 14:37:18 1997 Geoffrey Noer <noer@cygnus.com>
* ocd.c (ocd_wait): loop until we're in BDM mode instead of

View File

@ -72,9 +72,6 @@ fetch_core_registers PARAMS ((char *, unsigned int, int, CORE_ADDR));
static void
exec_one_dummy_insn PARAMS ((void));
extern void
add_text_to_loadinfo PARAMS ((CORE_ADDR textaddr, CORE_ADDR dataaddr));
extern void
fixup_breakpoints PARAMS ((CORE_ADDR low, CORE_ADDR high, CORE_ADDR delta));
@ -248,7 +245,7 @@ exec_one_dummy_insn ()
#define DUMMY_INSN_ADDR (TEXT_SEGMENT_BASE)+0x200
char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
unsigned int status, pid;
int status, pid;
CORE_ADDR prev_pc;
/* We plant one dummy breakpoint into DUMMY_INSN_ADDR address. We assume that
@ -623,25 +620,12 @@ xcoff_relocate_symtab (pid)
errno = 0;
ptrace (PT_LDINFO, pid, (PTRACE_ARG3_TYPE) ldi,
MAX_LOAD_SEGS * sizeof(*ldi), ldi);
MAX_LOAD_SEGS * sizeof(*ldi), (int *) ldi);
if (errno)
perror_with_name ("ptrace ldinfo");
vmap_ldinfo (ldi);
do {
/* We are allowed to assume CORE_ADDR == pointer. This code is
native only. */
add_text_to_loadinfo ((CORE_ADDR) ldi->ldinfo_textorg,
(CORE_ADDR) ldi->ldinfo_dataorg);
} while (ldi->ldinfo_next
&& (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
#if 0
/* Now that we've jumbled things around, re-sort them. */
sort_minimal_symbols ();
#endif
/* relocate the exec and core sections as well. */
vmap_exec ();
}
@ -780,9 +764,6 @@ xcoff_relocate_core (target)
}
vmap_symtab (vp);
add_text_to_loadinfo ((CORE_ADDR)ldip->ldinfo_textorg,
(CORE_ADDR)ldip->ldinfo_dataorg);
} while (ldip->ldinfo_next != 0);
vmap_exec ();
breakpoint_re_set ();
@ -794,7 +775,30 @@ kernel_u_size ()
{
return (sizeof (struct user));
}
/* Under AIX, we have to pass the correct TOC pointer to a function
when calling functions in the inferior.
We try to find the relative toc offset of the objfile containing PC
and add the current load address of the data segment from the vmap. */
static CORE_ADDR
find_toc_address (pc)
CORE_ADDR pc;
{
struct vmap *vp;
for (vp = vmap; vp; vp = vp->nxt)
{
if (pc >= vp->tstart && pc < vp->tend)
{
/* vp->objfile is only NULL for the exec file. */
return vp->dstart + get_toc_offset (vp->objfile == NULL
? symfile_objfile
: vp->objfile);
}
}
error ("Unable to find TOC entry for pc 0x%x\n", pc);
}
/* Register that we are able to handle rs6000 core file formats. */
@ -808,6 +812,10 @@ static struct core_fns rs6000_core_fns =
void
_initialize_core_rs6000 ()
{
/* Initialize hook in rs6000-tdep.c for determining the TOC address when
calling functions in the inferior. */
find_toc_address_hook = &find_toc_address;
/* For native configurations, where this module is included, inform
the xcoffsolib module where it can find the function for symbol table
relocation at runtime. */

View File

@ -44,9 +44,13 @@ static struct sstep_breaks {
char data[4];
} stepBreaks[2];
/* Static function prototypes */
/* Hook for determining the TOC address when calling functions in the
inferior under AIX. The initialization code in rs6000-nat.c sets
this hook to point to find_toc_address. */
static CORE_ADDR find_toc_address PARAMS ((CORE_ADDR pc));
CORE_ADDR (*find_toc_address_hook) PARAMS ((CORE_ADDR)) = NULL;
/* Static function prototypes */
static CORE_ADDR branch_dest PARAMS ((int opcode, int instr, CORE_ADDR pc,
CORE_ADDR safety));
@ -651,19 +655,22 @@ rs6000_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
int ii;
CORE_ADDR target_addr;
CORE_ADDR tocvalue;
if (find_toc_address_hook != NULL)
{
CORE_ADDR tocvalue;
tocvalue = (*find_toc_address_hook) (fun);
ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET);
ii = (ii & 0xffff0000) | (tocvalue >> 16);
*(int*)((char*)dummyname + TOC_ADDR_OFFSET) = ii;
ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4);
ii = (ii & 0xffff0000) | (tocvalue & 0x0000ffff);
*(int*)((char*)dummyname + TOC_ADDR_OFFSET+4) = ii;
}
target_addr = fun;
tocvalue = find_toc_address (target_addr);
ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET);
ii = (ii & 0xffff0000) | (tocvalue >> 16);
*(int*)((char*)dummyname + TOC_ADDR_OFFSET) = ii;
ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4);
ii = (ii & 0xffff0000) | (tocvalue & 0x0000ffff);
*(int*)((char*)dummyname + TOC_ADDR_OFFSET+4) = ii;
ii = *(int*)((char*)dummyname + TARGET_ADDR_OFFSET);
ii = (ii & 0xffff0000) | (target_addr >> 16);
*(int*)((char*)dummyname + TARGET_ADDR_OFFSET) = ii;
@ -1163,107 +1170,6 @@ rs6000_frame_chain (thisframe)
return fp;
}
/* Keep an array of load segment information and their TOC table addresses.
This info will be useful when calling a shared library function by hand. */
struct loadinfo {
CORE_ADDR textorg, dataorg;
unsigned long toc_offset;
};
#define LOADINFOLEN 10
static struct loadinfo *loadinfo = NULL;
static int loadinfolen = 0;
static int loadinfotocindex = 0;
static int loadinfotextindex = 0;
void
xcoff_init_loadinfo ()
{
loadinfotocindex = 0;
loadinfotextindex = 0;
if (loadinfolen == 0) {
loadinfo = (struct loadinfo *)
xmalloc (sizeof (struct loadinfo) * LOADINFOLEN);
loadinfolen = LOADINFOLEN;
}
}
/* FIXME -- this is never called! */
#if 0
void
free_loadinfo ()
{
if (loadinfo)
free (loadinfo);
loadinfo = NULL;
loadinfolen = 0;
loadinfotocindex = 0;
loadinfotextindex = 0;
}
#endif
/* this is called from xcoffread.c */
void
xcoff_add_toc_to_loadinfo (tocoff)
unsigned long tocoff;
{
while (loadinfotocindex >= loadinfolen) {
loadinfolen += LOADINFOLEN;
loadinfo = (struct loadinfo *)
xrealloc (loadinfo, sizeof(struct loadinfo) * loadinfolen);
}
loadinfo [loadinfotocindex++].toc_offset = tocoff;
}
void
add_text_to_loadinfo (textaddr, dataaddr)
CORE_ADDR textaddr;
CORE_ADDR dataaddr;
{
while (loadinfotextindex >= loadinfolen) {
loadinfolen += LOADINFOLEN;
loadinfo = (struct loadinfo *)
xrealloc (loadinfo, sizeof(struct loadinfo) * loadinfolen);
}
loadinfo [loadinfotextindex].textorg = textaddr;
loadinfo [loadinfotextindex].dataorg = dataaddr;
++loadinfotextindex;
}
/* Note that this assumes that the "textorg" and "dataorg" elements of
a member of this array are correlated with the "toc_offset" element
of the same member. This is taken care of because the loops which
assign the former (in xcoff_relocate_symtab or xcoff_relocate_core)
and the latter (in scan_xcoff_symtab, via vmap_symtab, in
vmap_ldinfo or xcoff_relocate_core) traverse the same objfiles in
the same order. */
static CORE_ADDR
find_toc_address (pc)
CORE_ADDR pc;
{
int ii, toc_entry;
CORE_ADDR tocbase = 0;
toc_entry = -1;
for (ii=0; ii < loadinfotextindex; ++ii)
if (pc > loadinfo[ii].textorg && loadinfo[ii].textorg > tocbase) {
toc_entry = ii;
tocbase = loadinfo[ii].textorg;
}
if (toc_entry == -1)
error ("Unable to find TOC entry for pc 0x%x\n", pc);
return loadinfo[toc_entry].dataorg + loadinfo[toc_entry].toc_offset;
}
/* Return nonzero if ADDR (a function pointer) is in the data space and
is therefore a special function pointer. */
@ -1296,22 +1202,6 @@ gdb_print_insn_powerpc (memaddr, info)
void
_initialize_rs6000_tdep ()
{
#ifndef ELF_OBJECT_FORMAT
{
extern void (*xcoff_add_toc_to_loadinfo_hook) PARAMS ((unsigned long));
extern void (*xcoff_init_loadinfo_hook) PARAMS ((void));
/* Initialize hook in xcoffread for recording the toc offset value
of a symbol table into the ldinfo structure, for native rs6000
config. */
xcoff_add_toc_to_loadinfo_hook = &xcoff_add_toc_to_loadinfo;
/* Initialize hook in xcoffread for calling xcoff_init_loadinfo in
a native rs6000 config. */
xcoff_init_loadinfo_hook = &xcoff_init_loadinfo;
}
#endif /* ELF_OBJECT_FORMAT */
/* FIXME, this should not be decided via ifdef. */
#ifdef GDB_TARGET_POWERPC
tm_print_insn = gdb_print_insn_powerpc;

View File

@ -88,17 +88,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* This is output from LD. */
#define N_SETV 0x1C /* Pointer to set vector in data area. */
/* Hook for recording the toc offset value of a symbol table into
the ldinfo structure. */
void (*xcoff_add_toc_to_loadinfo_hook) PARAMS ((unsigned long)) = NULL;
/* Hook for recording how to call xcoff_init_loadinfo for a native
rs6000 config only. */
void (*xcoff_init_loadinfo_hook) PARAMS ((void)) = NULL;
/* We put a pointer to this structure in the read_symtab_private field
of the psymtab. */
@ -185,6 +174,9 @@ struct coff_symfile_info {
/* Number of symbols in symtbl. */
int symtbl_num_syms;
/* Offset in data section to TOC anchor. */
CORE_ADDR toc_offset;
};
static struct complaint storclass_complaint =
@ -2628,12 +2620,22 @@ scan_xcoff_symtab (section_offsets, objfile)
dependencies_used, textlow_not_set);
}
/* Record the toc offset value of this symbol table into ldinfo structure.
/* Record the toc offset value of this symbol table into objfile structure.
If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
this information would be file auxiliary header. */
if (xcoff_add_toc_to_loadinfo_hook != NULL)
(*xcoff_add_toc_to_loadinfo_hook) ((unsigned long) toc_offset);
((struct coff_symfile_info *) objfile->sym_private)->toc_offset = toc_offset;
}
/* Return the toc offset value for a given objfile. */
CORE_ADDR
get_toc_offset (objfile)
struct objfile *objfile;
{
if (objfile)
return ((struct coff_symfile_info *) objfile->sym_private)->toc_offset;
return 0;
}
/* Scan and build partial symbols for a symbol file.
@ -2662,10 +2664,6 @@ xcoff_initial_scan (objfile, section_offsets, mainline)
char *name;
unsigned int size;
/* Initialize load info structure. */
if (mainline && xcoff_init_loadinfo_hook != NULL)
(*xcoff_init_loadinfo_hook) ();
info = (struct coff_symfile_info *) objfile -> sym_private;
symfile_bfd = abfd = objfile->obfd;
name = objfile->name;

View File

@ -53,9 +53,6 @@ struct vmap_and_bfd {
extern struct vmap *vmap;
extern void
add_text_to_loadinfo PARAMS ((CORE_ADDR textaddr, CORE_ADDR dataaddr));
/* Hook for symbol table relocation at runtime. */
extern void (*xcoff_relocate_symtab_hook) PARAMS ((unsigned int));