diff options
author | Jason Molenda <jmolenda@apple.com> | 1999-10-12 04:37:53 +0000 |
---|---|---|
committer | Jason Molenda <jmolenda@apple.com> | 1999-10-12 04:37:53 +0000 |
commit | 2df3850c7bfea139c5baf6c2911c11456a1b32e9 (patch) | |
tree | a7b20a626e29e423c610ac0eef23fbe9591684e4 /gdb | |
parent | 50a6e31f5835fc707a0c3ca6e0d56680befb645b (diff) | |
download | gdb-2df3850c7bfea139c5baf6c2911c11456a1b32e9.zip gdb-2df3850c7bfea139c5baf6c2911c11456a1b32e9.tar.gz gdb-2df3850c7bfea139c5baf6c2911c11456a1b32e9.tar.bz2 |
import gdb-1999-10-11 snapshot
Diffstat (limited to 'gdb')
47 files changed, 799 insertions, 502 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4a55501..cc2d5e3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,195 @@ +1999-10-11 Jim Blandy <jimb@zwingli.cygnus.com> + + * config/pa/tm-hppa.h (SYMBOLS_CAN_START_WITH_DOLLAR): It's not + enough to #define this; you have to give it a non-zero value. + +1999-10-11 Jim Blandy <jimb@zenia.red-bean.com> + + Fix from Jim Kingdon <kingdon@redhat.com>, with tweaks to make it + gdbarch- and bigendian-friendly: + * valops.c (PARM_BOUNDARY): If not #defined, default to zero. + (value_push): If PARM_BOUNDARY is not zero, align arguments to + that boundary. + * config/i386/tm-i386.h: Define PARM_BOUNDARY. + +Mon Oct 11 14:23:55 1999 Fred Fish <fnf@cygnus.com> + + * config/mips/tm-irix3.h (PS_REGNUM): Don't undef if we aren't + going to redefine it to something else. + +1999-10-11 Jason Merrill <jason@yorick.cygnus.com> + + * dwarfread.c (read_func_scope): Don't try to set main_func_*; + we handle that in blockframe.c:inside_main_func. + * dwarf2read.c (read_func_scope): Likewise. + (dwarf2_add_field, dwarf2_add_member_fn): Get member function name + directly, not from mangled name. + (skip_member_fn_name): Lose. + +Mon Oct 11 12:24:52 1999 Andrew Cagney <cagney@b1.cygnus.com> + + * serial.h (enum serial_rc): Clarify SERIAL_TIMEOUT and + restrictions on TIMEOUT in ASYNC mode. + + * serial.c (serial_readchar): Check for invalid timeout when in + async mode. Disable test. + +Thu Oct 7 17:20:01 1999 Andrew Cagney <cagney@amy.cygnus.com> + + * monitor.c (monitor_printable_string): Add length argument. Don't + return final string length. + (monitor_printf_noecho, monitor_printf, monitor_expect): Update. + (monitor_error): Pass real_len to monitor_printable_string. + (monitor_error): Rewrite. Replace printf fmt string parameter with + function name and message parameters. + (monitor_read_memory_single, monitor_read_memory): Update. + +1999-10-07 Stan Shebs <shebs@andros.cygnus.com> + + * main.c (print_gdb_help): Fix bug reporting address. + * gnu-regex.h, gnu-regex.c: Ditto. + +1999-10-07 Jim Blandy <jimb@zwingli.cygnus.com> + + * parse.c (SYMBOLS_CAN_START_WITH_DOLLAR): New macro, + whose value can be overridden by target files. + (write_dollar_variable): Don't check the symbol table for + identifiers beginning with `$' unless + SYMBOLS_CAN_START_WITH_DOLLAR is non-zero. + * config/pa/tm-hppa.h (SYMBOLS_CAN_START_WITH_DOLLAR): Define. + * doc/gdbint.texinfo (SYMBOLS_CAN_START_WITH_DOLLAR): Document. + + Remove all traces of the BINOP_SCOPE operator. It's never + generated, and not implemented. + * expression.h (enum exp_opcode): Delete BINOP_SCOPE. + * c-lang.c (c_op_print_tab): Delete entry for BINOP_SCOPE. + * eval.c (evaluate_subexp_standard): Doc fix. + * expprint.c (op_name): Remove case for BINOP_SCOPE. + (dump_subexp): Same. + + * dwarf2read.c (dwarf2_const_value): Treat DW_FORM_data1, + DW_FORM_data2, DW_FORM_data4, and DW_FORM_data8 as signed values, + since that's what read_var_value will do anyway. + +1999-10-07 Fred Fish <fnf@cygnus.com> + + * objfiles.h (struct objfile): Delete is_solib member, now handled + by OBJF_SHARED bit in struct objfile's flags. + * objfiles.c (objfile_purge_solibs): Check OBJF_SHARED bit in flags + instead of old is_solib int member in objfile struct. + + * objfiles.c (allocate_objfile): Remove is_solib arg. Now passed + as a bit in combined flags arg. + * symfile.c (symbol_file_add): Ditto. + * objfiles.h (allocate_objfile): Adjust prototype after removal + of is_solib arg. + * symtab.h (symbol_file_add): Ditto. + + * cxux-nat.c (add_shared_symbol_files): Remove zero passed to + symbol_file_add in old is_solib arg, defaults to zero now in + flags. + * irix5-nat.c (symbol_add_stub): Ditto. + * remote-mm.c (mm_load): Ditto. + * remote-udi.c (udi_load): Ditto. + * remote-vx.c (vx_add_symbols): Ditto. + * symfile.c (symbol_file_command): Ditto. + (add_symbol_file_command): Ditto. + + * coff-solib.c (coff_solib_add): Call symbol_file_add with + OBJF_SHARED in flags bit, rather than 1 in old is_solib + arg. + * osfsolib.c (symbol_add_stub): Ditto. + * pa64solib.c (pa64_solib_add_solib_objfile): Ditto. + * solib.c (symbol_add_stub): Ditto. + * somsolib.c (som_solib_add_solib_objfile): Ditto. + * win32-nat.c (handle_load_dll): Ditto. + + * objfiles.c (allocate_objfile): Remove old args "mapped" and + "user_loaded". Replaced with new arg "flags" containing specific + If global var mapped_symbol_files is nonzero + then set OBJF_MAPPED in flags arg. Check for OBJF_MAPPED bit in + flags where we used to check mapped arg. + Pass flags to open_mapped_file instead of mapped arg. + Ensure that OBJF_MAPPED bit is reset in flags when the objfile + is not mapped. Add passed flags bits to objfile's flags bits. + (open_mapped_file): Replace "mapped" arg with new "flags" arg. + Adjust prototype. Pass flags to open_existing_mapped_file. + (open_existing_mapped_file): Replace "mapped" arg with new "flags". + Check flags for OBJF_MAPPED. + * objfiles.h (allocate_objfile): Adjust prototype. + * rs6000-nat.c (add_vmap): Pass zero for combined flags, rather + than separate zero ints for old "mapped" and "user_loaded" flags. + * symfile.c (symbol_file_add): Pass allocate_objfile combined flags + rather than individual mapped and user loaded bits. + + * symfile.c (symbol_file_add): Delete user_loaded arg. + * symtab.h (symbol_file_add): Adjust prototype for deleted + user_loaded arg. + * objfiles.h (struct objfile): Delete user_loaded member. + (OBJF_USERLOADED): New flag bit to replace user_loaded. + + * symfile.c (symbol_file_command): Add OBJF_USER_LOADED to flags + passed to symbol_file_add. Delete previous passing of explicit 1 + for user_loaded. + (add_symbol_file_command): Ditto. + + * coff-solib.c (coff_solib_add): No longer pass zero for user loaded, + now defaults to zero in flags. + * cxux-nat.c (add_shared_symbol_files): Ditto. + * irix5-nat.c (symbol_add_stub): Ditto. + * osfsolib.c (symbol_add_stub): Ditto. + * remote-mm.c (mm_load): Ditto. + * pa64solib.c (pa64_solib_add_solib_objfile): Ditto. + * remote-udi.c (udi_load): Ditto. + * remote-vx.c (vx_add_symbols): Ditto. + * solib.c (symbol_add_stub): Ditto. + * somsolib.c (som_solib_add_solib_objfile): Ditto. + * win32-nat.c (handle_load_dll): Ditto. + +Thu Oct 7 19:24:05 1999 Andrew Cagney <cagney@b1.cygnus.com> + + * Makefile.in (monitor.o): Allow monitor.o to be compiled with + -Werror. + + * monitor.c (monitor_debug_p): New variable. Replaces macro. + (EXTRA_RDEBUG): Delete. Update all uses. + (monitor_debug): New function. Replaces macro. + (RDEBUG): Delete macro. Update all uses. + debug output to gdb_stdlog and not the console. + + * monitor.c: Fix printf formating. Replace printf calls with + fprintf_unfiltered. + +1999-10-06 Stan Shebs <shebs@andros.cygnus.com> + + * MAINTAINERS: Switch ARM target maintenance from Elena + Zannoni to Jim Ingham. + +1999-10-06 Frank Ch. Eigler <fche@cygnus.com> + + * remote.c (hexnumnstr): New function. Allow setting of width. + (hexnumstr): Call the above. + (remote_write_bytes): Fill in X-protocol address field more + reliably. + +1999-10-06 Fred Fish <fnf@cygnus.com> + + * xcoffread.c (xcoff_symfile_offsets): Fix typo, addr->addrs. + +1999-10-06 Elena Zannoni <ezannoni@kwikemart.cygnus.com> + + * remote.c (handle_remote_sigint_twice): Make this signal be + handled by inferior_event_handler, via the wrapper function. + (async_remote_interrupt_twice): Make not static. Add debug print. + * remote.h (async_remote_interrupt_twice): Export for use in + inf-loop.c. + + * inf-loop.c (inferior_event_handler_wrapper): New function. + (inferior_event_handler): Handle a request to quit and kill the + target. + Include remote.h. + * inf-loop.h (inferior_event_handler_wrapper): Export. + 1999-10-04 James Ingham <jingham@leda.cygnus.com> * remote-rdi.c (arm_rdi_open): If the angel_RDI_Open fails, close @@ -300,7 +492,6 @@ Wed Sep 29 21:27:16 1999 Jeffrey A Law (law@cygnus.com) * remote-sim.c (gdbsim_create_inferior): Ditto. * target.c (target_link): Ditto. * win32-nat.c (child_create_inferior): Ditto. - * varobj.c (varobj_create, new_root_variable): Ditto. Thu Sep 30 10:36:19 1999 Andrew Cagney <cagney@b1.cygnus.com> diff --git a/gdb/MAINTAINERS b/gdb/MAINTAINERS index b9e8e0c..ef02b90 100644 --- a/gdb/MAINTAINERS +++ b/gdb/MAINTAINERS @@ -10,7 +10,6 @@ djgpp native DJ Delorie dj@cygnus.com win32 host & native Chris Faylor cgf@cygnus.com main (main.c, top.c) Elena Zannoni ezannoni@cygnus.com readline Elena Zannoni ezannoni@cygnus.com -arm target Elena Zannoni ezannoni@cygnus.com powerpc target Elena Zannoni ezannoni@cygnus.com command interpreter Fernando Nasser fnasser@cygnus.com generic symtabs Jim Blandy jimb@cygnus.com @@ -20,6 +19,7 @@ stabs reader Jim Blandy jimb@cygnus.com x86 linux native Jim Blandy jimb@cygnus.com Scheme support Jim Blandy jimb@cygnus.com svr4 shlibs (solib.c) Jim Blandy jimb@cygnus.com +arm target Jim Ingham jingham@cygnus.com hurd native Mark Kettenis kettenis@wins.va.nl hpux, hp pa native Jeff Law law@cygnus.com m32r target Michael Snyder msnyder@cygnus.com diff --git a/gdb/Makefile.in b/gdb/Makefile.in index ddb8f71..950e2a1 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -229,7 +229,7 @@ CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE) \ ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES) ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES) -VERSION = 19991004 +VERSION = 19991011 DIST=gdb LINT=/usr/5bin/lint @@ -1336,14 +1336,8 @@ mipsread.o: mipsread.c buildsym.h complaints.h $(bfd_h) $(defs_h) \ mipsv4-nat.o: mipsv4-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) target.h -# FIXME: Monitor.c has -Wformat problems. The code using the macros -# RDEBUG and EXTRA_RDEBUG needs be replaced with something that: -# doesn't cause -Wformat errors; sends all output to gdb_stdlog -# instead of stdout; and controls the output throug a ``set -# monitordebug'' command/variable. cagney, 1999-09-01. monitor.o: monitor.c monitor.h $(bfd_h) $(wait_h) $(defs_h) $(gdbcmd_h) \ $(inferior_h) target.h serial.h terminal.h gdb_string.h - $(CC) -c $(INTERNAL_WARN_CFLAGS) $(NO_WERROR_CFLAGS) $< news-xdep.o: news-xdep.c diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 308f8d4..16046cf 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -389,8 +389,6 @@ const struct op_print c_op_print_tab[] = {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0}, {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0}, {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0}, - /* C++ */ - {"::", BINOP_SCOPE, PREC_PREFIX, 0}, {NULL, 0, 0, 0} }; diff --git a/gdb/coff-solib.c b/gdb/coff-solib.c index 89a7b4b..9c68fa4 100644 --- a/gdb/coff-solib.c +++ b/gdb/coff-solib.c @@ -94,9 +94,7 @@ coff_solib_add (arg_string, from_tty, target) objfile = symbol_file_add (filename, from_tty, NULL, /* no offsets */ 0, /* not mainline */ - 0, /* flags */ - 0, /* Not user loaded */ - 1); /* Is a solib */ + OBJF_SHARED); /* flags */ libsize -= len * 4; lib += len * 4; diff --git a/gdb/config/i386/tm-i386.h b/gdb/config/i386/tm-i386.h index 0bfb2e6..44e58d1 100644 --- a/gdb/config/i386/tm-i386.h +++ b/gdb/config/i386/tm-i386.h @@ -250,6 +250,11 @@ extern void i386_frame_find_saved_regs PARAMS ((struct frame_info *, /* Things needed for making the inferior call functions. */ +/* "An argument's size is increased, if necessary, to make it a + multiple of [32 bit] words. This may require tail padding, + depending on the size of the argument" - from the x86 ABI. */ +#define PARM_BOUNDARY 32 + /* Push an empty stack frame, to record the current PC, etc. */ #define PUSH_DUMMY_FRAME { i386_push_dummy_frame (); } diff --git a/gdb/config/mips/tm-irix3.h b/gdb/config/mips/tm-irix3.h index 57c344e..9f5afff 100644 --- a/gdb/config/mips/tm-irix3.h +++ b/gdb/config/mips/tm-irix3.h @@ -31,7 +31,6 @@ #undef MIPS_REGISTER_NAMES #undef FP0_REGNUM #undef PC_REGNUM -#undef PS_REGNUM #undef HI_REGNUM #undef LO_REGNUM #undef CAUSE_REGNUM diff --git a/gdb/config/pa/tm-hppa.h b/gdb/config/pa/tm-hppa.h index d535981..94cb6ba 100644 --- a/gdb/config/pa/tm-hppa.h +++ b/gdb/config/pa/tm-hppa.h @@ -799,3 +799,9 @@ PARAMS ((CORE_ADDR, int)) /* Here's how to step off a permanent breakpoint. */ #define SKIP_PERMANENT_BREAKPOINT (hppa_skip_permanent_breakpoint) extern void hppa_skip_permanent_breakpoint (void); + +/* On HP-UX, certain system routines (millicode) have names beginning + with $ or $$, e.g. $$dyncall, which handles inter-space procedure + calls on PA-RISC. Tell the expression parser to check for those + when parsing tokens that begin with "$". */ +#define SYMBOLS_CAN_START_WITH_DOLLAR (1) diff --git a/gdb/cxux-nat.c b/gdb/cxux-nat.c index c2d8526..9db528a 100644 --- a/gdb/cxux-nat.c +++ b/gdb/cxux-nat.c @@ -368,7 +368,7 @@ add_shared_symbol_files () return; } - objfile = symbol_file_add (LIBC_FILE, 0, NULL, 0, OBJF_READNOW, 0, 0); + objfile = symbol_file_add (LIBC_FILE, 0, NULL, 0, OBJF_READNOW); minsym = lookup_minimal_symbol (LINKS_MAP_POINTER, objfile); ld_map = (struct link_map *) @@ -387,7 +387,7 @@ add_shared_symbol_files () struct section_addr_info section_addrs; memset (§ion_addrs, 0, sizeof (section_addrs)); section_addrs.text_addr = lms.l_addr; - symbol_file_add (path_name, 1, §ion_addrs, 0, 0, 0, 0); + symbol_file_add (path_name, 1, §ion_addrs, 0, 0); free (path_name); } } diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 56f7fc2..077da82 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,16 @@ +1999-10-11 Jim Kingdon <kingdon@redhat.com> + + * gdbint.texinfo (Target Architecture Definition): Add PARM_BOUNDARY. + +1999-10-05 Stan Shebs <shebs@andros.cygnus.com> + + From Dmitry Sivachenko <demon@gpad.ac.ru>: + * gdb.texinfo: Use GDBP and GDBN everywhere, fix a couple other + typos. + + * gdb.texinfo: Various minor wording and formatting improvements, + mentions of additional command-line options. + 1999-09-30 Fred Fish <fnf@cygnus.com> * gdb.texinfo: Document additional forms of specifying section diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index d476d88..9a257e6 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -347,19 +347,19 @@ information in this manual. Cygnus Solutions has sponsored GDB maintenance and much of its development since 1991. Cygnus engineers who have worked on GDB -fulltime include Mark Alexander, Jim Blandy, Per Bothner, Edith Epstein, -Chris Faylor, Fred Fish, Martin Hunt, Jim Ingham, John Gilmore, Stu -Grossman, Kung Hsu, Jim Kingdon, John Metzler, Fernando Nasser, Geoffrey -Noer, Dawn Perchik, Rich Pixley, Zdenek Radouch, Keith Seitz, Stan -Shebs, David Taylor, and Elena Zannoni. In addition, Dave Brolley, Ian -Carmichael, Steve Chamberlain, Nick Clifton, JT Conklin, Stan Cox, DJ -Delorie, Ulrich Drepper, Frank Eigler, Doug Evans, Sean Fagan, David -Henkel-Wallace, Richard Henderson, Jeff Holcomb, Jeff Law, Jim Lemke, -Tom Lord, Bob Manson, Michael Meissner, Jason Merrill, Catherine Moore, -Drew Moseley, Ken Raeburn, Gavin Romig-Koch, Rob Savoye, Jamie Smith, -Mike Stump, Ian Taylor, Angela Thomas, Michael Tiemann, Tom Tromey, Ron -Unrau, Jim Wilson, and David Zuhn have made contributions both large -and small. +fulltime include Mark Alexander, Jim Blandy, Per Bothner, Kevin +Buettner, Edith Epstein, Chris Faylor, Fred Fish, Martin Hunt, Jim +Ingham, John Gilmore, Stu Grossman, Kung Hsu, Jim Kingdon, John Metzler, +Fernando Nasser, Geoffrey Noer, Dawn Perchik, Rich Pixley, Zdenek +Radouch, Keith Seitz, Stan Shebs, David Taylor, and Elena Zannoni. In +addition, Dave Brolley, Ian Carmichael, Steve Chamberlain, Nick Clifton, +JT Conklin, Stan Cox, DJ Delorie, Ulrich Drepper, Frank Eigler, Doug +Evans, Sean Fagan, David Henkel-Wallace, Richard Henderson, Jeff +Holcomb, Jeff Law, Jim Lemke, Tom Lord, Bob Manson, Michael Meissner, +Jason Merrill, Catherine Moore, Drew Moseley, Ken Raeburn, Gavin +Romig-Koch, Rob Savoye, Jamie Smith, Mike Stump, Ian Taylor, Angela +Thomas, Michael Tiemann, Tom Tromey, Ron Unrau, Jim Wilson, and David +Zuhn have made contributions both large and small. @node Sample Session @@ -690,9 +690,10 @@ would attach @value{GDBN} to process @code{1234} (unless you also have a file named @file{1234}; @value{GDBN} does check for a core file first). Taking advantage of the second command-line argument requires a fairly -complete operating system; when you use @value{GDBN} as a remote debugger -attached to a bare board, there may not be any notion of ``process'', -and there is often no way to get a core dump. +complete operating system; when you use @value{GDBN} as a remote +debugger attached to a bare board, there may not be any notion of +``process'', and there is often no way to get a core dump. @value{GDBN} +will warn you if it is unable to attach or to read core dumps. You can run @code{gdb} without printing the front material, which describes @value{GDBN}'s non-warranty, by specifying @code{-silent}: @@ -729,7 +730,7 @@ in sequential order. The order makes a difference when the @node File Options @subsection Choosing files -When @value{GDBN} starts +When @value{GDBN} starts, it reads any arguments other than options as specifying an executable file and core file (or process ID). This is the same as if the arguments were specified by the @samp{-se} and @samp{-c} options respectively. (@value{GDBN} reads the first argument @@ -805,14 +806,14 @@ This makes startup slower, but makes future operations faster. @end table -The @code{-mapped} and @code{-readnow} options are typically combined in +You typically combine the @code{-mapped} and @code{-readnow} options in order to build a @file{.syms} file that contains complete symbol -information. (@xref{Files,,Commands to specify files}, for -information on @file{.syms} files.) A simple @value{GDBN} invocation to do -nothing but build a @file{.syms} file for future use is: +information. (@xref{Files,,Commands to specify files}, for information +on @file{.syms} files.) A simple @value{GDBN} invocation to do nothing +but build a @file{.syms} file for future use is: @example - gdb -batch -nx -mapped -readnow programname +gdb -batch -nx -mapped -readnow programname @end example @node Mode Options @@ -824,10 +825,11 @@ batch mode or quiet mode. @table @code @item -nx @itemx -n -Do not execute commands from any initialization files (normally called -@file{.gdbinit}, or @file{gdb.ini} on PCs). Normally, the commands in -these files are executed after all the command options and arguments -have been processed. @xref{Command Files,,Command files}. +Do not execute commands found in any initialization files (normally +called @file{.gdbinit}, or @file{gdb.ini} on PCs). Normally, +@value{GDBN} executes the commands in these files after all the command +options and arguments have been processed. @xref{Command Files,,Command +files}. @item -quiet @itemx -q @@ -841,17 +843,29 @@ initialization files, if not inhibited with @samp{-n}). Exit with nonzero status if an error occurs in executing the @value{GDBN} commands in the command files. -Batch mode may be useful for running @value{GDBN} as a filter, for example to -download and run a program on another computer; in order to make this -more useful, the message +Batch mode may be useful for running @value{GDBN} as a filter, for +example to download and run a program on another computer; in order to +make this more useful, the message @example Program exited normally. @end example @noindent -(which is ordinarily issued whenever a program running under @value{GDBN} control -terminates) is not issued when running in batch mode. +(which is ordinarily issued whenever a program running under +@value{GDBN} control terminates) is not issued when running in batch +mode. + +@item -nowindows +@itemx -nw +``No windows''. If @value{GDBN} comes with a graphical user interface +(GUI) built in, then this option tells GDB to only use the command-line +interface. If no GUI is available, this option has no effect. + +@item -windows +@itemx -w +If @value{GDBN} includes a GUI, then this option requires it to be +used if possible. @item -cd @var{directory} Run @value{GDBN} using @var{directory} as its working directory, @@ -869,7 +883,8 @@ and a newline. The Emacs-to-@value{GDBN} interface program uses the two @samp{\032} characters as a signal to display the source code for the frame. -@item -b @var{bps} +@item -baud @var{bps} +@itemx -b @var{bps} Set the line speed (baud rate or bits per second) of any serial interface used by @value{GDBN} for remote debugging. @@ -1144,16 +1159,18 @@ display a short list of named classes of commands: (@value{GDBP}) help List of classes of commands: -running -- Running the program -stack -- Examining the stack -data -- Examining data +aliases -- Aliases of other commands breakpoints -- Making program stop at certain points +data -- Examining data files -- Specifying and examining files +internals -- Maintenance commands +obscure -- Obscure features +running -- Running the program +stack -- Examining the stack status -- Status inquiries support -- Support facilities +tracepoints -- Tracing of program execution without stopping the program user-defined -- User-defined commands -aliases -- Aliases of other commands -obscure -- Obscure features Type "help" followed by a class name for a list of commands in that class. @@ -1176,9 +1193,10 @@ List of commands: @c Line break in "show" line falsifies real output, but needed @c to fit in smallbook page size. -show -- Generic command for showing things set - with "set" -info -- Generic command for printing status +info -- Generic command for showing things + about the program being debugged +show -- Generic command for showing things + about the debugger Type "help" followed by command name for full documentation. @@ -1204,9 +1222,10 @@ complete i @smallexample @group +if +ignore info inspect -ignore @end group @end smallexample @@ -1265,11 +1284,14 @@ exceptional in lacking corresponding @code{set} commands: @cindex version number @item show version Show what version of @value{GDBN} is running. You should include this -information in @value{GDBN} bug-reports. If multiple versions of @value{GDBN} are in -use at your site, you may occasionally want to determine which version -of @value{GDBN} you are running; as @value{GDBN} evolves, new commands are introduced, -and old ones may wither away. The version number is also announced -when you start @value{GDBN}. +information in @value{GDBN} bug-reports. If multiple versions of +@value{GDBN} are in use at your site, you may need to determine which +version of @value{GDBN} you are running; as @value{GDBN} evolves, new +commands are introduced, and old ones may wither away. Also, many +system vendors ship variant versions of @value{GDBN}, and there are +variant versions of @value{GDBN} in GNU/Linux distributions as well. +The version number is the same as the one announced when you start +@value{GDBN}. @kindex show copying @item show copying @@ -1277,7 +1299,9 @@ Display information about permission for copying @value{GDBN}. @kindex show warranty @item show warranty -Display the @sc{gnu} ``NO WARRANTY'' statement. +Display the @sc{gnu} ``NO WARRANTY'' statement, or a warranty, +if your version of @value{GDB} comes with one. + @end table @node Running @@ -1961,7 +1985,7 @@ process. The @var{mode} can be: @table @code @item parent The original process is debugged after a fork. The child process runs -unimpeded. +unimpeded. This is the default. @item child The new process is debugged after a fork. The parent process runs @@ -1972,7 +1996,7 @@ The debugger will ask for one of the above choices. @end table @item show follow-fork-mode -Display the current debugger response to a fork or vfork call. +Display the current debugger response to a @code{fork} or @code{vfork} call. @end table If you ask to debug a child process and a @code{vfork} is followed by an @@ -2119,7 +2143,7 @@ C++, @var{function} may refer to more than one possible place to break. @itemx break -@var{offset} Set a breakpoint some number of lines forward or back from the position at which execution stopped in the currently selected @dfn{stack frame}. -(@xref{Frames, , Frames}, for a description of stack frames.) +(@xref{Frames, ,Frames}, for a description of stack frames.) @item break @var{linenum} Set a breakpoint at line @var{linenum} in the current source file. @@ -2236,7 +2260,7 @@ Whether the breakpoint is marked to be disabled or deleted when hit. Enabled breakpoints are marked with @samp{y}. @samp{n} marks breakpoints that are not enabled. @item Address -Where the breakpoint is in your program, as a memory address +Where the breakpoint is in your program, as a memory address. @item What Where the breakpoint is in the source for your program, as a file and line number. @@ -2326,14 +2350,14 @@ expression changes, without having to predict a particular place where this may happen. Depending on your system, watchpoints may be implemented in software or -hardware. GDB does software watchpointing by single-stepping your +hardware. @value{GDBN} does software watchpointing by single-stepping your program and testing the variable's value each time, which is hundreds of times slower than normal execution. (But this may still be worth it, to catch errors where you have no clue what part of your program is the culprit.) On some systems, such as HP-UX, Linux and some other x86-based targets, -GDB includes support for +@value{GDBN} includes support for hardware watchpoints, which do not slow down the running of your program. @@ -2349,7 +2373,7 @@ Set a watchpoint that will break when watch @var{expr} is read by the program. @kindex awatch @item awatch @var{expr} -Set a watchpoint that will break when @var{args} is either read or written into +Set a watchpoint that will break when @var{expr} is either read or written into by the program. @kindex info watchpoints @@ -2421,7 +2445,7 @@ watchpoint with one command and the other with a different command. Delete or disable unused watchpoint commands before setting new ones. If you call a function interactively using @code{print} or @code{call}, -any watchpoints you have set will be inactive until GDB reaches another +any watchpoints you have set will be inactive until @value{GDBN} reaches another kind of breakpoint or the call completes. @value{GDBN} automatically deletes watchpoints that watch local @@ -3308,7 +3332,7 @@ well; in this case, place @samp{thread @var{threadno}} before the breakpoint condition, like this: @smallexample -(gdb) break frik.c:13 thread 28 if bartab > lim +(@value{GDBP}) break frik.c:13 thread 28 if bartab > lim @end smallexample @end table @@ -3355,7 +3379,7 @@ when you step. They are more likely to run when you @samp{next} over a function call, and they are completely free to run when you use commands like @samp{continue}, @samp{until}, or @samp{finish}. However, unless another thread hits a breakpoint during its timeslice, they will never steal the -GDB prompt away from the thread that you are debugging. +@value{GDBN} prompt away from the thread that you are debugging. @item show scheduler-locking Display the current scheduler locking mode. @@ -7374,7 +7398,7 @@ type = double (@value{GDBP}) p g $1 = 1 (@value{GDBP}) set g=4 -(gdb) p g +(@value{GDBP}) p g $2 = 1 (@value{GDBP}) r The program being debugged has been started already. @@ -8103,7 +8127,7 @@ it somewhere in memory where it won't get clobbered by the download. @kindex target sim @item target sim -Builtin CPU simulator. GDB includes simulators for most architectures. +Builtin CPU simulator. @value{GDBN} includes simulators for most architectures. In general, @example target sim @@ -8772,12 +8796,12 @@ toggle debug flag. @item detach @emph{(optional)} @tab @code{D} @tab -Detach GDB from the remote system. Sent to the remote target before -GDB disconnects. +Detach @value{GDBN} from the remote system. Sent to the remote target before +@value{GDBN} disconnects. @item @tab reply @emph{no response} @tab -GDB does not check for any response after sending this packet +@value{GDBN} does not check for any response after sending this packet @item reserved @tab @code{e} @@ -8804,7 +8828,7 @@ GDB does not check for any response after sending this packet Each byte of register data is described by two hex digits. The bytes with the register are transmitted in target byte order. The size of each register and their position within the @samp{g} @var{packet} are -determined by the GDB internal macros @var{REGISTER_RAW_SIZE} and +determined by the @value{GDBN} internal macros @var{REGISTER_RAW_SIZE} and @var{REGISTER_NAME} macros. The specification of several standard @code{g} packets is specified below. @item @@ -8893,14 +8917,14 @@ thread context has been selected (ie. does 'k' kill only that thread?)}. @tab @code{m}@var{addr}@code{,}@var{length} @tab Read @var{length} bytes of memory starting at address @var{addr}. -Neither GDB nor the stub assume that sized memory transfers are assumed +Neither @value{GDBN} nor the stub assume that sized memory transfers are assumed using word alligned accesses. FIXME: @emph{A word aligned memory transfer mechanism is needed.} @item @tab reply @var{XX...} @tab @var{XX...} is mem contents. Can be fewer bytes than requested if able -to read only part of the data. Neither GDB nor the stub assume that +to read only part of the data. Neither @value{GDBN} nor the stub assume that sized memory transfers are assumed using word alligned accesses. FIXME: @emph{A word aligned memory transfer mechanism is needed.} @item @@ -9484,7 +9508,7 @@ Use the @code{set os} command to set the operating system. This tells @value{GDBN} which kernel object display module to initialize: @example -(gdb) set os cisco +(@value{GDBP}) set os cisco @end example If @code{set os} succeeds, @value{GDBN} will display some information @@ -9493,7 +9517,7 @@ which can be used to query the target. The @code{info} command is named after the operating system: @example -(gdb) info cisco +(@value{GDBP}) info cisco List of Cisco Kernel Objects Object Description any Any and all objects @@ -10092,7 +10116,7 @@ Hitachi SH, H8/300, or H8/500: that you want to use @samp{target hms}, the remote debugging interface for Hitachi microprocessors, or @samp{target e7000}, the in-circuit emulator for the Hitachi SH and the Hitachi 300H. (@samp{target hms} is -the default when GDB is configured specifically for the Hitachi SH, +the default when @value{GDBN} is configured specifically for the Hitachi SH, H8/300, or H8/500.) @item @@ -10124,7 +10148,7 @@ hosts, where it is typically something like @file{/dev/ttya}. @cindex serial line speed, Hitachi micros @code{@value{GDBP}} has another special command to set the communications speed: @samp{speed @var{bps}}. This command also is only used from Unix -hosts; on DOS hosts, set the line speed as usual from outside GDB with +hosts; on DOS hosts, set the line speed as usual from outside @value{GDBN} with the DOS @code{mode} command (for instance, @w{@kbd{mode com2:9600,n,8,1,p}} for a 9600@dmn{bps} connection). @@ -10182,15 +10206,15 @@ itself, are described in @ref{Files,,Commands to specify files}.) @smallexample (eg-C:\H8300\TEST) @value{GDBP} t.x -GDB is free software and you are welcome to distribute copies +@value{GDBN} is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. -There is absolutely no warranty for GDB; type "show warranty" +There is absolutely no warranty for @value{GDBN}; type "show warranty" for details. -GDB @value{GDBVN}, Copyright 1992 Free Software Foundation, Inc... -(gdb) target hms +@value{GDBN} @value{GDBVN}, Copyright 1992 Free Software Foundation, Inc... +(@value{GDBP}) target hms Connected to remote H8/300 HMS system. -(gdb) load t.x +(@value{GDBP}) load t.x .text : 0x8000 .. 0xabde *********** .data : 0xabde .. 0xad30 * .stack : 0xf000 .. 0xf014 * @@ -10502,10 +10526,10 @@ debugger: @example host$ @value{GDBP} @var{prog} -GDB is free software and @dots{} -(gdb) target mips /dev/ttyb -(gdb) load @var{prog} -(gdb) run +@value{GDBN} is free software and @dots{} +(@value{GDBP}) target mips /dev/ttyb +(@value{GDBP}) load @var{prog} +(@value{GDBP}) run @end example @item target mips @var{hostname}:@var{portnumber} @@ -10844,7 +10868,7 @@ remote protocol. @node ST2000 @subsection Tandem ST2000 -GDB may be used with a Tandem ST2000 phone switch, running Tandem's +@value{GDBN} may be used with a Tandem ST2000 phone switch, running Tandem's STDBUG protocol. To connect your ST2000 to the host system, see the manufacturer's @@ -10945,7 +10969,7 @@ simulated clock ticks. @section Architectures This section describes characteristics of architectures that affect -all uses of GDB with this architecture, both native and cross. +all uses of @value{GDBN} with the architecture, both native and cross. @menu * A29K:: @@ -11236,13 +11260,14 @@ from wrapping its output. @cindex number representation @cindex entering numbers -You can always enter numbers in octal, decimal, or hexadecimal in @value{GDBN} by -the usual conventions: octal numbers begin with @samp{0}, decimal -numbers end with @samp{.}, and hexadecimal numbers begin with @samp{0x}. -Numbers that begin with none of these are, by default, entered in base -10; likewise, the default display for numbers---when no particular -format is specified---is base 10. You can change the default base for -both input and output with the @code{set radix} command. +You can always enter numbers in octal, decimal, or hexadecimal in +@value{GDBN} by the usual conventions: octal numbers begin with +@samp{0}, decimal numbers end with @samp{.}, and hexadecimal numbers +begin with @samp{0x}. Numbers that begin with none of these are, by +default, entered in base 10; likewise, the default display for +numbers---when no particular format is specified---is base 10. You can +change the default base for both input and output with the @code{set +radix} command. @table @code @kindex set input-radix @@ -11280,10 +11305,10 @@ Display the current default base for numeric display. @node Messages/Warnings @section Optional warnings and messages -By default, @value{GDBN} is silent about its inner workings. If you are running -on a slow machine, you may want to use the @code{set verbose} command. -This makes @value{GDBN} tell you when it does a lengthy internal operation, so -you will not think it has crashed. +By default, @value{GDBN} is silent about its inner workings. If you are +running on a slow machine, you may want to use the @code{set verbose} +command. This makes @value{GDBN} tell you when it does a lengthy +internal operation, so you will not think it has crashed. Currently, the messages controlled by @code{set verbose} are those which announce that the symbol table for a source file is being read; @@ -11302,21 +11327,24 @@ Disables @value{GDBN} output of certain informational messages. Displays whether @code{set verbose} is on or off. @end table -By default, if @value{GDBN} encounters bugs in the symbol table of an object -file, it is silent; but if you are debugging a compiler, you may find -this information useful (@pxref{Symbol Errors, ,Errors reading symbol files}). +By default, if @value{GDBN} encounters bugs in the symbol table of an +object file, it is silent; but if you are debugging a compiler, you may +find this information useful (@pxref{Symbol Errors, ,Errors reading +symbol files}). @table @code + @kindex set complaints @item set complaints @var{limit} -Permits @value{GDBN} to output @var{limit} complaints about each type of unusual -symbols before becoming silent about the problem. Set @var{limit} to -zero to suppress all complaints; set it to a large number to prevent -complaints from being suppressed. +Permits @value{GDBN} to output @var{limit} complaints about each type of +unusual symbols before becoming silent about the problem. Set +@var{limit} to zero to suppress all complaints; set it to a large number +to prevent complaints from being suppressed. @kindex show complaints @item show complaints Displays how many symbol complaints @value{GDBN} is permitted to produce. + @end table By default, @value{GDBN} is cautious, and asks what sometimes seems to be a @@ -11333,6 +11361,7 @@ If you are willing to unflinchingly face the consequences of your own commands, you can disable this ``feature'': @table @code + @kindex set confirm @cindex flinching @cindex confirmation @@ -11346,14 +11375,16 @@ Enables confirmation requests (the default). @kindex show confirm @item show confirm Displays state of confirmation requests. + @end table @node Sequences @chapter Canned Sequences of Commands Aside from breakpoint commands (@pxref{Break Commands, ,Breakpoint -command lists}), @value{GDBN} provides two ways to store sequences of commands -for execution as a unit: user-defined commands and command files. +command lists}), @value{GDBN} provides two ways to store sequences of +commands for execution as a unit: user-defined commands and command +files. @menu * Define:: User-defined commands @@ -11366,11 +11397,11 @@ for execution as a unit: user-defined commands and command files. @section User-defined commands @cindex user-defined command -A @dfn{user-defined command} is a sequence of @value{GDBN} commands to which -you assign a new name as a command. This is done with the @code{define} -command. User commands may accept up to 10 arguments separated by whitespace. -Arguments are accessed within the user command via @var{$arg0@dots{}$arg9}. -A trivial example: +A @dfn{user-defined command} is a sequence of @value{GDBN} commands to +which you assign a new name as a command. This is done with the +@code{define} command. User commands may accept up to 10 arguments +separated by whitespace. Arguments are accessed within the user command +via @var{$arg0@dots{}$arg9}. A trivial example: @smallexample define adder @@ -11391,6 +11422,7 @@ reference variables, use complex expressions, or even perform inferior functions calls. @table @code + @kindex define @item define @var{commandname} Define a command named @var{commandname}. If there is already a command @@ -11439,9 +11471,10 @@ List all user-defined commands, with the first line of the documentation @kindex show user @item show user @itemx show user @var{commandname} -Display the @value{GDBN} commands used to define @var{commandname} (but not its -documentation). If no @var{commandname} is given, display the +Display the @value{GDBN} commands used to define @var{commandname} (but +not its documentation). If no @var{commandname} is given, display the definitions for all user-defined commands. + @end table When user-defined commands are executed, the @@ -11515,13 +11548,13 @@ When you start @value{GDBN}, it automatically executes commands from its @dfn{init files}. These are files named @file{.gdbinit} on Unix, or @file{gdb.ini} on DOS/Windows. @value{GDBN} reads the init file (if any) in your home directory@footnote{On DOS/Windows systems, the home -directory is the one pointed to by the @code{HOME} environment variable.}, -then processes command line options and -operands, and then reads the init file (if any) in the current working -directory. This is so the init file in your home directory can set -options (such as @code{set complaints}) which affect the processing of -the command line options and operands. The init files are not executed -if you use the @samp{-nx} option; @pxref{Mode Options, ,Choosing modes}. +directory is the one pointed to by the @code{HOME} environment +variable.}, then processes command line options and operands, and then +reads the init file (if any) in the current working directory. This is +so the init file in your home directory can set options (such as +@code{set complaints}) which affect the processing of the command line +options and operands. The init files are not executed if you use the +@samp{-nx} option; @pxref{Mode Options, ,Choosing modes}. @cindex init file name On some configurations of @value{GDBN}, the init file is known by a diff --git a/gdb/doc/gdbint.texinfo b/gdb/doc/gdbint.texinfo index 37a6e3c..0115375 100644 --- a/gdb/doc/gdbint.texinfo +++ b/gdb/doc/gdbint.texinfo @@ -1444,6 +1444,15 @@ conditional should be eliminated (FIXME) and replaced by feature-specific macros. It was introduced in haste and we are repenting at leisure. +@item SYMBOLS_CAN_START_WITH_DOLLAR +Some systems have routines whose names start with @samp{$}. Giving this +macro a non-zero value tells GDB's expression parser to check for such +routines when parsing tokens that begin with @samp{$}. + +On HP-UX, certain system routines (millicode) have names beginning with +@samp{$} or @samp{$$}. For example, @code{$$dyncall} is a millicode +routine that handles inter-space procedure calls on PA-RISC. + @item IEEE_FLOAT Define this if the target system uses IEEE-format floating point numbers. @@ -1539,6 +1548,10 @@ The number of the ``next program counter'' register, if defined. The number of the ``next next program counter'' register, if defined. Currently, this is only defined for the Motorola 88K. +@item PARM_BOUNDARY +If non-zero, round arguments to a boundary of this many bits before +pushing them on the stack. + @item PRINT_REGISTER_HOOK (regno) If defined, this must be a function that prints the contents of the given register to standard output. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index fcebef6..83679fe 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -631,6 +631,10 @@ static struct symbol *new_symbol PARAMS ((struct die_info *, struct type *, static void dwarf2_const_value PARAMS ((struct attribute *, struct symbol *, struct objfile *)); +static void dwarf2_const_value_data (struct attribute *attr, + struct symbol *sym, + int bits); + static struct type *die_type PARAMS ((struct die_info *, struct objfile *)); static struct type *die_containing_type PARAMS ((struct die_info *, @@ -667,8 +671,6 @@ static void dwarf2_attach_fields_to_type PARAMS ((struct field_info *, struct type *, struct objfile *)); -static char *skip_member_fn_name PARAMS ((char *)); - static void dwarf2_add_member_fn PARAMS ((struct field_info *, struct die_info *, struct type *, struct objfile * objfile)); @@ -1597,12 +1599,6 @@ read_func_scope (die, objfile) objfile->ei.entry_func_highpc = highpc; } - if (STREQ (name, "main")) /* FIXME: hardwired name */ - { - objfile->ei.main_func_lowpc = lowpc; - objfile->ei.main_func_highpc = highpc; - } - /* Decode DW_AT_frame_base location descriptor if present, keep result for DW_OP_fbreg operands in decode_locdesc. */ frame_base_reg = -1; @@ -1854,23 +1850,17 @@ dwarf2_add_field (fip, die, objfile) else if (die->tag == DW_TAG_variable) { char *physname; - char *cp; /* C++ static member. - Get physical name, extract field name from physical name. */ - physname = dwarf2_linkage_name (die); - if (physname == NULL) + Get name of field. */ + attr = dwarf_attr (die, DW_AT_name); + if (attr && DW_STRING (attr)) + fieldname = DW_STRING (attr); + else return; - cp = physname; - while (*cp && !is_cplus_marker (*cp)) - cp++; - if (*cp) - fieldname = cp + 1; - if (*fieldname == '\0') - { - complain (&dwarf2_bad_static_member_name, physname); - } + /* Get physical name. */ + physname = dwarf2_linkage_name (die); SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname), &objfile->type_obstack)); @@ -1980,37 +1970,6 @@ dwarf2_attach_fields_to_type (fip, type, objfile) } } -/* Skip to the end of a member function name in a mangled name. */ - -static char * -skip_member_fn_name (physname) - char *physname; -{ - char *endname = physname; - - /* Skip over leading underscores. */ - while (*endname == '_') - endname++; - - /* Find two succesive underscores. */ - do - endname = strchr (endname, '_'); - while (endname != NULL && *++endname != '_'); - - if (endname == NULL) - { - complain (&dwarf2_bad_member_name_complaint, physname); - endname = physname; - } - else - { - /* Take care of trailing underscores. */ - if (endname[1] != '_') - endname--; - } - return endname; -} - /* Add a member function to the proper fieldlist. */ static void @@ -2028,46 +1987,15 @@ dwarf2_add_member_fn (fip, die, type, objfile) char *physname; struct nextfnfield *new_fnfield; - /* Extract member function name from mangled name. */ - physname = dwarf2_linkage_name (die); - if (physname == NULL) - return; - if ((physname[0] == '_' && physname[1] == '_' - && strchr ("0123456789Qt", physname[2])) - || DESTRUCTOR_PREFIX_P (physname)) - { - /* Constructor and destructor field names are set to the name - of the class, but without template parameter lists. - The name might be missing for anonymous aggregates. */ - if (TYPE_TAG_NAME (type)) - { - char *p = strchr (TYPE_TAG_NAME (type), '<'); - - if (p == NULL) - fieldname = TYPE_TAG_NAME (type); - else - fieldname = obsavestring (TYPE_TAG_NAME (type), - p - TYPE_TAG_NAME (type), - &objfile->type_obstack); - } - else - { - char *anon_name = ""; - fieldname = obsavestring (anon_name, strlen (anon_name), - &objfile->type_obstack); - } - } + /* Get name of member function. */ + attr = dwarf_attr (die, DW_AT_name); + if (attr && DW_STRING (attr)) + fieldname = DW_STRING (attr); else - { - char *endname = skip_member_fn_name (physname); + return; - /* Ignore member function if we were unable not extract the member - function name. */ - if (endname == physname) - return; - fieldname = obsavestring (physname, endname - physname, - &objfile->type_obstack); - } + /* Get the mangled name. */ + physname = dwarf2_linkage_name (die); /* Look up member function name in fieldlist. */ for (i = 0; i < fip->nfnfields; i++) @@ -4095,8 +4023,7 @@ dwarf2_start_subfile (filename, dirname) to make a symbol table entry for it, and if so, create a new entry and return a pointer to it. If TYPE is NULL, determine symbol type from the die, otherwise - used the passed type. - */ + used the passed type. */ static struct symbol * new_symbol (die, type, objfile) @@ -4383,15 +4310,35 @@ dwarf2_const_value (attr, sym, objfile) memcpy (SYMBOL_VALUE_BYTES (sym), blk->data, blk->size); SYMBOL_CLASS (sym) = LOC_CONST_BYTES; break; + + /* The DW_AT_const_value attributes are supposed to carry the + symbol's value "represented as it would be on the target + architecture." By the time we get here, it's already been + converted to host endianness, so we just need to sign- or + zero-extend it as appropriate. */ + case DW_FORM_data1: + dwarf2_const_value_data (attr, sym, 8); + break; case DW_FORM_data2: + dwarf2_const_value_data (attr, sym, 16); + break; case DW_FORM_data4: + dwarf2_const_value_data (attr, sym, 32); + break; case DW_FORM_data8: - case DW_FORM_data1: + dwarf2_const_value_data (attr, sym, 64); + break; + case DW_FORM_sdata: + SYMBOL_VALUE (sym) = DW_SND (attr); + SYMBOL_CLASS (sym) = LOC_CONST; + break; + case DW_FORM_udata: SYMBOL_VALUE (sym) = DW_UNSND (attr); SYMBOL_CLASS (sym) = LOC_CONST; break; + default: complain (&dwarf2_unsupported_const_value_attr, dwarf_form_name (attr->form)); @@ -4401,6 +4348,29 @@ dwarf2_const_value (attr, sym, objfile) } } + +/* Given an attr with a DW_FORM_dataN value in host byte order, sign- + or zero-extend it as appropriate for the symbol's type. */ +static void +dwarf2_const_value_data (struct attribute *attr, + struct symbol *sym, + int bits) +{ + LONGEST l = DW_UNSND (attr); + + if (bits < sizeof (l) * 8) + { + if (TYPE_UNSIGNED (SYMBOL_TYPE (sym))) + l &= ((LONGEST) 1 << bits) - 1; + else + l = (l << (sizeof (l) - bits)) >> (sizeof (l) - bits); + } + + SYMBOL_VALUE (sym) = l; + SYMBOL_CLASS (sym) = LOC_CONST; +} + + /* Return the type of the die in question using its DW_AT_type attribute. */ static struct type * diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index bc6f137..18727c2 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -1866,11 +1866,6 @@ read_func_scope (dip, thisdie, enddie, objfile) objfile->ei.entry_func_lowpc = dip->at_low_pc; objfile->ei.entry_func_highpc = dip->at_high_pc; } - if (STREQ (dip->at_name, "main")) /* FIXME: hardwired name */ - { - objfile->ei.main_func_lowpc = dip->at_low_pc; - objfile->ei.main_func_highpc = dip->at_high_pc; - } new = push_context (0, dip->at_low_pc); new->name = new_symbol (dip, objfile); list_in_scope = &local_symbols; @@ -1738,9 +1738,8 @@ evaluate_subexp_standard (expect_type, exp, pos, noside) default: /* Removing this case and compiling with gcc -Wall reveals that a lot of cases are hitting this case. Some of these should - probably be removed from expression.h (e.g. do we need a BINOP_SCOPE - and an OP_SCOPE?); others are legitimate expressions which are - (apparently) not fully implemented. + probably be removed from expression.h; others are legitimate + expressions which are (apparently) not fully implemented. If there are any cases landing here which mean a user error, then they should be separate cases, with more descriptive diff --git a/gdb/expprint.c b/gdb/expprint.c index fb98994..c4d5788 100644 --- a/gdb/expprint.c +++ b/gdb/expprint.c @@ -575,8 +575,6 @@ op_name (opcode) return "BINOP_MIN"; case BINOP_MAX: return "BINOP_MAX"; - case BINOP_SCOPE: - return "BINOP_SCOPE"; case STRUCTOP_MEMBER: return "STRUCTOP_MEMBER"; case STRUCTOP_MPTR: @@ -790,7 +788,6 @@ dump_subexp (exp, stream, elt) case BINOP_EXP: case BINOP_MIN: case BINOP_MAX: - case BINOP_SCOPE: case BINOP_INTDIV: case BINOP_ASSIGN_MODIFY: case BINOP_VAL: diff --git a/gdb/expression.h b/gdb/expression.h index 4408e8d..a91442c 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -78,7 +78,6 @@ enum exp_opcode BINOP_MIN, /* <? */ BINOP_MAX, /* >? */ - BINOP_SCOPE, /* :: */ /* STRUCTOP_MEMBER is used for pointer-to-member constructs. X . * Y translates into X STRUCTOP_MEMBER Y. */ diff --git a/gdb/gnu-regex.c b/gdb/gnu-regex.c index 8051c12..632c6ea 100644 --- a/gdb/gnu-regex.c +++ b/gdb/gnu-regex.c @@ -6,7 +6,7 @@ Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc. NOTE: The canonical source of this file is maintained with the - GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. + GNU C Library. Bugs can be reported to bug-glibc@gnu.org. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the diff --git a/gdb/gnu-regex.h b/gdb/gnu-regex.h index 3bdfe7c..42d8015 100644 --- a/gdb/gnu-regex.h +++ b/gdb/gnu-regex.h @@ -4,7 +4,7 @@ Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc. NOTE: The canonical source of this file is maintained with the - GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. + GNU C Library. Bugs can be reported to bug-glibc@gnu.org. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the diff --git a/gdb/inf-loop.c b/gdb/inf-loop.c index 8528512..487aa57 100644 --- a/gdb/inf-loop.c +++ b/gdb/inf-loop.c @@ -25,10 +25,17 @@ #include "event-loop.h" #include "event-top.h" #include "inf-loop.h" +#include "remote.h" static int fetch_inferior_event_wrapper (gdb_client_data client_data); static void complete_execution (void); +void +inferior_event_handler_wrapper (gdb_client_data client_data) +{ + inferior_event_handler (INF_QUIT_REQ, client_data); +} + /* General function to handle events in the inferior. So far it just takes care of detecting errors reported by select() or poll(), otherwise it assumes that all is OK, and goes on reading data from @@ -71,7 +78,13 @@ inferior_event_handler (enum inferior_event_type event_type, complete_execution (); break; - case INF_QUIT_REQ: + case INF_QUIT_REQ: + /* FIXME: ezannoni 1999-10-04. This call should really be a + target vector entry, so that it can be used for any kind of + targets. */ + async_remote_interrupt_twice (NULL); + break; + case INF_TIMER: default: printf_unfiltered ("Event type not recognized.\n"); diff --git a/gdb/inf-loop.h b/gdb/inf-loop.h index dde9045..9f1713c 100644 --- a/gdb/inf-loop.h +++ b/gdb/inf-loop.h @@ -24,5 +24,6 @@ extern void inferior_event_handler (enum inferior_event_type event_type, void* client_data); +extern void inferior_event_handler_wrapper (void *client_data); #endif /* #ifndef INF_LOOP_H */ diff --git a/gdb/irix5-nat.c b/gdb/irix5-nat.c index 00c593e..7ff0c44 100644 --- a/gdb/irix5-nat.c +++ b/gdb/irix5-nat.c @@ -854,8 +854,7 @@ symbol_add_stub (arg) section_addrs.text_addr = text_addr; so->objfile = symbol_file_add (so->so_name, so->from_tty, - §ion_addrs, - 0, 0, 0, 0); + §ion_addrs, 0, 0); return (1); } diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index 1dd4d4d..dd323b2 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -73,7 +73,7 @@ get_dynamics_objfile () { if (dynamics_objfile == NULL) { - dynamics_objfile = allocate_objfile (NULL, 0, 0, 0); + dynamics_objfile = allocate_objfile (NULL, 0); } return dynamics_objfile; } @@ -714,6 +714,6 @@ Options:\n\n\ fputs_unfiltered ("\n\ For more information, type \"help\" from within GDB, or consult the\n\ GDB manual (available as on-line info or a printed manual).\n\ -Report bugs to \"bug-gdb@prep.ai.mit.edu\".\ +Report bugs to \"bug-gdb@gnu.org\".\ ", stream); } diff --git a/gdb/monitor.c b/gdb/monitor.c index 1ef041d..c9c6d5a 100644 --- a/gdb/monitor.c +++ b/gdb/monitor.c @@ -65,8 +65,8 @@ static int readchar PARAMS ((int timeout)); static void monitor_fetch_register PARAMS ((int regno)); static void monitor_store_register PARAMS ((int regno)); -static int monitor_printable_string PARAMS ((char *newstr, char *oldstr)); -static void monitor_error PARAMS ((char *format, CORE_ADDR memaddr, int len, char *string, int final_char)); +static void monitor_printable_string (char *newstr, char *oldstr, int len); +static void monitor_error (char *function, char *message, CORE_ADDR memaddr, int len, char *string, int final_char); static void monitor_detach PARAMS ((char *args, int from_tty)); static void monitor_resume PARAMS ((int pid, int step, enum target_signal sig)); static void monitor_interrupt PARAMS ((int signo)); @@ -116,12 +116,6 @@ static void (*ofunc) (); /* Old SIGINT signal handler */ static CORE_ADDR *breakaddr; -/* Extra remote debugging for developing a new rom monitor variation */ -#if ! defined(EXTRA_RDEBUG) -#define EXTRA_RDEBUG 0 -#endif -#define RDEBUG(stuff) { if (EXTRA_RDEBUG && remote_debug) printf stuff ; } - /* Descriptor for I/O to remote machine. Initialize it to NULL so that monitor_open knows that we don't have a file open when the program starts. */ @@ -145,19 +139,46 @@ static int first_time = 0; /* is this the first time we're executing after #define TARGET_BUF_SIZE 2048 -/* Convert a string into a printable representation, Return # byte in the - new string. */ +/* Monitor specific debugging information. Typically only useful to + the developer of a new monitor interface. */ -static int -monitor_printable_string (newstr, oldstr) - char *newstr; - char *oldstr; +static void monitor_debug (const char *fmt, ...) ATTR_FORMAT(printf, 1, 2); + +static int monitor_debug_p = 0; + +/* NOTE: This file alternates between monitor_debug_p and remote_debug + when determining if debug information is printed. Perhaphs this + could be simplified. */ + +static void +monitor_debug (const char *fmt, ...) +{ + if (monitor_debug_p) + { + va_list args; + va_start (args, fmt); + vfprintf_filtered (gdb_stdlog, fmt, args); + va_end (args); + } +} + + +/* Convert a string into a printable representation, Return # byte in + the new string. When LEN is >0 it specifies the size of the + string. Otherwize strlen(oldstr) is used. */ + +static void +monitor_printable_string (char *newstr, char *oldstr, int len) { - char *save = newstr; int ch; + int i; + + if (len <= 0) + len = strlen (oldstr); - while ((ch = *oldstr++) != '\0') + for (i = 0; i < len; i++) { + ch = oldstr[i]; switch (ch) { default: @@ -203,29 +224,23 @@ monitor_printable_string (newstr, oldstr) } *newstr++ = '\0'; - return newstr - save; } /* Print monitor errors with a string, converting the string to printable representation. */ static void -monitor_error (format, memaddr, len, string, final_char) - char *format; - CORE_ADDR memaddr; - int len; - char *string; - int final_char; +monitor_error (char *function, char *message, + CORE_ADDR memaddr, int len, char *string, int final_char) { int real_len = (len == 0 && string != (char *) 0) ? strlen (string) : len; char *safe_string = alloca ((real_len * 4) + 1); - char *p; - int safe_len = monitor_printable_string (safe_string, string); + monitor_printable_string (safe_string, string, real_len); if (final_char) - error (format, (int) memaddr, p - safe_string, safe_string, final_char); + error ("%s (0x%s): %s: %s%c", function, paddr_nz (memaddr), message, safe_string, final_char); else - error (format, (int) memaddr, p - safe_string, safe_string); + error ("%s (0x%s): %s: %s", function, paddr_nz (memaddr), message, safe_string); } /* Convert hex digit A to a number. */ @@ -330,16 +345,11 @@ monitor_printf_noecho (char *pattern,...) if (len + 1 > sizeof sndbuf) abort (); -#if 0 - if (remote_debug > 0) - puts_debug ("sent -->", sndbuf, "<--"); -#endif - if (EXTRA_RDEBUG - && remote_debug) + if (monitor_debug_p) { char *safe_string = (char *) alloca ((strlen (sndbuf) * 4) + 1); - monitor_printable_string (safe_string, sndbuf); - printf ("sent[%s]\n", safe_string); + monitor_printable_string (safe_string, sndbuf, 0); + fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string); } monitor_write (sndbuf, len); @@ -363,16 +373,11 @@ monitor_printf (char *pattern,...) if (len + 1 > sizeof sndbuf) abort (); -#if 0 - if (remote_debug > 0) - puts_debug ("sent -->", sndbuf, "<--"); -#endif - if (EXTRA_RDEBUG - && remote_debug) + if (monitor_debug_p) { char *safe_string = (char *) alloca ((len * 4) + 1); - monitor_printable_string (safe_string, sndbuf); - printf ("sent[%s]\n", safe_string); + monitor_printable_string (safe_string, sndbuf, 0); + fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string); } monitor_write (sndbuf, len); @@ -381,8 +386,8 @@ monitor_printf (char *pattern,...) just output, but sometimes some extra junk appeared before the characters we expected, like an extra prompt, or a portmaster sending telnet negotiations. So, just start searching for what we sent, and skip anything unknown. */ - RDEBUG (("ExpectEcho\n")) - monitor_expect (sndbuf, (char *) 0, 0); + monitor_debug ("ExpectEcho\n"); + monitor_expect (sndbuf, (char *) 0, 0); } @@ -454,7 +459,7 @@ readchar (timeout) c &= 0x7f; /* This seems to interfere with proper function of the input stream */ - if (remote_debug > 0) + if (monitor_debug_p || remote_debug) { char buf[2]; buf[0] = c; @@ -522,12 +527,11 @@ monitor_expect (string, buf, buflen) int c; extern struct target_ops *targ_ops; - if (EXTRA_RDEBUG - && remote_debug) + if (monitor_debug_p) { char *safe_string = (char *) alloca ((strlen (string) * 4) + 1); - monitor_printable_string (safe_string, string); - printf ("MON Expecting '%s'\n", safe_string); + monitor_printable_string (safe_string, string, 0); + fprintf_unfiltered (gdb_stdlog, "MON Expecting '%s'\n", safe_string); } immediate_quit = 1; @@ -628,7 +632,7 @@ monitor_expect_regexp (pat, buf, buflen) { char *mybuf; char *p; - RDEBUG (("MON Expecting regexp\n")); + monitor_debug ("MON Expecting regexp\n"); if (buf) mybuf = buf; else @@ -679,8 +683,8 @@ monitor_expect_prompt (buf, buflen) char *buf; int buflen; { - RDEBUG (("MON Expecting prompt\n")) - return monitor_expect (current_monitor->prompt, buf, buflen); + monitor_debug ("MON Expecting prompt\n"); + return monitor_expect (current_monitor->prompt, buf, buflen); } /* Get N 32-bit words from remote, each preceded by a space, and put @@ -808,7 +812,7 @@ monitor_open (args, mon_ops, from_tty) monitor_stop (); if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0) { - RDEBUG (("EXP Open echo\n")); + monitor_debug ("EXP Open echo\n"); monitor_expect_prompt (NULL, 0); } } @@ -930,7 +934,7 @@ monitor_supply_register (regno, valstr) val <<= 4; val += fromhex (*p++); } - RDEBUG (("Supplying Register %d %s\n", regno, valstr)); + monitor_debug ("Supplying Register %d %s\n", regno, valstr); if (*p != '\0') error ("monitor_supply_register (%d): bad value from monitor: %s.", @@ -959,7 +963,7 @@ monitor_resume (pid, step, sig) enum target_signal sig; { /* Some monitors require a different command when starting a program */ - RDEBUG (("MON resume\n")); + monitor_debug ("MON resume\n"); if (current_monitor->flags & MO_RUN_FIRST_TIME && first_time == 1) { first_time = 0; @@ -992,8 +996,8 @@ parse_register_dump (buf, len) char *buf; int len; { - RDEBUG (("MON Parsing register dump\n")) - while (1) + monitor_debug ("MON Parsing register dump\n"); + while (1) { int regnamelen, vallen; char *regname, *val; @@ -1029,8 +1033,8 @@ monitor_interrupt (signo) /* If this doesn't work, try more severe steps. */ signal (signo, monitor_interrupt_twice); - if (remote_debug) - printf_unfiltered ("monitor_interrupt called\n"); + if (monitor_debug_p || remote_debug) + fprintf_unfiltered (gdb_stdlog, "monitor_interrupt called\n"); target_stop (); } @@ -1096,8 +1100,8 @@ monitor_wait_filter (char *buf, /* Print any output characters that were preceded by ^O. */ /* FIXME - This would be great as a user settabgle flag */ - if (remote_debug || - current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT) + if (monitor_debug_p || remote_debug + || current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT) { int i; @@ -1126,14 +1130,14 @@ monitor_wait (pid, status) status->value.integer = 0; old_chain = make_cleanup (monitor_wait_cleanup, &old_timeout); - RDEBUG (("MON wait\n")) + monitor_debug ("MON wait\n"); #if 0 /* This is somthing other than a maintenance command */ in_monitor_wait = 1; timeout = watchdog > 0 ? watchdog : -1; #else - timeout = -1; /* Don't time out -- user program is running. */ + timeout = -1; /* Don't time out -- user program is running. */ #endif ofunc = (void (*)()) signal (SIGINT, monitor_interrupt); @@ -1155,8 +1159,8 @@ monitor_wait (pid, status) /* Print any output characters that were preceded by ^O. */ /* FIXME - This would be great as a user settabgle flag */ - if (remote_debug || - current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT) + if (monitor_debug_p || remote_debug + || current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT) { int i; @@ -1180,7 +1184,7 @@ monitor_wait (pid, status) if (current_monitor->register_pattern) parse_register_dump (buf, resp_len); #else - RDEBUG (("Wait fetching registers after stop\n")); + monitor_debug ("Wait fetching registers after stop\n"); monitor_dump_regs (); #endif @@ -1208,12 +1212,12 @@ monitor_fetch_register (regno) int i; name = current_monitor->regnames[regno]; - RDEBUG (("MON fetchreg %d '%s'\n", regno, name ? name : "(null name)")) + monitor_debug ("MON fetchreg %d '%s'\n", regno, name ? name : "(null name)"); - if (!name || (*name == '\0')) + if (!name || (*name == '\0')) { - RDEBUG (("No register known for %d\n", regno)) - supply_register (regno, zerobuf); + monitor_debug ("No register known for %d\n", regno); + supply_register (regno, zerobuf); return; } @@ -1227,13 +1231,13 @@ monitor_fetch_register (regno) if (current_monitor->getreg.resp_delim) { - RDEBUG (("EXP getreg.resp_delim\n")) - monitor_expect (current_monitor->getreg.resp_delim, NULL, 0); + monitor_debug ("EXP getreg.resp_delim\n"); + monitor_expect (current_monitor->getreg.resp_delim, NULL, 0); /* Handle case of first 32 registers listed in pairs. */ if (current_monitor->flags & MO_32_REGS_PAIRED && (regno & 1) != 0 && regno < 32) { - RDEBUG (("EXP getreg.resp_delim\n")); + monitor_debug ("EXP getreg.resp_delim\n"); monitor_expect (current_monitor->getreg.resp_delim, NULL, 0); } } @@ -1270,7 +1274,7 @@ monitor_fetch_register (regno) } regbuf[i] = '\000'; /* terminate the number */ - RDEBUG (("REGVAL '%s'\n", regbuf)); + monitor_debug ("REGVAL '%s'\n", regbuf); /* If TERM is present, we wait for that to show up. Also, (if TERM is present), we will send TERM_CMD if that is present. In any @@ -1279,14 +1283,14 @@ monitor_fetch_register (regno) if (current_monitor->getreg.term) { - RDEBUG (("EXP getreg.term\n")) - monitor_expect (current_monitor->getreg.term, NULL, 0); /* get response */ + monitor_debug ("EXP getreg.term\n"); + monitor_expect (current_monitor->getreg.term, NULL, 0); /* get response */ } if (current_monitor->getreg.term_cmd) { - RDEBUG (("EMIT getreg.term.cmd\n")) - monitor_printf (current_monitor->getreg.term_cmd); + monitor_debug ("EMIT getreg.term.cmd\n"); + monitor_printf (current_monitor->getreg.term_cmd); } if (!current_monitor->getreg.term || /* Already expected or */ current_monitor->getreg.term_cmd) /* ack expected */ @@ -1335,7 +1339,7 @@ static void monitor_fetch_registers (regno) int regno; { - RDEBUG (("MON fetchregs\n")); + monitor_debug ("MON fetchregs\n"); if (current_monitor->getreg.cmd) { if (regno >= 0) @@ -1365,16 +1369,16 @@ monitor_store_register (regno) name = current_monitor->regnames[regno]; if (!name || (*name == '\0')) { - RDEBUG (("MON Cannot store unknown register\n")) - return; + monitor_debug ("MON Cannot store unknown register\n"); + return; } val = read_register (regno); - RDEBUG (("MON storeg %d %08lx\n", regno, (ULONGEST) val)) + monitor_debug ("MON storeg %d %s\n", regno, preg (val)); /* send the register deposit command */ - if (current_monitor->flags & MO_REGISTER_VALUE_FIRST) + if (current_monitor->flags & MO_REGISTER_VALUE_FIRST) monitor_printf (current_monitor->setreg.cmd, val, name); else if (current_monitor->flags & MO_SETREG_INTERACTIVE) monitor_printf (current_monitor->setreg.cmd, name); @@ -1383,17 +1387,17 @@ monitor_store_register (regno) if (current_monitor->setreg.term) { - RDEBUG (("EXP setreg.term\n")) - monitor_expect (current_monitor->setreg.term, NULL, 0); + monitor_debug ("EXP setreg.term\n"); + monitor_expect (current_monitor->setreg.term, NULL, 0); if (current_monitor->flags & MO_SETREG_INTERACTIVE) - monitor_printf ("%A\r", val); + monitor_printf ("%s\r", paddr_nz (val)); monitor_expect_prompt (NULL, 0); } else monitor_expect_prompt (NULL, 0); if (current_monitor->setreg.term_cmd) /* Mode exit required */ { - RDEBUG (("EXP setreg_termcmd\n")); + monitor_debug ("EXP setreg_termcmd\n"); monitor_printf ("%s", current_monitor->setreg.term_cmd); monitor_expect_prompt (NULL, 0); } @@ -1444,9 +1448,9 @@ monitor_write_memory (memaddr, myaddr, len) char *cmd; int i; - RDEBUG (("MON write %d %08x\n", len, (unsigned long) memaddr)) + monitor_debug ("MON write %d %s\n", len, paddr (memaddr)); - if (current_monitor->flags & MO_ADDR_BITS_REMOVE) + if (current_monitor->flags & MO_ADDR_BITS_REMOVE) memaddr = ADDR_BITS_REMOVE (memaddr); /* Use memory fill command for leading 0 bytes. */ @@ -1459,8 +1463,8 @@ monitor_write_memory (memaddr, myaddr, len) if (i > 4) /* More than 4 zeros is worth doing */ { - RDEBUG (("MON FILL %d\n", i)) - if (current_monitor->flags & MO_FILL_USES_ADDR) + monitor_debug ("MON FILL %d\n", i); + if (current_monitor->flags & MO_FILL_USES_ADDR) monitor_printf (current_monitor->fill, memaddr, (memaddr + i) - 1, 0); else monitor_printf (current_monitor->fill, memaddr, i, 0); @@ -1501,7 +1505,7 @@ monitor_write_memory (memaddr, myaddr, len) if (len == 4) { hostval = *(unsigned int *) myaddr; - RDEBUG (("Hostval(%08x) val(%08x)\n", hostval, val)); + monitor_debug ("Hostval(%08x) val(%08x)\n", hostval, val); } @@ -1514,7 +1518,7 @@ monitor_write_memory (memaddr, myaddr, len) if (current_monitor->setmem.term) { - RDEBUG (("EXP setmem.term")); + monitor_debug ("EXP setmem.term"); monitor_expect (current_monitor->setmem.term, NULL, 0); monitor_printf ("%x\r", val); } @@ -1552,9 +1556,9 @@ monitor_write_even_block (memaddr, myaddr, len) myaddr += 4; memaddr += 4; written += 4; - RDEBUG ((" @ %08x\n", memaddr)) + monitor_debug (" @ %s\n", paddr (memaddr)); /* If we wanted to, here we could validate the address */ - monitor_expect_prompt (NULL, 0); + monitor_expect_prompt (NULL, 0); } /* Now exit the sub mode */ monitor_printf (current_monitor->getreg.term_cmd); @@ -1754,7 +1758,7 @@ monitor_read_memory_single (memaddr, myaddr, len) char *cmd; int i; - RDEBUG (("MON read single\n")); + monitor_debug ("MON read single\n"); #if 0 /* Can't actually use long longs (nice idea, though). In fact, the call to strtoul below will fail if it tries to convert a value @@ -1792,7 +1796,7 @@ monitor_read_memory_single (memaddr, myaddr, len) if (current_monitor->getmem.resp_delim) { - RDEBUG (("EXP getmem.resp_delim\n")); + monitor_debug ("EXP getmem.resp_delim\n"); monitor_expect_regexp (&getmem_resp_delim_pattern, NULL, 0); } @@ -1810,7 +1814,8 @@ monitor_read_memory_single (memaddr, myaddr, len) if ((c == '0') && ((c = readchar (timeout)) == 'x')) ; else - monitor_error ("monitor_read_memory_single (0x%x): bad response from monitor: %.*s%c.", + monitor_error ("monitor_read_memory_single", + "bad response from monitor", memaddr, i, membuf, c); } for (i = 0; i < len * 2; i++) @@ -1825,7 +1830,8 @@ monitor_read_memory_single (memaddr, myaddr, len) if (c == ' ') continue; - monitor_error ("monitor_read_memory_single (0x%x): bad response from monitor: %.*s%c.", + monitor_error ("monitor_read_memory_single", + "bad response from monitor", memaddr, i, membuf, c); } @@ -1855,7 +1861,8 @@ monitor_read_memory_single (memaddr, myaddr, len) val = strtoul (membuf, &p, 16); if (val == 0 && membuf == p) - monitor_error ("monitor_read_memory_single (0x%x): bad value from monitor: %s.", + monitor_error ("monitor_read_memory_single", + "bad value from monitor", memaddr, 0, membuf, 0); /* supply register stores in target byte order, so swap here */ @@ -1884,13 +1891,12 @@ monitor_read_memory (memaddr, myaddr, len) if (len <= 0) { - RDEBUG (("Zero length call to monitor_read_memory\n")); + monitor_debug ("Zero length call to monitor_read_memory\n"); return 0; } - if (remote_debug) - printf ("MON read block ta(%08x) ha(%08x) %d\n", - (unsigned long) memaddr, (unsigned long) myaddr, len); + monitor_debug ("MON read block ta(%s) ha(%lx) %d\n", + paddr_nz (memaddr), (long) myaddr, len); if (current_monitor->flags & MO_ADDR_BITS_REMOVE) memaddr = ADDR_BITS_REMOVE (memaddr); @@ -1931,7 +1937,8 @@ monitor_read_memory (memaddr, myaddr, len) resp_len = monitor_expect (current_monitor->getmem.term, buf, sizeof buf); /* get response */ if (resp_len <= 0) - monitor_error ("monitor_read_memory (0x%x): excessive response from monitor: %.*s.", + monitor_error ("monitor_read_memory", + "excessive response from monitor", memaddr, resp_len, buf, 0); if (current_monitor->getmem.term_cmd) @@ -1954,7 +1961,7 @@ monitor_read_memory (memaddr, myaddr, len) { int retval, tmp; struct re_registers resp_strings; - RDEBUG (("MON getmem.resp_delim %s\n", current_monitor->getmem.resp_delim)); + monitor_debug ("MON getmem.resp_delim %s\n", current_monitor->getmem.resp_delim); memset (&resp_strings, 0, sizeof (struct re_registers)); tmp = strlen (p); @@ -1962,20 +1969,21 @@ monitor_read_memory (memaddr, myaddr, len) &resp_strings); if (retval < 0) - monitor_error ("monitor_read_memory (0x%x): bad response from monitor: %.*s.", + monitor_error ("monitor_read_memory", + "bad response from monitor", memaddr, resp_len, buf, 0); p += resp_strings.end[0]; #if 0 p = strstr (p, current_monitor->getmem.resp_delim); if (!p) - monitor_error ("monitor_read_memory (0x%x): bad response from monitor: %.*s.", + monitor_error ("monitor_read_memory", + "bad response from monitor", memaddr, resp_len, buf, 0); p += strlen (current_monitor->getmem.resp_delim); #endif } - if (remote_debug) - printf ("MON scanning %d ,%08x '%s'\n", len, p, p); + monitor_debug ("MON scanning %d ,%lx '%s'\n", len, (long) p, p); if (current_monitor->flags & MO_GETMEM_16_BOUNDARY) { char c; @@ -1992,8 +2000,8 @@ monitor_read_memory (memaddr, myaddr, len) { val = fromhex (c) * 16 + fromhex (*(p + 1)); *myaddr++ = val; - if (remote_debug) - printf ("[%02x]", val); + if (monitor_debug_p || remote_debug) + fprintf_unfiltered (gdb_stdlog, "[%02x]", val); --i; fetched++; } @@ -2005,11 +2013,11 @@ monitor_read_memory (memaddr, myaddr, len) } if (fetched == 0) error ("Failed to read via monitor"); - if (remote_debug) - printf ("\n"); + if (monitor_debug_p || remote_debug) + fprintf_unfiltered (gdb_stdlog, "\n"); return fetched; /* Return the number of bytes actually read */ } - RDEBUG (("MON scanning bytes\n")); + monitor_debug ("MON scanning bytes\n"); for (i = len; i > 0; i--) { @@ -2021,7 +2029,8 @@ monitor_read_memory (memaddr, myaddr, len) break; if (*p == '\000' || *p == '\n' || *p == '\r') - monitor_error ("monitor_read_memory (0x%x): badly terminated response from monitor: %.*s", + monitor_error ("monitor_read_memory", + "badly terminated response from monitor", memaddr, resp_len, buf, 0); p++; } @@ -2029,7 +2038,8 @@ monitor_read_memory (memaddr, myaddr, len) val = strtoul (p, &p1, 16); if (val == 0 && p == p1) - monitor_error ("monitor_read_memory (0x%x): bad value from monitor: %.*s.", + monitor_error ("monitor_read_memory", + "bad value from monitor", memaddr, resp_len, buf, 0); *myaddr++ = val; @@ -2100,8 +2110,8 @@ monitor_insert_breakpoint (addr, shadow) unsigned char *bp; int bplen; - RDEBUG (("MON inst bkpt %08x\n", addr)) - if (current_monitor->set_break == NULL) + monitor_debug ("MON inst bkpt %s\n", paddr (addr)); + if (current_monitor->set_break == NULL) error ("No set_break defined for this monitor"); if (current_monitor->flags & MO_ADDR_BITS_REMOVE) @@ -2134,8 +2144,8 @@ monitor_remove_breakpoint (addr, shadow) { int i; - RDEBUG (("MON rmbkpt %08x\n", addr)) - if (current_monitor->clr_break == NULL) + monitor_debug ("MON rmbkpt %s\n", paddr (addr)); + if (current_monitor->clr_break == NULL) error ("No clr_break defined for this monitor"); if (current_monitor->flags & MO_ADDR_BITS_REMOVE) @@ -2158,7 +2168,8 @@ monitor_remove_breakpoint (addr, shadow) } } fprintf_unfiltered (gdb_stderr, - "Can't find breakpoint associated with 0x%x\n", addr); + "Can't find breakpoint associated with 0x%s\n", + paddr_nz (addr)); return 1; } @@ -2197,9 +2208,9 @@ monitor_load (file, from_tty) int from_tty; { dcache_flush (remote_dcache); - RDEBUG (("MON load\n")) + monitor_debug ("MON load\n"); - if (current_monitor->load_routine) + if (current_monitor->load_routine) current_monitor->load_routine (monitor_desc, file, hashmark); else { /* The default is ascii S-records */ @@ -2245,7 +2256,7 @@ monitor_load (file, from_tty) static void monitor_stop () { - RDEBUG (("MON stop\n")); + monitor_debug ("MON stop\n"); if ((current_monitor->flags & MO_SEND_BREAK_ON_STOP) != 0) SERIAL_SEND_BREAK (monitor_desc); if (current_monitor->stop) @@ -2398,4 +2409,16 @@ _initialize_remote_monitors () When enabled, a hashmark \'#\' is displayed.", &setlist), &showlist); + +#if 0 + /* FIXME: cagney/1999-10-07: Wait until there is a generic ``set + debug ...'' rather than another ``set ...debug'' command. */ + add_show_from_set + (add_set_cmd ("monitordebug", no_class, var_zinteger, + (char *) &monitor_debug_p, + "Set debugging of remote monitor communication.\n\ +When enabled, communication between GDB and the remote monitor\n\ +is displayed.", &setlist), + &showlist); +#endif } diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 253739c..1cdb175 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -46,7 +46,7 @@ static int open_existing_mapped_file PARAMS ((char *, long, int)); static int -open_mapped_file PARAMS ((char *filename, long mtime, int mapped)); +open_mapped_file PARAMS ((char *filename, long mtime, int flags)); static PTR map_to_file PARAMS ((int)); @@ -140,29 +140,27 @@ build_objfile_section_table (objfile) return (0); } -/* Given a pointer to an initialized bfd (ABFD) and a flag that indicates - whether or not an objfile is to be mapped (MAPPED), allocate a new objfile - struct, fill it in as best we can, link it into the list of all known - objfiles, and return a pointer to the new objfile struct. +/* Given a pointer to an initialized bfd (ABFD) and some flag bits + allocate a new objfile struct, fill it in as best we can, link it + into the list of all known objfiles, and return a pointer to the + new objfile struct. - USER_LOADED is simply recorded in the objfile. This record offers a way for - run_command to remove old objfile entries which are no longer valid (i.e., - are associated with an old inferior), but to preserve ones that the user - explicitly loaded via the add-symbol-file command. - - IS_SOLIB is also simply recorded in the objfile. */ + The FLAGS word contains various bits (OBJF_*) that can be taken as + requests for specific operations, like trying to open a mapped + version of the objfile (OBJF_MAPPED). Other bits like + OBJF_SHARED are simply copied through to the new objfile flags + member. */ struct objfile * -allocate_objfile (abfd, mapped, user_loaded, is_solib) +allocate_objfile (abfd, flags) bfd *abfd; - int mapped; - int user_loaded; - int is_solib; + int flags; { struct objfile *objfile = NULL; struct objfile *last_one = NULL; - mapped |= mapped_symbol_files; + if (mapped_symbol_files) + flags |= OBJF_MAPPED; #if defined(USE_MMALLOC) && defined(HAVE_MMAP) if (abfd != NULL) @@ -181,7 +179,7 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib) int fd; fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd), - mapped); + flags); if (fd >= 0) { PTR md; @@ -241,15 +239,16 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib) } } - if (mapped && (objfile == NULL)) + if ((flags & OBJF_MAPPED) && (objfile == NULL)) { warning ("symbol table for '%s' will not be mapped", bfd_get_filename (abfd)); + flags &= ~OBJF_MAPPED; } } #else /* !defined(USE_MMALLOC) || !defined(HAVE_MMAP) */ - if (mapped) + if (flags & OBJF_MAPPED) { warning ("mapped symbol tables are not supported on this machine; missing or broken mmap()."); @@ -258,6 +257,7 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib) "mapped" keyword again. */ mapped_symbol_files = 0; + flags &= ~OBJF_MAPPED; } #endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */ @@ -279,6 +279,7 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib) free); obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc, free); + flags &= ~OBJF_MAPPED; } /* Update the per-objfile information that comes from the bfd, ensuring @@ -317,13 +318,8 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib) last_one->next = objfile; } - /* Record whether this objfile was created because the user explicitly - caused it (e.g., used the add-symbol-file command). - */ - objfile->user_loaded = user_loaded; - - /* Record whether this objfile definitely represents a solib. */ - objfile->is_solib = is_solib; + /* Save passed in flag bits. */ + objfile->flags |= flags; return (objfile); } @@ -751,7 +747,7 @@ objfile_purge_solibs () /* We assume that the solib package has been purged already, or will be soon. */ - if (!objf->user_loaded && objf->is_solib) + if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED)) free_objfile (objf); } } @@ -798,10 +794,10 @@ have_minimal_symbols () Otherwise, returns the open file descriptor. */ static int -open_existing_mapped_file (symsfilename, mtime, mapped) +open_existing_mapped_file (symsfilename, mtime, flags) char *symsfilename; long mtime; - int mapped; + int flags; { int fd = -1; struct stat sbuf; @@ -810,7 +806,7 @@ open_existing_mapped_file (symsfilename, mtime, mapped) { if (sbuf.st_mtime < mtime) { - if (!mapped) + if (!(flags & OBJF_MAPPED)) { warning ("mapped symbol file `%s' is out of date, ignored it", symsfilename); @@ -853,10 +849,10 @@ open_existing_mapped_file (symsfilename, mtime, mapped) /bin for example). */ static int -open_mapped_file (filename, mtime, mapped) +open_mapped_file (filename, mtime, flags) char *filename; long mtime; - int mapped; + int flags; { int fd; char *symsfilename; @@ -865,7 +861,7 @@ open_mapped_file (filename, mtime, mapped) then try the directory where the symbol file is located. */ symsfilename = concat ("./", basename (filename), ".syms", (char *) NULL); - if ((fd = open_existing_mapped_file (symsfilename, mtime, mapped)) < 0) + if ((fd = open_existing_mapped_file (symsfilename, mtime, flags)) < 0) { free (symsfilename); symsfilename = concat (filename, ".syms", (char *) NULL); diff --git a/gdb/objfiles.h b/gdb/objfiles.h index ed0b5c8..f2c2178 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -232,22 +232,6 @@ struct objfile char *name; - /* TRUE if this objfile was created because the user explicitly caused - it (e.g., used the add-symbol-file command). - */ - int user_loaded; - - /* TRUE if this objfile was explicitly created to represent a solib. - - (If FALSE, the objfile may actually be a solib. This can happen if - the user created the objfile by using the add-symbol-file command. - GDB doesn't in that situation actually check whether the file is a - solib. Rather, the target's implementation of the solib interface - is responsible for setting this flag when noticing solibs used by - an inferior.) - */ - int is_solib; - /* Some flag bits for this objfile. */ unsigned short flags; @@ -430,8 +414,13 @@ struct objfile #define OBJF_REORDERED (1 << 2) /* Functions are reordered */ -/* Distinguish between an objfile for a shared library and a - "vanilla" objfile. */ +/* Distinguish between an objfile for a shared library and a "vanilla" + objfile. (If not set, the objfile may still actually be a solib. + This can happen if the user created the objfile by using the + add-symbol-file command. GDB doesn't in that situation actually + check whether the file is a solib. Rather, the target's + implementation of the solib interface is responsible for setting + this flag when noticing solibs used by an inferior.) */ #define OBJF_SHARED (1 << 3) /* From a shared library */ @@ -439,6 +428,15 @@ struct objfile #define OBJF_READNOW (1 << 4) /* Immediate full read */ +/* This objfile was created because the user explicitly caused it + (e.g., used the add-symbol-file command). This bit offers a way + for run_command to remove old objfile entries which are no longer + valid (i.e., are associated with an old inferior), but to preserve + ones that the user explicitly loaded via the add-symbol-file + command. */ + +#define OBJF_USERLOADED (1 << 5) /* User loaded */ + /* The object file that the main symbol table was loaded from (e.g. the argument to the "symbol-file" or "file" command). */ @@ -472,7 +470,7 @@ extern struct objfile *object_files; /* Declarations for functions defined in objfiles.c */ extern struct objfile * - allocate_objfile PARAMS ((bfd *, int, int, int)); +allocate_objfile PARAMS ((bfd *, int)); extern int build_objfile_section_table PARAMS ((struct objfile *)); diff --git a/gdb/osfsolib.c b/gdb/osfsolib.c index b9fba61..2c49804 100644 --- a/gdb/osfsolib.c +++ b/gdb/osfsolib.c @@ -600,8 +600,7 @@ symbol_add_stub (arg) section_addrs.text_addr = text_addr; so->objfile = symbol_file_add (so->so_name, so->from_tty, - §ion_addrs, - 0, 0, 0, 1); + §ion_addrs, 0, OBJF_SHARED); return (1); } diff --git a/gdb/pa64solib.c b/gdb/pa64solib.c index b428d8a..e281e6a 100644 --- a/gdb/pa64solib.c +++ b/gdb/pa64solib.c @@ -273,7 +273,7 @@ pa64_solib_add_solib_objfile (so, name, from_tty, text_addr) /* Now let the generic code load up symbols for this library. */ section_addrs.text_addr = text_addr; - so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, 0, 0, 1); + so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, OBJF_SHARED); so->abfd = so->objfile->obfd; /* Mark this as a shared library and save private data. */ diff --git a/gdb/parse.c b/gdb/parse.c index b178465..271e202 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -44,6 +44,21 @@ #include "gdbcmd.h" #include "symfile.h" /* for overlay functions */ +/* Symbols which architectures can redefine. */ + +/* Some systems have routines whose names start with `$'. Giving this + macro a non-zero value tells GDB's expression parser to check for + such routines when parsing tokens that begin with `$'. + + On HP-UX, certain system routines (millicode) have names beginning + with `$' or `$$'. For example, `$$dyncall' is a millicode routine + that handles inter-space procedure calls on PA-RISC. */ +#ifndef SYMBOLS_CAN_START_WITH_DOLLAR +#define SYMBOLS_CAN_START_WITH_DOLLAR (0) +#endif + + + /* Global variables declared in parser-defs.h (and commented there). */ struct expression *expout; int expout_size; @@ -460,9 +475,6 @@ write_dollar_variable (str) /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1) and $$digits (equivalent to $<-digits> if you could type that). */ - struct symbol *sym = NULL; - struct minimal_symbol *msym = NULL; - int negate = 0; int i = 1; /* Double dollar means negate the number and add -1 as well. @@ -496,27 +508,36 @@ write_dollar_variable (str) if (i >= 0) goto handle_register; - /* On HP-UX, certain system routines (millicode) have names beginning - with $ or $$, e.g. $$dyncall, which handles inter-space procedure - calls on PA-RISC. Check for those, first. */ - - sym = lookup_symbol (copy_name (str), (struct block *) NULL, - VAR_NAMESPACE, (int *) NULL, (struct symtab **) NULL); - if (sym) + if (SYMBOLS_CAN_START_WITH_DOLLAR) { - write_exp_elt_opcode (OP_VAR_VALUE); - write_exp_elt_block (block_found); /* set by lookup_symbol */ - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); - return; - } - msym = lookup_minimal_symbol (copy_name (str), NULL, NULL); - if (msym) - { - write_exp_msymbol (msym, - lookup_function_type (builtin_type_int), - builtin_type_int); - return; + struct symbol *sym = NULL; + struct minimal_symbol *msym = NULL; + + /* On HP-UX, certain system routines (millicode) have names beginning + with $ or $$, e.g. $$dyncall, which handles inter-space procedure + calls on PA-RISC. Check for those, first. */ + + /* This code is not enabled on non HP-UX systems, since worst case + symbol table lookup performance is awful, to put it mildly. */ + + sym = lookup_symbol (copy_name (str), (struct block *) NULL, + VAR_NAMESPACE, (int *) NULL, (struct symtab **) NULL); + if (sym) + { + write_exp_elt_opcode (OP_VAR_VALUE); + write_exp_elt_block (block_found); /* set by lookup_symbol */ + write_exp_elt_sym (sym); + write_exp_elt_opcode (OP_VAR_VALUE); + return; + } + msym = lookup_minimal_symbol (copy_name (str), NULL, NULL); + if (msym) + { + write_exp_msymbol (msym, + lookup_function_type (builtin_type_int), + builtin_type_int); + return; + } } /* Any other names starting in $ are debugger internal variables. */ diff --git a/gdb/remote-mm.c b/gdb/remote-mm.c index 1f25640..26a79e2 100644 --- a/gdb/remote-mm.c +++ b/gdb/remote-mm.c @@ -1118,7 +1118,7 @@ mm_load (arg_string, from_tty) /* You may need to do an init_target_mm() */ /* init_target_mm(?,?,?,?,?,?,?,?); */ immediate_quit--; - /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0, 0, 0); */ + /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */ #endif } diff --git a/gdb/remote-udi.c b/gdb/remote-udi.c index 74bebda..4da6153 100644 --- a/gdb/remote-udi.c +++ b/gdb/remote-udi.c @@ -1316,7 +1316,7 @@ udi_load (args, from_tty) /* As a convenience, pick up any symbol info that is in the program being loaded. Note that we assume that the program is the``mainline''; if this is not always true, then this code will need to be augmented. */ - symbol_file_add (strtok (args, " \t"), from_tty, NULL, 1, 0, 0, 0); + symbol_file_add (strtok (args, " \t"), from_tty, NULL, 1, 0); /* Getting new symbols may change our opinion about what is frameless. */ diff --git a/gdb/remote-vx.c b/gdb/remote-vx.c index 1ea0396..7654180 100644 --- a/gdb/remote-vx.c +++ b/gdb/remote-vx.c @@ -701,7 +701,7 @@ vx_add_symbols (name, from_tty, text_addr, data_addr, bss_addr) /* It might be nice to suppress the breakpoint_re_set which happens here because we are going to do one again after the objfile_relocate. */ - objfile = symbol_file_add (name, from_tty, NULL, 0, 0, 0, 0); + objfile = symbol_file_add (name, from_tty, NULL, 0, 0); /* This is a (slightly cheesy) way of superceding the old symbols. A less cheesy way would be to find the objfile with the same name and diff --git a/gdb/remote.c b/gdb/remote.c index 5f1a3ef..aae39be 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -60,7 +60,7 @@ static void initialize_sigint_signal_handler (void); static void handle_remote_sigint PARAMS ((int)); static void handle_remote_sigint_twice PARAMS ((int)); static void async_remote_interrupt PARAMS ((gdb_client_data)); -static void async_remote_interrupt_twice PARAMS ((gdb_client_data)); +void async_remote_interrupt_twice PARAMS ((gdb_client_data)); static void build_remote_gdbarch_data PARAMS ((void)); @@ -166,6 +166,8 @@ static int remote_query PARAMS ((int /*char */ , char *, char *, int *)); static int hexnumstr PARAMS ((char *, ULONGEST)); +static int hexnumnstr PARAMS ((char *, ULONGEST, int)); + static CORE_ADDR remote_address_masked PARAMS ((CORE_ADDR)); static void print_packet PARAMS ((char *)); @@ -2106,7 +2108,7 @@ handle_remote_sigint_twice (sig) { signal (sig, handle_sigint); sigint_remote_twice_token = - create_async_signal_handler (async_remote_interrupt_twice, NULL); + create_async_signal_handler (inferior_event_handler_wrapper, NULL); mark_async_signal_handler_wrapper (sigint_remote_twice_token); } @@ -2124,10 +2126,12 @@ async_remote_interrupt (arg) /* Perform interrupt, if the first attempt did not succeed. Just give up on the target alltogether. */ -static void +void async_remote_interrupt_twice (arg) gdb_client_data arg; { + if (remote_debug) + fprintf_unfiltered (gdb_stdlog, "remote_interrupt_twice called\n"); /* Do something only if the target was not killed by the previous cntl-C. */ if (target_executing) @@ -2962,25 +2966,37 @@ hexnumlen (num) return max (i, 1); } -/* Set BUF to the hex digits representing NUM. */ +/* Set BUF to the minimum number of hex digits representing NUM. */ static int hexnumstr (buf, num) char *buf; ULONGEST num; { - int i; int len = hexnumlen (num); + return hexnumnstr (buf, num, len); +} - buf[len] = '\0'; - for (i = len - 1; i >= 0; i--) +/* Set BUF to the hex digits representing NUM, padded to WIDTH characters. */ + +static int +hexnumnstr (buf, num, width) + char *buf; + ULONGEST num; + int width; +{ + int i; + + buf[width] = '\0'; + + for (i = width - 1; i >= 0; i--) { buf[i] = "0123456789abcdef"[(num & 0xf)]; num >>= 4; } - return len; + return width; } /* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */ @@ -3090,6 +3106,7 @@ remote_write_bytes (memaddr, myaddr, len) while (len > 0) { unsigned char *p, *plen; + int plenlen; int todo; int i; @@ -3115,7 +3132,8 @@ remote_write_bytes (memaddr, myaddr, len) *p++ = ','; plen = p; /* remember where len field goes */ - p += hexnumstr (p, (ULONGEST) todo); + plenlen = hexnumstr (p, (ULONGEST) todo); + p += plenlen; *p++ = ':'; *p = '\0'; @@ -3151,13 +3169,11 @@ remote_write_bytes (memaddr, myaddr, len) { /* Escape chars have filled up the buffer prematurely, and we have actually sent fewer bytes than planned. - Fix-up the length field of the packet. */ - - /* FIXME: will fail if new len is a shorter string than - old len. */ + Fix-up the length field of the packet. Use the same + number of characters as before. */ - plen += hexnumstr (plen, (ULONGEST) i); - *plen++ = ':'; + plen += hexnumnstr (plen, (ULONGEST) i, plenlen); + *plen = ':'; /* overwrite \0 from hexnumnstr() */ } break; } diff --git a/gdb/remote.h b/gdb/remote.h index 3530e89..93fd04a 100644 --- a/gdb/remote.h +++ b/gdb/remote.h @@ -52,4 +52,6 @@ extern void remote_cisco_objfile_relocate (bfd_signed_vma text_off, bfd_signed_vma data_off, bfd_signed_vma bss_off); +extern void async_remote_interrupt_twice (void *arg); + #endif diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index fe44dda..d109f33 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -441,7 +441,7 @@ add_vmap (ldi) objname, bfd_errmsg (bfd_get_error ())); /*NOTREACHED */ } - obj = allocate_objfile (vp->bfd, 0, 0, 0); + obj = allocate_objfile (vp->bfd, 0); vp->objfile = obj; #ifndef SOLIB_SYMBOLS_MANUAL diff --git a/gdb/serial.c b/gdb/serial.c index 99c5a54..2d73226 100644 --- a/gdb/serial.c +++ b/gdb/serial.c @@ -344,6 +344,11 @@ serial_readchar (serial_t scb, int timeout) { int ch; + /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC + code is finished. */ + if (0 && SERIAL_IS_ASYNC_P (scb) && timeout < 0) + internal_error ("serial_readchar: blocking read in async mode"); + ch = scb->ops->readchar (scb, timeout); if (serial_logfp != NULL) { diff --git a/gdb/serial.h b/gdb/serial.h index 11554d7..4b2c1f3 100644 --- a/gdb/serial.h +++ b/gdb/serial.h @@ -54,14 +54,16 @@ extern void serial_un_fdopen (serial_t scb); #define SERIAL_UN_FDOPEN(SERIAL_T) serial_un_fdopen ((SERIAL_T)) /* Read one char from the serial device with TIMEOUT seconds to wait - or -1 to wait forever. Use timeout of 0 to effect a poll. Returns - unsigned char if ok, else one of the following codes. Note that - all error return-codes are guaranteed to be < 0. */ + or -1 to wait forever. Use timeout of 0 to effect a poll. + Infinite waits are not permitted. Returns unsigned char if ok, else + one of the following codes. Note that all error return-codes are + guaranteed to be < 0. */ enum serial_rc { SERIAL_ERROR = -1, /* General error. */ - SERIAL_TIMEOUT = -2, /* Timeout during read. ui_loop_hook() can, - unfortunatly, force this to be returned. */ + SERIAL_TIMEOUT = -2, /* Timeout or data-not-ready during read. + Unfortunatly, through ui_loop_hook(), this + can also be a QUIT indication. */ SERIAL_EOF = -3 /* General end-of-file or remote target connection closed, indication. Includes things like the line dropping dead. */ diff --git a/gdb/solib.c b/gdb/solib.c index e46e63c..bd490de 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -1112,8 +1112,7 @@ symbol_add_stub (arg) section_addrs.text_addr = text_addr; so->objfile = symbol_file_add (so->so_name, so->from_tty, - §ion_addrs, - 0, 0, 0, 1); + §ion_addrs, 0, OBJF_SHARED); return (1); } diff --git a/gdb/somsolib.c b/gdb/somsolib.c index eb0cf06..81a3650 100644 --- a/gdb/somsolib.c +++ b/gdb/somsolib.c @@ -291,7 +291,7 @@ som_solib_add_solib_objfile (so, name, from_tty, text_addr) memset (§ion_addrs, 0, sizeof (section_addrs)); section_addrs.text_addr = text_addr; - so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, 0, 0, 1); + so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, OBJF_SHARED); so->abfd = so->objfile->obfd; /* Mark this as a shared library and save private data. diff --git a/gdb/symfile.c b/gdb/symfile.c index 40105b4..8390b6d 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -820,24 +820,16 @@ new_symfile_objfile (objfile, mainline, verbo) as dynamically loaded code. If !mainline, ADDR is the address where the text segment was loaded. - USER_LOADED is TRUE if the add-symbol-file command was how this - symbol file came to be processed. - - IS_SOLIB is TRUE if this symbol file represents a solib, as discovered - by the target's implementation of the solib package. - Upon success, returns a pointer to the objfile that was added. Upon failure, jumps back to command level (never returns). */ struct objfile * -symbol_file_add (name, from_tty, addrs, mainline, flags, user_loaded, is_solib) +symbol_file_add (name, from_tty, addrs, mainline, flags) char *name; int from_tty; struct section_addr_info *addrs; int mainline; int flags; - int user_loaded; - int is_solib; { struct objfile *objfile; struct partial_symtab *psymtab; @@ -854,7 +846,7 @@ symbol_file_add (name, from_tty, addrs, mainline, flags, user_loaded, is_solib) && !query ("Load new symbol table from \"%s\"? ", name)) error ("Not confirmed."); - objfile = allocate_objfile (abfd, flags & OBJF_MAPPED, user_loaded, is_solib); + objfile = allocate_objfile (abfd, flags); /* If the objfile uses a mapped symbol file, and we have a psymtab for it, then skip reading any symbols at this time. */ @@ -952,7 +944,7 @@ symbol_file_command (args, from_tty) char *name = NULL; CORE_ADDR text_relocation = 0; /* text_relocation */ struct cleanup *cleanups; - int flags = 0; + int flags = OBJF_USERLOADED; dont_repeat (); @@ -1023,8 +1015,7 @@ symbol_file_command (args, from_tty) return; else if (text_relocation == (CORE_ADDR) -1) { - symbol_file_add (name, from_tty, NULL, - 1, flags, 1, 0); + symbol_file_add (name, from_tty, NULL, 1, flags); #ifdef HPUXHPPA RESET_HP_UX_GLOBALS (); #endif @@ -1034,8 +1025,7 @@ symbol_file_command (args, from_tty) struct section_addr_info section_addrs; memset (§ion_addrs, 0, sizeof (section_addrs)); section_addrs.text_addr = (CORE_ADDR) text_relocation; - symbol_file_add (name, from_tty, §ion_addrs, - 0, flags, 1, 0); + symbol_file_add (name, from_tty, §ion_addrs, 0, flags); } /* Getting new symbols may change our opinion about what is @@ -1386,7 +1376,7 @@ add_symbol_file_command (args, from_tty) { char *name = NULL; CORE_ADDR text_addr; - int flags = 0; + int flags = OBJF_USERLOADED; char *arg; int expecting_option = 0; int option_index = 0; @@ -1572,9 +1562,7 @@ add_symbol_file_command (args, from_tty) if (from_tty && (!query ("%s", ""))) error ("Not confirmed."); - symbol_file_add (name, from_tty, §ion_addrs, 0, flags, - 1, /* user_loaded */ - 0); /* We'll guess it's ! is_solib */ + symbol_file_add (name, from_tty, §ion_addrs, 0, flags); /* Getting new symbols may change our opinion about what is frameless. */ diff --git a/gdb/symtab.h b/gdb/symtab.h index 3fb21fc..28d6e8e 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1419,7 +1419,7 @@ extern void clear_solib PARAMS ((void)); extern struct objfile * - symbol_file_add PARAMS ((char *, int, struct section_addr_info *, int, int, int, int)); +symbol_file_add PARAMS ((char *, int, struct section_addr_info *, int, int)); /* source.c */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6c365c7..6fa430c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +Wed Oct 6 12:05:58 1999 Andrew Cagney <cagney@b1.cygnus.com> + + * gdb.base/watchpoint.exp: Match fail ``finish from marker1'' with + a pass case. + 1999-10-01 Kevin Buettner <kevinb@cygnus.com> * gdb.base/break.c (main): Added a statement that we can step diff --git a/gdb/testsuite/gdb.base/watchpoint.exp b/gdb/testsuite/gdb.base/watchpoint.exp index f9fda65..608bebe 100644 --- a/gdb/testsuite/gdb.base/watchpoint.exp +++ b/gdb/testsuite/gdb.base/watchpoint.exp @@ -388,7 +388,9 @@ proc test_stepping {} { send_gdb "finish\n" gdb_expect { - -re "Run.*exit from.*marker1.* at" { } + -re "Run.*exit from.*marker1.* at" { + pass "finish from marker1" + } default { fail "finish from marker1" ; return } } diff --git a/gdb/valops.c b/gdb/valops.c index ea61789..d51b67d 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1061,7 +1061,12 @@ push_bytes (sp, buffer, len) return sp; } -/* Push onto the stack the specified value VALUE. */ +#ifndef PARM_BOUNDARY +#define PARM_BOUNDARY (0) +#endif + +/* Push onto the stack the specified value VALUE. Pad it correctly for + it to be an argument to a function. */ static CORE_ADDR value_push (sp, arg) @@ -1069,18 +1074,31 @@ value_push (sp, arg) value_ptr arg; { register int len = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (arg)); + register int container_len; + register int offset; + + /* How big is the container we're going to put this value in? */ + if (PARM_BOUNDARY) + container_len = ((len + PARM_BOUNDARY / TARGET_CHAR_BIT - 1) + & ~(PARM_BOUNDARY / TARGET_CHAR_BIT - 1)); + + /* Are we going to put it at the high or low end of the container? */ + if (TARGET_BYTE_ORDER == BIG_ENDIAN) + offset = container_len - len; + else + offset = 0; if (INNER_THAN (1, 2)) { /* stack grows downward */ - sp -= len; - write_memory (sp, VALUE_CONTENTS_ALL (arg), len); + sp -= container_len; + write_memory (sp + offset, VALUE_CONTENTS_ALL (arg), len); } else { /* stack grows upward */ - write_memory (sp, VALUE_CONTENTS_ALL (arg), len); - sp += len; + write_memory (sp + offset, VALUE_CONTENTS_ALL (arg), len); + sp += container_len; } return sp; diff --git a/gdb/win32-nat.c b/gdb/win32-nat.c index 11e4fa1..24d8057 100644 --- a/gdb/win32-nat.c +++ b/gdb/win32-nat.c @@ -420,7 +420,7 @@ handle_load_dll (PTR dummy) printf_unfiltered ("%x:%s", event->lpBaseOfDll, dll_name); section_addrs.text_addr = (int) event->lpBaseOfDll + 0x1000; - symbol_file_add (dll_name, 0, §ion_addrs, 0, 0, 0, 1); + symbol_file_add (dll_name, 0, §ion_addrs, 0, OBJF_SHARED); printf_unfiltered ("\n"); return 1; diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 55f23cb..41ab763 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -2759,7 +2759,7 @@ xcoff_initial_scan (objfile, mainline) } static void -xcoff_symfile_offsets (objfile, addr) +xcoff_symfile_offsets (objfile, addrs) struct objfile *objfile; struct section_addr_info *addrs; { |