@c Copyright (C) 2008-2020 Free Software Foundation, Inc.
@c Permission is granted to copy, distribute and/or modify this document
@c under the terms of the GNU Free Documentation License, Version 1.3 or
@c any later version published by the Free Software Foundation; with the
@c Invariant Sections being ``Free Software'' and ``Free Software Needs
@c Free Documentation'', with the Front-Cover Texts being ``A GNU Manual,''
@c and with the Back-Cover Texts as in (a) below.
@c 
@c (a) The FSF's Back-Cover Text is: ``You are free to copy and modify
@c this GNU Manual.  Buying copies from GNU Press supports the FSF in
@c developing GNU and promoting software freedom.''

@node Guile
@section Extending @value{GDBN} using Guile
@cindex guile scripting
@cindex scripting with guile

You can extend @value{GDBN} using the @uref{http://www.gnu.org/software/guile/,
Guile implementation of the Scheme programming language}.
This feature is available only if @value{GDBN} was configured using
@option{--with-guile}.

@menu
* Guile Introduction::     Introduction to Guile scripting in @value{GDBN}
* Guile Commands::         Accessing Guile from @value{GDBN}
* Guile API::              Accessing @value{GDBN} from Guile
* Guile Auto-loading::     Automatically loading Guile code
* Guile Modules::          Guile modules provided by @value{GDBN}
@end menu

@node Guile Introduction
@subsection Guile Introduction

Guile is an implementation of the Scheme programming language
and is the GNU project's official extension language.

Guile support in @value{GDBN} follows the Python support in @value{GDBN}
reasonably closely, so concepts there should carry over.
However, some things are done differently where it makes sense.

@value{GDBN} requires Guile version 2.0 or greater.
Older versions are not supported.

@cindex guile scripts directory
Guile scripts used by @value{GDBN} should be installed in
@file{@var{data-directory}/guile}, where @var{data-directory} is
the data directory as determined at @value{GDBN} startup (@pxref{Data Files}).
This directory, known as the @dfn{guile directory},
is automatically added to the Guile Search Path in order to allow
the Guile interpreter to locate all scripts installed at this location.

@node Guile Commands
@subsection Guile Commands
@cindex guile commands
@cindex commands to access guile

@value{GDBN} provides two commands for accessing the Guile interpreter:

@table @code
@kindex guile-repl
@kindex gr
@item guile-repl
@itemx gr
The @code{guile-repl} command can be used to start an interactive
Guile prompt or @dfn{repl}.  To return to @value{GDBN},
type @kbd{,q} or the @code{EOF} character (e.g., @kbd{Ctrl-D} on
an empty prompt).  These commands do not take any arguments.

@kindex guile
@kindex gu
@item guile @r{[}@var{scheme-expression}@r{]}
@itemx gu @r{[}@var{scheme-expression}@r{]}
The @code{guile} command can be used to evaluate a Scheme expression.

If given an argument, @value{GDBN} will pass the argument to the Guile
interpreter for evaluation.

@smallexample
(@value{GDBP}) guile (display (+ 20 3)) (newline)
23
@end smallexample

The result of the Scheme expression is displayed using normal Guile rules.

@smallexample
(@value{GDBP}) guile (+ 20 3)
23
@end smallexample

If you do not provide an argument to @code{guile}, it will act as a
multi-line command, like @code{define}.  In this case, the Guile
script is made up of subsequent command lines, given after the
@code{guile} command.  This command list is terminated using a line
containing @code{end}.  For example:

@smallexample
(@value{GDBP}) guile
>(display 23)
>(newline)
>end
23
@end smallexample
@end table

It is also possible to execute a Guile script from the @value{GDBN}
interpreter:

@table @code
@item source @file{script-name}
The script name must end with @samp{.scm} and @value{GDBN} must be configured
to recognize the script language based on filename extension using
the @code{script-extension} setting.  @xref{Extending GDB, ,Extending GDB}.

@item guile (load "script-name")
This method uses the @code{load} Guile function.
It takes a string argument that is the name of the script to load.
See the Guile documentation for a description of this function.
(@pxref{Loading,,, guile, GNU Guile Reference Manual}).
@end table

@node Guile API
@subsection Guile API
@cindex guile api
@cindex programming in guile

You can get quick online help for @value{GDBN}'s Guile API by issuing
the command @w{@kbd{help guile}}, or by issuing the command @kbd{,help}
from an interactive Guile session.  Furthermore, most Guile procedures
provided by @value{GDBN} have doc strings which can be obtained with
@kbd{,describe @var{procedure-name}} or @kbd{,d @var{procedure-name}}
from the Guile interactive prompt.

@menu
* Basic Guile::              Basic Guile Functions
* Guile Configuration::      Guile configuration variables
* GDB Scheme Data Types::    Scheme representations of GDB objects
* Guile Exception Handling:: How Guile exceptions are translated
* Values From Inferior In Guile:: Guile representation of values
* Arithmetic In Guile::      Arithmetic in Guile
* Types In Guile::           Guile representation of types
* Guile Pretty Printing API:: Pretty-printing values with Guile
* Selecting Guile Pretty-Printers:: How GDB chooses a pretty-printer
* Writing a Guile Pretty-Printer:: Writing a pretty-printer
* Commands In Guile::        Implementing new commands in Guile
* Parameters In Guile::      Adding new @value{GDBN} parameters
* Progspaces In Guile::      Program spaces
* Objfiles In Guile::        Object files in Guile
* Frames In Guile::          Accessing inferior stack frames from Guile
* Blocks In Guile::          Accessing blocks from Guile
* Symbols In Guile::         Guile representation of symbols
* Symbol Tables In Guile::   Guile representation of symbol tables
* Breakpoints In Guile::     Manipulating breakpoints using Guile
* Lazy Strings In Guile::    Guile representation of lazy strings
* Architectures In Guile::   Guile representation of architectures
* Disassembly In Guile::     Disassembling instructions from Guile
* I/O Ports in Guile::       GDB I/O ports
* Memory Ports in Guile::    Accessing memory through ports and bytevectors
* Iterators In Guile::       Basic iterator support
@end menu

@node Basic Guile
@subsubsection Basic Guile

@cindex guile stdout
@cindex guile pagination
At startup, @value{GDBN} overrides Guile's @code{current-output-port} and
@code{current-error-port} to print using @value{GDBN}'s output-paging streams.
A Guile program which outputs to one of these streams may have its
output interrupted by the user (@pxref{Screen Size}).  In this
situation, a Guile @code{signal} exception is thrown with value @code{SIGINT}.

Guile's history mechanism uses the same naming as @value{GDBN}'s,
namely the user of dollar-variables (e.g., $1, $2, etc.).
The results of evaluations in Guile and in GDB are counted separately,
@code{$1} in Guile is not the same value as @code{$1} in @value{GDBN}.

@value{GDBN} is not thread-safe.  If your Guile program uses multiple
threads, you must be careful to only call @value{GDBN}-specific
functions in the @value{GDBN} thread.

Some care must be taken when writing Guile code to run in
@value{GDBN}.  Two things are worth noting in particular:

@itemize @bullet
@item
@value{GDBN} installs handlers for @code{SIGCHLD} and @code{SIGINT}.
Guile code must not override these, or even change the options using
@code{sigaction}.  If your program changes the handling of these
signals, @value{GDBN} will most likely stop working correctly.  Note
that it is unfortunately common for GUI toolkits to install a
@code{SIGCHLD} handler.

@item
@value{GDBN} takes care to mark its internal file descriptors as
close-on-exec.  However, this cannot be done in a thread-safe way on
all platforms.  Your Guile programs should be aware of this and
should both create new file descriptors with the close-on-exec flag
set and arrange to close unneeded file descriptors before starting a
child process.
@end itemize

@cindex guile gdb module
@value{GDBN} introduces a new Guile module, named @code{gdb}.  All
methods and classes added by @value{GDBN} are placed in this module.
@value{GDBN} does not automatically @code{import} the @code{gdb} module,
scripts must do this themselves.  There are various options for how to
import a module, so @value{GDBN} leaves the choice of how the @code{gdb}
module is imported to the user.
To simplify interactive use, it is recommended to add one of the following
to your ~/.gdbinit.

@smallexample
guile (use-modules (gdb))
@end smallexample

@smallexample
guile (use-modules ((gdb) #:renamer (symbol-prefix-proc 'gdb:)))
@end smallexample

Which one to choose depends on your preference.
The second one adds @code{gdb:} as a prefix to all module functions
and variables.

The rest of this manual assumes the @code{gdb} module has been imported
without any prefix.  See the Guile documentation for @code{use-modules}
for more information
(@pxref{Using Guile Modules,,, guile, GNU Guile Reference Manual}).

Example:

@smallexample
(gdb) guile (value-type (make-value 1))
ERROR: Unbound variable: value-type
Error while executing Scheme code.
(gdb) guile (use-modules (gdb))
(gdb) guile (value-type (make-value 1))
int
(gdb)
@end smallexample

The @code{(gdb)} module provides these basic Guile functions.

@c TODO: line length 
@deffn {Scheme Procedure} execute command @r{[}#:from-tty boolean@r{]} @r{[}#:to-string boolean@r{]}
Evaluate @var{command}, a string, as a @value{GDBN} CLI command.
If a @value{GDBN} exception happens while @var{command} runs, it is
translated as described in
@ref{Guile Exception Handling,,Guile Exception Handling}.

@var{from-tty} specifies whether @value{GDBN} ought to consider this
command as having originated from the user invoking it interactively.
It must be a boolean value.  If omitted, it defaults to @code{#f}.

By default, any output produced by @var{command} is sent to
@value{GDBN}'s standard output (and to the log output if logging is
turned on).  If the @var{to-string} parameter is
@code{#t}, then output will be collected by @code{execute} and
returned as a string.  The default is @code{#f}, in which case the
return value is unspecified.  If @var{to-string} is @code{#t}, the
@value{GDBN} virtual terminal will be temporarily set to unlimited width
and height, and its pagination will be disabled; @pxref{Screen Size}.
@end deffn

@deffn {Scheme Procedure} history-ref number
Return a value from @value{GDBN}'s value history (@pxref{Value
History}).  The @var{number} argument indicates which history element to return.
If @var{number} is negative, then @value{GDBN} will take its absolute value
and count backward from the last element (i.e., the most recent element) to
find the value to return.  If @var{number} is zero, then @value{GDBN} will
return the most recent element.  If the element specified by @var{number}
doesn't exist in the value history, a @code{gdb:error} exception will be
raised.

If no exception is raised, the return value is always an instance of
@code{<gdb:value>} (@pxref{Values From Inferior In Guile}).

@emph{Note:} @value{GDBN}'s value history is independent of Guile's.
@code{$1} in @value{GDBN}'s value history contains the result of evaluating
an expression from @value{GDBN}'s command line and @code{$1} from Guile's
history contains the result of evaluating an expression from Guile's
command line.
@end deffn

@deffn {Scheme Procedure} history-append! value
Append @var{value}, an instance of @code{<gdb:value>}, to @value{GDBN}'s
value history.  Return its index in the history.

Putting into history values returned by Guile extensions will allow
the user convenient access to those values via CLI history
facilities.
@end deffn

@deffn {Scheme Procedure} parse-and-eval expression
Parse @var{expression} as an expression in the current language,
evaluate it, and return the result as a @code{<gdb:value>}.
The @var{expression} must be a string.

This function can be useful when implementing a new command
(@pxref{Commands In Guile}), as it provides a way to parse the
command's arguments as an expression.
It is also is useful when computing values.
For example, it is the only way to get the value of a
convenience variable (@pxref{Convenience Vars}) as a @code{<gdb:value>}.
@end deffn

@node Guile Configuration
@subsubsection Guile Configuration
@cindex guile configuration

@value{GDBN} provides these Scheme functions to access various configuration
parameters.

@deffn {Scheme Procedure} data-directory
Return a string containing @value{GDBN}'s data directory.
This directory contains @value{GDBN}'s ancillary files.
@end deffn

@deffn {Scheme Procedure} guile-data-directory
Return a string containing @value{GDBN}'s Guile data directory.
This directory contains the Guile modules provided by @value{GDBN}.
@end deffn

@deffn {Scheme Procedure} gdb-version
Return a string containing the @value{GDBN} version.
@end deffn

@deffn {Scheme Procedure} host-config
Return a string containing the host configuration.
This is the string passed to @code{--host} when @value{GDBN} was configured.
@end deffn

@deffn {Scheme Procedure} target-config
Return a string containing the target configuration.
This is the string passed to @code{--target} when @value{GDBN} was configured.
@end deffn

@node GDB Scheme Data Types
@subsubsection GDB Scheme Data Types
@cindex gdb objects

The values exposed by @value{GDBN} to Guile are known as
@dfn{@value{GDBN} objects}.  There are several kinds of @value{GDBN}
object, and each is disjoint from all other types known to Guile.

@deffn {Scheme Procedure} gdb-object-kind object
Return the kind of the @value{GDBN} object, e.g., @code{<gdb:breakpoint>},
as a symbol.
@end deffn

@value{GDBN} defines the following object types:

@table @code
@item <gdb:arch>
@xref{Architectures In Guile}.

@item <gdb:block>
@xref{Blocks In Guile}.

@item <gdb:block-symbols-iterator>
@xref{Blocks In Guile}.

@item <gdb:breakpoint>
@xref{Breakpoints In Guile}.

@item <gdb:command>
@xref{Commands In Guile}.

@item <gdb:exception>
@xref{Guile Exception Handling}.

@item <gdb:frame>
@xref{Frames In Guile}.

@item <gdb:iterator>
@xref{Iterators In Guile}.

@item <gdb:lazy-string>
@xref{Lazy Strings In Guile}.

@item <gdb:objfile>
@xref{Objfiles In Guile}.

@item <gdb:parameter>
@xref{Parameters In Guile}.

@item <gdb:pretty-printer>
@xref{Guile Pretty Printing API}.

@item <gdb:pretty-printer-worker>
@xref{Guile Pretty Printing API}.

@item <gdb:progspace>
@xref{Progspaces In Guile}.

@item <gdb:symbol>
@xref{Symbols In Guile}.

@item <gdb:symtab>
@xref{Symbol Tables In Guile}.

@item <gdb:sal>
@xref{Symbol Tables In Guile}.

@item <gdb:type>
@xref{Types In Guile}.

@item <gdb:field>
@xref{Types In Guile}.

@item <gdb:value>
@xref{Values From Inferior In Guile}.
@end table

The following @value{GDBN} objects are managed internally so that the
Scheme function @code{eq?} may be applied to them.

@table @code
@item <gdb:arch>
@item <gdb:block>
@item <gdb:breakpoint>
@item <gdb:frame>
@item <gdb:objfile>
@item <gdb:progspace>
@item <gdb:symbol>
@item <gdb:symtab>
@item <gdb:type>
@end table

@node Guile Exception Handling
@subsubsection Guile Exception Handling
@cindex guile exceptions
@cindex exceptions, guile
@kindex set guile print-stack

When executing the @code{guile} command, Guile exceptions
uncaught within the Guile code are translated to calls to the
@value{GDBN} error-reporting mechanism.  If the command that called
@code{guile} does not handle the error, @value{GDBN} will
terminate it and report the error according to the setting of
the @code{guile print-stack} parameter.

The @code{guile print-stack} parameter has three settings:

@table @code
@item none
Nothing is printed.

@item message
An error message is printed containing the Guile exception name,
the associated value, and the Guile call stack backtrace at the
point where the exception was raised.  Example:

@smallexample
(@value{GDBP}) guile (display foo)
ERROR: In procedure memoize-variable-access!:
ERROR: Unbound variable: foo
Error while executing Scheme code.
@end smallexample

@item full
In addition to an error message a full backtrace is printed.

@smallexample
(@value{GDBP}) set guile print-stack full
(@value{GDBP}) guile (display foo)
Guile Backtrace:
In ice-9/boot-9.scm:
 157: 10 [catch #t #<catch-closure 2c76e20> ...]
In unknown file:
   ?: 9 [apply-smob/1 #<catch-closure 2c76e20>]
In ice-9/boot-9.scm:
 157: 8 [catch #t #<catch-closure 2c76d20> ...]
In unknown file:
   ?: 7 [apply-smob/1 #<catch-closure 2c76d20>]
   ?: 6 [call-with-input-string "(display foo)" ...]
In ice-9/boot-9.scm:
2320: 5 [save-module-excursion #<procedure 2c2dc30 ... ()>]
In ice-9/eval-string.scm:
  44: 4 [read-and-eval #<input: string 27cb410> #:lang ...]
  37: 3 [lp (display foo)]
In ice-9/eval.scm:
 387: 2 [eval # ()]
 393: 1 [eval #<memoized foo> ()]
In unknown file:
   ?: 0 [memoize-variable-access! #<memoized foo> ...]

ERROR: In procedure memoize-variable-access!:
ERROR: Unbound variable: foo
Error while executing Scheme code.
@end smallexample
@end table

@value{GDBN} errors that happen in @value{GDBN} commands invoked by
Guile code are converted to Guile exceptions.  The type of the
Guile exception depends on the error.

Guile procedures provided by @value{GDBN} can throw the standard
Guile exceptions like @code{wrong-type-arg} and @code{out-of-range}.

User interrupt (via @kbd{C-c} or by typing @kbd{q} at a pagination
prompt) is translated to a Guile @code{signal} exception with value
@code{SIGINT}.

@value{GDBN} Guile procedures can also throw these exceptions:

@vtable @code
@item gdb:error
This exception is a catch-all for errors generated from within @value{GDBN}.

@item gdb:invalid-object
This exception is thrown when accessing Guile objects that wrap underlying
@value{GDBN} objects have become invalid.  For example, a
@code{<gdb:breakpoint>} object becomes invalid if the user deletes it
from the command line.  The object still exists in Guile, but the
object it represents is gone.  Further operations on this breakpoint
will throw this exception.

@item gdb:memory-error
This exception is thrown when an operation tried to access invalid
memory in the inferior.

@item gdb:pp-type-error
This exception is thrown when a Guile pretty-printer passes a bad object
to @value{GDBN}.
@end vtable

The following exception-related procedures are provided by the
@code{(gdb)} module.

@deffn {Scheme Procedure} make-exception key args
Return a @code{<gdb:exception>} object given by its @var{key} and
@var{args}, which are the standard Guile parameters of an exception.
See the Guile documentation for more information (@pxref{Exceptions,,,
guile, GNU Guile Reference Manual}).
@end deffn

@deffn {Scheme Procedure} exception? object
Return @code{#t} if @var{object} is a @code{<gdb:exception>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} exception-key exception
Return the @var{args} field of a @code{<gdb:exception>} object.
@end deffn

@deffn {Scheme Procedure} exception-args exception
Return the @var{args} field of a @code{<gdb:exception>} object.
@end deffn

@node Values From Inferior In Guile
@subsubsection Values From Inferior In Guile
@cindex values from inferior, in guile
@cindex guile, working with values from inferior

@tindex @code{<gdb:value>}
@value{GDBN} provides values it obtains from the inferior program in
an object of type @code{<gdb:value>}.  @value{GDBN} uses this object
for its internal bookkeeping of the inferior's values, and for
fetching values when necessary.

@value{GDBN} does not memoize @code{<gdb:value>} objects.
@code{make-value} always returns a fresh object.

@smallexample
(gdb) guile (eq? (make-value 1) (make-value 1))
$1 = #f
(gdb) guile (equal? (make-value 1) (make-value 1))
$1 = #t
@end smallexample

A @code{<gdb:value>} that represents a function can be executed via
inferior function call with @code{value-call}.
Any arguments provided to the call must match the function's prototype,
and must be provided in the order specified by that prototype.

For example, @code{some-val} is a @code{<gdb:value>} instance
representing a function that takes two integers as arguments.  To
execute this function, call it like so:

@smallexample
(define result (value-call some-val 10 20))
@end smallexample

Any values returned from a function call are @code{<gdb:value>} objects.

Note: Unlike Python scripting in @value{GDBN},
inferior values that are simple scalars cannot be used directly in
Scheme expressions that are valid for the value's data type.
For example, @code{(+ (parse-and-eval "int_variable") 2)} does not work.
And inferior values that are structures or instances of some class cannot
be accessed using any special syntax, instead @code{value-field} must be used.

The following value-related procedures are provided by the
@code{(gdb)} module.

@deffn {Scheme Procedure} value? object
Return @code{#t} if @var{object} is a @code{<gdb:value>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} make-value value @r{[}#:type type@r{]}
Many Scheme values can be converted directly to a @code{<gdb:value>}
with this procedure.  If @var{type} is specified, the result is a value
of this type, and if @var{value} can't be represented with this type
an exception is thrown.  Otherwise the type of the result is determined from
@var{value} as described below.

@xref{Architectures In Guile}, for a list of the builtin
types for an architecture.

Here's how Scheme values are converted when @var{type} argument to
@code{make-value} is not specified:

@table @asis
@item Scheme boolean
A Scheme boolean is converted the boolean type for the current language.

@item Scheme integer
A Scheme integer is converted to the first of a C @code{int},
@code{unsigned int}, @code{long}, @code{unsigned long},
@code{long long} or @code{unsigned long long} type
for the current architecture that can represent the value.

If the Scheme integer cannot be represented as a target integer
an @code{out-of-range} exception is thrown.

@item Scheme real
A Scheme real is converted to the C @code{double} type for the
current architecture.

@item Scheme string
A Scheme string is converted to a string in the current target
language using the current target encoding.
Characters that cannot be represented in the current target encoding
are replaced with the corresponding escape sequence.  This is Guile's
@code{SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE} conversion strategy
(@pxref{Strings,,, guile, GNU Guile Reference Manual}).

Passing @var{type} is not supported in this case,
if it is provided a @code{wrong-type-arg} exception is thrown.

@item @code{<gdb:lazy-string>}
If @var{value} is a @code{<gdb:lazy-string>} object (@pxref{Lazy Strings In
Guile}), then the @code{lazy-string->value} procedure is called, and
its result is used.

Passing @var{type} is not supported in this case,
if it is provided a @code{wrong-type-arg} exception is thrown.

@item Scheme bytevector
If @var{value} is a Scheme bytevector and @var{type} is provided,
@var{value} must be the same size, in bytes, of values of type @var{type},
and the result is essentially created by using @code{memcpy}.

If @var{value} is a Scheme bytevector and @var{type} is not provided,
the result is an array of type @code{uint8} of the same length.
@end table
@end deffn

@cindex optimized out value in guile
@deffn {Scheme Procedure} value-optimized-out? value
Return @code{#t} if the compiler optimized out @var{value},
thus it is not available for fetching from the inferior.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} value-address value
If @var{value} is addressable, returns a
@code{<gdb:value>} object representing the address.
Otherwise, @code{#f} is returned.
@end deffn

@deffn {Scheme Procedure} value-type value
Return the type of @var{value} as a @code{<gdb:type>} object
(@pxref{Types In Guile}).
@end deffn

@deffn {Scheme Procedure} value-dynamic-type value
Return the dynamic type of @var{value}.  This uses C@t{++} run-time
type information (@acronym{RTTI}) to determine the dynamic type of the
value.  If the value is of class type, it will return the class in
which the value is embedded, if any.  If the value is of pointer or
reference to a class type, it will compute the dynamic type of the
referenced object, and return a pointer or reference to that type,
respectively.  In all other cases, it will return the value's static
type.

Note that this feature will only work when debugging a C@t{++} program
that includes @acronym{RTTI} for the object in question.  Otherwise,
it will just return the static type of the value as in @kbd{ptype foo}.
@xref{Symbols, ptype}.
@end deffn

@deffn {Scheme Procedure} value-cast value type
Return a new instance of @code{<gdb:value>} that is the result of
casting @var{value} to the type described by @var{type}, which must
be a @code{<gdb:type>} object.  If the cast cannot be performed for some
reason, this method throws an exception.
@end deffn

@deffn {Scheme Procedure} value-dynamic-cast value type
Like @code{value-cast}, but works as if the C@t{++} @code{dynamic_cast}
operator were used.  Consult a C@t{++} reference for details.
@end deffn

@deffn {Scheme Procedure} value-reinterpret-cast value type
Like @code{value-cast}, but works as if the C@t{++} @code{reinterpret_cast}
operator were used.  Consult a C@t{++} reference for details.
@end deffn

@deffn {Scheme Procedure} value-dereference value
For pointer data types, this method returns a new @code{<gdb:value>} object
whose contents is the object pointed to by @var{value}.  For example, if
@code{foo} is a C pointer to an @code{int}, declared in your C program as

@smallexample
int *foo;
@end smallexample

@noindent
then you can use the corresponding @code{<gdb:value>} to access what
@code{foo} points to like this:

@smallexample
(define bar (value-dereference foo))
@end smallexample

The result @code{bar} will be a @code{<gdb:value>} object holding the
value pointed to by @code{foo}.

A similar function @code{value-referenced-value} exists which also
returns @code{<gdb:value>} objects corresponding to the values pointed to
by pointer values (and additionally, values referenced by reference
values).  However, the behavior of @code{value-dereference}
differs from @code{value-referenced-value} by the fact that the
behavior of @code{value-dereference} is identical to applying the C
unary operator @code{*} on a given value.  For example, consider a
reference to a pointer @code{ptrref}, declared in your C@t{++} program
as

@smallexample
typedef int *intptr;
...
int val = 10;
intptr ptr = &val;
intptr &ptrref = ptr;
@end smallexample

Though @code{ptrref} is a reference value, one can apply the method
@code{value-dereference} to the @code{<gdb:value>} object corresponding
to it and obtain a @code{<gdb:value>} which is identical to that
corresponding to @code{val}.  However, if you apply the method
@code{value-referenced-value}, the result would be a @code{<gdb:value>}
object identical to that corresponding to @code{ptr}.

@smallexample
(define scm-ptrref (parse-and-eval "ptrref"))
(define scm-val (value-dereference scm-ptrref))
(define scm-ptr (value-referenced-value scm-ptrref))
@end smallexample

The @code{<gdb:value>} object @code{scm-val} is identical to that
corresponding to @code{val}, and @code{scm-ptr} is identical to that
corresponding to @code{ptr}.  In general, @code{value-dereference} can
be applied whenever the C unary operator @code{*} can be applied
to the corresponding C value.  For those cases where applying both
@code{value-dereference} and @code{value-referenced-value} is allowed,
the results obtained need not be identical (as we have seen in the above
example).  The results are however identical when applied on
@code{<gdb:value>} objects corresponding to pointers (@code{<gdb:value>}
objects with type code @code{TYPE_CODE_PTR}) in a C/C@t{++} program.
@end deffn

@deffn {Scheme Procedure} value-referenced-value value
For pointer or reference data types, this method returns a new
@code{<gdb:value>} object corresponding to the value referenced by the
pointer/reference value.  For pointer data types,
@code{value-dereference} and @code{value-referenced-value} produce
identical results.  The difference between these methods is that
@code{value-dereference} cannot get the values referenced by reference
values.  For example, consider a reference to an @code{int}, declared
in your C@t{++} program as

@smallexample
int val = 10;
int &ref = val;
@end smallexample

@noindent
then applying @code{value-dereference} to the @code{<gdb:value>} object
corresponding to @code{ref} will result in an error, while applying
@code{value-referenced-value} will result in a @code{<gdb:value>} object
identical to that corresponding to @code{val}.

@smallexample
(define scm-ref (parse-and-eval "ref"))
(define err-ref (value-dereference scm-ref))      ;; error
(define scm-val (value-referenced-value scm-ref)) ;; ok
@end smallexample

The @code{<gdb:value>} object @code{scm-val} is identical to that
corresponding to @code{val}.
@end deffn

@deffn {Scheme Procedure} value-field value field-name
Return field @var{field-name} from @code{<gdb:value>} object @var{value}.
@end deffn

@deffn {Scheme Procedure} value-subscript value index
Return the value of array @var{value} at index @var{index}.
The @var{value} argument must be a subscriptable @code{<gdb:value>} object.
@end deffn

@deffn {Scheme Procedure} value-call value arg-list
Perform an inferior function call, taking @var{value} as a pointer
to the function to call.
Each element of list @var{arg-list} must be a <gdb:value> object or an object
that can be converted to a value.
The result is the value returned by the function.
@end deffn

@deffn {Scheme Procedure} value->bool value
Return the Scheme boolean representing @code{<gdb:value>} @var{value}.
The value must be ``integer like''.  Pointers are ok.
@end deffn

@deffn {Scheme Procedure} value->integer
Return the Scheme integer representing @code{<gdb:value>} @var{value}.
The value must be ``integer like''.  Pointers are ok.
@end deffn

@deffn {Scheme Procedure} value->real
Return the Scheme real number representing @code{<gdb:value>} @var{value}.
The value must be a number.
@end deffn

@deffn {Scheme Procedure} value->bytevector
Return a Scheme bytevector with the raw contents of @code{<gdb:value>}
@var{value}.  No transformation, endian or otherwise, is performed.
@end deffn

@c TODO: line length
@deffn {Scheme Procedure} value->string value @r{[}#:encoding encoding@r{]} @r{[}#:errors errors@r{]} @r{[}#:length length@r{]}
If @var{value>} represents a string, then this method
converts the contents to a Guile string.  Otherwise, this method will
throw an exception.

Values are interpreted as strings according to the rules of the
current language.  If the optional length argument is given, the
string will be converted to that length, and will include any embedded
zeroes that the string may contain.  Otherwise, for languages
where the string is zero-terminated, the entire string will be
converted.

For example, in C-like languages, a value is a string if it is a pointer
to or an array of characters or ints of type @code{wchar_t}, @code{char16_t},
or @code{char32_t}.

If the optional @var{encoding} argument is given, it must be a string
naming the encoding of the string in the @code{<gdb:value>}, such as
@code{"ascii"}, @code{"iso-8859-6"} or @code{"utf-8"}.  It accepts
the same encodings as the corresponding argument to Guile's
@code{scm_from_stringn} function, and the Guile codec machinery will be used
to convert the string.  If @var{encoding} is not given, or if
@var{encoding} is the empty string, then either the @code{target-charset}
(@pxref{Character Sets}) will be used, or a language-specific encoding
will be used, if the current language is able to supply one.

The optional @var{errors} argument is one of @code{#f}, @code{error} or
@code{substitute}.  @code{error} and @code{substitute} must be symbols.
If @var{errors} is not specified, or if its value is @code{#f}, then the
default conversion strategy is used, which is set with the Scheme function
@code{set-port-conversion-strategy!}.
If the value is @code{'error} then an exception is thrown if there is any
conversion error.  If the value is @code{'substitute} then any conversion
error is replaced with question marks.
@xref{Strings,,, guile, GNU Guile Reference Manual}.

If the optional @var{length} argument is given, the string will be
fetched and converted to the given length.
The length must be a Scheme integer and not a @code{<gdb:value>} integer.
@end deffn

@c TODO: line length
@deffn {Scheme Procedure} value->lazy-string value @r{[}#:encoding encoding@r{]} @r{[}#:length length@r{]}
If this @code{<gdb:value>} represents a string, then this method
converts @var{value} to a @code{<gdb:lazy-string} (@pxref{Lazy Strings
In Guile}).  Otherwise, this method will throw an exception.

If the optional @var{encoding} argument is given, it must be a string
naming the encoding of the @code{<gdb:lazy-string}.  Some examples are:
@code{"ascii"}, @code{"iso-8859-6"} or @code{"utf-8"}.  If the
@var{encoding} argument is an encoding that @value{GDBN} does not
recognize, @value{GDBN} will raise an error.

When a lazy string is printed, the @value{GDBN} encoding machinery is
used to convert the string during printing.  If the optional
@var{encoding} argument is not provided, or is an empty string,
@value{GDBN} will automatically select the encoding most suitable for
the string type.  For further information on encoding in @value{GDBN}
please see @ref{Character Sets}.

If the optional @var{length} argument is given, the string will be
fetched and encoded to the length of characters specified.  If
the @var{length} argument is not provided, the string will be fetched
and encoded until a null of appropriate width is found.
The length must be a Scheme integer and not a @code{<gdb:value>} integer.
@end deffn

@deffn {Scheme Procedure} value-lazy? value
Return @code{#t} if @var{value} has not yet been fetched
from the inferior.
Otherwise return @code{#f}.
@value{GDBN} does not fetch values until necessary, for efficiency.
For example:

@smallexample
(define myval (parse-and-eval "somevar"))
@end smallexample

The value of @code{somevar} is not fetched at this time.  It will be
fetched when the value is needed, or when the @code{fetch-lazy}
procedure is invoked.
@end deffn

@deffn {Scheme Procedure} make-lazy-value type address
Return a @code{<gdb:value>} that will be lazily fetched from the
target.  The object of type @code{<gdb:type>} whose value to fetch is
specified by its @var{type} and its target memory @var{address}, which
is a Scheme integer.
@end deffn

@deffn {Scheme Procedure} value-fetch-lazy! value
If @var{value} is a lazy value (@code{(value-lazy? value)} is @code{#t}),
then the value is fetched from the inferior.
Any errors that occur in the process will produce a Guile exception.

If @var{value} is not a lazy value, this method has no effect.

The result of this function is unspecified.
@end deffn

@deffn {Scheme Procedure} value-print value
Return the string representation (print form) of @code{<gdb:value>}
@var{value}.
@end deffn

@node Arithmetic In Guile
@subsubsection Arithmetic In Guile

The @code{(gdb)} module provides several functions for performing
arithmetic on @code{<gdb:value>} objects.
The arithmetic is performed as if it were done by the target,
and therefore has target semantics which are not necessarily
those of Scheme.  For example operations work with a fixed precision,
not the arbitrary precision of Scheme.

Wherever a function takes an integer or pointer as an operand,
@value{GDBN} will convert appropriate Scheme values to perform
the operation.

@deffn {Scheme Procedure} value-add a b
@end deffn

@deffn {Scheme Procedure} value-sub a b
@end deffn

@deffn {Scheme Procedure} value-mul a b
@end deffn

@deffn {Scheme Procedure} value-div a b
@end deffn

@deffn {Scheme Procedure} value-rem a b
@end deffn

@deffn {Scheme Procedure} value-mod a b
@end deffn

@deffn {Scheme Procedure} value-pow a b
@end deffn

@deffn {Scheme Procedure} value-not a
@end deffn

@deffn {Scheme Procedure} value-neg a
@end deffn

@deffn {Scheme Procedure} value-pos a
@end deffn

@deffn {Scheme Procedure} value-abs a
@end deffn

@deffn {Scheme Procedure} value-lsh a b
@end deffn

@deffn {Scheme Procedure} value-rsh a b
@end deffn

@deffn {Scheme Procedure} value-min a b
@end deffn

@deffn {Scheme Procedure} value-max a b
@end deffn

@deffn {Scheme Procedure} value-lognot a
@end deffn

@deffn {Scheme Procedure} value-logand a b
@end deffn

@deffn {Scheme Procedure} value-logior a b
@end deffn

@deffn {Scheme Procedure} value-logxor a b
@end deffn

@deffn {Scheme Procedure} value=? a b
@end deffn

@deffn {Scheme Procedure} value<? a b
@end deffn

@deffn {Scheme Procedure} value<=? a b
@end deffn

@deffn {Scheme Procedure} value>? a b
@end deffn

@deffn {Scheme Procedure} value>=? a b
@end deffn

Scheme does not provide a @code{not-equal} function,
and thus Guile support in @value{GDBN} does not either.

@node Types In Guile
@subsubsection Types In Guile
@cindex types in guile
@cindex guile, working with types

@tindex <gdb:type>
@value{GDBN} represents types from the inferior in objects of type
@code{<gdb:type>}.

The following type-related procedures are provided by the
@code{(gdb)} module.

@deffn {Scheme Procedure} type? object
Return @code{#t} if @var{object} is an object of type @code{<gdb:type>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} lookup-type name @r{[}#:block block@r{]}
This function looks up a type by its @var{name}, which must be a string.

If @var{block} is given, it is an object of type @code{<gdb:block>},
and @var{name} is looked up in that scope.
Otherwise, it is searched for globally.

Ordinarily, this function will return an instance of @code{<gdb:type>}.
If the named type cannot be found, it will throw an exception.
@end deffn

@deffn {Scheme Procedure} type-code type
Return the type code of @var{type}.  The type code will be one of the
@code{TYPE_CODE_} constants defined below.
@end deffn

@deffn {Scheme Procedure} type-tag type
Return the tag name of @var{type}.  The tag name is the name after
@code{struct}, @code{union}, or @code{enum} in C and C@t{++}; not all
languages have this concept.  If this type has no tag name, then
@code{#f} is returned.
@end deffn

@deffn {Scheme Procedure} type-name type
Return the name of @var{type}.
If this type has no name, then @code{#f} is returned.
@end deffn

@deffn {Scheme Procedure} type-print-name type
Return the print name of @var{type}.
This returns something even for anonymous types.
For example, for an anonymous C struct @code{"struct @{...@}"} is returned.
@end deffn

@deffn {Scheme Procedure} type-sizeof type
Return the size of this type, in target @code{char} units.  Usually, a
target's @code{char} type will be an 8-bit byte.  However, on some
unusual platforms, this type may have a different size.
@end deffn

@deffn {Scheme Procedure} type-strip-typedefs type
Return a new @code{<gdb:type>} that represents the real type of @var{type},
after removing all layers of typedefs.
@end deffn

@deffn {Scheme Procedure} type-array type n1 @r{[}n2@r{]}
Return a new @code{<gdb:type>} object which represents an array of this
type.  If one argument is given, it is the inclusive upper bound of
the array; in this case the lower bound is zero.  If two arguments are
given, the first argument is the lower bound of the array, and the
second argument is the upper bound of the array.  An array's length
must not be negative, but the bounds can be.
@end deffn

@deffn {Scheme Procedure} type-vector type n1 @r{[}n2@r{]}
Return a new @code{<gdb:type>} object which represents a vector of this
type.  If one argument is given, it is the inclusive upper bound of
the vector; in this case the lower bound is zero.  If two arguments are
given, the first argument is the lower bound of the vector, and the
second argument is the upper bound of the vector.  A vector's length
must not be negative, but the bounds can be.

The difference between an @code{array} and a @code{vector} is that
arrays behave like in C: when used in expressions they decay to a pointer
to the first element whereas vectors are treated as first class values.
@end deffn

@deffn {Scheme Procedure} type-pointer type
Return a new @code{<gdb:type>} object which represents a pointer to
@var{type}.
@end deffn

@deffn {Scheme Procedure} type-range type
Return a list of two elements: the low bound and high bound of @var{type}.
If @var{type} does not have a range, an exception is thrown.
@end deffn

@deffn {Scheme Procedure} type-reference type
Return a new @code{<gdb:type>} object which represents a reference to
@var{type}.
@end deffn

@deffn {Scheme Procedure} type-target type
Return a new @code{<gdb:type>} object which represents the target type
of @var{type}.

For a pointer type, the target type is the type of the pointed-to
object.  For an array type (meaning C-like arrays), the target type is
the type of the elements of the array.  For a function or method type,
the target type is the type of the return value.  For a complex type,
the target type is the type of the elements.  For a typedef, the
target type is the aliased type.

If the type does not have a target, this method will throw an
exception.
@end deffn

@deffn {Scheme Procedure} type-const type
Return a new @code{<gdb:type>} object which represents a
@code{const}-qualified variant of @var{type}.
@end deffn

@deffn {Scheme Procedure} type-volatile type
Return a new @code{<gdb:type>} object which represents a
@code{volatile}-qualified variant of @var{type}.
@end deffn

@deffn {Scheme Procedure} type-unqualified type
Return a new @code{<gdb:type>} object which represents an unqualified
variant of @var{type}.  That is, the result is neither @code{const} nor
@code{volatile}.
@end deffn

@deffn {Scheme Procedure} type-num-fields
Return the number of fields of @code{<gdb:type>} @var{type}.
@end deffn

@deffn {Scheme Procedure} type-fields type
Return the fields of @var{type} as a list.
For structure and union types, @code{fields} has the usual meaning.
Range types have two fields, the minimum and maximum values.  Enum types
have one field per enum constant.  Function and method types have one
field per parameter.  The base types of C@t{++} classes are also
represented as fields.  If the type has no fields, or does not fit
into one of these categories, an empty list will be returned.
@xref{Fields of a type in Guile}.
@end deffn

@deffn {Scheme Procedure} make-field-iterator type
Return the fields of @var{type} as a <gdb:iterator> object.
@xref{Iterators In Guile}.
@end deffn

@deffn {Scheme Procedure} type-field type field-name
Return field named @var{field-name} in @var{type}.
The result is an object of type @code{<gdb:field>}.
@xref{Fields of a type in Guile}.
If the type does not have fields, or @var{field-name} is not a field
of @var{type}, an exception is thrown.

For example, if @code{some-type} is a @code{<gdb:type>} instance holding
a structure type, you can access its @code{foo} field with:

@smallexample
(define bar (type-field some-type "foo"))
@end smallexample

@code{bar} will be a @code{<gdb:field>} object.
@end deffn

@deffn {Scheme Procedure} type-has-field? type name
Return @code{#t} if @code{<gdb:type>} @var{type} has field named @var{name}.
Otherwise return @code{#f}.
@end deffn

Each type has a code, which indicates what category this type falls
into.  The available type categories are represented by constants
defined in the @code{(gdb)} module:

@vtable @code
@item TYPE_CODE_PTR
The type is a pointer.

@item TYPE_CODE_ARRAY
The type is an array.

@item TYPE_CODE_STRUCT
The type is a structure.

@item TYPE_CODE_UNION
The type is a union.

@item TYPE_CODE_ENUM
The type is an enum.

@item TYPE_CODE_FLAGS
A bit flags type, used for things such as status registers.

@item TYPE_CODE_FUNC
The type is a function.

@item TYPE_CODE_INT
The type is an integer type.

@item TYPE_CODE_FLT
A floating point type.

@item TYPE_CODE_VOID
The special type @code{void}.

@item TYPE_CODE_SET
A Pascal set type.

@item TYPE_CODE_RANGE
A range type, that is, an integer type with bounds.

@item TYPE_CODE_STRING
A string type.  Note that this is only used for certain languages with
language-defined string types; C strings are not represented this way.

@item TYPE_CODE_BITSTRING
A string of bits.  It is deprecated.

@item TYPE_CODE_ERROR
An unknown or erroneous type.

@item TYPE_CODE_METHOD
A method type, as found in C@t{++}.

@item TYPE_CODE_METHODPTR
A pointer-to-member-function.

@item TYPE_CODE_MEMBERPTR
A pointer-to-member.

@item TYPE_CODE_REF
A reference type.

@item TYPE_CODE_CHAR
A character type.

@item TYPE_CODE_BOOL
A boolean type.

@item TYPE_CODE_COMPLEX
A complex float type.

@item TYPE_CODE_TYPEDEF
A typedef to some other type.

@item TYPE_CODE_NAMESPACE
A C@t{++} namespace.

@item TYPE_CODE_DECFLOAT
A decimal floating point type.

@item TYPE_CODE_INTERNAL_FUNCTION
A function internal to @value{GDBN}.  This is the type used to represent
convenience functions (@pxref{Convenience Funs}).
@end vtable

Further support for types is provided in the @code{(gdb types)}
Guile module (@pxref{Guile Types Module}).

@anchor{Fields of a type in Guile}
Each field is represented as an object of type @code{<gdb:field>}.

The following field-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} field? object
Return @code{#t} if @var{object} is an object of type @code{<gdb:field>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} field-name field
Return the name of the field, or @code{#f} for anonymous fields.
@end deffn

@deffn {Scheme Procedure} field-type field
Return the type of the field.  This is usually an instance of
@code{<gdb:type>}, but it can be @code{#f} in some situations.
@end deffn

@deffn {Scheme Procedure} field-enumval field
Return the enum value represented by @code{<gdb:field>} @var{field}.
@end deffn

@deffn {Scheme Procedure} field-bitpos field
Return the bit position of @code{<gdb:field>} @var{field}.
This attribute is not available for @code{static} fields (as in
C@t{++}).
@end deffn

@deffn {Scheme Procedure} field-bitsize field
If the field is packed, or is a bitfield, return the size of
@code{<gdb:field>} @var{field} in bits.  Otherwise, zero is returned;
in which case the field's size is given by its type.
@end deffn

@deffn {Scheme Procedure} field-artificial? field
Return @code{#t} if the field is artificial, usually meaning that
it was provided by the compiler and not the user.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} field-base-class? field
Return @code{#t} if the field represents a base class of a C@t{++}
structure.
Otherwise return @code{#f}.
@end deffn

@node Guile Pretty Printing API
@subsubsection Guile Pretty Printing API
@cindex guile pretty printing api

An example output is provided (@pxref{Pretty Printing}).

A pretty-printer is represented by an object of type <gdb:pretty-printer>.
Pretty-printer objects are created with @code{make-pretty-printer}.

The following pretty-printer-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} make-pretty-printer name lookup-function
Return a @code{<gdb:pretty-printer>} object named @var{name}.

@var{lookup-function} is a function of one parameter: the value to
be printed.  If the value is handled by this pretty-printer, then
@var{lookup-function} returns an object of type
<gdb:pretty-printer-worker> to perform the actual pretty-printing.
Otherwise @var{lookup-function} returns @code{#f}.
@end deffn

@deffn {Scheme Procedure} pretty-printer? object
Return @code{#t} if @var{object} is a @code{<gdb:pretty-printer>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} pretty-printer-enabled? pretty-printer
Return @code{#t} if @var{pretty-printer} is enabled.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} set-pretty-printer-enabled! pretty-printer flag
Set the enabled flag of @var{pretty-printer} to @var{flag}.
The value returned is unspecified.
@end deffn

@deffn {Scheme Procedure} pretty-printers
Return the list of global pretty-printers.
@end deffn

@deffn {Scheme Procedure} set-pretty-printers! pretty-printers
Set the list of global pretty-printers to @var{pretty-printers}.
The value returned is unspecified.
@end deffn

@deffn {Scheme Procedure} make-pretty-printer-worker display-hint to-string children
Return an object of type @code{<gdb:pretty-printer-worker>}.

This function takes three parameters:

@table @samp
@item display-hint
@var{display-hint} provides a hint to @value{GDBN} or @value{GDBN}
front end via MI to change the formatting of the value being printed.
The value must be a string or @code{#f} (meaning there is no hint).
Several values for @var{display-hint}
are predefined by @value{GDBN}:

@table @samp
@item array
Indicate that the object being printed is ``array-like''.  The CLI
uses this to respect parameters such as @code{set print elements} and
@code{set print array}.

@item map
Indicate that the object being printed is ``map-like'', and that the
children of this value can be assumed to alternate between keys and
values.

@item string
Indicate that the object being printed is ``string-like''.  If the
printer's @code{to-string} function returns a Guile string of some
kind, then @value{GDBN} will call its internal language-specific
string-printing function to format the string.  For the CLI this means
adding quotation marks, possibly escaping some characters, respecting
@code{set print elements}, and the like.
@end table

@item to-string
@var{to-string} is either a function of one parameter, the
@code{<gdb:pretty-printer-worker>} object, or @code{#f}.

When printing from the CLI, if the @code{to-string} method exists,
then @value{GDBN} will prepend its result to the values returned by
@code{children}.  Exactly how this formatting is done is dependent on
the display hint, and may change as more hints are added.  Also,
depending on the print settings (@pxref{Print Settings}), the CLI may
print just the result of @code{to-string} in a stack trace, omitting
the result of @code{children}.

If this method returns a string, it is printed verbatim.

Otherwise, if this method returns an instance of @code{<gdb:value>},
then @value{GDBN} prints this value.  This may result in a call to
another pretty-printer.

If instead the method returns a Guile value which is convertible to a
@code{<gdb:value>}, then @value{GDBN} performs the conversion and prints
the resulting value.  Again, this may result in a call to another
pretty-printer.  Guile scalars (integers, floats, and booleans) and
strings are convertible to @code{<gdb:value>}; other types are not.

Finally, if this method returns @code{#f} then no further operations
are peformed in this method and nothing is printed.

If the result is not one of these types, an exception is raised.

@var{to-string} may also be @code{#f} in which case it is left to
@var{children} to print the value.

@item children
@var{children} is either a function of one parameter, the
@code{<gdb:pretty-printer-worker>} object, or @code{#f}.

@value{GDBN} will call this function on a pretty-printer to compute the
children of the pretty-printer's value.

This function must return a <gdb:iterator> object.
Each item returned by the iterator must be a tuple holding
two elements.  The first element is the ``name'' of the child; the
second element is the child's value.  The value can be any Guile
object which is convertible to a @value{GDBN} value.

If @var{children} is @code{#f}, @value{GDBN} will act
as though the value has no children.

Children may be hidden from display based on the value of @samp{set
print max-depth} (@pxref{Print Settings}).
@end table
@end deffn

@value{GDBN} provides a function which can be used to look up the
default pretty-printer for a @code{<gdb:value>}:

@deffn {Scheme Procedure} default-visualizer value
This function takes a @code{<gdb:value>} object as an argument.  If a
pretty-printer for this value exists, then it is returned.  If no such
printer exists, then this returns @code{#f}.
@end deffn

@node Selecting Guile Pretty-Printers
@subsubsection Selecting Guile Pretty-Printers
@cindex selecting guile pretty-printers

There are three sets of pretty-printers that @value{GDBN} searches:

@itemize @bullet
@item
Per-objfile list of pretty-printers (@pxref{Objfiles In Guile}).
@item
Per-progspace list of pretty-printers (@pxref{Progspaces In Guile}).
@item
The global list of pretty-printers (@pxref{Guile Pretty Printing API}).
These printers are available when debugging any inferior.
@end itemize

Pretty-printer lookup is done by passing the value to be printed to the
lookup function of each enabled object in turn.
Lookup stops when a lookup function returns a non-@code{#f} value
or when the list is exhausted.
Lookup functions must return either a @code{<gdb:pretty-printer-worker>}
object or @code{#f}.  Otherwise an exception is thrown.

@value{GDBN} first checks the result of @code{objfile-pretty-printers}
of each @code{<gdb:objfile>} in the current program space and iteratively
calls each enabled lookup function in the list for that @code{<gdb:objfile>}
until a non-@code{#f} object is returned.
If no pretty-printer is found in the objfile lists, @value{GDBN} then
searches the result of @code{progspace-pretty-printers} of the current
program space, calling each enabled function until a non-@code{#f} object
is returned.
After these lists have been exhausted, it tries the global pretty-printers
list, obtained with @code{pretty-printers}, again calling each enabled
function until a non-@code{#f} object is returned.

The order in which the objfiles are searched is not specified.  For a
given list, functions are always invoked from the head of the list,
and iterated over sequentially until the end of the list, or a
@code{<gdb:pretty-printer-worker>} object is returned.

For various reasons a pretty-printer may not work.
For example, the underlying data structure may have changed and
the pretty-printer is out of date.

The consequences of a broken pretty-printer are severe enough that
@value{GDBN} provides support for enabling and disabling individual
printers.  For example, if @code{print frame-arguments} is on,
a backtrace can become highly illegible if any argument is printed
with a broken printer.

Pretty-printers are enabled and disabled from Scheme by calling
@code{set-pretty-printer-enabled!}.
@xref{Guile Pretty Printing API}.

@node Writing a Guile Pretty-Printer
@subsubsection Writing a Guile Pretty-Printer
@cindex writing a Guile pretty-printer

A pretty-printer consists of two basic parts: a lookup function to determine
if the type is supported, and the printer itself.

Here is an example showing how a @code{std::string} printer might be
written.  @xref{Guile Pretty Printing API}, for details.

@smallexample
(define (make-my-string-printer value)
  "Print a my::string string"
  (make-pretty-printer-worker
   "string"
   (lambda (printer)
     (value-field value "_data"))
   #f))
@end smallexample

And here is an example showing how a lookup function for the printer
example above might be written.

@smallexample
(define (str-lookup-function pretty-printer value)
  (let ((tag (type-tag (value-type value))))
    (and tag
         (string-prefix? "std::string<" tag)
         (make-my-string-printer value))))
@end smallexample

Then to register this printer in the global printer list:

@smallexample
(append-pretty-printer!
 (make-pretty-printer "my-string" str-lookup-function))
@end smallexample

The example lookup function extracts the value's type, and attempts to
match it to a type that it can pretty-print.  If it is a type the
printer can pretty-print, it will return a <gdb:pretty-printer-worker> object.
If not, it returns @code{#f}.

We recommend that you put your core pretty-printers into a Guile
package.  If your pretty-printers are for use with a library, we
further recommend embedding a version number into the package name.
This practice will enable @value{GDBN} to load multiple versions of
your pretty-printers at the same time, because they will have
different names.

You should write auto-loaded code (@pxref{Guile Auto-loading}) such that it
can be evaluated multiple times without changing its meaning.  An
ideal auto-load file will consist solely of @code{import}s of your
printer modules, followed by a call to a register pretty-printers with
the current objfile.

Taken as a whole, this approach will scale nicely to multiple
inferiors, each potentially using a different library version.
Embedding a version number in the Guile package name will ensure that
@value{GDBN} is able to load both sets of printers simultaneously.
Then, because the search for pretty-printers is done by objfile, and
because your auto-loaded code took care to register your library's
printers with a specific objfile, @value{GDBN} will find the correct
printers for the specific version of the library used by each
inferior.

To continue the @code{my::string} example,
this code might appear in @code{(my-project my-library v1)}:

@smallexample
(use-modules (gdb))
(define (register-printers objfile)
  (append-objfile-pretty-printer!
   (make-pretty-printer "my-string" str-lookup-function)))
@end smallexample

@noindent
And then the corresponding contents of the auto-load file would be:

@smallexample
(use-modules (gdb) (my-project my-library v1))
(register-printers (current-objfile))
@end smallexample

The previous example illustrates a basic pretty-printer.
There are a few things that can be improved on.
The printer only handles one type, whereas a library typically has
several types.  One could install a lookup function for each desired type
in the library, but one could also have a single lookup function recognize
several types.  The latter is the conventional way this is handled.
If a pretty-printer can handle multiple data types, then its
@dfn{subprinters} are the printers for the individual data types.

The @code{(gdb printing)} module provides a formal way of solving this
problem (@pxref{Guile Printing Module}).
Here is another example that handles multiple types.

These are the types we are going to pretty-print:

@smallexample
struct foo @{ int a, b; @};
struct bar @{ struct foo x, y; @};
@end smallexample

Here are the printers:

@smallexample
(define (make-foo-printer value)
  "Print a foo object"
  (make-pretty-printer-worker
   "foo"
   (lambda (printer)
     (format #f "a=<~a> b=<~a>"
             (value-field value "a") (value-field value "a")))
   #f))

(define (make-bar-printer value)
  "Print a bar object"
  (make-pretty-printer-worker
   "foo"
   (lambda (printer)
     (format #f "x=<~a> y=<~a>"
             (value-field value "x") (value-field value "y")))
   #f))
@end smallexample

This example doesn't need a lookup function, that is handled by the
@code{(gdb printing)} module.  Instead a function is provided to build up
the object that handles the lookup.

@smallexample
(use-modules (gdb printing))

(define (build-pretty-printer)
  (let ((pp (make-pretty-printer-collection "my-library")))
    (pp-collection-add-tag-printer "foo" make-foo-printer)
    (pp-collection-add-tag-printer "bar" make-bar-printer)
    pp))
@end smallexample

And here is the autoload support:

@smallexample
(use-modules (gdb) (my-library))
(append-objfile-pretty-printer! (current-objfile) (build-pretty-printer))
@end smallexample

Finally, when this printer is loaded into @value{GDBN}, here is the
corresponding output of @samp{info pretty-printer}:

@smallexample
(gdb) info pretty-printer
my_library.so:
  my-library
    foo
    bar
@end smallexample

@node Commands In Guile
@subsubsection Commands In Guile

@cindex commands in guile
@cindex guile commands
You can implement new @value{GDBN} CLI commands in Guile.  A CLI
command object is created with the @code{make-command} Guile function,
and added to @value{GDBN} with the @code{register-command!} Guile function.
This two-step approach is taken to separate out the side-effect of adding
the command to @value{GDBN} from @code{make-command}.

There is no support for multi-line commands, that is commands that
consist of multiple lines and are terminated with @code{end}.

@c TODO: line length
@deffn {Scheme Procedure} (make-command name @r{[}#:invoke invoke{]} @r{[}#:command-class command-class@r{]} @r{[}#:completer-class completer{]} @r{[}#:prefix? prefix@r{]} @r{[}#:doc doc-string{]})

The argument @var{name} is the name of the command.  If @var{name} consists of
multiple words, then the initial words are looked for as prefix
commands.  In this case, if one of the prefix commands does not exist,
an exception is raised.

The result is the @code{<gdb:command>} object representing the command.
The command is not usable until it has been registered with @value{GDBN}
with @code{register-command!}.

The rest of the arguments are optional.

The argument @var{invoke} is a procedure of three arguments: @var{self},
@var{args} and @var{from-tty}.  The argument @var{self} is the
@code{<gdb:command>} object representing the command.
The argument @var{args} is a string representing the arguments passed to
the command, after leading and trailing whitespace has been stripped.
The argument @var{from-tty} is a boolean flag and specifies whether the
command should consider itself to have been originated from the user
invoking it interactively.  If this function throws an exception,
it is turned into a @value{GDBN} @code{error} call.
Otherwise, the return value is ignored.

The argument @var{command-class} is one of the @samp{COMMAND_} constants
defined below.  This argument tells @value{GDBN} how to categorize the
new command in the help system.  The default is @code{COMMAND_NONE}.

The argument @var{completer} is either @code{#f}, one of the @samp{COMPLETE_}
constants defined below, or a procedure, also defined below.
This argument tells @value{GDBN} how to perform completion
for this command.  If not provided or if the value is @code{#f},
then no completion is performed on the command.

The argument @var{prefix} is a boolean flag indicating whether the new
command is a prefix command; sub-commands of this command may be
registered.

The argument @var{doc-string} is help text for the new command.
If no documentation string is provided, the default value ``This command is
not documented.'' is used.
@end deffn

@deffn {Scheme Procedure} register-command! command
Add @var{command}, a @code{<gdb:command>} object, to @value{GDBN}'s
list of commands.
It is an error to register a command more than once.
The result is unspecified.
@end deffn

@deffn {Scheme Procedure} command? object
Return @code{#t} if @var{object} is a @code{<gdb:command>} object.
Otherwise return @code{#f}.
@end deffn

@cindex don't repeat Guile command
@deffn {Scheme Procedure} dont-repeat
By default, a @value{GDBN} command is repeated when the user enters a
blank line at the command prompt.  A command can suppress this
behavior by invoking the @code{dont-repeat} function.  This is similar
to the user command @code{dont-repeat}, see @ref{Define, dont-repeat}.
@end deffn

@deffn {Scheme Procedure} string->argv string
Convert a string to a list of strings split up according to
@value{GDBN}'s argv parsing rules.
It is recommended to use this for consistency.
Arguments are separated by spaces and may be quoted.
Example:

@smallexample
scheme@@(guile-user)> (string->argv "1 2\\ \\\"3 '4 \"5' \"6 '7\"")
$1 = ("1" "2 \"3" "4 \"5" "6 '7")
@end smallexample
@end deffn

@deffn {Scheme Procedure} throw-user-error message . args
Throw a @code{gdb:user-error} exception.
The argument @var{message} is the error message as a format string, like the 
@var{fmt} argument to the @code{format} Scheme function.
@xref{Formatted Output,,, guile, GNU Guile Reference Manual}.
The argument @var{args} is a list of the optional arguments of @var{message}.

This is used when the command detects a user error of some kind,
say a bad command argument.

@smallexample
(gdb) guile (use-modules (gdb))
(gdb) guile
(register-command! (make-command "test-user-error"
  #:command-class COMMAND_OBSCURE
  #:invoke (lambda (self arg from-tty)
    (throw-user-error "Bad argument ~a" arg))))
end
(gdb) test-user-error ugh
ERROR: Bad argument ugh
@end smallexample
@end deffn

@cindex completion of Guile commands
@deffn completer self text word
If the @var{completer} option to @code{make-command} is a procedure,
it takes three arguments: @var{self} which is the @code{<gdb:command>}
object, and @var{text} and @var{word} which are both strings.
The argument @var{text} holds the complete command line up to the cursor's
location.  The argument @var{word} holds the last word of the command line;
this is computed using a word-breaking heuristic.

All forms of completion are handled by this function, that is,
the @key{TAB} and @key{M-?} key bindings (@pxref{Completion}),
and the @code{complete} command (@pxref{Help, complete}).

This procedure can return several kinds of values:

@itemize @bullet
@item
If the return value is a list, the contents of the list are used as the
completions.  It is up to @var{completer} to ensure that the
contents actually do complete the word.  An empty list is
allowed, it means that there were no completions available.  Only
string elements of the list are used; other elements in the
list are ignored.

@item
If the return value is a @code{<gdb:iterator>} object, it is iterated over to
obtain the completions.  It is up to @code{completer-procedure} to ensure
that the results actually do complete the word.  Only
string elements of the result are used; other elements in the
sequence are ignored.

@item
All other results are treated as though there were no available
completions.
@end itemize
@end deffn

When a new command is registered, it will have been declared as a member of
some general class of commands.  This is used to classify top-level
commands in the on-line help system; note that prefix commands are not
listed under their own category but rather that of their top-level
command.  The available classifications are represented by constants
defined in the @code{gdb} module:

@vtable @code
@item COMMAND_NONE
The command does not belong to any particular class.  A command in
this category will not be displayed in any of the help categories.
This is the default.

@item COMMAND_RUNNING
The command is related to running the inferior.  For example,
@code{start}, @code{step}, and @code{continue} are in this category.
Type @kbd{help running} at the @value{GDBN} prompt to see a list of
commands in this category.

@item COMMAND_DATA
The command is related to data or variables.  For example,
@code{call}, @code{find}, and @code{print} are in this category.  Type
@kbd{help data} at the @value{GDBN} prompt to see a list of commands
in this category.

@item COMMAND_STACK
The command has to do with manipulation of the stack.  For example,
@code{backtrace}, @code{frame}, and @code{return} are in this
category.  Type @kbd{help stack} at the @value{GDBN} prompt to see a
list of commands in this category.

@item COMMAND_FILES
This class is used for file-related commands.  For example,
@code{file}, @code{list} and @code{section} are in this category.
Type @kbd{help files} at the @value{GDBN} prompt to see a list of
commands in this category.

@item COMMAND_SUPPORT
This should be used for ``support facilities'', generally meaning
things that are useful to the user when interacting with @value{GDBN},
but not related to the state of the inferior.  For example,
@code{help}, @code{make}, and @code{shell} are in this category.  Type
@kbd{help support} at the @value{GDBN} prompt to see a list of
commands in this category.

@item COMMAND_STATUS
The command is an @samp{info}-related command, that is, related to the
state of @value{GDBN} itself.  For example, @code{info}, @code{macro},
and @code{show} are in this category.  Type @kbd{help status} at the
@value{GDBN} prompt to see a list of commands in this category.

@item COMMAND_BREAKPOINTS
The command has to do with breakpoints.  For example, @code{break},
@code{clear}, and @code{delete} are in this category.  Type @kbd{help
breakpoints} at the @value{GDBN} prompt to see a list of commands in
this category.

@item COMMAND_TRACEPOINTS
The command has to do with tracepoints.  For example, @code{trace},
@code{actions}, and @code{tfind} are in this category.  Type
@kbd{help tracepoints} at the @value{GDBN} prompt to see a list of
commands in this category.

@item COMMAND_USER
The command is a general purpose command for the user, and typically
does not fit in one of the other categories.
Type @kbd{help user-defined} at the @value{GDBN} prompt to see
a list of commands in this category, as well as the list of gdb macros
(@pxref{Sequences}).

@item COMMAND_OBSCURE
The command is only used in unusual circumstances, or is not of
general interest to users.  For example, @code{checkpoint},
@code{fork}, and @code{stop} are in this category.  Type @kbd{help
obscure} at the @value{GDBN} prompt to see a list of commands in this
category.

@item COMMAND_MAINTENANCE
The command is only useful to @value{GDBN} maintainers.  The
@code{maintenance} and @code{flushregs} commands are in this category.
Type @kbd{help internals} at the @value{GDBN} prompt to see a list of
commands in this category.
@end vtable

A new command can use a predefined completion function, either by
specifying it via an argument at initialization, or by returning it
from the @code{completer} procedure.  These predefined completion
constants are all defined in the @code{gdb} module:

@vtable @code
@item COMPLETE_NONE
This constant means that no completion should be done.

@item COMPLETE_FILENAME
This constant means that filename completion should be performed.

@item COMPLETE_LOCATION
This constant means that location completion should be done.
@xref{Specify Location}.

@item COMPLETE_COMMAND
This constant means that completion should examine @value{GDBN}
command names.

@item COMPLETE_SYMBOL
This constant means that completion should be done using symbol names
as the source.

@item COMPLETE_EXPRESSION
This constant means that completion should be done on expressions.
Often this means completing on symbol names, but some language
parsers also have support for completing on field names.
@end vtable

The following code snippet shows how a trivial CLI command can be
implemented in Guile:

@smallexample
(gdb) guile
(register-command! (make-command "hello-world"
  #:command-class COMMAND_USER
  #:doc "Greet the whole world."
  #:invoke (lambda (self args from-tty) (display "Hello, World!\n"))))
end
(gdb) hello-world
Hello, World!
@end smallexample

@node Parameters In Guile
@subsubsection Parameters In Guile

@cindex parameters in guile
@cindex guile parameters
@tindex Parameter
You can implement new @value{GDBN} @dfn{parameters} using Guile
@footnote{Note that @value{GDBN} parameters must not be confused with
Guile’s parameter objects (@pxref{Parameters,,, guile, GNU Guile
Reference Manual}).}.

There are many parameters that already exist and can be set in
@value{GDBN}.  Two examples are: @code{set follow-fork} and
@code{set charset}.  Setting these parameters influences certain
behavior in @value{GDBN}.  Similarly, you can define parameters that
can be used to influence behavior in custom Guile scripts and commands.

A new parameter is defined with the @code{make-parameter} Guile function,
and added to @value{GDBN} with the @code{register-parameter!} Guile function.
This two-step approach is taken to separate out the side-effect of adding
the parameter to @value{GDBN} from @code{make-parameter}.

Parameters are exposed to the user via the @code{set} and
@code{show} commands.  @xref{Help}.

@c TODO line length
@deffn {Scheme Procedure} (make-parameter name @r{[}#:command-class command-class@r{]} @r{[}#:parameter-type parameter-type{]} @r{[}#:enum-list enum-list@r{]} @r{[}#:set-func set-func{]} @r{[}#:show-func show-func{]} @r{[}#:doc doc{]} @r{[}#:set-doc set-doc{]} @r{[}#:show-doc show-doc{]} @r{[}#:initial-value initial-value{]})

The argument @var{name} is the name of the new parameter.  If @var{name}
consists of multiple words, then the initial words are looked for as prefix
parameters.  An example of this can be illustrated with the
@code{set print} set of parameters.  If @var{name} is
@code{print foo}, then @code{print} will be searched as the prefix
parameter.  In this case the parameter can subsequently be accessed in
@value{GDBN} as @code{set print foo}.
If @var{name} consists of multiple words, and no prefix parameter group
can be found, an exception is raised.

The result is the @code{<gdb:parameter>} object representing the parameter.
The parameter is not usable until it has been registered with @value{GDBN}
with @code{register-parameter!}.

The rest of the arguments are optional.

The argument @var{command-class} should be one of the @samp{COMMAND_} constants
(@pxref{Commands In Guile}).  This argument tells @value{GDBN} how to
categorize the new parameter in the help system.
The default is @code{COMMAND_NONE}.

The argument @var{parameter-type} should be one of the @samp{PARAM_} constants
defined below.  This argument tells @value{GDBN} the type of the new
parameter; this information is used for input validation and
completion.  The default is @code{PARAM_BOOLEAN}.

If @var{parameter-type} is @code{PARAM_ENUM}, then
@var{enum-list} must be a list of strings.  These strings
represent the possible values for the parameter.

If @var{parameter-type} is not @code{PARAM_ENUM}, then the presence
of @var{enum-list} will cause an exception to be thrown.

The argument @var{set-func} is a function of one argument: @var{self} which
is the @code{<gdb:parameter>} object representing the parameter.
@value{GDBN} will call this function when a @var{parameter}'s value has
been changed via the @code{set} API (for example, @kbd{set foo off}).
The value of the parameter has already been set to the new value.
This function must return a string to be displayed to the user.
@value{GDBN} will add a trailing newline if the string is non-empty.
@value{GDBN} generally doesn't print anything when a parameter is set,
thus typically this function should return @samp{""}.
A non-empty string result should typically be used for displaying warnings
and errors.

The argument @var{show-func} is a function of two arguments: @var{self} which
is the @code{<gdb:parameter>} object representing the parameter, and
@var{svalue} which is the string representation of the current value.
@value{GDBN} will call this function when a @var{parameter}'s
@code{show} API has been invoked (for example, @kbd{show foo}).
This function must return a string, and will be displayed to the user.
@value{GDBN} will add a trailing newline.

The argument @var{doc} is the help text for the new parameter.
If there is no documentation string, a default value is used.

The argument @var{set-doc} is the help text for this parameter's
@code{set} command.

The argument @var{show-doc} is the help text for this parameter's
@code{show} command.

The argument @var{initial-value} specifies the initial value of the parameter.
If it is a function, it takes one parameter, the @code{<gdb:parameter>}
object and its result is used as the initial value of the parameter.
The initial value must be valid for the parameter type,
otherwise an exception is thrown.
@end deffn

@deffn {Scheme Procedure} register-parameter! parameter
Add @var{parameter}, a @code{<gdb:parameter>} object, to @value{GDBN}'s
list of parameters.
It is an error to register a parameter more than once.
The result is unspecified.
@end deffn

@deffn {Scheme Procedure} parameter? object
Return @code{#t} if @var{object} is a @code{<gdb:parameter>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} parameter-value parameter
Return the value of @var{parameter} which may either be
a @code{<gdb:parameter>} object or a string naming the parameter.
@end deffn

@deffn {Scheme Procedure} set-parameter-value! parameter new-value
Assign @var{parameter} the value of @var{new-value}.
The argument @var{parameter} must be an object of type @code{<gdb:parameter>}.
@value{GDBN} does validation when assignments are made.
@end deffn

When a new parameter is defined, its type must be specified.  The
available types are represented by constants defined in the @code{gdb}
module:

@vtable @code
@item PARAM_BOOLEAN
The value is a plain boolean.  The Guile boolean values, @code{#t}
and @code{#f} are the only valid values.

@item PARAM_AUTO_BOOLEAN
The value has three possible states: true, false, and @samp{auto}.  In
Guile, true and false are represented using boolean constants, and
@samp{auto} is represented using @code{#:auto}.

@item PARAM_UINTEGER
The value is an unsigned integer.  The value of 0 should be
interpreted to mean ``unlimited''.

@item PARAM_ZINTEGER
The value is an integer.

@item PARAM_ZUINTEGER
The value is an unsigned integer.

@item PARAM_ZUINTEGER_UNLIMITED
The value is an integer in the range @samp{[0, INT_MAX]}.
A value of @samp{-1} means ``unlimited'', and other negative
numbers are not allowed.

@item PARAM_STRING
The value is a string.  When the user modifies the string, any escape
sequences, such as @samp{\t}, @samp{\f}, and octal escapes, are
translated into corresponding characters and encoded into the current
host charset.

@item PARAM_STRING_NOESCAPE
The value is a string.  When the user modifies the string, escapes are
passed through untranslated.

@item PARAM_OPTIONAL_FILENAME
The value is a either a filename (a string), or @code{#f}.

@item PARAM_FILENAME
The value is a filename.  This is just like
@code{PARAM_STRING_NOESCAPE}, but uses file names for completion.

@item PARAM_ENUM
The value is a string, which must be one of a collection of string
constants provided when the parameter is created.
@end vtable

@node Progspaces In Guile
@subsubsection Program Spaces In Guile

@cindex progspaces in guile
@tindex <gdb:progspace>
A program space, or @dfn{progspace}, represents a symbolic view
of an address space.
It consists of all of the objfiles of the program.
@xref{Objfiles In Guile}.
@xref{Inferiors and Programs, program spaces}, for more details
about program spaces.

Each progspace is represented by an instance of the @code{<gdb:progspace>}
smob.  @xref{GDB Scheme Data Types}.

The following progspace-related functions are available in the
@code{(gdb)} module:

@deffn {Scheme Procedure} progspace? object
Return @code{#t} if @var{object} is a @code{<gdb:progspace>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} progspace-valid? progspace
Return @code{#t} if @var{progspace} is valid, @code{#f} if not.
A @code{<gdb:progspace>} object can become invalid
if the program it refers to is not loaded in @value{GDBN} any longer.
@end deffn

@deffn {Scheme Procedure} current-progspace
This function returns the program space of the currently selected inferior.
There is always a current progspace, this never returns @code{#f}.
@xref{Inferiors and Programs}.
@end deffn

@deffn {Scheme Procedure} progspaces
Return a list of all the progspaces currently known to @value{GDBN}.
@end deffn

@deffn {Scheme Procedure} progspace-filename progspace
Return the absolute file name of @var{progspace} as a string.
This is the name of the file passed as the argument to the @code{file}
or @code{symbol-file} commands.
If the program space does not have an associated file name,
then @code{#f} is returned.  This occurs, for example, when @value{GDBN}
is started without a program to debug.

A @code{gdb:invalid-object-error} exception is thrown if @var{progspace}
is invalid.
@end deffn

@deffn {Scheme Procedure} progspace-objfiles progspace
Return the list of objfiles of @var{progspace}.
The order of objfiles in the result is arbitrary.
Each element is an object of type @code{<gdb:objfile>}.
@xref{Objfiles In Guile}.

A @code{gdb:invalid-object-error} exception is thrown if @var{progspace}
is invalid.
@end deffn

@deffn {Scheme Procedure} progspace-pretty-printers progspace
Return the list of pretty-printers of @var{progspace}.
Each element is an object of type @code{<gdb:pretty-printer>}.
@xref{Guile Pretty Printing API}, for more information.
@end deffn

@deffn {Scheme Procedure} set-progspace-pretty-printers! progspace printer-list
Set the list of registered @code{<gdb:pretty-printer>} objects for
@var{progspace} to @var{printer-list}.
@xref{Guile Pretty Printing API}, for more information.
@end deffn

@node Objfiles In Guile
@subsubsection Objfiles In Guile

@cindex objfiles in guile
@tindex <gdb:objfile>
@value{GDBN} loads symbols for an inferior from various
symbol-containing files (@pxref{Files}).  These include the primary
executable file, any shared libraries used by the inferior, and any
separate debug info files (@pxref{Separate Debug Files}).
@value{GDBN} calls these symbol-containing files @dfn{objfiles}.

Each objfile is represented as an object of type @code{<gdb:objfile>}.

The following objfile-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} objfile? object
Return @code{#t} if @var{object} is a @code{<gdb:objfile>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} objfile-valid? objfile
Return @code{#t} if @var{objfile} is valid, @code{#f} if not.
A @code{<gdb:objfile>} object can become invalid
if the object file it refers to is not loaded in @value{GDBN} any
longer.  All other @code{<gdb:objfile>} procedures will throw an exception
if it is invalid at the time the procedure is called.
@end deffn

@deffn {Scheme Procedure} objfile-filename objfile
Return the file name of @var{objfile} as a string,
with symbolic links resolved.
@end deffn

@deffn {Scheme Procedure} objfile-progspace objfile
Return the @code{<gdb:progspace>} that this object file lives in.
@xref{Progspaces In Guile}, for more on progspaces.
@end deffn

@deffn {Scheme Procedure} objfile-pretty-printers objfile
Return the list of registered @code{<gdb:pretty-printer>} objects for
@var{objfile}.  @xref{Guile Pretty Printing API}, for more information.
@end deffn

@deffn {Scheme Procedure} set-objfile-pretty-printers! objfile printer-list
Set the list of registered @code{<gdb:pretty-printer>} objects for
@var{objfile} to @var{printer-list}.  The
@var{printer-list} must be a list of @code{<gdb:pretty-printer>} objects.
@xref{Guile Pretty Printing API}, for more information.
@end deffn

@deffn {Scheme Procedure} current-objfile
When auto-loading a Guile script (@pxref{Guile Auto-loading}), @value{GDBN}
sets the ``current objfile'' to the corresponding objfile.  This
function returns the current objfile.  If there is no current objfile,
this function returns @code{#f}.
@end deffn

@deffn {Scheme Procedure} objfiles
Return a list of all the objfiles in the current program space.
@end deffn

@node Frames In Guile
@subsubsection Accessing inferior stack frames from Guile.

@cindex frames in guile
When the debugged program stops, @value{GDBN} is able to analyze its call
stack (@pxref{Frames,,Stack frames}).  The @code{<gdb:frame>} class
represents a frame in the stack.  A @code{<gdb:frame>} object is only valid
while its corresponding frame exists in the inferior's stack.  If you try
to use an invalid frame object, @value{GDBN} will throw a
@code{gdb:invalid-object} exception (@pxref{Guile Exception Handling}).

Two @code{<gdb:frame>} objects can be compared for equality with the
@code{equal?} function, like:

@smallexample
(@value{GDBP}) guile (equal? (newest-frame) (selected-frame))
#t
@end smallexample

The following frame-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} frame? object
Return @code{#t} if @var{object} is a @code{<gdb:frame>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} frame-valid? frame
Returns @code{#t} if @var{frame} is valid, @code{#f} if not.
A frame object can become invalid if the frame it refers to doesn't
exist anymore in the inferior.  All @code{<gdb:frame>} procedures will throw
an exception if the frame is invalid at the time the procedure is called.
@end deffn

@deffn {Scheme Procedure} frame-name frame
Return the function name of @var{frame}, or @code{#f} if it can't be
obtained.
@end deffn

@deffn {Scheme Procedure} frame-arch frame
Return the @code{<gdb:architecture>} object corresponding to @var{frame}'s
architecture.  @xref{Architectures In Guile}.
@end deffn

@deffn {Scheme Procedure} frame-type frame
Return the type of @var{frame}.  The value can be one of:

@table @code
@item NORMAL_FRAME
An ordinary stack frame.

@item DUMMY_FRAME
A fake stack frame that was created by @value{GDBN} when performing an
inferior function call.

@item INLINE_FRAME
A frame representing an inlined function.  The function was inlined
into a @code{NORMAL_FRAME} that is older than this one.

@item TAILCALL_FRAME
A frame representing a tail call.  @xref{Tail Call Frames}.

@item SIGTRAMP_FRAME
A signal trampoline frame.  This is the frame created by the OS when
it calls into a signal handler.

@item ARCH_FRAME
A fake stack frame representing a cross-architecture call.

@item SENTINEL_FRAME
This is like @code{NORMAL_FRAME}, but it is only used for the
newest frame.
@end table
@end deffn

@deffn {Scheme Procedure} frame-unwind-stop-reason frame
Return an integer representing the reason why it's not possible to find
more frames toward the outermost frame.  Use
@code{unwind-stop-reason-string} to convert the value returned by this
function to a string. The value can be one of:

@table @code
@item FRAME_UNWIND_NO_REASON
No particular reason (older frames should be available).

@item FRAME_UNWIND_NULL_ID
The previous frame's analyzer returns an invalid result.

@item FRAME_UNWIND_OUTERMOST
This frame is the outermost.

@item FRAME_UNWIND_UNAVAILABLE
Cannot unwind further, because that would require knowing the 
values of registers or memory that have not been collected.

@item FRAME_UNWIND_INNER_ID
This frame ID looks like it ought to belong to a NEXT frame,
but we got it for a PREV frame.  Normally, this is a sign of
unwinder failure.  It could also indicate stack corruption.

@item FRAME_UNWIND_SAME_ID
This frame has the same ID as the previous one.  That means
that unwinding further would almost certainly give us another
frame with exactly the same ID, so break the chain.  Normally,
this is a sign of unwinder failure.  It could also indicate
stack corruption.

@item FRAME_UNWIND_NO_SAVED_PC
The frame unwinder did not find any saved PC, but we needed
one to unwind further.

@item FRAME_UNWIND_MEMORY_ERROR
The frame unwinder caused an error while trying to access memory.

@item FRAME_UNWIND_FIRST_ERROR
Any stop reason greater or equal to this value indicates some kind
of error.  This special value facilitates writing code that tests
for errors in unwinding in a way that will work correctly even if
the list of the other values is modified in future @value{GDBN}
versions.  Using it, you could write:

@smallexample
(define reason (frame-unwind-stop-readon (selected-frame)))
(define reason-str (unwind-stop-reason-string reason))
(if (>= reason FRAME_UNWIND_FIRST_ERROR)
    (format #t "An error occured: ~s\n" reason-str))
@end smallexample
@end table
@end deffn

@deffn {Scheme Procedure} frame-pc frame
Return the frame's resume address.
@end deffn

@deffn {Scheme Procedure} frame-block frame
Return the frame's code block as a @code{<gdb:block>} object.
@xref{Blocks In Guile}.
@end deffn

@deffn {Scheme Procedure} frame-function frame
Return the symbol for the function corresponding to this frame
as a @code{<gdb:symbol>} object, or @code{#f} if there isn't one.
@xref{Symbols In Guile}.
@end deffn

@deffn {Scheme Procedure} frame-older frame
Return the frame that called @var{frame}.
@end deffn

@deffn {Scheme Procedure} frame-newer frame
Return the frame called by @var{frame}.
@end deffn

@deffn {Scheme Procedure} frame-sal frame
Return the frame's @code{<gdb:sal>} (symtab and line) object.
@xref{Symbol Tables In Guile}.
@end deffn

@deffn {Scheme Procedure} frame-read-register frame register
Return the value of @var{register} in @var{frame}.  @var{register}
should be a string, like @samp{pc}.
@end deffn

@deffn {Scheme Procedure} frame-read-var frame variable @r{[}#:block block@r{]}
Return the value of @var{variable} in @var{frame}.  If the optional
argument @var{block} is provided, search for the variable from that
block; otherwise start at the frame's current block (which is
determined by the frame's current program counter).  The
@var{variable} must be given as a string or a @code{<gdb:symbol>}
object, and @var{block} must be a @code{<gdb:block>} object.
@end deffn

@deffn {Scheme Procedure} frame-select frame
Set @var{frame} to be the selected frame.  @xref{Stack, ,Examining the
Stack}.
@end deffn

@deffn {Scheme Procedure} selected-frame
Return the selected frame object.  @xref{Selection,,Selecting a Frame}.
@end deffn

@deffn {Scheme Procedure} newest-frame
Return the newest frame object for the selected thread.
@end deffn

@deffn {Scheme Procedure} unwind-stop-reason-string reason
Return a string explaining the reason why @value{GDBN} stopped unwinding
frames, as expressed by the given @var{reason} code (an integer, see the
@code{frame-unwind-stop-reason} procedure above in this section).
@end deffn

@node Blocks In Guile
@subsubsection Accessing blocks from Guile.

@cindex blocks in guile
@tindex <gdb:block>

In @value{GDBN}, symbols are stored in blocks.  A block corresponds
roughly to a scope in the source code.  Blocks are organized
hierarchically, and are represented individually in Guile as an object
of type @code{<gdb:block>}.  Blocks rely on debugging information being
available.

A frame has a block.  Please see @ref{Frames In Guile}, for a more
in-depth discussion of frames.

The outermost block is known as the @dfn{global block}.  The global
block typically holds public global variables and functions.

The block nested just inside the global block is the @dfn{static
block}.  The static block typically holds file-scoped variables and
functions.

@value{GDBN} provides a method to get a block's superblock, but there
is currently no way to examine the sub-blocks of a block, or to
iterate over all the blocks in a symbol table (@pxref{Symbol Tables In
Guile}).

Here is a short example that should help explain blocks:

@smallexample
/* This is in the global block.  */
int global;

/* This is in the static block.  */
static int file_scope;

/* 'function' is in the global block, and 'argument' is
   in a block nested inside of 'function'.  */
int function (int argument)
@{
  /* 'local' is in a block inside 'function'.  It may or may
     not be in the same block as 'argument'.  */
  int local;

  @{
     /* 'inner' is in a block whose superblock is the one holding
        'local'.  */
     int inner;

     /* If this call is expanded by the compiler, you may see
        a nested block here whose function is 'inline_function'
        and whose superblock is the one holding 'inner'.  */
     inline_function ();
  @}
@}
@end smallexample

The following block-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} block? object
Return @code{#t} if @var{object} is a @code{<gdb:block>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} block-valid? block
Returns @code{#t} if @code{<gdb:block>} @var{block} is valid,
@code{#f} if not.  A block object can become invalid if the block it
refers to doesn't exist anymore in the inferior.  All other
@code{<gdb:block>} methods will throw an exception if it is invalid at
the time the procedure is called.  The block's validity is also checked
during iteration over symbols of the block.
@end deffn

@deffn {Scheme Procedure} block-start block
Return the start address of @code{<gdb:block>} @var{block}.
@end deffn

@deffn {Scheme Procedure} block-end block
Return the end address of @code{<gdb:block>} @var{block}.
@end deffn

@deffn {Scheme Procedure} block-function block
Return the name of @code{<gdb:block>} @var{block} represented as a
@code{<gdb:symbol>} object.
If the block is not named, then @code{#f} is returned.

For ordinary function blocks, the superblock is the static block.
However, you should note that it is possible for a function block to
have a superblock that is not the static block -- for instance this
happens for an inlined function.
@end deffn

@deffn {Scheme Procedure} block-superblock block
Return the block containing @code{<gdb:block>} @var{block}.
If the parent block does not exist, then @code{#f} is returned.
@end deffn

@deffn {Scheme Procedure} block-global-block block
Return the global block associated with @code{<gdb:block>} @var{block}.
@end deffn

@deffn {Scheme Procedure} block-static-block block
Return the static block associated with @code{<gdb:block>} @var{block}.
@end deffn

@deffn {Scheme Procedure} block-global? block
Return @code{#t} if @code{<gdb:block>} @var{block} is a global block.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} block-static? block
Return @code{#t} if @code{<gdb:block>} @var{block} is a static block.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} block-symbols
Return a list of all symbols (as <gdb:symbol> objects) in
@code{<gdb:block>} @var{block}.
@end deffn

@deffn {Scheme Procedure} make-block-symbols-iterator block
Return an object of type @code{<gdb:iterator>} that will iterate
over all symbols of the block.
Guile programs should not assume that a specific block object will
always contain a given symbol, since changes in @value{GDBN} features and
infrastructure may cause symbols move across blocks in a symbol table.
@xref{Iterators In Guile}.
@end deffn

@deffn {Scheme Procedure} block-symbols-progress?
Return #t if the object is a <gdb:block-symbols-progress> object.
This object would be obtained from the @code{progress} element of the
@code{<gdb:iterator>} object returned by @code{make-block-symbols-iterator}.
@end deffn

@deffn {Scheme Procedure} lookup-block pc
Return the innermost @code{<gdb:block>} containing the given @var{pc}
value.  If the block cannot be found for the @var{pc} value specified,
the function will return @code{#f}.
@end deffn

@node Symbols In Guile
@subsubsection Guile representation of Symbols.

@cindex symbols in guile
@tindex <gdb:symbol>

@value{GDBN} represents every variable, function and type as an
entry in a symbol table.  @xref{Symbols, ,Examining the Symbol Table}.
Guile represents these symbols in @value{GDBN} with the
@code{<gdb:symbol>} object.

The following symbol-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} symbol? object
Return @code{#t} if @var{object} is an object of type @code{<gdb:symbol>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} symbol-valid? symbol
Return @code{#t} if the @code{<gdb:symbol>} object is valid,
@code{#f} if not.  A @code{<gdb:symbol>} object can become invalid if
the symbol it refers to does not exist in @value{GDBN} any longer.
All other @code{<gdb:symbol>} procedures will throw an exception if it is
invalid at the time the procedure is called.
@end deffn

@deffn {Scheme Procedure} symbol-type symbol
Return the type of @var{symbol} or @code{#f} if no type is recorded.
The result is an object of type @code{<gdb:type>}.
@xref{Types In Guile}.
@end deffn

@deffn {Scheme Procedure} symbol-symtab symbol
Return the symbol table in which @var{symbol} appears.
The result is an object of type @code{<gdb:symtab>}.
@xref{Symbol Tables In Guile}.
@end deffn

@deffn {Scheme Procedure} symbol-line symbol
Return the line number in the source code at which @var{symbol} was defined.
This is an integer.
@end deffn

@deffn {Scheme Procedure} symbol-name symbol
Return the name of @var{symbol} as a string.
@end deffn

@deffn {Scheme Procedure} symbol-linkage-name symbol
Return the name of @var{symbol}, as used by the linker (i.e., may be mangled).
@end deffn

@deffn {Scheme Procedure} symbol-print-name symbol
Return the name of @var{symbol} in a form suitable for output.  This is either
@code{name} or @code{linkage_name}, depending on whether the user
asked @value{GDBN} to display demangled or mangled names.
@end deffn

@deffn {Scheme Procedure} symbol-addr-class symbol
Return the address class of the symbol.  This classifies how to find the value
of a symbol.  Each address class is a constant defined in the
@code{(gdb)} module and described later in this chapter.
@end deffn

@deffn {Scheme Procedure} symbol-needs-frame? symbol
Return @code{#t} if evaluating @var{symbol}'s value requires a frame
(@pxref{Frames In Guile}) and @code{#f} otherwise.  Typically,
local variables will require a frame, but other symbols will not.
@end deffn

@deffn {Scheme Procedure} symbol-argument? symbol
Return @code{#t} if @var{symbol} is an argument of a function.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} symbol-constant? symbol
Return @code{#t} if @var{symbol} is a constant.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} symbol-function? symbol
Return @code{#t} if @var{symbol} is a function or a method.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} symbol-variable? symbol
Return @code{#t} if @var{symbol} is a variable.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} symbol-value symbol @r{[}#:frame frame@r{]}
Compute the value of @var{symbol}, as a @code{<gdb:value>}.  For
functions, this computes the address of the function, cast to the
appropriate type.  If the symbol requires a frame in order to compute
its value, then @var{frame} must be given.  If @var{frame} is not
given, or if @var{frame} is invalid, then an exception is thrown.
@end deffn

@c TODO: line length
@deffn {Scheme Procedure} lookup-symbol name @r{[}#:block block@r{]} @r{[}#:domain domain@r{]}
This function searches for a symbol by name.  The search scope can be
restricted to the parameters defined in the optional domain and block
arguments.

@var{name} is the name of the symbol.  It must be a string.  The
optional @var{block} argument restricts the search to symbols visible
in that @var{block}.  The @var{block} argument must be a
@code{<gdb:block>} object.  If omitted, the block for the current frame
is used.  The optional @var{domain} argument restricts
the search to the domain type.  The @var{domain} argument must be a
domain constant defined in the @code{(gdb)} module and described later
in this chapter.

The result is a list of two elements.
The first element is a @code{<gdb:symbol>} object or @code{#f} if the symbol
is not found.
If the symbol is found, the second element is @code{#t} if the symbol
is a field of a method's object (e.g., @code{this} in C@t{++}),
otherwise it is @code{#f}.
If the symbol is not found, the second element is @code{#f}.
@end deffn

@deffn {Scheme Procedure} lookup-global-symbol name @r{[}#:domain domain@r{]}
This function searches for a global symbol by name.
The search scope can be restricted by the domain argument.

@var{name} is the name of the symbol.  It must be a string.
The optional @var{domain} argument restricts the search to the domain type.
The @var{domain} argument must be a domain constant defined in the @code{(gdb)}
module and described later in this chapter.

The result is a @code{<gdb:symbol>} object or @code{#f} if the symbol
is not found.
@end deffn

The available domain categories in @code{<gdb:symbol>} are represented
as constants in the @code{(gdb)} module:

@vtable @code
@item SYMBOL_UNDEF_DOMAIN
This is used when a domain has not been discovered or none of the
following domains apply.  This usually indicates an error either
in the symbol information or in @value{GDBN}'s handling of symbols.

@item SYMBOL_VAR_DOMAIN
This domain contains variables, function names, typedef names and enum
type values.

@item SYMBOL_STRUCT_DOMAIN
This domain holds struct, union and enum type names.

@item SYMBOL_LABEL_DOMAIN
This domain contains names of labels (for gotos).

@item SYMBOL_VARIABLES_DOMAIN
This domain holds a subset of the @code{SYMBOLS_VAR_DOMAIN}; it
contains everything minus functions and types.

@item SYMBOL_FUNCTIONS_DOMAIN
This domain contains all functions.

@item SYMBOL_TYPES_DOMAIN
This domain contains all types.
@end vtable

The available address class categories in @code{<gdb:symbol>} are represented
as constants in the @code{gdb} module:

@vtable @code
@item SYMBOL_LOC_UNDEF
If this is returned by address class, it indicates an error either in
the symbol information or in @value{GDBN}'s handling of symbols.

@item SYMBOL_LOC_CONST
Value is constant int.

@item SYMBOL_LOC_STATIC
Value is at a fixed address.

@item SYMBOL_LOC_REGISTER
Value is in a register.

@item SYMBOL_LOC_ARG
Value is an argument.  This value is at the offset stored within the
symbol inside the frame's argument list.

@item SYMBOL_LOC_REF_ARG
Value address is stored in the frame's argument list.  Just like
@code{LOC_ARG} except that the value's address is stored at the
offset, not the value itself.

@item SYMBOL_LOC_REGPARM_ADDR
Value is a specified register.  Just like @code{LOC_REGISTER} except
the register holds the address of the argument instead of the argument
itself.

@item SYMBOL_LOC_LOCAL
Value is a local variable.

@item SYMBOL_LOC_TYPEDEF
Value not used.  Symbols in the domain @code{SYMBOL_STRUCT_DOMAIN} all
have this class.

@item SYMBOL_LOC_BLOCK
Value is a block.

@item SYMBOL_LOC_CONST_BYTES
Value is a byte-sequence.

@item SYMBOL_LOC_UNRESOLVED
Value is at a fixed address, but the address of the variable has to be
determined from the minimal symbol table whenever the variable is
referenced.

@item SYMBOL_LOC_OPTIMIZED_OUT
The value does not actually exist in the program.

@item SYMBOL_LOC_COMPUTED
The value's address is a computed location.
@end vtable

@node Symbol Tables In Guile
@subsubsection Symbol table representation in Guile.

@cindex symbol tables in guile
@tindex <gdb:symtab>
@tindex <gdb:sal>

Access to symbol table data maintained by @value{GDBN} on the inferior
is exposed to Guile via two objects: @code{<gdb:sal>} (symtab-and-line) and
@code{<gdb:symtab>}.  Symbol table and line data for a frame is returned
from the @code{frame-find-sal} @code{<gdb:frame>} procedure.
@xref{Frames In Guile}.

For more information on @value{GDBN}'s symbol table management, see
@ref{Symbols, ,Examining the Symbol Table}.

The following symtab-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} symtab? object
Return @code{#t} if @var{object} is an object of type @code{<gdb:symtab>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} symtab-valid? symtab
Return @code{#t} if the @code{<gdb:symtab>} object is valid,
@code{#f} if not.  A @code{<gdb:symtab>} object becomes invalid when
the symbol table it refers to no longer exists in @value{GDBN}.
All other @code{<gdb:symtab>} procedures will throw an exception
if it is invalid at the time the procedure is called.
@end deffn

@deffn {Scheme Procedure} symtab-filename symtab
Return the symbol table's source filename.
@end deffn

@deffn {Scheme Procedure} symtab-fullname symtab
Return the symbol table's source absolute file name.
@end deffn

@deffn {Scheme Procedure} symtab-objfile symtab
Return the symbol table's backing object file.  @xref{Objfiles In Guile}.
@end deffn

@deffn {Scheme Procedure} symtab-global-block symtab
Return the global block of the underlying symbol table.
@xref{Blocks In Guile}.
@end deffn

@deffn {Scheme Procedure} symtab-static-block symtab
Return the static block of the underlying symbol table.
@xref{Blocks In Guile}.
@end deffn

The following symtab-and-line-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} sal? object
Return @code{#t} if @var{object} is an object of type @code{<gdb:sal>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} sal-valid? sal
Return @code{#t} if @var{sal} is valid, @code{#f} if not.
A @code{<gdb:sal>} object becomes invalid when the Symbol table object
it refers to no longer exists in @value{GDBN}.  All other
@code{<gdb:sal>} procedures will throw an exception if it is
invalid at the time the procedure is called.
@end deffn

@deffn {Scheme Procedure} sal-symtab sal
Return the symbol table object (@code{<gdb:symtab>}) for @var{sal}.
@end deffn

@deffn {Scheme Procedure} sal-line sal
Return the line number for @var{sal}.
@end deffn

@deffn {Scheme Procedure} sal-pc sal
Return the start of the address range occupied by code for @var{sal}.
@end deffn

@deffn {Scheme Procedure} sal-last sal
Return the end of the address range occupied by code for @var{sal}.
@end deffn

@deffn {Scheme Procedure} find-pc-line pc
Return the @code{<gdb:sal>} object corresponding to the @var{pc} value.
If an invalid value of @var{pc} is passed as an argument, then the
@code{symtab} and @code{line} attributes of the returned @code{<gdb:sal>}
object will be @code{#f} and 0 respectively.
@end deffn

@node Breakpoints In Guile
@subsubsection Manipulating breakpoints using Guile

@cindex breakpoints in guile
@tindex <gdb:breakpoint>

Breakpoints in Guile are represented by objects of type
@code{<gdb:breakpoint>}.  New breakpoints can be created with the
@code{make-breakpoint} Guile function, and then added to @value{GDBN} with the
@code{register-breakpoint!} Guile function.
This two-step approach is taken to separate out the side-effect of adding
the breakpoint to @value{GDBN} from @code{make-breakpoint}.

Support is also provided to view and manipulate breakpoints created
outside of Guile.

The following breakpoint-related procedures are provided by the
@code{(gdb)} module:

@c TODO: line length
@deffn {Scheme Procedure} make-breakpoint location @r{[}#:type type@r{]} @r{[}#:wp-class wp-class@r{]} @r{[}#:internal internal@r{]}
Create a new breakpoint at @var{location}, a string naming the
location of the breakpoint, or an expression that defines a watchpoint.
The contents can be any location recognized by the @code{break} command,
or in the case of a watchpoint, by the @code{watch} command.

The breakpoint is initially marked as @samp{invalid}.
The breakpoint is not usable until it has been registered with @value{GDBN}
with @code{register-breakpoint!}, at which point it becomes @samp{valid}.
The result is the @code{<gdb:breakpoint>} object representing the breakpoint.

The optional @var{type} denotes the breakpoint to create.
This argument can be either @code{BP_BREAKPOINT} or @code{BP_WATCHPOINT},
and defaults to @code{BP_BREAKPOINT}.

The optional @var{wp-class} argument defines the class of watchpoint to
create, if @var{type} is @code{BP_WATCHPOINT}.  If a watchpoint class is
not provided, it is assumed to be a @code{WP_WRITE} class.

The optional @var{internal} argument allows the breakpoint to become
invisible to the user.  The breakpoint will neither be reported when
registered, nor will it be listed in the output from @code{info breakpoints}
(but will be listed with the @code{maint info breakpoints} command).
If an internal flag is not provided, the breakpoint is visible
(non-internal).

When a watchpoint is created, @value{GDBN} will try to create a
hardware assisted watchpoint.  If successful, the type of the watchpoint
is changed from @code{BP_WATCHPOINT} to @code{BP_HARDWARE_WATCHPOINT}
for @code{WP_WRITE}, @code{BP_READ_WATCHPOINT} for @code{WP_READ},
and @code{BP_ACCESS_WATCHPOINT} for @code{WP_ACCESS}.
If not successful, the type of the watchpoint is left as @code{WP_WATCHPOINT}.

The available types are represented by constants defined in the @code{gdb}
module:

@vtable @code
@item BP_BREAKPOINT
Normal code breakpoint.

@item BP_WATCHPOINT
Watchpoint breakpoint.

@item BP_HARDWARE_WATCHPOINT
Hardware assisted watchpoint.
This value cannot be specified when creating the breakpoint.

@item BP_READ_WATCHPOINT
Hardware assisted read watchpoint.
This value cannot be specified when creating the breakpoint.

@item BP_ACCESS_WATCHPOINT
Hardware assisted access watchpoint.
This value cannot be specified when creating the breakpoint.
@end vtable

The available watchpoint types represented by constants are defined in the
@code{(gdb)} module:

@vtable @code
@item WP_READ
Read only watchpoint.

@item WP_WRITE
Write only watchpoint.

@item WP_ACCESS
Read/Write watchpoint.
@end vtable

@end deffn

@deffn {Scheme Procedure} register-breakpoint! breakpoint
Add @var{breakpoint}, a @code{<gdb:breakpoint>} object, to @value{GDBN}'s
list of breakpoints.  The breakpoint must have been created with
@code{make-breakpoint}.  One cannot register breakpoints that have been
created outside of Guile.  Once a breakpoint is registered it becomes
@samp{valid}.
It is an error to register an already registered breakpoint.
The result is unspecified.
@end deffn

@deffn {Scheme Procedure} delete-breakpoint! breakpoint
Remove @var{breakpoint} from @value{GDBN}'s list of breakpoints.
This also invalidates the Guile @var{breakpoint} object.
Any further attempt to access the object will throw an exception.

If @var{breakpoint} was created from Guile with @code{make-breakpoint}
it may be re-registered with @value{GDBN}, in which case the breakpoint
becomes valid again.
@end deffn

@deffn {Scheme Procedure} breakpoints
Return a list of all breakpoints.
Each element of the list is a @code{<gdb:breakpoint>} object.
@end deffn

@deffn {Scheme Procedure} breakpoint? object
Return @code{#t} if @var{object} is a @code{<gdb:breakpoint>} object,
and @code{#f} otherwise.
@end deffn

@deffn {Scheme Procedure} breakpoint-valid? breakpoint
Return @code{#t} if @var{breakpoint} is valid, @code{#f} otherwise.
Breakpoints created with @code{make-breakpoint} are marked as invalid
until they are registered with @value{GDBN} with @code{register-breakpoint!}.
A @code{<gdb:breakpoint>} object can become invalid
if the user deletes the breakpoint.  In this case, the object still
exists, but the underlying breakpoint does not.  In the cases of
watchpoint scope, the watchpoint remains valid even if execution of the
inferior leaves the scope of that watchpoint.
@end deffn

@deffn {Scheme Procedure} breakpoint-number breakpoint
Return the breakpoint's number --- the identifier used by
the user to manipulate the breakpoint.
@end deffn

@deffn {Scheme Procedure} breakpoint-type breakpoint
Return the breakpoint's type --- the identifier used to
determine the actual breakpoint type or use-case.
@end deffn

@deffn {Scheme Procedure} breakpoint-visible? breakpoint
Return @code{#t} if the breakpoint is visible to the user
when hit, or when the @samp{info breakpoints} command is run.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} breakpoint-location breakpoint
Return the location of the breakpoint, as specified by
the user.  It is a string.  If the breakpoint does not have a location
(that is, it is a watchpoint) return @code{#f}.
@end deffn

@deffn {Scheme Procedure} breakpoint-expression breakpoint
Return the breakpoint expression, as specified by the user.  It is a string.
If the breakpoint does not have an expression (the breakpoint is not a
watchpoint) return @code{#f}.
@end deffn

@deffn {Scheme Procedure} breakpoint-enabled? breakpoint
Return @code{#t} if the breakpoint is enabled, and @code{#f} otherwise.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-enabled! breakpoint flag
Set the enabled state of @var{breakpoint} to @var{flag}.
If flag is @code{#f} it is disabled, otherwise it is enabled.
@end deffn

@deffn {Scheme Procedure} breakpoint-silent? breakpoint
Return @code{#t} if the breakpoint is silent, and @code{#f} otherwise.

Note that a breakpoint can also be silent if it has commands and the
first command is @code{silent}.  This is not reported by the
@code{silent} attribute.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-silent! breakpoint flag
Set the silent state of @var{breakpoint} to @var{flag}.
If flag is @code{#f} the breakpoint is made silent,
otherwise it is made non-silent (or noisy).
@end deffn

@deffn {Scheme Procedure} breakpoint-ignore-count breakpoint
Return the ignore count for @var{breakpoint}.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-ignore-count! breakpoint count
Set the ignore count for @var{breakpoint} to @var{count}.
@end deffn

@deffn {Scheme Procedure} breakpoint-hit-count breakpoint
Return hit count of @var{breakpoint}.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-hit-count! breakpoint count
Set the hit count of @var{breakpoint} to @var{count}.
At present, @var{count} must be zero.
@end deffn

@deffn {Scheme Procedure} breakpoint-thread breakpoint
Return the global-thread-id for thread-specific breakpoint
@var{breakpoint}.  Return #f if @var{breakpoint} is not
thread-specific.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-thread! breakpoint global-thread-id|#f
Set the thread-id for @var{breakpoint} to @var{global-thread-id} If
set to @code{#f}, the breakpoint is no longer thread-specific.
@end deffn

@deffn {Scheme Procedure} breakpoint-task breakpoint
If the breakpoint is Ada task-specific, return the Ada task id.
If the breakpoint is not task-specific (or the underlying
language is not Ada), return @code{#f}.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-task! breakpoint task
Set the Ada task of @var{breakpoint} to @var{task}.
If set to @code{#f}, the breakpoint is no longer task-specific.
@end deffn

@deffn {Scheme Procedure} breakpoint-condition breakpoint
Return the condition of @var{breakpoint}, as specified by the user.
It is a string.  If there is no condition, return @code{#f}.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-condition! breakpoint condition
Set the condition of @var{breakpoint} to @var{condition},
which must be a string.  If set to @code{#f} then the breakpoint
becomes unconditional.
@end deffn

@deffn {Scheme Procedure} breakpoint-stop breakpoint
Return the stop predicate of @var{breakpoint}.
See @code{set-breakpoint-stop!} below in this section.
@end deffn

@deffn {Scheme Procedure} set-breakpoint-stop! breakpoint procedure|#f
Set the stop predicate of @var{breakpoint}.  The predicate
@var{procedure} takes one argument: the <gdb:breakpoint> object.
If this predicate is set to a procedure then it is invoked whenever
the inferior reaches this breakpoint.  If it returns @code{#t},
or any non-@code{#f} value, then the inferior is stopped,
otherwise the inferior will continue.

If there are multiple breakpoints at the same location with a
@code{stop} predicate, each one will be called regardless of the
return status of the previous.  This ensures that all @code{stop}
predicates have a chance to execute at that location.  In this scenario
if one of the methods returns @code{#t} but the others return
@code{#f}, the inferior will still be stopped.

You should not alter the execution state of the inferior (i.e.@:, step,
next, etc.), alter the current frame context (i.e.@:, change the current
active frame), or alter, add or delete any breakpoint.  As a general
rule, you should not alter any data within @value{GDBN} or the inferior
at this time.

Example @code{stop} implementation:

@smallexample
(define (my-stop? bkpt)
  (let ((int-val (parse-and-eval "foo")))
    (value=? int-val 3)))
(define bkpt (make-breakpoint "main.c:42"))
(register-breakpoint! bkpt)
(set-breakpoint-stop! bkpt my-stop?)
@end smallexample
@end deffn

@deffn {Scheme Procedure} breakpoint-commands breakpoint
Return the commands attached to @var{breakpoint} as a string,
or @code{#f} if there are none.
@end deffn

@node Lazy Strings In Guile
@subsubsection Guile representation of lazy strings.

@cindex lazy strings in guile
@tindex <gdb:lazy-string>

A @dfn{lazy string} is a string whose contents is not retrieved or
encoded until it is needed.

A @code{<gdb:lazy-string>} is represented in @value{GDBN} as an
@code{address} that points to a region of memory, an @code{encoding}
that will be used to encode that region of memory, and a @code{length}
to delimit the region of memory that represents the string.  The
difference between a @code{<gdb:lazy-string>} and a string wrapped within
a @code{<gdb:value>} is that a @code{<gdb:lazy-string>} will be treated
differently by @value{GDBN} when printing.  A @code{<gdb:lazy-string>} is
retrieved and encoded during printing, while a @code{<gdb:value>}
wrapping a string is immediately retrieved and encoded on creation.

The following lazy-string-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} lazy-string? object
Return @code{#t} if @var{object} is an object of type @code{<gdb:lazy-string>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} lazy-string-address lazy-sring
Return the address of @var{lazy-string}.
@end deffn

@deffn {Scheme Procedure} lazy-string-length lazy-string
Return the length of @var{lazy-string} in characters.  If the
length is -1, then the string will be fetched and encoded up to the
first null of appropriate width.
@end deffn

@deffn {Scheme Procedure} lazy-string-encoding lazy-string
Return the encoding that will be applied to @var{lazy-string}
when the string is printed by @value{GDBN}.  If the encoding is not
set, or contains an empty string,  then @value{GDBN} will select the
most appropriate encoding when the string is printed.
@end deffn

@deffn {Scheme Procedure} lazy-string-type lazy-string
Return the type that is represented by @var{lazy-string}'s type.
For a lazy string this is a pointer or array type.  To
resolve this to the lazy string's character type, use @code{type-target-type}.
@xref{Types In Guile}.
@end deffn

@deffn {Scheme Procedure} lazy-string->value lazy-string
Convert the @code{<gdb:lazy-string>} to a @code{<gdb:value>}.  This value
will point to the string in memory, but will lose all the delayed
retrieval, encoding and handling that @value{GDBN} applies to a
@code{<gdb:lazy-string>}.
@end deffn

@node Architectures In Guile
@subsubsection Guile representation of architectures

@cindex guile architectures
@tindex <gdb:arch>

@value{GDBN} uses architecture specific parameters and artifacts in a
number of its various computations.  An architecture is represented
by an instance of the @code{<gdb:arch>} class.

The following architecture-related procedures are provided by the
@code{(gdb)} module:

@deffn {Scheme Procedure} arch? object
Return @code{#t} if @var{object} is an object of type @code{<gdb:arch>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} current-arch
Return the current architecture as a @code{<gdb:arch>} object.
@end deffn

@deffn {Scheme Procedure} arch-name arch
Return the name (string value) of @code{<gdb:arch>} @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-charset arch
Return name of target character set of @code{<gdb:arch>} @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-wide-charset
Return name of target wide character set of @code{<gdb:arch>} @var{arch}.
@end deffn

Each architecture provides a set of predefined types, obtained by
the following functions.

@deffn {Scheme Procedure} arch-void-type arch
Return the @code{<gdb:type>} object for a @code{void} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-char-type arch
Return the @code{<gdb:type>} object for a @code{char} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-short-type arch
Return the @code{<gdb:type>} object for a @code{short} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-int-type arch
Return the @code{<gdb:type>} object for an @code{int} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-long-type arch
Return the @code{<gdb:type>} object for a @code{long} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-schar-type arch
Return the @code{<gdb:type>} object for a @code{signed char} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-uchar-type arch
Return the @code{<gdb:type>} object for an @code{unsigned char} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-ushort-type arch
Return the @code{<gdb:type>} object for an @code{unsigned short} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-uint-type arch
Return the @code{<gdb:type>} object for an @code{unsigned int} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-ulong-type arch
Return the @code{<gdb:type>} object for an @code{unsigned long} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-float-type arch
Return the @code{<gdb:type>} object for a @code{float} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-double-type arch
Return the @code{<gdb:type>} object for a @code{double} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-longdouble-type arch
Return the @code{<gdb:type>} object for a @code{long double} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-bool-type arch
Return the @code{<gdb:type>} object for a @code{bool} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-longlong-type arch
Return the @code{<gdb:type>} object for a @code{long long} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-ulonglong-type arch
Return the @code{<gdb:type>} object for an @code{unsigned long long} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-int8-type arch
Return the @code{<gdb:type>} object for an @code{int8} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-uint8-type arch
Return the @code{<gdb:type>} object for a @code{uint8} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-int16-type arch
Return the @code{<gdb:type>} object for an @code{int16} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-uint16-type arch
Return the @code{<gdb:type>} object for a @code{uint16} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-int32-type arch
Return the @code{<gdb:type>} object for an @code{int32} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-uint32-type arch
Return the @code{<gdb:type>} object for a @code{uint32} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-int64-type arch
Return the @code{<gdb:type>} object for an @code{int64} type
of architecture @var{arch}.
@end deffn

@deffn {Scheme Procedure} arch-uint64-type arch
Return the @code{<gdb:type>} object for a @code{uint64} type
of architecture @var{arch}.
@end deffn

Example:

@smallexample
(gdb) guile (type-name (arch-uchar-type (current-arch)))
"unsigned char"
@end smallexample

@node Disassembly In Guile
@subsubsection Disassembly In Guile

The disassembler can be invoked from Scheme code.
Furthermore, the disassembler can take a Guile port as input,
allowing one to disassemble from any source, and not just target memory.

@c TODO: line length
@deffn {Scheme Procedure} arch-disassemble arch start-pc @r{[}#:port port@r{]} @r{[}#:offset offset@r{]} @r{[}#:size size@r{]} @r{[}#:count count@r{]}
Return a list of disassembled instructions starting from the memory
address @var{start-pc}.

The optional argument @var{port} specifies the input port to read bytes from.
If @var{port} is @code{#f} then bytes are read from target memory.

The optional argument @var{offset} specifies the address offset of the
first byte in @var{port}.  This is useful, for example, when @var{port}
specifies a @samp{bytevector} and you want the bytevector to be disassembled
as if it came from that address.  The @var{start-pc} passed to the reader
for @var{port} is offset by the same amount.

Example:
@smallexample
(gdb) guile (use-modules (rnrs io ports))
(gdb) guile (define pc (value->integer (parse-and-eval "$pc")))
(gdb) guile (define mem (open-memory #:start pc))
(gdb) guile (define bv (get-bytevector-n mem 10))
(gdb) guile (define bv-port (open-bytevector-input-port bv))
(gdb) guile (define arch (current-arch))
(gdb) guile (arch-disassemble arch pc #:port bv-port #:offset pc)
(((address . 4195516) (asm . "mov    $0x4005c8,%edi") (length . 5)))
@end smallexample

The optional arguments @var{size} and
@var{count} determine the number of instructions in the returned list.
If either @var{size} or @var{count} is specified as zero, then
no instructions are disassembled and an empty list is returned.
If both the optional arguments @var{size} and @var{count} are
specified, then a list of at most @var{count} disassembled instructions
whose start address falls in the closed memory address interval from
@var{start-pc} to (@var{start-pc} + @var{size} - 1) are returned.
If @var{size} is not specified, but @var{count} is specified,
then @var{count} number of instructions starting from the address
@var{start-pc} are returned.  If @var{count} is not specified but
@var{size} is specified, then all instructions whose start address
falls in the closed memory address interval from @var{start-pc} to
(@var{start-pc} + @var{size} - 1) are returned.
If neither @var{size} nor @var{count} are specified, then a single
instruction at @var{start-pc} is returned.

Each element of the returned list is an alist (associative list)
with the following keys:

@table @code

@item address
The value corresponding to this key is a Guile integer of
the memory address of the instruction.

@item asm
The value corresponding to this key is a string value which represents
the instruction with assembly language mnemonics.  The assembly
language flavor used is the same as that specified by the current CLI
variable @code{disassembly-flavor}.  @xref{Machine Code}.

@item length
The value corresponding to this key is the length of the instruction in bytes.

@end table
@end deffn

@node I/O Ports in Guile
@subsubsection I/O Ports in Guile

@deffn {Scheme Procedure} input-port
Return @value{GDBN}'s input port as a Guile port object.
@end deffn

@deffn {Scheme Procedure} output-port
Return @value{GDBN}'s output port as a Guile port object.
@end deffn

@deffn {Scheme Procedure} error-port
Return @value{GDBN}'s error port as a Guile port object.
@end deffn

@deffn {Scheme Procedure} stdio-port? object
Return @code{#t} if @var{object} is a @value{GDBN} stdio port.
Otherwise return @code{#f}.
@end deffn

@node Memory Ports in Guile
@subsubsection Memory Ports in Guile

@value{GDBN} provides a @code{port} interface to target memory.
This allows Guile code to read/write target memory using Guile's port and
bytevector functionality.  The main routine is @code{open-memory} which
returns a port object.  One can then read/write memory using that object.

@deffn {Scheme Procedure} open-memory @r{[}#:mode mode{]} @r{[}#:start address{]} @r{[}#:size size{]}
Return a port object that can be used for reading and writing memory.
The port will be open according to @var{mode}, which is the standard
mode argument to Guile port open routines, except that the @samp{"a"}
and @samp{"l"} modes are not supported.
@xref{File Ports,,, guile, GNU Guile Reference Manual}.
The @samp{"b"} (binary) character may be present, but is ignored:
memory ports are binary only.  If @samp{"0"} is appended then
the port is marked as unbuffered.
The default is @samp{"r"}, read-only and buffered.

The chunk of memory that can be accessed can be bounded.
If both @var{start} and @var{size} are unspecified, all of memory can be
accessed.  If only @var{start} is specified, all of memory from that point
on can be accessed.  If only @var{size} if specified, all memory in the
range [0,@var{size}) can be accessed.  If both are specified, all memory
in the rane [@var{start},@var{start}+@var{size}) can be accessed.
@end deffn

@deffn {Scheme Procedure} memory-port?
Return @code{#t} if @var{object} is an object of type @code{<gdb:memory-port>}.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} memory-port-range memory-port
Return the range of @code{<gdb:memory-port>} @var{memory-port} as a list
of two elements: @code{(start end)}.  The range is @var{start} to @var{end}
inclusive.
@end deffn

@deffn {Scheme Procedure} memory-port-read-buffer-size memory-port
Return the size of the read buffer of @code{<gdb:memory-port>}
@var{memory-port}.
@end deffn

@deffn {Scheme Procedure} set-memory-port-read-buffer-size! memory-port size
Set the size of the read buffer of @code{<gdb:memory-port>}
@var{memory-port} to @var{size}.  The result is unspecified.
@end deffn

@deffn {Scheme Procedure} memory-port-write-buffer-size memory-port
Return the size of the write buffer of @code{<gdb:memory-port>}
@var{memory-port}.
@end deffn

@deffn {Scheme Procedure} set-memory-port-write-buffer-size! memory-port size
Set the size of the write buffer of @code{<gdb:memory-port>}
@var{memory-port} to @var{size}.  The result is unspecified.
@end deffn

A memory port is closed like any other port, with @code{close-port}.

Combined with Guile's @code{bytevectors}, memory ports provide a lot
of utility.  For example, to fill a buffer of 10 integers in memory,
one can do something like the following.

@smallexample
;; In the program: int buffer[10];
(use-modules (rnrs bytevectors))
(use-modules (rnrs io ports))
(define addr (parse-and-eval "buffer"))
(define n 10)
(define byte-size (* n 4))
(define mem-port (open-memory #:mode "r+" #:start
                              (value->integer addr) #:size byte-size))
(define byte-vec (make-bytevector byte-size))
(do ((i 0 (+ i 1)))
    ((>= i n))
    (bytevector-s32-native-set! byte-vec (* i 4) (* i 42)))
(put-bytevector mem-port byte-vec)
(close-port mem-port)
@end smallexample

@node Iterators In Guile
@subsubsection Iterators In Guile

@cindex guile iterators
@tindex <gdb:iterator>

A simple iterator facility is provided to allow, for example,
iterating over the set of program symbols without having to first
construct a list of all of them.  A useful contribution would be
to add support for SRFI 41 and SRFI 45.

@deffn {Scheme Procedure} make-iterator object progress next!
A @code{<gdb:iterator>} object is constructed with the @code{make-iterator}
procedure.  It takes three arguments: the object to be iterated over,
an object to record the progress of the iteration, and a procedure to
return the next element in the iteration, or an implementation chosen value
to denote the end of iteration.

By convention, end of iteration is marked with @code{(end-of-iteration)},
and may be tested with the @code{end-of-iteration?} predicate.
The result of @code{(end-of-iteration)} is chosen so that it is not
otherwise used by the @code{(gdb)} module.  If you are using
@code{<gdb:iterator>} in your own code it is your responsibility to
maintain this invariant.

A trivial example for illustration's sake:

@smallexample
(use-modules (gdb iterator))
(define my-list (list 1 2 3))
(define iter
  (make-iterator my-list my-list
                 (lambda (iter)
                   (let ((l (iterator-progress iter)))
                     (if (eq? l '())
                         (end-of-iteration)
                         (begin
                           (set-iterator-progress! iter (cdr l))
                           (car l)))))))
@end smallexample

Here is a slightly more realistic example, which computes a list of all the
functions in @code{my-global-block}.

@smallexample
(use-modules (gdb iterator))
(define this-sal (find-pc-line (frame-pc (selected-frame))))
(define this-symtab (sal-symtab this-sal))
(define this-global-block (symtab-global-block this-symtab))
(define syms-iter (make-block-symbols-iterator this-global-block))
(define functions (iterator-filter symbol-function? syms-iter))
@end smallexample
@end deffn

@deffn {Scheme Procedure} iterator? object
Return @code{#t} if @var{object} is a @code{<gdb:iterator>} object.
Otherwise return @code{#f}.
@end deffn

@deffn {Scheme Procedure} iterator-object iterator
Return the first argument that was passed to @code{make-iterator}.
This is the object being iterated over.
@end deffn

@deffn {Scheme Procedure} iterator-progress iterator
Return the object tracking iteration progress.
@end deffn

@deffn {Scheme Procedure} set-iterator-progress! iterator new-value
Set the object tracking iteration progress.
@end deffn

@deffn {Scheme Procedure} iterator-next! iterator
Invoke the procedure that was the third argument to @code{make-iterator},
passing it one argument, the @code{<gdb:iterator>} object.
The result is either the next element in the iteration, or an end
marker as implemented by the @code{next!} procedure.
By convention the end marker is the result of @code{(end-of-iteration)}.
@end deffn

@deffn {Scheme Procedure} end-of-iteration
Return the Scheme object that denotes end of iteration.
@end deffn

@deffn {Scheme Procedure} end-of-iteration? object
Return @code{#t} if @var{object} is the end of iteration marker.
Otherwise return @code{#f}.
@end deffn

These functions are provided by the @code{(gdb iterator)} module to
assist in using iterators.

@deffn {Scheme Procedure} make-list-iterator list
Return a @code{<gdb:iterator>} object that will iterate over @var{list}.
@end deffn

@deffn {Scheme Procedure} iterator->list iterator
Return the elements pointed to by @var{iterator} as a list.
@end deffn

@deffn {Scheme Procedure} iterator-map proc iterator
Return the list of objects obtained by applying @var{proc} to the object
pointed to by @var{iterator} and to each subsequent object.
@end deffn

@deffn {Scheme Procedure} iterator-for-each proc iterator
Apply @var{proc} to each element pointed to by @var{iterator}.
The result is unspecified.
@end deffn

@deffn {Scheme Procedure} iterator-filter pred iterator
Return the list of elements pointed to by @var{iterator} that satisfy
@var{pred}.
@end deffn

@deffn {Scheme Procedure} iterator-until pred iterator
Run @var{iterator} until the result of @code{(pred element)} is true
and return that as the result.  Otherwise return @code{#f}.
@end deffn

@node Guile Auto-loading
@subsection Guile Auto-loading
@cindex guile auto-loading

When a new object file is read (for example, due to the @code{file}
command, or because the inferior has loaded a shared library),
@value{GDBN} will look for Guile support scripts in two ways:
@file{@var{objfile}-gdb.scm} and the @code{.debug_gdb_scripts} section.
@xref{Auto-loading extensions}.

The auto-loading feature is useful for supplying application-specific
debugging commands and scripts.

Auto-loading can be enabled or disabled,
and the list of auto-loaded scripts can be printed.

@table @code
@anchor{set auto-load guile-scripts}
@kindex set auto-load guile-scripts
@item set auto-load guile-scripts [on|off]
Enable or disable the auto-loading of Guile scripts.

@anchor{show auto-load guile-scripts}
@kindex show auto-load guile-scripts
@item show auto-load guile-scripts
Show whether auto-loading of Guile scripts is enabled or disabled.

@anchor{info auto-load guile-scripts}
@kindex info auto-load guile-scripts
@cindex print list of auto-loaded Guile scripts
@item info auto-load guile-scripts [@var{regexp}]
Print the list of all Guile scripts that @value{GDBN} auto-loaded.

Also printed is the list of Guile scripts that were mentioned in
the @code{.debug_gdb_scripts} section and were not found.
This is useful because their names are not printed when @value{GDBN}
tries to load them and fails.  There may be many of them, and printing
an error message for each one is problematic.

If @var{regexp} is supplied only Guile scripts with matching names are printed.

Example:

@smallexample
(gdb) info auto-load guile-scripts
Loaded Script
Yes    scm-section-script.scm
       full name: /tmp/scm-section-script.scm
No     my-foo-pretty-printers.scm
@end smallexample
@end table

When reading an auto-loaded file, @value{GDBN} sets the
@dfn{current objfile}.  This is available via the @code{current-objfile}
procedure (@pxref{Objfiles In Guile}).  This can be useful for
registering objfile-specific pretty-printers.

@node Guile Modules
@subsection Guile Modules
@cindex guile modules

@value{GDBN} comes with several modules to assist writing Guile code.

@menu
* Guile Printing Module::  Building and registering pretty-printers
* Guile Types Module::     Utilities for working with types
@end menu

@node Guile Printing Module
@subsubsection Guile Printing Module

This module provides a collection of utilities for working with
pretty-printers.

Usage:

@smallexample
(use-modules (gdb printing))
@end smallexample

@deffn {Scheme Procedure} prepend-pretty-printer! object printer
Add @var{printer} to the front of the list of pretty-printers for
@var{object}.  The @var{object} must either be a @code{<gdb:objfile>} object,
or @code{#f} in which case @var{printer} is added to the global list of
printers.
@end deffn

@deffn {Scheme Procecure} append-pretty-printer! object printer
Add @var{printer} to the end of the list of pretty-printers for
@var{object}.  The @var{object} must either be a @code{<gdb:objfile>} object,
or @code{#f} in which case @var{printer} is added to the global list of
printers.
@end deffn

@node Guile Types Module
@subsubsection Guile Types Module

This module provides a collection of utilities for working with
@code{<gdb:type>} objects.

Usage:

@smallexample
(use-modules (gdb types))
@end smallexample

@deffn {Scheme Procedure} get-basic-type type
Return @var{type} with const and volatile qualifiers stripped,
and with typedefs and C@t{++} references converted to the underlying type.

C@t{++} example:

@smallexample
typedef const int const_int;
const_int foo (3);
const_int& foo_ref (foo);
int main () @{ return 0; @}
@end smallexample

Then in gdb:

@smallexample
(gdb) start
(gdb) guile (use-modules (gdb) (gdb types))
(gdb) guile (define foo-ref (parse-and-eval "foo_ref"))
(gdb) guile (get-basic-type (value-type foo-ref))
int
@end smallexample
@end deffn

@deffn {Scheme Procedure} type-has-field-deep? type field
Return @code{#t} if @var{type}, assumed to be a type with fields
(e.g., a structure or union), has field @var{field}.
Otherwise return @code{#f}.
This searches baseclasses, whereas @code{type-has-field?} does not.
@end deffn

@deffn {Scheme Procedure} make-enum-hashtable enum-type
Return a Guile hash table produced from @var{enum-type}.
Elements in the hash table are referenced with @code{hashq-ref}.
@end deffn
