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

--

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... 

--

		Code Cleanups: Next Release
		===========================

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

--

Delete macro TARGET_BYTE_ORDER_SELECTABLE.

Patches in the database.

--

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

--

Fix copyright notices.

Turns out that ``1998-2000'' isn't considered valid :-(

http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00467.html

--

		Code Cleanups: General
		======================

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

--

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.

--

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

Like make_cleanup_func it isn't portable.

--

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.

--

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.

--

Replace strsave() + mstrsave() with libiberty:xstrdup().

--

Replace savestring() with something from libiberty.

An xstrldup()? but that would have different semantics.

--

Rationalize use of floatformat_unknown in GDB sources.

Instead of defaulting to floatformat_unknown, should hosts/targets
specify the value explicitly?

http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00447.html

--

Add a ``name'' member to include/floatformat.h:struct floatformat.
Print that name in gdbarch.c.

--

Sort out the harris mess in include/floatformat.h (it hardwires two
different floating point formats).

--

See of the GDB local floatformat_do_doublest() and libiberty's
floatformat_to_double (which was once GDB's ...) can be merged some
how.

--

Eliminate mmalloc() from GDB.

Also eliminate it from defs.h.

--

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.

--

Updated readline

Readline 4.? is out.  A merge wouldn't hurt.  Patches are in:

http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00436.html

--

Deprecate "fg".  Apparently ``fg'' is actually continue.

http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00417.html

--

Deprecate current use of ``floatformat_unknown''.

Require all targets to explicitly provide their float format instead
of defaulting to floatformat unknown.  Doing the latter leads to nasty
bugs.

http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00447.html

--

Rationalize floatformat_to_double() vs floatformat_to_doublest().

Looks like GDB migrated floatformat_to_double() to libiberty but then
turned around and created a ..._to_doublest() the latter containing
several bug fixes.

http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00472.html

--

Move floatformat_ia64_ext to libiberty/include floatformat.[ch].

http://sourceware.cygnus.com/ml/gdb-patches/2000-05/msg00466.html

--

Always build ser-tcp.c.

The patch as submitted was just going to add ser-tcp.c to the Alpha's
makefile.  A better patch is to instead add ser-tcp.c to SER_HARDWARE
and make it a standard part of all debuggers.

If problems occure then configure.in can sort them out.

http://sourceware.cygnus.com/ml/gdb-patches/2000-04/msg00544.html

--

Follow through `make check' with --enable-shared.

When the srcware tree is configured with --enable-shared, the `expect'
program won't run properly.  Jim Wilson found out gdb has a local hack
to set LD_LIBRARY_PATH, but, AFAIK, no other project has been hacked
similarly.

http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00845.html

--


			New Features and Fixes
			======================

These are harder than cleanups but easier than work involving
fundamental architectural change.

--

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.

--

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

Is there a command already?

--

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

This requires internationalization.

--

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.

--

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''.

--

Can the xdep files be replaced by autoconf?

--

Document trace machinery

--

Document ui-out and ui-file.

http://sourceware.cygnus.com/ml/gdb/2000-04/msg00121.html

--

Update texinfo.tex to latest?



--

Incorporate agentexpr.texi into gdb.texinfo

agentexpr.texi mostly describes the details of the byte code used for
tracepoints, not the internals of the support for this in GDB.  So it
looks like gdb.texinfo is a better place for this information.

http://sourceware.cygnus.com/ml/gdb-patches/2000-04/msg00566.html

--

Document overlay machinery.

--

``(gdb) catch signal SIGNAL''

Overlaps with ``handle SIGNAL'' but the implied behavour is different.
You can attach commands to a catch but not a handle.  A handle has a
limited number of hardwired actions.

--

Get the TUI working on all platforms.

--

Add support for ``gdb --- PROGRAM ARGS ...''.
Add support for ``gdb -cmd=...''

Along with many variations.  Check:

????? for a full discussion.

for a discussion.

--

Implement ``(gdb) !ls''.

Which is very different from ``(gdb) ! ls''.  Implementing the latter
is trivial.

http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00034.html

--

Replace the code that uses the host FPU with an emulator of the target
FPU.

--

			Thread Support
			==============

--

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.

--

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]

--

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.

--

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

--

			Language Support
			================

New languages come onto the scene all the time.

--

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

--

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

--

[Comming...]

Modify gdb to work correctly with Pascal.

--

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.

--

Add support for Modula3

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

--

		Remote Protocol Support
		=======================

--

set/show remote X-packet ...

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

--

Remote protocol doco feedback.

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


http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00023.html
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00056.html
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00382.html

--

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.

--

Add the cycle step command.

http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00237.html

--

			Symbol Support
			==============

If / when GDB starts to support the debugging of multi-processor
(rather than multi-thread) applications the symtab code will need to
be updated a little so that several independant symbol tables are
active at a given time.

The other interesting change is a clarification of the exact meaning
of CORE_ADDR and that has had consequences for a few targets (that
were abusing that data type).

--

Investiagate ways of reducing memory.

--

Investigate ways of improving load time.

--

Get the d10v to use POINTER_TO_ADDRESS and ADDRESS_TO_POINTER.

Consequence of recent symtab clarification.  No marks for figuring out
who maintains the d10v.

--

Get the MIPS to correctly sign extend all address <-> pointer
conversions.

Consequence of recent symtab clarification.  No marks for figuring out
who maintains the MIPS.

--

		Architectural Changes: General
		==============================

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.

--

Cleanup software single step.

At present many targets implement software single step by directly
blatting memory (see rs6000-tdep.c).  Those targets should register
the applicable breakpoints using the breakpoint framework.  Perhaphs a
new internal breakpoint class ``step'' is needed.

--

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.

--

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.

--

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?  :-)

--

		Architectural Change: Multi-arch et al.
		=======================================

The long term objective is to remove all assumptions that there is a
single target with a single address space with a single instruction
set architecture and single application binary interface.

This is an ongoing effort.  The first milestone is to enable
``multi-arch'' where by all architectural decisions are made at
runtime.

It should be noted that ``gdbarch'' is really ``gdbabi'' and
``gdbisa''.  Once things are multi-arched breaking that down correctly
will become much easier.

--

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.

--

Fix BELIEVE_PPC_PROMOTION.  Change it to BELIEVE_PPC_PROMOTION_P?

At present there is still #ifdef BELIEVE_PPC_PROMOTION code in the
symtab file.

--

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().

--

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''.

--

Rationalize TARGET_SINGLE_FORMAT and TARGET_SINGLE_BIT et al.

Surely one of them is redundant.

--

Convert ALL architectures to MULTI-ARCH.

--

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.

Can the tm.h and nm.h files be eliminated by multi-arch.

--

	Architectural Change: MI, LIBGDB and scripting languages
	========================================================

See also architectural changes related to the event loop.  LIBGDB
can't be finished until there is a generic event loop being used by
all targets.

The long term objective is it to be possible to integrate GDB into
scripting languages.

--

Implement generic ``(gdb) commmand > file''

Once everything is going through ui_file it should be come fairly
easy.

http://sourceware.cygnus.com/ml/gdb/2000-04/msg00104.html

--

Replace gdb_stdtarg with gdb_targout (and possibly gdb_targerr).

gdb_stdtarg is easily confused with gdb_stdarg.

--

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.

--

Eliminate error_begin().

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

--

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 ;-)

--

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.

--

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).

--

Convert MI into libgdb

MI provides a text interface into what should be many of the libgdb
functions.  The implementation of those functions should be separated
into the MI interface and the functions proper.  Those functions being
moved to gdb/lib say.

--

Create libgdb.h

The first part can already be found in defs.h.

--

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.

--

Make MI interface accessable from existing CLI.

--

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.

--

Add a mechanism to reject certain 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.  A way of restricting the expression parser so that such
operations are not accepted would be very helpful.

--

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.

--

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.

--

		Architectural Change: Async
		===========================

While GDB uses an event loop when prompting the user for input.  That
event loop is not exploited by targets when they allow the target
program to continue.  Typically targets still block in (target_wait())
until the program again halts.

The closest a target comes to supporting full asynchronous mode are
the remote targets ``async'' and ``extended-async''.

--

Asynchronous expression evaluator

Inferior function calls hang GDB.

--

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.

--

Make "target xxx" command interruptible.

As things become async this becomes possible.  A target would start
the connect and then return control to the event loop.  A cntrl-c
would notify the target that the operation is to be abandoned and the
target code could respond.

--

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!!]

--

			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.

--

[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.

--

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. 

--

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:
