\input texinfo   @c -*- texinfo -*-
@setfilename gdbint.info
@include gdb-cfg.texi
@settitle @value{GDBN} Internals
@setchapternewpage off
@dircategory Software development
@direntry
* Gdb-Internals: (gdbint).	The GNU debugger's internals.
@end direntry

@copying
Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1996, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Cygnus Solutions.  Written by John Gilmore.
Second Edition by Stan Shebs.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts.  A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
@end copying

@ifnottex
This file documents the internals of the GNU debugger @value{GDBN}.

@insertcopying
@end ifnottex


@syncodeindex fn cp
@syncodeindex vr cp

@titlepage
@title @value{GDBN} Internals
@subtitle{A guide to the internals of the GNU debugger}
@author John Gilmore
@author Cygnus Solutions
@author Second Edition:
@author Stan Shebs
@author Cygnus Solutions
@page
@tex
\def\$#1${{#1}}  % Kluge: collect RCS revision info without $...$
\xdef\manvers{\$Revision$}  % For use in headers, footers too
{\parskip=0pt
\hfill Cygnus Solutions\par
\hfill \manvers\par
\hfill \TeX{}info \texinfoversion\par
}
@end tex

@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@contents

@node Top
@c Perhaps this should be the title of the document (but only for info,
@c not for TeX).  Existing GNU manuals seem inconsistent on this point.
@top Scope of this Document

This document documents the internals of the GNU debugger, @value{GDBN}.  It
includes description of @value{GDBN}'s key algorithms and operations, as well
as the mechanisms that adapt @value{GDBN} to specific hosts and targets.

@menu
* Summary::
* Overall Structure::
* Algorithms::
* User Interface::
* libgdb::
* Values::
* Stack Frames::
* Symbol Handling::
* Language Support::
* Host Definition::
* Target Architecture Definition::
* Target Descriptions::
* Target Vector Definition::
* Native Debugging::
* Support Libraries::
* Coding Standards::
* Misc Guidelines::
* Porting GDB::
* Versions and Branches::
* Start of New Year Procedure::
* Releasing GDB::
* Testsuite::
* Hints::

* GDB Observers::  @value{GDBN} Currently available observers
* GNU Free Documentation License::  The license for this documentation
* Index::
@end menu

@node Summary
@chapter Summary

@menu
* Requirements::
* Contributors::
@end menu

@node Requirements
@section Requirements
@cindex requirements for @value{GDBN}

Before diving into the internals, you should understand the formal
requirements and other expectations for @value{GDBN}.  Although some
of these may seem obvious, there have been proposals for @value{GDBN}
that have run counter to these requirements.

First of all, @value{GDBN} is a debugger.  It's not designed to be a
front panel for embedded systems.  It's not a text editor.  It's not a
shell.  It's not a programming environment.

@value{GDBN} is an interactive tool.  Although a batch mode is
available, @value{GDBN}'s primary role is to interact with a human
programmer.

@value{GDBN} should be responsive to the user.  A programmer hot on
the trail of a nasty bug, and operating under a looming deadline, is
going to be very impatient of everything, including the response time
to debugger commands.

@value{GDBN} should be relatively permissive, such as for expressions.
While the compiler should be picky (or have the option to be made
picky), since source code lives for a long time usually, the
programmer doing debugging shouldn't be spending time figuring out to
mollify the debugger.

@value{GDBN} will be called upon to deal with really large programs.
Executable sizes of 50 to 100 megabytes occur regularly, and we've
heard reports of programs approaching 1 gigabyte in size.

@value{GDBN} should be able to run everywhere.  No other debugger is
available for even half as many configurations as @value{GDBN}
supports.

@node Contributors
@section Contributors

The first edition of this document was written by John Gilmore of
Cygnus Solutions. The current second edition was written by Stan Shebs
of Cygnus Solutions, who continues to update the manual.

Over the years, many others have made additions and changes to this
document. This section attempts to record the significant contributors
to that effort. One of the virtues of free software is that everyone
is free to contribute to it; with regret, we cannot actually
acknowledge everyone here.

@quotation
@emph{Plea:} This section has only been added relatively recently (four
years after publication of the second edition). Additions to this
section are particularly welcome.  If you or your friends (or enemies,
to be evenhanded) have been unfairly omitted from this list, we would
like to add your names!
@end quotation

A document such as this relies on being kept up to date by numerous
small updates by contributing engineers as they make changes to the
code base. The file @file{ChangeLog} in the @value{GDBN} distribution
approximates a blow-by-blow account. The most prolific contributors to
this important, but low profile task are Andrew Cagney (responsible
for over half the entries), Daniel Jacobowitz, Mark Kettenis, Jim
Blandy and Eli Zaretskii.

Eli Zaretskii and Daniel Jacobowitz wrote the sections documenting
watchpoints.

Jeremy Bennett updated the sections on initializing a new architecture
and register representation, and added the section on Frame Interpretation.


@node Overall Structure

@chapter Overall Structure

@value{GDBN} consists of three major subsystems: user interface,
symbol handling (the @dfn{symbol side}), and target system handling (the
@dfn{target side}).

The user interface consists of several actual interfaces, plus
supporting code.

The symbol side consists of object file readers, debugging info
interpreters, symbol table management, source language expression
parsing, type and value printing.

The target side consists of execution control, stack frame analysis, and
physical target manipulation.

The target side/symbol side division is not formal, and there are a
number of exceptions.  For instance, core file support involves symbolic
elements (the basic core file reader is in BFD) and target elements (it
supplies the contents of memory and the values of registers).  Instead,
this division is useful for understanding how the minor subsystems
should fit together.

@section The Symbol Side

The symbolic side of @value{GDBN} can be thought of as ``everything
you can do in @value{GDBN} without having a live program running''.
For instance, you can look at the types of variables, and evaluate
many kinds of expressions.

@section The Target Side

The target side of @value{GDBN} is the ``bits and bytes manipulator''.
Although it may make reference to symbolic info here and there, most
of the target side will run with only a stripped executable
available---or even no executable at all, in remote debugging cases.

Operations such as disassembly, stack frame crawls, and register
display, are able to work with no symbolic info at all.  In some cases,
such as disassembly, @value{GDBN} will use symbolic info to present addresses
relative to symbols rather than as raw numbers, but it will work either
way.

@section Configurations

@cindex host
@cindex target
@dfn{Host} refers to attributes of the system where @value{GDBN} runs.
@dfn{Target} refers to the system where the program being debugged
executes.  In most cases they are the same machine, in which case a
third type of @dfn{Native} attributes come into play.

Defines and include files needed to build on the host are host
support.  Examples are tty support, system defined types, host byte
order, host float format.  These are all calculated by @code{autoconf}
when the debugger is built.

Defines and information needed to handle the target format are target
dependent.  Examples are the stack frame format, instruction set,
breakpoint instruction, registers, and how to set up and tear down the stack
to call a function.

Information that is only needed when the host and target are the same,
is native dependent.  One example is Unix child process support; if the
host and target are not the same, calling @code{fork} to start the target
process is a bad idea.  The various macros needed for finding the
registers in the @code{upage}, running @code{ptrace}, and such are all
in the native-dependent files.

Another example of native-dependent code is support for features that
are really part of the target environment, but which require
@code{#include} files that are only available on the host system.  Core
file handling and @code{setjmp} handling are two common cases.

When you want to make @value{GDBN} work as the traditional native debugger
on a system, you will need to supply both target and native information.

@section Source Tree Structure
@cindex @value{GDBN} source tree structure

The @value{GDBN} source directory has a mostly flat structure---there
are only a few subdirectories.  A file's name usually gives a hint as
to what it does; for example, @file{stabsread.c} reads stabs,
@file{dwarf2read.c} reads @sc{DWARF 2}, etc.

Files that are related to some common task have names that share
common substrings.  For example, @file{*-thread.c} files deal with
debugging threads on various platforms; @file{*read.c} files deal with
reading various kinds of symbol and object files; @file{inf*.c} files
deal with direct control of the @dfn{inferior program} (@value{GDBN}
parlance for the program being debugged).

There are several dozens of files in the @file{*-tdep.c} family.
@samp{tdep} stands for @dfn{target-dependent code}---each of these
files implements debug support for a specific target architecture
(sparc, mips, etc).  Usually, only one of these will be used in a
specific @value{GDBN} configuration (sometimes two, closely related).

Similarly, there are many @file{*-nat.c} files, each one for native
debugging on a specific system (e.g., @file{sparc-linux-nat.c} is for
native debugging of Sparc machines running the Linux kernel).

The few subdirectories of the source tree are:

@table @file
@item cli
Code that implements @dfn{CLI}, the @value{GDBN} Command-Line
Interpreter.  @xref{User Interface, Command Interpreter}.

@item gdbserver
Code for the @value{GDBN} remote server.

@item gdbtk
Code for Insight, the @value{GDBN} TK-based GUI front-end.

@item mi
The @dfn{GDB/MI}, the @value{GDBN} Machine Interface interpreter.

@item signals
Target signal translation code.

@item tui
Code for @dfn{TUI}, the @value{GDBN} Text-mode full-screen User
Interface.  @xref{User Interface, TUI}.
@end table

@node Algorithms

@chapter Algorithms
@cindex algorithms

@value{GDBN} uses a number of debugging-specific algorithms.  They are
often not very complicated, but get lost in the thicket of special
cases and real-world issues.  This chapter describes the basic
algorithms and mentions some of the specific target definitions that
they use.

@section Prologue Analysis

@cindex prologue analysis
@cindex call frame information
@cindex CFI (call frame information)
To produce a backtrace and allow the user to manipulate older frames'
variables and arguments, @value{GDBN} needs to find the base addresses
of older frames, and discover where those frames' registers have been
saved.  Since a frame's ``callee-saves'' registers get saved by
younger frames if and when they're reused, a frame's registers may be
scattered unpredictably across younger frames.  This means that
changing the value of a register-allocated variable in an older frame
may actually entail writing to a save slot in some younger frame.

Modern versions of GCC emit Dwarf call frame information (``CFI''),
which describes how to find frame base addresses and saved registers.
But CFI is not always available, so as a fallback @value{GDBN} uses a
technique called @dfn{prologue analysis} to find frame sizes and saved
registers.  A prologue analyzer disassembles the function's machine
code starting from its entry point, and looks for instructions that
allocate frame space, save the stack pointer in a frame pointer
register, save registers, and so on.  Obviously, this can't be done
accurately in general, but it's tractable to do well enough to be very
helpful.  Prologue analysis predates the GNU toolchain's support for
CFI; at one time, prologue analysis was the only mechanism
@value{GDBN} used for stack unwinding at all, when the function
calling conventions didn't specify a fixed frame layout.

In the olden days, function prologues were generated by hand-written,
target-specific code in GCC, and treated as opaque and untouchable by
optimizers.  Looking at this code, it was usually straightforward to
write a prologue analyzer for @value{GDBN} that would accurately
understand all the prologues GCC would generate.  However, over time
GCC became more aggressive about instruction scheduling, and began to
understand more about the semantics of the prologue instructions
themselves; in response, @value{GDBN}'s analyzers became more complex
and fragile.  Keeping the prologue analyzers working as GCC (and the
instruction sets themselves) evolved became a substantial task.

@cindex @file{prologue-value.c}
@cindex abstract interpretation of function prologues
@cindex pseudo-evaluation of function prologues
To try to address this problem, the code in @file{prologue-value.h}
and @file{prologue-value.c} provides a general framework for writing
prologue analyzers that are simpler and more robust than ad-hoc
analyzers.  When we analyze a prologue using the prologue-value
framework, we're really doing ``abstract interpretation'' or
``pseudo-evaluation'': running the function's code in simulation, but
using conservative approximations of the values registers and memory
would hold when the code actually runs.  For example, if our function
starts with the instruction:

@example
addi r1, 42     # add 42 to r1
@end example
@noindent
we don't know exactly what value will be in @code{r1} after executing
this instruction, but we do know it'll be 42 greater than its original
value.

If we then see an instruction like:

@example
addi r1, 22     # add 22 to r1
@end example
@noindent
we still don't know what @code{r1's} value is, but again, we can say
it is now 64 greater than its original value.

If the next instruction were:

@example
mov r2, r1      # set r2 to r1's value
@end example
@noindent
then we can say that @code{r2's} value is now the original value of
@code{r1} plus 64.

It's common for prologues to save registers on the stack, so we'll
need to track the values of stack frame slots, as well as the
registers.  So after an instruction like this:

@example
mov (fp+4), r2
@end example
@noindent
then we'd know that the stack slot four bytes above the frame pointer
holds the original value of @code{r1} plus 64.

And so on.

Of course, this can only go so far before it gets unreasonable.  If we
wanted to be able to say anything about the value of @code{r1} after
the instruction:

@example
xor r1, r3      # exclusive-or r1 and r3, place result in r1
@end example
@noindent
then things would get pretty complex.  But remember, we're just doing
a conservative approximation; if exclusive-or instructions aren't
relevant to prologues, we can just say @code{r1}'s value is now
``unknown''.  We can ignore things that are too complex, if that loss of
information is acceptable for our application.

So when we say ``conservative approximation'' here, what we mean is an
approximation that is either accurate, or marked ``unknown'', but
never inaccurate.

Using this framework, a prologue analyzer is simply an interpreter for
machine code, but one that uses conservative approximations for the
contents of registers and memory instead of actual values.  Starting
from the function's entry point, you simulate instructions up to the
current PC, or an instruction that you don't know how to simulate.
Now you can examine the state of the registers and stack slots you've
kept track of.

@itemize @bullet

@item
To see how large your stack frame is, just check the value of the
stack pointer register; if it's the original value of the SP
minus a constant, then that constant is the stack frame's size.
If the SP's value has been marked as ``unknown'', then that means
the prologue has done something too complex for us to track, and
we don't know the frame size.

@item
To see where we've saved the previous frame's registers, we just
search the values we've tracked --- stack slots, usually, but
registers, too, if you want --- for something equal to the register's
original value.  If the calling conventions suggest a standard place
to save a given register, then we can check there first, but really,
anything that will get us back the original value will probably work.
@end itemize

This does take some work.  But prologue analyzers aren't
quick-and-simple pattern patching to recognize a few fixed prologue
forms any more; they're big, hairy functions.  Along with inferior
function calls, prologue analysis accounts for a substantial portion
of the time needed to stabilize a @value{GDBN} port.  So it's
worthwhile to look for an approach that will be easier to understand
and maintain.  In the approach described above:

@itemize @bullet

@item
It's easier to see that the analyzer is correct: you just see
whether the analyzer properly (albeit conservatively) simulates
the effect of each instruction.

@item
It's easier to extend the analyzer: you can add support for new
instructions, and know that you haven't broken anything that
wasn't already broken before.

@item
It's orthogonal: to gather new information, you don't need to
complicate the code for each instruction.  As long as your domain
of conservative values is already detailed enough to tell you
what you need, then all the existing instruction simulations are
already gathering the right data for you.

@end itemize

The file @file{prologue-value.h} contains detailed comments explaining
the framework and how to use it.


@section Breakpoint Handling

@cindex breakpoints
In general, a breakpoint is a user-designated location in the program
where the user wants to regain control if program execution ever reaches
that location.

There are two main ways to implement breakpoints; either as ``hardware''
breakpoints or as ``software'' breakpoints.

@cindex hardware breakpoints
@cindex program counter
Hardware breakpoints are sometimes available as a builtin debugging
features with some chips.  Typically these work by having dedicated
register into which the breakpoint address may be stored.  If the PC
(shorthand for @dfn{program counter})
ever matches a value in a breakpoint registers, the CPU raises an
exception and reports it to @value{GDBN}.

Another possibility is when an emulator is in use; many emulators
include circuitry that watches the address lines coming out from the
processor, and force it to stop if the address matches a breakpoint's
address.

A third possibility is that the target already has the ability to do
breakpoints somehow; for instance, a ROM monitor may do its own
software breakpoints.  So although these are not literally ``hardware
breakpoints'', from @value{GDBN}'s point of view they work the same;
@value{GDBN} need not do anything more than set the breakpoint and wait
for something to happen.

Since they depend on hardware resources, hardware breakpoints may be
limited in number; when the user asks for more, @value{GDBN} will
start trying to set software breakpoints.  (On some architectures,
notably the 32-bit x86 platforms, @value{GDBN} cannot always know
whether there's enough hardware resources to insert all the hardware
breakpoints and watchpoints.  On those platforms, @value{GDBN} prints
an error message only when the program being debugged is continued.)

@cindex software breakpoints
Software breakpoints require @value{GDBN} to do somewhat more work.
The basic theory is that @value{GDBN} will replace a program
instruction with a trap, illegal divide, or some other instruction
that will cause an exception, and then when it's encountered,
@value{GDBN} will take the exception and stop the program.  When the
user says to continue, @value{GDBN} will restore the original
instruction, single-step, re-insert the trap, and continue on.

Since it literally overwrites the program being tested, the program area
must be writable, so this technique won't work on programs in ROM.  It
can also distort the behavior of programs that examine themselves,
although such a situation would be highly unusual.

Also, the software breakpoint instruction should be the smallest size of
instruction, so it doesn't overwrite an instruction that might be a jump
target, and cause disaster when the program jumps into the middle of the
breakpoint instruction.  (Strictly speaking, the breakpoint must be no
larger than the smallest interval between instructions that may be jump
targets; perhaps there is an architecture where only even-numbered
instructions may jumped to.)  Note that it's possible for an instruction
set not to have any instructions usable for a software breakpoint,
although in practice only the ARC has failed to define such an
instruction.

Basic breakpoint object handling is in @file{breakpoint.c}.  However,
much of the interesting breakpoint action is in @file{infrun.c}.

@table @code
@cindex insert or remove software breakpoint
@findex target_remove_breakpoint
@findex target_insert_breakpoint
@item target_remove_breakpoint (@var{bp_tgt})
@itemx target_insert_breakpoint (@var{bp_tgt})
Insert or remove a software breakpoint at address
@code{@var{bp_tgt}->placed_address}.  Returns zero for success,
non-zero for failure.  On input, @var{bp_tgt} contains the address of the
breakpoint, and is otherwise initialized to zero.  The fields of the
@code{struct bp_target_info} pointed to by @var{bp_tgt} are updated
to contain other information about the breakpoint on output.  The field
@code{placed_address} may be updated if the breakpoint was placed at a
related address; the field @code{shadow_contents} contains the real
contents of the bytes where the breakpoint has been inserted,
if reading memory would return the breakpoint instead of the
underlying memory; the field @code{shadow_len} is the length of
memory cached in @code{shadow_contents}, if any; and the field
@code{placed_size} is optionally set and used by the target, if
it could differ from @code{shadow_len}.

For example, the remote target @samp{Z0} packet does not require
shadowing memory, so @code{shadow_len} is left at zero.  However,
the length reported by @code{gdbarch_breakpoint_from_pc} is cached in
@code{placed_size}, so that a matching @samp{z0} packet can be
used to remove the breakpoint.

@cindex insert or remove hardware breakpoint
@findex target_remove_hw_breakpoint
@findex target_insert_hw_breakpoint
@item target_remove_hw_breakpoint (@var{bp_tgt})
@itemx target_insert_hw_breakpoint (@var{bp_tgt})
Insert or remove a hardware-assisted breakpoint at address
@code{@var{bp_tgt}->placed_address}.  Returns zero for success,
non-zero for failure.  See @code{target_insert_breakpoint} for
a description of the @code{struct bp_target_info} pointed to by
@var{bp_tgt}; the @code{shadow_contents} and
@code{shadow_len} members are not used for hardware breakpoints,
but @code{placed_size} may be.
@end table

@section Single Stepping

@section Signal Handling

@section Thread Handling

@section Inferior Function Calls

@section Longjmp Support

@cindex @code{longjmp} debugging
@value{GDBN} has support for figuring out that the target is doing a
@code{longjmp} and for stopping at the target of the jump, if we are
stepping.  This is done with a few specialized internal breakpoints,
which are visible in the output of the @samp{maint info breakpoint}
command.

@findex gdbarch_get_longjmp_target
To make this work, you need to define a function called
@code{gdbarch_get_longjmp_target}, which will examine the
@code{jmp_buf} structure and extract the @code{longjmp} target address.
Since @code{jmp_buf} is target specific and typically defined in a
target header not available to @value{GDBN}, you will need to
determine the offset of the PC manually and return that; many targets
define a @code{jb_pc_offset} field in the tdep structure to save the
value once calculated.

@section Watchpoints
@cindex watchpoints

Watchpoints are a special kind of breakpoints (@pxref{Algorithms,
breakpoints}) which break when data is accessed rather than when some
instruction is executed.  When you have data which changes without
your knowing what code does that, watchpoints are the silver bullet to
hunt down and kill such bugs.

@cindex hardware watchpoints
@cindex software watchpoints
Watchpoints can be either hardware-assisted or not; the latter type is
known as ``software watchpoints.''  @value{GDBN} always uses
hardware-assisted watchpoints if they are available, and falls back on
software watchpoints otherwise.  Typical situations where @value{GDBN}
will use software watchpoints are:

@itemize @bullet
@item
The watched memory region is too large for the underlying hardware
watchpoint support.  For example, each x86 debug register can watch up
to 4 bytes of memory, so trying to watch data structures whose size is
more than 16 bytes will cause @value{GDBN} to use software
watchpoints.

@item
The value of the expression to be watched depends on data held in
registers (as opposed to memory).

@item
Too many different watchpoints requested.  (On some architectures,
this situation is impossible to detect until the debugged program is
resumed.)  Note that x86 debug registers are used both for hardware
breakpoints and for watchpoints, so setting too many hardware
breakpoints might cause watchpoint insertion to fail.

@item
No hardware-assisted watchpoints provided by the target
implementation.
@end itemize

Software watchpoints are very slow, since @value{GDBN} needs to
single-step the program being debugged and test the value of the
watched expression(s) after each instruction.  The rest of this
section is mostly irrelevant for software watchpoints.

When the inferior stops, @value{GDBN} tries to establish, among other
possible reasons, whether it stopped due to a watchpoint being hit.
It first uses @code{STOPPED_BY_WATCHPOINT} to see if any watchpoint
was hit.  If not, all watchpoint checking is skipped.

Then @value{GDBN} calls @code{target_stopped_data_address} exactly
once.  This method returns the address of the watchpoint which
triggered, if the target can determine it.  If the triggered address
is available, @value{GDBN} compares the address returned by this
method with each watched memory address in each active watchpoint.
For data-read and data-access watchpoints, @value{GDBN} announces
every watchpoint that watches the triggered address as being hit.
For this reason, data-read and data-access watchpoints
@emph{require} that the triggered address be available; if not, read
and access watchpoints will never be considered hit.  For data-write
watchpoints, if the triggered address is available, @value{GDBN}
considers only those watchpoints which match that address;
otherwise, @value{GDBN} considers all data-write watchpoints.  For
each data-write watchpoint that @value{GDBN} considers, it evaluates
the expression whose value is being watched, and tests whether the
watched value has changed.  Watchpoints whose watched values have
changed are announced as hit.

@c FIXME move these to the main lists of target/native defns

@value{GDBN} uses several macros and primitives to support hardware
watchpoints:

@table @code
@findex TARGET_CAN_USE_HARDWARE_WATCHPOINT
@item TARGET_CAN_USE_HARDWARE_WATCHPOINT (@var{type}, @var{count}, @var{other})
Return the number of hardware watchpoints of type @var{type} that are
possible to be set.  The value is positive if @var{count} watchpoints
of this type can be set, zero if setting watchpoints of this type is
not supported, and negative if @var{count} is more than the maximum
number of watchpoints of type @var{type} that can be set.  @var{other}
is non-zero if other types of watchpoints are currently enabled (there
are architectures which cannot set watchpoints of different types at
the same time).

@findex TARGET_REGION_OK_FOR_HW_WATCHPOINT
@item TARGET_REGION_OK_FOR_HW_WATCHPOINT (@var{addr}, @var{len})
Return non-zero if hardware watchpoints can be used to watch a region
whose address is @var{addr} and whose length in bytes is @var{len}.

@cindex insert or remove hardware watchpoint
@findex target_insert_watchpoint
@findex target_remove_watchpoint
@item target_insert_watchpoint (@var{addr}, @var{len}, @var{type})
@itemx target_remove_watchpoint (@var{addr}, @var{len}, @var{type})
Insert or remove a hardware watchpoint starting at @var{addr}, for
@var{len} bytes.  @var{type} is the watchpoint type, one of the
possible values of the enumerated data type @code{target_hw_bp_type},
defined by @file{breakpoint.h} as follows:

@smallexample
 enum target_hw_bp_type
   @{
     hw_write   = 0, /* Common (write) HW watchpoint */
     hw_read    = 1, /* Read    HW watchpoint */
     hw_access  = 2, /* Access (read or write) HW watchpoint */
     hw_execute = 3  /* Execute HW breakpoint */
   @};
@end smallexample

@noindent
These two macros should return 0 for success, non-zero for failure.

@findex target_stopped_data_address
@item target_stopped_data_address (@var{addr_p})
If the inferior has some watchpoint that triggered, place the address
associated with the watchpoint at the location pointed to by
@var{addr_p} and return non-zero.  Otherwise, return zero.  This
is required for data-read and data-access watchpoints.  It is
not required for data-write watchpoints, but @value{GDBN} uses
it to improve handling of those also.

@value{GDBN} will only call this method once per watchpoint stop,
immediately after calling @code{STOPPED_BY_WATCHPOINT}.  If the
target's watchpoint indication is sticky, i.e., stays set after
resuming, this method should clear it.  For instance, the x86 debug
control register has sticky triggered flags.

@findex target_watchpoint_addr_within_range
@item target_watchpoint_addr_within_range (@var{target}, @var{addr}, @var{start}, @var{length})
Check whether @var{addr} (as returned by @code{target_stopped_data_address})
lies within the hardware-defined watchpoint region described by
@var{start} and @var{length}.  This only needs to be provided if the
granularity of a watchpoint is greater than one byte, i.e., if the
watchpoint can also trigger on nearby addresses outside of the watched
region.

@findex HAVE_STEPPABLE_WATCHPOINT
@item HAVE_STEPPABLE_WATCHPOINT
If defined to a non-zero value, it is not necessary to disable a
watchpoint to step over it.  Like @code{gdbarch_have_nonsteppable_watchpoint},
this is usually set when watchpoints trigger at the instruction
which will perform an interesting read or write.  It should be
set if there is a temporary disable bit which allows the processor
to step over the interesting instruction without raising the
watchpoint exception again.

@findex gdbarch_have_nonsteppable_watchpoint 
@item int gdbarch_have_nonsteppable_watchpoint (@var{gdbarch})
If it returns a non-zero value, @value{GDBN} should disable a
watchpoint to step the inferior over it.  This is usually set when
watchpoints trigger at the instruction which will perform an
interesting read or write.

@findex HAVE_CONTINUABLE_WATCHPOINT
@item HAVE_CONTINUABLE_WATCHPOINT
If defined to a non-zero value, it is possible to continue the
inferior after a watchpoint has been hit.  This is usually set
when watchpoints trigger at the instruction following an interesting
read or write.

@findex STOPPED_BY_WATCHPOINT
@item STOPPED_BY_WATCHPOINT (@var{wait_status})
Return non-zero if stopped by a watchpoint.  @var{wait_status} is of
the type @code{struct target_waitstatus}, defined by @file{target.h}.
Normally, this macro is defined to invoke the function pointed to by
the @code{to_stopped_by_watchpoint} member of the structure (of the
type @code{target_ops}, defined on @file{target.h}) that describes the
target-specific operations; @code{to_stopped_by_watchpoint} ignores
the @var{wait_status} argument.

@value{GDBN} does not require the non-zero value returned by
@code{STOPPED_BY_WATCHPOINT} to be 100% correct, so if a target cannot
determine for sure whether the inferior stopped due to a watchpoint,
it could return non-zero ``just in case''.
@end table

@subsection Watchpoints and Threads
@cindex watchpoints, with threads

@value{GDBN} only supports process-wide watchpoints, which trigger
in all threads.  @value{GDBN} uses the thread ID to make watchpoints
act as if they were thread-specific, but it cannot set hardware
watchpoints that only trigger in a specific thread.  Therefore, even
if the target supports threads, per-thread debug registers, and
watchpoints which only affect a single thread, it should set the
per-thread debug registers for all threads to the same value.  On
@sc{gnu}/Linux native targets, this is accomplished by using
@code{ALL_LWPS} in @code{target_insert_watchpoint} and
@code{target_remove_watchpoint} and by using
@code{linux_set_new_thread} to register a handler for newly created
threads.

@value{GDBN}'s @sc{gnu}/Linux support only reports a single event
at a time, although multiple events can trigger simultaneously for
multi-threaded programs.  When multiple events occur, @file{linux-nat.c}
queues subsequent events and returns them the next time the program
is resumed.  This means that @code{STOPPED_BY_WATCHPOINT} and
@code{target_stopped_data_address} only need to consult the current
thread's state---the thread indicated by @code{inferior_ptid}.  If
two threads have hit watchpoints simultaneously, those routines
will be called a second time for the second thread.

@subsection x86 Watchpoints
@cindex x86 debug registers
@cindex watchpoints, on x86

The 32-bit Intel x86 (a.k.a.@: ia32) processors feature special debug
registers designed to facilitate debugging.  @value{GDBN} provides a
generic library of functions that x86-based ports can use to implement
support for watchpoints and hardware-assisted breakpoints.  This
subsection documents the x86 watchpoint facilities in @value{GDBN}.

(At present, the library functions read and write debug registers directly, and are
thus only available for native configurations.)

To use the generic x86 watchpoint support, a port should do the
following:

@itemize @bullet
@findex I386_USE_GENERIC_WATCHPOINTS
@item
Define the macro @code{I386_USE_GENERIC_WATCHPOINTS} somewhere in the
target-dependent headers.

@item
Include the @file{config/i386/nm-i386.h} header file @emph{after}
defining @code{I386_USE_GENERIC_WATCHPOINTS}.

@item
Add @file{i386-nat.o} to the value of the Make variable
@code{NATDEPFILES} (@pxref{Native Debugging, NATDEPFILES}).

@item
Provide implementations for the @code{I386_DR_LOW_*} macros described
below.  Typically, each macro should call a target-specific function
which does the real work.
@end itemize

The x86 watchpoint support works by maintaining mirror images of the
debug registers.  Values are copied between the mirror images and the
real debug registers via a set of macros which each target needs to
provide:

@table @code
@findex I386_DR_LOW_SET_CONTROL
@item I386_DR_LOW_SET_CONTROL (@var{val})
Set the Debug Control (DR7) register to the value @var{val}.

@findex I386_DR_LOW_SET_ADDR
@item I386_DR_LOW_SET_ADDR (@var{idx}, @var{addr})
Put the address @var{addr} into the debug register number @var{idx}.

@findex I386_DR_LOW_RESET_ADDR
@item I386_DR_LOW_RESET_ADDR (@var{idx})
Reset (i.e.@: zero out) the address stored in the debug register
number @var{idx}.

@findex I386_DR_LOW_GET_STATUS
@item I386_DR_LOW_GET_STATUS
Return the value of the Debug Status (DR6) register.  This value is
used immediately after it is returned by
@code{I386_DR_LOW_GET_STATUS}, so as to support per-thread status
register values.
@end table

For each one of the 4 debug registers (whose indices are from 0 to 3)
that store addresses, a reference count is maintained by @value{GDBN},
to allow sharing of debug registers by several watchpoints.  This
allows users to define several watchpoints that watch the same
expression, but with different conditions and/or commands, without
wasting debug registers which are in short supply.  @value{GDBN}
maintains the reference counts internally, targets don't have to do
anything to use this feature.

The x86 debug registers can each watch a region that is 1, 2, or 4
bytes long.  The ia32 architecture requires that each watched region
be appropriately aligned: 2-byte region on 2-byte boundary, 4-byte
region on 4-byte boundary.  However, the x86 watchpoint support in
@value{GDBN} can watch unaligned regions and regions larger than 4
bytes (up to 16 bytes) by allocating several debug registers to watch
a single region.  This allocation of several registers per a watched
region is also done automatically without target code intervention.

The generic x86 watchpoint support provides the following API for the
@value{GDBN}'s application code:

@table @code
@findex i386_region_ok_for_watchpoint
@item i386_region_ok_for_watchpoint (@var{addr}, @var{len})
The macro @code{TARGET_REGION_OK_FOR_HW_WATCHPOINT} is set to call
this function.  It counts the number of debug registers required to
watch a given region, and returns a non-zero value if that number is
less than 4, the number of debug registers available to x86
processors.

@findex i386_stopped_data_address
@item i386_stopped_data_address (@var{addr_p})
The target function
@code{target_stopped_data_address} is set to call this function.
This
function examines the breakpoint condition bits in the DR6 Debug
Status register, as returned by the @code{I386_DR_LOW_GET_STATUS}
macro, and returns the address associated with the first bit that is
set in DR6.

@findex i386_stopped_by_watchpoint
@item i386_stopped_by_watchpoint (void)
The macro @code{STOPPED_BY_WATCHPOINT}
is set to call this function.  The
argument passed to @code{STOPPED_BY_WATCHPOINT} is ignored.  This
function examines the breakpoint condition bits in the DR6 Debug
Status register, as returned by the @code{I386_DR_LOW_GET_STATUS}
macro, and returns true if any bit is set.  Otherwise, false is
returned.

@findex i386_insert_watchpoint
@findex i386_remove_watchpoint
@item i386_insert_watchpoint (@var{addr}, @var{len}, @var{type})
@itemx i386_remove_watchpoint (@var{addr}, @var{len}, @var{type})
Insert or remove a watchpoint.  The macros
@code{target_insert_watchpoint} and @code{target_remove_watchpoint}
are set to call these functions.  @code{i386_insert_watchpoint} first
looks for a debug register which is already set to watch the same
region for the same access types; if found, it just increments the
reference count of that debug register, thus implementing debug
register sharing between watchpoints.  If no such register is found,
the function looks for a vacant debug register, sets its mirrored
value to @var{addr}, sets the mirrored value of DR7 Debug Control
register as appropriate for the @var{len} and @var{type} parameters,
and then passes the new values of the debug register and DR7 to the
inferior by calling @code{I386_DR_LOW_SET_ADDR} and
@code{I386_DR_LOW_SET_CONTROL}.  If more than one debug register is
required to cover the given region, the above process is repeated for
each debug register.

@code{i386_remove_watchpoint} does the opposite: it resets the address
in the mirrored value of the debug register and its read/write and
length bits in the mirrored value of DR7, then passes these new
values to the inferior via @code{I386_DR_LOW_RESET_ADDR} and
@code{I386_DR_LOW_SET_CONTROL}.  If a register is shared by several
watchpoints, each time a @code{i386_remove_watchpoint} is called, it
decrements the reference count, and only calls
@code{I386_DR_LOW_RESET_ADDR} and @code{I386_DR_LOW_SET_CONTROL} when
the count goes to zero.

@findex i386_insert_hw_breakpoint
@findex i386_remove_hw_breakpoint
@item i386_insert_hw_breakpoint (@var{bp_tgt})
@itemx i386_remove_hw_breakpoint (@var{bp_tgt})
These functions insert and remove hardware-assisted breakpoints.  The
macros @code{target_insert_hw_breakpoint} and
@code{target_remove_hw_breakpoint} are set to call these functions.
The argument is a @code{struct bp_target_info *}, as described in
the documentation for @code{target_insert_breakpoint}.
These functions work like @code{i386_insert_watchpoint} and
@code{i386_remove_watchpoint}, respectively, except that they set up
the debug registers to watch instruction execution, and each
hardware-assisted breakpoint always requires exactly one debug
register.

@findex i386_cleanup_dregs
@item i386_cleanup_dregs (void)
This function clears all the reference counts, addresses, and control
bits in the mirror images of the debug registers.  It doesn't affect
the actual debug registers in the inferior process.
@end table

@noindent
@strong{Notes:}
@enumerate 1
@item
x86 processors support setting watchpoints on I/O reads or writes.
However, since no target supports this (as of March 2001), and since
@code{enum target_hw_bp_type} doesn't even have an enumeration for I/O
watchpoints, this feature is not yet available to @value{GDBN} running
on x86.

@item
x86 processors can enable watchpoints locally, for the current task
only, or globally, for all the tasks.  For each debug register,
there's a bit in the DR7 Debug Control register that determines
whether the associated address is watched locally or globally.  The
current implementation of x86 watchpoint support in @value{GDBN}
always sets watchpoints to be locally enabled, since global
watchpoints might interfere with the underlying OS and are probably
unavailable in many platforms.
@end enumerate

@section Checkpoints
@cindex checkpoints
@cindex restart
In the abstract, a checkpoint is a point in the execution history of
the program, which the user may wish to return to at some later time.

Internally, a checkpoint is a saved copy of the program state, including
whatever information is required in order to restore the program to that
state at a later time.  This can be expected to include the state of 
registers and memory, and may include external state such as the state
of open files and devices.

There are a number of ways in which checkpoints may be implemented
in gdb, e.g.@: as corefiles, as forked processes, and as some opaque
method implemented on the target side.

A corefile can be used to save an image of target memory and register
state, which can in principle be restored later --- but corefiles do
not typically include information about external entities such as 
open files.  Currently this method is not implemented in gdb.

A forked process can save the state of user memory and registers, 
as well as some subset of external (kernel) state.  This method 
is used to implement checkpoints on Linux, and in principle might
be used on other systems.

Some targets, e.g.@: simulators, might have their own built-in 
method for saving checkpoints, and gdb might be able to take
advantage of that capability without necessarily knowing any
details of how it is done.


@section Observing changes in @value{GDBN} internals
@cindex observer pattern interface
@cindex notifications about changes in internals

In order to function properly, several modules need to be notified when
some changes occur in the @value{GDBN} internals.  Traditionally, these
modules have relied on several paradigms, the most common ones being
hooks and gdb-events.  Unfortunately, none of these paradigms was
versatile enough to become the standard notification mechanism in
@value{GDBN}.  The fact that they only supported one ``client'' was also
a strong limitation.

A new paradigm, based on the Observer pattern of the @cite{Design
Patterns} book, has therefore been implemented.  The goal was to provide
a new interface overcoming the issues with the notification mechanisms
previously available.  This new interface needed to be strongly typed,
easy to extend, and versatile enough to be used as the standard
interface when adding new notifications.

See @ref{GDB Observers} for a brief description of the observers
currently implemented in GDB. The rationale for the current
implementation is also briefly discussed.

@node User Interface

@chapter User Interface

@value{GDBN} has several user interfaces, of which the traditional
command-line interface is perhaps the most familiar.

@section Command Interpreter

@cindex command interpreter
@cindex CLI
The command interpreter in @value{GDBN} is fairly simple.  It is designed to
allow for the set of commands to be augmented dynamically, and also
has a recursive subcommand capability, where the first argument to
a command may itself direct a lookup on a different command list.

For instance, the @samp{set} command just starts a lookup on the
@code{setlist} command list, while @samp{set thread} recurses
to the @code{set_thread_cmd_list}.

@findex add_cmd
@findex add_com
To add commands in general, use @code{add_cmd}.  @code{add_com} adds to
the main command list, and should be used for those commands.  The usual
place to add commands is in the @code{_initialize_@var{xyz}} routines at
the ends of most source files.

@findex add_setshow_cmd
@findex add_setshow_cmd_full
To add paired @samp{set} and @samp{show} commands, use
@code{add_setshow_cmd} or @code{add_setshow_cmd_full}.  The former is
a slightly simpler interface which is useful when you don't need to
further modify the new command structures, while the latter returns
the new command structures for manipulation.

@cindex deprecating commands
@findex deprecate_cmd
Before removing commands from the command set it is a good idea to
deprecate them for some time.  Use @code{deprecate_cmd} on commands or
aliases to set the deprecated flag.  @code{deprecate_cmd} takes a
@code{struct cmd_list_element} as it's first argument.  You can use the
return value from @code{add_com} or @code{add_cmd} to deprecate the
command immediately after it is created.

The first time a command is used the user will be warned and offered a
replacement (if one exists). Note that the replacement string passed to
@code{deprecate_cmd} should be the full name of the command, i.e., the
entire string the user should type at the command line.

@anchor{UI-Independent Output}
@section UI-Independent Output---the @code{ui_out} Functions
@c This section is based on the documentation written by Fernando
@c Nasser <fnasser@redhat.com>.

@cindex @code{ui_out} functions
The @code{ui_out} functions present an abstraction level for the
@value{GDBN} output code.  They hide the specifics of different user
interfaces supported by @value{GDBN}, and thus free the programmer
from the need to write several versions of the same code, one each for
every UI, to produce output.

@subsection Overview and Terminology

In general, execution of each @value{GDBN} command produces some sort
of output, and can even generate an input request.

Output can be generated for the following purposes:

@itemize @bullet
@item
to display a @emph{result} of an operation;

@item
to convey @emph{info} or produce side-effects of a requested
operation;

@item
to provide a @emph{notification} of an asynchronous event (including
progress indication of a prolonged asynchronous operation);

@item
to display @emph{error messages} (including warnings);

@item
to show @emph{debug data};

@item
to @emph{query} or prompt a user for input (a special case).
@end itemize

@noindent
This section mainly concentrates on how to build result output,
although some of it also applies to other kinds of output.

Generation of output that displays the results of an operation
involves one or more of the following:

@itemize @bullet
@item
output of the actual data

@item
formatting the output as appropriate for console output, to make it
easily readable by humans

@item
machine oriented formatting--a more terse formatting to allow for easy
parsing by programs which read @value{GDBN}'s output

@item
annotation, whose purpose is to help legacy GUIs to identify interesting
parts in the output
@end itemize

The @code{ui_out} routines take care of the first three aspects.
Annotations are provided by separate annotation routines.  Note that use
of annotations for an interface between a GUI and @value{GDBN} is
deprecated.

Output can be in the form of a single item, which we call a @dfn{field};
a @dfn{list} consisting of identical fields; a @dfn{tuple} consisting of
non-identical fields; or a @dfn{table}, which is a tuple consisting of a
header and a body.  In a BNF-like form:

@table @code
@item <table> @expansion{}
@code{<header> <body>}
@item <header> @expansion{}
@code{@{ <column> @}}
@item <column> @expansion{}
@code{<width> <alignment> <title>}
@item <body> @expansion{}
@code{@{<row>@}}
@end table


@subsection General Conventions

Most @code{ui_out} routines are of type @code{void}, the exceptions are
@code{ui_out_stream_new} (which returns a pointer to the newly created
object) and the @code{make_cleanup} routines.

The first parameter is always the @code{ui_out} vector object, a pointer
to a @code{struct ui_out}.

The @var{format} parameter is like in @code{printf} family of functions.
When it is present, there must also be a variable list of arguments
sufficient used to satisfy the @code{%} specifiers in the supplied
format.

When a character string argument is not used in a @code{ui_out} function
call, a @code{NULL} pointer has to be supplied instead.


@subsection Table, Tuple and List Functions

@cindex list output functions
@cindex table output functions
@cindex tuple output functions
This section introduces @code{ui_out} routines for building lists,
tuples and tables.  The routines to output the actual data items
(fields) are presented in the next section.

To recap: A @dfn{tuple} is a sequence of @dfn{fields}, each field
containing information about an object; a @dfn{list} is a sequence of
fields where each field describes an identical object.

Use the @dfn{table} functions when your output consists of a list of
rows (tuples) and the console output should include a heading.  Use this
even when you are listing just one object but you still want the header.

@cindex nesting level in @code{ui_out} functions
Tables can not be nested.  Tuples and lists can be nested up to a
maximum of five levels.

The overall structure of the table output code is something like this:

@smallexample
  ui_out_table_begin
    ui_out_table_header
    @dots{}
    ui_out_table_body
      ui_out_tuple_begin
        ui_out_field_*
        @dots{}
      ui_out_tuple_end
      @dots{}
  ui_out_table_end
@end smallexample

Here is the description of table-, tuple- and list-related @code{ui_out}
functions:

@deftypefun void ui_out_table_begin (struct ui_out *@var{uiout}, int @var{nbrofcols}, int @var{nr_rows}, const char *@var{tblid})
The function @code{ui_out_table_begin} marks the beginning of the output
of a table.  It should always be called before any other @code{ui_out}
function for a given table.  @var{nbrofcols} is the number of columns in
the table. @var{nr_rows} is the number of rows in the table.
@var{tblid} is an optional string identifying the table.  The string
pointed to by @var{tblid} is copied by the implementation of
@code{ui_out_table_begin}, so the application can free the string if it
was @code{malloc}ed.

The companion function @code{ui_out_table_end}, described below, marks
the end of the table's output.
@end deftypefun

@deftypefun void ui_out_table_header (struct ui_out *@var{uiout}, int @var{width}, enum ui_align @var{alignment}, const char *@var{colhdr})
@code{ui_out_table_header} provides the header information for a single
table column.  You call this function several times, one each for every
column of the table, after @code{ui_out_table_begin}, but before
@code{ui_out_table_body}.

The value of @var{width} gives the column width in characters.  The
value of @var{alignment} is one of @code{left}, @code{center}, and
@code{right}, and it specifies how to align the header: left-justify,
center, or right-justify it.  @var{colhdr} points to a string that
specifies the column header; the implementation copies that string, so
column header strings in @code{malloc}ed storage can be freed after the
call.
@end deftypefun

@deftypefun void ui_out_table_body (struct ui_out *@var{uiout})
This function delimits the table header from the table body.
@end deftypefun

@deftypefun void ui_out_table_end (struct ui_out *@var{uiout})
This function signals the end of a table's output.  It should be called
after the table body has been produced by the list and field output
functions.

There should be exactly one call to @code{ui_out_table_end} for each
call to @code{ui_out_table_begin}, otherwise the @code{ui_out} functions
will signal an internal error.
@end deftypefun

The output of the tuples that represent the table rows must follow the
call to @code{ui_out_table_body} and precede the call to
@code{ui_out_table_end}.  You build a tuple by calling
@code{ui_out_tuple_begin} and @code{ui_out_tuple_end}, with suitable
calls to functions which actually output fields between them.

@deftypefun void ui_out_tuple_begin (struct ui_out *@var{uiout}, const char *@var{id})
This function marks the beginning of a tuple output.  @var{id} points
to an optional string that identifies the tuple; it is copied by the
implementation, and so strings in @code{malloc}ed storage can be freed
after the call.
@end deftypefun

@deftypefun void ui_out_tuple_end (struct ui_out *@var{uiout})
This function signals an end of a tuple output.  There should be exactly
one call to @code{ui_out_tuple_end} for each call to
@code{ui_out_tuple_begin}, otherwise an internal @value{GDBN} error will
be signaled.
@end deftypefun

@deftypefun {struct cleanup *} make_cleanup_ui_out_tuple_begin_end (struct ui_out *@var{uiout}, const char *@var{id})
This function first opens the tuple and then establishes a cleanup
(@pxref{Misc Guidelines, Cleanups}) to close the tuple.
It provides a convenient and correct implementation of the
non-portable@footnote{The function cast is not portable ISO C.} code sequence:
@smallexample
struct cleanup *old_cleanup;
ui_out_tuple_begin (uiout, "...");
old_cleanup = make_cleanup ((void(*)(void *)) ui_out_tuple_end,
                            uiout);
@end smallexample
@end deftypefun

@deftypefun void ui_out_list_begin (struct ui_out *@var{uiout}, const char *@var{id})
This function marks the beginning of a list output.  @var{id} points to
an optional string that identifies the list; it is copied by the
implementation, and so strings in @code{malloc}ed storage can be freed
after the call.
@end deftypefun

@deftypefun void ui_out_list_end (struct ui_out *@var{uiout})
This function signals an end of a list output.  There should be exactly
one call to @code{ui_out_list_end} for each call to
@code{ui_out_list_begin}, otherwise an internal @value{GDBN} error will
be signaled.
@end deftypefun

@deftypefun {struct cleanup *} make_cleanup_ui_out_list_begin_end (struct ui_out *@var{uiout}, const char *@var{id})
Similar to @code{make_cleanup_ui_out_tuple_begin_end}, this function
opens a list and then establishes cleanup
(@pxref{Misc Guidelines, Cleanups})
that will close the list.
@end deftypefun

@subsection Item Output Functions

@cindex item output functions
@cindex field output functions
@cindex data output
The functions described below produce output for the actual data
items, or fields, which contain information about the object.

Choose the appropriate function accordingly to your particular needs.

@deftypefun void ui_out_field_fmt (struct ui_out *@var{uiout}, char *@var{fldname}, char *@var{format}, ...)
This is the most general output function.  It produces the
representation of the data in the variable-length argument list
according to formatting specifications in @var{format}, a
@code{printf}-like format string.  The optional argument @var{fldname}
supplies the name of the field.  The data items themselves are
supplied as additional arguments after @var{format}.

This generic function should be used only when it is not possible to
use one of the specialized versions (see below).
@end deftypefun

@deftypefun void ui_out_field_int (struct ui_out *@var{uiout}, const char *@var{fldname}, int @var{value})
This function outputs a value of an @code{int} variable.  It uses the
@code{"%d"} output conversion specification.  @var{fldname} specifies
the name of the field.
@end deftypefun

@deftypefun void ui_out_field_fmt_int (struct ui_out *@var{uiout}, int @var{width}, enum ui_align @var{alignment}, const char *@var{fldname}, int @var{value})
This function outputs a value of an @code{int} variable.  It differs from
@code{ui_out_field_int} in that the caller specifies the desired @var{width} and @var{alignment} of the output.
@var{fldname} specifies
the name of the field.
@end deftypefun

@deftypefun void ui_out_field_core_addr (struct ui_out *@var{uiout}, const char *@var{fldname}, struct gdbarch *@var{gdbarch}, CORE_ADDR @var{address})
This function outputs an address as appropriate for @var{gdbarch}.
@end deftypefun

@deftypefun void ui_out_field_string (struct ui_out *@var{uiout}, const char *@var{fldname}, const char *@var{string})
This function outputs a string using the @code{"%s"} conversion
specification.
@end deftypefun

Sometimes, there's a need to compose your output piece by piece using
functions that operate on a stream, such as @code{value_print} or
@code{fprintf_symbol_filtered}.  These functions accept an argument of
the type @code{struct ui_file *}, a pointer to a @code{ui_file} object
used to store the data stream used for the output.  When you use one
of these functions, you need a way to pass their results stored in a
@code{ui_file} object to the @code{ui_out} functions.  To this end,
you first create a @code{ui_stream} object by calling
@code{ui_out_stream_new}, pass the @code{stream} member of that
@code{ui_stream} object to @code{value_print} and similar functions,
and finally call @code{ui_out_field_stream} to output the field you
constructed.  When the @code{ui_stream} object is no longer needed,
you should destroy it and free its memory by calling
@code{ui_out_stream_delete}.

@deftypefun {struct ui_stream *} ui_out_stream_new (struct ui_out *@var{uiout})
This function creates a new @code{ui_stream} object which uses the
same output methods as the @code{ui_out} object whose pointer is
passed in @var{uiout}.  It returns a pointer to the newly created
@code{ui_stream} object.
@end deftypefun

@deftypefun void ui_out_stream_delete (struct ui_stream *@var{streambuf})
This functions destroys a @code{ui_stream} object specified by
@var{streambuf}.
@end deftypefun

@deftypefun void ui_out_field_stream (struct ui_out *@var{uiout}, const char *@var{fieldname}, struct ui_stream *@var{streambuf})
This function consumes all the data accumulated in
@code{streambuf->stream} and outputs it like
@code{ui_out_field_string} does.  After a call to
@code{ui_out_field_stream}, the accumulated data no longer exists, but
the stream is still valid and may be used for producing more fields.
@end deftypefun

@strong{Important:} If there is any chance that your code could bail
out before completing output generation and reaching the point where
@code{ui_out_stream_delete} is called, it is necessary to set up a
cleanup, to avoid leaking memory and other resources.  Here's a
skeleton code to do that:

@smallexample
 struct ui_stream *mybuf = ui_out_stream_new (uiout);
 struct cleanup *old = make_cleanup (ui_out_stream_delete, mybuf);
 ...
 do_cleanups (old);
@end smallexample

If the function already has the old cleanup chain set (for other kinds
of cleanups), you just have to add your cleanup to it:

@smallexample
  mybuf = ui_out_stream_new (uiout);
  make_cleanup (ui_out_stream_delete, mybuf);
@end smallexample

Note that with cleanups in place, you should not call
@code{ui_out_stream_delete} directly, or you would attempt to free the
same buffer twice.

@subsection Utility Output Functions

@deftypefun void ui_out_field_skip (struct ui_out *@var{uiout}, const char *@var{fldname})
This function skips a field in a table.  Use it if you have to leave
an empty field without disrupting the table alignment.  The argument
@var{fldname} specifies a name for the (missing) filed.
@end deftypefun

@deftypefun void ui_out_text (struct ui_out *@var{uiout}, const char *@var{string})
This function outputs the text in @var{string} in a way that makes it
easy to be read by humans.  For example, the console implementation of
this method filters the text through a built-in pager, to prevent it
from scrolling off the visible portion of the screen.

Use this function for printing relatively long chunks of text around
the actual field data: the text it produces is not aligned according
to the table's format.  Use @code{ui_out_field_string} to output a
string field, and use @code{ui_out_message}, described below, to
output short messages.
@end deftypefun

@deftypefun void ui_out_spaces (struct ui_out *@var{uiout}, int @var{nspaces})
This function outputs @var{nspaces} spaces.  It is handy to align the
text produced by @code{ui_out_text} with the rest of the table or
list.
@end deftypefun

@deftypefun void ui_out_message (struct ui_out *@var{uiout}, int @var{verbosity}, const char *@var{format}, ...)
This function produces a formatted message, provided that the current
verbosity level is at least as large as given by @var{verbosity}.  The
current verbosity level is specified by the user with the @samp{set
verbositylevel} command.@footnote{As of this writing (April 2001),
setting verbosity level is not yet implemented, and is always returned
as zero.  So calling @code{ui_out_message} with a @var{verbosity}
argument more than zero will cause the message to never be printed.}
@end deftypefun

@deftypefun void ui_out_wrap_hint (struct ui_out *@var{uiout}, char *@var{indent})
This function gives the console output filter (a paging filter) a hint
of where to break lines which are too long.  Ignored for all other
output consumers.  @var{indent}, if non-@code{NULL}, is the string to
be printed to indent the wrapped text on the next line; it must remain
accessible until the next call to @code{ui_out_wrap_hint}, or until an
explicit newline is produced by one of the other functions.  If
@var{indent} is @code{NULL}, the wrapped text will not be indented.
@end deftypefun

@deftypefun void ui_out_flush (struct ui_out *@var{uiout})
This function flushes whatever output has been accumulated so far, if
the UI buffers output.
@end deftypefun


@subsection Examples of Use of @code{ui_out} functions

@cindex using @code{ui_out} functions
@cindex @code{ui_out} functions, usage examples
This section gives some practical examples of using the @code{ui_out}
functions to generalize the old console-oriented code in
@value{GDBN}.  The examples all come from functions defined on the
@file{breakpoints.c} file.

This example, from the @code{breakpoint_1} function, shows how to
produce a table.

The original code was:

@smallexample
 if (!found_a_breakpoint++)
   @{
     annotate_breakpoints_headers ();

     annotate_field (0);
     printf_filtered ("Num ");
     annotate_field (1);
     printf_filtered ("Type           ");
     annotate_field (2);
     printf_filtered ("Disp ");
     annotate_field (3);
     printf_filtered ("Enb ");
     if (addressprint)
       @{
         annotate_field (4);
         printf_filtered ("Address    ");
       @}
     annotate_field (5);
     printf_filtered ("What\n");

     annotate_breakpoints_table ();
   @}
@end smallexample

Here's the new version:

@smallexample
  nr_printable_breakpoints = @dots{};

  if (addressprint)
    ui_out_table_begin (ui, 6, nr_printable_breakpoints, "BreakpointTable");
  else
    ui_out_table_begin (ui, 5, nr_printable_breakpoints, "BreakpointTable");

  if (nr_printable_breakpoints > 0)
    annotate_breakpoints_headers ();
  if (nr_printable_breakpoints > 0)
    annotate_field (0);
  ui_out_table_header (uiout, 3, ui_left, "number", "Num");		/* 1 */
  if (nr_printable_breakpoints > 0)
    annotate_field (1);
  ui_out_table_header (uiout, 14, ui_left, "type", "Type");		/* 2 */
  if (nr_printable_breakpoints > 0)
    annotate_field (2);
  ui_out_table_header (uiout, 4, ui_left, "disp", "Disp");		/* 3 */
  if (nr_printable_breakpoints > 0)
    annotate_field (3);
  ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");	/* 4 */
  if (addressprint)
    @{
     if (nr_printable_breakpoints > 0)
       annotate_field (4);
     if (print_address_bits <= 32)
       ui_out_table_header (uiout, 10, ui_left, "addr", "Address");/* 5 */
     else
       ui_out_table_header (uiout, 18, ui_left, "addr", "Address");/* 5 */
    @}
  if (nr_printable_breakpoints > 0)
    annotate_field (5);
  ui_out_table_header (uiout, 40, ui_noalign, "what", "What");	/* 6 */
  ui_out_table_body (uiout);
  if (nr_printable_breakpoints > 0)
    annotate_breakpoints_table ();
@end smallexample

This example, from the @code{print_one_breakpoint} function, shows how
to produce the actual data for the table whose structure was defined
in the above example.  The original code was:

@smallexample
   annotate_record ();
   annotate_field (0);
   printf_filtered ("%-3d ", b->number);
   annotate_field (1);
   if ((int)b->type > (sizeof(bptypes)/sizeof(bptypes[0]))
       || ((int) b->type != bptypes[(int) b->type].type))
     internal_error ("bptypes table does not describe type #%d.",
                     (int)b->type);
   printf_filtered ("%-14s ", bptypes[(int)b->type].description);
   annotate_field (2);
   printf_filtered ("%-4s ", bpdisps[(int)b->disposition]);
   annotate_field (3);
   printf_filtered ("%-3c ", bpenables[(int)b->enable]);
   @dots{}
@end smallexample

This is the new version:

@smallexample
   annotate_record ();
   ui_out_tuple_begin (uiout, "bkpt");
   annotate_field (0);
   ui_out_field_int (uiout, "number", b->number);
   annotate_field (1);
   if (((int) b->type > (sizeof (bptypes) / sizeof (bptypes[0])))
       || ((int) b->type != bptypes[(int) b->type].type))
     internal_error ("bptypes table does not describe type #%d.",
                     (int) b->type);
   ui_out_field_string (uiout, "type", bptypes[(int)b->type].description);
   annotate_field (2);
   ui_out_field_string (uiout, "disp", bpdisps[(int)b->disposition]);
   annotate_field (3);
   ui_out_field_fmt (uiout, "enabled", "%c", bpenables[(int)b->enable]);
   @dots{}
@end smallexample

This example, also from @code{print_one_breakpoint}, shows how to
produce a complicated output field using the @code{print_expression}
functions which requires a stream to be passed.  It also shows how to
automate stream destruction with cleanups.  The original code was:

@smallexample
    annotate_field (5);
    print_expression (b->exp, gdb_stdout);
@end smallexample

The new version is:

@smallexample
  struct ui_stream *stb = ui_out_stream_new (uiout);
  struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
  ...
  annotate_field (5);
  print_expression (b->exp, stb->stream);
  ui_out_field_stream (uiout, "what", local_stream);
@end smallexample

This example, also from @code{print_one_breakpoint}, shows how to use
@code{ui_out_text} and @code{ui_out_field_string}.  The original code
was:

@smallexample
  annotate_field (5);
  if (b->dll_pathname == NULL)
    printf_filtered ("<any library> ");
  else
    printf_filtered ("library \"%s\" ", b->dll_pathname);
@end smallexample

It became:

@smallexample
  annotate_field (5);
  if (b->dll_pathname == NULL)
    @{
      ui_out_field_string (uiout, "what", "<any library>");
      ui_out_spaces (uiout, 1);
    @}
  else
    @{
      ui_out_text (uiout, "library \"");
      ui_out_field_string (uiout, "what", b->dll_pathname);
      ui_out_text (uiout, "\" ");
    @}
@end smallexample

The following example from @code{print_one_breakpoint} shows how to
use @code{ui_out_field_int} and @code{ui_out_spaces}.  The original
code was:

@smallexample
  annotate_field (5);
  if (b->forked_inferior_pid != 0)
    printf_filtered ("process %d ", b->forked_inferior_pid);
@end smallexample

It became:

@smallexample
  annotate_field (5);
  if (b->forked_inferior_pid != 0)
    @{
      ui_out_text (uiout, "process ");
      ui_out_field_int (uiout, "what", b->forked_inferior_pid);
      ui_out_spaces (uiout, 1);
    @}
@end smallexample

Here's an example of using @code{ui_out_field_string}.  The original
code was:

@smallexample
  annotate_field (5);
  if (b->exec_pathname != NULL)
    printf_filtered ("program \"%s\" ", b->exec_pathname);
@end smallexample

It became:

@smallexample
  annotate_field (5);
  if (b->exec_pathname != NULL)
    @{
      ui_out_text (uiout, "program \"");
      ui_out_field_string (uiout, "what", b->exec_pathname);
      ui_out_text (uiout, "\" ");
    @}
@end smallexample

Finally, here's an example of printing an address.  The original code:

@smallexample
  annotate_field (4);
  printf_filtered ("%s ",
        hex_string_custom ((unsigned long) b->address, 8));
@end smallexample

It became:

@smallexample
  annotate_field (4);
  ui_out_field_core_addr (uiout, "Address", b->address);
@end smallexample


@section Console Printing

@section TUI

@node libgdb

@chapter libgdb

@section libgdb 1.0
@cindex @code{libgdb}
@code{libgdb} 1.0 was an abortive project of years ago.  The theory was
to provide an API to @value{GDBN}'s functionality.

@section libgdb 2.0
@cindex @code{libgdb}
@code{libgdb} 2.0 is an ongoing effort to update @value{GDBN} so that is
better able to support graphical and other environments.

Since @code{libgdb} development is on-going, its architecture is still
evolving.  The following components have so far been identified:

@itemize @bullet
@item
Observer - @file{gdb-events.h}.  
@item
Builder - @file{ui-out.h}
@item
Event Loop - @file{event-loop.h}
@item
Library - @file{gdb.h}
@end itemize

The model that ties these components together is described below.

@section The @code{libgdb} Model

A client of @code{libgdb} interacts with the library in two ways.

@itemize @bullet
@item
As an observer (using @file{gdb-events}) receiving notifications from
@code{libgdb} of any internal state changes (break point changes, run
state, etc).
@item
As a client querying @code{libgdb} (using the @file{ui-out} builder) to
obtain various status values from @value{GDBN}.
@end itemize

Since @code{libgdb} could have multiple clients (e.g., a GUI supporting
the existing @value{GDBN} CLI), those clients must co-operate when
controlling @code{libgdb}.  In particular, a client must ensure that
@code{libgdb} is idle (i.e.@: no other client is using @code{libgdb})
before responding to a @file{gdb-event} by making a query.

@section CLI support

At present @value{GDBN}'s CLI is very much entangled in with the core of
@code{libgdb}.  Consequently, a client wishing to include the CLI in
their interface needs to carefully co-ordinate its own and the CLI's
requirements.

It is suggested that the client set @code{libgdb} up to be bi-modal
(alternate between CLI and client query modes).  The notes below sketch
out the theory:

@itemize @bullet
@item
The client registers itself as an observer of @code{libgdb}.
@item
The client create and install @code{cli-out} builder using its own
versions of the @code{ui-file} @code{gdb_stderr}, @code{gdb_stdtarg} and
@code{gdb_stdout} streams.
@item
The client creates a separate custom @code{ui-out} builder that is only
used while making direct queries to @code{libgdb}.
@end itemize

When the client receives input intended for the CLI, it simply passes it
along.  Since the @code{cli-out} builder is installed by default, all
the CLI output in response to that command is routed (pronounced rooted)
through to the client controlled @code{gdb_stdout} et.@: al.@: streams.
At the same time, the client is kept abreast of internal changes by
virtue of being a @code{libgdb} observer.

The only restriction on the client is that it must wait until
@code{libgdb} becomes idle before initiating any queries (using the
client's custom builder).

@section @code{libgdb} components

@subheading Observer - @file{gdb-events.h}
@file{gdb-events} provides the client with a very raw mechanism that can
be used to implement an observer.  At present it only allows for one
observer and that observer must, internally, handle the need to delay
the processing of any event notifications until after @code{libgdb} has
finished the current command.

@subheading Builder - @file{ui-out.h}
@file{ui-out} provides the infrastructure necessary for a client to
create a builder.  That builder is then passed down to @code{libgdb}
when doing any queries.

@subheading Event Loop - @file{event-loop.h}
@c There could be an entire section on the event-loop
@file{event-loop}, currently non-re-entrant, provides a simple event
loop.  A client would need to either plug its self into this loop or,
implement a new event-loop that @value{GDBN} would use.

The event-loop will eventually be made re-entrant.  This is so that
@value{GDBN} can better handle the problem of some commands blocking
instead of returning.

@subheading Library - @file{gdb.h}
@file{libgdb} is the most obvious component of this system.  It provides
the query interface.  Each function is parameterized by a @code{ui-out}
builder.  The result of the query is constructed using that builder
before the query function returns.

@node Values
@chapter Values
@section Values

@cindex values
@cindex @code{value} structure
@value{GDBN} uses @code{struct value}, or @dfn{values}, as an internal
abstraction for the representation of a variety of inferior objects
and @value{GDBN} convenience objects.

Values have an associated @code{struct type}, that describes a virtual
view of the raw data or object stored in or accessed through the
value.

A value is in addition discriminated by its lvalue-ness, given its
@code{enum lval_type} enumeration type:

@cindex @code{lval_type} enumeration, for values.
@table @code
@item @code{not_lval}
This value is not an lval.  It can't be assigned to.

@item @code{lval_memory}
This value represents an object in memory.

@item @code{lval_register}
This value represents an object that lives in a register.

@item @code{lval_internalvar}
Represents the value of an internal variable.

@item @code{lval_internalvar_component}
Represents part of a @value{GDBN} internal variable.  E.g., a
structure field.

@cindex computed values
@item @code{lval_computed}
These are ``computed'' values.  They allow creating specialized value
objects for specific purposes, all abstracted away from the core value
support code.  The creator of such a value writes specialized
functions to handle the reading and writing to/from the value's
backend data, and optionally, a ``copy operator'' and a
``destructor''.

Pointers to these functions are stored in a @code{struct lval_funcs}
instance (declared in @file{value.h}), and passed to the
@code{allocate_computed_value} function, as in the example below.

@smallexample
static void
nil_value_read (struct value *v)
@{
  /* This callback reads data from some backend, and stores it in V.
     In this case, we always read null data.  You'll want to fill in
     something more interesting.  */

  memset (value_contents_all_raw (v),
          value_offset (v),
          TYPE_LENGTH (value_type (v)));
@}

static void
nil_value_write (struct value *v, struct value *fromval)
@{
  /* Takes the data from FROMVAL and stores it in the backend of V.  */

  to_oblivion (value_contents_all_raw (fromval),
               value_offset (v),
               TYPE_LENGTH (value_type (fromval)));
@}

static struct lval_funcs nil_value_funcs =
  @{
    nil_value_read,
    nil_value_write
  @};

struct value *
make_nil_value (void)
@{
   struct type *type;
   struct value *v;

   type = make_nils_type ();
   v = allocate_computed_value (type, &nil_value_funcs, NULL);

   return v;
@}
@end smallexample

See the implementation of the @code{$_siginfo} convenience variable in
@file{infrun.c} as a real example use of lval_computed.

@end table

@node Stack Frames
@chapter Stack Frames

@cindex frame
@cindex call stack frame
A frame is a construct that @value{GDBN} uses to keep track of calling
and called functions.

@cindex unwind frame
@value{GDBN}'s frame model, a fresh design, was implemented with the
need to support @sc{dwarf}'s Call Frame Information in mind.  In fact,
the term ``unwind'' is taken directly from that specification.
Developers wishing to learn more about unwinders, are encouraged to
read the @sc{dwarf} specification, available from
@url{http://www.dwarfstd.org}.

@findex frame_register_unwind
@findex get_frame_register
@value{GDBN}'s model is that you find a frame's registers by
``unwinding'' them from the next younger frame.  That is,
@samp{get_frame_register} which returns the value of a register in
frame #1 (the next-to-youngest frame), is implemented by calling frame
#0's @code{frame_register_unwind} (the youngest frame).  But then the
obvious question is: how do you access the registers of the youngest
frame itself?

@cindex sentinel frame
@findex get_frame_type
@vindex SENTINEL_FRAME
To answer this question, @value{GDBN} has the @dfn{sentinel} frame, the
``-1st'' frame.  Unwinding registers from the sentinel frame gives you
the current values of the youngest real frame's registers.  If @var{f}
is a sentinel frame, then @code{get_frame_type (@var{f}) @equiv{}
SENTINEL_FRAME}.

@section Selecting an Unwinder

@findex frame_unwind_prepend_unwinder
@findex frame_unwind_append_unwinder
The architecture registers a list of frame unwinders (@code{struct
frame_unwind}), using the functions
@code{frame_unwind_prepend_unwinder} and
@code{frame_unwind_append_unwinder}.  Each unwinder includes a
sniffer.  Whenever @value{GDBN} needs to unwind a frame (to fetch the
previous frame's registers or the current frame's ID), it calls
registered sniffers in order to find one which recognizes the frame.
The first time a sniffer returns non-zero, the corresponding unwinder
is assigned to the frame.

@section Unwinding the Frame ID
@cindex frame ID

Every frame has an associated ID, of type @code{struct frame_id}.
The ID includes the stack base and function start address for
the frame.  The ID persists through the entire life of the frame,
including while other called frames are running; it is used to
locate an appropriate @code{struct frame_info} from the cache.

Every time the inferior stops, and at various other times, the frame
cache is flushed.  Because of this, parts of @value{GDBN} which need
to keep track of individual frames cannot use pointers to @code{struct
frame_info}.  A frame ID provides a stable reference to a frame, even
when the unwinder must be run again to generate a new @code{struct
frame_info} for the same frame.

The frame's unwinder's @code{this_id} method is called to find the ID.
Note that this is different from register unwinding, where the next
frame's @code{prev_register} is called to unwind this frame's
registers.

Both stack base and function address are required to identify the
frame, because a recursive function has the same function address for
two consecutive frames and a leaf function may have the same stack
address as its caller.  On some platforms, a third address is part of
the ID to further disambiguate frames---for instance, on IA-64
the separate register stack address is included in the ID.

An invalid frame ID (@code{outer_frame_id}) returned from the
@code{this_id} method means to stop unwinding after this frame.

@code{null_frame_id} is another invalid frame ID which should be used
when there is no frame.  For instance, certain breakpoints are attached
to a specific frame, and that frame is identified through its frame ID
(we use this to implement the "finish" command).  Using
@code{null_frame_id} as the frame ID for a given breakpoint means
that the breakpoint is not specific to any frame.  The @code{this_id}
method should never return @code{null_frame_id}.

@section Unwinding Registers

Each unwinder includes a @code{prev_register} method.  This method
takes a frame, an associated cache pointer, and a register number.
It returns a @code{struct value *} describing the requested register,
as saved by this frame.  This is the value of the register that is
current in this frame's caller.

The returned value must have the same type as the register.  It may
have any lvalue type.  In most circumstances one of these routines
will generate the appropriate value:

@table @code
@item frame_unwind_got_optimized
@findex frame_unwind_got_optimized
This register was not saved.

@item frame_unwind_got_register
@findex frame_unwind_got_register
This register was copied into another register in this frame.  This
is also used for unchanged registers; they are ``copied'' into the
same register.

@item frame_unwind_got_memory
@findex frame_unwind_got_memory
This register was saved in memory.

@item frame_unwind_got_constant
@findex frame_unwind_got_constant
This register was not saved, but the unwinder can compute the previous
value some other way.

@item frame_unwind_got_address
@findex frame_unwind_got_address
Same as @code{frame_unwind_got_constant}, except that the value is a target
address.  This is frequently used for the stack pointer, which is not
explicitly saved but has a known offset from this frame's stack
pointer.  For architectures with a flat unified address space, this is
generally the same as @code{frame_unwind_got_constant}.
@end table

@node Symbol Handling

@chapter Symbol Handling

Symbols are a key part of @value{GDBN}'s operation.  Symbols include
variables, functions, and types.

Symbol information for a large program can be truly massive, and
reading of symbol information is one of the major performance
bottlenecks in @value{GDBN}; it can take many minutes to process it
all.  Studies have shown that nearly all the time spent is
computational, rather than file reading.

One of the ways for @value{GDBN} to provide a good user experience is
to start up quickly, taking no more than a few seconds.  It is simply
not possible to process all of a program's debugging info in that
time, and so we attempt to handle symbols incrementally.  For instance,
we create @dfn{partial symbol tables} consisting of only selected
symbols, and only expand them to full symbol tables when necessary.

@section Symbol Reading

@cindex symbol reading
@cindex reading of symbols
@cindex symbol files
@value{GDBN} reads symbols from @dfn{symbol files}.  The usual symbol
file is the file containing the program which @value{GDBN} is
debugging.  @value{GDBN} can be directed to use a different file for
symbols (with the @samp{symbol-file} command), and it can also read
more symbols via the @samp{add-file} and @samp{load} commands. In
addition, it may bring in more symbols while loading shared
libraries.

@findex find_sym_fns
Symbol files are initially opened by code in @file{symfile.c} using
the BFD library (@pxref{Support Libraries}).  BFD identifies the type
of the file by examining its header.  @code{find_sym_fns} then uses
this identification to locate a set of symbol-reading functions.

@findex add_symtab_fns
@cindex @code{sym_fns} structure
@cindex adding a symbol-reading module
Symbol-reading modules identify themselves to @value{GDBN} by calling
@code{add_symtab_fns} during their module initialization.  The argument
to @code{add_symtab_fns} is a @code{struct sym_fns} which contains the
name (or name prefix) of the symbol format, the length of the prefix,
and pointers to four functions.  These functions are called at various
times to process symbol files whose identification matches the specified
prefix.

The functions supplied by each module are:

@table @code
@item @var{xyz}_symfile_init(struct sym_fns *sf)

@cindex secondary symbol file
Called from @code{symbol_file_add} when we are about to read a new
symbol file.  This function should clean up any internal state (possibly
resulting from half-read previous files, for example) and prepare to
read a new symbol file.  Note that the symbol file which we are reading
might be a new ``main'' symbol file, or might be a secondary symbol file
whose symbols are being added to the existing symbol table.

The argument to @code{@var{xyz}_symfile_init} is a newly allocated
@code{struct sym_fns} whose @code{bfd} field contains the BFD for the
new symbol file being read.  Its @code{private} field has been zeroed,
and can be modified as desired.  Typically, a struct of private
information will be @code{malloc}'d, and a pointer to it will be placed
in the @code{private} field.

There is no result from @code{@var{xyz}_symfile_init}, but it can call
@code{error} if it detects an unavoidable problem.

@item @var{xyz}_new_init()

Called from @code{symbol_file_add} when discarding existing symbols.
This function needs only handle the symbol-reading module's internal
state; the symbol table data structures visible to the rest of
@value{GDBN} will be discarded by @code{symbol_file_add}.  It has no
arguments and no result.  It may be called after
@code{@var{xyz}_symfile_init}, if a new symbol table is being read, or
may be called alone if all symbols are simply being discarded.

@item @var{xyz}_symfile_read(struct sym_fns *sf, CORE_ADDR addr, int mainline)

Called from @code{symbol_file_add} to actually read the symbols from a
symbol-file into a set of psymtabs or symtabs.

@code{sf} points to the @code{struct sym_fns} originally passed to
@code{@var{xyz}_sym_init} for possible initialization.  @code{addr} is
the offset between the file's specified start address and its true
address in memory.  @code{mainline} is 1 if this is the main symbol
table being read, and 0 if a secondary symbol file (e.g., shared library
or dynamically loaded file) is being read.@refill
@end table

In addition, if a symbol-reading module creates psymtabs when
@var{xyz}_symfile_read is called, these psymtabs will contain a pointer
to a function @code{@var{xyz}_psymtab_to_symtab}, which can be called
from any point in the @value{GDBN} symbol-handling code.

@table @code
@item @var{xyz}_psymtab_to_symtab (struct partial_symtab *pst)

Called from @code{psymtab_to_symtab} (or the @code{PSYMTAB_TO_SYMTAB} macro) if
the psymtab has not already been read in and had its @code{pst->symtab}
pointer set.  The argument is the psymtab to be fleshed-out into a
symtab.  Upon return, @code{pst->readin} should have been set to 1, and
@code{pst->symtab} should contain a pointer to the new corresponding symtab, or
zero if there were no symbols in that part of the symbol file.
@end table

@section Partial Symbol Tables

@value{GDBN} has three types of symbol tables:

@itemize @bullet
@cindex full symbol table
@cindex symtabs
@item
Full symbol tables (@dfn{symtabs}).  These contain the main
information about symbols and addresses.

@cindex psymtabs
@item
Partial symbol tables (@dfn{psymtabs}).  These contain enough
information to know when to read the corresponding part of the full
symbol table.

@cindex minimal symbol table
@cindex minsymtabs
@item
Minimal symbol tables (@dfn{msymtabs}).  These contain information
gleaned from non-debugging symbols.
@end itemize

@cindex partial symbol table
This section describes partial symbol tables.

A psymtab is constructed by doing a very quick pass over an executable
file's debugging information.  Small amounts of information are
extracted---enough to identify which parts of the symbol table will
need to be re-read and fully digested later, when the user needs the
information.  The speed of this pass causes @value{GDBN} to start up very
quickly.  Later, as the detailed rereading occurs, it occurs in small
pieces, at various times, and the delay therefrom is mostly invisible to
the user.
@c (@xref{Symbol Reading}.)

The symbols that show up in a file's psymtab should be, roughly, those
visible to the debugger's user when the program is not running code from
that file.  These include external symbols and types, static symbols and
types, and @code{enum} values declared at file scope.

The psymtab also contains the range of instruction addresses that the
full symbol table would represent.

@cindex finding a symbol
@cindex symbol lookup
The idea is that there are only two ways for the user (or much of the
code in the debugger) to reference a symbol:

@itemize @bullet
@findex find_pc_function
@findex find_pc_line
@item
By its address (e.g., execution stops at some address which is inside a
function in this file).  The address will be noticed to be in the
range of this psymtab, and the full symtab will be read in.
@code{find_pc_function}, @code{find_pc_line}, and other
@code{find_pc_@dots{}} functions handle this.

@cindex lookup_symbol
@item
By its name
(e.g., the user asks to print a variable, or set a breakpoint on a
function).  Global names and file-scope names will be found in the
psymtab, which will cause the symtab to be pulled in.  Local names will
have to be qualified by a global name, or a file-scope name, in which
case we will have already read in the symtab as we evaluated the
qualifier.  Or, a local symbol can be referenced when we are ``in'' a
local scope, in which case the first case applies.  @code{lookup_symbol}
does most of the work here.
@end itemize

The only reason that psymtabs exist is to cause a symtab to be read in
at the right moment.  Any symbol that can be elided from a psymtab,
while still causing that to happen, should not appear in it.  Since
psymtabs don't have the idea of scope, you can't put local symbols in
them anyway.  Psymtabs don't have the idea of the type of a symbol,
either, so types need not appear, unless they will be referenced by
name.

It is a bug for @value{GDBN} to behave one way when only a psymtab has
been read, and another way if the corresponding symtab has been read
in.  Such bugs are typically caused by a psymtab that does not contain
all the visible symbols, or which has the wrong instruction address
ranges.

The psymtab for a particular section of a symbol file (objfile) could be
thrown away after the symtab has been read in.  The symtab should always
be searched before the psymtab, so the psymtab will never be used (in a
bug-free environment).  Currently, psymtabs are allocated on an obstack,
and all the psymbols themselves are allocated in a pair of large arrays
on an obstack, so there is little to be gained by trying to free them
unless you want to do a lot more work.

Whether or not psymtabs are created depends on the objfile's symbol
reader.  The core of @value{GDBN} hides the details of partial symbols
and partial symbol tables behind a set of function pointers known as
the @dfn{quick symbol functions}.  These are documented in
@file{symfile.h}.

@section Types

@unnumberedsubsec Fundamental Types (e.g., @code{FT_VOID}, @code{FT_BOOLEAN}).

@cindex fundamental types
These are the fundamental types that @value{GDBN} uses internally.  Fundamental
types from the various debugging formats (stabs, ELF, etc) are mapped
into one of these.  They are basically a union of all fundamental types
that @value{GDBN} knows about for all the languages that @value{GDBN}
knows about.

@unnumberedsubsec Type Codes (e.g., @code{TYPE_CODE_PTR}, @code{TYPE_CODE_ARRAY}).

@cindex type codes
Each time @value{GDBN} builds an internal type, it marks it with one
of these types.  The type may be a fundamental type, such as
@code{TYPE_CODE_INT}, or a derived type, such as @code{TYPE_CODE_PTR}
which is a pointer to another type.  Typically, several @code{FT_*}
types map to one @code{TYPE_CODE_*} type, and are distinguished by
other members of the type struct, such as whether the type is signed
or unsigned, and how many bits it uses.

@unnumberedsubsec Builtin Types (e.g., @code{builtin_type_void}, @code{builtin_type_char}).

These are instances of type structs that roughly correspond to
fundamental types and are created as global types for @value{GDBN} to
use for various ugly historical reasons.  We eventually want to
eliminate these.  Note for example that @code{builtin_type_int}
initialized in @file{gdbtypes.c} is basically the same as a
@code{TYPE_CODE_INT} type that is initialized in @file{c-lang.c} for
an @code{FT_INTEGER} fundamental type.  The difference is that the
@code{builtin_type} is not associated with any particular objfile, and
only one instance exists, while @file{c-lang.c} builds as many
@code{TYPE_CODE_INT} types as needed, with each one associated with
some particular objfile.

@section Object File Formats
@cindex object file formats

@subsection a.out

@cindex @code{a.out} format
The @code{a.out} format is the original file format for Unix.  It
consists of three sections: @code{text}, @code{data}, and @code{bss},
which are for program code, initialized data, and uninitialized data,
respectively.

The @code{a.out} format is so simple that it doesn't have any reserved
place for debugging information.  (Hey, the original Unix hackers used
@samp{adb}, which is a machine-language debugger!)  The only debugging
format for @code{a.out} is stabs, which is encoded as a set of normal
symbols with distinctive attributes.

The basic @code{a.out} reader is in @file{dbxread.c}.

@subsection COFF

@cindex COFF format
The COFF format was introduced with System V Release 3 (SVR3) Unix.
COFF files may have multiple sections, each prefixed by a header.  The
number of sections is limited.

The COFF specification includes support for debugging.  Although this
was a step forward, the debugging information was woefully limited.
For instance, it was not possible to represent code that came from an
included file.  GNU's COFF-using configs often use stabs-type info,
encapsulated in special sections.

The COFF reader is in @file{coffread.c}.

@subsection ECOFF

@cindex ECOFF format
ECOFF is an extended COFF originally introduced for Mips and Alpha
workstations.

The basic ECOFF reader is in @file{mipsread.c}.

@subsection XCOFF

@cindex XCOFF format
The IBM RS/6000 running AIX uses an object file format called XCOFF.
The COFF sections, symbols, and line numbers are used, but debugging
symbols are @code{dbx}-style stabs whose strings are located in the
@code{.debug} section (rather than the string table).  For more
information, see @ref{Top,,,stabs,The Stabs Debugging Format}.

The shared library scheme has a clean interface for figuring out what
shared libraries are in use, but the catch is that everything which
refers to addresses (symbol tables and breakpoints at least) needs to be
relocated for both shared libraries and the main executable.  At least
using the standard mechanism this can only be done once the program has
been run (or the core file has been read).

@subsection PE

@cindex PE-COFF format
Windows 95 and NT use the PE (@dfn{Portable Executable}) format for their
executables.  PE is basically COFF with additional headers.

While BFD includes special PE support, @value{GDBN} needs only the basic
COFF reader.

@subsection ELF

@cindex ELF format
The ELF format came with System V Release 4 (SVR4) Unix.  ELF is
similar to COFF in being organized into a number of sections, but it
removes many of COFF's limitations.  Debugging info may be either stabs
encapsulated in ELF sections, or more commonly these days, DWARF.

The basic ELF reader is in @file{elfread.c}.

@subsection SOM

@cindex SOM format
SOM is HP's object file and debug format (not to be confused with IBM's
SOM, which is a cross-language ABI).

The SOM reader is in @file{somread.c}.

@section Debugging File Formats

This section describes characteristics of debugging information that
are independent of the object file format.

@subsection stabs

@cindex stabs debugging info
@code{stabs} started out as special symbols within the @code{a.out}
format.  Since then, it has been encapsulated into other file
formats, such as COFF and ELF.

While @file{dbxread.c} does some of the basic stab processing,
including for encapsulated versions, @file{stabsread.c} does
the real work.

@subsection COFF

@cindex COFF debugging info
The basic COFF definition includes debugging information.  The level
of support is minimal and non-extensible, and is not often used.

@subsection Mips debug (Third Eye)

@cindex ECOFF debugging info
ECOFF includes a definition of a special debug format.

The file @file{mdebugread.c} implements reading for this format.

@c mention DWARF 1 as a formerly-supported format

@subsection DWARF 2

@cindex DWARF 2 debugging info
DWARF 2 is an improved but incompatible version of DWARF 1.

The DWARF 2 reader is in @file{dwarf2read.c}.

@subsection Compressed DWARF 2

@cindex Compressed DWARF 2 debugging info
Compressed DWARF 2 is not technically a separate debugging format, but
merely DWARF 2 debug information that has been compressed.  In this
format, every object-file section holding DWARF 2 debugging
information is compressed and prepended with a header.  (The section
is also typically renamed, so a section called @code{.debug_info} in a
DWARF 2 binary would be called @code{.zdebug_info} in a compressed
DWARF 2 binary.)  The header is 12 bytes long:

@itemize @bullet
@item
4 bytes: the literal string ``ZLIB''
@item
8 bytes: the uncompressed size of the section, in big-endian byte
order.
@end itemize

The same reader is used for both compressed an normal DWARF 2 info.
Section decompression is done in @code{zlib_decompress_section} in
@file{dwarf2read.c}.

@subsection DWARF 3

@cindex DWARF 3 debugging info
DWARF 3 is an improved version of DWARF 2.

@subsection SOM

@cindex SOM debugging info
Like COFF, the SOM definition includes debugging information.

@section Adding a New Symbol Reader to @value{GDBN}

@cindex adding debugging info reader
If you are using an existing object file format (@code{a.out}, COFF, ELF, etc),
there is probably little to be done.

If you need to add a new object file format, you must first add it to
BFD.  This is beyond the scope of this document.

You must then arrange for the BFD code to provide access to the
debugging symbols.  Generally @value{GDBN} will have to call swapping
routines from BFD and a few other BFD internal routines to locate the
debugging information.  As much as possible, @value{GDBN} should not
depend on the BFD internal data structures.

For some targets (e.g., COFF), there is a special transfer vector used
to call swapping routines, since the external data structures on various
platforms have different sizes and layouts.  Specialized routines that
will only ever be implemented by one object file format may be called
directly.  This interface should be described in a file
@file{bfd/lib@var{xyz}.h}, which is included by @value{GDBN}.

@section Memory Management for Symbol Files

Most memory associated with a loaded symbol file is stored on
its @code{objfile_obstack}.  This includes symbols, types,
namespace data, and other information produced by the symbol readers.

Because this data lives on the objfile's obstack, it is automatically
released when the objfile is unloaded or reloaded.  Therefore one
objfile must not reference symbol or type data from another objfile;
they could be unloaded at different times.

User convenience variables, et cetera, have associated types.  Normally
these types live in the associated objfile.  However, when the objfile
is unloaded, those types are deep copied to global memory, so that
the values of the user variables and history items are not lost.


@node Language Support

@chapter Language Support

@cindex language support
@value{GDBN}'s language support is mainly driven by the symbol reader,
although it is possible for the user to set the source language
manually.

@value{GDBN} chooses the source language by looking at the extension
of the file recorded in the debug info; @file{.c} means C, @file{.f}
means Fortran, etc.  It may also use a special-purpose language
identifier if the debug format supports it, like with DWARF.

@section Adding a Source Language to @value{GDBN}

@cindex adding source language
To add other languages to @value{GDBN}'s expression parser, follow the
following steps:

@table @emph
@item Create the expression parser.

@cindex expression parser
This should reside in a file @file{@var{lang}-exp.y}.  Routines for
building parsed expressions into a @code{union exp_element} list are in
@file{parse.c}.

@cindex language parser
Since we can't depend upon everyone having Bison, and YACC produces
parsers that define a bunch of global names, the following lines
@strong{must} be included at the top of the YACC parser, to prevent the
various parsers from defining the same global names:

@smallexample
#define yyparse         @var{lang}_parse
#define yylex           @var{lang}_lex
#define yyerror         @var{lang}_error
#define yylval          @var{lang}_lval
#define yychar          @var{lang}_char
#define yydebug         @var{lang}_debug
#define yypact          @var{lang}_pact 
#define yyr1            @var{lang}_r1   
#define yyr2            @var{lang}_r2   
#define yydef           @var{lang}_def  
#define yychk           @var{lang}_chk  
#define yypgo           @var{lang}_pgo  
#define yyact           @var{lang}_act  
#define yyexca          @var{lang}_exca
#define yyerrflag       @var{lang}_errflag
#define yynerrs         @var{lang}_nerrs
@end smallexample

At the bottom of your parser, define a @code{struct language_defn} and
initialize it with the right values for your language.  Define an
@code{initialize_@var{lang}} routine and have it call
@samp{add_language(@var{lang}_language_defn)} to tell the rest of @value{GDBN}
that your language exists.  You'll need some other supporting variables
and functions, which will be used via pointers from your
@code{@var{lang}_language_defn}.  See the declaration of @code{struct
language_defn} in @file{language.h}, and the other @file{*-exp.y} files,
for more information.

@item Add any evaluation routines, if necessary

@cindex expression evaluation routines
@findex evaluate_subexp
@findex prefixify_subexp
@findex length_of_subexp
If you need new opcodes (that represent the operations of the language),
add them to the enumerated type in @file{expression.h}.  Add support
code for these operations in the @code{evaluate_subexp} function
defined in the file @file{eval.c}.  Add cases
for new opcodes in two functions from @file{parse.c}:
@code{prefixify_subexp} and @code{length_of_subexp}.  These compute
the number of @code{exp_element}s that a given operation takes up.

@item Update some existing code

Add an enumerated identifier for your language to the enumerated type
@code{enum language} in @file{defs.h}.

Update the routines in @file{language.c} so your language is included.
These routines include type predicates and such, which (in some cases)
are language dependent.  If your language does not appear in the switch
statement, an error is reported.

@vindex current_language
Also included in @file{language.c} is the code that updates the variable
@code{current_language}, and the routines that translate the
@code{language_@var{lang}} enumerated identifier into a printable
string.

@findex _initialize_language
Update the function @code{_initialize_language} to include your
language.  This function picks the default language upon startup, so is
dependent upon which languages that @value{GDBN} is built for.

@findex allocate_symtab
Update @code{allocate_symtab} in @file{symfile.c} and/or symbol-reading
code so that the language of each symtab (source file) is set properly.
This is used to determine the language to use at each stack frame level.
Currently, the language is set based upon the extension of the source
file.  If the language can be better inferred from the symbol
information, please set the language of the symtab in the symbol-reading
code.

@findex print_subexp
@findex op_print_tab
Add helper code to @code{print_subexp} (in @file{expprint.c}) to handle any new
expression opcodes you have added to @file{expression.h}.  Also, add the
printed representations of your operators to @code{op_print_tab}.

@item Add a place of call

@findex parse_exp_1
Add a call to @code{@var{lang}_parse()} and @code{@var{lang}_error} in
@code{parse_exp_1} (defined in @file{parse.c}).

@item Edit @file{Makefile.in}

Add dependencies in @file{Makefile.in}.  Make sure you update the macro
variables such as @code{HFILES} and @code{OBJS}, otherwise your code may
not get linked in, or, worse yet, it may not get @code{tar}red into the
distribution!
@end table


@node Host Definition

@chapter Host Definition

With the advent of Autoconf, it's rarely necessary to have host
definition machinery anymore.  The following information is provided,
mainly, as an historical reference.

@section Adding a New Host

@cindex adding a new host
@cindex host, adding
@value{GDBN}'s host configuration support normally happens via Autoconf.
New host-specific definitions should not be needed.  Older hosts
@value{GDBN} still use the host-specific definitions and files listed
below, but these mostly exist for historical reasons, and will
eventually disappear.

@table @file
@item gdb/config/@var{arch}/@var{xyz}.mh
This file is a Makefile fragment that once contained both host and
native configuration information (@pxref{Native Debugging}) for the
machine @var{xyz}.  The host configuration information is now handled
by Autoconf.

Host configuration information included definitions for @code{CC},
@code{SYSV_DEFINE}, @code{XM_CFLAGS}, @code{XM_ADD_FILES},
@code{XM_CLIBS}, @code{XM_CDEPS}, etc.; see @file{Makefile.in}.

New host-only configurations do not need this file.

@end table

(Files named @file{gdb/config/@var{arch}/xm-@var{xyz}.h} were once
used to define host-specific macros, but were no longer needed and
have all been removed.)

@subheading Generic Host Support Files

@cindex generic host support
There are some ``generic'' versions of routines that can be used by
various systems.

@table @file
@cindex remote debugging support
@cindex serial line support
@item ser-unix.c
This contains serial line support for Unix systems.  It is included by
default on all Unix-like hosts.

@item ser-pipe.c
This contains serial pipe support for Unix systems.  It is included by
default on all Unix-like hosts.

@item ser-mingw.c
This contains serial line support for 32-bit programs running under
Windows using MinGW.

@item ser-go32.c
This contains serial line support for 32-bit programs running under DOS,
using the DJGPP (a.k.a.@: GO32) execution environment.

@cindex TCP remote support
@item ser-tcp.c
This contains generic TCP support using sockets.  It is included by
default on all Unix-like hosts and with MinGW.
@end table

@section Host Conditionals

When @value{GDBN} is configured and compiled, various macros are
defined or left undefined, to control compilation based on the
attributes of the host system.  While formerly they could be set in
host-specific header files, at present they can be changed only by
setting @code{CFLAGS} when building, or by editing the source code.

These macros and their meanings (or if the meaning is not documented
here, then one of the source files where they are used is indicated)
are:

@ftable @code
@item @value{GDBN}INIT_FILENAME
The default name of @value{GDBN}'s initialization file (normally
@file{.gdbinit}).

@item SIGWINCH_HANDLER
If your host defines @code{SIGWINCH}, you can define this to be the name
of a function to be called if @code{SIGWINCH} is received.

@item SIGWINCH_HANDLER_BODY
Define this to expand into code that will define the function named by
the expansion of @code{SIGWINCH_HANDLER}.

@item CRLF_SOURCE_FILES
@cindex DOS text files
Define this if host files use @code{\r\n} rather than @code{\n} as a
line terminator.  This will cause source file listings to omit @code{\r}
characters when printing and it will allow @code{\r\n} line endings of files
which are ``sourced'' by gdb.  It must be possible to open files in binary
mode using @code{O_BINARY} or, for fopen, @code{"rb"}.

@item DEFAULT_PROMPT
@cindex prompt
The default value of the prompt string (normally @code{"(gdb) "}).

@item DEV_TTY
@cindex terminal device
The name of the generic TTY device, defaults to @code{"/dev/tty"}.

@item ISATTY
Substitute for isatty, if not available.

@item FOPEN_RB
Define this if binary files are opened the same way as text files.

@item CC_HAS_LONG_LONG
@cindex @code{long long} data type
Define this if the host C compiler supports @code{long long}.  This is set
by the @code{configure} script.

@item PRINTF_HAS_LONG_LONG
Define this if the host can handle printing of long long integers via
the printf format conversion specifier @code{ll}.  This is set by the
@code{configure} script.

@item LSEEK_NOT_LINEAR
Define this if @code{lseek (n)} does not necessarily move to byte number
@code{n} in the file.  This is only used when reading source files.  It
is normally faster to define @code{CRLF_SOURCE_FILES} when possible.

@item lint
Define this to help placate @code{lint} in some situations.

@item volatile
Define this to override the defaults of @code{__volatile__} or
@code{/**/}.
@end ftable


@node Target Architecture Definition

@chapter Target Architecture Definition

@cindex target architecture definition
@value{GDBN}'s target architecture defines what sort of
machine-language programs @value{GDBN} can work with, and how it works
with them.

The target architecture object is implemented as the C structure
@code{struct gdbarch *}.  The structure, and its methods, are generated
using the Bourne shell script @file{gdbarch.sh}.

@menu
* OS ABI Variant Handling::
* Initialize New Architecture::
* Registers and Memory::
* Pointers and Addresses::
* Address Classes::
* Register Representation::
* Frame Interpretation::
* Inferior Call Setup::
* Adding support for debugging core files::
* Defining Other Architecture Features::
* Adding a New Target::
@end menu

@node  OS ABI Variant Handling
@section Operating System ABI Variant Handling
@cindex OS ABI variants

@value{GDBN} provides a mechanism for handling variations in OS
ABIs.  An OS ABI variant may have influence over any number of
variables in the target architecture definition.  There are two major
components in the OS ABI mechanism: sniffers and handlers.

A @dfn{sniffer} examines a file matching a BFD architecture/flavour pair
(the architecture may be wildcarded) in an attempt to determine the
OS ABI of that file.  Sniffers with a wildcarded architecture are considered
to be @dfn{generic}, while sniffers for a specific architecture are
considered to be @dfn{specific}.  A match from a specific sniffer
overrides a match from a generic sniffer.  Multiple sniffers for an
architecture/flavour may exist, in order to differentiate between two
different operating systems which use the same basic file format.  The
OS ABI framework provides a generic sniffer for ELF-format files which
examines the @code{EI_OSABI} field of the ELF header, as well as note
sections known to be used by several operating systems.

@cindex fine-tuning @code{gdbarch} structure
A @dfn{handler} is used to fine-tune the @code{gdbarch} structure for the
selected OS ABI.  There may be only one handler for a given OS ABI
for each BFD architecture.

The following OS ABI variants are defined in @file{defs.h}:

@table @code

@findex GDB_OSABI_UNINITIALIZED
@item GDB_OSABI_UNINITIALIZED
Used for struct gdbarch_info if ABI is still uninitialized.

@findex GDB_OSABI_UNKNOWN
@item GDB_OSABI_UNKNOWN
The ABI of the inferior is unknown.  The default @code{gdbarch}
settings for the architecture will be used.

@findex GDB_OSABI_SVR4
@item GDB_OSABI_SVR4
UNIX System V Release 4.

@findex GDB_OSABI_HURD
@item GDB_OSABI_HURD
GNU using the Hurd kernel.

@findex GDB_OSABI_SOLARIS
@item GDB_OSABI_SOLARIS
Sun Solaris.

@findex GDB_OSABI_OSF1
@item GDB_OSABI_OSF1
OSF/1, including Digital UNIX and Compaq Tru64 UNIX.

@findex GDB_OSABI_LINUX
@item GDB_OSABI_LINUX
GNU using the Linux kernel.

@findex GDB_OSABI_FREEBSD_AOUT
@item GDB_OSABI_FREEBSD_AOUT
FreeBSD using the @code{a.out} executable format.

@findex GDB_OSABI_FREEBSD_ELF
@item GDB_OSABI_FREEBSD_ELF
FreeBSD using the ELF executable format.

@findex GDB_OSABI_NETBSD_AOUT
@item GDB_OSABI_NETBSD_AOUT
NetBSD using the @code{a.out} executable format.

@findex GDB_OSABI_NETBSD_ELF
@item GDB_OSABI_NETBSD_ELF
NetBSD using the ELF executable format.

@findex GDB_OSABI_OPENBSD_ELF
@item GDB_OSABI_OPENBSD_ELF
OpenBSD using the ELF executable format.

@findex GDB_OSABI_WINCE
@item GDB_OSABI_WINCE
Windows CE.

@findex GDB_OSABI_GO32
@item GDB_OSABI_GO32
DJGPP.

@findex GDB_OSABI_IRIX
@item GDB_OSABI_IRIX
Irix.

@findex GDB_OSABI_INTERIX
@item GDB_OSABI_INTERIX
Interix (Posix layer for MS-Windows systems).

@findex GDB_OSABI_HPUX_ELF
@item GDB_OSABI_HPUX_ELF
HP/UX using the ELF executable format.

@findex GDB_OSABI_HPUX_SOM
@item GDB_OSABI_HPUX_SOM
HP/UX using the SOM executable format.

@findex GDB_OSABI_QNXNTO
@item GDB_OSABI_QNXNTO
QNX Neutrino.

@findex GDB_OSABI_CYGWIN
@item GDB_OSABI_CYGWIN
Cygwin.

@findex GDB_OSABI_AIX
@item GDB_OSABI_AIX
AIX.

@end table

Here are the functions that make up the OS ABI framework:

@deftypefun {const char *} gdbarch_osabi_name (enum gdb_osabi @var{osabi})
Return the name of the OS ABI corresponding to @var{osabi}.
@end deftypefun

@deftypefun void gdbarch_register_osabi (enum bfd_architecture @var{arch}, unsigned long @var{machine}, enum gdb_osabi @var{osabi}, void (*@var{init_osabi})(struct gdbarch_info @var{info}, struct gdbarch *@var{gdbarch}))
Register the OS ABI handler specified by @var{init_osabi} for the
architecture, machine type and OS ABI specified by @var{arch},
@var{machine} and @var{osabi}.  In most cases, a value of zero for the
machine type, which implies the architecture's default machine type,
will suffice.
@end deftypefun

@deftypefun void gdbarch_register_osabi_sniffer (enum bfd_architecture @var{arch}, enum bfd_flavour @var{flavour}, enum gdb_osabi (*@var{sniffer})(bfd *@var{abfd}))
Register the OS ABI file sniffer specified by @var{sniffer} for the
BFD architecture/flavour pair specified by @var{arch} and @var{flavour}.
If @var{arch} is @code{bfd_arch_unknown}, the sniffer is considered to
be generic, and is allowed to examine @var{flavour}-flavoured files for
any architecture.
@end deftypefun

@deftypefun {enum gdb_osabi} gdbarch_lookup_osabi (bfd *@var{abfd})
Examine the file described by @var{abfd} to determine its OS ABI.
The value @code{GDB_OSABI_UNKNOWN} is returned if the OS ABI cannot
be determined.
@end deftypefun

@deftypefun void gdbarch_init_osabi (struct gdbarch info @var{info}, struct gdbarch *@var{gdbarch}, enum gdb_osabi @var{osabi})
Invoke the OS ABI handler corresponding to @var{osabi} to fine-tune the
@code{gdbarch} structure specified by @var{gdbarch}.  If a handler
corresponding to @var{osabi} has not been registered for @var{gdbarch}'s
architecture, a warning will be issued and the debugging session will continue
with the defaults already established for @var{gdbarch}.
@end deftypefun

@deftypefun void generic_elf_osabi_sniff_abi_tag_sections (bfd *@var{abfd}, asection *@var{sect}, void *@var{obj})
Helper routine for ELF file sniffers.  Examine the file described by
@var{abfd} and look at ABI tag note sections to determine the OS ABI
from the note.  This function should be called via
@code{bfd_map_over_sections}.
@end deftypefun

@node Initialize New Architecture
@section Initializing a New Architecture

@menu
* How an Architecture is Represented::
* Looking Up an Existing Architecture::
* Creating a New Architecture::
@end menu

@node How an Architecture is Represented
@subsection How an Architecture is Represented
@cindex architecture representation
@cindex representation of architecture

Each @code{gdbarch} is associated with a single @sc{bfd} architecture,
via a @code{bfd_arch_@var{arch}} in the @code{bfd_architecture}
enumeration.  The @code{gdbarch} is registered by a call to
@code{register_gdbarch_init}, usually from the file's
@code{_initialize_@var{filename}} routine, which will be automatically
called during @value{GDBN} startup.  The arguments are a @sc{bfd}
architecture constant and an initialization function.

@findex _initialize_@var{arch}_tdep
@cindex @file{@var{arch}-tdep.c}
A @value{GDBN} description for a new architecture, @var{arch} is created by
defining a global function @code{_initialize_@var{arch}_tdep}, by
convention in the source file @file{@var{arch}-tdep.c}.  For example,
in the case of the OpenRISC 1000, this function is called
@code{_initialize_or1k_tdep} and is found in the file
@file{or1k-tdep.c}.

@cindex @file{configure.tgt}
@cindex @code{gdbarch}
@findex gdbarch_register
The resulting object files containing the implementation of the
@code{_initialize_@var{arch}_tdep} function are specified in the @value{GDBN}
@file{configure.tgt} file, which includes a large case statement
pattern matching against the @code{--target} option of the
@code{configure} script.  The new @code{struct gdbarch} is created
within the @code{_initialize_@var{arch}_tdep} function by calling
@code{gdbarch_register}:

@smallexample
void gdbarch_register (enum bfd_architecture    @var{architecture},
                       gdbarch_init_ftype      *@var{init_func},
                       gdbarch_dump_tdep_ftype *@var{tdep_dump_func});
@end smallexample

The @var{architecture} will identify the unique @sc{bfd} to be
associated with this @code{gdbarch}.  The @var{init_func} funciton is
called to create and return the new @code{struct gdbarch}.  The
@var{tdep_dump_func} function will dump the target specific details
associated with this architecture.

For example the function @code{_initialize_or1k_tdep} creates its
architecture for 32-bit OpenRISC 1000 architectures by calling:

@smallexample
gdbarch_register (bfd_arch_or32, or1k_gdbarch_init, or1k_dump_tdep);
@end smallexample

@node Looking Up an Existing Architecture
@subsection Looking Up an Existing Architecture
@cindex @code{gdbarch} lookup

The initialization function has this prototype:

@smallexample
static struct gdbarch *
@var{arch}_gdbarch_init (struct gdbarch_info @var{info},
                         struct gdbarch_list *@var{arches})
@end smallexample

The @var{info} argument contains parameters used to select the correct
architecture, and @var{arches} is a list of architectures which
have already been created with the same @code{bfd_arch_@var{arch}}
value.

The initialization function should first make sure that @var{info}
is acceptable, and return @code{NULL} if it is not.  Then, it should
search through @var{arches} for an exact match to @var{info}, and
return one if found.  Lastly, if no exact match was found, it should
create a new architecture based on @var{info} and return it.

@findex gdbarch_list_lookup_by_info
@cindex @code{gdbarch_info}
The lookup is done using @code{gdbarch_list_lookup_by_info}.  It is
passed the list of existing architectures, @var{arches}, and the
@code{struct gdbarch_info}, @var{info}, and returns the first matching
architecture it finds, or @code{NULL} if none are found.  If an
architecture is found it can be returned as the result from the
initialization function, otherwise a new @code{struct gdbach} will need
to be created.

The struct gdbarch_info has the following components:

@smallexample
struct gdbarch_info
@{
   const struct bfd_arch_info *bfd_arch_info;
   int                         byte_order;
   bfd                        *abfd;
   struct gdbarch_tdep_info   *tdep_info;
   enum gdb_osabi              osabi;
   const struct target_desc   *target_desc;
@};
@end smallexample

@vindex bfd_arch_info
The @code{bfd_arch_info} member holds the key details about the
architecture.  The @code{byte_order} member is a value in an
enumeration indicating the endianism.  The @code{abfd} member is a
pointer to the full @sc{bfd}, the @code{tdep_info} member is
additional custom target specific information, @code{osabi} identifies
which (if any) of a number of operating specific ABIs are used by this
architecture and the @code{target_desc} member is a set of name-value
pairs with information about register usage in this target.

When the @code{struct gdbarch} initialization function is called, not
all the fields are provided---only those which can be deduced from the
@sc{bfd}.  The @code{struct gdbarch_info}, @var{info} is used as a
look-up key with the list of existing architectures, @var{arches} to
see if a suitable architecture already exists.  The @var{tdep_info},
@var{osabi} and @var{target_desc} fields may be added before this
lookup to refine the search.

Only information in @var{info} should be used to choose the new
architecture.  Historically, @var{info} could be sparse, and
defaults would be collected from the first element on @var{arches}.
However, @value{GDBN} now fills in @var{info} more thoroughly,
so new @code{gdbarch} initialization functions should not take
defaults from @var{arches}.

@node Creating a New Architecture
@subsection Creating a New Architecture
@cindex @code{struct gdbarch} creation

@findex gdbarch_alloc
@cindex @code{gdbarch_tdep} when allocating new @code{gdbarch}
If no architecture is found, then a new architecture must be created,
by calling @code{gdbarch_alloc} using the supplied @code{@w{struct
gdbarch_info}} and any additional custom target specific
information in a @code{struct gdbarch_tdep}.  The prototype for
@code{gdbarch_alloc} is:

@smallexample
struct gdbarch *gdbarch_alloc (const struct gdbarch_info *@var{info},
                               struct gdbarch_tdep       *@var{tdep}); 
@end smallexample

@cindex @code{set_gdbarch} functions
@cindex @code{gdbarch} accessor functions
The newly created struct gdbarch must then be populated.  Although
there are default values, in most cases they are not what is
required.

For each element, @var{X}, there is are a pair of corresponding accessor
functions, one to set the value of that element,
@code{set_gdbarch_@var{X}}, the second to either get the value of an
element (if it is a variable) or to apply the element (if it is a
function), @code{gdbarch_@var{X}}.  Note that both accessor functions
take a pointer to the @code{@w{struct gdbarch}} as first
argument.  Populating the new @code{gdbarch} should use the
@code{set_gdbarch} functions.

The following sections identify the main elements that should be set
in this way.  This is not the complete list, but represents the
functions and elements that must commonly be specified for a new
architecture.  Many of the functions and variables are described in the
header file @file{gdbarch.h}.

This is the main work in defining a new architecture.  Implementing the
set of functions to populate the @code{struct gdbarch}.

@cindex @code{gdbarch_tdep} definition
@code{struct gdbarch_tdep} is not defined within @value{GDBN}---it is up
to the user to define this struct if it is needed to hold custom target
information that is not covered by the standard @code{@w{struct
gdbarch}}. For example with the OpenRISC 1000 architecture it is used to
hold the number of matchpoints available in the target (along with other
information).

If there is no additional target specific information, it can be set to
@code{NULL}.

@node Registers and Memory
@section Registers and Memory

@value{GDBN}'s model of the target machine is rather simple.
@value{GDBN} assumes the machine includes a bank of registers and a
block of memory.  Each register may have a different size.

@value{GDBN} does not have a magical way to match up with the
compiler's idea of which registers are which; however, it is critical
that they do match up accurately.  The only way to make this work is
to get accurate information about the order that the compiler uses,
and to reflect that in the @code{gdbarch_register_name} and related functions.

@value{GDBN} can handle big-endian, little-endian, and bi-endian architectures.

@node Pointers and Addresses
@section Pointers Are Not Always Addresses
@cindex pointer representation
@cindex address representation
@cindex word-addressed machines
@cindex separate data and code address spaces
@cindex spaces, separate data and code address
@cindex address spaces, separate data and code
@cindex code pointers, word-addressed
@cindex converting between pointers and addresses
@cindex D10V addresses

On almost all 32-bit architectures, the representation of a pointer is
indistinguishable from the representation of some fixed-length number
whose value is the byte address of the object pointed to.  On such
machines, the words ``pointer'' and ``address'' can be used interchangeably.
However, architectures with smaller word sizes are often cramped for
address space, so they may choose a pointer representation that breaks this
identity, and allows a larger code address space.

@c D10V is gone from sources - more current example?

For example, the Renesas D10V is a 16-bit VLIW processor whose
instructions are 32 bits long@footnote{Some D10V instructions are
actually pairs of 16-bit sub-instructions.  However, since you can't
jump into the middle of such a pair, code addresses can only refer to
full 32 bit instructions, which is what matters in this explanation.}.
If the D10V used ordinary byte addresses to refer to code locations,
then the processor would only be able to address 64kb of instructions.
However, since instructions must be aligned on four-byte boundaries, the
low two bits of any valid instruction's byte address are always
zero---byte addresses waste two bits.  So instead of byte addresses,
the D10V uses word addresses---byte addresses shifted right two bits---to
refer to code.  Thus, the D10V can use 16-bit words to address 256kb of
code space.

However, this means that code pointers and data pointers have different
forms on the D10V.  The 16-bit word @code{0xC020} refers to byte address
@code{0xC020} when used as a data address, but refers to byte address
@code{0x30080} when used as a code address.

(The D10V also uses separate code and data address spaces, which also
affects the correspondence between pointers and addresses, but we're
going to ignore that here; this example is already too long.)

To cope with architectures like this---the D10V is not the only
one!---@value{GDBN} tries to distinguish between @dfn{addresses}, which are
byte numbers, and @dfn{pointers}, which are the target's representation
of an address of a particular type of data.  In the example above,
@code{0xC020} is the pointer, which refers to one of the addresses
@code{0xC020} or @code{0x30080}, depending on the type imposed upon it.
@value{GDBN} provides functions for turning a pointer into an address
and vice versa, in the appropriate way for the current architecture.

Unfortunately, since addresses and pointers are identical on almost all
processors, this distinction tends to bit-rot pretty quickly.  Thus,
each time you port @value{GDBN} to an architecture which does
distinguish between pointers and addresses, you'll probably need to
clean up some architecture-independent code.

Here are functions which convert between pointers and addresses:

@deftypefun CORE_ADDR extract_typed_address (void *@var{buf}, struct type *@var{type})
Treat the bytes at @var{buf} as a pointer or reference of type
@var{type}, and return the address it represents, in a manner
appropriate for the current architecture.  This yields an address
@value{GDBN} can use to read target memory, disassemble, etc.  Note that
@var{buf} refers to a buffer in @value{GDBN}'s memory, not the
inferior's.

For example, if the current architecture is the Intel x86, this function
extracts a little-endian integer of the appropriate length from
@var{buf} and returns it.  However, if the current architecture is the
D10V, this function will return a 16-bit integer extracted from
@var{buf}, multiplied by four if @var{type} is a pointer to a function.

If @var{type} is not a pointer or reference type, then this function
will signal an internal error.
@end deftypefun

@deftypefun CORE_ADDR store_typed_address (void *@var{buf}, struct type *@var{type}, CORE_ADDR @var{addr})
Store the address @var{addr} in @var{buf}, in the proper format for a
pointer of type @var{type} in the current architecture.  Note that
@var{buf} refers to a buffer in @value{GDBN}'s memory, not the
inferior's.

For example, if the current architecture is the Intel x86, this function
stores @var{addr} unmodified as a little-endian integer of the
appropriate length in @var{buf}.  However, if the current architecture
is the D10V, this function divides @var{addr} by four if @var{type} is
a pointer to a function, and then stores it in @var{buf}.

If @var{type} is not a pointer or reference type, then this function
will signal an internal error.
@end deftypefun

@deftypefun CORE_ADDR value_as_address (struct value *@var{val})
Assuming that @var{val} is a pointer, return the address it represents,
as appropriate for the current architecture.

This function actually works on integral values, as well as pointers.
For pointers, it performs architecture-specific conversions as
described above for @code{extract_typed_address}.
@end deftypefun

@deftypefun CORE_ADDR value_from_pointer (struct type *@var{type}, CORE_ADDR @var{addr})
Create and return a value representing a pointer of type @var{type} to
the address @var{addr}, as appropriate for the current architecture.
This function performs architecture-specific conversions as described
above for @code{store_typed_address}.
@end deftypefun

Here are two functions which architectures can define to indicate the
relationship between pointers and addresses.  These have default
definitions, appropriate for architectures on which all pointers are
simple unsigned byte addresses.

@deftypefun CORE_ADDR gdbarch_pointer_to_address (struct gdbarch *@var{gdbarch}, struct type *@var{type}, char *@var{buf})
Assume that @var{buf} holds a pointer of type @var{type}, in the
appropriate format for the current architecture.  Return the byte
address the pointer refers to.

This function may safely assume that @var{type} is either a pointer or a
C@t{++} reference type.
@end deftypefun

@deftypefun void gdbarch_address_to_pointer (struct gdbarch *@var{gdbarch}, struct type *@var{type}, char *@var{buf}, CORE_ADDR @var{addr})
Store in @var{buf} a pointer of type @var{type} representing the address
@var{addr}, in the appropriate format for the current architecture.

This function may safely assume that @var{type} is either a pointer or a
C@t{++} reference type.
@end deftypefun

@node Address Classes
@section Address Classes
@cindex address classes
@cindex DW_AT_byte_size
@cindex DW_AT_address_class

Sometimes information about different kinds of addresses is available
via the debug information.  For example, some programming environments
define addresses of several different sizes.  If the debug information
distinguishes these kinds of address classes through either the size
info (e.g, @code{DW_AT_byte_size} in @w{DWARF 2}) or through an explicit
address class attribute (e.g, @code{DW_AT_address_class} in @w{DWARF 2}), the
following macros should be defined in order to disambiguate these
types within @value{GDBN} as well as provide the added information to
a @value{GDBN} user when printing type expressions.

@deftypefun int gdbarch_address_class_type_flags (struct gdbarch *@var{gdbarch}, int @var{byte_size}, int @var{dwarf2_addr_class})
Returns the type flags needed to construct a pointer type whose size
is @var{byte_size} and whose address class is @var{dwarf2_addr_class}.
This function is normally called from within a symbol reader.  See
@file{dwarf2read.c}.
@end deftypefun

@deftypefun {char *} gdbarch_address_class_type_flags_to_name (struct gdbarch *@var{gdbarch}, int @var{type_flags})
Given the type flags representing an address class qualifier, return
its name.
@end deftypefun
@deftypefun int gdbarch_address_class_name_to_type_flags (struct gdbarch *@var{gdbarch}, int @var{name}, int *@var{type_flags_ptr})
Given an address qualifier name, set the @code{int} referenced by @var{type_flags_ptr} to the type flags
for that address class qualifier.
@end deftypefun

Since the need for address classes is rather rare, none of
the address class functions are defined by default.  Predicate
functions are provided to detect when they are defined.

Consider a hypothetical architecture in which addresses are normally
32-bits wide, but 16-bit addresses are also supported.  Furthermore,
suppose that the @w{DWARF 2} information for this architecture simply
uses a @code{DW_AT_byte_size} value of 2 to indicate the use of one
of these "short" pointers.  The following functions could be defined
to implement the address class functions:

@smallexample
somearch_address_class_type_flags (int byte_size,
                                   int dwarf2_addr_class)
@{
  if (byte_size == 2)
    return TYPE_FLAG_ADDRESS_CLASS_1;
  else
    return 0;
@}

static char *
somearch_address_class_type_flags_to_name (int type_flags)
@{
  if (type_flags & TYPE_FLAG_ADDRESS_CLASS_1)
    return "short";
  else
    return NULL;
@}

int
somearch_address_class_name_to_type_flags (char *name,
                                           int *type_flags_ptr)
@{
  if (strcmp (name, "short") == 0)
    @{
      *type_flags_ptr = TYPE_FLAG_ADDRESS_CLASS_1;
      return 1;
    @}
  else
    return 0;
@}
@end smallexample

The qualifier @code{@@short} is used in @value{GDBN}'s type expressions
to indicate the presence of one of these ``short'' pointers.  For
example if the debug information indicates that @code{short_ptr_var} is
one of these short pointers, @value{GDBN} might show the following
behavior:

@smallexample
(gdb) ptype short_ptr_var
type = int * @@short
@end smallexample


@node Register Representation
@section Register Representation

@menu
* Raw and Cooked Registers::
* Register Architecture Functions & Variables::
* Register Information Functions::
* Register and Memory Data::
* Register Caching::
@end menu

@node Raw and Cooked Registers
@subsection Raw and Cooked Registers
@cindex raw register representation
@cindex cooked register representation
@cindex representations, raw and cooked registers

@value{GDBN} considers registers to be a set with members numbered
linearly from 0 upwards.  The first part of that set corresponds to real
physical registers, the second part to any @dfn{pseudo-registers}.
Pseudo-registers have no independent physical existence, but are useful
representations of information within the architecture.  For example the
OpenRISC 1000 architecture has up to 32 general purpose registers, which
are typically represented as 32-bit (or 64-bit) integers.  However the
GPRs are also used as operands to the floating point operations, and it
could be convenient to define a set of pseudo-registers, to show the
GPRs represented as floating point values.

For any architecture, the implementer will decide on a mapping from
hardware to @value{GDBN} register numbers.  The registers corresponding to real
hardware are referred to as @dfn{raw} registers, the remaining registers are
@dfn{pseudo-registers}.  The total register set (raw and pseudo) is called
the @dfn{cooked} register set.


@node Register Architecture Functions & Variables
@subsection Functions and Variables Specifying the Register Architecture
@cindex @code{gdbarch} register architecture functions

These @code{struct gdbarch} functions and variables specify the number
and type of registers in the architecture.

@deftypefn {Architecture Function} CORE_ADDR read_pc (struct regcache *@var{regcache})
@end deftypefn
@deftypefn {Architecture Function} void write_pc (struct regcache *@var{regcache}, CORE_ADDR @var{val})

Read or write the program counter.  The default value of both
functions is @code{NULL} (no function available).  If the program
counter is just an ordinary register, it can be specified in
@code{struct gdbarch} instead (see @code{pc_regnum} below) and it will
be read or written using the standard routines to access registers.  This
function need only be specified if the program counter is not an
ordinary register.

Any register information can be obtained using the supplied register
cache, @var{regcache}.  @xref{Register Caching, , Register Caching}.

@end deftypefn

@deftypefn {Architecture Function} void pseudo_register_read (struct gdbarch *@var{gdbarch}, struct regcache *@var{regcache}, int @var{regnum}, const gdb_byte *@var{buf})
@end deftypefn
@deftypefn {Architecture Function} void pseudo_register_write (struct gdbarch *@var{gdbarch}, struct regcache *@var{regcache}, int @var{regnum}, const gdb_byte *@var{buf})

These functions should be defined if there are any pseudo-registers.
The default value is @code{NULL}.  @var{regnum} is the number of the
register to read or write (which will be a @dfn{cooked} register
number) and @var{buf} is the buffer where the value read will be
placed, or from which the value to be written will be taken.  The
value in the buffer may be converted to or from a signed or unsigned
integral value using one of the utility functions (@pxref{Register and
Memory Data, , Using Different Register and Memory Data
Representations}).

The access should be for the specified architecture,
@var{gdbarch}.  Any register information can be obtained using the
supplied register cache, @var{regcache}.  @xref{Register Caching, ,
Register Caching}.

@end deftypefn

@deftypevr {Architecture Variable} int sp_regnum
@vindex sp_regnum
@cindex stack pointer
@cindex @kbd{$sp}

This specifies the register holding the stack pointer, which may be a
raw or pseudo-register.  It defaults to -1 (not defined), but it is an
error for it not to be defined.

The value of the stack pointer register can be accessed withing
@value{GDBN} as the variable @kbd{$sp}.

@end deftypevr

@deftypevr {Architecture Variable} int pc_regnum
@vindex pc_regnum
@cindex program counter
@cindex @kbd{$pc}

This specifies the register holding the program counter, which may be a
raw or pseudo-register.  It defaults to -1 (not defined).  If
@code{pc_regnum} is not defined, then the functions @code{read_pc} and
@code{write_pc} (see above) must be defined.

The value of the program counter (whether defined as a register, or
through @code{read_pc} and @code{write_pc}) can be accessed withing
@value{GDBN} as the variable @kbd{$pc}.

@end deftypevr

@deftypevr {Architecture Variable} int ps_regnum
@vindex ps_regnum
@cindex processor status register
@cindex status register
@cindex @kbd{$ps}

This specifies the register holding the processor status (often called
the status register), which may be a raw or pseudo-register.  It
defaults to -1 (not defined).

If defined, the value of this register can be accessed withing
@value{GDBN} as the variable @kbd{$ps}.

@end deftypevr

@deftypevr {Architecture Variable} int fp0_regnum
@vindex fp0_regnum
@cindex first floating point register

This specifies the first floating point register.  It defaults to
0.  @code{fp0_regnum} is not needed unless the target offers support
for floating point.

@end deftypevr

@node Register Information Functions
@subsection Functions Giving Register Information
@cindex @code{gdbarch} register information functions

These functions return information about registers.

@deftypefn {Architecture Function} {const char *} register_name (struct gdbarch *@var{gdbarch}, int @var{regnum})

This function should convert a register number (raw or pseudo) to a
register name (as a C @code{const char *}).  This is used both to
determine the name of a register for output and to work out the meaning
of any register names used as input.  The function may also return
@code{NULL}, to indicate that @var{regnum} is not a valid register.

For example with the OpenRISC 1000, @value{GDBN} registers 0-31 are the
General Purpose Registers, register 32 is the program counter and
register 33 is the supervision register (i.e.@: the processor status
register), which map to the strings @code{"gpr00"} through
@code{"gpr31"}, @code{"pc"} and @code{"sr"} respectively. This means
that the @value{GDBN} command @kbd{print $gpr5} should print the value of
the OR1K general purpose register 5@footnote{
@cindex frame pointer
@cindex @kbd{$fp}
Historically, @value{GDBN} always had a concept of a frame pointer
register, which could be accessed via the @value{GDBN} variable,
@kbd{$fp}.  That concept is now deprecated, recognizing that not all
architectures have a frame pointer.  However if an architecture does
have a frame pointer register, and defines a register or
pseudo-register with the name @code{"fp"}, then that register will be
used as the value of the @kbd{$fp} variable.}.

The default value for this function is @code{NULL}, meaning
undefined. It should always be defined.

The access should be for the specified architecture, @var{gdbarch}.

@end deftypefn

@deftypefn {Architecture Function} {struct type *} register_type (struct gdbarch *@var{gdbarch}, int @var{regnum})

Given a register number, this function identifies the type of data it
may be holding, specified as a @code{struct type}.  @value{GDBN} allows
creation of arbitrary types, but a number of built in types are
provided (@code{builtin_type_void}, @code{builtin_type_int32} etc),
together with functions to derive types from these.

Typically the program counter will have a type of ``pointer to
function'' (it points to code), the frame pointer and stack pointer
will have types of ``pointer to void'' (they point to data on the stack)
and all other integer registers will have a type of 32-bit integer or
64-bit integer.

This information guides the formatting when displaying register
information.  The default value is @code{NULL} meaning no information is
available to guide formatting when displaying registers.

@end deftypefn

@deftypefn {Architecture Function} void print_registers_info (struct gdbarch *@var{gdbarch}, struct ui_file *@var{file}, struct frame_info *@var{frame}, int @var{regnum}, int @var{all})

Define this function to print out one or all of the registers for the
@value{GDBN} @kbd{info registers} command.  The default value is the
function @code{default_print_registers_info}, which uses the register
type information (see @code{register_type} above) to determine how each
register should be printed.  Define a custom version of this function
for fuller control over how the registers are displayed.

The access should be for the specified architecture, @var{gdbarch},
with output to the file specified by the User Interface
Independent Output file handle, @var{file} (@pxref{UI-Independent
Output, , UI-Independent Output---the @code{ui_out}
Functions}).

The registers should show their values in the frame specified by
@var{frame}.  If @var{regnum} is -1 and @var{all} is zero, then all
the ``significant'' registers should be shown (the implementer should
decide which registers are ``significant''). Otherwise only the value of
the register specified by @var{regnum} should be output.  If
@var{regnum} is -1 and @var{all} is non-zero (true), then the value of
all registers should be shown.

By default @code{default_print_registers_info} prints one register per
line, and if @var{all} is zero omits floating-point registers.

@end deftypefn

@deftypefn {Architecture Function} void print_float_info (struct gdbarch *@var{gdbarch}, struct ui_file *@var{file}, struct frame_info *@var{frame}, const char *@var{args})

Define this function to provide output about the floating point unit and
registers for the @value{GDBN} @kbd{info float} command respectively.
The default value is @code{NULL} (not defined), meaning no information
will be provided.

The @var{gdbarch} and @var{file} and @var{frame} arguments have the same
meaning as in the @code{print_registers_info} function above. The string
@var{args} contains any supplementary arguments to the @kbd{info float}
command.

Define this function if the target supports floating point operations.

@end deftypefn

@deftypefn {Architecture Function} void print_vector_info (struct gdbarch *@var{gdbarch}, struct ui_file *@var{file}, struct frame_info *@var{frame}, const char *@var{args})

Define this function to provide output about the vector unit and
registers for the @value{GDBN} @kbd{info vector} command respectively.
The default value is @code{NULL} (not defined), meaning no information
will be provided.

The @var{gdbarch}, @var{file} and @var{frame} arguments have the
same meaning as in the @code{print_registers_info} function above.  The
string @var{args} contains any supplementary arguments to the @kbd{info
vector} command.

Define this function if the target supports vector operations.

@end deftypefn

@deftypefn {Architecture Function} int register_reggroup_p (struct gdbarch *@var{gdbarch}, int @var{regnum}, struct reggroup *@var{group})

@value{GDBN} groups registers into different categories (general,
vector, floating point etc).  This function, given a register,
@var{regnum}, and group, @var{group}, returns 1 (true) if the register
is in the group and 0 (false) otherwise.

The information should be for the specified architecture,
@var{gdbarch}

The default value is the function @code{default_register_reggroup_p}
which will do a reasonable job based on the type of the register (see
the function @code{register_type} above), with groups for general
purpose registers, floating point registers, vector registers and raw
(i.e not pseudo) registers.

@end deftypefn

@node Register and Memory Data
@subsection Using Different Register and Memory Data Representations
@cindex register representation
@cindex memory representation
@cindex representations, register and memory
@cindex register data formats, converting
@cindex @code{struct value}, converting register contents to

Some architectures have different representations of data objects,
depending whether the object is held in a register or memory.  For
example:

@itemize @bullet

@item
The Alpha architecture can represent 32 bit integer values in
floating-point registers.

@item
The x86 architecture supports 80-bit floating-point registers.  The
@code{long double} data type occupies 96 bits in memory but only 80
bits when stored in a register.

@end itemize

In general, the register representation of a data type is determined by
the architecture, or @value{GDBN}'s interface to the architecture, while
the memory representation is determined by the Application Binary
Interface.

For almost all data types on almost all architectures, the two
representations are identical, and no special handling is needed.
However, they do occasionally differ.  An architecture may define the
following @code{struct gdbarch} functions to request conversions
between the register and memory representations of a data type:

@deftypefn {Architecture Function} int gdbarch_convert_register_p (struct gdbarch *@var{gdbarch}, int @var{reg})

Return non-zero (true) if the representation of a data value stored in
this register may be different to the representation of that same data
value when stored in memory.  The default value is @code{NULL}
(undefined).

If this function is defined and returns non-zero, the @code{struct
gdbarch} functions @code{gdbarch_register_to_value} and
@code{gdbarch_value_to_register} (see below) should be used to perform
any necessary conversion.

If defined, this function should return zero for the register's native
type, when no conversion is necessary.
@end deftypefn

@deftypefn {Architecture Function} void gdbarch_register_to_value (struct gdbarch *@var{gdbarch}, int @var{reg}, struct type *@var{type}, char *@var{from}, char *@var{to})

Convert the value of register number @var{reg} to a data object of
type @var{type}.  The buffer at @var{from} holds the register's value
in raw format; the converted value should be placed in the buffer at
@var{to}.

@quotation
@emph{Note:} @code{gdbarch_register_to_value} and
@code{gdbarch_value_to_register} take their @var{reg} and @var{type}
arguments in different orders.
@end quotation

@code{gdbarch_register_to_value} should only be used with registers
for which the @code{gdbarch_convert_register_p} function returns a
non-zero value.

@end deftypefn

@deftypefn {Architecture Function} void gdbarch_value_to_register (struct gdbarch *@var{gdbarch}, struct type *@var{type}, int @var{reg}, char *@var{from}, char *@var{to})

Convert a data value of type @var{type} to register number @var{reg}'
raw format.

@quotation
@emph{Note:} @code{gdbarch_register_to_value} and
@code{gdbarch_value_to_register} take their @var{reg} and @var{type}
arguments in different orders.
@end quotation

@code{gdbarch_value_to_register} should only be used with registers
for which the @code{gdbarch_convert_register_p} function returns a
non-zero value.

@end deftypefn

@node Register Caching
@subsection Register Caching
@cindex register caching

Caching of registers is used, so that the target does not need to be
accessed and reanalyzed multiple times for each register in
circumstances where the register value cannot have changed.

@cindex @code{struct regcache}
@value{GDBN} provides @code{struct regcache}, associated with a
particular @code{struct gdbarch} to hold the cached values of the raw
registers.  A set of functions is provided to access both the raw
registers (with @code{raw} in their name) and the full set of cooked
registers (with @code{cooked} in their name).  Functions are provided
to ensure the register cache is kept synchronized with the values of
the actual registers in the target.

Accessing registers through the @code{struct regcache} routines will
ensure that the appropriate @code{struct gdbarch} functions are called
when necessary to access the underlying target architecture.  In general
users should use the @dfn{cooked} functions, since these will map to the
@dfn{raw} functions automatically as appropriate.

@findex regcache_cooked_read
@findex regcache_cooked_write
@cindex @code{gdb_byte}
@findex regcache_cooked_read_signed
@findex regcache_cooked_read_unsigned
@findex regcache_cooked_write_signed
@findex regcache_cooked_write_unsigned
The two key functions are @code{regcache_cooked_read} and
@code{regcache_cooked_write} which read or write a register from or to
a byte buffer (type @code{gdb_byte *}).  For convenience the wrapper
functions @code{regcache_cooked_read_signed},
@code{regcache_cooked_read_unsigned},
@code{regcache_cooked_write_signed} and
@code{regcache_cooked_write_unsigned} are provided, which read or
write the value using the buffer and convert to or from an integral
value as appropriate.

@node Frame Interpretation
@section Frame Interpretation

@menu
* All About Stack Frames::
* Frame Handling Terminology::
* Prologue Caches::
* Functions and Variable to Analyze Frames::
* Functions to Access Frame Data::
* Analyzing Stacks---Frame Sniffers::
@end menu

@node All About Stack Frames
@subsection All About Stack Frames

@value{GDBN} needs to understand the stack on which local (automatic)
variables are stored.  The area of the stack containing all the local
variables for a function invocation is known as the @dfn{stack frame}
for that function (or colloquially just as the @dfn{frame}).  In turn the
function that called the function will have its stack frame, and so on
back through the chain of functions that have been called.

Almost all architectures have one register dedicated to point to the
end of the stack (the @dfn{stack pointer}).  Many have a second register
which points to the start of the currently active stack frame (the
@dfn{frame pointer}).  The specific arrangements for an architecture are
a key part of the ABI.

A diagram helps to explain this.  Here is a simple program to compute
factorials:

@smallexample
#include <stdio.h>
int fact (int n)
@{
  if (0 == n)
    @{
      return 1;
    @}
  else
    @{
      return n * fact (n - 1);
    @}
@}

main ()
@{
  int i;

  for (i = 0; i < 10; i++)
    @{
      int   f = fact (i);
      printf ("%d! = %d\n", i, f);
    @}
@}
@end smallexample

Consider the state of the stack when the code reaches line 6 after the
main program has called @code{fact@w{ }(3)}.  The chain of function
calls will be @code{main ()}, @code{fact@w{ }(3)}, @code{fact@w{
}(2)}, @code{@w{fact (1)}} and @code{fact@w{ }(0)}.

In this illustration the stack is falling (as used for example by the
OpenRISC 1000 ABI).  The stack pointer (SP) is at the end of the stack
(lowest address) and the frame pointer (FP) is at the highest address
in the current stack frame.  The following diagram shows how the stack
looks.

@center @image{stack_frame,14cm}

In each stack frame, offset 0 from the stack pointer is the frame
pointer of the previous frame and offset 4 (this is illustrating a
32-bit architecture) from the stack pointer is the return address.
Local variables are indexed from the frame pointer, with negative
indexes.  In the function @code{fact}, offset -4 from the frame
pointer is the argument @var{n}.  In the @code{main} function, offset
-4 from the frame pointer is the local variable @var{i} and offset -8
from the frame pointer is the local variable @var{f}@footnote{This is
a simplified example for illustrative purposes only.  Good optimizing
compilers would not put anything on the stack for such simple
functions.  Indeed they might eliminate the recursion and use of the
stack entirely!}.

It is very easy to get confused when examining stacks.  @value{GDBN}
has terminology it uses rigorously throughout.  The stack frame of the
function currently executing, or where execution stopped is numbered
zero.  In this example frame #0 is the stack frame of the call to
@code{fact@w{ }(0)}.  The stack frame of its calling function
(@code{fact@w{ }(1)} in this case) is numbered #1 and so on back
through the chain of calls.

The main @value{GDBN} data structure describing frames is
 @code{@w{struct frame_info}}.  It is not used directly, but only via
its accessor functions.  @code{frame_info} includes information about
the registers in the frame and a pointer to the code of the function
with which the frame is associated.  The entire stack is represented as
a linked list of @code{frame_info} structs.

@node Frame Handling Terminology
@subsection Frame Handling Terminology

It is easy to get confused when referencing stack frames.  @value{GDBN}
uses some precise terminology.

@itemize @bullet

@item
@cindex THIS frame
@cindex stack frame, definition of THIS frame
@cindex frame, definition of THIS frame
@dfn{THIS} frame is the frame currently under consideration.

@item
@cindex NEXT frame
@cindex stack frame, definition of NEXT frame
@cindex frame, definition of NEXT frame
The @dfn{NEXT} frame, also sometimes called the inner or newer frame is the
frame of the function called by the function of THIS frame.

@item
@cindex PREVIOUS frame
@cindex stack frame, definition of PREVIOUS frame
@cindex frame, definition of PREVIOUS frame
The @dfn{PREVIOUS} frame, also sometimes called the outer or older frame is
the frame of the function which called the function of THIS frame.

@end itemize

So in the example in the previous section (@pxref{All About Stack
Frames, , All About Stack Frames}), if THIS frame is #3 (the call to
@code{fact@w{ }(3)}), the NEXT frame is frame #2 (the call to
@code{fact@w{ }(2)}) and the PREVIOUS frame is frame #4 (the call to
@code{main@w{ }()}).

@cindex innermost frame
@cindex stack frame, definition of innermost frame
@cindex frame, definition of innermost frame
The @dfn{innermost} frame is the frame of the current executing
function, or where the program stopped, in this example, in the middle
of the call to @code{@w{fact (0))}}.  It is always numbered frame #0.

@cindex base of a frame
@cindex stack frame, definition of base of a frame
@cindex frame, definition of base of a frame
The @dfn{base} of a frame is the address immediately before the start
of the NEXT frame.  For a stack which grows down in memory (a
@dfn{falling} stack) this will be the lowest address and for a stack
which grows up in memory (a @dfn{rising} stack) this will be the
highest address in the frame.

@value{GDBN} functions to analyze the stack are typically given a
pointer to the NEXT frame to determine information about THIS
frame.  Information about THIS frame includes data on where the
registers of the PREVIOUS frame are stored in this stack frame.  In
this example the frame pointer of the PREVIOUS frame is stored at
offset 0 from the stack pointer of THIS frame.

@cindex unwinding
@cindex stack frame, definition of unwinding
@cindex frame, definition of unwinding
The process whereby a function is given a pointer to the NEXT
frame to work out information about THIS frame is referred to as
@dfn{unwinding}.  The @value{GDBN} functions involved in this typically
include unwind in their name.

@cindex sniffing
@cindex stack frame, definition of sniffing
@cindex frame, definition of sniffing
The process of analyzing a target to determine the information that
should go in struct frame_info is called @dfn{sniffing}.  The functions
that carry this out are called sniffers and typically include sniffer
in their name.  More than one sniffer may be required to extract all
the information for a particular frame.

@cindex sentinel frame
@cindex stack frame, definition of sentinel frame
@cindex frame, definition of sentinel frame
Because so many functions work using the NEXT frame, there is an issue
about addressing the innermost frame---it has no NEXT frame.  To solve
this @value{GDBN} creates a dummy frame #-1, known as the
@dfn{sentinel} frame.

@node Prologue Caches
@subsection Prologue Caches

@cindex function prologue
@cindex prologue of a function
All the frame sniffing functions typically examine the code at the
start of the corresponding function, to determine the state of
registers.  The ABI will save old values and set new values of key
registers at the start of each function in what is known as the
function @dfn{prologue}.

@cindex prologue cache
For any particular stack frame this data does not change, so all the
standard unwinding functions, in addition to receiving a pointer to
the NEXT frame as their first argument, receive a pointer to a
@dfn{prologue cache} as their second argument.  This can be used to store
values associated with a particular frame, for reuse on subsequent
calls involving the same frame.

It is up to the user to define the structure used (it is a
@code{void@w{ }*} pointer) and arrange allocation and deallocation of
storage.  However for general use, @value{GDBN} provides
@code{@w{struct trad_frame_cache}}, with a set of accessor
routines.  This structure holds the stack and code address of
THIS frame, the base address of the frame, a pointer to the
struct @code{frame_info} for the NEXT frame and details of
where the registers of the PREVIOUS frame may be found in THIS
frame.

Typically the first time any sniffer function is called with NEXT
frame, the prologue sniffer for THIS frame will be @code{NULL}.  The
sniffer will analyze the frame, allocate a prologue cache structure
and populate it.  Subsequent calls using the same NEXT frame will
pass in this prologue cache, so the data can be returned with no
additional analysis.

@node Functions and Variable to Analyze Frames
@subsection Functions and Variable to Analyze Frames

These struct @code{gdbarch} functions and variable should be defined
to provide analysis of the stack frame and allow it to be adjusted as
required.

@deftypefn {Architecture Function} CORE_ADDR skip_prologue (struct gdbarch *@var{gdbarch}, CORE_ADDR @var{pc})

The prologue of a function is the code at the beginning of the
function which sets up the stack frame, saves the return address
etc.  The code representing the behavior of the function starts after
the prologue.

This function skips past the prologue of a function if the program
counter, @var{pc}, is within the prologue of a function.  The result is
the program counter immediately after the prologue.  With modern
optimizing compilers, this may be a far from trivial exercise.  However
the required information may be within the binary as DWARF2 debugging
information, making the job much easier.

The default value is @code{NULL} (not defined).  This function should always
be provided, but can take advantage of DWARF2 debugging information,
if that is available.

@end deftypefn

@deftypefn {Architecture Function} int inner_than (CORE_ADDR @var{lhs}, CORE_ADDR @var{rhs})
@findex core_addr_lessthan
@findex core_addr_greaterthan

Given two frame or stack pointers, return non-zero (true) if the first
represents the @dfn{inner} stack frame and 0 (false) otherwise.  This
is used to determine whether the target has a stack which grows up in
memory (rising stack) or grows down in memory (falling stack).
@xref{All About Stack Frames, , All About Stack Frames}, for an
explanation of @dfn{inner} frames.

The default value of this function is @code{NULL} and it should always
be defined.  However for almost all architectures one of the built-in
functions can be used: @code{core_addr_lessthan} (for stacks growing
down in memory) or @code{core_addr_greaterthan} (for stacks growing up
in memory).

@end deftypefn

@anchor{frame_align}
@deftypefn {Architecture Function} CORE_ADDR frame_align (struct gdbarch *@var{gdbarch}, CORE_ADDR @var{address})
@findex align_down
@findex align_up

The architecture may have constraints on how its frames are
aligned.  For example the OpenRISC 1000 ABI requires stack frames to be
double-word aligned, but 32-bit versions of the architecture allocate
single-word values to the stack.  Thus extra padding may be needed at
the end of a stack frame.

Given a proposed address for the stack pointer, this function
returns a suitably aligned address (by expanding the stack frame).

The default value is @code{NULL} (undefined).  This function should be defined
for any architecture where it is possible the stack could become
misaligned.  The utility functions @code{align_down} (for falling
stacks) and @code{align_up} (for rising stacks) will facilitate the
implementation of this function.

@end deftypefn

@deftypevr {Architecture Variable} int frame_red_zone_size

Some ABIs reserve space beyond the end of the stack for use by leaf
functions without prologue or epilogue or by exception handlers (for
example the OpenRISC 1000).

This is known as a @dfn{red zone} (AMD terminology).  The @sc{amd64}
(nee x86-64) ABI documentation refers to the @dfn{red zone} when
describing this scratch area.

The default value is 0.  Set this field if the architecture has such a
red zone.  The value must be aligned as required by the ABI (see
@code{frame_align} above for an explanation of stack frame alignment).

@end deftypevr

@node Functions to Access Frame Data
@subsection Functions to Access Frame Data

These functions provide access to key registers and arguments in the
stack frame.

@deftypefn {Architecture Function} CORE_ADDR unwind_pc (struct gdbarch *@var{gdbarch}, struct frame_info *@var{next_frame})

This function is given a pointer to the NEXT stack frame (@pxref{All
About Stack Frames, , All About Stack Frames}, for how frames are
represented) and returns the value of the program counter in the
PREVIOUS frame (i.e.@: the frame of the function that called THIS
one).  This is commonly referred to as the @dfn{return address}.

The implementation, which must be frame agnostic (work with any frame),
is typically no more than:

@smallexample
ULONGEST pc;
pc = frame_unwind_register_unsigned (next_frame, @var{ARCH}_PC_REGNUM);
return gdbarch_addr_bits_remove (gdbarch, pc);
@end smallexample

@end deftypefn

@deftypefn {Architecture Function} CORE_ADDR unwind_sp (struct gdbarch *@var{gdbarch}, struct frame_info *@var{next_frame})

This function is given a pointer to the NEXT stack frame
(@pxref{All About Stack Frames, , All About Stack Frames} for how
frames are represented) and returns the value of the stack pointer in
the PREVIOUS frame (i.e.@: the frame of the function that called
THIS one).

The implementation, which must be frame agnostic (work with any frame),
is typically no more than:

@smallexample
ULONGEST sp;
sp = frame_unwind_register_unsigned (next_frame, @var{ARCH}_SP_REGNUM);
return gdbarch_addr_bits_remove (gdbarch, sp);
@end smallexample

@end deftypefn

@deftypefn {Architecture Function} int frame_num_args (struct gdbarch *@var{gdbarch}, struct frame_info *@var{this_frame})

This function is given a pointer to THIS stack frame (@pxref{All
About Stack Frames, , All About Stack Frames} for how frames are
represented), and returns the number of arguments that are being
passed, or -1 if not known.

The default value is @code{NULL} (undefined), in which case the number of
arguments passed on any stack frame is always unknown.  For many
architectures this will be a suitable default.

@end deftypefn

@node Analyzing Stacks---Frame Sniffers
@subsection Analyzing Stacks---Frame Sniffers

When a program stops, @value{GDBN} needs to construct the chain of
struct @code{frame_info} representing the state of the stack using
appropriate @dfn{sniffers}.

Each architecture requires appropriate sniffers, but they do not form
entries in @code{@w{struct gdbarch}}, since more than one sniffer may
be required and a sniffer may be suitable for more than one
@code{@w{struct gdbarch}}.  Instead sniffers are associated with
architectures using the following functions.

@itemize @bullet

@item
@findex frame_unwind_append_sniffer
@code{frame_unwind_append_sniffer} is used to add a new sniffer to
analyze THIS frame when given a pointer to the NEXT frame.

@item
@findex frame_base_append_sniffer
@code{frame_base_append_sniffer} is used to add a new sniffer
which can determine information about the base of a stack frame.

@item
@findex frame_base_set_default
@code{frame_base_set_default} is used to specify the default base
sniffer.

@end itemize

These functions all take a reference to @code{@w{struct gdbarch}}, so
they are associated with a specific architecture.  They are usually
called in the @code{gdbarch} initialization function, after the
@code{gdbarch} struct has been set up.  Unless a default has been set, the
most recently appended sniffer will be tried first.

The main frame unwinding sniffer (as set by
@code{frame_unwind_append_sniffer)} returns a structure specifying
a set of sniffing functions:

@cindex @code{frame_unwind}
@smallexample
struct frame_unwind
@{
   enum frame_type            type;
   frame_this_id_ftype       *this_id;
   frame_prev_register_ftype *prev_register;
   const struct frame_data   *unwind_data;
   frame_sniffer_ftype       *sniffer;
   frame_prev_pc_ftype       *prev_pc;
   frame_dealloc_cache_ftype *dealloc_cache;
@};
@end smallexample

The @code{type} field indicates the type of frame this sniffer can
handle: normal, dummy (@pxref{Functions Creating Dummy Frames, ,
Functions Creating Dummy Frames}), signal handler or sentinel.  Signal
handlers sometimes have their own simplified stack structure for
efficiency, so may need their own handlers.

The @code{unwind_data} field holds additional information which may be
relevant to particular types of frame.  For example it may hold
additional information for signal handler frames.

The remaining fields define functions that yield different types of
information when given a pointer to the NEXT stack frame.  Not all
functions need be provided.  If an entry is @code{NULL}, the next sniffer will
be tried instead.

@itemize @bullet

@item
@code{this_id} determines the stack pointer and function (code
entry point) for THIS stack frame.

@item
@code{prev_register} determines where the values of registers for
the PREVIOUS stack frame are stored in THIS stack frame.

@item
@code{sniffer} takes a look at THIS frame's registers to
determine if this is the appropriate unwinder.

@item
@code{prev_pc} determines the program counter for THIS
frame.  Only needed if the program counter is not an ordinary register
(@pxref{Register Architecture Functions & Variables,
, Functions and Variables Specifying the Register Architecture}).

@item
@code{dealloc_cache} frees any additional memory associated with
the prologue cache for this frame (@pxref{Prologue Caches, , Prologue
Caches}).

@end itemize

In general it is only the @code{this_id} and @code{prev_register}
fields that need be defined for custom sniffers.

The frame base sniffer is much simpler.  It is a @code{@w{struct
frame_base}}, which refers to the corresponding @code{frame_unwind}
struct and whose fields refer to functions yielding various addresses
within the frame.

@cindex @code{frame_base}
@smallexample
struct frame_base
@{
   const struct frame_unwind *unwind;
   frame_this_base_ftype     *this_base;
   frame_this_locals_ftype   *this_locals;
   frame_this_args_ftype     *this_args;
@};
@end smallexample

All the functions referred to take a pointer to the NEXT frame as
argument. The function referred to by @code{this_base} returns the
base address of THIS frame, the function referred to by
@code{this_locals} returns the base address of local variables in THIS
frame and the function referred to by @code{this_args} returns the
base address of the function arguments in this frame.

As described above, the base address of a frame is the address
immediately before the start of the NEXT frame.  For a falling
stack, this is the lowest address in the frame and for a rising stack
it is the highest address in the frame.  For most architectures the
same address is also the base address for local variables and
arguments, in which case the same function can be used for all three
entries@footnote{It is worth noting that if it cannot be determined in any
other way (for example by there being a register with the name
@code{"fp"}), then the result of the @code{this_base} function will be
used as the value of the frame pointer variable @kbd{$fp} in
@value{GDBN}.  This is very often not correct (for example with the
OpenRISC 1000, this value is the stack pointer, @kbd{$sp}).  In this
case a register (raw or pseudo) with the name @code{"fp"} should be
defined.  It will be used in preference as the value of @kbd{$fp}.}.

@node Inferior Call Setup
@section Inferior Call Setup
@cindex calls to the inferior

@menu
* About Dummy Frames::
* Functions Creating Dummy Frames::
@end menu

@node About Dummy Frames
@subsection About Dummy Frames
@cindex dummy frames

@value{GDBN} can call functions in the target code (for example by
using the @kbd{call} or @kbd{print} commands).  These functions may be
breakpointed, and it is essential that if a function does hit a
breakpoint, commands like @kbd{backtrace} work correctly.

This is achieved by making the stack look as though the function had
been called from the point where @value{GDBN} had previously stopped.
This requires that @value{GDBN} can set up stack frames appropriate for
such function calls.

@node Functions Creating Dummy Frames
@subsection Functions Creating Dummy Frames

The following functions provide the functionality to set up such
@dfn{dummy} stack frames.

@deftypefn {Architecture Function} CORE_ADDR push_dummy_call (struct gdbarch *@var{gdbarch}, struct value *@var{function}, struct regcache *@var{regcache}, CORE_ADDR @var{bp_addr}, int  @var{nargs}, struct value **@var{args}, CORE_ADDR @var{sp}, int  @var{struct_return}, CORE_ADDR @var{struct_addr})

This function sets up a dummy stack frame for the function about to be
called.  @code{push_dummy_call} is given the arguments to be passed
and must copy them into registers or push them on to the stack as
appropriate for the ABI.

@var{function} is a pointer to the function
that will be called and @var{regcache} the register cache from which
values should be obtained.  @var{bp_addr} is the address to which the
function should return (which is breakpointed, so @value{GDBN} can
regain control, hence the name).  @var{nargs} is the number of
arguments to pass and @var{args} an array containing the argument
values.  @var{struct_return} is non-zero (true) if the function returns
a structure, and if so @var{struct_addr} is the address in which the
structure should be returned.

 After calling this function, @value{GDBN} will pass control to the
target at the address of the function, which will find the stack and
registers set up just as expected.

The default value of this function is @code{NULL} (undefined).  If the
function is not defined, then @value{GDBN} will not allow the user to
call functions within the target being debugged.

@end deftypefn

@deftypefn {Architecture Function} {struct frame_id} unwind_dummy_id (struct gdbarch *@var{gdbarch}, struct frame_info *@var{next_frame}) 

This is the inverse of @code{push_dummy_call} which restores the stack
pointer and program counter after a call to evaluate a function using
a dummy stack frame.  The result is a @code{@w{struct frame_id}}, which
contains the value of the stack pointer and program counter to be
used.

The NEXT frame pointer is provided as argument,
@var{next_frame}.  THIS frame is the frame of the dummy function,
which can be unwound, to yield the required stack pointer and program
counter from the PREVIOUS frame.

The default value is @code{NULL} (undefined).  If @code{push_dummy_call} is
defined, then this function should also be defined.

@end deftypefn

@deftypefn {Architecture Function} CORE_ADDR push_dummy_code (struct gdbarch *@var{gdbarch}, CORE_ADDR @var{sp}, CORE_ADDR @var{funaddr}, struct value **@var{args}, int  @var{nargs}, struct type *@var{value_type}, CORE_ADDR *@var{real_pc}, CORE_ADDR *@var{bp_addr}, struct regcache *@var{regcache})

If this function is not defined (its default value is @code{NULL}), a dummy
call will use the entry point of the currently loaded code on the
target as its return address.  A temporary breakpoint will be set
there, so the location must be writable and have room for a
breakpoint.

It is possible that this default is not suitable.  It might not be
writable (in ROM possibly), or the ABI might require code to be
executed on return from a call to unwind the stack before the
breakpoint is encountered.

If either of these is the case, then push_dummy_code should be defined
to push an instruction sequence onto the end of the stack to which the
dummy call should return.

The arguments are essentially the same as those to
@code{push_dummy_call}.  However the function is provided with the
type of the function result, @var{value_type}, @var{bp_addr} is used
to return a value (the address at which the breakpoint instruction
should be inserted) and @var{real pc} is used to specify the resume
address when starting the call sequence.  The function should return
the updated innermost stack address.

@quotation
@emph{Note:} This does require that code in the stack can be executed.
Some Harvard architectures may not allow this.
@end quotation

@end deftypefn

@node Adding support for debugging core files
@section Adding support for debugging core files
@cindex core files

The prerequisite for adding core file support in @value{GDBN} is to have
core file support in BFD.

Once BFD support is available, writing the apropriate
@code{regset_from_core_section} architecture function should be all
that is needed in order to add support for core files in @value{GDBN}.

@node Defining Other Architecture Features 
@section Defining Other Architecture Features 

This section describes other functions and values in @code{gdbarch},
together with some useful macros, that you can use to define the
target architecture.

@table @code

@item CORE_ADDR gdbarch_addr_bits_remove (@var{gdbarch}, @var{addr})
@findex gdbarch_addr_bits_remove
If a raw machine instruction address includes any bits that are not
really part of the address, then this function is used to zero those bits in
@var{addr}.  This is only used for addresses of instructions, and even then not
in all contexts.

For example, the two low-order bits of the PC on the Hewlett-Packard PA
2.0 architecture contain the privilege level of the corresponding
instruction.  Since instructions must always be aligned on four-byte
boundaries, the processor masks out these bits to generate the actual
address of the instruction.  @code{gdbarch_addr_bits_remove} would then for
example look like that:
@smallexample
arch_addr_bits_remove (CORE_ADDR addr)
@{
  return (addr &= ~0x3);
@}
@end smallexample

@item int address_class_name_to_type_flags (@var{gdbarch}, @var{name}, @var{type_flags_ptr})
@findex address_class_name_to_type_flags
If @var{name} is a valid address class qualifier name, set the @code{int}
referenced by @var{type_flags_ptr} to the mask representing the qualifier
and return 1.  If @var{name} is not a valid address class qualifier name,
return 0.

The value for @var{type_flags_ptr} should be one of
@code{TYPE_FLAG_ADDRESS_CLASS_1}, @code{TYPE_FLAG_ADDRESS_CLASS_2}, or
possibly some combination of these values or'd together.
@xref{Target Architecture Definition, , Address Classes}.

@item int address_class_name_to_type_flags_p (@var{gdbarch})
@findex address_class_name_to_type_flags_p
Predicate which indicates whether @code{address_class_name_to_type_flags}
has been defined.

@item int gdbarch_address_class_type_flags (@var{gdbarch}, @var{byte_size}, @var{dwarf2_addr_class})
@findex gdbarch_address_class_type_flags
Given a pointers byte size (as described by the debug information) and
the possible @code{DW_AT_address_class} value, return the type flags
used by @value{GDBN} to represent this address class.  The value
returned should be one of @code{TYPE_FLAG_ADDRESS_CLASS_1},
@code{TYPE_FLAG_ADDRESS_CLASS_2}, or possibly some combination of these
values or'd together.
@xref{Target Architecture Definition, , Address Classes}.

@item int gdbarch_address_class_type_flags_p (@var{gdbarch})
@findex gdbarch_address_class_type_flags_p
Predicate which indicates whether @code{gdbarch_address_class_type_flags_p} has
been defined.

@item const char *gdbarch_address_class_type_flags_to_name (@var{gdbarch}, @var{type_flags})
@findex gdbarch_address_class_type_flags_to_name
Return the name of the address class qualifier associated with the type
flags given by @var{type_flags}.

@item int gdbarch_address_class_type_flags_to_name_p (@var{gdbarch})
@findex gdbarch_address_class_type_flags_to_name_p
Predicate which indicates whether @code{gdbarch_address_class_type_flags_to_name} has been defined.
@xref{Target Architecture Definition, , Address Classes}.

@item void gdbarch_address_to_pointer (@var{gdbarch}, @var{type}, @var{buf}, @var{addr})
@findex gdbarch_address_to_pointer
Store in @var{buf} a pointer of type @var{type} representing the address
@var{addr}, in the appropriate format for the current architecture.
This function may safely assume that @var{type} is either a pointer or a
C@t{++} reference type.
@xref{Target Architecture Definition, , Pointers Are Not Always Addresses}.

@item int gdbarch_believe_pcc_promotion (@var{gdbarch})
@findex gdbarch_believe_pcc_promotion
Used to notify if the compiler promotes a @code{short} or @code{char}
parameter to an @code{int}, but still reports the parameter as its
original type, rather than the promoted type.

@item gdbarch_bits_big_endian (@var{gdbarch})
@findex gdbarch_bits_big_endian
This is used if the numbering of bits in the targets does @strong{not} match
the endianism of the target byte order.  A value of 1 means that the bits
are numbered in a big-endian bit order, 0 means little-endian.

@item set_gdbarch_bits_big_endian (@var{gdbarch}, @var{bits_big_endian})
@findex set_gdbarch_bits_big_endian
Calling set_gdbarch_bits_big_endian with a value of 1 indicates that the
bits in the target are numbered in a big-endian bit order, 0 indicates
little-endian.

@item BREAKPOINT
@findex BREAKPOINT
This is the character array initializer for the bit pattern to put into
memory where a breakpoint is set.  Although it's common to use a trap
instruction for a breakpoint, it's not required; for instance, the bit
pattern could be an invalid instruction.  The breakpoint must be no
longer than the shortest instruction of the architecture.

@code{BREAKPOINT} has been deprecated in favor of
@code{gdbarch_breakpoint_from_pc}.

@item BIG_BREAKPOINT
@itemx LITTLE_BREAKPOINT
@findex LITTLE_BREAKPOINT
@findex BIG_BREAKPOINT
Similar to BREAKPOINT, but used for bi-endian targets.

@code{BIG_BREAKPOINT} and @code{LITTLE_BREAKPOINT} have been deprecated in
favor of @code{gdbarch_breakpoint_from_pc}.

@item const gdb_byte *gdbarch_breakpoint_from_pc (@var{gdbarch}, @var{pcptr}, @var{lenptr})
@findex gdbarch_breakpoint_from_pc
@anchor{gdbarch_breakpoint_from_pc} Use the program counter to determine the
contents and size of a breakpoint instruction.  It returns a pointer to
a static string of bytes that encode a breakpoint instruction, stores the
length of the string to @code{*@var{lenptr}}, and adjusts the program
counter (if necessary) to point to the actual memory location where the
breakpoint should be inserted.  May return @code{NULL} to indicate that
software breakpoints are not supported.

Although it is common to use a trap instruction for a breakpoint, it's
not required; for instance, the bit pattern could be an invalid
instruction.  The breakpoint must be no longer than the shortest
instruction of the architecture.

Provided breakpoint bytes can be also used by @code{bp_loc_is_permanent} to
detect permanent breakpoints.  @code{gdbarch_breakpoint_from_pc} should return
an unchanged memory copy if it was called for a location with permanent
breakpoint as some architectures use breakpoint instructions containing
arbitrary parameter value.

Replaces all the other @var{BREAKPOINT} macros.

@item int gdbarch_memory_insert_breakpoint (@var{gdbarch}, @var{bp_tgt})
@itemx gdbarch_memory_remove_breakpoint (@var{gdbarch}, @var{bp_tgt})
@findex gdbarch_memory_remove_breakpoint
@findex gdbarch_memory_insert_breakpoint
Insert or remove memory based breakpoints.  Reasonable defaults
(@code{default_memory_insert_breakpoint} and
@code{default_memory_remove_breakpoint} respectively) have been
provided so that it is not necessary to set these for most
architectures.  Architectures which may want to set
@code{gdbarch_memory_insert_breakpoint} and @code{gdbarch_memory_remove_breakpoint} will likely have instructions that are oddly sized or are not stored in a
conventional manner.

It may also be desirable (from an efficiency standpoint) to define
custom breakpoint insertion and removal routines if
@code{gdbarch_breakpoint_from_pc} needs to read the target's memory for some
reason.

@item CORE_ADDR gdbarch_adjust_breakpoint_address (@var{gdbarch}, @var{bpaddr})
@findex gdbarch_adjust_breakpoint_address
@cindex breakpoint address adjusted
Given an address at which a breakpoint is desired, return a breakpoint
address adjusted to account for architectural constraints on
breakpoint placement.  This method is not needed by most targets.

The FR-V target (see @file{frv-tdep.c}) requires this method.
The FR-V is a VLIW architecture in which a number of RISC-like
instructions are grouped (packed) together into an aggregate
instruction or instruction bundle.  When the processor executes
one of these bundles, the component instructions are executed
in parallel.

In the course of optimization, the compiler may group instructions
from distinct source statements into the same bundle.  The line number
information associated with one of the latter statements will likely
refer to some instruction other than the first one in the bundle.  So,
if the user attempts to place a breakpoint on one of these latter
statements, @value{GDBN} must be careful to @emph{not} place the break
instruction on any instruction other than the first one in the bundle.
(Remember though that the instructions within a bundle execute
in parallel, so the @emph{first} instruction is the instruction
at the lowest address and has nothing to do with execution order.)

The FR-V's @code{gdbarch_adjust_breakpoint_address} method will adjust a
breakpoint's address by scanning backwards for the beginning of
the bundle, returning the address of the bundle.

Since the adjustment of a breakpoint may significantly alter a user's
expectation, @value{GDBN} prints a warning when an adjusted breakpoint
is initially set and each time that that breakpoint is hit.

@item int gdbarch_call_dummy_location (@var{gdbarch})
@findex gdbarch_call_dummy_location
See the file @file{inferior.h}.

This method has been replaced by @code{gdbarch_push_dummy_code}
(@pxref{gdbarch_push_dummy_code}).

@item int gdbarch_cannot_fetch_register (@var{gdbarch}, @var{regum})
@findex gdbarch_cannot_fetch_register
This function should return nonzero if @var{regno} cannot be fetched
from an inferior process.

@item int gdbarch_cannot_store_register (@var{gdbarch}, @var{regnum})
@findex gdbarch_cannot_store_register
This function should return nonzero if @var{regno} should not be
written to the target.  This is often the case for program counters,
status words, and other special registers.  This function returns 0 as
default so that @value{GDBN} will assume that all registers may be written.

@item int gdbarch_convert_register_p (@var{gdbarch}, @var{regnum}, struct type *@var{type})
@findex gdbarch_convert_register_p
Return non-zero if register @var{regnum} represents data values of type
@var{type} in a non-standard form.
@xref{Target Architecture Definition, , Using Different Register and Memory Data Representations}.

@item int gdbarch_fp0_regnum (@var{gdbarch})
@findex gdbarch_fp0_regnum
This function returns the number of the first floating point register,
if the machine has such registers.  Otherwise, it returns -1.

@item CORE_ADDR gdbarch_decr_pc_after_break (@var{gdbarch})
@findex gdbarch_decr_pc_after_break
This function shall return the amount by which to decrement the PC after the
program encounters a breakpoint.  This is often the number of bytes in
@code{BREAKPOINT}, though not always.  For most targets this value will be 0.

@item DISABLE_UNSETTABLE_BREAK (@var{addr})
@findex DISABLE_UNSETTABLE_BREAK
If defined, this should evaluate to 1 if @var{addr} is in a shared
library in which breakpoints cannot be set and so should be disabled.

@item int gdbarch_dwarf2_reg_to_regnum (@var{gdbarch}, @var{dwarf2_regnr})
@findex gdbarch_dwarf2_reg_to_regnum
Convert DWARF2 register number @var{dwarf2_regnr} into @value{GDBN} regnum.
If not defined, no conversion will be performed.

@item int gdbarch_ecoff_reg_to_regnum (@var{gdbarch}, @var{ecoff_regnr})
@findex gdbarch_ecoff_reg_to_regnum
Convert ECOFF register number  @var{ecoff_regnr} into @value{GDBN} regnum.  If
not defined, no conversion will be performed.

@item GCC_COMPILED_FLAG_SYMBOL
@itemx GCC2_COMPILED_FLAG_SYMBOL
@findex GCC2_COMPILED_FLAG_SYMBOL
@findex GCC_COMPILED_FLAG_SYMBOL
If defined, these are the names of the symbols that @value{GDBN} will
look for to detect that GCC compiled the file.  The default symbols
are @code{gcc_compiled.} and @code{gcc2_compiled.},
respectively.  (Currently only defined for the Delta 68.)

@item gdbarch_get_longjmp_target
@findex gdbarch_get_longjmp_target
This function determines the target PC address that @code{longjmp}
will jump to, assuming that we have just stopped at a @code{longjmp}
breakpoint.  It takes a @code{CORE_ADDR *} as argument, and stores the
target PC value through this pointer.  It examines the current state
of the machine as needed, typically by using a manually-determined
offset into the @code{jmp_buf}.  (While we might like to get the offset
from the target's @file{jmpbuf.h}, that header file cannot be assumed
to be available when building a cross-debugger.)

@item DEPRECATED_IBM6000_TARGET
@findex DEPRECATED_IBM6000_TARGET
Shows that we are configured for an IBM RS/6000 system.  This
conditional should be eliminated (FIXME) and replaced by
feature-specific macros.  It was introduced in haste and we are
repenting at leisure.

@item I386_USE_GENERIC_WATCHPOINTS
An x86-based target can define this to use the generic x86 watchpoint
support; see @ref{Algorithms, I386_USE_GENERIC_WATCHPOINTS}.

@item gdbarch_in_function_epilogue_p (@var{gdbarch}, @var{addr})
@findex gdbarch_in_function_epilogue_p
Returns non-zero if the given @var{addr} is in the epilogue of a function.
The epilogue of a function is defined as the part of a function where
the stack frame of the function already has been destroyed up to the
final `return from function call' instruction.

@item int gdbarch_in_solib_return_trampoline (@var{gdbarch}, @var{pc}, @var{name})
@findex gdbarch_in_solib_return_trampoline
Define this function to return nonzero if the program is stopped in the
trampoline that returns from a shared library.

@item target_so_ops.in_dynsym_resolve_code (@var{pc})
@findex in_dynsym_resolve_code
Define this to return nonzero if the program is stopped in the
dynamic linker.

@item SKIP_SOLIB_RESOLVER (@var{pc})
@findex SKIP_SOLIB_RESOLVER
Define this to evaluate to the (nonzero) address at which execution
should continue to get past the dynamic linker's symbol resolution
function.  A zero value indicates that it is not important or necessary
to set a breakpoint to get through the dynamic linker and that single
stepping will suffice.

@item CORE_ADDR gdbarch_integer_to_address (@var{gdbarch}, @var{type}, @var{buf})
@findex gdbarch_integer_to_address
@cindex converting integers to addresses
Define this when the architecture needs to handle non-pointer to address
conversions specially.  Converts that value to an address according to
the current architectures conventions.

@emph{Pragmatics: When the user copies a well defined expression from
their source code and passes it, as a parameter, to @value{GDBN}'s
@code{print} command, they should get the same value as would have been
computed by the target program.  Any deviation from this rule can cause
major confusion and annoyance, and needs to be justified carefully.  In
other words, @value{GDBN} doesn't really have the freedom to do these
conversions in clever and useful ways.  It has, however, been pointed
out that users aren't complaining about how @value{GDBN} casts integers
to pointers; they are complaining that they can't take an address from a
disassembly listing and give it to @code{x/i}.  Adding an architecture
method like @code{gdbarch_integer_to_address} certainly makes it possible for
@value{GDBN} to ``get it right'' in all circumstances.}

@xref{Target Architecture Definition, , Pointers Are Not Always
Addresses}.

@item CORE_ADDR gdbarch_pointer_to_address (@var{gdbarch}, @var{type}, @var{buf})
@findex gdbarch_pointer_to_address
Assume that @var{buf} holds a pointer of type @var{type}, in the
appropriate format for the current architecture.  Return the byte
address the pointer refers to.
@xref{Target Architecture Definition, , Pointers Are Not Always Addresses}.

@item void gdbarch_register_to_value(@var{gdbarch}, @var{frame}, @var{regnum}, @var{type}, @var{fur})
@findex gdbarch_register_to_value
Convert the raw contents of register @var{regnum} into a value of type
@var{type}.
@xref{Target Architecture Definition, , Using Different Register and Memory Data Representations}.

@item REGISTER_CONVERT_TO_VIRTUAL(@var{reg}, @var{type}, @var{from}, @var{to})
@findex REGISTER_CONVERT_TO_VIRTUAL
Convert the value of register @var{reg} from its raw form to its virtual
form.
@xref{Target Architecture Definition, , Raw and Virtual Register Representations}.

@item REGISTER_CONVERT_TO_RAW(@var{type}, @var{reg}, @var{from}, @var{to})
@findex REGISTER_CONVERT_TO_RAW
Convert the value of register @var{reg} from its virtual form to its raw
form.
@xref{Target Architecture Definition, , Raw and Virtual Register Representations}.

@item const struct regset *regset_from_core_section (struct gdbarch * @var{gdbarch}, const char * @var{sect_name}, size_t @var{sect_size})
@findex regset_from_core_section
Return the appropriate register set for a core file section with name
@var{sect_name} and size @var{sect_size}.

@item SOFTWARE_SINGLE_STEP_P()
@findex SOFTWARE_SINGLE_STEP_P
Define this as 1 if the target does not have a hardware single-step
mechanism.  The macro @code{SOFTWARE_SINGLE_STEP} must also be defined.

@item SOFTWARE_SINGLE_STEP(@var{signal}, @var{insert_breakpoints_p})
@findex SOFTWARE_SINGLE_STEP
A function that inserts or removes (depending on
@var{insert_breakpoints_p}) breakpoints at each possible destinations of
the next instruction.  See @file{sparc-tdep.c} and @file{rs6000-tdep.c}
for examples.

@item set_gdbarch_sofun_address_maybe_missing (@var{gdbarch}, @var{set})
@findex set_gdbarch_sofun_address_maybe_missing
Somebody clever observed that, the more actual addresses you have in the
debug information, the more time the linker has to spend relocating
them.  So whenever there's some other way the debugger could find the
address it needs, you should omit it from the debug info, to make
linking faster.

Calling @code{set_gdbarch_sofun_address_maybe_missing} with a non-zero
argument @var{set} indicates that a particular set of hacks of this sort
are in use, affecting @code{N_SO} and @code{N_FUN} entries in stabs-format
debugging information.  @code{N_SO} stabs mark the beginning and ending
addresses of compilation units in the text segment.  @code{N_FUN} stabs
mark the starts and ends of functions.

In this case, @value{GDBN} assumes two things:

@itemize @bullet
@item
@code{N_FUN} stabs have an address of zero.  Instead of using those
addresses, you should find the address where the function starts by
taking the function name from the stab, and then looking that up in the
minsyms (the linker/assembler symbol table).  In other words, the stab
has the name, and the linker/assembler symbol table is the only place
that carries the address.

@item
@code{N_SO} stabs have an address of zero, too.  You just look at the
@code{N_FUN} stabs that appear before and after the @code{N_SO} stab, and
guess the starting and ending addresses of the compilation unit from them.
@end itemize

@item int gdbarch_stabs_argument_has_addr (@var{gdbarch}, @var{type})
@findex gdbarch_stabs_argument_has_addr
@anchor{gdbarch_stabs_argument_has_addr} Define this function to return
nonzero if a function argument of type @var{type} is passed by reference
instead of value.

@item CORE_ADDR gdbarch_push_dummy_call (@var{gdbarch}, @var{function}, @var{regcache}, @var{bp_addr}, @var{nargs}, @var{args}, @var{sp}, @var{struct_return}, @var{struct_addr})
@findex gdbarch_push_dummy_call
@anchor{gdbarch_push_dummy_call} Define this to push the dummy frame's call to
the inferior function onto the stack.  In addition to pushing @var{nargs}, the
code should push @var{struct_addr} (when @var{struct_return} is non-zero), and
the return address (@var{bp_addr}).

@var{function} is a pointer to a @code{struct value}; on architectures that use
function descriptors, this contains the function descriptor value.

Returns the updated top-of-stack pointer.

@item CORE_ADDR gdbarch_push_dummy_code (@var{gdbarch}, @var{sp}, @var{funaddr}, @var{using_gcc}, @var{args}, @var{nargs}, @var{value_type}, @var{real_pc}, @var{bp_addr}, @var{regcache})
@findex gdbarch_push_dummy_code
@anchor{gdbarch_push_dummy_code} Given a stack based call dummy, push the
instruction sequence (including space for a breakpoint) to which the
called function should return.

Set @var{bp_addr} to the address at which the breakpoint instruction
should be inserted, @var{real_pc} to the resume address when starting
the call sequence, and return the updated inner-most stack address.

By default, the stack is grown sufficient to hold a frame-aligned
(@pxref{frame_align}) breakpoint, @var{bp_addr} is set to the address
reserved for that breakpoint, and @var{real_pc} set to @var{funaddr}.

This method replaces @w{@code{gdbarch_call_dummy_location (@var{gdbarch})}}.

@item int gdbarch_sdb_reg_to_regnum (@var{gdbarch}, @var{sdb_regnr})
@findex gdbarch_sdb_reg_to_regnum
Use this function to convert sdb register @var{sdb_regnr} into @value{GDBN}
regnum.  If not defined, no conversion will be done.

@item enum return_value_convention gdbarch_return_value (struct gdbarch *@var{gdbarch}, struct type *@var{valtype}, struct regcache *@var{regcache}, void *@var{readbuf}, const void *@var{writebuf})
@findex gdbarch_return_value
@anchor{gdbarch_return_value} Given a function with a return-value of
type @var{rettype}, return which return-value convention that function
would use.

@value{GDBN} currently recognizes two function return-value conventions:
@code{RETURN_VALUE_REGISTER_CONVENTION} where the return value is found
in registers; and @code{RETURN_VALUE_STRUCT_CONVENTION} where the return
value is found in memory and the address of that memory location is
passed in as the function's first parameter.

If the register convention is being used, and @var{writebuf} is
non-@code{NULL}, also copy the return-value in @var{writebuf} into
@var{regcache}.

If the register convention is being used, and @var{readbuf} is
non-@code{NULL}, also copy the return value from @var{regcache} into
@var{readbuf} (@var{regcache} contains a copy of the registers from the
just returned function).

@emph{Maintainer note: This method replaces separate predicate, extract,
store methods.  By having only one method, the logic needed to determine
the return-value convention need only be implemented in one place.  If
@value{GDBN} were written in an @sc{oo} language, this method would
instead return an object that knew how to perform the register
return-value extract and store.}

@emph{Maintainer note: This method does not take a @var{gcc_p}
parameter, and such a parameter should not be added.  If an architecture
that requires per-compiler or per-function information be identified,
then the replacement of @var{rettype} with @code{struct value}
@var{function} should be pursued.}

@emph{Maintainer note: The @var{regcache} parameter limits this methods
to the inner most frame.  While replacing @var{regcache} with a
@code{struct frame_info} @var{frame} parameter would remove that
limitation there has yet to be a demonstrated need for such a change.}

@item void gdbarch_skip_permanent_breakpoint (@var{gdbarch}, @var{regcache})
@findex gdbarch_skip_permanent_breakpoint
Advance the inferior's PC past a permanent breakpoint.  @value{GDBN} normally
steps over a breakpoint by removing it, stepping one instruction, and
re-inserting the breakpoint.  However, permanent breakpoints are
hardwired into the inferior, and can't be removed, so this strategy
doesn't work.  Calling @code{gdbarch_skip_permanent_breakpoint} adjusts the
processor's state so that execution will resume just after the breakpoint.
This function does the right thing even when the breakpoint is in the delay slot
of a branch or jump.

@item CORE_ADDR gdbarch_skip_trampoline_code (@var{gdbarch}, @var{frame}, @var{pc})
@findex gdbarch_skip_trampoline_code
If the target machine has trampoline code that sits between callers and
the functions being called, then define this function to return a new PC
that is at the start of the real function.

@item int gdbarch_deprecated_fp_regnum (@var{gdbarch})
@findex gdbarch_deprecated_fp_regnum
If the frame pointer is in a register, use this function to return the
number of that register.

@item int gdbarch_stab_reg_to_regnum (@var{gdbarch}, @var{stab_regnr})
@findex gdbarch_stab_reg_to_regnum
Use this function to convert stab register @var{stab_regnr} into @value{GDBN}
regnum.  If not defined, no conversion will be done.

@item SYMBOL_RELOADING_DEFAULT
@findex SYMBOL_RELOADING_DEFAULT
The default value of the ``symbol-reloading'' variable.  (Never defined in
current sources.)

@item TARGET_CHAR_BIT
@findex TARGET_CHAR_BIT
Number of bits in a char; defaults to 8.

@item int gdbarch_char_signed (@var{gdbarch})
@findex gdbarch_char_signed
Non-zero if @code{char} is normally signed on this architecture; zero if
it should be unsigned.

The ISO C standard requires the compiler to treat @code{char} as
equivalent to either @code{signed char} or @code{unsigned char}; any
character in the standard execution set is supposed to be positive.
Most compilers treat @code{char} as signed, but @code{char} is unsigned
on the IBM S/390, RS6000, and PowerPC targets.

@item int gdbarch_double_bit (@var{gdbarch})
@findex gdbarch_double_bit
Number of bits in a double float; defaults to @w{@code{8 * TARGET_CHAR_BIT}}.

@item int gdbarch_float_bit (@var{gdbarch})
@findex gdbarch_float_bit
Number of bits in a float; defaults to @w{@code{4 * TARGET_CHAR_BIT}}.

@item int gdbarch_int_bit (@var{gdbarch})
@findex gdbarch_int_bit
Number of bits in an integer; defaults to @w{@code{4 * TARGET_CHAR_BIT}}.

@item int gdbarch_long_bit (@var{gdbarch})
@findex gdbarch_long_bit
Number of bits in a long integer; defaults to @w{@code{4 * TARGET_CHAR_BIT}}.

@item int gdbarch_long_double_bit (@var{gdbarch})
@findex gdbarch_long_double_bit
Number of bits in a long double float;
defaults to @w{@code{2 * gdbarch_double_bit (@var{gdbarch})}}.

@item int gdbarch_long_long_bit (@var{gdbarch})
@findex gdbarch_long_long_bit
Number of bits in a long long integer; defaults to
@w{@code{2 * gdbarch_long_bit (@var{gdbarch})}}.

@item int gdbarch_ptr_bit (@var{gdbarch})
@findex gdbarch_ptr_bit
Number of bits in a pointer; defaults to
@w{@code{gdbarch_int_bit (@var{gdbarch})}}.

@item int gdbarch_short_bit (@var{gdbarch})
@findex gdbarch_short_bit
Number of bits in a short integer; defaults to @w{@code{2 * TARGET_CHAR_BIT}}.

@item void gdbarch_virtual_frame_pointer (@var{gdbarch}, @var{pc}, @var{frame_regnum}, @var{frame_offset})
@findex gdbarch_virtual_frame_pointer
Returns a @code{(@var{register}, @var{offset})} pair representing the virtual
frame pointer in use at the code address @var{pc}.  If virtual frame
pointers are not used, a default definition simply returns
@code{gdbarch_deprecated_fp_regnum} (or @code{gdbarch_sp_regnum}, if
no frame pointer is defined), with an offset of zero.

@c need to explain virtual frame pointers, they are recorded in agent
@c expressions for tracepoints

@item TARGET_HAS_HARDWARE_WATCHPOINTS
If non-zero, the target has support for hardware-assisted
watchpoints.  @xref{Algorithms, watchpoints}, for more details and
other related macros.

@item int gdbarch_print_insn (@var{gdbarch}, @var{vma}, @var{info})
@findex gdbarch_print_insn
This is the function used by @value{GDBN} to print an assembly
instruction.  It prints the instruction at address @var{vma} in
debugged memory and returns the length of the instruction, in bytes.
This usually points to a function in the @code{opcodes} library
(@pxref{Support Libraries, ,Opcodes}).  @var{info} is a structure (of
type @code{disassemble_info}) defined in the header file
@file{include/dis-asm.h}, and used to pass information to the
instruction decoding routine.

@item frame_id gdbarch_dummy_id (@var{gdbarch}, @var{frame})
@findex gdbarch_dummy_id
@anchor{gdbarch_dummy_id} Given @var{frame} return a @w{@code{struct
frame_id}} that uniquely identifies an inferior function call's dummy
frame.  The value returned must match the dummy frame stack value
previously saved by @code{call_function_by_hand}.

@item void gdbarch_value_to_register (@var{gdbarch}, @var{frame}, @var{type}, @var{buf})
@findex gdbarch_value_to_register
Convert a value of type @var{type} into the raw contents of a register.
@xref{Target Architecture Definition, , Using Different Register and Memory Data Representations}.

@end table

Motorola M68K target conditionals.

@ftable @code
@item BPT_VECTOR
Define this to be the 4-bit location of the breakpoint trap vector.  If
not defined, it will default to @code{0xf}.

@item REMOTE_BPT_VECTOR
Defaults to @code{1}.

@end ftable

@node Adding a New Target
@section Adding a New Target

@cindex adding a target
The following files add a target to @value{GDBN}:

@table @file
@cindex target dependent files

@item gdb/@var{ttt}-tdep.c
Contains any miscellaneous code required for this target machine.  On
some machines it doesn't exist at all.

@item gdb/@var{arch}-tdep.c
@itemx gdb/@var{arch}-tdep.h
This is required to describe the basic layout of the target machine's
processor chip (registers, stack, etc.).  It can be shared among many
targets that use the same processor architecture.

@end table

(Target header files such as
@file{gdb/config/@var{arch}/tm-@var{ttt}.h},
@file{gdb/config/@var{arch}/tm-@var{arch}.h}, and
@file{config/tm-@var{os}.h} are no longer used.)

@findex _initialize_@var{arch}_tdep
A @value{GDBN} description for a new architecture, arch is created by
defining a global function @code{_initialize_@var{arch}_tdep}, by
convention in the source file @file{@var{arch}-tdep.c}.  For
example, in the case of the OpenRISC 1000, this function is called
@code{_initialize_or1k_tdep} and is found in the file
@file{or1k-tdep.c}.

The object file resulting from compiling this source file, which will
contain the implementation of the
@code{_initialize_@var{arch}_tdep} function is specified in the
@value{GDBN} @file{configure.tgt} file, which includes a large case
statement pattern matching against the @code{--target} option of the
@kbd{configure} script.

@quotation
@emph{Note:} If the architecture requires multiple source files, the
corresponding binaries should be included in
@file{configure.tgt}. However if there are header files, the
dependencies on these will not be picked up from the entries in
@file{configure.tgt}. The @file{Makefile.in} file will need extending to
show these dependencies.
@end quotation

@findex gdbarch_register
A new struct gdbarch, defining the new architecture, is created within
the @code{_initialize_@var{arch}_tdep} function by calling
@code{gdbarch_register}:

@smallexample
void gdbarch_register (enum bfd_architecture    architecture,
                       gdbarch_init_ftype      *init_func,
                       gdbarch_dump_tdep_ftype *tdep_dump_func);
@end smallexample

This function has been described fully in an earlier
section.  @xref{How an Architecture is Represented, , How an
Architecture is Represented}.

The new @code{@w{struct gdbarch}} should contain implementations of
the necessary functions (described in the previous sections) to
describe the basic layout of the target machine's processor chip
(registers, stack, etc.).  It can be shared among many targets that use
the same processor architecture.

@node Target Descriptions
@chapter Target Descriptions
@cindex target descriptions

The target architecture definition (@pxref{Target Architecture Definition})
contains @value{GDBN}'s hard-coded knowledge about an architecture.  For
some platforms, it is handy to have more flexible knowledge about a specific
instance of the architecture---for instance, a processor or development board.
@dfn{Target descriptions} provide a mechanism for the user to tell @value{GDBN}
more about what their target supports, or for the target to tell @value{GDBN}
directly.

For details on writing, automatically supplying, and manually selecting
target descriptions, see @ref{Target Descriptions, , , gdb,
Debugging with @value{GDBN}}.  This section will cover some related
topics about the @value{GDBN} internals.

@menu
* Target Descriptions Implementation::
* Adding Target Described Register Support::
@end menu

@node Target Descriptions Implementation
@section Target Descriptions Implementation
@cindex target descriptions, implementation

Before @value{GDBN} connects to a new target, or runs a new program on
an existing target, it discards any existing target description and
reverts to a default gdbarch.  Then, after connecting, it looks for a
new target description by calling @code{target_find_description}.

A description may come from a user specified file (XML), the remote
@samp{qXfer:features:read} packet (also XML), or from any custom
@code{to_read_description} routine in the target vector.  For instance,
the remote target supports guessing whether a MIPS target is 32-bit or
64-bit based on the size of the @samp{g} packet.

If any target description is found, @value{GDBN} creates a new gdbarch
incorporating the description by calling @code{gdbarch_update_p}.  Any
@samp{<architecture>} element is handled first, to determine which
architecture's gdbarch initialization routine is called to create the
new architecture.  Then the initialization routine is called, and has
a chance to adjust the constructed architecture based on the contents
of the target description.  For instance, it can recognize any
properties set by a @code{to_read_description} routine.  Also
see @ref{Adding Target Described Register Support}.

@node Adding Target Described Register Support
@section Adding Target Described Register Support
@cindex target descriptions, adding register support

Target descriptions can report additional registers specific to an
instance of the target.  But it takes a little work in the architecture
specific routines to support this.

A target description must either have no registers or a complete
set---this avoids complexity in trying to merge standard registers
with the target defined registers.  It is the architecture's
responsibility to validate that a description with registers has
everything it needs.  To keep architecture code simple, the same
mechanism is used to assign fixed internal register numbers to
standard registers.

If @code{tdesc_has_registers} returns 1, the description contains
registers.  The architecture's @code{gdbarch_init} routine should:

@itemize @bullet

@item
Call @code{tdesc_data_alloc} to allocate storage, early, before
searching for a matching gdbarch or allocating a new one.

@item
Use @code{tdesc_find_feature} to locate standard features by name.

@item
Use @code{tdesc_numbered_register} and @code{tdesc_numbered_register_choices}
to locate the expected registers in the standard features.

@item
Return @code{NULL} if a required feature is missing, or if any standard
feature is missing expected registers.  This will produce a warning that
the description was incomplete.

@item
Free the allocated data before returning, unless @code{tdesc_use_registers}
is called.

@item
Call @code{set_gdbarch_num_regs} as usual, with a number higher than any
fixed number passed to @code{tdesc_numbered_register}.

@item
Call @code{tdesc_use_registers} after creating a new gdbarch, before
returning it.

@end itemize

After @code{tdesc_use_registers} has been called, the architecture's
@code{register_name}, @code{register_type}, and @code{register_reggroup_p}
routines will not be called; that information will be taken from
the target description.  @code{num_regs} may be increased to account
for any additional registers in the description.

Pseudo-registers require some extra care:

@itemize @bullet

@item
Using @code{tdesc_numbered_register} allows the architecture to give
constant register numbers to standard architectural registers, e.g.@:
as an @code{enum} in @file{@var{arch}-tdep.h}.  But because
pseudo-registers are always numbered above @code{num_regs},
which may be increased by the description, constant numbers
can not be used for pseudos.  They must be numbered relative to
@code{num_regs} instead.

@item
The description will not describe pseudo-registers, so the
architecture must call @code{set_tdesc_pseudo_register_name},
@code{set_tdesc_pseudo_register_type}, and
@code{set_tdesc_pseudo_register_reggroup_p} to supply routines
describing pseudo registers.  These routines will be passed
internal register numbers, so the same routines used for the
gdbarch equivalents are usually suitable.

@end itemize


@node Target Vector Definition

@chapter Target Vector Definition
@cindex target vector

The target vector defines the interface between @value{GDBN}'s
abstract handling of target systems, and the nitty-gritty code that
actually exercises control over a process or a serial port.
@value{GDBN} includes some 30-40 different target vectors; however,
each configuration of @value{GDBN} includes only a few of them.

@menu
* Managing Execution State::
* Existing Targets::
@end menu

@node Managing Execution State
@section Managing Execution State
@cindex execution state

A target vector can be completely inactive (not pushed on the target
stack), active but not running (pushed, but not connected to a fully
manifested inferior), or completely active (pushed, with an accessible
inferior).  Most targets are only completely inactive or completely
active, but some support persistent connections to a target even
when the target has exited or not yet started.

For example, connecting to the simulator using @code{target sim} does
not create a running program.  Neither registers nor memory are
accessible until @code{run}.  Similarly, after @code{kill}, the
program can not continue executing.  But in both cases @value{GDBN}
remains connected to the simulator, and target-specific commands
are directed to the simulator.

A target which only supports complete activation should push itself
onto the stack in its @code{to_open} routine (by calling
@code{push_target}), and unpush itself from the stack in its
@code{to_mourn_inferior} routine (by calling @code{unpush_target}).

A target which supports both partial and complete activation should
still call @code{push_target} in @code{to_open}, but not call
@code{unpush_target} in @code{to_mourn_inferior}.  Instead, it should
call either @code{target_mark_running} or @code{target_mark_exited}
in its @code{to_open}, depending on whether the target is fully active
after connection.  It should also call @code{target_mark_running} any
time the inferior becomes fully active (e.g.@: in
@code{to_create_inferior} and @code{to_attach}), and
@code{target_mark_exited} when the inferior becomes inactive (in
@code{to_mourn_inferior}).  The target should also make sure to call
@code{target_mourn_inferior} from its @code{to_kill}, to return the
target to inactive state.

@node Existing Targets
@section Existing Targets
@cindex targets

@subsection File Targets

Both executables and core files have target vectors.

@subsection Standard Protocol and Remote Stubs

@value{GDBN}'s file @file{remote.c} talks a serial protocol to code that
runs in the target system.  @value{GDBN} provides several sample
@dfn{stubs} that can be integrated into target programs or operating
systems for this purpose; they are named @file{@var{cpu}-stub.c}.  Many
operating systems, embedded targets, emulators, and simulators already
have a @value{GDBN} stub built into them, and maintenance of the remote
protocol must be careful to preserve compatibility.

The @value{GDBN} user's manual describes how to put such a stub into
your target code.  What follows is a discussion of integrating the
SPARC stub into a complicated operating system (rather than a simple
program), by Stu Grossman, the author of this stub.

The trap handling code in the stub assumes the following upon entry to
@code{trap_low}:

@enumerate
@item
%l1 and %l2 contain pc and npc respectively at the time of the trap;

@item
traps are disabled;

@item
you are in the correct trap window.
@end enumerate

As long as your trap handler can guarantee those conditions, then there
is no reason why you shouldn't be able to ``share'' traps with the stub.
The stub has no requirement that it be jumped to directly from the
hardware trap vector.  That is why it calls @code{exceptionHandler()},
which is provided by the external environment.  For instance, this could
set up the hardware traps to actually execute code which calls the stub
first, and then transfers to its own trap handler.

For the most point, there probably won't be much of an issue with
``sharing'' traps, as the traps we use are usually not used by the kernel,
and often indicate unrecoverable error conditions.  Anyway, this is all
controlled by a table, and is trivial to modify.  The most important
trap for us is for @code{ta 1}.  Without that, we can't single step or
do breakpoints.  Everything else is unnecessary for the proper operation
of the debugger/stub.

From reading the stub, it's probably not obvious how breakpoints work.
They are simply done by deposit/examine operations from @value{GDBN}.

@subsection ROM Monitor Interface

@subsection Custom Protocols

@subsection Transport Layer

@subsection Builtin Simulator


@node Native Debugging

@chapter Native Debugging
@cindex native debugging

Several files control @value{GDBN}'s configuration for native support:

@table @file
@vindex NATDEPFILES
@item gdb/config/@var{arch}/@var{xyz}.mh
Specifies Makefile fragments needed by a @emph{native} configuration on
machine @var{xyz}.  In particular, this lists the required
native-dependent object files, by defining @samp{NATDEPFILES=@dots{}}.
Also specifies the header file which describes native support on
@var{xyz}, by defining @samp{NAT_FILE= nm-@var{xyz}.h}.  You can also
define @samp{NAT_CFLAGS}, @samp{NAT_ADD_FILES}, @samp{NAT_CLIBS},
@samp{NAT_CDEPS}, @samp{NAT_GENERATED_FILES}, etc.; see @file{Makefile.in}.

@emph{Maintainer's note: The @file{.mh} suffix is because this file
originally contained @file{Makefile} fragments for hosting @value{GDBN}
on machine @var{xyz}.  While the file is no longer used for this
purpose, the @file{.mh} suffix remains.  Perhaps someone will
eventually rename these fragments so that they have a @file{.mn}
suffix.}

@item gdb/config/@var{arch}/nm-@var{xyz}.h
(@file{nm.h} is a link to this file, created by @code{configure}).  Contains C
macro definitions describing the native system environment, such as
child process control and core file support.

@item gdb/@var{xyz}-nat.c
Contains any miscellaneous C code required for this native support of
this machine.  On some machines it doesn't exist at all.
@end table

There are some ``generic'' versions of routines that can be used by
various systems.  These can be customized in various ways by macros
defined in your @file{nm-@var{xyz}.h} file.  If these routines work for
the @var{xyz} host, you can just include the generic file's name (with
@samp{.o}, not @samp{.c}) in @code{NATDEPFILES}.

Otherwise, if your machine needs custom support routines, you will need
to write routines that perform the same functions as the generic file.
Put them into @file{@var{xyz}-nat.c}, and put @file{@var{xyz}-nat.o}
into @code{NATDEPFILES}.

@table @file
@item inftarg.c
This contains the @emph{target_ops vector} that supports Unix child
processes on systems which use ptrace and wait to control the child.

@item procfs.c
This contains the @emph{target_ops vector} that supports Unix child
processes on systems which use /proc to control the child.

@item fork-child.c
This does the low-level grunge that uses Unix system calls to do a ``fork
and exec'' to start up a child process.

@item infptrace.c
This is the low level interface to inferior processes for systems using
the Unix @code{ptrace} call in a vanilla way.
@end table

@section ptrace

@section /proc

@section win32

@section shared libraries

@section Native Conditionals
@cindex native conditionals

When @value{GDBN} is configured and compiled, various macros are
defined or left undefined, to control compilation when the host and
target systems are the same.  These macros should be defined (or left
undefined) in @file{nm-@var{system}.h}.

@table @code

@item I386_USE_GENERIC_WATCHPOINTS
An x86-based machine can define this to use the generic x86 watchpoint
support; see @ref{Algorithms, I386_USE_GENERIC_WATCHPOINTS}.

@item SOLIB_ADD (@var{filename}, @var{from_tty}, @var{targ}, @var{readsyms})
@findex SOLIB_ADD
Define this to expand into an expression that will cause the symbols in
@var{filename} to be added to @value{GDBN}'s symbol table.  If
@var{readsyms} is zero symbols are not read but any necessary low level
processing for @var{filename} is still done.

@item SOLIB_CREATE_INFERIOR_HOOK
@findex SOLIB_CREATE_INFERIOR_HOOK
Define this to expand into any shared-library-relocation code that you
want to be run just after the child process has been forked.

@item START_INFERIOR_TRAPS_EXPECTED
@findex START_INFERIOR_TRAPS_EXPECTED
When starting an inferior, @value{GDBN} normally expects to trap
twice; once when
the shell execs, and once when the program itself execs.  If the actual
number of traps is something other than 2, then define this macro to
expand into the number expected.

@end table

@node Support Libraries

@chapter Support Libraries

@section BFD
@cindex BFD library

BFD provides support for @value{GDBN} in several ways:

@table @emph
@item identifying executable and core files
BFD will identify a variety of file types, including a.out, coff, and
several variants thereof, as well as several kinds of core files.

@item access to sections of files
BFD parses the file headers to determine the names, virtual addresses,
sizes, and file locations of all the various named sections in files
(such as the text section or the data section).  @value{GDBN} simply
calls BFD to read or write section @var{x} at byte offset @var{y} for
length @var{z}.

@item specialized core file support
BFD provides routines to determine the failing command name stored in a
core file, the signal with which the program failed, and whether a core
file matches (i.e.@: could be a core dump of) a particular executable
file.

@item locating the symbol information
@value{GDBN} uses an internal interface of BFD to determine where to find the
symbol information in an executable file or symbol-file.  @value{GDBN} itself
handles the reading of symbols, since BFD does not ``understand'' debug
symbols, but @value{GDBN} uses BFD's cached information to find the symbols,
string table, etc.
@end table

@section opcodes
@cindex opcodes library

The opcodes library provides @value{GDBN}'s disassembler.  (It's a separate
library because it's also used in binutils, for @file{objdump}).

@section readline
@cindex readline library
The @code{readline} library provides a set of functions for use by applications
that allow users to edit command lines as they are typed in.

@section libiberty
@cindex @code{libiberty} library

The @code{libiberty} library provides a set of functions and features
that integrate and improve on functionality found in modern operating
systems.  Broadly speaking, such features can be divided into three
groups: supplemental functions (functions that may be missing in some
environments and operating systems), replacement functions (providing
a uniform and easier to use interface for commonly used standard
functions), and extensions (which provide additional functionality
beyond standard functions).

@value{GDBN} uses various features provided by the @code{libiberty}
library, for instance the C@t{++} demangler, the @acronym{IEEE}
floating format support functions, the input options parser
@samp{getopt}, the @samp{obstack} extension, and other functions.

@subsection @code{obstacks} in @value{GDBN}
@cindex @code{obstacks}

The obstack mechanism provides a convenient way to allocate and free
chunks of memory.  Each obstack is a pool of memory that is managed
like a stack.  Objects (of any nature, size and alignment) are
allocated and freed in a @acronym{LIFO} fashion on an obstack (see
@code{libiberty}'s documentation for a more detailed explanation of
@code{obstacks}).

The most noticeable use of the @code{obstacks} in @value{GDBN} is in
object files.  There is an obstack associated with each internal
representation of an object file.  Lots of things get allocated on
these @code{obstacks}: dictionary entries, blocks, blockvectors,
symbols, minimal symbols, types, vectors of fundamental types, class
fields of types, object files section lists, object files section
offset lists, line tables, symbol tables, partial symbol tables,
string tables, symbol table private data, macros tables, debug
information sections and entries, import and export lists (som),
unwind information (hppa), dwarf2 location expressions data.  Plus
various strings such as directory names strings, debug format strings,
names of types.

An essential and convenient property of all data on @code{obstacks} is
that memory for it gets allocated (with @code{obstack_alloc}) at
various times during a debugging session, but it is released all at
once using the @code{obstack_free} function.  The @code{obstack_free}
function takes a pointer to where in the stack it must start the
deletion from (much like the cleanup chains have a pointer to where to
start the cleanups).  Because of the stack like structure of the
@code{obstacks}, this allows to free only a top portion of the
obstack.  There are a few instances in @value{GDBN} where such thing
happens.  Calls to @code{obstack_free} are done after some local data
is allocated to the obstack.  Only the local data is deleted from the
obstack.  Of course this assumes that nothing between the
@code{obstack_alloc} and the @code{obstack_free} allocates anything
else on the same obstack.  For this reason it is best and safest to
use temporary @code{obstacks}.

Releasing the whole obstack is also not safe per se.  It is safe only
under the condition that we know the @code{obstacks} memory is no
longer needed.  In @value{GDBN} we get rid of the @code{obstacks} only
when we get rid of the whole objfile(s), for instance upon reading a
new symbol file.

@section gnu-regex
@cindex regular expressions library

Regex conditionals.

@table @code
@item C_ALLOCA

@item NFAILURES

@item RE_NREGS

@item SIGN_EXTEND_CHAR

@item SWITCH_ENUM_BUG

@item SYNTAX_TABLE

@item Sword

@item sparc
@end table

@section Array Containers
@cindex Array Containers
@cindex VEC

Often it is necessary to manipulate a dynamic array of a set of
objects.  C forces some bookkeeping on this, which can get cumbersome
and repetitive.  The @file{vec.h} file contains macros for defining
and using a typesafe vector type.  The functions defined will be
inlined when compiling, and so the abstraction cost should be zero.
Domain checks are added to detect programming errors.

An example use would be an array of symbols or section information.
The array can be grown as symbols are read in (or preallocated), and
the accessor macros provided keep care of all the necessary
bookkeeping.  Because the arrays are type safe, there is no danger of
accidentally mixing up the contents.  Think of these as C++ templates,
but implemented in C.

Because of the different behavior of structure objects, scalar objects
and of pointers, there are three flavors of vector, one for each of
these variants.  Both the structure object and pointer variants pass
pointers to objects around --- in the former case the pointers are
stored into the vector and in the latter case the pointers are
dereferenced and the objects copied into the vector.  The scalar
object variant is suitable for @code{int}-like objects, and the vector
elements are returned by value.

There are both @code{index} and @code{iterate} accessors.  The iterator
returns a boolean iteration condition and updates the iteration
variable passed by reference.  Because the iterator will be inlined,
the address-of can be optimized away.

The vectors are implemented using the trailing array idiom, thus they
are not resizeable without changing the address of the vector object
itself.  This means you cannot have variables or fields of vector type
--- always use a pointer to a vector.  The one exception is the final
field of a structure, which could be a vector type.  You will have to
use the @code{embedded_size} & @code{embedded_init} calls to create
such objects, and they will probably not be resizeable (so don't use
the @dfn{safe} allocation variants).  The trailing array idiom is used
(rather than a pointer to an array of data), because, if we allow
@code{NULL} to also represent an empty vector, empty vectors occupy
minimal space in the structure containing them.

Each operation that increases the number of active elements is
available in @dfn{quick} and @dfn{safe} variants.  The former presumes
that there is sufficient allocated space for the operation to succeed
(it dies if there is not).  The latter will reallocate the vector, if
needed.  Reallocation causes an exponential increase in vector size.
If you know you will be adding N elements, it would be more efficient
to use the reserve operation before adding the elements with the
@dfn{quick} operation.  This will ensure there are at least as many
elements as you ask for, it will exponentially increase if there are
too few spare slots.  If you want reserve a specific number of slots,
but do not want the exponential increase (for instance, you know this
is the last allocation), use a negative number for reservation.  You
can also create a vector of a specific size from the get go.

You should prefer the push and pop operations, as they append and
remove from the end of the vector.  If you need to remove several items
in one go, use the truncate operation.  The insert and remove
operations allow you to change elements in the middle of the vector.
There are two remove operations, one which preserves the element
ordering @code{ordered_remove}, and one which does not
@code{unordered_remove}.  The latter function copies the end element
into the removed slot, rather than invoke a memmove operation.  The
@code{lower_bound} function will determine where to place an item in
the array using insert that will maintain sorted order.

If you need to directly manipulate a vector, then the @code{address}
accessor will return the address of the start of the vector.  Also the
@code{space} predicate will tell you whether there is spare capacity in the
vector.  You will not normally need to use these two functions.

Vector types are defined using a
@code{DEF_VEC_@{O,P,I@}(@var{typename})} macro.  Variables of vector
type are declared using a @code{VEC(@var{typename})} macro.  The
characters @code{O}, @code{P} and @code{I} indicate whether
@var{typename} is an object (@code{O}), pointer (@code{P}) or integral
(@code{I}) type.  Be careful to pick the correct one, as you'll get an
awkward and inefficient API if you use the wrong one.  There is a
check, which results in a compile-time warning, for the @code{P} and
@code{I} versions, but there is no check for the @code{O} versions, as
that is not possible in plain C.

An example of their use would be,

@smallexample
DEF_VEC_P(tree);   // non-managed tree vector.

struct my_struct @{
  VEC(tree) *v;      // A (pointer to) a vector of tree pointers.
@};

struct my_struct *s;

if (VEC_length(tree, s->v)) @{ we have some contents @}
VEC_safe_push(tree, s->v, decl); // append some decl onto the end
for (ix = 0; VEC_iterate(tree, s->v, ix, elt); ix++)
  @{ do something with elt @}

@end smallexample

The @file{vec.h} file provides details on how to invoke the various
accessors provided.  They are enumerated here:

@table @code
@item VEC_length
Return the number of items in the array,

@item VEC_empty
Return true if the array has no elements.

@item VEC_last
@itemx VEC_index
Return the last or arbitrary item in the array.

@item VEC_iterate
Access an array element and indicate whether the array has been
traversed.

@item VEC_alloc
@itemx VEC_free
Create and destroy an array.

@item VEC_embedded_size
@itemx VEC_embedded_init
Helpers for embedding an array as the final element of another struct.

@item VEC_copy
Duplicate an array.

@item VEC_space
Return the amount of free space in an array.

@item VEC_reserve
Ensure a certain amount of free space.

@item VEC_quick_push
@itemx VEC_safe_push
Append to an array, either assuming the space is available, or making
sure that it is.

@item VEC_pop
Remove the last item from an array.

@item VEC_truncate
Remove several items from the end of an array.

@item VEC_safe_grow
Add several items to the end of an array.

@item VEC_replace
Overwrite an item in the array.

@item VEC_quick_insert
@itemx VEC_safe_insert
Insert an item into the middle of the array.  Either the space must
already exist, or the space is created.

@item VEC_ordered_remove
@itemx VEC_unordered_remove
Remove an item from the array, preserving order or not.

@item VEC_block_remove
Remove a set of items from the array.

@item VEC_address
Provide the address of the first element.

@item VEC_lower_bound
Binary search the array.

@end table

@section include

@node Coding Standards

@chapter Coding Standards
@cindex coding standards

@section @value{GDBN} C Coding Standards

@value{GDBN} follows the GNU coding standards, as described in
@file{etc/standards.texi}.  This file is also available for anonymous
FTP from GNU archive sites.  @value{GDBN} takes a strict interpretation
of the standard; in general, when the GNU standard recommends a practice
but does not require it, @value{GDBN} requires it.

@value{GDBN} follows an additional set of coding standards specific to
@value{GDBN}, as described in the following sections.

@subsection ISO C

@value{GDBN} assumes an ISO/IEC 9899:1990 (a.k.a.@: ISO C90) compliant
compiler.

@value{GDBN} does not assume an ISO C or POSIX compliant C library.

@subsection Formatting

@cindex source code formatting
The standard GNU recommendations for formatting must be followed
strictly.  Any @value{GDBN}-specific deviation from GNU
recomendations is described below.

A function declaration should not have its name in column zero.  A
function definition should have its name in column zero.

@smallexample
/* Declaration */
static void foo (void);
/* Definition */
void
foo (void)
@{
@}
@end smallexample

@emph{Pragmatics: This simplifies scripting.  Function definitions can
be found using @samp{^function-name}.}

There must be a space between a function or macro name and the opening
parenthesis of its argument list (except for macro definitions, as
required by C).  There must not be a space after an open paren/bracket
or before a close paren/bracket.

While additional whitespace is generally helpful for reading, do not use
more than one blank line to separate blocks, and avoid adding whitespace
after the end of a program line (as of 1/99, some 600 lines had
whitespace after the semicolon).  Excess whitespace causes difficulties
for @code{diff} and @code{patch} utilities.

Pointers are declared using the traditional K&R C style:

@smallexample
void *foo;
@end smallexample

@noindent
and not:

@smallexample
void * foo;
void* foo;
@end smallexample

In addition, whitespace around casts and unary operators should follow
the following guidelines:

@multitable @columnfractions .2 .2 .8
@item Use... @tab ...instead of @tab

@item @code{!x}
@tab @code{! x}
@item @code{~x}
@tab @code{~ x}
@item @code{-x}
@tab @code{- x}
@tab (unary minus)
@item @code{(foo) x}
@tab @code{(foo)x}
@tab (cast)
@item @code{*x}
@tab @code{* x}
@tab (pointer dereference)
@end multitable

@subsection Comments

@cindex comment formatting
The standard GNU requirements on comments must be followed strictly.

Block comments must appear in the following form, with no @code{/*}- or
@code{*/}-only lines, and no leading @code{*}:

@smallexample
/* Wait for control to return from inferior to debugger.  If inferior
   gets a signal, we may decide to start it up again instead of
   returning.  That is why there is a loop in this function.  When
   this function actually returns it means the inferior should be left
   stopped and @value{GDBN} should read more commands.  */
@end smallexample

(Note that this format is encouraged by Emacs; tabbing for a multi-line
comment works correctly, and @kbd{M-q} fills the block consistently.)

Put a blank line between the block comments preceding function or
variable definitions, and the definition itself.

In general, put function-body comments on lines by themselves, rather
than trying to fit them into the 20 characters left at the end of a
line, since either the comment or the code will inevitably get longer
than will fit, and then somebody will have to move it anyhow.

@subsection C Usage

@cindex C data types
Code must not depend on the sizes of C data types, the format of the
host's floating point numbers, the alignment of anything, or the order
of evaluation of expressions.

@cindex function usage
Use functions freely.  There are only a handful of compute-bound areas
in @value{GDBN} that might be affected by the overhead of a function
call, mainly in symbol reading.  Most of @value{GDBN}'s performance is
limited by the target interface (whether serial line or system call).

However, use functions with moderation.  A thousand one-line functions
are just as hard to understand as a single thousand-line function.

@emph{Macros are bad, M'kay.}
(But if you have to use a macro, make sure that the macro arguments are
protected with parentheses.)

@cindex types

Declarations like @samp{struct foo *} should be used in preference to
declarations like @samp{typedef struct foo @{ @dots{} @} *foo_ptr}.

@subsection Function Prototypes
@cindex function prototypes

Prototypes must be used when both @emph{declaring} and @emph{defining}
a function.  Prototypes for @value{GDBN} functions must include both the
argument type and name, with the name matching that used in the actual
function definition.

All external functions should have a declaration in a header file that
callers include, except for @code{_initialize_*} functions, which must
be external so that @file{init.c} construction works, but shouldn't be
visible to random source files.

Where a source file needs a forward declaration of a static function,
that declaration must appear in a block near the top of the source file.

@subsection File Names

Any file used when building the core of @value{GDBN} must be in lower
case.  Any file used when building the core of @value{GDBN} must be 8.3
unique.  These requirements apply to both source and generated files.

@emph{Pragmatics: The core of @value{GDBN} must be buildable on many
platforms including DJGPP and MacOS/HFS.  Every time an unfriendly file
is introduced to the build process both @file{Makefile.in} and
@file{configure.in} need to be modified accordingly.  Compare the
convoluted conversion process needed to transform @file{COPYING} into
@file{copying.c} with the conversion needed to transform
@file{version.in} into @file{version.c}.}

Any file non 8.3 compliant file (that is not used when building the core
of @value{GDBN}) must be added to @file{gdb/config/djgpp/fnchange.lst}.

@emph{Pragmatics: This is clearly a compromise.}

When @value{GDBN} has a local version of a system header file (ex
@file{string.h}) the file name based on the POSIX header prefixed with
@file{gdb_} (@file{gdb_string.h}).  These headers should be relatively
independent: they should use only macros defined by @file{configure},
the compiler, or the host; they should include only system headers; they
should refer only to system types.  They may be shared between multiple
programs, e.g.@: @value{GDBN} and @sc{gdbserver}.

For other files @samp{-} is used as the separator.

@subsection Include Files

A @file{.c} file should include @file{defs.h} first.

A @file{.c} file should directly include the @code{.h} file of every
declaration and/or definition it directly refers to.  It cannot rely on
indirect inclusion.

A @file{.h} file should directly include the @code{.h} file of every
declaration and/or definition it directly refers to.  It cannot rely on
indirect inclusion.  Exception: The file @file{defs.h} does not need to
be directly included.

An external declaration should only appear in one include file.

An external declaration should never appear in a @code{.c} file.
Exception: a declaration for the @code{_initialize} function that
pacifies @option{-Wmissing-declaration}.

A @code{typedef} definition should only appear in one include file.

An opaque @code{struct} declaration can appear in multiple @file{.h}
files.  Where possible, a @file{.h} file should use an opaque
@code{struct} declaration instead of an include.

All @file{.h} files should be wrapped in:

@smallexample
#ifndef INCLUDE_FILE_NAME_H
#define INCLUDE_FILE_NAME_H
header body
#endif
@end smallexample

@section @value{GDBN} Python Coding Standards

@value{GDBN} follows the published @code{Python} coding standards in
@uref{http://www.python.org/dev/peps/pep-0008/, @code{PEP008}}.

In addition, the guidelines in the
@uref{http://google-styleguide.googlecode.com/svn/trunk/pyguide.html,
Google Python Style Guide} are also followed where they do not
conflict with @code{PEP008}.

@subsection @value{GDBN}-specific exceptions

There are a few exceptions to the published standards.
They exist mainly for consistency with the @code{C} standards.

@c It is expected that there are a few more exceptions,
@c so we use itemize here.

@itemize @bullet

@item
Use @code{FIXME} instead of @code{TODO}.

@end itemize

@node Misc Guidelines

@chapter Misc Guidelines

This chapter covers topics that are lower-level than the major
algorithms of @value{GDBN}.

@section Cleanups
@cindex cleanups

Cleanups are a structured way to deal with things that need to be done
later.

When your code does something (e.g., @code{xmalloc} some memory, or
@code{open} a file) that needs to be undone later (e.g., @code{xfree}
the memory or @code{close} the file), it can make a cleanup.  The
cleanup will be done at some future point: when the command is finished
and control returns to the top level; when an error occurs and the stack
is unwound; or when your code decides it's time to explicitly perform
cleanups.  Alternatively you can elect to discard the cleanups you
created.

Syntax:

@table @code
@item struct cleanup *@var{old_chain};
Declare a variable which will hold a cleanup chain handle.

@findex make_cleanup
@item @var{old_chain} = make_cleanup (@var{function}, @var{arg});
Make a cleanup which will cause @var{function} to be called with
@var{arg} (a @code{char *}) later.  The result, @var{old_chain}, is a
handle that can later be passed to @code{do_cleanups} or
@code{discard_cleanups}.  Unless you are going to call
@code{do_cleanups} or @code{discard_cleanups}, you can ignore the result
from @code{make_cleanup}.

@findex do_cleanups
@item do_cleanups (@var{old_chain});
Do all cleanups added to the chain since the corresponding
@code{make_cleanup} call was made.

@findex discard_cleanups
@item discard_cleanups (@var{old_chain});
Same as @code{do_cleanups} except that it just removes the cleanups from
the chain and does not call the specified functions.
@end table

Cleanups are implemented as a chain.  The handle returned by
@code{make_cleanups} includes the cleanup passed to the call and any
later cleanups appended to the chain (but not yet discarded or
performed).  E.g.:

@smallexample
make_cleanup (a, 0); 
@{
  struct cleanup *old = make_cleanup (b, 0); 
  make_cleanup (c, 0)
  ...
  do_cleanups (old);
@}
@end smallexample

@noindent
will call @code{c()} and @code{b()} but will not call @code{a()}.  The
cleanup that calls @code{a()} will remain in the cleanup chain, and will
be done later unless otherwise discarded.@refill

Your function should explicitly do or discard the cleanups it creates.
Failing to do this leads to non-deterministic behavior since the caller
will arbitrarily do or discard your functions cleanups.  This need leads
to two common cleanup styles.

The first style is try/finally.  Before it exits, your code-block calls
@code{do_cleanups} with the old cleanup chain and thus ensures that your
code-block's cleanups are always performed.  For instance, the following
code-segment avoids a memory leak problem (even when @code{error} is
called and a forced stack unwind occurs) by ensuring that the
@code{xfree} will always be called:

@smallexample
struct cleanup *old = make_cleanup (null_cleanup, 0);
data = xmalloc (sizeof blah);
make_cleanup (xfree, data);
... blah blah ...
do_cleanups (old);
@end smallexample

The second style is try/except.  Before it exits, your code-block calls
@code{discard_cleanups} with the old cleanup chain and thus ensures that
any created cleanups are not performed.  For instance, the following
code segment, ensures that the file will be closed but only if there is
an error:

@smallexample
FILE *file = fopen ("afile", "r");
struct cleanup *old = make_cleanup (close_file, file);
... blah blah ...
discard_cleanups (old);
return file;
@end smallexample

Some functions, e.g., @code{fputs_filtered()} or @code{error()}, specify
that they ``should not be called when cleanups are not in place''.  This
means that any actions you need to reverse in the case of an error or
interruption must be on the cleanup chain before you call these
functions, since they might never return to your code (they
@samp{longjmp} instead).

@section Per-architecture module data
@cindex per-architecture module data
@cindex multi-arch data
@cindex data-pointer, per-architecture/per-module

The multi-arch framework includes a mechanism for adding module
specific per-architecture data-pointers to the @code{struct gdbarch}
architecture object.

A module registers one or more per-architecture data-pointers using:

@deftypefn {Architecture Function} {struct gdbarch_data *} gdbarch_data_register_pre_init (gdbarch_data_pre_init_ftype *@var{pre_init})
@var{pre_init} is used to, on-demand, allocate an initial value for a
per-architecture data-pointer using the architecture's obstack (passed
in as a parameter).  Since @var{pre_init} can be called during
architecture creation, it is not parameterized with the architecture.
and must not call modules that use per-architecture data.
@end deftypefn

@deftypefn {Architecture Function} {struct gdbarch_data *} gdbarch_data_register_post_init (gdbarch_data_post_init_ftype *@var{post_init})
@var{post_init} is used to obtain an initial value for a
per-architecture data-pointer @emph{after}.  Since @var{post_init} is
always called after architecture creation, it both receives the fully
initialized architecture and is free to call modules that use
per-architecture data (care needs to be taken to ensure that those
other modules do not try to call back to this module as that will
create in cycles in the initialization call graph).
@end deftypefn

These functions return a @code{struct gdbarch_data} that is used to
identify the per-architecture data-pointer added for that module.

The per-architecture data-pointer is accessed using the function:

@deftypefn {Architecture Function} {void *} gdbarch_data (struct gdbarch *@var{gdbarch}, struct gdbarch_data *@var{data_handle})
Given the architecture @var{arch} and module data handle
@var{data_handle} (returned by @code{gdbarch_data_register_pre_init}
or @code{gdbarch_data_register_post_init}), this function returns the
current value of the per-architecture data-pointer.  If the data
pointer is @code{NULL}, it is first initialized by calling the
corresponding @var{pre_init} or @var{post_init} method.
@end deftypefn

The examples below assume the following definitions:

@smallexample
struct nozel @{ int total; @};
static struct gdbarch_data *nozel_handle;
@end smallexample

A module can extend the architecture vector, adding additional
per-architecture data, using the @var{pre_init} method.  The module's
per-architecture data is then initialized during architecture
creation.

In the below, the module's per-architecture @emph{nozel} is added.  An
architecture can specify its nozel by calling @code{set_gdbarch_nozel}
from @code{gdbarch_init}.

@smallexample
static void *
nozel_pre_init (struct obstack *obstack)
@{
  struct nozel *data = OBSTACK_ZALLOC (obstack, struct nozel);
  return data;
@}
@end smallexample

@smallexample
extern void
set_gdbarch_nozel (struct gdbarch *gdbarch, int total)
@{
  struct nozel *data = gdbarch_data (gdbarch, nozel_handle);
  data->total = nozel;
@}
@end smallexample

A module can on-demand create architecture dependent data structures
using @code{post_init}.

In the below, the nozel's total is computed on-demand by
@code{nozel_post_init} using information obtained from the
architecture.

@smallexample
static void *
nozel_post_init (struct gdbarch *gdbarch)
@{
  struct nozel *data = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct nozel);
  nozel->total = gdbarch@dots{} (gdbarch);
  return data;
@}
@end smallexample

@smallexample
extern int
nozel_total (struct gdbarch *gdbarch)
@{
  struct nozel *data = gdbarch_data (gdbarch, nozel_handle);
  return data->total;
@}
@end smallexample

@section Wrapping Output Lines
@cindex line wrap in output

@findex wrap_here
Output that goes through @code{printf_filtered} or @code{fputs_filtered}
or @code{fputs_demangled} needs only to have calls to @code{wrap_here}
added in places that would be good breaking points.  The utility
routines will take care of actually wrapping if the line width is
exceeded.

The argument to @code{wrap_here} is an indentation string which is
printed @emph{only} if the line breaks there.  This argument is saved
away and used later.  It must remain valid until the next call to
@code{wrap_here} or until a newline has been printed through the
@code{*_filtered} functions.  Don't pass in a local variable and then
return!

It is usually best to call @code{wrap_here} after printing a comma or
space.  If you call it before printing a space, make sure that your
indentation properly accounts for the leading space that will print if
the line wraps there.

Any function or set of functions that produce filtered output must
finish by printing a newline, to flush the wrap buffer, before switching
to unfiltered (@code{printf}) output.  Symbol reading routines that
print warnings are a good example.

@section Memory Management

@value{GDBN} does not use the functions @code{malloc}, @code{realloc},
@code{calloc}, @code{free} and @code{asprintf}.

@value{GDBN} uses the functions @code{xmalloc}, @code{xrealloc} and
@code{xcalloc} when allocating memory.  Unlike @code{malloc} et.al.@:
these functions do not return when the memory pool is empty.  Instead,
they unwind the stack using cleanups.  These functions return
@code{NULL} when requested to allocate a chunk of memory of size zero.

@emph{Pragmatics: By using these functions, the need to check every
memory allocation is removed.  These functions provide portable
behavior.}

@value{GDBN} does not use the function @code{free}.

@value{GDBN} uses the function @code{xfree} to return memory to the
memory pool.  Consistent with ISO-C, this function ignores a request to
free a @code{NULL} pointer.

@emph{Pragmatics: On some systems @code{free} fails when passed a
@code{NULL} pointer.}

@value{GDBN} can use the non-portable function @code{alloca} for the
allocation of small temporary values (such as strings).

@emph{Pragmatics: This function is very non-portable.  Some systems
restrict the memory being allocated to no more than a few kilobytes.}

@value{GDBN} uses the string function @code{xstrdup} and the print
function @code{xstrprintf}.

@emph{Pragmatics: @code{asprintf} and @code{strdup} can fail.  Print
functions such as @code{sprintf} are very prone to buffer overflow
errors.}


@section Compiler Warnings
@cindex compiler warnings

With few exceptions, developers should avoid the configuration option
@samp{--disable-werror} when building @value{GDBN}.  The exceptions
are listed in the file @file{gdb/MAINTAINERS}.  The default, when
building with @sc{gcc}, is @samp{--enable-werror}.

This option causes @value{GDBN} (when built using GCC) to be compiled
with a carefully selected list of compiler warning flags.  Any warnings
from those flags are treated as errors.

The current list of warning flags includes:

@table @samp
@item -Wall
Recommended @sc{gcc} warnings.

@item -Wdeclaration-after-statement

@sc{gcc} 3.x (and later) and @sc{c99} allow declarations mixed with
code, but @sc{gcc} 2.x and @sc{c89} do not.

@item -Wpointer-arith

@item -Wformat-nonliteral
Non-literal format strings, with a few exceptions, are bugs - they
might contain unintended user-supplied format specifiers.
Since @value{GDBN} uses the @code{format printf} attribute on all
@code{printf} like functions this checks not just @code{printf} calls
but also calls to functions such as @code{fprintf_unfiltered}.

@item -Wno-pointer-sign
In version 4.0, GCC began warning about pointer argument passing or
assignment even when the source and destination differed only in
signedness.  However, most @value{GDBN} code doesn't distinguish
carefully between @code{char} and @code{unsigned char}.  In early 2006
the @value{GDBN} developers decided correcting these warnings wasn't
worth the time it would take.

@item -Wno-unused-parameter
Due to the way that @value{GDBN} is implemented many functions have
unused parameters.  Consequently this warning is avoided.  The macro
@code{ATTRIBUTE_UNUSED} is not used as it leads to false negatives ---
it is not an error to have @code{ATTRIBUTE_UNUSED} on a parameter that
is being used.

@item -Wno-unused
@itemx -Wno-switch
@itemx -Wno-char-subscripts
These are warnings which might be useful for @value{GDBN}, but are
currently too noisy to enable with @samp{-Werror}.

@end table

@section Internal Error Recovery

During its execution, @value{GDBN} can encounter two types of errors.
User errors and internal errors.  User errors include not only a user
entering an incorrect command but also problems arising from corrupt
object files and system errors when interacting with the target.
Internal errors include situations where @value{GDBN} has detected, at
run time, a corrupt or erroneous situation.

When reporting an internal error, @value{GDBN} uses
@code{internal_error} and @code{gdb_assert}.

@value{GDBN} must not call @code{abort} or @code{assert}.

@emph{Pragmatics: There is no @code{internal_warning} function.  Either
the code detected a user error, recovered from it and issued a
@code{warning} or the code failed to correctly recover from the user
error and issued an @code{internal_error}.}

@section Command Names

GDB U/I commands are written @samp{foo-bar}, not @samp{foo_bar}.

@section Clean Design and Portable Implementation

@cindex design
In addition to getting the syntax right, there's the little question of
semantics.  Some things are done in certain ways in @value{GDBN} because long
experience has shown that the more obvious ways caused various kinds of
trouble.

@cindex assumptions about targets
You can't assume the byte order of anything that comes from a target
(including @var{value}s, object files, and instructions).  Such things
must be byte-swapped using @code{SWAP_TARGET_AND_HOST} in
@value{GDBN}, or one of the swap routines defined in @file{bfd.h},
such as @code{bfd_get_32}.

You can't assume that you know what interface is being used to talk to
the target system.  All references to the target must go through the
current @code{target_ops} vector.

You can't assume that the host and target machines are the same machine
(except in the ``native'' support modules).  In particular, you can't
assume that the target machine's header files will be available on the
host machine.  Target code must bring along its own header files --
written from scratch or explicitly donated by their owner, to avoid
copyright problems.

@cindex portability
Insertion of new @code{#ifdef}'s will be frowned upon.  It's much better
to write the code portably than to conditionalize it for various
systems.

@cindex system dependencies
New @code{#ifdef}'s which test for specific compilers or manufacturers
or operating systems are unacceptable.  All @code{#ifdef}'s should test
for features.  The information about which configurations contain which
features should be segregated into the configuration files.  Experience
has proven far too often that a feature unique to one particular system
often creeps into other systems; and that a conditional based on some
predefined macro for your current system will become worthless over
time, as new versions of your system come out that behave differently
with regard to this feature.

Adding code that handles specific architectures, operating systems,
target interfaces, or hosts, is not acceptable in generic code.

@cindex portable file name handling
@cindex file names, portability
One particularly notorious area where system dependencies tend to
creep in is handling of file names.  The mainline @value{GDBN} code
assumes Posix semantics of file names: absolute file names begin with
a forward slash @file{/}, slashes are used to separate leading
directories, case-sensitive file names.  These assumptions are not
necessarily true on non-Posix systems such as MS-Windows.  To avoid
system-dependent code where you need to take apart or construct a file
name, use the following portable macros:

@table @code
@findex HAVE_DOS_BASED_FILE_SYSTEM
@item HAVE_DOS_BASED_FILE_SYSTEM
This preprocessing symbol is defined to a non-zero value on hosts
whose filesystems belong to the MS-DOS/MS-Windows family.  Use this
symbol to write conditional code which should only be compiled for
such hosts.

@findex IS_DIR_SEPARATOR
@item IS_DIR_SEPARATOR (@var{c})
Evaluates to a non-zero value if @var{c} is a directory separator
character.  On Unix and GNU/Linux systems, only a slash @file{/} is
such a character, but on Windows, both @file{/} and @file{\} will
pass.

@findex IS_ABSOLUTE_PATH
@item IS_ABSOLUTE_PATH (@var{file})
Evaluates to a non-zero value if @var{file} is an absolute file name.
For Unix and GNU/Linux hosts, a name which begins with a slash
@file{/} is absolute.  On DOS and Windows, @file{d:/foo} and
@file{x:\bar} are also absolute file names.

@findex FILENAME_CMP
@item FILENAME_CMP (@var{f1}, @var{f2})
Calls a function which compares file names @var{f1} and @var{f2} as
appropriate for the underlying host filesystem.  For Posix systems,
this simply calls @code{strcmp}; on case-insensitive filesystems it
will call @code{strcasecmp} instead.

@findex DIRNAME_SEPARATOR
@item DIRNAME_SEPARATOR
Evaluates to a character which separates directories in
@code{PATH}-style lists, typically held in environment variables.
This character is @samp{:} on Unix, @samp{;} on DOS and Windows.

@findex SLASH_STRING
@item SLASH_STRING
This evaluates to a constant string you should use to produce an
absolute filename from leading directories and the file's basename.
@code{SLASH_STRING} is @code{"/"} on most systems, but might be
@code{"\\"} for some Windows-based ports.
@end table

In addition to using these macros, be sure to use portable library
functions whenever possible.  For example, to extract a directory or a
basename part from a file name, use the @code{dirname} and
@code{basename} library functions (available in @code{libiberty} for
platforms which don't provide them), instead of searching for a slash
with @code{strrchr}.

Another way to generalize @value{GDBN} along a particular interface is with an
attribute struct.  For example, @value{GDBN} has been generalized to handle
multiple kinds of remote interfaces---not by @code{#ifdef}s everywhere, but
by defining the @code{target_ops} structure and having a current target (as
well as a stack of targets below it, for memory references).  Whenever
something needs to be done that depends on which remote interface we are
using, a flag in the current target_ops structure is tested (e.g.,
@code{target_has_stack}), or a function is called through a pointer in the
current target_ops structure.  In this way, when a new remote interface
is added, only one module needs to be touched---the one that actually
implements the new remote interface.  Other examples of
attribute-structs are BFD access to multiple kinds of object file
formats, or @value{GDBN}'s access to multiple source languages.

Please avoid duplicating code.  For example, in @value{GDBN} 3.x all
the code interfacing between @code{ptrace} and the rest of
@value{GDBN} was duplicated in @file{*-dep.c}, and so changing
something was very painful.  In @value{GDBN} 4.x, these have all been
consolidated into @file{infptrace.c}.  @file{infptrace.c} can deal
with variations between systems the same way any system-independent
file would (hooks, @code{#if defined}, etc.), and machines which are
radically different don't need to use @file{infptrace.c} at all.

All debugging code must be controllable using the @samp{set debug
@var{module}} command.  Do not use @code{printf} to print trace
messages.  Use @code{fprintf_unfiltered(gdb_stdlog, ...}.  Do not use
@code{#ifdef DEBUG}.

@node Porting GDB

@chapter Porting @value{GDBN}
@cindex porting to new machines

Most of the work in making @value{GDBN} compile on a new machine is in
specifying the configuration of the machine.  Porting a new
architecture to @value{GDBN} can be broken into a number of steps.

@itemize @bullet

@item
Ensure a @sc{bfd} exists for executables of the target architecture in
the @file{bfd} directory.  If one does not exist, create one by
modifying an existing similar one.

@item
Implement a disassembler for the target architecture in the @file{opcodes}
directory.

@item
Define the target architecture in the @file{gdb} directory
(@pxref{Adding a New Target, , Adding a New Target}).  Add the pattern
for the new target to @file{configure.tgt} with the names of the files
that contain the code.  By convention the target architecture
definition for an architecture @var{arch} is placed in
@file{@var{arch}-tdep.c}.

Within @file{@var{arch}-tdep.c} define the function
@code{_initialize_@var{arch}_tdep} which calls
@code{gdbarch_register} to create the new @code{@w{struct
gdbarch}} for the architecture.

@item
If a new remote target is needed, consider adding a new remote target
by defining a function
@code{_initialize_remote_@var{arch}}.  However if at all possible
use the @value{GDBN} @emph{Remote Serial Protocol} for this and implement
the server side protocol independently with the target.

@item
If desired implement a simulator in the @file{sim} directory.  This
should create the library @file{libsim.a} implementing the interface
in @file{remote-sim.h} (found in the @file{include} directory).

@item
Build and test.  If desired, lobby the @sc{gdb} steering group to
have the new port included in the main distribution!

@item
Add a description of the new architecture to the main @value{GDBN} user
guide (@pxref{Configuration Specific Information, , Configuration
Specific Information, gdb, Debugging with @value{GDBN}}).

@end itemize

@node Versions and Branches
@chapter Versions and Branches

@section Versions

@value{GDBN}'s version is determined by the file
@file{gdb/version.in} and takes one of the following forms:

@table @asis
@item @var{major}.@var{minor}
@itemx @var{major}.@var{minor}.@var{patchlevel}
an official release (e.g., 6.2 or 6.2.1)
@item @var{major}.@var{minor}.@var{patchlevel}.@var{YYYY}@var{MM}@var{DD}
a snapshot taken at @var{YYYY}-@var{MM}-@var{DD}-gmt (e.g.,
6.1.50.20020302, 6.1.90.20020304, or 6.1.0.20020308)
@item @var{major}.@var{minor}.@var{patchlevel}.@var{YYYY}@var{MM}@var{DD}-cvs
a @sc{cvs} check out drawn on @var{YYYY}-@var{MM}-@var{DD} (e.g.,
6.1.50.20020302-cvs, 6.1.90.20020304-cvs, or 6.1.0.20020308-cvs)
@item @var{major}.@var{minor}.@var{patchlevel}.@var{YYYY}@var{MM}@var{DD} (@var{vendor})
a vendor specific release of @value{GDBN}, that while based on@*
@var{major}.@var{minor}.@var{patchlevel}.@var{YYYY}@var{MM}@var{DD},
may include additional changes
@end table

@value{GDBN}'s mainline uses the @var{major} and @var{minor} version
numbers from the most recent release branch, with a @var{patchlevel}
of 50.  At the time each new release branch is created, the mainline's
@var{major} and @var{minor} version numbers are updated.

@value{GDBN}'s release branch is similar.  When the branch is cut, the
@var{patchlevel} is changed from 50 to 90.  As draft releases are
drawn from the branch, the @var{patchlevel} is incremented.  Once the
first release (@var{major}.@var{minor}) has been made, the
@var{patchlevel} is set to 0 and updates have an incremented
@var{patchlevel}.

For snapshots, and @sc{cvs} check outs, it is also possible to
identify the @sc{cvs} origin:

@table @asis
@item @var{major}.@var{minor}.50.@var{YYYY}@var{MM}@var{DD}
drawn from the @sc{head} of mainline @sc{cvs} (e.g., 6.1.50.20020302)
@item @var{major}.@var{minor}.90.@var{YYYY}@var{MM}@var{DD}
@itemx @var{major}.@var{minor}.91.@var{YYYY}@var{MM}@var{DD} @dots{}
drawn from a release branch prior to the release (e.g.,
6.1.90.20020304)
@item @var{major}.@var{minor}.0.@var{YYYY}@var{MM}@var{DD}
@itemx @var{major}.@var{minor}.1.@var{YYYY}@var{MM}@var{DD} @dots{}
drawn from a release branch after the release (e.g., 6.2.0.20020308)
@end table

If the previous @value{GDBN} version is 6.1 and the current version is
6.2, then, substituting 6 for @var{major} and 1 or 2 for @var{minor},
here's an illustration of a typical sequence:

@smallexample
     <HEAD>
        |
6.1.50.20020302-cvs
        |
        +--------------------------.
        |                    <gdb_6_2-branch>
        |                          |
6.2.50.20020303-cvs        6.1.90 (draft #1)
        |                          |
6.2.50.20020304-cvs        6.1.90.20020304-cvs
        |                          |
6.2.50.20020305-cvs        6.1.91 (draft #2)
        |                          |
6.2.50.20020306-cvs        6.1.91.20020306-cvs
        |                          |
6.2.50.20020307-cvs        6.2 (release)
        |                          |
6.2.50.20020308-cvs        6.2.0.20020308-cvs
        |                          |
6.2.50.20020309-cvs        6.2.1 (update)
        |                          |
6.2.50.20020310-cvs         <branch closed>
        |
6.2.50.20020311-cvs
        |
        +--------------------------.
        |                     <gdb_6_3-branch>
        |                          |
6.3.50.20020312-cvs        6.2.90 (draft #1)
        |                          |
@end smallexample

@section Release Branches
@cindex Release Branches

@value{GDBN} draws a release series (6.2, 6.2.1, @dots{}) from a
single release branch, and identifies that branch using the @sc{cvs}
branch tags:

@smallexample
gdb_@var{major}_@var{minor}-@var{YYYY}@var{MM}@var{DD}-branchpoint
gdb_@var{major}_@var{minor}-branch
gdb_@var{major}_@var{minor}-@var{YYYY}@var{MM}@var{DD}-release
@end smallexample

@emph{Pragmatics: To help identify the date at which a branch or
release is made, both the branchpoint and release tags include the
date that they are cut (@var{YYYY}@var{MM}@var{DD}) in the tag.  The
branch tag, denoting the head of the branch, does not need this.}

@section Vendor Branches
@cindex vendor branches

To avoid version conflicts, vendors are expected to modify the file
@file{gdb/version.in} to include a vendor unique alphabetic identifier
(an official @value{GDBN} release never uses alphabetic characters in
its version identifier).  E.g., @samp{6.2widgit2}, or @samp{6.2 (Widgit
Inc Patch 2)}.

@section Experimental Branches
@cindex experimental branches

@subsection Guidelines

@value{GDBN} permits the creation of branches, cut from the @sc{cvs}
repository, for experimental development.  Branches make it possible
for developers to share preliminary work, and maintainers to examine
significant new developments.

The following are a set of guidelines for creating such branches:

@table @emph

@item a branch has an owner
The owner can set further policy for a branch, but may not change the
ground rules.  In particular, they can set a policy for commits (be it
adding more reviewers or deciding who can commit).

@item all commits are posted
All changes committed to a branch shall also be posted to
@email{gdb-patches@@sourceware.org, the @value{GDBN} patches
mailing list}.  While commentary on such changes are encouraged, people
should remember that the changes only apply to a branch.

@item all commits are covered by an assignment
This ensures that all changes belong to the Free Software Foundation,
and avoids the possibility that the branch may become contaminated.

@item a branch is focused
A focused branch has a single objective or goal, and does not contain
unnecessary or irrelevant changes.  Cleanups, where identified, being
be pushed into the mainline as soon as possible.

@item a branch tracks mainline
This keeps the level of divergence under control.  It also keeps the
pressure on developers to push cleanups and other stuff into the
mainline.

@item a branch shall contain the entire @value{GDBN} module
The @value{GDBN} module @code{gdb} should be specified when creating a
branch (branches of individual files should be avoided).  @xref{Tags}.

@item a branch shall be branded using @file{version.in}
The file @file{gdb/version.in} shall be modified so that it identifies
the branch @var{owner} and branch @var{name}, e.g.,
@samp{6.2.50.20030303_owner_name} or @samp{6.2 (Owner Name)}.

@end table

@subsection Tags
@anchor{Tags}

To simplify the identification of @value{GDBN} branches, the following
branch tagging convention is strongly recommended:

@table @code

@item @var{owner}_@var{name}-@var{YYYYMMDD}-branchpoint
@itemx @var{owner}_@var{name}-@var{YYYYMMDD}-branch
The branch point and corresponding branch tag.  @var{YYYYMMDD} is the
date that the branch was created.  A branch is created using the
sequence: @anchor{experimental branch tags}
@smallexample
cvs rtag @var{owner}_@var{name}-@var{YYYYMMDD}-branchpoint gdb
cvs rtag -b -r @var{owner}_@var{name}-@var{YYYYMMDD}-branchpoint \
   @var{owner}_@var{name}-@var{YYYYMMDD}-branch gdb
@end smallexample

@item @var{owner}_@var{name}-@var{yyyymmdd}-mergepoint
The tagged point, on the mainline, that was used when merging the branch
on @var{yyyymmdd}.  To merge in all changes since the branch was cut,
use a command sequence like:
@smallexample
cvs rtag @var{owner}_@var{name}-@var{yyyymmdd}-mergepoint gdb
cvs update \
   -j@var{owner}_@var{name}-@var{YYYYMMDD}-branchpoint
   -j@var{owner}_@var{name}-@var{yyyymmdd}-mergepoint
@end smallexample
@noindent
Similar sequences can be used to just merge in changes since the last
merge.

@end table

@noindent
For further information on @sc{cvs}, see
@uref{http://www.gnu.org/software/cvs/, Concurrent Versions System}.
 
@node Start of New Year Procedure
@chapter Start of New Year Procedure
@cindex new year procedure

At the start of each new year, the following actions should be performed:

@itemize @bullet
@item
Rotate the ChangeLog file

The current @file{ChangeLog} file should be renamed into
@file{ChangeLog-YYYY} where YYYY is the year that has just passed.
A new @file{ChangeLog} file should be created, and its contents should
contain a reference to the previous ChangeLog.  The following should
also be preserved at the end of the new ChangeLog, in order to provide
the appropriate settings when editing this file with Emacs:
@smallexample
Local Variables:
mode: change-log
left-margin: 8
fill-column: 74
version-control: never
coding: utf-8
End:
@end smallexample

@item
Add an entry for the newly created ChangeLog file (@file{ChangeLog-YYYY})
in @file{gdb/config/djgpp/fnchange.lst}.

@item
Update the copyright year in the startup message

Update the copyright year in:
@itemize @bullet
  @item
  file @file{top.c}, function @code{print_gdb_version}
  @item
  file @file{gdbserver/server.c}, function @code{gdbserver_version}
  @item
  file @file{gdbserver/gdbreplay.c}, function @code{gdbreplay_version}
@end itemize

@item
Run the @file{copyright.sh} script to add the new year in the copyright
notices of most source files.  This script requires Emacs 22 or later to
be installed.

@item
The new year also needs to be added manually in all other files that
are not already taken care of by the @file{copyright.sh} script:
@itemize @bullet
  @item
  @file{*.s}
  @item
  @file{*.f}
  @item
  @file{*.f90}
  @item
  @file{*.igen}
  @item
  @file{*.ac}
  @item
  @file{*.texi}
  @item
  @file{*.texinfo}
  @item
  @file{*.tex}
  @item
  @file{*.defs}
  @item
  @file{*.1}
@end itemize

@end itemize

@node Releasing GDB

@chapter Releasing @value{GDBN}
@cindex making a new release of gdb

@section Branch Commit Policy

The branch commit policy is pretty slack.  @value{GDBN} releases 5.0,
5.1 and 5.2 all used the below:

@itemize @bullet
@item
The @file{gdb/MAINTAINERS} file still holds.
@item
Don't fix something on the branch unless/until it is also fixed in the
trunk.  If this isn't possible, mentioning it in the @file{gdb/PROBLEMS}
file is better than committing a hack.
@item
When considering a patch for the branch, suggested criteria include:
Does it fix a build?  Does it fix the sequence @kbd{break main; run}
when debugging a static binary?
@item
The further a change is from the core of @value{GDBN}, the less likely
the change will worry anyone (e.g., target specific code).
@item
Only post a proposal to change the core of @value{GDBN} after you've
sent individual bribes to all the people listed in the
@file{MAINTAINERS} file @t{;-)}
@end itemize

@emph{Pragmatics: Provided updates are restricted to non-core
functionality there is little chance that a broken change will be fatal.
This means that changes such as adding a new architectures or (within
reason) support for a new host are considered acceptable.}


@section Obsoleting code

Before anything else, poke the other developers (and around the source
code) to see if there is anything that can be removed from @value{GDBN}
(an old target, an unused file).

Obsolete code is identified by adding an @code{OBSOLETE} prefix to every
line.  Doing this means that it is easy to identify something that has
been obsoleted when greping through the sources.

The process is done in stages --- this is mainly to ensure that the
wider @value{GDBN} community has a reasonable opportunity to respond.
Remember, everything on the Internet takes a week.

@enumerate
@item
Post the proposal on @email{gdb@@sourceware.org, the GDB mailing
list} Creating a bug report to track the task's state, is also highly
recommended.
@item
Wait a week or so.
@item
Post the proposal on @email{gdb-announce@@sourceware.org, the GDB
Announcement mailing list}.
@item
Wait a week or so.
@item
Go through and edit all relevant files and lines so that they are
prefixed with the word @code{OBSOLETE}.
@item
Wait until the next GDB version, containing this obsolete code, has been
released.
@item
Remove the obsolete code.
@end enumerate

@noindent
@emph{Maintainer note: While removing old code is regrettable it is
hopefully better for @value{GDBN}'s long term development.  Firstly it
helps the developers by removing code that is either no longer relevant
or simply wrong.  Secondly since it removes any history associated with
the file (effectively clearing the slate) the developer has a much freer
hand when it comes to fixing broken files.}



@section Before the Branch

The most important objective at this stage is to find and fix simple
changes that become a pain to track once the branch is created.  For
instance, configuration problems that stop @value{GDBN} from even
building.  If you can't get the problem fixed, document it in the
@file{gdb/PROBLEMS} file.

@subheading Prompt for @file{gdb/NEWS}

People always forget.  Send a post reminding them but also if you know
something interesting happened add it yourself.  The @code{schedule}
script will mention this in its e-mail.

@subheading Review @file{gdb/README}

Grab one of the nightly snapshots and then walk through the
@file{gdb/README} looking for anything that can be improved.  The
@code{schedule} script will mention this in its e-mail.

@subheading Refresh any imported files.

A number of files are taken from external repositories.  They include:

@itemize @bullet
@item
@file{texinfo/texinfo.tex}
@item
@file{config.guess} et.@: al.@: (see the top-level @file{MAINTAINERS}
file)
@item
@file{etc/standards.texi}, @file{etc/make-stds.texi}
@end itemize

@subheading Check the ARI

@uref{http://sourceware.org/gdb/ari,,A.R.I.} is an @code{awk} script
(Awk Regression Index ;-) that checks for a number of errors and coding
conventions.  The checks include things like using @code{malloc} instead
of @code{xmalloc} and file naming problems.  There shouldn't be any
regressions.

@subsection Review the bug data base

Close anything obviously fixed.

@subsection Check all cross targets build

The targets are listed in @file{gdb/MAINTAINERS}.


@section Cut the Branch

@subheading Create the branch

@smallexample
$  u=5.1
$  v=5.2
$  V=`echo $v | sed 's/\./_/g'`
$  D=`date -u +%Y-%m-%d`
$  echo $u $V $D
5.1 5_2 2002-03-03
$  echo cvs -f -d :ext:sourceware.org:/cvs/src rtag \
-D $D-gmt gdb_$V-$D-branchpoint insight
cvs -f -d :ext:sourceware.org:/cvs/src rtag
-D 2002-03-03-gmt gdb_5_2-2002-03-03-branchpoint insight
$  ^echo ^^
...
$  echo cvs -f -d :ext:sourceware.org:/cvs/src rtag \
-b -r gdb_$V-$D-branchpoint gdb_$V-branch insight
cvs -f -d :ext:sourceware.org:/cvs/src rtag \
-b -r gdb_5_2-2002-03-03-branchpoint gdb_5_2-branch insight
$  ^echo ^^
...
$
@end smallexample

@itemize @bullet
@item
By using @kbd{-D YYYY-MM-DD-gmt}, the branch is forced to an exact
date/time.
@item
The trunk is first tagged so that the branch point can easily be found.
@item
Insight, which includes @value{GDBN}, is tagged at the same time.
@item
@file{version.in} gets bumped to avoid version number conflicts.
@item
The reading of @file{.cvsrc} is disabled using @file{-f}.
@end itemize

@subheading Update @file{version.in}

@smallexample
$  u=5.1
$  v=5.2
$  V=`echo $v | sed 's/\./_/g'`
$  echo $u $v$V
5.1 5_2
$  cd /tmp
$  echo cvs -f -d :ext:sourceware.org:/cvs/src co \
-r gdb_$V-branch src/gdb/version.in
cvs -f -d :ext:sourceware.org:/cvs/src co
 -r gdb_5_2-branch src/gdb/version.in
$  ^echo ^^
U src/gdb/version.in
$  cd src/gdb
$  echo $u.90-0000-00-00-cvs > version.in
$  cat version.in
5.1.90-0000-00-00-cvs
$  cvs -f commit version.in
@end smallexample

@itemize @bullet
@item
@file{0000-00-00} is used as a date to pump prime the version.in update
mechanism.
@item
@file{.90} and the previous branch version are used as fairly arbitrary
initial branch version number.
@end itemize


@subheading Update the web and news pages

Something?

@subheading Tweak cron to track the new branch

The file @file{gdbadmin/cron/crontab} contains gdbadmin's cron table.
This file needs to be updated so that:

@itemize @bullet
@item
A daily timestamp is added to the file @file{version.in}.
@item
The new branch is included in the snapshot process.
@end itemize

@noindent
See the file @file{gdbadmin/cron/README} for how to install the updated
cron table.

The file @file{gdbadmin/ss/README} should also be reviewed to reflect
any changes.  That file is copied to both the branch/ and current/
snapshot directories.


@subheading Update the NEWS and README files

The @file{NEWS} file needs to be updated so that on the branch it refers
to @emph{changes in the current release} while on the trunk it also
refers to @emph{changes since the current release}.

The @file{README} file needs to be updated so that it refers to the
current release.

@subheading Post the branch info

Send an announcement to the mailing lists:

@itemize @bullet
@item
@email{gdb-announce@@sourceware.org, GDB Announcement mailing list}
@item
@email{gdb@@sourceware.org, GDB Discussion mailing list} and
@email{gdb-testers@@sourceware.org, GDB Testers mailing list}
@end itemize

@emph{Pragmatics: The branch creation is sent to the announce list to
ensure that people people not subscribed to the higher volume discussion
list are alerted.}

The announcement should include:

@itemize @bullet
@item
The branch tag.
@item
How to check out the branch using CVS.
@item
The date/number of weeks until the release.
@item
The branch commit policy still holds.
@end itemize

@section Stabilize the branch

Something goes here.

@section Create a Release

The process of creating and then making available a release is broken
down into a number of stages.  The first part addresses the technical
process of creating a releasable tar ball.  The later stages address the
process of releasing that tar ball.

When making a release candidate just the first section is needed.

@subsection Create a release candidate

The objective at this stage is to create a set of tar balls that can be
made available as a formal release (or as a less formal release
candidate).

@subsubheading Freeze the branch

Send out an e-mail notifying everyone that the branch is frozen to
@email{gdb-patches@@sourceware.org}.

@subsubheading Establish a few defaults.

@smallexample
$  b=gdb_5_2-branch
$  v=5.2
$  t=/sourceware/snapshot-tmp/gdbadmin-tmp
$  echo $t/$b/$v
/sourceware/snapshot-tmp/gdbadmin-tmp/gdb_5_2-branch/5.2
$  mkdir -p $t/$b/$v
$  cd $t/$b/$v
$  pwd
/sourceware/snapshot-tmp/gdbadmin-tmp/gdb_5_2-branch/5.2
$  which autoconf
/home/gdbadmin/bin/autoconf
$
@end smallexample

@noindent
Notes:

@itemize @bullet
@item
Check the @code{autoconf} version carefully.  You want to be using the
version documented in the toplevel @file{README-maintainer-mode} file.
It is very unlikely that the version of @code{autoconf} installed in
system directories (e.g., @file{/usr/bin/autoconf}) is correct.
@end itemize

@subsubheading Check out the relevant modules:

@smallexample
$  for m in gdb insight
do
( mkdir -p $m && cd $m && cvs -q -f -d /cvs/src co -P -r $b $m )
done
$
@end smallexample

@noindent
Note:

@itemize @bullet
@item
The reading of @file{.cvsrc} is disabled (@file{-f}) so that there isn't
any confusion between what is written here and what your local
@code{cvs} really does.
@end itemize

@subsubheading Update relevant files.

@table @file

@item gdb/NEWS

Major releases get their comments added as part of the mainline.  Minor
releases should probably mention any significant bugs that were fixed.

Don't forget to include the @file{ChangeLog} entry.

@smallexample
$  emacs gdb/src/gdb/NEWS
...
c-x 4 a
...
c-x c-s c-x c-c
$  cp gdb/src/gdb/NEWS insight/src/gdb/NEWS 
$  cp gdb/src/gdb/ChangeLog insight/src/gdb/ChangeLog 
@end smallexample

@item gdb/README

You'll need to update:

@itemize @bullet
@item
The version.
@item
The update date.
@item
Who did it.
@end itemize

@smallexample
$  emacs gdb/src/gdb/README
...
c-x 4 a
...
c-x c-s c-x c-c
$  cp gdb/src/gdb/README insight/src/gdb/README 
$  cp gdb/src/gdb/ChangeLog insight/src/gdb/ChangeLog 
@end smallexample

@emph{Maintainer note: Hopefully the @file{README} file was reviewed
before the initial branch was cut so just a simple substitute is needed
to get it updated.}

@emph{Maintainer note: Other projects generate @file{README} and
@file{INSTALL} from the core documentation.  This might be worth
pursuing.}

@item gdb/version.in

@smallexample
$  echo $v > gdb/src/gdb/version.in
$  cat gdb/src/gdb/version.in
5.2
$  emacs gdb/src/gdb/version.in
...
c-x 4 a
... Bump to version ...
c-x c-s c-x c-c
$  cp gdb/src/gdb/version.in insight/src/gdb/version.in 
$  cp gdb/src/gdb/ChangeLog insight/src/gdb/ChangeLog 
@end smallexample

@end table

@subsubheading Do the dirty work

This is identical to the process used to create the daily snapshot.

@smallexample
$  for m in gdb insight
do
( cd $m/src && gmake -f src-release $m.tar )
done
@end smallexample

If the top level source directory does not have @file{src-release}
(@value{GDBN} version 5.3.1 or earlier), try these commands instead:

@smallexample
$  for m in gdb insight
do
( cd $m/src && gmake -f Makefile.in $m.tar )
done
@end smallexample

@subsubheading Check the source files

You're looking for files that have mysteriously disappeared.
@kbd{distclean} has the habit of deleting files it shouldn't.  Watch out
for the @file{version.in} update @kbd{cronjob}.

@smallexample
$  ( cd gdb/src && cvs -f -q -n update )
M djunpack.bat
? gdb-5.1.91.tar
? proto-toplev
@dots{} lots of generated files @dots{}
M gdb/ChangeLog
M gdb/NEWS
M gdb/README
M gdb/version.in
@dots{} lots of generated files @dots{}
$
@end smallexample

@noindent
@emph{Don't worry about the @file{gdb.info-??} or
@file{gdb/p-exp.tab.c}.  They were generated (and yes @file{gdb.info-1}
was also generated only something strange with CVS means that they
didn't get suppressed).  Fixing it would be nice though.}

@subsubheading Create compressed versions of the release

@smallexample
$  cp */src/*.tar .
$  cp */src/*.bz2 .
$  ls -F
gdb/ gdb-5.2.tar insight/ insight-5.2.tar
$  for m in gdb insight
do
bzip2 -v -9 -c $m-$v.tar > $m-$v.tar.bz2
gzip -v -9 -c $m-$v.tar > $m-$v.tar.gz
done
$
@end smallexample

@noindent
Note:

@itemize @bullet
@item
A pipe such as @kbd{bunzip2 < xxx.bz2 | gzip -9 > xxx.gz} is not since,
in that mode, @code{gzip} does not know the name of the file and, hence,
can not include it in the compressed file.  This is also why the release
process runs @code{tar} and @code{bzip2} as separate passes.
@end itemize

@subsection Sanity check the tar ball

Pick a popular machine (Solaris/PPC?) and try the build on that.

@smallexample
$  bunzip2 < gdb-5.2.tar.bz2 | tar xpf -
$  cd gdb-5.2
$  ./configure 
$  make
@dots{}
$  ./gdb/gdb ./gdb/gdb
GNU gdb 5.2
@dots{}
(gdb)  b main
Breakpoint 1 at 0x80732bc: file main.c, line 734.
(gdb)  run
Starting program: /tmp/gdb-5.2/gdb/gdb 

Breakpoint 1, main (argc=1, argv=0xbffff8b4) at main.c:734
734       catch_errors (captured_main, &args, "", RETURN_MASK_ALL);
(gdb)  print args
$1 = @{argc = 136426532, argv = 0x821b7f0@}
(gdb)
@end smallexample

@subsection Make a release candidate available

If this is a release candidate then the only remaining steps are:

@enumerate
@item
Commit @file{version.in} and @file{ChangeLog}
@item
Tweak @file{version.in} (and @file{ChangeLog} to read
@var{L}.@var{M}.@var{N}-0000-00-00-cvs so that the version update
process can restart.
@item
Make the release candidate available in
@uref{ftp://sourceware.org/pub/gdb/snapshots/branch}
@item
Notify the relevant mailing lists ( @email{gdb@@sourceware.org} and
@email{gdb-testers@@sourceware.org} that the candidate is available.
@end enumerate

@subsection Make a formal release available

(And you thought all that was required was to post an e-mail.)

@subsubheading Install on sware

Copy the new files to both the release and the old release directory:

@smallexample
$  cp *.bz2 *.gz ~ftp/pub/gdb/old-releases/
$  cp *.bz2 *.gz ~ftp/pub/gdb/releases
@end smallexample

@noindent
Clean up the releases directory so that only the most recent releases
are available (e.g.@: keep 5.2 and 5.2.1 but remove 5.1):

@smallexample
$  cd ~ftp/pub/gdb/releases
$  rm @dots{}
@end smallexample

@noindent
Update the file @file{README} and @file{.message} in the releases
directory:

@smallexample
$  vi README
@dots{}
$  rm -f .message
$  ln README .message
@end smallexample

@subsubheading Update the web pages.

@table @file

@item htdocs/download/ANNOUNCEMENT
This file, which is posted as the official announcement, includes:
@itemize @bullet
@item
General announcement.
@item
News.  If making an @var{M}.@var{N}.1 release, retain the news from
earlier @var{M}.@var{N} release.
@item
Errata.
@end itemize

@item htdocs/index.html
@itemx htdocs/news/index.html
@itemx htdocs/download/index.html
These files include:
@itemize @bullet
@item
Announcement of the most recent release.
@item
News entry (remember to update both the top level and the news directory).
@end itemize
These pages also need to be regenerate using @code{index.sh}.

@item download/onlinedocs/
You need to find the magic command that is used to generate the online
docs from the @file{.tar.bz2}.  The best way is to look in the output
from one of the nightly @code{cron} jobs and then just edit accordingly.
Something like:

@smallexample
$  ~/ss/update-web-docs \
 ~ftp/pub/gdb/releases/gdb-5.2.tar.bz2 \
 $PWD/www \
 /www/sourceware/htdocs/gdb/download/onlinedocs \
 gdb
@end smallexample

@item download/ari/
Just like the online documentation.  Something like:

@smallexample
$  /bin/sh ~/ss/update-web-ari \
 ~ftp/pub/gdb/releases/gdb-5.2.tar.bz2 \
 $PWD/www \
 /www/sourceware/htdocs/gdb/download/ari \
 gdb
@end smallexample

@end table

@subsubheading Shadow the pages onto gnu

Something goes here.


@subsubheading Install the @value{GDBN} tar ball on GNU

At the time of writing, the GNU machine was @kbd{gnudist.gnu.org} in
@file{~ftp/gnu/gdb}.

@subsubheading Make the @file{ANNOUNCEMENT}

Post the @file{ANNOUNCEMENT} file you created above to:

@itemize @bullet
@item
@email{gdb-announce@@sourceware.org, GDB Announcement mailing list}
@item
@email{info-gnu@@gnu.org, General GNU Announcement list} (but delay it a
day or so to let things get out)
@item
@email{bug-gdb@@gnu.org, GDB Bug Report mailing list}
@end itemize

@subsection Cleanup

The release is out but you're still not finished.

@subsubheading Commit outstanding changes

In particular you'll need to commit any changes to:

@itemize @bullet
@item
@file{gdb/ChangeLog}
@item
@file{gdb/version.in}
@item
@file{gdb/NEWS}
@item
@file{gdb/README}
@end itemize

@subsubheading Tag the release

Something like:

@smallexample
$  d=`date -u +%Y-%m-%d`
$  echo $d
2002-01-24
$  ( cd insight/src/gdb && cvs -f -q update )
$  ( cd insight/src && cvs -f -q tag gdb_5_2-$d-release )
@end smallexample

Insight is used since that contains more of the release than
@value{GDBN}.

@subsubheading Mention the release on the trunk

Just put something in the @file{ChangeLog} so that the trunk also
indicates when the release was made.

@subsubheading Restart @file{gdb/version.in}

If @file{gdb/version.in} does not contain an ISO date such as
@kbd{2002-01-24} then the daily @code{cronjob} won't update it.  Having
committed all the release changes it can be set to
@file{5.2.0_0000-00-00-cvs} which will restart things (yes the @kbd{_}
is important - it affects the snapshot process).

Don't forget the @file{ChangeLog}.

@subsubheading Merge into trunk

The files committed to the branch may also need changes merged into the
trunk.

@subsubheading Revise the release schedule

Post a revised release schedule to @email{gdb@@sourceware.org, GDB
Discussion List} with an updated announcement.  The schedule can be
generated by running:

@smallexample
$  ~/ss/schedule `date +%s` schedule
@end smallexample

@noindent
The first parameter is approximate date/time in seconds (from the epoch)
of the most recent release.

Also update the schedule @code{cronjob}.

@section Post release

Remove any @code{OBSOLETE} code.

@node Testsuite

@chapter Testsuite
@cindex test suite

The testsuite is an important component of the @value{GDBN} package.
While it is always worthwhile to encourage user testing, in practice
this is rarely sufficient; users typically use only a small subset of
the available commands, and it has proven all too common for a change
to cause a significant regression that went unnoticed for some time.

The @value{GDBN} testsuite uses the DejaGNU testing framework.  The
tests themselves are calls to various @code{Tcl} procs; the framework
runs all the procs and summarizes the passes and fails.

@section Using the Testsuite

@cindex running the test suite
To run the testsuite, simply go to the @value{GDBN} object directory (or to the
testsuite's objdir) and type @code{make check}.  This just sets up some
environment variables and invokes DejaGNU's @code{runtest} script.  While
the testsuite is running, you'll get mentions of which test file is in use,
and a mention of any unexpected passes or fails.  When the testsuite is
finished, you'll get a summary that looks like this:

@smallexample
                === gdb Summary ===

# of expected passes            6016
# of unexpected failures        58
# of unexpected successes       5
# of expected failures          183
# of unresolved testcases       3
# of untested testcases         5
@end smallexample

To run a specific test script, type:
@example
make check RUNTESTFLAGS='@var{tests}'
@end example
where @var{tests} is a list of test script file names, separated by
spaces.

If you use GNU make, you can use its @option{-j} option to run the
testsuite in parallel.  This can greatly reduce the amount of time it
takes for the testsuite to run.  In this case, if you set
@code{RUNTESTFLAGS} then, by default, the tests will be run serially
even under @option{-j}.  You can override this and force a parallel run
by setting the @code{make} variable @code{FORCE_PARALLEL} to any
non-empty value.  Note that the parallel @kbd{make check} assumes
that you want to run the entire testsuite, so it is not compatible
with some dejagnu options, like @option{--directory}.

The ideal test run consists of expected passes only; however, reality
conspires to keep us from this ideal.  Unexpected failures indicate
real problems, whether in @value{GDBN} or in the testsuite.  Expected
failures are still failures, but ones which have been decided are too
hard to deal with at the time; for instance, a test case might work
everywhere except on AIX, and there is no prospect of the AIX case
being fixed in the near future.  Expected failures should not be added
lightly, since you may be masking serious bugs in @value{GDBN}.
Unexpected successes are expected fails that are passing for some
reason, while unresolved and untested cases often indicate some minor
catastrophe, such as the compiler being unable to deal with a test
program.

When making any significant change to @value{GDBN}, you should run the
testsuite before and after the change, to confirm that there are no
regressions.  Note that truly complete testing would require that you
run the testsuite with all supported configurations and a variety of
compilers; however this is more than really necessary.  In many cases
testing with a single configuration is sufficient.  Other useful
options are to test one big-endian (Sparc) and one little-endian (x86)
host, a cross config with a builtin simulator (powerpc-eabi,
mips-elf), or a 64-bit host (Alpha).

If you add new functionality to @value{GDBN}, please consider adding
tests for it as well; this way future @value{GDBN} hackers can detect
and fix their changes that break the functionality you added.
Similarly, if you fix a bug that was not previously reported as a test
failure, please add a test case for it.  Some cases are extremely
difficult to test, such as code that handles host OS failures or bugs
in particular versions of compilers, and it's OK not to try to write
tests for all of those.

DejaGNU supports separate build, host, and target machines.  However,
some @value{GDBN} test scripts do not work if the build machine and
the host machine are not the same.  In such an environment, these scripts
will give a result of ``UNRESOLVED'', like this:

@smallexample
UNRESOLVED: gdb.base/example.exp: This test script does not work on a remote host.
@end smallexample

@section Testsuite Parameters

Several variables exist to modify the behavior of the testsuite.

@itemize @bullet

@item @code{TRANSCRIPT}

Sometimes it is convenient to get a transcript of the commands which
the testsuite sends to @value{GDBN}.  For example, if @value{GDBN}
crashes during testing, a transcript can be used to more easily
reconstruct the failure when running @value{GDBN} under @value{GDBN}.

You can instruct the @value{GDBN} testsuite to write transcripts by
setting the DejaGNU variable @code{TRANSCRIPT} (to any value)
before invoking @code{runtest} or @kbd{make check}.  The transcripts
will be written into DejaGNU's output directory.  One transcript will
be made for each invocation of @value{GDBN}; they will be named
@file{transcript.@var{n}}, where @var{n} is an integer.  The first
line of the transcript file will show how @value{GDBN} was invoked;
each subsequent line is a command sent as input to @value{GDBN}.

@smallexample
make check RUNTESTFLAGS=TRANSCRIPT=y
@end smallexample

Note that the transcript is not always complete.  In particular, tests
of completion can yield partial command lines.

@item @code{GDB}

Sometimes one wishes to test a different @value{GDBN} than the one in the build
directory.  For example, one may wish to run the testsuite on
@file{/usr/bin/gdb}.

@smallexample
make check RUNTESTFLAGS=GDB=/usr/bin/gdb
@end smallexample

@item @code{GDBSERVER}

When testing a different @value{GDBN}, it is often useful to also test a
different gdbserver.

@smallexample
make check RUNTESTFLAGS="GDB=/usr/bin/gdb GDBSERVER=/usr/bin/gdbserver"
@end smallexample

@item @code{INTERNAL_GDBFLAGS}

When running the testsuite normally one doesn't want whatever is in
@file{~/.gdbinit} to interfere with the tests, therefore the test harness
passes @option{-nx} to @value{GDBN}.  One also doesn't want any windowed
version of @value{GDBN}, e.g., @command{gdbtui}, to run.
This is achieved via @code{INTERNAL_GDBFLAGS}.  

@smallexample
set INTERNAL_GDBFLAGS "-nw -nx"
@end smallexample

This is all well and good, except when testing an installed @value{GDBN}
that has been configured with @option{--with-system-gdbinit}.  Here one
does not want @file{~/.gdbinit} loaded but one may want the system
@file{.gdbinit} file loaded.  This can be achieved by pointing @code{$HOME}
at a directory without a @file{.gdbinit} and by overriding
@code{INTERNAL_GDBFLAGS} and removing @option{-nx}.

@smallexample
cd testsuite
HOME=`pwd` runtest \
  GDB=/usr/bin/gdb \
  GDBSERVER=/usr/bin/gdbserver \
  INTERNAL_GDBFLAGS=-nw
@end smallexample

@end itemize

There are two ways to run the testsuite and pass additional parameters
to DejaGnu.  The first is with @kbd{make check} and specifying the
makefile variable @samp{RUNTESTFLAGS}.

@smallexample
make check RUNTESTFLAGS=TRANSCRIPT=y
@end smallexample

The second is to cd to the @file{testsuite} directory and invoke the DejaGnu
@command{runtest} command directly.

@smallexample
cd testsuite
make site.exp
runtest TRANSCRIPT=y
@end smallexample

@section Testsuite Configuration
@cindex Testsuite Configuration

It is possible to adjust the behavior of the testsuite by defining
the global variables listed below, either in a @file{site.exp} file,
or in a board file.

@itemize @bullet

@item @code{gdb_test_timeout}

Defining this variable changes the default timeout duration used during
communication with @value{GDBN}.  More specifically, the global variable
used during testing is @code{timeout}, but this variable gets reset to
@code{gdb_test_timeout} at the beginning of each testcase, making sure
that any local change to @code{timeout} in a testcase does not affect
subsequent testcases.

This global variable comes in handy when the debugger is slower than
normal due to the testing environment, triggering unexpected @code{TIMEOUT}
test failures.  Examples include when testing on a remote machine, or
against a system where communications are slow.

If not specifically defined, this variable gets automatically defined
to the same value as @code{timeout} during the testsuite initialization.
The default value of the timeout is defined in the file
@file{gdb/testsuite/config/unix.exp} that is part of the @value{GDBN}
test suite@footnote{If you are using a board file, it could override
the test-suite default; search the board file for "timeout".}.

@end itemize

@section Testsuite Organization

@cindex test suite organization
The testsuite is entirely contained in @file{gdb/testsuite}.  While the
testsuite includes some makefiles and configury, these are very minimal,
and used for little besides cleaning up, since the tests themselves
handle the compilation of the programs that @value{GDBN} will run.  The file
@file{testsuite/lib/gdb.exp} contains common utility procs useful for
all @value{GDBN} tests, while the directory @file{testsuite/config} contains
configuration-specific files, typically used for special-purpose
definitions of procs like @code{gdb_load} and @code{gdb_start}.

The tests themselves are to be found in @file{testsuite/gdb.*} and
subdirectories of those.  The names of the test files must always end
with @file{.exp}.  DejaGNU collects the test files by wildcarding
in the test directories, so both subdirectories and individual files
get chosen and run in alphabetical order.

The following table lists the main types of subdirectories and what they
are for.  Since DejaGNU finds test files no matter where they are
located, and since each test file sets up its own compilation and
execution environment, this organization is simply for convenience and
intelligibility.

@table @file
@item gdb.base
This is the base testsuite.  The tests in it should apply to all
configurations of @value{GDBN} (but generic native-only tests may live here).
The test programs should be in the subset of C that is valid K&R,
ANSI/ISO, and C@t{++} (@code{#ifdef}s are allowed if necessary, for instance
for prototypes).

@item gdb.@var{lang}
Language-specific tests for any language @var{lang} besides C.  Examples are
@file{gdb.cp} and @file{gdb.java}.

@item gdb.@var{platform}
Non-portable tests.  The tests are specific to a specific configuration
(host or target), such as HP-UX or eCos.  Example is @file{gdb.hp}, for
HP-UX.

@item gdb.@var{compiler}
Tests specific to a particular compiler.  As of this writing (June
1999), there aren't currently any groups of tests in this category that
couldn't just as sensibly be made platform-specific, but one could
imagine a @file{gdb.gcc}, for tests of @value{GDBN}'s handling of GCC
extensions.

@item gdb.@var{subsystem}
Tests that exercise a specific @value{GDBN} subsystem in more depth.  For
instance, @file{gdb.disasm} exercises various disassemblers, while
@file{gdb.stabs} tests pathways through the stabs symbol reader.
@end table

@section Writing Tests
@cindex writing tests

In many areas, the @value{GDBN} tests are already quite comprehensive; you
should be able to copy existing tests to handle new cases.

You should try to use @code{gdb_test} whenever possible, since it
includes cases to handle all the unexpected errors that might happen.
However, it doesn't cost anything to add new test procedures; for
instance, @file{gdb.base/exprs.exp} defines a @code{test_expr} that
calls @code{gdb_test} multiple times.

Only use @code{send_gdb} and @code{gdb_expect} when absolutely
necessary.  Even if @value{GDBN} has several valid responses to
a command, you can use @code{gdb_test_multiple}.  Like @code{gdb_test},
@code{gdb_test_multiple} recognizes internal errors and unexpected
prompts.

Do not write tests which expect a literal tab character from @value{GDBN}.
On some operating systems (e.g.@: OpenBSD) the TTY layer expands tabs to
spaces, so by the time @value{GDBN}'s output reaches expect the tab is gone.

The source language programs do @emph{not} need to be in a consistent
style.  Since @value{GDBN} is used to debug programs written in many different
styles, it's worth having a mix of styles in the testsuite; for
instance, some @value{GDBN} bugs involving the display of source lines would
never manifest themselves if the programs used GNU coding style
uniformly.

@node Hints

@chapter Hints

Check the @file{README} file, it often has useful information that does not
appear anywhere else in the directory.

@menu
* Getting Started::		Getting started working on @value{GDBN}
* Debugging GDB::		Debugging @value{GDBN} with itself
@end menu

@node Getting Started

@section Getting Started

@value{GDBN} is a large and complicated program, and if you first starting to
work on it, it can be hard to know where to start.  Fortunately, if you
know how to go about it, there are ways to figure out what is going on.

This manual, the @value{GDBN} Internals manual, has information which applies
generally to many parts of @value{GDBN}.

Information about particular functions or data structures are located in
comments with those functions or data structures.  If you run across a
function or a global variable which does not have a comment correctly
explaining what is does, this can be thought of as a bug in @value{GDBN}; feel
free to submit a bug report, with a suggested comment if you can figure
out what the comment should say.  If you find a comment which is
actually wrong, be especially sure to report that.

Comments explaining the function of macros defined in host, target, or
native dependent files can be in several places.  Sometimes they are
repeated every place the macro is defined.  Sometimes they are where the
macro is used.  Sometimes there is a header file which supplies a
default definition of the macro, and the comment is there.  This manual
also documents all the available macros.
@c (@pxref{Host Conditionals}, @pxref{Target
@c Conditionals}, @pxref{Native Conditionals}, and @pxref{Obsolete
@c Conditionals})

Start with the header files.  Once you have some idea of how
@value{GDBN}'s internal symbol tables are stored (see @file{symtab.h},
@file{gdbtypes.h}), you will find it much easier to understand the
code which uses and creates those symbol tables.

You may wish to process the information you are getting somehow, to
enhance your understanding of it.  Summarize it, translate it to another
language, add some (perhaps trivial or non-useful) feature to @value{GDBN}, use
the code to predict what a test case would do and write the test case
and verify your prediction, etc.  If you are reading code and your eyes
are starting to glaze over, this is a sign you need to use a more active
approach.

Once you have a part of @value{GDBN} to start with, you can find more
specifically the part you are looking for by stepping through each
function with the @code{next} command.  Do not use @code{step} or you
will quickly get distracted; when the function you are stepping through
calls another function try only to get a big-picture understanding
(perhaps using the comment at the beginning of the function being
called) of what it does.  This way you can identify which of the
functions being called by the function you are stepping through is the
one which you are interested in.  You may need to examine the data
structures generated at each stage, with reference to the comments in
the header files explaining what the data structures are supposed to
look like.

Of course, this same technique can be used if you are just reading the
code, rather than actually stepping through it.  The same general
principle applies---when the code you are looking at calls something
else, just try to understand generally what the code being called does,
rather than worrying about all its details.

@cindex command implementation
A good place to start when tracking down some particular area is with
a command which invokes that feature.  Suppose you want to know how
single-stepping works.  As a @value{GDBN} user, you know that the
@code{step} command invokes single-stepping.  The command is invoked
via command tables (see @file{command.h}); by convention the function
which actually performs the command is formed by taking the name of
the command and adding @samp{_command}, or in the case of an
@code{info} subcommand, @samp{_info}.  For example, the @code{step}
command invokes the @code{step_command} function and the @code{info
display} command invokes @code{display_info}.  When this convention is
not followed, you might have to use @code{grep} or @kbd{M-x
tags-search} in emacs, or run @value{GDBN} on itself and set a
breakpoint in @code{execute_command}.

@cindex @code{bug-gdb} mailing list
If all of the above fail, it may be appropriate to ask for information
on @code{bug-gdb}.  But @emph{never} post a generic question like ``I was
wondering if anyone could give me some tips about understanding
@value{GDBN}''---if we had some magic secret we would put it in this manual.
Suggestions for improving the manual are always welcome, of course.

@node Debugging GDB

@section Debugging @value{GDBN} with itself
@cindex debugging @value{GDBN}

If @value{GDBN} is limping on your machine, this is the preferred way to get it
fully functional.  Be warned that in some ancient Unix systems, like
Ultrix 4.2, a program can't be running in one process while it is being
debugged in another.  Rather than typing the command @kbd{@w{./gdb
./gdb}}, which works on Suns and such, you can copy @file{gdb} to
@file{gdb2} and then type @kbd{@w{./gdb ./gdb2}}.

When you run @value{GDBN} in the @value{GDBN} source directory, it will read a
@file{.gdbinit} file that sets up some simple things to make debugging
gdb easier.  The @code{info} command, when executed without a subcommand
in a @value{GDBN} being debugged by gdb, will pop you back up to the top level
gdb.  See @file{.gdbinit} for details.

If you use emacs, you will probably want to do a @code{make TAGS} after
you configure your distribution; this will put the machine dependent
routines for your local machine where they will be accessed first by
@kbd{M-.}

Also, make sure that you've either compiled @value{GDBN} with your local cc, or
have run @code{fixincludes} if you are compiling with gcc.

@section Submitting Patches

@cindex submitting patches
Thanks for thinking of offering your changes back to the community of
@value{GDBN} users.  In general we like to get well designed enhancements.
Thanks also for checking in advance about the best way to transfer the
changes.

The @value{GDBN} maintainers will only install ``cleanly designed'' patches.
This manual summarizes what we believe to be clean design for @value{GDBN}.

If the maintainers don't have time to put the patch in when it arrives,
or if there is any question about a patch, it goes into a large queue
with everyone else's patches and bug reports.

@cindex legal papers for code contributions
The legal issue is that to incorporate substantial changes requires a
copyright assignment from you and/or your employer, granting ownership
of the changes to the Free Software Foundation.  You can get the
standard documents for doing this by sending mail to @code{gnu@@gnu.org}
and asking for it.  We recommend that people write in "All programs
owned by the Free Software Foundation" as "NAME OF PROGRAM", so that
changes in many programs (not just @value{GDBN}, but GAS, Emacs, GCC,
etc) can be
contributed with only one piece of legalese pushed through the
bureaucracy and filed with the FSF.  We can't start merging changes until
this paperwork is received by the FSF (their rules, which we follow
since we maintain it for them).

Technically, the easiest way to receive changes is to receive each
feature as a small context diff or unidiff, suitable for @code{patch}.
Each message sent to me should include the changes to C code and
header files for a single feature, plus @file{ChangeLog} entries for
each directory where files were modified, and diffs for any changes
needed to the manuals (@file{gdb/doc/gdb.texinfo} or
@file{gdb/doc/gdbint.texinfo}).  If there are a lot of changes for a
single feature, they can be split down into multiple messages.

In this way, if we read and like the feature, we can add it to the
sources with a single patch command, do some testing, and check it in.
If you leave out the @file{ChangeLog}, we have to write one.  If you leave
out the doc, we have to puzzle out what needs documenting.  Etc., etc.

The reason to send each change in a separate message is that we will not
install some of the changes.  They'll be returned to you with questions
or comments.  If we're doing our job correctly, the message back to you
will say what you have to fix in order to make the change acceptable.
The reason to have separate messages for separate features is so that
the acceptable changes can be installed while one or more changes are
being reworked.  If multiple features are sent in a single message, we
tend to not put in the effort to sort out the acceptable changes from
the unacceptable, so none of the features get installed until all are
acceptable.

If this sounds painful or authoritarian, well, it is.  But we get a lot
of bug reports and a lot of patches, and many of them don't get
installed because we don't have the time to finish the job that the bug
reporter or the contributor could have done.  Patches that arrive
complete, working, and well designed, tend to get installed on the day
they arrive.  The others go into a queue and get installed as time
permits, which, since the maintainers have many demands to meet, may not
be for quite some time.

Please send patches directly to
@email{gdb-patches@@sourceware.org, the @value{GDBN} maintainers}.

@section Build Script

@cindex build script

The script @file{gdb_buildall.sh} builds @value{GDBN} with flag
@option{--enable-targets=all} set.  This builds @value{GDBN} with all supported
targets activated.  This helps testing @value{GDBN} when doing changes that
affect more than one architecture and is much faster than using
@file{gdb_mbuild.sh}.

After building @value{GDBN} the script checks which architectures are
supported and then switches the current architecture to each of those to get
information about the architecture.  The test results are stored in log files
in the directory the script was called from.

@include observer.texi

@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include fdl.texi

@node Index
@unnumbered Index

@printindex cp

@bye
