* Makefile.in (TAGS): Use variables directly, rather than using

find, to locate TM_FILE, XM_FILE, and NAT_FILE.  This is faster
	and means that these filenames no longer need be unique across all
	the config/* directories.
	* configure.in: Put the config/*/ into TM_FILE, etc.

	* m68k-stub.c (computeSignal): Return SIGFPE, not SIGURG, for chk
	and trapv exceptions.

	* target.h (struct section_table), objfiles.h (struct obj_section):
	Change name of field sec_ptr to the_bfd_section.  More mnemonic
	and avoids the (sort of, for the ptx compiler) name clash with
	the name of the typedef.
	* exec.c, xcoffexec.c, sparc-tdep.c, rs6000-nat.c, osfsolib.c,
	solib.c, irix5-nat.c, objfiles.c, remote.c: Change users.

	* utils.c: Include readline.h.
	* Makefile.in (utils.o): Add dependency.

	* remote.c (getpkt): Add support for run-length encoding.
This commit is contained in:
Jim Kingdon 1994-03-19 18:49:50 +00:00
parent 1732fbd47a
commit 94d4b71373
11 changed files with 230 additions and 64 deletions

View File

@ -1,3 +1,26 @@
Sat Mar 19 08:51:12 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
* Makefile.in (TAGS): Use variables directly, rather than using
find, to locate TM_FILE, XM_FILE, and NAT_FILE. This is faster
and means that these filenames no longer need be unique across all
the config/* directories.
* configure.in: Put the config/*/ into TM_FILE, etc.
* m68k-stub.c (computeSignal): Return SIGFPE, not SIGURG, for chk
and trapv exceptions.
* target.h (struct section_table), objfiles.h (struct obj_section):
Change name of field sec_ptr to the_bfd_section. More mnemonic
and avoids the (sort of, for the ptx compiler) name clash with
the name of the typedef.
* exec.c, xcoffexec.c, sparc-tdep.c, rs6000-nat.c, osfsolib.c,
solib.c, irix5-nat.c, objfiles.c, remote.c: Change users.
* utils.c: Include readline.h.
* Makefile.in (utils.o): Add dependency.
* remote.c (getpkt): Add support for run-length encoding.
Fri Mar 18 19:11:15 1994 Steve Chamberlain (sac@jonny.cygnus.com)
* utils.c (prompt_for_continue): Call readline, not gdb_readline.

View File

@ -495,7 +495,8 @@ gdb.z:gdb.1
# install-only is intended to address that need.
install: all install-only
install-only:
transformed_name=`echo gdb | sed '$(program_transform_name)'` ; \
transformed_name=`t='$(program_transform_name)'; \
echo gdb | sed -e "s/brokensed/brokensed/" $$t` ; \
if test "x$$transformed_name" = x; then \
transformed_name=gdb ; \
else \
@ -629,9 +630,9 @@ kdb: $(NTSSTART) $(OBS) $(NTSOBS) $(ADD_DEPS) $(CDEPS)
TAGS: $(TAGFILES_NO_SRCDIR) $(TAGFILES_WITH_SRCDIR)
@echo Making TAGS
@etags `find $(srcdir)/config \( -name $(TM_FILE) \
-o -name $(XM_FILE) \
-o -name $(NAT_FILE) \) -print` \
@etags $(srcdir)/$(TM_FILE) \
$(srcdir)/$(XM_FILE) \
$(srcdir)/$(NAT_FILE) \
`(for i in $(DEPFILES) $(TAGFILES_NO_SRCDIR); do \
echo $(srcdir)/$$i ; \
done ; for i in $(TAGFILES_WITH_SRCDIR); do \
@ -1392,7 +1393,7 @@ remote-z8k.o: remote-z8k.c $(wait_h) $(srcdir)/../sim/z8k/sim.h \
$(defs_h) $(gdbcore_h) $(inferior_h) target.h terminal.h
remote-utils.o: remote-utils.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
$(inferior_h) $(remote_utils_h)
$(inferior_h) $(remote_utils_h)
remote.o: remote.c $(bfd_h) $(wait_h) $(defs_h) $(gdbcmd_h) \
$(inferior_h) $(remote_utils_h) symfile.h terminal.h
@ -1467,7 +1468,7 @@ ultra3-xdep.o: ultra3-xdep.c $(defs_h) $(gdbcore_h) $(inferior_h)
umax-xdep.o: umax-xdep.c $(defs_h) $(gdbcore_h) $(inferior_h)
utils.o: utils.c $(bfd_h) $(defs_h) $(expression_h) $(gdbcmd_h) \
language.h signals.h target.h terminal.h
language.h signals.h target.h terminal.h $(readline_headers)
valarith.o: valarith.c $(bfd_h) $(defs_h) $(expression_h) \
$(gdbtypes_h) language.h $(symtab_h) target.h $(value_h)

View File

@ -400,3 +400,8 @@ if [ "${nativefile}" = "" ] ; then
< Makefile > Makefile.tem
mv -f Makefile.tem Makefile
fi
sed -e '/^TM_FILE[ ]*=/s,^TM_FILE[ ]*=[ ]*,&config/'"${gdb_target_cpu}"'/,
/^XM_FILE[ ]*=/s,^XM_FILE[ ]*=[ ]*,&config/'"${gdb_host_cpu}"'/,
/^NAT_FILE[ ]*=/s,^NAT_FILE[ ]*=[ ]*,&config/'"${gdb_host_cpu}"'/,' <Makefile >Makefile.tmp
mv -f Makefile.tmp Makefile

View File

@ -350,7 +350,7 @@ solib_map_sections (so)
p -> addr += (CORE_ADDR) LM_ADDR (so);
p -> endaddr += (CORE_ADDR) LM_ADDR (so);
so -> lmend = (CORE_ADDR) max (p -> endaddr, so -> lmend);
if (STREQ (p -> sec_ptr -> name, ".text"))
if (STREQ (p -> the_bfd_section -> name, ".text"))
{
so -> textsection = p;
}

View File

@ -83,7 +83,7 @@ add_to_objfile_sections (abfd, asect, objfile_p_char)
return;
section.offset = 0;
section.objfile = objfile;
section.sec_ptr = asect;
section.the_bfd_section = asect;
section.addr = bfd_section_vma (abfd, asect);
section.endaddr = section.addr + bfd_section_size (abfd, asect);
obstack_grow (&objfile->psymbol_obstack, &section, sizeof(section));

View File

@ -140,14 +140,9 @@ struct obj_section {
addresses. */
CORE_ADDR offset;
/* For the ptx compiler, we can't use the sec_ptr typedef when the field's
name is sec_ptr. We really should rename the field (or better yet,
the typedef should be bfd_sec_ptr). */
struct sec *sec_ptr; /* BFD section pointer */
sec_ptr the_bfd_section; /* BFD section pointer */
/* Objfile this section is part of. Not currently used, but I'm sure
that someone will want the bfd that the sec_ptr goes with or something
like that before long. */
/* Objfile this section is part of. */
struct objfile *objfile;
};

View File

@ -214,7 +214,7 @@ solib_map_sections (so)
p -> addr += (CORE_ADDR) LM_ADDR (so);
p -> endaddr += (CORE_ADDR) LM_ADDR (so);
so -> lmend = (CORE_ADDR) max (p -> endaddr, so -> lmend);
if (STREQ (p -> sec_ptr -> name, ".text"))
if (STREQ (p -> the_bfd_section -> name, ".text"))
{
so -> textsection = p;
}

View File

@ -1,5 +1,5 @@
/* Remote target communications for serial-line targets in custom GDB protocol
Copyright 1988, 1991, 1992, 1993 Free Software Foundation, Inc.
Copyright 1988, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
This file is part of GDB.
@ -116,7 +116,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
we can extend the protocol and GDB
can tell whether the stub it is
talking to uses the old or the new.
*/
search tAA:PP,MM Search backward starting at address
AA for a match with pattern PP and
mask MM. PP and MM are 4 bytes.
Not supported by all stubs.
Responses can be run-length encoded to save space. A '*' means that
the next two characters are hex digits giving a repeat count which
stands for that many repititions of the character preceding the '*'.
Note that this means that responses cannot contain '*'. Example:
"0*03" means the same as "0000". */
#include "defs.h"
#include <string.h>
@ -164,7 +173,7 @@ static void
remote_fetch_registers PARAMS ((int regno));
static void
remote_resume PARAMS ((int pid, int step, int siggnal));
remote_resume PARAMS ((int pid, int step, enum target_signal siggnal));
static int
remote_start_remote PARAMS ((char *dummy));
@ -190,8 +199,7 @@ remote_send PARAMS ((char *buf));
static int
readchar PARAMS ((void));
static int
remote_wait PARAMS ((int pid, WAITTYPE *status));
static int remote_wait PARAMS ((int pid, struct target_waitstatus *status));
static int
tohex PARAMS ((int nib));
@ -301,10 +309,13 @@ device is attached to the remote system (e.g. /dev/ttya).");
if (!remote_desc)
perror_with_name (name);
if (SERIAL_SETBAUDRATE (remote_desc, baud_rate))
if (baud_rate != -1)
{
SERIAL_CLOSE (remote_desc);
perror_with_name (name);
if (SERIAL_SETBAUDRATE (remote_desc, baud_rate))
{
SERIAL_CLOSE (remote_desc);
perror_with_name (name);
}
}
SERIAL_RAW (remote_desc);
@ -381,7 +392,8 @@ tohex (nib)
static void
remote_resume (pid, step, siggnal)
int pid, step, siggnal;
int pid, step;
enum target_signal siggnal;
{
char buf[PBUFSIZ];
@ -389,13 +401,9 @@ remote_resume (pid, step, siggnal)
{
char *name;
target_terminal_ours_for_output ();
printf_filtered ("Can't send signals to a remote system. ");
name = strsigno (siggnal);
if (name)
printf_filtered (name);
else
printf_filtered ("Signal %d", siggnal);
printf_filtered (" not sent.\n");
printf_filtered
("Can't send signals to a remote system. %s not sent.\n",
target_signal_to_name (siggnal));
target_terminal_inferior ();
}
@ -461,11 +469,12 @@ Give up (and stop debugging it)? "))
static int
remote_wait (pid, status)
int pid;
WAITTYPE *status;
struct target_waitstatus *status;
{
unsigned char buf[PBUFSIZ];
WSETEXIT ((*status), 0);
status->kind = TARGET_WAITKIND_EXITED;
status->value.integer = 0;
while (1)
{
@ -589,7 +598,7 @@ remote_wait (pid, status)
{
flagword flags;
flags = bfd_get_section_flags (abfd, s->sec_ptr);
flags = bfd_get_section_flags (abfd, s->the_bfd_section);
if (flags & SEC_CODE)
{
@ -614,7 +623,8 @@ remote_wait (pid, status)
else if (buf[0] == 'W')
{
/* The remote process exited. */
WSETEXIT (*status, (fromhex (buf[1]) << 4) + fromhex (buf[2]));
status->kind = TARGET_WAITKIND_EXITED;
status->value.integer = (fromhex (buf[1]) << 4) + fromhex (buf[2]);
return 0;
}
else if (buf[0] == 'S')
@ -623,7 +633,9 @@ remote_wait (pid, status)
warning ("Invalid remote reply: %s", buf);
}
WSETSTOP ((*status), (((fromhex (buf[1])) << 4) + (fromhex (buf[2]))));
status->kind = TARGET_WAITKIND_STOPPED;
status->value.sig = (enum target_signal)
(((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
return 0;
}
@ -901,9 +913,11 @@ remote_xfer_memory(memaddr, myaddr, len, should_write, target)
xfersize = len;
if (should_write)
bytes_xferred = remote_write_bytes (memaddr, myaddr, xfersize);
bytes_xferred = remote_write_bytes (memaddr,
(unsigned char *)myaddr, xfersize);
else
bytes_xferred = remote_read_bytes (memaddr, myaddr, xfersize);
bytes_xferred = remote_read_bytes (memaddr,
(unsigned char *)myaddr, xfersize);
/* If we get an error, we are done xferring. */
if (bytes_xferred == 0)
@ -917,6 +931,80 @@ remote_xfer_memory(memaddr, myaddr, len, should_write, target)
return total_xferred;
}
#if 0
/* Enable after 4.12. */
void
remote_search (len, data, mask, startaddr, increment, lorange, hirange
addr_found, data_found)
int len;
char *data;
char *mask;
CORE_ADDR startaddr;
int increment;
CORE_ADDR lorange;
CORE_ADDR hirange;
CORE_ADDR *addr_found;
char *data_found;
{
if (increment == -4 && len == 4)
{
long mask_long, data_long;
long data_found_long;
CORE_ADDR addr_we_found;
char buf[PBUFSIZ];
long returned_long[2];
char *p;
mask_long = extract_unsigned_integer (mask, len);
data_long = extract_unsigned_integer (data, len);
sprintf (buf, "t%x:%x,%x", startaddr, data_long, mask_long);
putpkt (buf);
getpkt (buf, 0);
if (buf[0] == '\0')
{
/* The stub doesn't support the 't' request. We might want to
remember this fact, but on the other hand the stub could be
switched on us. Maybe we should remember it only until
the next "target remote". */
generic_search (len, data, mask, startaddr, increment, lorange,
hirange, addr_found, data_found);
return;
}
if (buf[0] == 'E')
/* There is no correspondance between what the remote protocol uses
for errors and errno codes. We would like a cleaner way of
representing errors (big enough to include errno codes, bfd_error
codes, and others). But for now just use EIO. */
memory_error (EIO, startaddr);
p = buf;
addr_we_found = 0;
while (*p != '\0' && *p != ',')
addr_we_found = (addr_we_found << 4) + fromhex (*p++);
if (*p == '\0')
error ("Protocol error: short return for search");
data_found_long = 0;
while (*p != '\0' && *p != ',')
data_found_long = (data_found_long << 4) + fromhex (*p++);
/* Ignore anything after this comma, for future extensions. */
if (addr_we_found < lorange || addr_we_found >= hirange)
{
*addr_found = 0;
return;
}
*addr_found = addr_we_found;
*data_found = store_unsigned_integer (data_we_found, len);
return;
}
generic_search (len, data, mask, startaddr, increment, lorange,
hirange, addr_found, data_found);
}
#endif /* 0 */
static void
remote_files_info (ignore)
struct target_ops *ignore;
@ -1027,11 +1115,18 @@ putpkt (buf)
break; /* Here to retransmit */
}
#if 0
/* This is wrong. If doing a long backtrace, the user should be
able to get out next time we call QUIT, without anything as violent
as interrupt_query. If we want to provide a way out of here
without getting to the next QUIT, it should be based on hitting
^C twice as in remote_wait. */
if (quit_flag)
{
quit_flag = 0;
interrupt_query ();
}
#endif
}
}
@ -1041,8 +1136,8 @@ putpkt (buf)
while the target is executing user code. */
static void
getpkt (buf, forever)
char *buf;
getpkt (retbuf, forever)
char *retbuf;
int forever;
{
char *bp;
@ -1050,15 +1145,24 @@ getpkt (buf, forever)
int c = 0;
unsigned char c1, c2;
int retries = 0;
char buf[PBUFSIZ];
#define MAX_RETRIES 10
while (1)
{
#if 0
/* This is wrong. If doing a long backtrace, the user should be
able to get out time next we call QUIT, without anything as violent
as interrupt_query. If we want to provide a way out of here
without getting to the next QUIT, it should be based on hitting
^C twice as in remote_wait. */
if (quit_flag)
{
quit_flag = 0;
interrupt_query ();
}
#endif
/* This can loop forever if the remote side sends us characters
continuously, but if it pauses, we'll get a zero from readchar
@ -1138,8 +1242,36 @@ whole:
}
}
out:
/* Deal with run-length encoding. */
{
char *src = buf;
char *dest = retbuf;
int i;
int repeat;
do {
if (*src == '*')
{
if (src[1] == '\0' || src[2] == '\0')
{
if (remote_debug)
puts_filtered ("Packet too short, retrying\n");
goto whole;
}
repeat = (fromhex (src[1]) << 4) + fromhex (src[2]);
for (i = 0; i < repeat; ++i)
{
*dest++ = src[-1];
}
src += 2;
}
else
{
*dest++ = *src;
}
} while (*src++ != '\0');
}
out:
SERIAL_WRITE (remote_desc, "+", 1);
if (remote_debug)

View File

@ -315,17 +315,17 @@ vmap_symtab (vp)
struct obj_section *s;
for (s = objfile->sections; s < objfile->sections_end; ++s)
{
if (s->sec_ptr->target_index == textsec->target_index)
if (s->the_bfd_section->target_index == textsec->target_index)
{
s->addr += text_delta;
s->endaddr += text_delta;
}
else if (s->sec_ptr->target_index == datasec->target_index)
else if (s->the_bfd_section->target_index == datasec->target_index)
{
s->addr += data_delta;
s->endaddr += data_delta;
}
else if (s->sec_ptr->target_index == bsssec->target_index)
else if (s->the_bfd_section->target_index == bsssec->target_index)
{
s->addr += bss_delta;
s->endaddr += bss_delta;
@ -555,12 +555,12 @@ vmap_exec ()
for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
{
if (STREQ(".text", exec_ops.to_sections[i].sec_ptr->name))
if (STREQ(".text", exec_ops.to_sections[i].the_bfd_section->name))
{
exec_ops.to_sections[i].addr += vmap->tstart;
exec_ops.to_sections[i].endaddr += vmap->tstart;
}
else if (STREQ(".data", exec_ops.to_sections[i].sec_ptr->name))
else if (STREQ(".data", exec_ops.to_sections[i].the_bfd_section->name))
{
exec_ops.to_sections[i].addr += vmap->dstart;
exec_ops.to_sections[i].endaddr += vmap->dstart;
@ -727,15 +727,15 @@ bfd_err:
and if vp->tstart is 0xd0002000, then the first byte of
the text section on disk corresponds to address 0xd0002200. */
stp->bfd = vp->bfd;
stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".text");
stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tstart;
stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tend;
stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".text");
stp->addr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->tstart;
stp->endaddr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->tend;
stp++;
stp->bfd = vp->bfd;
stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".data");
stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dstart;
stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dend;
stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".data");
stp->addr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->dstart;
stp->endaddr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->dend;
}
vmap_symtab (vp);

View File

@ -1,5 +1,6 @@
/* Target-dependent code for the SPARC for GDB, the GNU debugger.
Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994
Free Software Foundation, Inc.
This file is part of GDB.
@ -175,6 +176,15 @@ sparc_frame_saved_pc (frame)
CORE_ADDR sigcontext_addr;
char scbuf[TARGET_PTR_BIT / HOST_CHAR_BIT];
int saved_pc_offset = SIGCONTEXT_PC_OFFSET;
char *name = NULL;
/* Solaris2 ucbsigvechandler passes a pointer to a sigcontext
as the third parameter. The offset to the saved pc is 12. */
find_pc_partial_function (frame->pc, &name,
(CORE_ADDR *)NULL,(CORE_ADDR *)NULL);
if (name && STREQ (name, "ucbsigvechandler"))
saved_pc_offset = 12;
/* The sigcontext address is contained in register O2. */
get_saved_register (buf, (int *)NULL, (CORE_ADDR *)NULL,
@ -183,7 +193,7 @@ sparc_frame_saved_pc (frame)
/* Don't cause a memory_error when accessing sigcontext in case the
stack layout has changed or the stack is corrupt. */
target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET,
target_read_memory (sigcontext_addr + saved_pc_offset,
scbuf, sizeof (scbuf));
return extract_address (scbuf, sizeof (scbuf));
}
@ -788,8 +798,8 @@ in_solib_trampoline(pc, name)
s = find_pc_section(pc);
retval = (s != NULL
&& s->sec_ptr->name != NULL
&& STREQ (s->sec_ptr->name, ".plt"));
&& s->the_bfd_section->name != NULL
&& STREQ (s->the_bfd_section->name, ".plt"));
return(retval);
}

View File

@ -219,7 +219,7 @@ add_to_section_table (abfd, asect, table_pp_char)
if (0 == bfd_section_size (abfd, asect))
return;
(*table_pp)->bfd = abfd;
(*table_pp)->sec_ptr = asect;
(*table_pp)->the_bfd_section = asect;
(*table_pp)->addr = bfd_section_vma (abfd, asect);
(*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
(*table_pp)++;
@ -357,7 +357,7 @@ xfer_memory (memaddr, myaddr, len, write, target)
if (p->endaddr >= memend)
{
/* Entire transfer is within this section. */
res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, memaddr - p->addr, len);
return (res != false)? len: 0;
}
else if (p->endaddr <= memaddr)
@ -369,7 +369,7 @@ xfer_memory (memaddr, myaddr, len, write, target)
{
/* This section overlaps the transfer. Just do half. */
len = p->endaddr - memaddr;
res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, memaddr - p->addr, len);
return (res != false)? len: 0;
}
else if (p->addr < nextsectaddr)
@ -401,8 +401,8 @@ print_section_info (t, abfd)
local_hex_string_custom ((unsigned long) p->endaddr, "08l"));
if (info_verbose)
printf_filtered (" @ %s",
local_hex_string_custom ((unsigned long) p->sec_ptr->filepos, "08l"));
printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
local_hex_string_custom ((unsigned long) p->the_bfd_section->filepos, "08l"));
printf_filtered (" is %s", bfd_section_name (p->bfd, p->the_bfd_section));
if (p->bfd != abfd) {
printf_filtered (" in %s", bfd_get_filename (p->bfd));
}
@ -511,8 +511,8 @@ set_section_command (args, from_tty)
secaddr = parse_and_eval_address (args);
for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
&& bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen)
&& bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0') {
offset = secaddr - p->addr;
p->addr += offset;
p->endaddr += offset;