If you find inaccuracies in this list, please send mail to
bug-gdb@prep.ai.mit.edu.  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.

General To Do List
------------------

This list is probably not up to date, and opinions vary about the
importance or even desirability of some of the items.

Document trace machinery.

Document overlay machinery.

Extend .gdbinit mechanism to specify name on command line, allow for
lists of files to load, include function of --tclcommand.

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

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

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.

Update gdbint.texinfo to include doc on the directory structure and 
the various tricks of building gdb.

Do a tutorial in gdb.texinfo on how to do simple things in gdb.
E.g. how to set a breakpoint that just prints something and continues.
How to break on aborts.  Etc.

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.

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

Referencing the vtbl member of a struct doesn't work.  It prints OK
if you print the struct, but it gets 0 if you try to deref it.

Persistent command history: A feature where you could save off a list
of the commands you did, so you can edit it into something that will bring
the target to the same place every time you source it.
This would also be useful for automated fast watchpointing; if you go
past the place where it watchpoints, you just start it over again and
do it more carefully.

Deal with the SunOS 4.0 and 4.1.1 ptrace bug that loses the registers if
the stack is paged out.

Finish the C++ exception handling stub routines.  Lint points them out
as unused statics functions.

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

See if core-aout.c's fetch_core_registers can be used on more machines.
E.g. MIPS (mips-xdep.c).

unpack_double() does not handle IEEE float on the target unless the host
is also IEEE.  Death on a vax.

Set up interface between GDB and INFO so that you can hop into interactive
INFO and back out again.  When running under Emacs, should use Emacs
info, else fork the info program.  Installation of GDB should install
its texinfo files into the info tree automagically, including the readline
texinfo files.

"help address" ought to find the "help set print address" entry.

Remove the VTBL internal guts from printouts of C++ structs, unless
vtblprint is set.

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.

Check STORE_RETURN_VALUE on all architectures.  Check near it in tm-sparc.h
for other bogosities.

Check for storage leaks in GDB, I'm sure there are a lot!

vtblprint of a vtbl should demangle the names it's printing.

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.

Check through the code for FIXME comments and fix them.  dbxread.c,
blockframe.c, and plenty more. (I count 634 as of 940621 - sts)

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

ptype $i6 = void??!

Clean up invalid_float handling so gdb doesn't coredump when it tries to
access a NaN.  While this might work on SPARC, other machines are not
configured right.

"b value_at ; commands ; continue ; end" stops EVERY OTHER TIME!
Then once you enter a command, it does the command, runs two more
times, and then stops again!  Bizarre...  (This behaviour has been
modified, but it is not yet 100% predictable when e.g. the commands
call functions in the child, and while there, the child is interrupted
with a signal, or hits a breakpoint.)

help completion, help history should work.

Check that we can handle stack trace through varargs AND alloca in same
function, on 29K.

wait_for_inferior loops forever if wait() gives it an error.

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

A mess of floating point opcodes are missing from sparc-opcode.h.
Also, a little program should test the table for bits that are
overspecified or underspecified.  E.g. if the must-be-ones bits
and the must-be-zeroes bits leave some fields unexamined, and the format
string leaves them unprinted, then point this out.  If multiple
non-alias patterns match, point this out too.  Finally, there should
be a sparc-optest.s file that tries each pattern out.  This file
should end up coming back the same (modulo transformation comments) 
if fed to "gas" then the .o is fed to gdb for disassembly.

Eliminate all the core_file_command's in all the xdep files.
Eliminate separate declarations of registers[] everywhere.

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

Perhaps move the tdep, xdep, and nat files, into the config
subdirectories.  If not, at least straighten out their names so that
they all start with the machine name.

inferior_status should include stop_print_frame.  It won't need to be
reset in wait_for_inferior after bpstat_stop_status call, then.

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.

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

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.

Generalize and Standardize the RPC interface to a target program,
improve it beyond the "ptrace" interface, and see if it can become a
standard for remote debugging.  (This is talking about the vxworks
interface.  Seems unlikely to me that there will be "a standard" for
remote debugging anytime soon --kingdon, 8 Nov 1994).

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.

When quitting with a running program, if a core file was previously
examined, you get "Couldn't read float regs from core file"...if 
indeed it can't.  generic_mourn_inferior...

Have remote targets give a warning on a signal argument to
target_resume.  Or better yet, extend the protocols so that it works
like it does on the Unix-like systems.

Sort help and info output.

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

renote-nindy.c handles interrupts poorly; it error()s out of badly
chosen places, e.g. leaving current_frame zero, which causes core dumps
on the next command.

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

Those xdep files that call register_addr without defining it are
probably simply broken.  When reconfiguring this part of gdb, I could
only make guesses about how to redo some of those files, and I
probably guessed wrong, or left them "for later" when I have a
machine that can attempt to build them.

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.

When searching for C++ superclasses in value_cast in valops.c, we must
not search the "fields", only the "superclasses".  There might be a
struct with a field name that matches the superclass name.  This can
happen when the struct was defined before the superclass (before the
name became a typedef).

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

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.

mipsread.c symbol table allocation and deallocation should be checked.
My suspicion is that it's full of memory leaks.

SunOS should have a target_lookup_symbol() for common'd things allocated
by the shared library linker ld.so.

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

When listing source lines, eat leading whitespace corresponding to the
line-number prefix we print.  This avoids long lines wrapping.

mipsread.c needs to check for old symtabs and psymtabs for the same
files, the way it happens for dbxread.c and coffread.c, for VxWorks
incremental symbol table reloading.

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

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.

Clean up formatting of "info registers" on MIPS and 88k.  See if it
is possible to do this generically across all target architectures.

GDB gets bfd/corefile.c and gdb/corefile.c confused (this should be easy to
repeat even with something more recent than GDB 4.9).

Check that unmatched RBRAC doesn't abort().

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.

Fix byte order and int size sins in tm-a29k.h
(EXTRACT_RETURN_VALUE).  Perhaps should reproduce bug and verify fix
(or perhaps should just fix it...).

Make a watchpoint on a constant expression an error (or warning
perhaps)

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

Re-do calls to signal() in remote.c, and inflow.c (set_sigint_trap and
so on) to be independent of the debugging target, using target_stop to
stop the inferior.  Probably the part which is now handled by
interrupt_query in remote.c can be done without any new features in
the debugging target.

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

Nuke baseclass_addr.

Nuke USG define.

"source file more recent" loses on re-read

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.

Look at Solaris bug in interrupt.exp.  Can get out of syscall with
PRSABORT (syscall will return EINTR) but merely doing that leads to a
"can't read memory" error.

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

Why do we allow a target to omit standard register names (NO_STD_REGS
in tm-z8k.h)?  I thought the standard register names were supposed to
be just that, standard.

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.

cd ~/tmp/<M-?> causes infinite loop (where ~/tmp is a directory).

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

Clean up add_toc_to_loadinfo

Think about attached processes and sharing terminal.

John sez in reference to ignoring errors from tcsegpgrp if attach_flag:
set_tty_state should not have any trouble with attached processes.
Instead, the tty handling should leave the pgrp of the tty alone when
attaching to processes (perhaps pass terminal_init_inferior a flag
saying whether we're attaching).

PAGE_SIZE redefined warnings on AIX.  Probably should be using
BFD_PAGE_SIZE throughout BFD.

Rewrite proceed, wait_for_inferior, and normal_stop to clean them up.
Suggestions: 

	1) Make each test in wait_for_inferior a seperate subroutine
	   call.
	2) Combine wait_for_inferior and normal_stop to clean up
	   communication via global variables.
	3) See if you can find some way to clean up the global
	   variables that are used; possibly group them by data flow
	   and information content?

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.

Add stab information to allow reasonable debugging of inline functions
(possibly they should show up on a stack backtrace?  With a note
indicating that they weren't "real"?).

Modify the naked "until" command to step until past the current source
line, rather than past the current pc value.  This is tricky simply
because the low level routines have no way of specifying a multi-line
step range, and there is no way of saying "don't print stuff when we
stop" from above (otherwise could just call step many times).

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. 

Do an "x/i $pc" after each stepi or nexti.  

Modify all of the disassemblers to use printf_filtered to get correct
more filtering.

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:
