If you find inaccuracies in this list, please send mail to
gdb-patches@sourceware.cygnus.com.  If you would like to work on any
of these, you should consider sending mail to the same address, to
find out whether anyone else is working on it.


			Known problems in GDB 5.0
			=========================

Below is a list of problems identified during the GDB 5.0 release
cycle.  People hope to have these problems fixed in a follow-on
release.

(The names in paren indicate people that posted the original problem.)

--

GDB requires GCC to build under IRIX

IRIX, being more pedantic than GCC reports as errors certain
assignments that GCC treats as warnings.

This can be worked around by building GDB with the GCC compiler.

--

The BFD directory requires bug-fixed AUTOMAKE et.al.

AUTOMAKE 1.4 incorrectly set the TEXINPUTS environment variable.  It
contained the full path to texinfo.tex when it should have only
contained the directory.  The bug has been fixed in the current
AUTOMAKE sources.  Automake snapshots can be found in:
	ftp://sourceware.cygnus.com/pub/gdb/snapshots
and	ftp://sourceware.cygnus.com/pub/binutils

--

Generic: lin-thread cannot handle thread exit (Mark Kettenis, Michael
Snyder) http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00525.html

The thread_db assisted debugging code doesn't handle exiting threads
properly, at least in combination with glibc 2.1.3 (the framework is
there, just not the actual code).  There are at least two problems
that prevent this from working.

As an additional reference point, the pre thread_db code did not work
either.

--

Java (Anthony Green, David Taylor)

Anthony Green has a number of Java patches that did not make it into
the 5.0 release.

Patch: java tests
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00512.html

Patch: java booleans
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00515.html

Patch: handle N_MAIN stab
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00527.html

--

Pascal (Pierre Muller, David Taylor)

Pierre Muller has contributed patches for adding Pascal Language
support to GDB.

2 pascal language patches inserted in database
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00521.html

Indent -gnu ?
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00496.html

--

GNU/Linux/x86 and random thread signals (and Solaris/SPARC but not
Solaris/x86).
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00336.html

Christopher Blizzard writes:

So, I've done some more digging into this and it looks like Jim
Kingdon has reported this problem in the past:

http://sourceware.cygnus.com/ml/bug-gdb/1999-10/msg00058.html

I can reproduce this problem both with and without Tom's patch.  Has
anyone seen this before?  Maybe have a solution for it hanging around?
:)

There's a test case for this documented at:

when debugging threaded applications you get extra SIGTRAPs
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=9565

[There should be a GDB testcase - cagney]

--

Possible regressions with some devel GCCs.
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00475.html

gcc-2.95.2 outputs a line note *before* the prologue (and one for the
closing brace after the epilogue, instead of before it, as it used to
be). By disabling the RTL-style prologue generating mechanism
(undocumented GCC option -mno-schedule-prologue), you get back the
traditional behaviour.
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00510.html

This should now be fixed.

--

RFD: infrun.c: No bpstat_stop_status call after proceed over break?
(Peter Schauer)
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00665.html

GDB misses watchpoint triggers after proceeding over a breakpoint on
x86 targets.

--

x86 linux GDB and SIGALRM (???)
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00803.html

I know there are problems with single stepping through signal
handlers.  These problems were present in 4.18.  They were just masked
because 4.18 failed to recognize signal handlers.  Fixing it is not
easy, and will require changes to handle_inferior_event(), that I
prefer not to make before the 5.0 release.

Mark

--

Revised UDP support (was: Re: [Fwd: [patch] UDP transport support])
http://sourceware.cygnus.com/ml/gdb-patches/2000-04/msg00000.html

(Broken) support for GDB's remote protocol across UDP is to be
included in the follow-on release.

--

Can't build IRIX -> arm GDB.
http://sourceware.cygnus.com/ml/gdb-patches/2000-04/msg00356.html

David Whedon writes:
> Now I'm building for an embedded arm target.  If there is a way of turning
> remote-rdi off, I couldn't find it. It looks like it gets built by default
> in gdb/configure.tgt(line 58) Anyway, the build dies in
> gdb/rdi-share/unixcomm.c.  SERPORT1 et. al. never get defined because we
> aren't one of the architectures supported.

--

Problem with weak functions
http://sourceware.cygnus.com/ml/gdb/2000-05/msg00060.html

Dan Nicolaescu writes:
> It seems that gdb-4.95.1  does not display correctly the function when
> stoping in weak functions. 
> 
> It stops in a function that is defined as weak, not in the function
> that is actualy run... 

--

GDB5 TOT on unixware 7
http://sourceware.cygnus.com/ml/gdb/2000-04/msg00119.html

Robert Lipe writes:
> I just spun the top of tree of the GDB5 branch on UnixWare 7.  As a
> practical matter, the current thread support is somewhat more annoying
> than when GDB was thread-unaware.

--

			Code Cleanups
			=============

The following are small cleanups that will hopefully be completed by
the follow on to 5.0.

--

ATTRIBUTE_UNUSED

The need for this as almost been eliminated.  The next version of GCC
(assuming cagney gets the relevant patch committed) will be able to
supress unused parameter warnings.

--

Eliminate more compiler warnings.

Of course there also needs to be the usual debate over which warnings
are valid and how to best go about this.

One method: choose a single option; get agreement that it is
reasonable; try it out to see if there isn't anything silly about it
(-Wunused-parameters is an example of that) then incrementally hack
away.

The other method is to enable all warnings and eliminate them from one
file at a time.

--

Delete macro TARGET_BYTE_ORDER_SELECTABLE.

Patches in the database.

--

Updated readline

Readline 4.? is out.  A merge wouldn't hurt.

--

Purge PARAMS

Eliminate all uses of PARAMS in GDB's source code.

--

Elimination of make_cleanup_func. (Andrew Cagney)

make_cleanup_func elimination
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00791.html
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00814.html

--

Elimination of ``(catch_errors_ftype *) func''.

Like make_cleanup_func it isn't portable.

--

Re: Various C++ things

value_headof/value_from_vtable_info are worthless, and should be removed.
The one place in printcmd.c that uses it should use the RTTI functions.

RTTI for g++ should be using the typeinfo functions rather than the vtables.
The typeinfo functions are always at offset 4 from the beginning of the vtable,
and are always right. The vtables will have weird names like E::VB sometimes.
The typeinfo function will always be "E type_info function", or somesuch.

value_virtual_fn_field needs to be fixed so there are no failures for virtual
functions for C++ using g++.

Testsuite cases are the major priority right now for C++ support, since i have
to make a lot of changes that could potentially break each other.

--

Fix ``set architecture <tab>''

This command should expand to a list of all supported architectures.
At present ``info architecture'' needs to be used.  That is simply
wrong.  It involves the use of add_set_enum_cmd().

--

GDBARCH cleanup (Andrew Cagney)

The non-generated parts of gdbarch.{sh,h,c} should be separated out
into arch-utils.[hc].

Document that gdbarch_init_ftype could easily fail because it didn't
identify an architecture.

--

Migrate qfThreadInfo packet -> qThreadInfo. (Andrew Cagney)

Add support for packet enable/disable commands with these thread
packets.  General cleanup.

[PATCH] Document the ThreadInfo remote protocol queries
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00832.html

[PATCH] "info threads" queries for remote.c
http://sourceware.cygnus.com/ml/gdb-patches/2000-q1/msg00831.html

--

			General Cleanups / Fixes
			========================

The following are more general cleanups and fixes.  They are not tied
to any specific release.

--

Nuke USG define.

--

[PATCH/5] src/intl/Makefile.in:distclean additions
http://sourceware.cygnus.com/ml/gdb-patches/2000-04/msg00363.html

Do not forget to merge the patch back into the trunk.

--

Update ALPHA so that it uses ``struct frame_extra_info'' instead of
EXTRA_FRAME_INFO.

This is a barrier to replacing mips_extra_func_info with something
that works with multi-arch.

--

Multi-arch  mips_extra_func_info.

This first needs the alpha to be updated so that it uses ``struct
frame_extra_info''.

--

Send normal output to gdb_stdout.
Send error messages to gdb_stderror.
Send debug and log output log gdb_stdlog.

GDB still contains many cases where (f)printf or printf_filtered () is
used when it should be sending the messages to gdb_stderror or
gdb_stdlog.  The thought of #defining printf to something has crossed
peoples minds ;-)

--

Rationalize the host-endian code (grep for HOST_BYTE_ORDER).

At present defs.h includes <endian.h> (which is linux specific) yet
almost nothing depends on it.  Suggest "gdb_endian.h" which can also
handle <machine/endian.h> and only include that where it is really
needed.

--

Replace asprintf() calls with xasprintf() calls.

As with things like strdup() most calls to asprintf() don't check the
return value.

--

Rationaize savestring(), msavestring() and mstrsave().

In general libiberty's xstrdup () can be used.

--

Eliminate mmalloc() from GDB.

Also eliminate it from defs.h.

--

Check/cleanup MI documentation.

The list of commands specified in the documentation needs to be
checked against the mi-cmds.c table in a mechanical way (so that they
two can be kept up-to-date).

--

Eliminate error_begin().

With ui_file, there is no need for the statefull error_begin ()
function.

--

Add built-by, build-date, tm, xm, nm and anything else into gdb binary
so that you can see how the GDB was created.

Some of these (*m.h) would be added to the generated config.h.  That
in turn would fix a long standing bug where by the build process many
not notice a changed tm.h file.  Since everything depends on config.h,
a change to *m.h forces a change to config.h and, consequently forces
a rebuild.

--

Replace gdb_stdtarg with gdb_targout (and possibly gdb_targerr).

gdb_stdtarg is easily confused with gdb_stdarg.

--

Remote protocol doco feedback.

Too much feedback to mention needs to be merged in (901660).  Search
for the word ``remote''.

--

set/show remote X-packet ...

``(gdb) help set remote X-packet'' doesn't list the applicable
responses.  The help message needs to be expanded.

--

Extra ui_file methods - dump.

These are for debugging / testing.  An aside is to set up a whitebox
testsuite for key internals such as ui_file.

--

Add an "info bfd" command that displays supported object formats,
similarly to objdump -i.

Is there a command already?

--

Eliminate PTR.  ISO-C allows ``void *''.

--

Eliminate abort ().

GDB should never abort.  GDB should either throw ``error ()'' or
``internal_error ()''.  Better still GDB should naturally unwind with
an error status.

--

GDB probably doesn't build on FreeBSD pre 2.2.x
http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00378.html

Fixes to get FreeBSD working on 2.2.x, 3.x and 4.x caused the code to
suffer bit rot.

--

			Architectural Changes
			=====================

These are harder than simple cleanups / fixes and, consequently
involve more work.  Typically an Architectural Change will be broken
down into a more digestible set of cleanups and fixes.

--

Replace READ_FP() with FRAME_HANDLE().

READ_FP() is a hangover from the days of the vax when the ABI really
did have a frame pointer register.  Modern architectures typically
construct a virtual frame-handle from the stack pointer and various
other bits of string.

Unfortunatly GDB still treats this synthetic FP register as though it
is real.  That in turn really confuses users (arm and ``print $fp'' VS
``info registers fp'').  The synthetic FP should be separated out of
the true register set presented to the user.

--

MI's input does not use buffering.

At present the MI interface reads raw characters of from an unbuffered
FD.  This is to avoid several nasty buffer/race conditions.  That code
should be changed so that it registers its self with the event loop
(on the input FD) and then push commands up to MI as they arrive.

The serial code already does this.

--

Register Cache Cleanup (below from Andrew Cagney)

I would depict the current register architecture as something like:

        High GDB  -->   Low GDB
            |              |
           \|/            \|/
            --- REG NR -----
                   |
    register + REGISTER_BYTE(reg_nr)
                   |
                  \|/
        -------------------------
        |  extern register[]    |
        -------------------------

where neither the high (valops.c et.al.) or low gdb (*-tdep.c) are
really clear on what mechanisms they should be using to manipulate that
buffer.   Further, much code assumes, dangerously, that registers are
contigious.  Having got mips-tdep.c to support multiple ABIs, believe
me, that is a bad assumption.  Finally, that register cache layout is
determined by the current remote/local target and _not_ the less
specific target ISA.  In fact, in many cases it is determined by the
somewhat arbitrary layout of the [gG] packets!


How I would like the register file to work is more like:


          High GDB
             |
            \|/
       pseudo reg-nr
             |
        map pseudo <->
        random cache
        bytes       
             |
            \|/
        ------------
        | register |
        |  cache   |
        ------------
            /|\
             |
        map random cache
        bytes to target
        dependant i-face
            /|\
             |
       target dependant
        such as [gG] packet
        or ptrace buffer

The main objectives being:

        o       a clear separation between the low
                level target and the high level GDB

        o       a mechanism that solves the general
                problem of register aliases, overlaps
                etc instead of treating them as optional
                extras that can be wedged in as an after
                thought (that is a reasonable description
                of the current code).

                Identify then solve the hard case and the
                rest just falls out.  GDB solved the easy
                case and then tried to ignore the real
                world :-)

        o       a removal of the assumption that the
                mapping between the register cache
                and virtual registers is largely static.
                If you flip the USR/SSR stack register
                select bit in the status-register then
                the corresponding stack registers should
                reflect the change.

        o       a mechanism that clearly separates the
                gdb internal register cache from any
                target (not architecture) dependant
                specifics such as [gG] packets.

Of course, like anything, it sounds good in theory.  In reality, it
would have to contend with many<->many relationships at both the
virt<->cache and cache<->target level.  For instance:

        virt<->cache
                Modifying an mmx register may involve
                scattering values across both FP and
                mmpx specific parts of a buffer

        cache<->target
                When writing back a SP it may need to
                both be written to both SP and USP.


Hmm,

Rather than let this like the last time it was discussed, just slip, I'm
first going to add this e-mail (+ references) to TODO.  I'd then like to
sketch out a broad strategy I think could get us there.


First thing I'd suggest is separating out the ``extern registers[]''
code so that we can at least identify what is using it.  At present
things are scattered across many files.  That way we can at least
pretend that there is a cache instead of a global array :-)

I'd then suggest someone putting up a proposal for the pseudo-reg /
high-level side interface so that code can be adopted to it.  For old
code, initially a blanket rename of write_register_bytes() to
deprecated_write_register_bytes() would help.

Following that would, finaly be the corresponding changes to the target.

--

Fix ``I'm sorry, Dave, I can't do that.'' from symfile.c.

This requires internationalization.

--

Check that GDB can handle all BFD architectures (Andrew Cagney)

There should be a test that checks that BFD/GDB are in sync with
regard to architecture changes.  Something like a test that first
queries GDB for all supported architectures and then feeds each back
to GDB..  Anyone interested in learning how to write tests?  :-)

--

Add support for Modula3

Get DEC/Compaq to contribute their Modula-3 support.

--

Convert ALL architectures to MULTI-ARCH.

--

Convert GDB build process to AUTOMAKE.

See also sub-directory configure below.

--

Cleanup configury support for optional sub-directories.

Check how GCC handles multiple front ends for an example of how things
could work.  A tentative first step is to rationalize things so that
all sub directories are handled in a fashion similar to gdb/mi.

See also automake above.

--

Restructure gdb directory tree so that it avoids any 8.3 and 14
filename problems.

--

Can the xdep files be replaced by autoconf?
Can the tm.h and nm.h files be eliminated by multi-arch.

--

Add a transcript mechanism to GDB.

Such a mechanism might log all gdb input and output to a file in a
form that would allow it to be replayed.  It could involve ``gdb
--transcript=FILE'' or it could involve ``(gdb) transcript file''.

--

Make MI interface accessable from existing CLI.

--

Select the initial multi-arch ISA / ABI based on --target or similar.

At present the default is based on what ever is first in the BFD
archures table.  It should be determined based on the ``--target=...''
name.

--

Truly multi-arch.

Enable the code to recognize --enable-targets=.... like BINUTILS does.

--

Add a breakpoint-edit command to MI.

It would be similar to MI's breakpoint create but would apply to an
existing breakpoint.  It saves the need to delete/create breakpoints
when ever they are changed.

--

Add directory path to MI breakpoint.

That way the GUI's task of finding the file within which the
breakpoint was set is simplified.

--

Re-do GDB's output pager.

GDB's output pager still relies on people correctly using *_filtered
for gdb_stdout and *_unfiltered for gdb_stdlog / gdb_stderr.
Hopefully, with all normal output going to gdb_stdout, the pager can
just look at the ui_file that the output is on and then use that to
decide what to do about paging.  Sounds good in theory.

--

Add mechanism to reject expression classes to MI

There are situtations where you don't want GDB's expression
parser/evaluator to perform inferior function calls or variable
assignments.

--

Remove sideffects from libgdb breakpoint create function.

The user can use the CLI to create a breakpoint with partial
information - no file (gdb would use the file from the last
breakpoint).

The libgdb interface currently affects that environment which can lead
to confusion when a user is setting breakpoints via both the MI and
the CLI.

This is also a good example of how getting the CLI ``right'' will be
hard.

--

GDB doesn't recover gracefully from remote protocol errors.

GDB wasn't checking for NAKs from the remote target.  Instead a NAK is
ignored and a timeout is required before GDB retries.  A pre-cursor to
fixing this this is making GDB's remote protocol packet more robust.

While downloading to a remote protocol target, gdb ignores packet
errors in so far as it will continue to edownload with chunk N+1 even
if chunk N was not correctly sent.  This causes gdb.base/remote.exp to
take a painfully long time to run.  As a PS that test needs to be
fixed so that it builds on 16 bit machines.

--

Move gdb_lasterr to ui_out?

The way GDB throws errors and records them needs a re-think.  ui_out
handles the correct output well.  It doesn't resolve what to do with
output / error-messages when things go wrong.

--

Fix implementation of  ``target xxx''.

At present when the user specifies ``target xxxx'', the CLI maps that
directly onto a target open method.  It is then assumed that the
target open method should do all sorts of complicated things as this
is the only chance it has.  Check how the various remote targets
duplicate the target operations.  Check also how the various targets
behave differently for purely arbitrary reasons.

What should happen is that ``target xxxx'' should call a generic
``target'' function and that should then co-ordinate the opening of
``xxxx''.  This becomes especially important when you're trying to
open an asynchronous target that may need to perform background tasks
as part of the ``attach'' phase.

Unfortunatly, due to limitations in the old/creaking command.h
interface, that isn't possible.  The function being called isn't told
of the ``xxx'' or any other context information.

Consequently a precursor to fixing ``target xxxx'' is to clean up the
CLI code so that it passes to the callback function (attatched to a
command) useful information such as the actual command and a context
for that command.  Other changes such as making ``struct command''
opaque may also help.

--

Document trace machinery

--

Document overlay machinery.

--

			Legacy Wish List
			================

This list is not up to date, and opinions vary about the importance or
even desirability of some of the items.  If you do fix something, it
always pays to check the below.

--

@c This does not work (yet if ever).  FIXME.
@c @item --parse=@var{lang} @dots{}
@c Configure the @value{GDBN} expression parser to parse the listed languages.
@c @samp{all} configures @value{GDBN} for all supported languages.  To get a
@c list of all supported languages, omit the argument.  Without this
@c option, @value{GDBN} is configured to parse all supported languages.

--

START_INFERIOR_TRAPS_EXPECTED need never be defined to 2, since that
is its default value.  Clean this up.

--

It should be possible to use symbols from shared libraries before we know
exactly where the libraries will be loaded.  E.g. "b perror" before running
the program.  This could maybe be done as an extension of the "breakpoint
re-evaluation" after new symbols are loaded.

--

Make single_step() insert and remove breakpoints in one operation.

--

Speed up single stepping by avoiding extraneous ptrace calls.

--

Speed up single stepping by not inserting and removing breakpoints
each time the inferior starts and stops.

Breakpoints should not be inserted and deleted all the time.  Only the
one(s) there should be removed when we have to step over one.  Support
breakpoints that don't have to be removed to step over them.

[this has resulted in numerous debates.  The issue isn't clear cut]

--

Provide "voodoo" debugging of core files.  This creates a zombie
process as a child of the debugger, and loads it up with the data,
stack, and regs of the core file.  This allows you to call functions
in the executable, to manipulate the data in the core file.

[you wish]

--

GDB reopens the source file on every line, as you "next" through it.

[still true? I've a memory of this being fixed]

--

Perhaps "i source" should take an argument like that of "list".

--

Remove "at 0xnnnn" from the "b foo" response, if `print address off' and if
it matches the source line indicated.

--

The prompt at end of screen should accept space as well as CR.

--

Backtrace should point out what the currently selected frame is, in
its display, perhaps showing "@3 foo (bar, ...)" or ">3 foo (bar,
...)" rather than "#3 foo (bar, ...)".

--

"i program" should work for core files, and display more info, like what
actually caused it to die.

--

"x/10i" should shorten the long name, if any, on subsequent lines.

--

"next" over a function that longjumps, never stops until next time you happen
to get to that spot by accident.  E.g. "n" over execute_command which has
an error.

--

"set zeroprint off", don't bother printing members of structs which
are entirely zero.  Useful for those big structs with few useful
members.

--

GDB does four ioctl's for every command, probably switching terminal modes
to/from inferior or for readline or something.

--

terminal_ours versus terminal_inferior: cache state.  Switch should be a noop
if the state is the same, too.

--

"i frame" shows wrong "arglist at" location, doesn't show where the args
should be found, only their actual values.

--

There should be a way for "set" commands to validate the new setting
before it takes effect.

--

"ena d" is ambiguous, why?  "ena delete" seems to think it is a command!

--

i line VAR produces "Line number not known for symbol ``var''.".  I
thought we were stashing that info now!

--

We should be able to write to random files at hex offsets like adb.

--

Make "target xxx" command interruptible.

--

[elena - delete this]

Handle add_file with separate text, data, and bss addresses.  Maybe
handle separate addresses for each segment in the object file?

--

[Jimb/Elena delete this one]

Handle free_named_symtab to cope with multiply-loaded object files
in a dynamic linking environment.  Should remember the last copy loaded,
but not get too snowed if it finds references to the older copy.

--

[elena delete this also]

Remove all references to:
	text_offset
	data_offset
	text_data_start
	text_end
	exec_data_offset
	...
now that we have BFD.  All remaining are in machine dependent files.

--

Re-organize help categories into things that tend to fit on a screen
and hang together.

--

Add in commands like ADB's for searching for patterns, etc.  We should
be able to examine and patch raw unsymboled binaries as well in gdb as
we can in adb.  (E.g. increase the timeout in /bin/login without source).

[actually, add ADB interface :-]

--

When doing "step" or "next", if a few lines of source are skipped between
the previous line and the current one, print those lines, not just the
last line of a multiline statement.

--

Handling of "&" address-of operator needs some serious overhaul
for ANSI C and consistency on arrays and functions.
  For "float point[15];":
ptype &point[4]   ==> Attempt to take address of non-lvalue.
  For "char *malloc();":
ptype malloc	  ==> "char *()";  should be same as
ptype &malloc     ==> "char *(*)()"
call printf ("%x\n", malloc)   ==> weird value, should be same as
call printf ("%x\n", &malloc)  ==> correct value

--

Fix dbxread.c symbol reading in the presence of interrupts.  It
currently leaves a cleanup to blow away the entire symbol table when a
QUIT occurs.  (What's wrong with that? -kingdon, 28 Oct 1993).

[I suspect that the grype was that, on a slow system, you might want
to cntrl-c and get just half the symbols and then load the rest later
- scary to be honest]

--

Mipsread.c reads include files depth-first, because the dependencies
in the psymtabs are way too inclusive (it seems to me).  Figure out what
really depends on what, to avoid recursing 20 or 30 times while reading
real symtabs.

--

value_add() should be subtracting the lower bound of arrays, if known,
and possibly checking against the upper bound for error reporting.

--

When listing source lines, check for a preceding \n, to verify that
the file hasn't changed out from under us.

[fixed by some other means I think.  That hack wouldn't actually work
reliably - the file might move such that another \n appears. ]

--

Get all the remote systems (where the protocol allows it) to be able to
stop the remote system when the GDB user types ^C (like remote.c
does).  For ebmon, use ^Ak.

--

Possible feature: A version of the "disassemble" command which shows
both source and assembly code ("set symbol-filename on" is a partial
solution).

[has this been done?  It was certainly done for MI and GDBtk]

--

investigate "x/s 0" (right now stops early) (I think maybe GDB is
using a 0 address for bad purposes internally).

--

Make "info path" and path_command work again (but independent of the
environment either of gdb or that we'll pass to the inferior).

--

Make GDB understand the GCC feature for putting octal constants in
enums.  Make it so overflow on an enum constant does not error_type
the whole type.  Allow arbitrarily large enums with type attributes.
Put all this stuff in the testsuite.

--

Make TYPE_CODE_ERROR with a non-zero TYPE_LENGTH more useful (print
the value in hex; process type attributes).  Add this to the
testsuite.  This way future compilers can add new types and old
versions of GDB can do something halfway reasonable.

--

Fix mdebugread.c:parse_type to do fundamental types right (see
rs6000_builtin_type in stabsread.c for what "right" is--the point is
that the debug format fixes the sizes of these things and it shouldn't
depend on stuff like TARGET_PTR_BIT and so on.  For mdebug, there seem
to be separate bt* codes for 64 bit and 32 bit things, and GDB should
be aware of that).  Also use a switch statement for clarity and speed.

--

Investigate adding symbols in target_load--some targets do, some
don't.

--

Put dirname in psymtabs and change lookup*symtab to use dirname (so
/foo/bar.c works whether compiled by cc /foo/bar.c, or cd /foo; cc
bar.c).

--

Merge xcoffread.c and coffread.c.  Use breakpoint_re_set instead of
fixup_breakpoints.

--

Make a watchpoint which contains a function call an error (it is
broken now, making it work is probably not worth the effort).

--

New test case based on weird.exp but in which type numbers are not
renumbered (thus multiply defining a type).  This currently causes an
infinite loop on "p v_comb".

--

[Hey! Hint Hint Delete Delete!!!]

Fix 386 floating point so that floating point registers are real
registers (but code can deal at run-time if they are missing, like
mips and 68k).  This would clean up "info float" and related stuff.

--

gcc -g -c enummask.c then gdb enummask.o, then "p v".  GDB complains
about not being able to access memory location 0.

-------------------- enummask.c
enum mask
{
  ANIMAL = 0,
  VEGETABLE = 1,
  MINERAL = 2,
  BASIC_CATEGORY = 3,

  WHITE = 0,
  BLUE = 4,
  GREEN = 8,
  BLACK = 0xc,
  COLOR = 0xc,

  ALIVE = 0x10,

  LARGE = 0x20
} v;

--

If try to modify value in file with "set write off" should give
appropriate error not "cannot access memory at address 0x65e0".

--

Allow core file without exec file on RS/6000.

--

Make sure "shell" with no arguments works right on DOS.

--

Make gdb.ini (as well as .gdbinit) be checked on all platforms, so
the same directory can be NFS-mounted on unix or DOS, and work the
same way.

--

[Is this another delete???]

Get SECT_OFF_TEXT stuff out of objfile_relocate (might be needed to
get RS/6000 to work right, might not be immediately relevant).

--

Work out some kind of way to allow running the inferior to be done as
a sub-execution of, eg. breakpoint command lists.  Currently running
the inferior interupts any command list execution.  This would require
some rewriting of wait_for_inferior & friends, and hence should
probably be done in concert with the above.

--

Add function arguments to gdb user defined functions.

--

Add convenience variables that refer to exec file, symbol file,
selected frame source file, selected frame function, selected frame
line number, etc.

--

Add a "suspend" subcommand of the "continue" command to suspend gdb
while continuing  execution of the subprocess.  Useful when you are
debugging servers and you want to dodge out and initiate a connection
to a server running under gdb.

[hey async!!]

--

Modify the handling of symbols grouped through BINCL/EINCL stabs to
allocate a partial symtab for each BINCL/EINCL grouping.  This will
seriously decrease the size of inter-psymtab dependencies and hence
lessen the amount that needs to be read in when a new source file is
accessed. 

--

[Comming...]

Modify gdb to work correctly with Pascal.

--

Add a command for searching memory, a la adb.  It specifies size,
mask, value, start address.  ADB searches until it finds it or hits
an error (or is interrupted).

--

Remove the range and type checking code and documentation, if not
going to implement.

# Local Variables:
# mode: text
# End:
