| Index: gdb/doc/gdbint.info-1 | 
| diff --git a/gdb/doc/gdbint.info-1 b/gdb/doc/gdbint.info-1 | 
| deleted file mode 100644 | 
| index 21e048eb0542909c205a599f8166728c86b89254..0000000000000000000000000000000000000000 | 
| --- a/gdb/doc/gdbint.info-1 | 
| +++ /dev/null | 
| @@ -1,7302 +0,0 @@ | 
| -This is gdbint.info, produced by makeinfo version 4.8 from | 
| -./gdbint.texinfo. | 
| - | 
| -INFO-DIR-SECTION Software development | 
| -START-INFO-DIR-ENTRY | 
| -* Gdb-Internals: (gdbint).	The GNU debugger's internals. | 
| -END-INFO-DIR-ENTRY | 
| - | 
| -   Copyright (C) 1990-1994, 1996, 1998-2006, 2008-2012 Free Software | 
| -Foundation, Inc.  Contributed by Cygnus Solutions.  Written by John | 
| -Gilmore.  Second Edition by Stan Shebs. | 
| - | 
| -   Permission is granted to copy, distribute and/or modify this document | 
| -under the terms of the GNU Free Documentation License, Version 1.3 or | 
| -any later version published by the Free Software Foundation; with no | 
| -Invariant Sections, with no Front-Cover Texts, and with no Back-Cover | 
| -Texts.  A copy of the license is included in the section entitled "GNU | 
| -Free Documentation License". | 
| - | 
| -   This file documents the internals of the GNU debugger GDB. | 
| - | 
| -   Copyright (C) 1990-1994, 1996, 1998-2006, 2008-2012 Free Software | 
| -Foundation, Inc.  Contributed by Cygnus Solutions.  Written by John | 
| -Gilmore.  Second Edition by Stan Shebs. | 
| - | 
| -   Permission is granted to copy, distribute and/or modify this document | 
| -under the terms of the GNU Free Documentation License, Version 1.3 or | 
| -any later version published by the Free Software Foundation; with no | 
| -Invariant Sections, with no Front-Cover Texts, and with no Back-Cover | 
| -Texts.  A copy of the license is included in the section entitled "GNU | 
| -Free Documentation License". | 
| - | 
| - | 
| -File: gdbint.info,  Node: Top,  Next: Summary,  Up: (dir) | 
| - | 
| -Scope of this Document | 
| -********************** | 
| - | 
| -This document documents the internals of the GNU debugger, GDB.  It | 
| -includes description of GDB's key algorithms and operations, as well as | 
| -the mechanisms that adapt GDB to specific hosts and targets. | 
| - | 
| -* Menu: | 
| - | 
| -* Summary:: | 
| -* Overall Structure:: | 
| -* Algorithms:: | 
| -* User Interface:: | 
| -* libgdb:: | 
| -* Values:: | 
| -* Stack Frames:: | 
| -* Symbol Handling:: | 
| -* Language Support:: | 
| -* Host Definition:: | 
| -* Target Architecture Definition:: | 
| -* Target Descriptions:: | 
| -* Target Vector Definition:: | 
| -* Native Debugging:: | 
| -* Support Libraries:: | 
| -* Coding Standards:: | 
| -* Misc Guidelines:: | 
| -* Porting GDB:: | 
| -* Versions and Branches:: | 
| -* Start of New Year Procedure:: | 
| -* Releasing GDB:: | 
| -* Testsuite:: | 
| -* Hints:: | 
| - | 
| -* GDB Observers::  GDB Currently available observers | 
| -* GNU Free Documentation License::  The license for this documentation | 
| -* Concept Index:: | 
| -* Function and Variable Index:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: Summary,  Next: Overall Structure,  Prev: Top,  Up: Top | 
| - | 
| -1 Summary | 
| -********* | 
| - | 
| -* Menu: | 
| - | 
| -* Requirements:: | 
| -* Contributors:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: Requirements,  Next: Contributors,  Up: Summary | 
| - | 
| -1.1 Requirements | 
| -================ | 
| - | 
| -Before diving into the internals, you should understand the formal | 
| -requirements and other expectations for GDB.  Although some of these | 
| -may seem obvious, there have been proposals for GDB that have run | 
| -counter to these requirements. | 
| - | 
| -   First of all, GDB is a debugger.  It's not designed to be a front | 
| -panel for embedded systems.  It's not a text editor.  It's not a shell. | 
| -It's not a programming environment. | 
| - | 
| -   GDB is an interactive tool.  Although a batch mode is available, | 
| -GDB's primary role is to interact with a human programmer. | 
| - | 
| -   GDB should be responsive to the user.  A programmer hot on the trail | 
| -of a nasty bug, and operating under a looming deadline, is going to be | 
| -very impatient of everything, including the response time to debugger | 
| -commands. | 
| - | 
| -   GDB should be relatively permissive, such as for expressions.  While | 
| -the compiler should be picky (or have the option to be made picky), | 
| -since source code lives for a long time usually, the programmer doing | 
| -debugging shouldn't be spending time figuring out to mollify the | 
| -debugger. | 
| - | 
| -   GDB will be called upon to deal with really large programs. | 
| -Executable sizes of 50 to 100 megabytes occur regularly, and we've | 
| -heard reports of programs approaching 1 gigabyte in size. | 
| - | 
| -   GDB should be able to run everywhere.  No other debugger is | 
| -available for even half as many configurations as GDB supports. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Contributors,  Prev: Requirements,  Up: Summary | 
| - | 
| -1.2 Contributors | 
| -================ | 
| - | 
| -The first edition of this document was written by John Gilmore of | 
| -Cygnus Solutions. The current second edition was written by Stan Shebs | 
| -of Cygnus Solutions, who continues to update the manual. | 
| - | 
| -   Over the years, many others have made additions and changes to this | 
| -document. This section attempts to record the significant contributors | 
| -to that effort. One of the virtues of free software is that everyone is | 
| -free to contribute to it; with regret, we cannot actually acknowledge | 
| -everyone here. | 
| - | 
| -     _Plea:_ This section has only been added relatively recently (four | 
| -     years after publication of the second edition). Additions to this | 
| -     section are particularly welcome.  If you or your friends (or | 
| -     enemies, to be evenhanded) have been unfairly omitted from this | 
| -     list, we would like to add your names! | 
| - | 
| -   A document such as this relies on being kept up to date by numerous | 
| -small updates by contributing engineers as they make changes to the | 
| -code base. The file `ChangeLog' in the GDB distribution approximates a | 
| -blow-by-blow account. The most prolific contributors to this important, | 
| -but low profile task are Andrew Cagney (responsible for over half the | 
| -entries), Daniel Jacobowitz, Mark Kettenis, Jim Blandy and Eli | 
| -Zaretskii. | 
| - | 
| -   Eli Zaretskii and Daniel Jacobowitz wrote the sections documenting | 
| -watchpoints. | 
| - | 
| -   Jeremy Bennett updated the sections on initializing a new | 
| -architecture and register representation, and added the section on | 
| -Frame Interpretation. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Overall Structure,  Next: Algorithms,  Prev: Summary,  Up: Top | 
| - | 
| -2 Overall Structure | 
| -******************* | 
| - | 
| -GDB consists of three major subsystems: user interface, symbol handling | 
| -(the "symbol side"), and target system handling (the "target side"). | 
| - | 
| -   The user interface consists of several actual interfaces, plus | 
| -supporting code. | 
| - | 
| -   The symbol side consists of object file readers, debugging info | 
| -interpreters, symbol table management, source language expression | 
| -parsing, type and value printing. | 
| - | 
| -   The target side consists of execution control, stack frame analysis, | 
| -and physical target manipulation. | 
| - | 
| -   The target side/symbol side division is not formal, and there are a | 
| -number of exceptions.  For instance, core file support involves symbolic | 
| -elements (the basic core file reader is in BFD) and target elements (it | 
| -supplies the contents of memory and the values of registers).  Instead, | 
| -this division is useful for understanding how the minor subsystems | 
| -should fit together. | 
| - | 
| -2.1 The Symbol Side | 
| -=================== | 
| - | 
| -The symbolic side of GDB can be thought of as "everything you can do in | 
| -GDB without having a live program running".  For instance, you can look | 
| -at the types of variables, and evaluate many kinds of expressions. | 
| - | 
| -2.2 The Target Side | 
| -=================== | 
| - | 
| -The target side of GDB is the "bits and bytes manipulator".  Although | 
| -it may make reference to symbolic info here and there, most of the | 
| -target side will run with only a stripped executable available--or even | 
| -no executable at all, in remote debugging cases. | 
| - | 
| -   Operations such as disassembly, stack frame crawls, and register | 
| -display, are able to work with no symbolic info at all.  In some cases, | 
| -such as disassembly, GDB will use symbolic info to present addresses | 
| -relative to symbols rather than as raw numbers, but it will work either | 
| -way. | 
| - | 
| -2.3 Configurations | 
| -================== | 
| - | 
| -"Host" refers to attributes of the system where GDB runs.  "Target" | 
| -refers to the system where the program being debugged executes.  In | 
| -most cases they are the same machine, in which case a third type of | 
| -"Native" attributes come into play. | 
| - | 
| -   Defines and include files needed to build on the host are host | 
| -support.  Examples are tty support, system defined types, host byte | 
| -order, host float format.  These are all calculated by `autoconf' when | 
| -the debugger is built. | 
| - | 
| -   Defines and information needed to handle the target format are target | 
| -dependent.  Examples are the stack frame format, instruction set, | 
| -breakpoint instruction, registers, and how to set up and tear down the | 
| -stack to call a function. | 
| - | 
| -   Information that is only needed when the host and target are the | 
| -same, is native dependent.  One example is Unix child process support; | 
| -if the host and target are not the same, calling `fork' to start the | 
| -target process is a bad idea.  The various macros needed for finding the | 
| -registers in the `upage', running `ptrace', and such are all in the | 
| -native-dependent files. | 
| - | 
| -   Another example of native-dependent code is support for features that | 
| -are really part of the target environment, but which require `#include' | 
| -files that are only available on the host system.  Core file handling | 
| -and `setjmp' handling are two common cases. | 
| - | 
| -   When you want to make GDB work as the traditional native debugger on | 
| -a system, you will need to supply both target and native information. | 
| - | 
| -2.4 Source Tree Structure | 
| -========================= | 
| - | 
| -The GDB source directory has a mostly flat structure--there are only a | 
| -few subdirectories.  A file's name usually gives a hint as to what it | 
| -does; for example, `stabsread.c' reads stabs, `dwarf2read.c' reads | 
| -DWARF 2, etc. | 
| - | 
| -   Files that are related to some common task have names that share | 
| -common substrings.  For example, `*-thread.c' files deal with debugging | 
| -threads on various platforms; `*read.c' files deal with reading various | 
| -kinds of symbol and object files; `inf*.c' files deal with direct | 
| -control of the "inferior program" (GDB parlance for the program being | 
| -debugged). | 
| - | 
| -   There are several dozens of files in the `*-tdep.c' family.  `tdep' | 
| -stands for "target-dependent code"--each of these files implements | 
| -debug support for a specific target architecture (sparc, mips, etc). | 
| -Usually, only one of these will be used in a specific GDB configuration | 
| -(sometimes two, closely related). | 
| - | 
| -   Similarly, there are many `*-nat.c' files, each one for native | 
| -debugging on a specific system (e.g., `sparc-linux-nat.c' is for native | 
| -debugging of Sparc machines running the Linux kernel). | 
| - | 
| -   The few subdirectories of the source tree are: | 
| - | 
| -`cli' | 
| -     Code that implements "CLI", the GDB Command-Line Interpreter. | 
| -     *Note Command Interpreter: User Interface. | 
| - | 
| -`gdbserver' | 
| -     Code for the GDB remote server. | 
| - | 
| -`gdbtk' | 
| -     Code for Insight, the GDB TK-based GUI front-end. | 
| - | 
| -`mi' | 
| -     The "GDB/MI", the GDB Machine Interface interpreter. | 
| - | 
| -`signals' | 
| -     Target signal translation code. | 
| - | 
| -`tui' | 
| -     Code for "TUI", the GDB Text-mode full-screen User Interface. | 
| -     *Note TUI: User Interface. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Algorithms,  Next: User Interface,  Prev: Overall Structure,  Up: Top | 
| - | 
| -3 Algorithms | 
| -************ | 
| - | 
| -GDB uses a number of debugging-specific algorithms.  They are often not | 
| -very complicated, but get lost in the thicket of special cases and | 
| -real-world issues.  This chapter describes the basic algorithms and | 
| -mentions some of the specific target definitions that they use. | 
| - | 
| -3.1 Prologue Analysis | 
| -===================== | 
| - | 
| -To produce a backtrace and allow the user to manipulate older frames' | 
| -variables and arguments, GDB needs to find the base addresses of older | 
| -frames, and discover where those frames' registers have been saved. | 
| -Since a frame's "callee-saves" registers get saved by younger frames if | 
| -and when they're reused, a frame's registers may be scattered | 
| -unpredictably across younger frames.  This means that changing the | 
| -value of a register-allocated variable in an older frame may actually | 
| -entail writing to a save slot in some younger frame. | 
| - | 
| -   Modern versions of GCC emit Dwarf call frame information ("CFI"), | 
| -which describes how to find frame base addresses and saved registers. | 
| -But CFI is not always available, so as a fallback GDB uses a technique | 
| -called "prologue analysis" to find frame sizes and saved registers.  A | 
| -prologue analyzer disassembles the function's machine code starting | 
| -from its entry point, and looks for instructions that allocate frame | 
| -space, save the stack pointer in a frame pointer register, save | 
| -registers, and so on.  Obviously, this can't be done accurately in | 
| -general, but it's tractable to do well enough to be very helpful. | 
| -Prologue analysis predates the GNU toolchain's support for CFI; at one | 
| -time, prologue analysis was the only mechanism GDB used for stack | 
| -unwinding at all, when the function calling conventions didn't specify | 
| -a fixed frame layout. | 
| - | 
| -   In the olden days, function prologues were generated by hand-written, | 
| -target-specific code in GCC, and treated as opaque and untouchable by | 
| -optimizers.  Looking at this code, it was usually straightforward to | 
| -write a prologue analyzer for GDB that would accurately understand all | 
| -the prologues GCC would generate.  However, over time GCC became more | 
| -aggressive about instruction scheduling, and began to understand more | 
| -about the semantics of the prologue instructions themselves; in | 
| -response, GDB's analyzers became more complex and fragile.  Keeping the | 
| -prologue analyzers working as GCC (and the instruction sets themselves) | 
| -evolved became a substantial task. | 
| - | 
| -   To try to address this problem, the code in `prologue-value.h' and | 
| -`prologue-value.c' provides a general framework for writing prologue | 
| -analyzers that are simpler and more robust than ad-hoc analyzers.  When | 
| -we analyze a prologue using the prologue-value framework, we're really | 
| -doing "abstract interpretation" or "pseudo-evaluation": running the | 
| -function's code in simulation, but using conservative approximations of | 
| -the values registers and memory would hold when the code actually runs. | 
| -For example, if our function starts with the instruction: | 
| - | 
| -     addi r1, 42     # add 42 to r1 | 
| -   we don't know exactly what value will be in `r1' after executing | 
| -this instruction, but we do know it'll be 42 greater than its original | 
| -value. | 
| - | 
| -   If we then see an instruction like: | 
| - | 
| -     addi r1, 22     # add 22 to r1 | 
| -   we still don't know what `r1's' value is, but again, we can say it | 
| -is now 64 greater than its original value. | 
| - | 
| -   If the next instruction were: | 
| - | 
| -     mov r2, r1      # set r2 to r1's value | 
| -   then we can say that `r2's' value is now the original value of `r1' | 
| -plus 64. | 
| - | 
| -   It's common for prologues to save registers on the stack, so we'll | 
| -need to track the values of stack frame slots, as well as the | 
| -registers.  So after an instruction like this: | 
| - | 
| -     mov (fp+4), r2 | 
| -   then we'd know that the stack slot four bytes above the frame pointer | 
| -holds the original value of `r1' plus 64. | 
| - | 
| -   And so on. | 
| - | 
| -   Of course, this can only go so far before it gets unreasonable.  If | 
| -we wanted to be able to say anything about the value of `r1' after the | 
| -instruction: | 
| - | 
| -     xor r1, r3      # exclusive-or r1 and r3, place result in r1 | 
| -   then things would get pretty complex.  But remember, we're just doing | 
| -a conservative approximation; if exclusive-or instructions aren't | 
| -relevant to prologues, we can just say `r1''s value is now "unknown". | 
| -We can ignore things that are too complex, if that loss of information | 
| -is acceptable for our application. | 
| - | 
| -   So when we say "conservative approximation" here, what we mean is an | 
| -approximation that is either accurate, or marked "unknown", but never | 
| -inaccurate. | 
| - | 
| -   Using this framework, a prologue analyzer is simply an interpreter | 
| -for machine code, but one that uses conservative approximations for the | 
| -contents of registers and memory instead of actual values.  Starting | 
| -from the function's entry point, you simulate instructions up to the | 
| -current PC, or an instruction that you don't know how to simulate.  Now | 
| -you can examine the state of the registers and stack slots you've kept | 
| -track of. | 
| - | 
| -   * To see how large your stack frame is, just check the value of the | 
| -     stack pointer register; if it's the original value of the SP minus | 
| -     a constant, then that constant is the stack frame's size.  If the | 
| -     SP's value has been marked as "unknown", then that means the | 
| -     prologue has done something too complex for us to track, and we | 
| -     don't know the frame size. | 
| - | 
| -   * To see where we've saved the previous frame's registers, we just | 
| -     search the values we've tracked -- stack slots, usually, but | 
| -     registers, too, if you want -- for something equal to the | 
| -     register's original value.  If the calling conventions suggest a | 
| -     standard place to save a given register, then we can check there | 
| -     first, but really, anything that will get us back the original | 
| -     value will probably work. | 
| - | 
| -   This does take some work.  But prologue analyzers aren't | 
| -quick-and-simple pattern patching to recognize a few fixed prologue | 
| -forms any more; they're big, hairy functions.  Along with inferior | 
| -function calls, prologue analysis accounts for a substantial portion of | 
| -the time needed to stabilize a GDB port.  So it's worthwhile to look | 
| -for an approach that will be easier to understand and maintain.  In the | 
| -approach described above: | 
| - | 
| -   * It's easier to see that the analyzer is correct: you just see | 
| -     whether the analyzer properly (albeit conservatively) simulates | 
| -     the effect of each instruction. | 
| - | 
| -   * It's easier to extend the analyzer: you can add support for new | 
| -     instructions, and know that you haven't broken anything that | 
| -     wasn't already broken before. | 
| - | 
| -   * It's orthogonal: to gather new information, you don't need to | 
| -     complicate the code for each instruction.  As long as your domain | 
| -     of conservative values is already detailed enough to tell you what | 
| -     you need, then all the existing instruction simulations are | 
| -     already gathering the right data for you. | 
| - | 
| - | 
| -   The file `prologue-value.h' contains detailed comments explaining | 
| -the framework and how to use it. | 
| - | 
| -3.2 Breakpoint Handling | 
| -======================= | 
| - | 
| -In general, a breakpoint is a user-designated location in the program | 
| -where the user wants to regain control if program execution ever reaches | 
| -that location. | 
| - | 
| -   There are two main ways to implement breakpoints; either as | 
| -"hardware" breakpoints or as "software" breakpoints. | 
| - | 
| -   Hardware breakpoints are sometimes available as a builtin debugging | 
| -features with some chips.  Typically these work by having dedicated | 
| -register into which the breakpoint address may be stored.  If the PC | 
| -(shorthand for "program counter") ever matches a value in a breakpoint | 
| -registers, the CPU raises an exception and reports it to GDB. | 
| - | 
| -   Another possibility is when an emulator is in use; many emulators | 
| -include circuitry that watches the address lines coming out from the | 
| -processor, and force it to stop if the address matches a breakpoint's | 
| -address. | 
| - | 
| -   A third possibility is that the target already has the ability to do | 
| -breakpoints somehow; for instance, a ROM monitor may do its own | 
| -software breakpoints.  So although these are not literally "hardware | 
| -breakpoints", from GDB's point of view they work the same; GDB need not | 
| -do anything more than set the breakpoint and wait for something to | 
| -happen. | 
| - | 
| -   Since they depend on hardware resources, hardware breakpoints may be | 
| -limited in number; when the user asks for more, GDB will start trying | 
| -to set software breakpoints.  (On some architectures, notably the | 
| -32-bit x86 platforms, GDB cannot always know whether there's enough | 
| -hardware resources to insert all the hardware breakpoints and | 
| -watchpoints.  On those platforms, GDB prints an error message only when | 
| -the program being debugged is continued.) | 
| - | 
| -   Software breakpoints require GDB to do somewhat more work.  The | 
| -basic theory is that GDB will replace a program instruction with a | 
| -trap, illegal divide, or some other instruction that will cause an | 
| -exception, and then when it's encountered, GDB will take the exception | 
| -and stop the program.  When the user says to continue, GDB will restore | 
| -the original instruction, single-step, re-insert the trap, and continue | 
| -on. | 
| - | 
| -   Since it literally overwrites the program being tested, the program | 
| -area must be writable, so this technique won't work on programs in ROM. | 
| -It can also distort the behavior of programs that examine themselves, | 
| -although such a situation would be highly unusual. | 
| - | 
| -   Also, the software breakpoint instruction should be the smallest | 
| -size of instruction, so it doesn't overwrite an instruction that might | 
| -be a jump target, and cause disaster when the program jumps into the | 
| -middle of the breakpoint instruction.  (Strictly speaking, the | 
| -breakpoint must be no larger than the smallest interval between | 
| -instructions that may be jump targets; perhaps there is an architecture | 
| -where only even-numbered instructions may jumped to.)  Note that it's | 
| -possible for an instruction set not to have any instructions usable for | 
| -a software breakpoint, although in practice only the ARC has failed to | 
| -define such an instruction. | 
| - | 
| -   Basic breakpoint object handling is in `breakpoint.c'.  However, | 
| -much of the interesting breakpoint action is in `infrun.c'. | 
| - | 
| -`target_remove_breakpoint (BP_TGT)' | 
| -`target_insert_breakpoint (BP_TGT)' | 
| -     Insert or remove a software breakpoint at address | 
| -     `BP_TGT->placed_address'.  Returns zero for success, non-zero for | 
| -     failure.  On input, BP_TGT contains the address of the breakpoint, | 
| -     and is otherwise initialized to zero.  The fields of the `struct | 
| -     bp_target_info' pointed to by BP_TGT are updated to contain other | 
| -     information about the breakpoint on output.  The field | 
| -     `placed_address' may be updated if the breakpoint was placed at a | 
| -     related address; the field `shadow_contents' contains the real | 
| -     contents of the bytes where the breakpoint has been inserted, if | 
| -     reading memory would return the breakpoint instead of the | 
| -     underlying memory; the field `shadow_len' is the length of memory | 
| -     cached in `shadow_contents', if any; and the field `placed_size' | 
| -     is optionally set and used by the target, if it could differ from | 
| -     `shadow_len'. | 
| - | 
| -     For example, the remote target `Z0' packet does not require | 
| -     shadowing memory, so `shadow_len' is left at zero.  However, the | 
| -     length reported by `gdbarch_breakpoint_from_pc' is cached in | 
| -     `placed_size', so that a matching `z0' packet can be used to | 
| -     remove the breakpoint. | 
| - | 
| -`target_remove_hw_breakpoint (BP_TGT)' | 
| -`target_insert_hw_breakpoint (BP_TGT)' | 
| -     Insert or remove a hardware-assisted breakpoint at address | 
| -     `BP_TGT->placed_address'.  Returns zero for success, non-zero for | 
| -     failure.  See `target_insert_breakpoint' for a description of the | 
| -     `struct bp_target_info' pointed to by BP_TGT; the | 
| -     `shadow_contents' and `shadow_len' members are not used for | 
| -     hardware breakpoints, but `placed_size' may be. | 
| - | 
| -3.3 Single Stepping | 
| -=================== | 
| - | 
| -3.4 Signal Handling | 
| -=================== | 
| - | 
| -3.5 Thread Handling | 
| -=================== | 
| - | 
| -3.6 Inferior Function Calls | 
| -=========================== | 
| - | 
| -3.7 Longjmp Support | 
| -=================== | 
| - | 
| -GDB has support for figuring out that the target is doing a `longjmp' | 
| -and for stopping at the target of the jump, if we are stepping.  This | 
| -is done with a few specialized internal breakpoints, which are visible | 
| -in the output of the `maint info breakpoint' command. | 
| - | 
| -   To make this work, you need to define a function called | 
| -`gdbarch_get_longjmp_target', which will examine the `jmp_buf' | 
| -structure and extract the `longjmp' target address.  Since `jmp_buf' is | 
| -target specific and typically defined in a target header not available | 
| -to GDB, you will need to determine the offset of the PC manually and | 
| -return that; many targets define a `jb_pc_offset' field in the tdep | 
| -structure to save the value once calculated. | 
| - | 
| -3.8 Watchpoints | 
| -=============== | 
| - | 
| -Watchpoints are a special kind of breakpoints (*note breakpoints: | 
| -Algorithms.) which break when data is accessed rather than when some | 
| -instruction is executed.  When you have data which changes without your | 
| -knowing what code does that, watchpoints are the silver bullet to hunt | 
| -down and kill such bugs. | 
| - | 
| -   Watchpoints can be either hardware-assisted or not; the latter type | 
| -is known as "software watchpoints."  GDB always uses hardware-assisted | 
| -watchpoints if they are available, and falls back on software | 
| -watchpoints otherwise.  Typical situations where GDB will use software | 
| -watchpoints are: | 
| - | 
| -   * The watched memory region is too large for the underlying hardware | 
| -     watchpoint support.  For example, each x86 debug register can | 
| -     watch up to 4 bytes of memory, so trying to watch data structures | 
| -     whose size is more than 16 bytes will cause GDB to use software | 
| -     watchpoints. | 
| - | 
| -   * The value of the expression to be watched depends on data held in | 
| -     registers (as opposed to memory). | 
| - | 
| -   * Too many different watchpoints requested.  (On some architectures, | 
| -     this situation is impossible to detect until the debugged program | 
| -     is resumed.)  Note that x86 debug registers are used both for | 
| -     hardware breakpoints and for watchpoints, so setting too many | 
| -     hardware breakpoints might cause watchpoint insertion to fail. | 
| - | 
| -   * No hardware-assisted watchpoints provided by the target | 
| -     implementation. | 
| - | 
| -   Software watchpoints are very slow, since GDB needs to single-step | 
| -the program being debugged and test the value of the watched | 
| -expression(s) after each instruction.  The rest of this section is | 
| -mostly irrelevant for software watchpoints. | 
| - | 
| -   When the inferior stops, GDB tries to establish, among other | 
| -possible reasons, whether it stopped due to a watchpoint being hit.  It | 
| -first uses `STOPPED_BY_WATCHPOINT' to see if any watchpoint was hit. | 
| -If not, all watchpoint checking is skipped. | 
| - | 
| -   Then GDB calls `target_stopped_data_address' exactly once.  This | 
| -method returns the address of the watchpoint which triggered, if the | 
| -target can determine it.  If the triggered address is available, GDB | 
| -compares the address returned by this method with each watched memory | 
| -address in each active watchpoint.  For data-read and data-access | 
| -watchpoints, GDB announces every watchpoint that watches the triggered | 
| -address as being hit.  For this reason, data-read and data-access | 
| -watchpoints _require_ that the triggered address be available; if not, | 
| -read and access watchpoints will never be considered hit.  For | 
| -data-write watchpoints, if the triggered address is available, GDB | 
| -considers only those watchpoints which match that address; otherwise, | 
| -GDB considers all data-write watchpoints.  For each data-write | 
| -watchpoint that GDB considers, it evaluates the expression whose value | 
| -is being watched, and tests whether the watched value has changed. | 
| -Watchpoints whose watched values have changed are announced as hit. | 
| - | 
| -   GDB uses several macros and primitives to support hardware | 
| -watchpoints: | 
| - | 
| -`TARGET_CAN_USE_HARDWARE_WATCHPOINT (TYPE, COUNT, OTHER)' | 
| -     Return the number of hardware watchpoints of type TYPE that are | 
| -     possible to be set.  The value is positive if COUNT watchpoints of | 
| -     this type can be set, zero if setting watchpoints of this type is | 
| -     not supported, and negative if COUNT is more than the maximum | 
| -     number of watchpoints of type TYPE that can be set.  OTHER is | 
| -     non-zero if other types of watchpoints are currently enabled (there | 
| -     are architectures which cannot set watchpoints of different types | 
| -     at the same time). | 
| - | 
| -`TARGET_REGION_OK_FOR_HW_WATCHPOINT (ADDR, LEN)' | 
| -     Return non-zero if hardware watchpoints can be used to watch a | 
| -     region whose address is ADDR and whose length in bytes is LEN. | 
| - | 
| -`target_insert_watchpoint (ADDR, LEN, TYPE)' | 
| -`target_remove_watchpoint (ADDR, LEN, TYPE)' | 
| -     Insert or remove a hardware watchpoint starting at ADDR, for LEN | 
| -     bytes.  TYPE is the watchpoint type, one of the possible values of | 
| -     the enumerated data type `target_hw_bp_type', defined by | 
| -     `breakpoint.h' as follows: | 
| - | 
| -           enum target_hw_bp_type | 
| -             { | 
| -               hw_write   = 0, /* Common (write) HW watchpoint */ | 
| -               hw_read    = 1, /* Read    HW watchpoint */ | 
| -               hw_access  = 2, /* Access (read or write) HW watchpoint */ | 
| -               hw_execute = 3  /* Execute HW breakpoint */ | 
| -             }; | 
| - | 
| -     These two macros should return 0 for success, non-zero for failure. | 
| - | 
| -`target_stopped_data_address (ADDR_P)' | 
| -     If the inferior has some watchpoint that triggered, place the | 
| -     address associated with the watchpoint at the location pointed to | 
| -     by ADDR_P and return non-zero.  Otherwise, return zero.  This is | 
| -     required for data-read and data-access watchpoints.  It is not | 
| -     required for data-write watchpoints, but GDB uses it to improve | 
| -     handling of those also. | 
| - | 
| -     GDB will only call this method once per watchpoint stop, | 
| -     immediately after calling `STOPPED_BY_WATCHPOINT'.  If the | 
| -     target's watchpoint indication is sticky, i.e., stays set after | 
| -     resuming, this method should clear it.  For instance, the x86 debug | 
| -     control register has sticky triggered flags. | 
| - | 
| -`target_watchpoint_addr_within_range (TARGET, ADDR, START, LENGTH)' | 
| -     Check whether ADDR (as returned by `target_stopped_data_address') | 
| -     lies within the hardware-defined watchpoint region described by | 
| -     START and LENGTH.  This only needs to be provided if the | 
| -     granularity of a watchpoint is greater than one byte, i.e., if the | 
| -     watchpoint can also trigger on nearby addresses outside of the | 
| -     watched region. | 
| - | 
| -`HAVE_STEPPABLE_WATCHPOINT' | 
| -     If defined to a non-zero value, it is not necessary to disable a | 
| -     watchpoint to step over it.  Like | 
| -     `gdbarch_have_nonsteppable_watchpoint', this is usually set when | 
| -     watchpoints trigger at the instruction which will perform an | 
| -     interesting read or write.  It should be set if there is a | 
| -     temporary disable bit which allows the processor to step over the | 
| -     interesting instruction without raising the watchpoint exception | 
| -     again. | 
| - | 
| -`int gdbarch_have_nonsteppable_watchpoint (GDBARCH)' | 
| -     If it returns a non-zero value, GDB should disable a watchpoint to | 
| -     step the inferior over it.  This is usually set when watchpoints | 
| -     trigger at the instruction which will perform an interesting read | 
| -     or write. | 
| - | 
| -`HAVE_CONTINUABLE_WATCHPOINT' | 
| -     If defined to a non-zero value, it is possible to continue the | 
| -     inferior after a watchpoint has been hit.  This is usually set | 
| -     when watchpoints trigger at the instruction following an | 
| -     interesting read or write. | 
| - | 
| -`STOPPED_BY_WATCHPOINT (WAIT_STATUS)' | 
| -     Return non-zero if stopped by a watchpoint.  WAIT_STATUS is of the | 
| -     type `struct target_waitstatus', defined by `target.h'.  Normally, | 
| -     this macro is defined to invoke the function pointed to by the | 
| -     `to_stopped_by_watchpoint' member of the structure (of the type | 
| -     `target_ops', defined on `target.h') that describes the | 
| -     target-specific operations; `to_stopped_by_watchpoint' ignores the | 
| -     WAIT_STATUS argument. | 
| - | 
| -     GDB does not require the non-zero value returned by | 
| -     `STOPPED_BY_WATCHPOINT' to be 100% correct, so if a target cannot | 
| -     determine for sure whether the inferior stopped due to a | 
| -     watchpoint, it could return non-zero "just in case". | 
| - | 
| -3.8.1 Watchpoints and Threads | 
| ------------------------------ | 
| - | 
| -GDB only supports process-wide watchpoints, which trigger in all | 
| -threads.  GDB uses the thread ID to make watchpoints act as if they | 
| -were thread-specific, but it cannot set hardware watchpoints that only | 
| -trigger in a specific thread.  Therefore, even if the target supports | 
| -threads, per-thread debug registers, and watchpoints which only affect | 
| -a single thread, it should set the per-thread debug registers for all | 
| -threads to the same value.  On GNU/Linux native targets, this is | 
| -accomplished by using `ALL_LWPS' in `target_insert_watchpoint' and | 
| -`target_remove_watchpoint' and by using `linux_set_new_thread' to | 
| -register a handler for newly created threads. | 
| - | 
| -   GDB's GNU/Linux support only reports a single event at a time, | 
| -although multiple events can trigger simultaneously for multi-threaded | 
| -programs.  When multiple events occur, `linux-nat.c' queues subsequent | 
| -events and returns them the next time the program is resumed.  This | 
| -means that `STOPPED_BY_WATCHPOINT' and `target_stopped_data_address' | 
| -only need to consult the current thread's state--the thread indicated | 
| -by `inferior_ptid'.  If two threads have hit watchpoints | 
| -simultaneously, those routines will be called a second time for the | 
| -second thread. | 
| - | 
| -3.8.2 x86 Watchpoints | 
| ---------------------- | 
| - | 
| -The 32-bit Intel x86 (a.k.a. ia32) processors feature special debug | 
| -registers designed to facilitate debugging.  GDB provides a generic | 
| -library of functions that x86-based ports can use to implement support | 
| -for watchpoints and hardware-assisted breakpoints.  This subsection | 
| -documents the x86 watchpoint facilities in GDB. | 
| - | 
| -   (At present, the library functions read and write debug registers | 
| -directly, and are thus only available for native configurations.) | 
| - | 
| -   To use the generic x86 watchpoint support, a port should do the | 
| -following: | 
| - | 
| -   * Define the macro `I386_USE_GENERIC_WATCHPOINTS' somewhere in the | 
| -     target-dependent headers. | 
| - | 
| -   * Include the `config/i386/nm-i386.h' header file _after_ defining | 
| -     `I386_USE_GENERIC_WATCHPOINTS'. | 
| - | 
| -   * Add `i386-nat.o' to the value of the Make variable `NATDEPFILES' | 
| -     (*note NATDEPFILES: Native Debugging.). | 
| - | 
| -   * Provide implementations for the `I386_DR_LOW_*' macros described | 
| -     below.  Typically, each macro should call a target-specific | 
| -     function which does the real work. | 
| - | 
| -   The x86 watchpoint support works by maintaining mirror images of the | 
| -debug registers.  Values are copied between the mirror images and the | 
| -real debug registers via a set of macros which each target needs to | 
| -provide: | 
| - | 
| -`I386_DR_LOW_SET_CONTROL (VAL)' | 
| -     Set the Debug Control (DR7) register to the value VAL. | 
| - | 
| -`I386_DR_LOW_SET_ADDR (IDX, ADDR)' | 
| -     Put the address ADDR into the debug register number IDX. | 
| - | 
| -`I386_DR_LOW_RESET_ADDR (IDX)' | 
| -     Reset (i.e. zero out) the address stored in the debug register | 
| -     number IDX. | 
| - | 
| -`I386_DR_LOW_GET_STATUS' | 
| -     Return the value of the Debug Status (DR6) register.  This value is | 
| -     used immediately after it is returned by `I386_DR_LOW_GET_STATUS', | 
| -     so as to support per-thread status register values. | 
| - | 
| -   For each one of the 4 debug registers (whose indices are from 0 to 3) | 
| -that store addresses, a reference count is maintained by GDB, to allow | 
| -sharing of debug registers by several watchpoints.  This allows users | 
| -to define several watchpoints that watch the same expression, but with | 
| -different conditions and/or commands, without wasting debug registers | 
| -which are in short supply.  GDB maintains the reference counts | 
| -internally, targets don't have to do anything to use this feature. | 
| - | 
| -   The x86 debug registers can each watch a region that is 1, 2, or 4 | 
| -bytes long.  The ia32 architecture requires that each watched region be | 
| -appropriately aligned: 2-byte region on 2-byte boundary, 4-byte region | 
| -on 4-byte boundary.  However, the x86 watchpoint support in GDB can | 
| -watch unaligned regions and regions larger than 4 bytes (up to 16 | 
| -bytes) by allocating several debug registers to watch a single region. | 
| -This allocation of several registers per a watched region is also done | 
| -automatically without target code intervention. | 
| - | 
| -   The generic x86 watchpoint support provides the following API for the | 
| -GDB's application code: | 
| - | 
| -`i386_region_ok_for_watchpoint (ADDR, LEN)' | 
| -     The macro `TARGET_REGION_OK_FOR_HW_WATCHPOINT' is set to call this | 
| -     function.  It counts the number of debug registers required to | 
| -     watch a given region, and returns a non-zero value if that number | 
| -     is less than 4, the number of debug registers available to x86 | 
| -     processors. | 
| - | 
| -`i386_stopped_data_address (ADDR_P)' | 
| -     The target function `target_stopped_data_address' is set to call | 
| -     this function.  This function examines the breakpoint condition | 
| -     bits in the DR6 Debug Status register, as returned by the | 
| -     `I386_DR_LOW_GET_STATUS' macro, and returns the address associated | 
| -     with the first bit that is set in DR6. | 
| - | 
| -`i386_stopped_by_watchpoint (void)' | 
| -     The macro `STOPPED_BY_WATCHPOINT' is set to call this function. | 
| -     The argument passed to `STOPPED_BY_WATCHPOINT' is ignored.  This | 
| -     function examines the breakpoint condition bits in the DR6 Debug | 
| -     Status register, as returned by the `I386_DR_LOW_GET_STATUS' | 
| -     macro, and returns true if any bit is set.  Otherwise, false is | 
| -     returned. | 
| - | 
| -`i386_insert_watchpoint (ADDR, LEN, TYPE)' | 
| -`i386_remove_watchpoint (ADDR, LEN, TYPE)' | 
| -     Insert or remove a watchpoint.  The macros | 
| -     `target_insert_watchpoint' and `target_remove_watchpoint' are set | 
| -     to call these functions.  `i386_insert_watchpoint' first looks for | 
| -     a debug register which is already set to watch the same region for | 
| -     the same access types; if found, it just increments the reference | 
| -     count of that debug register, thus implementing debug register | 
| -     sharing between watchpoints.  If no such register is found, the | 
| -     function looks for a vacant debug register, sets its mirrored | 
| -     value to ADDR, sets the mirrored value of DR7 Debug Control | 
| -     register as appropriate for the LEN and TYPE parameters, and then | 
| -     passes the new values of the debug register and DR7 to the | 
| -     inferior by calling `I386_DR_LOW_SET_ADDR' and | 
| -     `I386_DR_LOW_SET_CONTROL'.  If more than one debug register is | 
| -     required to cover the given region, the above process is repeated | 
| -     for each debug register. | 
| - | 
| -     `i386_remove_watchpoint' does the opposite: it resets the address | 
| -     in the mirrored value of the debug register and its read/write and | 
| -     length bits in the mirrored value of DR7, then passes these new | 
| -     values to the inferior via `I386_DR_LOW_RESET_ADDR' and | 
| -     `I386_DR_LOW_SET_CONTROL'.  If a register is shared by several | 
| -     watchpoints, each time a `i386_remove_watchpoint' is called, it | 
| -     decrements the reference count, and only calls | 
| -     `I386_DR_LOW_RESET_ADDR' and `I386_DR_LOW_SET_CONTROL' when the | 
| -     count goes to zero. | 
| - | 
| -`i386_insert_hw_breakpoint (BP_TGT)' | 
| -`i386_remove_hw_breakpoint (BP_TGT)' | 
| -     These functions insert and remove hardware-assisted breakpoints. | 
| -     The macros `target_insert_hw_breakpoint' and | 
| -     `target_remove_hw_breakpoint' are set to call these functions. | 
| -     The argument is a `struct bp_target_info *', as described in the | 
| -     documentation for `target_insert_breakpoint'.  These functions | 
| -     work like `i386_insert_watchpoint' and `i386_remove_watchpoint', | 
| -     respectively, except that they set up the debug registers to watch | 
| -     instruction execution, and each hardware-assisted breakpoint | 
| -     always requires exactly one debug register. | 
| - | 
| -`i386_cleanup_dregs (void)' | 
| -     This function clears all the reference counts, addresses, and | 
| -     control bits in the mirror images of the debug registers.  It | 
| -     doesn't affect the actual debug registers in the inferior process. | 
| - | 
| -*Notes:* | 
| -  1. x86 processors support setting watchpoints on I/O reads or writes. | 
| -     However, since no target supports this (as of March 2001), and | 
| -     since `enum target_hw_bp_type' doesn't even have an enumeration | 
| -     for I/O watchpoints, this feature is not yet available to GDB | 
| -     running on x86. | 
| - | 
| -  2. x86 processors can enable watchpoints locally, for the current task | 
| -     only, or globally, for all the tasks.  For each debug register, | 
| -     there's a bit in the DR7 Debug Control register that determines | 
| -     whether the associated address is watched locally or globally.  The | 
| -     current implementation of x86 watchpoint support in GDB always | 
| -     sets watchpoints to be locally enabled, since global watchpoints | 
| -     might interfere with the underlying OS and are probably | 
| -     unavailable in many platforms. | 
| - | 
| -3.9 Checkpoints | 
| -=============== | 
| - | 
| -In the abstract, a checkpoint is a point in the execution history of | 
| -the program, which the user may wish to return to at some later time. | 
| - | 
| -   Internally, a checkpoint is a saved copy of the program state, | 
| -including whatever information is required in order to restore the | 
| -program to that state at a later time.  This can be expected to include | 
| -the state of registers and memory, and may include external state such | 
| -as the state of open files and devices. | 
| - | 
| -   There are a number of ways in which checkpoints may be implemented | 
| -in gdb, e.g. as corefiles, as forked processes, and as some opaque | 
| -method implemented on the target side. | 
| - | 
| -   A corefile can be used to save an image of target memory and register | 
| -state, which can in principle be restored later -- but corefiles do not | 
| -typically include information about external entities such as open | 
| -files.  Currently this method is not implemented in gdb. | 
| - | 
| -   A forked process can save the state of user memory and registers, as | 
| -well as some subset of external (kernel) state.  This method is used to | 
| -implement checkpoints on Linux, and in principle might be used on other | 
| -systems. | 
| - | 
| -   Some targets, e.g. simulators, might have their own built-in method | 
| -for saving checkpoints, and gdb might be able to take advantage of that | 
| -capability without necessarily knowing any details of how it is done. | 
| - | 
| -3.10 Observing changes in GDB internals | 
| -======================================= | 
| - | 
| -In order to function properly, several modules need to be notified when | 
| -some changes occur in the GDB internals.  Traditionally, these modules | 
| -have relied on several paradigms, the most common ones being hooks and | 
| -gdb-events.  Unfortunately, none of these paradigms was versatile | 
| -enough to become the standard notification mechanism in GDB.  The fact | 
| -that they only supported one "client" was also a strong limitation. | 
| - | 
| -   A new paradigm, based on the Observer pattern of the `Design | 
| -Patterns' book, has therefore been implemented.  The goal was to provide | 
| -a new interface overcoming the issues with the notification mechanisms | 
| -previously available.  This new interface needed to be strongly typed, | 
| -easy to extend, and versatile enough to be used as the standard | 
| -interface when adding new notifications. | 
| - | 
| -   See *Note GDB Observers:: for a brief description of the observers | 
| -currently implemented in GDB. The rationale for the current | 
| -implementation is also briefly discussed. | 
| - | 
| - | 
| -File: gdbint.info,  Node: User Interface,  Next: libgdb,  Prev: Algorithms,  Up: Top | 
| - | 
| -4 User Interface | 
| -**************** | 
| - | 
| -GDB has several user interfaces, of which the traditional command-line | 
| -interface is perhaps the most familiar. | 
| - | 
| -4.1 Command Interpreter | 
| -======================= | 
| - | 
| -The command interpreter in GDB is fairly simple.  It is designed to | 
| -allow for the set of commands to be augmented dynamically, and also has | 
| -a recursive subcommand capability, where the first argument to a | 
| -command may itself direct a lookup on a different command list. | 
| - | 
| -   For instance, the `set' command just starts a lookup on the | 
| -`setlist' command list, while `set thread' recurses to the | 
| -`set_thread_cmd_list'. | 
| - | 
| -   To add commands in general, use `add_cmd'.  `add_com' adds to the | 
| -main command list, and should be used for those commands.  The usual | 
| -place to add commands is in the `_initialize_XYZ' routines at the ends | 
| -of most source files. | 
| - | 
| -   To add paired `set' and `show' commands, use `add_setshow_cmd' or | 
| -`add_setshow_cmd_full'.  The former is a slightly simpler interface | 
| -which is useful when you don't need to further modify the new command | 
| -structures, while the latter returns the new command structures for | 
| -manipulation. | 
| - | 
| -   Before removing commands from the command set it is a good idea to | 
| -deprecate them for some time.  Use `deprecate_cmd' on commands or | 
| -aliases to set the deprecated flag.  `deprecate_cmd' takes a `struct | 
| -cmd_list_element' as it's first argument.  You can use the return value | 
| -from `add_com' or `add_cmd' to deprecate the command immediately after | 
| -it is created. | 
| - | 
| -   The first time a command is used the user will be warned and offered | 
| -a replacement (if one exists). Note that the replacement string passed | 
| -to `deprecate_cmd' should be the full name of the command, i.e., the | 
| -entire string the user should type at the command line. | 
| - | 
| -4.2 UI-Independent Output--the `ui_out' Functions | 
| -================================================= | 
| - | 
| -The `ui_out' functions present an abstraction level for the GDB output | 
| -code.  They hide the specifics of different user interfaces supported | 
| -by GDB, and thus free the programmer from the need to write several | 
| -versions of the same code, one each for every UI, to produce output. | 
| - | 
| -4.2.1 Overview and Terminology | 
| ------------------------------- | 
| - | 
| -In general, execution of each GDB command produces some sort of output, | 
| -and can even generate an input request. | 
| - | 
| -   Output can be generated for the following purposes: | 
| - | 
| -   * to display a _result_ of an operation; | 
| - | 
| -   * to convey _info_ or produce side-effects of a requested operation; | 
| - | 
| -   * to provide a _notification_ of an asynchronous event (including | 
| -     progress indication of a prolonged asynchronous operation); | 
| - | 
| -   * to display _error messages_ (including warnings); | 
| - | 
| -   * to show _debug data_; | 
| - | 
| -   * to _query_ or prompt a user for input (a special case). | 
| - | 
| -This section mainly concentrates on how to build result output, | 
| -although some of it also applies to other kinds of output. | 
| - | 
| -   Generation of output that displays the results of an operation | 
| -involves one or more of the following: | 
| - | 
| -   * output of the actual data | 
| - | 
| -   * formatting the output as appropriate for console output, to make it | 
| -     easily readable by humans | 
| - | 
| -   * machine oriented formatting-a more terse formatting to allow for | 
| -     easy parsing by programs which read GDB's output | 
| - | 
| -   * annotation, whose purpose is to help legacy GUIs to identify | 
| -     interesting parts in the output | 
| - | 
| -   The `ui_out' routines take care of the first three aspects. | 
| -Annotations are provided by separate annotation routines.  Note that use | 
| -of annotations for an interface between a GUI and GDB is deprecated. | 
| - | 
| -   Output can be in the form of a single item, which we call a "field"; | 
| -a "list" consisting of identical fields; a "tuple" consisting of | 
| -non-identical fields; or a "table", which is a tuple consisting of a | 
| -header and a body.  In a BNF-like form: | 
| - | 
| -`<table> ==>' | 
| -     `<header> <body>' | 
| - | 
| -`<header> ==>' | 
| -     `{ <column> }' | 
| - | 
| -`<column> ==>' | 
| -     `<width> <alignment> <title>' | 
| - | 
| -`<body> ==>' | 
| -     `{<row>}' | 
| - | 
| -4.2.2 General Conventions | 
| -------------------------- | 
| - | 
| -Most `ui_out' routines are of type `void', the exceptions are | 
| -`ui_out_stream_new' (which returns a pointer to the newly created | 
| -object) and the `make_cleanup' routines. | 
| - | 
| -   The first parameter is always the `ui_out' vector object, a pointer | 
| -to a `struct ui_out'. | 
| - | 
| -   The FORMAT parameter is like in `printf' family of functions.  When | 
| -it is present, there must also be a variable list of arguments | 
| -sufficient used to satisfy the `%' specifiers in the supplied format. | 
| - | 
| -   When a character string argument is not used in a `ui_out' function | 
| -call, a `NULL' pointer has to be supplied instead. | 
| - | 
| -4.2.3 Table, Tuple and List Functions | 
| -------------------------------------- | 
| - | 
| -This section introduces `ui_out' routines for building lists, tuples | 
| -and tables.  The routines to output the actual data items (fields) are | 
| -presented in the next section. | 
| - | 
| -   To recap: A "tuple" is a sequence of "fields", each field containing | 
| -information about an object; a "list" is a sequence of fields where | 
| -each field describes an identical object. | 
| - | 
| -   Use the "table" functions when your output consists of a list of | 
| -rows (tuples) and the console output should include a heading.  Use this | 
| -even when you are listing just one object but you still want the header. | 
| - | 
| -   Tables can not be nested.  Tuples and lists can be nested up to a | 
| -maximum of five levels. | 
| - | 
| -   The overall structure of the table output code is something like | 
| -this: | 
| - | 
| -       ui_out_table_begin | 
| -         ui_out_table_header | 
| -         ... | 
| -         ui_out_table_body | 
| -           ui_out_tuple_begin | 
| -             ui_out_field_* | 
| -             ... | 
| -           ui_out_tuple_end | 
| -           ... | 
| -       ui_out_table_end | 
| - | 
| -   Here is the description of table-, tuple- and list-related `ui_out' | 
| -functions: | 
| - | 
| - -- Function: void ui_out_table_begin (struct ui_out *UIOUT, int | 
| -          NBROFCOLS, int NR_ROWS, const char *TBLID) | 
| -     The function `ui_out_table_begin' marks the beginning of the output | 
| -     of a table.  It should always be called before any other `ui_out' | 
| -     function for a given table.  NBROFCOLS is the number of columns in | 
| -     the table. NR_ROWS is the number of rows in the table.  TBLID is | 
| -     an optional string identifying the table.  The string pointed to | 
| -     by TBLID is copied by the implementation of `ui_out_table_begin', | 
| -     so the application can free the string if it was `malloc'ed. | 
| - | 
| -     The companion function `ui_out_table_end', described below, marks | 
| -     the end of the table's output. | 
| - | 
| - -- Function: void ui_out_table_header (struct ui_out *UIOUT, int | 
| -          WIDTH, enum ui_align ALIGNMENT, const char *COLHDR) | 
| -     `ui_out_table_header' provides the header information for a single | 
| -     table column.  You call this function several times, one each for | 
| -     every column of the table, after `ui_out_table_begin', but before | 
| -     `ui_out_table_body'. | 
| - | 
| -     The value of WIDTH gives the column width in characters.  The | 
| -     value of ALIGNMENT is one of `left', `center', and `right', and it | 
| -     specifies how to align the header: left-justify, center, or | 
| -     right-justify it.  COLHDR points to a string that specifies the | 
| -     column header; the implementation copies that string, so column | 
| -     header strings in `malloc'ed storage can be freed after the call. | 
| - | 
| - -- Function: void ui_out_table_body (struct ui_out *UIOUT) | 
| -     This function delimits the table header from the table body. | 
| - | 
| - -- Function: void ui_out_table_end (struct ui_out *UIOUT) | 
| -     This function signals the end of a table's output.  It should be | 
| -     called after the table body has been produced by the list and | 
| -     field output functions. | 
| - | 
| -     There should be exactly one call to `ui_out_table_end' for each | 
| -     call to `ui_out_table_begin', otherwise the `ui_out' functions | 
| -     will signal an internal error. | 
| - | 
| -   The output of the tuples that represent the table rows must follow | 
| -the call to `ui_out_table_body' and precede the call to | 
| -`ui_out_table_end'.  You build a tuple by calling `ui_out_tuple_begin' | 
| -and `ui_out_tuple_end', with suitable calls to functions which actually | 
| -output fields between them. | 
| - | 
| - -- Function: void ui_out_tuple_begin (struct ui_out *UIOUT, const char | 
| -          *ID) | 
| -     This function marks the beginning of a tuple output.  ID points to | 
| -     an optional string that identifies the tuple; it is copied by the | 
| -     implementation, and so strings in `malloc'ed storage can be freed | 
| -     after the call. | 
| - | 
| - -- Function: void ui_out_tuple_end (struct ui_out *UIOUT) | 
| -     This function signals an end of a tuple output.  There should be | 
| -     exactly one call to `ui_out_tuple_end' for each call to | 
| -     `ui_out_tuple_begin', otherwise an internal GDB error will be | 
| -     signaled. | 
| - | 
| - -- Function: struct cleanup * make_cleanup_ui_out_tuple_begin_end | 
| -          (struct ui_out *UIOUT, const char *ID) | 
| -     This function first opens the tuple and then establishes a cleanup | 
| -     (*note Cleanups: Misc Guidelines.) to close the tuple.  It | 
| -     provides a convenient and correct implementation of the | 
| -     non-portable(1) code sequence: | 
| -          struct cleanup *old_cleanup; | 
| -          ui_out_tuple_begin (uiout, "..."); | 
| -          old_cleanup = make_cleanup ((void(*)(void *)) ui_out_tuple_end, | 
| -                                      uiout); | 
| - | 
| - -- Function: void ui_out_list_begin (struct ui_out *UIOUT, const char | 
| -          *ID) | 
| -     This function marks the beginning of a list output.  ID points to | 
| -     an optional string that identifies the list; it is copied by the | 
| -     implementation, and so strings in `malloc'ed storage can be freed | 
| -     after the call. | 
| - | 
| - -- Function: void ui_out_list_end (struct ui_out *UIOUT) | 
| -     This function signals an end of a list output.  There should be | 
| -     exactly one call to `ui_out_list_end' for each call to | 
| -     `ui_out_list_begin', otherwise an internal GDB error will be | 
| -     signaled. | 
| - | 
| - -- Function: struct cleanup * make_cleanup_ui_out_list_begin_end | 
| -          (struct ui_out *UIOUT, const char *ID) | 
| -     Similar to `make_cleanup_ui_out_tuple_begin_end', this function | 
| -     opens a list and then establishes cleanup (*note Cleanups: Misc | 
| -     Guidelines.)  that will close the list. | 
| - | 
| -4.2.4 Item Output Functions | 
| ---------------------------- | 
| - | 
| -The functions described below produce output for the actual data items, | 
| -or fields, which contain information about the object. | 
| - | 
| -   Choose the appropriate function accordingly to your particular needs. | 
| - | 
| - -- Function: void ui_out_field_fmt (struct ui_out *UIOUT, char | 
| -          *FLDNAME, char *FORMAT, ...) | 
| -     This is the most general output function.  It produces the | 
| -     representation of the data in the variable-length argument list | 
| -     according to formatting specifications in FORMAT, a `printf'-like | 
| -     format string.  The optional argument FLDNAME supplies the name of | 
| -     the field.  The data items themselves are supplied as additional | 
| -     arguments after FORMAT. | 
| - | 
| -     This generic function should be used only when it is not possible | 
| -     to use one of the specialized versions (see below). | 
| - | 
| - -- Function: void ui_out_field_int (struct ui_out *UIOUT, const char | 
| -          *FLDNAME, int VALUE) | 
| -     This function outputs a value of an `int' variable.  It uses the | 
| -     `"%d"' output conversion specification.  FLDNAME specifies the | 
| -     name of the field. | 
| - | 
| - -- Function: void ui_out_field_fmt_int (struct ui_out *UIOUT, int | 
| -          WIDTH, enum ui_align ALIGNMENT, const char *FLDNAME, int | 
| -          VALUE) | 
| -     This function outputs a value of an `int' variable.  It differs | 
| -     from `ui_out_field_int' in that the caller specifies the desired | 
| -     WIDTH and ALIGNMENT of the output.  FLDNAME specifies the name of | 
| -     the field. | 
| - | 
| - -- Function: void ui_out_field_core_addr (struct ui_out *UIOUT, const | 
| -          char *FLDNAME, struct gdbarch *GDBARCH, CORE_ADDR ADDRESS) | 
| -     This function outputs an address as appropriate for GDBARCH. | 
| - | 
| - -- Function: void ui_out_field_string (struct ui_out *UIOUT, const | 
| -          char *FLDNAME, const char *STRING) | 
| -     This function outputs a string using the `"%s"' conversion | 
| -     specification. | 
| - | 
| -   Sometimes, there's a need to compose your output piece by piece using | 
| -functions that operate on a stream, such as `value_print' or | 
| -`fprintf_symbol_filtered'.  These functions accept an argument of the | 
| -type `struct ui_file *', a pointer to a `ui_file' object used to store | 
| -the data stream used for the output.  When you use one of these | 
| -functions, you need a way to pass their results stored in a `ui_file' | 
| -object to the `ui_out' functions.  To this end, you first create a | 
| -`ui_stream' object by calling `ui_out_stream_new', pass the `stream' | 
| -member of that `ui_stream' object to `value_print' and similar | 
| -functions, and finally call `ui_out_field_stream' to output the field | 
| -you constructed.  When the `ui_stream' object is no longer needed, you | 
| -should destroy it and free its memory by calling `ui_out_stream_delete'. | 
| - | 
| - -- Function: struct ui_stream * ui_out_stream_new (struct ui_out | 
| -          *UIOUT) | 
| -     This function creates a new `ui_stream' object which uses the same | 
| -     output methods as the `ui_out' object whose pointer is passed in | 
| -     UIOUT.  It returns a pointer to the newly created `ui_stream' | 
| -     object. | 
| - | 
| - -- Function: void ui_out_stream_delete (struct ui_stream *STREAMBUF) | 
| -     This functions destroys a `ui_stream' object specified by | 
| -     STREAMBUF. | 
| - | 
| - -- Function: void ui_out_field_stream (struct ui_out *UIOUT, const | 
| -          char *FIELDNAME, struct ui_stream *STREAMBUF) | 
| -     This function consumes all the data accumulated in | 
| -     `streambuf->stream' and outputs it like `ui_out_field_string' | 
| -     does.  After a call to `ui_out_field_stream', the accumulated data | 
| -     no longer exists, but the stream is still valid and may be used | 
| -     for producing more fields. | 
| - | 
| -   *Important:* If there is any chance that your code could bail out | 
| -before completing output generation and reaching the point where | 
| -`ui_out_stream_delete' is called, it is necessary to set up a cleanup, | 
| -to avoid leaking memory and other resources.  Here's a skeleton code to | 
| -do that: | 
| - | 
| -      struct ui_stream *mybuf = ui_out_stream_new (uiout); | 
| -      struct cleanup *old = make_cleanup (ui_out_stream_delete, mybuf); | 
| -      ... | 
| -      do_cleanups (old); | 
| - | 
| -   If the function already has the old cleanup chain set (for other | 
| -kinds of cleanups), you just have to add your cleanup to it: | 
| - | 
| -       mybuf = ui_out_stream_new (uiout); | 
| -       make_cleanup (ui_out_stream_delete, mybuf); | 
| - | 
| -   Note that with cleanups in place, you should not call | 
| -`ui_out_stream_delete' directly, or you would attempt to free the same | 
| -buffer twice. | 
| - | 
| -4.2.5 Utility Output Functions | 
| ------------------------------- | 
| - | 
| - -- Function: void ui_out_field_skip (struct ui_out *UIOUT, const char | 
| -          *FLDNAME) | 
| -     This function skips a field in a table.  Use it if you have to | 
| -     leave an empty field without disrupting the table alignment.  The | 
| -     argument FLDNAME specifies a name for the (missing) filed. | 
| - | 
| - -- Function: void ui_out_text (struct ui_out *UIOUT, const char | 
| -          *STRING) | 
| -     This function outputs the text in STRING in a way that makes it | 
| -     easy to be read by humans.  For example, the console | 
| -     implementation of this method filters the text through a built-in | 
| -     pager, to prevent it from scrolling off the visible portion of the | 
| -     screen. | 
| - | 
| -     Use this function for printing relatively long chunks of text | 
| -     around the actual field data: the text it produces is not aligned | 
| -     according to the table's format.  Use `ui_out_field_string' to | 
| -     output a string field, and use `ui_out_message', described below, | 
| -     to output short messages. | 
| - | 
| - -- Function: void ui_out_spaces (struct ui_out *UIOUT, int NSPACES) | 
| -     This function outputs NSPACES spaces.  It is handy to align the | 
| -     text produced by `ui_out_text' with the rest of the table or list. | 
| - | 
| - -- Function: void ui_out_message (struct ui_out *UIOUT, int VERBOSITY, | 
| -          const char *FORMAT, ...) | 
| -     This function produces a formatted message, provided that the | 
| -     current verbosity level is at least as large as given by | 
| -     VERBOSITY.  The current verbosity level is specified by the user | 
| -     with the `set verbositylevel' command.(2) | 
| - | 
| - -- Function: void ui_out_wrap_hint (struct ui_out *UIOUT, char *INDENT) | 
| -     This function gives the console output filter (a paging filter) a | 
| -     hint of where to break lines which are too long.  Ignored for all | 
| -     other output consumers.  INDENT, if non-`NULL', is the string to | 
| -     be printed to indent the wrapped text on the next line; it must | 
| -     remain accessible until the next call to `ui_out_wrap_hint', or | 
| -     until an explicit newline is produced by one of the other | 
| -     functions.  If INDENT is `NULL', the wrapped text will not be | 
| -     indented. | 
| - | 
| - -- Function: void ui_out_flush (struct ui_out *UIOUT) | 
| -     This function flushes whatever output has been accumulated so far, | 
| -     if the UI buffers output. | 
| - | 
| -4.2.6 Examples of Use of `ui_out' functions | 
| -------------------------------------------- | 
| - | 
| -This section gives some practical examples of using the `ui_out' | 
| -functions to generalize the old console-oriented code in GDB.  The | 
| -examples all come from functions defined on the `breakpoints.c' file. | 
| - | 
| -   This example, from the `breakpoint_1' function, shows how to produce | 
| -a table. | 
| - | 
| -   The original code was: | 
| - | 
| -      if (!found_a_breakpoint++) | 
| -        { | 
| -          annotate_breakpoints_headers (); | 
| - | 
| -          annotate_field (0); | 
| -          printf_filtered ("Num "); | 
| -          annotate_field (1); | 
| -          printf_filtered ("Type           "); | 
| -          annotate_field (2); | 
| -          printf_filtered ("Disp "); | 
| -          annotate_field (3); | 
| -          printf_filtered ("Enb "); | 
| -          if (addressprint) | 
| -            { | 
| -              annotate_field (4); | 
| -              printf_filtered ("Address    "); | 
| -            } | 
| -          annotate_field (5); | 
| -          printf_filtered ("What\n"); | 
| - | 
| -          annotate_breakpoints_table (); | 
| -        } | 
| - | 
| -   Here's the new version: | 
| - | 
| -       nr_printable_breakpoints = ...; | 
| - | 
| -       if (addressprint) | 
| -         ui_out_table_begin (ui, 6, nr_printable_breakpoints, "BreakpointTable"); | 
| -       else | 
| -         ui_out_table_begin (ui, 5, nr_printable_breakpoints, "BreakpointTable"); | 
| - | 
| -       if (nr_printable_breakpoints > 0) | 
| -         annotate_breakpoints_headers (); | 
| -       if (nr_printable_breakpoints > 0) | 
| -         annotate_field (0); | 
| -       ui_out_table_header (uiout, 3, ui_left, "number", "Num");		/* 1 */ | 
| -       if (nr_printable_breakpoints > 0) | 
| -         annotate_field (1); | 
| -       ui_out_table_header (uiout, 14, ui_left, "type", "Type");		/* 2 */ | 
| -       if (nr_printable_breakpoints > 0) | 
| -         annotate_field (2); | 
| -       ui_out_table_header (uiout, 4, ui_left, "disp", "Disp");		/* 3 */ | 
| -       if (nr_printable_breakpoints > 0) | 
| -         annotate_field (3); | 
| -       ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");	/* 4 */ | 
| -       if (addressprint) | 
| -         { | 
| -          if (nr_printable_breakpoints > 0) | 
| -            annotate_field (4); | 
| -          if (print_address_bits <= 32) | 
| -            ui_out_table_header (uiout, 10, ui_left, "addr", "Address");/* 5 */ | 
| -          else | 
| -            ui_out_table_header (uiout, 18, ui_left, "addr", "Address");/* 5 */ | 
| -         } | 
| -       if (nr_printable_breakpoints > 0) | 
| -         annotate_field (5); | 
| -       ui_out_table_header (uiout, 40, ui_noalign, "what", "What");	/* 6 */ | 
| -       ui_out_table_body (uiout); | 
| -       if (nr_printable_breakpoints > 0) | 
| -         annotate_breakpoints_table (); | 
| - | 
| -   This example, from the `print_one_breakpoint' function, shows how to | 
| -produce the actual data for the table whose structure was defined in | 
| -the above example.  The original code was: | 
| - | 
| -        annotate_record (); | 
| -        annotate_field (0); | 
| -        printf_filtered ("%-3d ", b->number); | 
| -        annotate_field (1); | 
| -        if ((int)b->type > (sizeof(bptypes)/sizeof(bptypes[0])) | 
| -            || ((int) b->type != bptypes[(int) b->type].type)) | 
| -          internal_error ("bptypes table does not describe type #%d.", | 
| -                          (int)b->type); | 
| -        printf_filtered ("%-14s ", bptypes[(int)b->type].description); | 
| -        annotate_field (2); | 
| -        printf_filtered ("%-4s ", bpdisps[(int)b->disposition]); | 
| -        annotate_field (3); | 
| -        printf_filtered ("%-3c ", bpenables[(int)b->enable]); | 
| -        ... | 
| - | 
| -   This is the new version: | 
| - | 
| -        annotate_record (); | 
| -        ui_out_tuple_begin (uiout, "bkpt"); | 
| -        annotate_field (0); | 
| -        ui_out_field_int (uiout, "number", b->number); | 
| -        annotate_field (1); | 
| -        if (((int) b->type > (sizeof (bptypes) / sizeof (bptypes[0]))) | 
| -            || ((int) b->type != bptypes[(int) b->type].type)) | 
| -          internal_error ("bptypes table does not describe type #%d.", | 
| -                          (int) b->type); | 
| -        ui_out_field_string (uiout, "type", bptypes[(int)b->type].description); | 
| -        annotate_field (2); | 
| -        ui_out_field_string (uiout, "disp", bpdisps[(int)b->disposition]); | 
| -        annotate_field (3); | 
| -        ui_out_field_fmt (uiout, "enabled", "%c", bpenables[(int)b->enable]); | 
| -        ... | 
| - | 
| -   This example, also from `print_one_breakpoint', shows how to produce | 
| -a complicated output field using the `print_expression' functions which | 
| -requires a stream to be passed.  It also shows how to automate stream | 
| -destruction with cleanups.  The original code was: | 
| - | 
| -         annotate_field (5); | 
| -         print_expression (b->exp, gdb_stdout); | 
| - | 
| -   The new version is: | 
| - | 
| -       struct ui_stream *stb = ui_out_stream_new (uiout); | 
| -       struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb); | 
| -       ... | 
| -       annotate_field (5); | 
| -       print_expression (b->exp, stb->stream); | 
| -       ui_out_field_stream (uiout, "what", local_stream); | 
| - | 
| -   This example, also from `print_one_breakpoint', shows how to use | 
| -`ui_out_text' and `ui_out_field_string'.  The original code was: | 
| - | 
| -       annotate_field (5); | 
| -       if (b->dll_pathname == NULL) | 
| -         printf_filtered ("<any library> "); | 
| -       else | 
| -         printf_filtered ("library \"%s\" ", b->dll_pathname); | 
| - | 
| -   It became: | 
| - | 
| -       annotate_field (5); | 
| -       if (b->dll_pathname == NULL) | 
| -         { | 
| -           ui_out_field_string (uiout, "what", "<any library>"); | 
| -           ui_out_spaces (uiout, 1); | 
| -         } | 
| -       else | 
| -         { | 
| -           ui_out_text (uiout, "library \""); | 
| -           ui_out_field_string (uiout, "what", b->dll_pathname); | 
| -           ui_out_text (uiout, "\" "); | 
| -         } | 
| - | 
| -   The following example from `print_one_breakpoint' shows how to use | 
| -`ui_out_field_int' and `ui_out_spaces'.  The original code was: | 
| - | 
| -       annotate_field (5); | 
| -       if (b->forked_inferior_pid != 0) | 
| -         printf_filtered ("process %d ", b->forked_inferior_pid); | 
| - | 
| -   It became: | 
| - | 
| -       annotate_field (5); | 
| -       if (b->forked_inferior_pid != 0) | 
| -         { | 
| -           ui_out_text (uiout, "process "); | 
| -           ui_out_field_int (uiout, "what", b->forked_inferior_pid); | 
| -           ui_out_spaces (uiout, 1); | 
| -         } | 
| - | 
| -   Here's an example of using `ui_out_field_string'.  The original code | 
| -was: | 
| - | 
| -       annotate_field (5); | 
| -       if (b->exec_pathname != NULL) | 
| -         printf_filtered ("program \"%s\" ", b->exec_pathname); | 
| - | 
| -   It became: | 
| - | 
| -       annotate_field (5); | 
| -       if (b->exec_pathname != NULL) | 
| -         { | 
| -           ui_out_text (uiout, "program \""); | 
| -           ui_out_field_string (uiout, "what", b->exec_pathname); | 
| -           ui_out_text (uiout, "\" "); | 
| -         } | 
| - | 
| -   Finally, here's an example of printing an address.  The original | 
| -code: | 
| - | 
| -       annotate_field (4); | 
| -       printf_filtered ("%s ", | 
| -             hex_string_custom ((unsigned long) b->address, 8)); | 
| - | 
| -   It became: | 
| - | 
| -       annotate_field (4); | 
| -       ui_out_field_core_addr (uiout, "Address", b->address); | 
| - | 
| -4.3 Console Printing | 
| -==================== | 
| - | 
| -4.4 TUI | 
| -======= | 
| - | 
| ----------- Footnotes ---------- | 
| - | 
| -   (1) The function cast is not portable ISO C. | 
| - | 
| -   (2) As of this writing (April 2001), setting verbosity level is not | 
| -yet implemented, and is always returned as zero.  So calling | 
| -`ui_out_message' with a VERBOSITY argument more than zero will cause | 
| -the message to never be printed. | 
| - | 
| - | 
| -File: gdbint.info,  Node: libgdb,  Next: Values,  Prev: User Interface,  Up: Top | 
| - | 
| -5 libgdb | 
| -******** | 
| - | 
| -5.1 libgdb 1.0 | 
| -============== | 
| - | 
| -`libgdb' 1.0 was an abortive project of years ago.  The theory was to | 
| -provide an API to GDB's functionality. | 
| - | 
| -5.2 libgdb 2.0 | 
| -============== | 
| - | 
| -`libgdb' 2.0 is an ongoing effort to update GDB so that is better able | 
| -to support graphical and other environments. | 
| - | 
| -   Since `libgdb' development is on-going, its architecture is still | 
| -evolving.  The following components have so far been identified: | 
| - | 
| -   * Observer - `gdb-events.h'. | 
| - | 
| -   * Builder - `ui-out.h' | 
| - | 
| -   * Event Loop - `event-loop.h' | 
| - | 
| -   * Library - `gdb.h' | 
| - | 
| -   The model that ties these components together is described below. | 
| - | 
| -5.3 The `libgdb' Model | 
| -====================== | 
| - | 
| -A client of `libgdb' interacts with the library in two ways. | 
| - | 
| -   * As an observer (using `gdb-events') receiving notifications from | 
| -     `libgdb' of any internal state changes (break point changes, run | 
| -     state, etc). | 
| - | 
| -   * As a client querying `libgdb' (using the `ui-out' builder) to | 
| -     obtain various status values from GDB. | 
| - | 
| -   Since `libgdb' could have multiple clients (e.g., a GUI supporting | 
| -the existing GDB CLI), those clients must co-operate when controlling | 
| -`libgdb'.  In particular, a client must ensure that `libgdb' is idle | 
| -(i.e. no other client is using `libgdb') before responding to a | 
| -`gdb-event' by making a query. | 
| - | 
| -5.4 CLI support | 
| -=============== | 
| - | 
| -At present GDB's CLI is very much entangled in with the core of | 
| -`libgdb'.  Consequently, a client wishing to include the CLI in their | 
| -interface needs to carefully co-ordinate its own and the CLI's | 
| -requirements. | 
| - | 
| -   It is suggested that the client set `libgdb' up to be bi-modal | 
| -(alternate between CLI and client query modes).  The notes below sketch | 
| -out the theory: | 
| - | 
| -   * The client registers itself as an observer of `libgdb'. | 
| - | 
| -   * The client create and install `cli-out' builder using its own | 
| -     versions of the `ui-file' `gdb_stderr', `gdb_stdtarg' and | 
| -     `gdb_stdout' streams. | 
| - | 
| -   * The client creates a separate custom `ui-out' builder that is only | 
| -     used while making direct queries to `libgdb'. | 
| - | 
| -   When the client receives input intended for the CLI, it simply | 
| -passes it along.  Since the `cli-out' builder is installed by default, | 
| -all the CLI output in response to that command is routed (pronounced | 
| -rooted) through to the client controlled `gdb_stdout' et. al. streams. | 
| -At the same time, the client is kept abreast of internal changes by | 
| -virtue of being a `libgdb' observer. | 
| - | 
| -   The only restriction on the client is that it must wait until | 
| -`libgdb' becomes idle before initiating any queries (using the client's | 
| -custom builder). | 
| - | 
| -5.5 `libgdb' components | 
| -======================= | 
| - | 
| -Observer - `gdb-events.h' | 
| -------------------------- | 
| - | 
| -`gdb-events' provides the client with a very raw mechanism that can be | 
| -used to implement an observer.  At present it only allows for one | 
| -observer and that observer must, internally, handle the need to delay | 
| -the processing of any event notifications until after `libgdb' has | 
| -finished the current command. | 
| - | 
| -Builder - `ui-out.h' | 
| --------------------- | 
| - | 
| -`ui-out' provides the infrastructure necessary for a client to create a | 
| -builder.  That builder is then passed down to `libgdb' when doing any | 
| -queries. | 
| - | 
| -Event Loop - `event-loop.h' | 
| ---------------------------- | 
| - | 
| -`event-loop', currently non-re-entrant, provides a simple event loop. | 
| -A client would need to either plug its self into this loop or, | 
| -implement a new event-loop that GDB would use. | 
| - | 
| -   The event-loop will eventually be made re-entrant.  This is so that | 
| -GDB can better handle the problem of some commands blocking instead of | 
| -returning. | 
| - | 
| -Library - `gdb.h' | 
| ------------------ | 
| - | 
| -`libgdb' is the most obvious component of this system.  It provides the | 
| -query interface.  Each function is parameterized by a `ui-out' builder. | 
| -The result of the query is constructed using that builder before the | 
| -query function returns. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Values,  Next: Stack Frames,  Prev: libgdb,  Up: Top | 
| - | 
| -6 Values | 
| -******** | 
| - | 
| -6.1 Values | 
| -========== | 
| - | 
| -GDB uses `struct value', or "values", as an internal abstraction for | 
| -the representation of a variety of inferior objects and GDB convenience | 
| -objects. | 
| - | 
| -   Values have an associated `struct type', that describes a virtual | 
| -view of the raw data or object stored in or accessed through the value. | 
| - | 
| -   A value is in addition discriminated by its lvalue-ness, given its | 
| -`enum lval_type' enumeration type: | 
| - | 
| -``not_lval'' | 
| -     This value is not an lval.  It can't be assigned to. | 
| - | 
| -``lval_memory'' | 
| -     This value represents an object in memory. | 
| - | 
| -``lval_register'' | 
| -     This value represents an object that lives in a register. | 
| - | 
| -``lval_internalvar'' | 
| -     Represents the value of an internal variable. | 
| - | 
| -``lval_internalvar_component'' | 
| -     Represents part of a GDB internal variable.  E.g., a structure | 
| -     field. | 
| - | 
| -``lval_computed'' | 
| -     These are "computed" values.  They allow creating specialized value | 
| -     objects for specific purposes, all abstracted away from the core | 
| -     value support code.  The creator of such a value writes specialized | 
| -     functions to handle the reading and writing to/from the value's | 
| -     backend data, and optionally, a "copy operator" and a "destructor". | 
| - | 
| -     Pointers to these functions are stored in a `struct lval_funcs' | 
| -     instance (declared in `value.h'), and passed to the | 
| -     `allocate_computed_value' function, as in the example below. | 
| - | 
| -          static void | 
| -          nil_value_read (struct value *v) | 
| -          { | 
| -            /* This callback reads data from some backend, and stores it in V. | 
| -               In this case, we always read null data.  You'll want to fill in | 
| -               something more interesting.  */ | 
| - | 
| -            memset (value_contents_all_raw (v), | 
| -                    value_offset (v), | 
| -                    TYPE_LENGTH (value_type (v))); | 
| -          } | 
| - | 
| -          static void | 
| -          nil_value_write (struct value *v, struct value *fromval) | 
| -          { | 
| -            /* Takes the data from FROMVAL and stores it in the backend of V.  */ | 
| - | 
| -            to_oblivion (value_contents_all_raw (fromval), | 
| -                         value_offset (v), | 
| -                         TYPE_LENGTH (value_type (fromval))); | 
| -          } | 
| - | 
| -          static struct lval_funcs nil_value_funcs = | 
| -            { | 
| -              nil_value_read, | 
| -              nil_value_write | 
| -            }; | 
| - | 
| -          struct value * | 
| -          make_nil_value (void) | 
| -          { | 
| -             struct type *type; | 
| -             struct value *v; | 
| - | 
| -             type = make_nils_type (); | 
| -             v = allocate_computed_value (type, &nil_value_funcs, NULL); | 
| - | 
| -             return v; | 
| -          } | 
| - | 
| -     See the implementation of the `$_siginfo' convenience variable in | 
| -     `infrun.c' as a real example use of lval_computed. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Stack Frames,  Next: Symbol Handling,  Prev: Values,  Up: Top | 
| - | 
| -7 Stack Frames | 
| -************** | 
| - | 
| -A frame is a construct that GDB uses to keep track of calling and | 
| -called functions. | 
| - | 
| -   GDB's frame model, a fresh design, was implemented with the need to | 
| -support DWARF's Call Frame Information in mind.  In fact, the term | 
| -"unwind" is taken directly from that specification.  Developers wishing | 
| -to learn more about unwinders, are encouraged to read the DWARF | 
| -specification, available from `http://www.dwarfstd.org'. | 
| - | 
| -   GDB's model is that you find a frame's registers by "unwinding" them | 
| -from the next younger frame.  That is, `get_frame_register' which | 
| -returns the value of a register in frame #1 (the next-to-youngest | 
| -frame), is implemented by calling frame #0's `frame_register_unwind' | 
| -(the youngest frame).  But then the obvious question is: how do you | 
| -access the registers of the youngest frame itself? | 
| - | 
| -   To answer this question, GDB has the "sentinel" frame, the "-1st" | 
| -frame.  Unwinding registers from the sentinel frame gives you the | 
| -current values of the youngest real frame's registers.  If F is a | 
| -sentinel frame, then `get_frame_type (F) == SENTINEL_FRAME'. | 
| - | 
| -7.1 Selecting an Unwinder | 
| -========================= | 
| - | 
| -The architecture registers a list of frame unwinders (`struct | 
| -frame_unwind'), using the functions `frame_unwind_prepend_unwinder' and | 
| -`frame_unwind_append_unwinder'.  Each unwinder includes a sniffer. | 
| -Whenever GDB needs to unwind a frame (to fetch the previous frame's | 
| -registers or the current frame's ID), it calls registered sniffers in | 
| -order to find one which recognizes the frame.  The first time a sniffer | 
| -returns non-zero, the corresponding unwinder is assigned to the frame. | 
| - | 
| -7.2 Unwinding the Frame ID | 
| -========================== | 
| - | 
| -Every frame has an associated ID, of type `struct frame_id'.  The ID | 
| -includes the stack base and function start address for the frame.  The | 
| -ID persists through the entire life of the frame, including while other | 
| -called frames are running; it is used to locate an appropriate `struct | 
| -frame_info' from the cache. | 
| - | 
| -   Every time the inferior stops, and at various other times, the frame | 
| -cache is flushed.  Because of this, parts of GDB which need to keep | 
| -track of individual frames cannot use pointers to `struct frame_info'. | 
| -A frame ID provides a stable reference to a frame, even when the | 
| -unwinder must be run again to generate a new `struct frame_info' for | 
| -the same frame. | 
| - | 
| -   The frame's unwinder's `this_id' method is called to find the ID. | 
| -Note that this is different from register unwinding, where the next | 
| -frame's `prev_register' is called to unwind this frame's registers. | 
| - | 
| -   Both stack base and function address are required to identify the | 
| -frame, because a recursive function has the same function address for | 
| -two consecutive frames and a leaf function may have the same stack | 
| -address as its caller.  On some platforms, a third address is part of | 
| -the ID to further disambiguate frames--for instance, on IA-64 the | 
| -separate register stack address is included in the ID. | 
| - | 
| -   An invalid frame ID (`outer_frame_id') returned from the `this_id' | 
| -method means to stop unwinding after this frame. | 
| - | 
| -   `null_frame_id' is another invalid frame ID which should be used | 
| -when there is no frame.  For instance, certain breakpoints are attached | 
| -to a specific frame, and that frame is identified through its frame ID | 
| -(we use this to implement the "finish" command).  Using `null_frame_id' | 
| -as the frame ID for a given breakpoint means that the breakpoint is not | 
| -specific to any frame.  The `this_id' method should never return | 
| -`null_frame_id'. | 
| - | 
| -7.3 Unwinding Registers | 
| -======================= | 
| - | 
| -Each unwinder includes a `prev_register' method.  This method takes a | 
| -frame, an associated cache pointer, and a register number.  It returns | 
| -a `struct value *' describing the requested register, as saved by this | 
| -frame.  This is the value of the register that is current in this | 
| -frame's caller. | 
| - | 
| -   The returned value must have the same type as the register.  It may | 
| -have any lvalue type.  In most circumstances one of these routines will | 
| -generate the appropriate value: | 
| - | 
| -`frame_unwind_got_optimized' | 
| -     This register was not saved. | 
| - | 
| -`frame_unwind_got_register' | 
| -     This register was copied into another register in this frame.  This | 
| -     is also used for unchanged registers; they are "copied" into the | 
| -     same register. | 
| - | 
| -`frame_unwind_got_memory' | 
| -     This register was saved in memory. | 
| - | 
| -`frame_unwind_got_constant' | 
| -     This register was not saved, but the unwinder can compute the | 
| -     previous value some other way. | 
| - | 
| -`frame_unwind_got_address' | 
| -     Same as `frame_unwind_got_constant', except that the value is a | 
| -     target address.  This is frequently used for the stack pointer, | 
| -     which is not explicitly saved but has a known offset from this | 
| -     frame's stack pointer.  For architectures with a flat unified | 
| -     address space, this is generally the same as | 
| -     `frame_unwind_got_constant'. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Symbol Handling,  Next: Language Support,  Prev: Stack Frames,  Up: Top | 
| - | 
| -8 Symbol Handling | 
| -***************** | 
| - | 
| -Symbols are a key part of GDB's operation.  Symbols include variables, | 
| -functions, and types. | 
| - | 
| -   Symbol information for a large program can be truly massive, and | 
| -reading of symbol information is one of the major performance | 
| -bottlenecks in GDB; it can take many minutes to process it all. | 
| -Studies have shown that nearly all the time spent is computational, | 
| -rather than file reading. | 
| - | 
| -   One of the ways for GDB to provide a good user experience is to | 
| -start up quickly, taking no more than a few seconds.  It is simply not | 
| -possible to process all of a program's debugging info in that time, and | 
| -so we attempt to handle symbols incrementally.  For instance, we create | 
| -"partial symbol tables" consisting of only selected symbols, and only | 
| -expand them to full symbol tables when necessary. | 
| - | 
| -8.1 Symbol Reading | 
| -================== | 
| - | 
| -GDB reads symbols from "symbol files".  The usual symbol file is the | 
| -file containing the program which GDB is debugging.  GDB can be | 
| -directed to use a different file for symbols (with the `symbol-file' | 
| -command), and it can also read more symbols via the `add-file' and | 
| -`load' commands. In addition, it may bring in more symbols while | 
| -loading shared libraries. | 
| - | 
| -   Symbol files are initially opened by code in `symfile.c' using the | 
| -BFD library (*note Support Libraries::).  BFD identifies the type of | 
| -the file by examining its header.  `find_sym_fns' then uses this | 
| -identification to locate a set of symbol-reading functions. | 
| - | 
| -   Symbol-reading modules identify themselves to GDB by calling | 
| -`add_symtab_fns' during their module initialization.  The argument to | 
| -`add_symtab_fns' is a `struct sym_fns' which contains the name (or name | 
| -prefix) of the symbol format, the length of the prefix, and pointers to | 
| -four functions.  These functions are called at various times to process | 
| -symbol files whose identification matches the specified prefix. | 
| - | 
| -   The functions supplied by each module are: | 
| - | 
| -`XYZ_symfile_init(struct sym_fns *sf)' | 
| -     Called from `symbol_file_add' when we are about to read a new | 
| -     symbol file.  This function should clean up any internal state | 
| -     (possibly resulting from half-read previous files, for example) | 
| -     and prepare to read a new symbol file.  Note that the symbol file | 
| -     which we are reading might be a new "main" symbol file, or might | 
| -     be a secondary symbol file whose symbols are being added to the | 
| -     existing symbol table. | 
| - | 
| -     The argument to `XYZ_symfile_init' is a newly allocated `struct | 
| -     sym_fns' whose `bfd' field contains the BFD for the new symbol | 
| -     file being read.  Its `private' field has been zeroed, and can be | 
| -     modified as desired.  Typically, a struct of private information | 
| -     will be `malloc''d, and a pointer to it will be placed in the | 
| -     `private' field. | 
| - | 
| -     There is no result from `XYZ_symfile_init', but it can call | 
| -     `error' if it detects an unavoidable problem. | 
| - | 
| -`XYZ_new_init()' | 
| -     Called from `symbol_file_add' when discarding existing symbols. | 
| -     This function needs only handle the symbol-reading module's | 
| -     internal state; the symbol table data structures visible to the | 
| -     rest of GDB will be discarded by `symbol_file_add'.  It has no | 
| -     arguments and no result.  It may be called after | 
| -     `XYZ_symfile_init', if a new symbol table is being read, or may be | 
| -     called alone if all symbols are simply being discarded. | 
| - | 
| -`XYZ_symfile_read(struct sym_fns *sf, CORE_ADDR addr, int mainline)' | 
| -     Called from `symbol_file_add' to actually read the symbols from a | 
| -     symbol-file into a set of psymtabs or symtabs. | 
| - | 
| -     `sf' points to the `struct sym_fns' originally passed to | 
| -     `XYZ_sym_init' for possible initialization.  `addr' is the offset | 
| -     between the file's specified start address and its true address in | 
| -     memory.  `mainline' is 1 if this is the main symbol table being | 
| -     read, and 0 if a secondary symbol file (e.g., shared library or | 
| -     dynamically loaded file) is being read. | 
| - | 
| -   In addition, if a symbol-reading module creates psymtabs when | 
| -XYZ_symfile_read is called, these psymtabs will contain a pointer to a | 
| -function `XYZ_psymtab_to_symtab', which can be called from any point in | 
| -the GDB symbol-handling code. | 
| - | 
| -`XYZ_psymtab_to_symtab (struct partial_symtab *pst)' | 
| -     Called from `psymtab_to_symtab' (or the `PSYMTAB_TO_SYMTAB' macro) | 
| -     if the psymtab has not already been read in and had its | 
| -     `pst->symtab' pointer set.  The argument is the psymtab to be | 
| -     fleshed-out into a symtab.  Upon return, `pst->readin' should have | 
| -     been set to 1, and `pst->symtab' should contain a pointer to the | 
| -     new corresponding symtab, or zero if there were no symbols in that | 
| -     part of the symbol file. | 
| - | 
| -8.2 Partial Symbol Tables | 
| -========================= | 
| - | 
| -GDB has three types of symbol tables: | 
| - | 
| -   * Full symbol tables ("symtabs").  These contain the main | 
| -     information about symbols and addresses. | 
| - | 
| -   * Partial symbol tables ("psymtabs").  These contain enough | 
| -     information to know when to read the corresponding part of the full | 
| -     symbol table. | 
| - | 
| -   * Minimal symbol tables ("msymtabs").  These contain information | 
| -     gleaned from non-debugging symbols. | 
| - | 
| -   This section describes partial symbol tables. | 
| - | 
| -   A psymtab is constructed by doing a very quick pass over an | 
| -executable file's debugging information.  Small amounts of information | 
| -are extracted--enough to identify which parts of the symbol table will | 
| -need to be re-read and fully digested later, when the user needs the | 
| -information.  The speed of this pass causes GDB to start up very | 
| -quickly.  Later, as the detailed rereading occurs, it occurs in small | 
| -pieces, at various times, and the delay therefrom is mostly invisible to | 
| -the user. | 
| - | 
| -   The symbols that show up in a file's psymtab should be, roughly, | 
| -those visible to the debugger's user when the program is not running | 
| -code from that file.  These include external symbols and types, static | 
| -symbols and types, and `enum' values declared at file scope. | 
| - | 
| -   The psymtab also contains the range of instruction addresses that the | 
| -full symbol table would represent. | 
| - | 
| -   The idea is that there are only two ways for the user (or much of the | 
| -code in the debugger) to reference a symbol: | 
| - | 
| -   * By its address (e.g., execution stops at some address which is | 
| -     inside a function in this file).  The address will be noticed to | 
| -     be in the range of this psymtab, and the full symtab will be read | 
| -     in.  `find_pc_function', `find_pc_line', and other `find_pc_...' | 
| -     functions handle this. | 
| - | 
| -   * By its name (e.g., the user asks to print a variable, or set a | 
| -     breakpoint on a function).  Global names and file-scope names will | 
| -     be found in the psymtab, which will cause the symtab to be pulled | 
| -     in.  Local names will have to be qualified by a global name, or a | 
| -     file-scope name, in which case we will have already read in the | 
| -     symtab as we evaluated the qualifier.  Or, a local symbol can be | 
| -     referenced when we are "in" a local scope, in which case the first | 
| -     case applies.  `lookup_symbol' does most of the work here. | 
| - | 
| -   The only reason that psymtabs exist is to cause a symtab to be read | 
| -in at the right moment.  Any symbol that can be elided from a psymtab, | 
| -while still causing that to happen, should not appear in it.  Since | 
| -psymtabs don't have the idea of scope, you can't put local symbols in | 
| -them anyway.  Psymtabs don't have the idea of the type of a symbol, | 
| -either, so types need not appear, unless they will be referenced by | 
| -name. | 
| - | 
| -   It is a bug for GDB to behave one way when only a psymtab has been | 
| -read, and another way if the corresponding symtab has been read in. | 
| -Such bugs are typically caused by a psymtab that does not contain all | 
| -the visible symbols, or which has the wrong instruction address ranges. | 
| - | 
| -   The psymtab for a particular section of a symbol file (objfile) | 
| -could be thrown away after the symtab has been read in.  The symtab | 
| -should always be searched before the psymtab, so the psymtab will never | 
| -be used (in a bug-free environment).  Currently, psymtabs are allocated | 
| -on an obstack, and all the psymbols themselves are allocated in a pair | 
| -of large arrays on an obstack, so there is little to be gained by | 
| -trying to free them unless you want to do a lot more work. | 
| - | 
| -   Whether or not psymtabs are created depends on the objfile's symbol | 
| -reader.  The core of GDB hides the details of partial symbols and | 
| -partial symbol tables behind a set of function pointers known as the | 
| -"quick symbol functions".  These are documented in `symfile.h'. | 
| - | 
| -8.3 Types | 
| -========= | 
| - | 
| -Fundamental Types (e.g., `FT_VOID', `FT_BOOLEAN'). | 
| --------------------------------------------------- | 
| - | 
| -These are the fundamental types that GDB uses internally.  Fundamental | 
| -types from the various debugging formats (stabs, ELF, etc) are mapped | 
| -into one of these.  They are basically a union of all fundamental types | 
| -that GDB knows about for all the languages that GDB knows about. | 
| - | 
| -Type Codes (e.g., `TYPE_CODE_PTR', `TYPE_CODE_ARRAY'). | 
| ------------------------------------------------------- | 
| - | 
| -Each time GDB builds an internal type, it marks it with one of these | 
| -types.  The type may be a fundamental type, such as `TYPE_CODE_INT', or | 
| -a derived type, such as `TYPE_CODE_PTR' which is a pointer to another | 
| -type.  Typically, several `FT_*' types map to one `TYPE_CODE_*' type, | 
| -and are distinguished by other members of the type struct, such as | 
| -whether the type is signed or unsigned, and how many bits it uses. | 
| - | 
| -Builtin Types (e.g., `builtin_type_void', `builtin_type_char'). | 
| ---------------------------------------------------------------- | 
| - | 
| -These are instances of type structs that roughly correspond to | 
| -fundamental types and are created as global types for GDB to use for | 
| -various ugly historical reasons.  We eventually want to eliminate | 
| -these.  Note for example that `builtin_type_int' initialized in | 
| -`gdbtypes.c' is basically the same as a `TYPE_CODE_INT' type that is | 
| -initialized in `c-lang.c' for an `FT_INTEGER' fundamental type.  The | 
| -difference is that the `builtin_type' is not associated with any | 
| -particular objfile, and only one instance exists, while `c-lang.c' | 
| -builds as many `TYPE_CODE_INT' types as needed, with each one | 
| -associated with some particular objfile. | 
| - | 
| -8.4 Object File Formats | 
| -======================= | 
| - | 
| -8.4.1 a.out | 
| ------------ | 
| - | 
| -The `a.out' format is the original file format for Unix.  It consists | 
| -of three sections: `text', `data', and `bss', which are for program | 
| -code, initialized data, and uninitialized data, respectively. | 
| - | 
| -   The `a.out' format is so simple that it doesn't have any reserved | 
| -place for debugging information.  (Hey, the original Unix hackers used | 
| -`adb', which is a machine-language debugger!)  The only debugging | 
| -format for `a.out' is stabs, which is encoded as a set of normal | 
| -symbols with distinctive attributes. | 
| - | 
| -   The basic `a.out' reader is in `dbxread.c'. | 
| - | 
| -8.4.2 COFF | 
| ----------- | 
| - | 
| -The COFF format was introduced with System V Release 3 (SVR3) Unix. | 
| -COFF files may have multiple sections, each prefixed by a header.  The | 
| -number of sections is limited. | 
| - | 
| -   The COFF specification includes support for debugging.  Although this | 
| -was a step forward, the debugging information was woefully limited. | 
| -For instance, it was not possible to represent code that came from an | 
| -included file.  GNU's COFF-using configs often use stabs-type info, | 
| -encapsulated in special sections. | 
| - | 
| -   The COFF reader is in `coffread.c'. | 
| - | 
| -8.4.3 ECOFF | 
| ------------ | 
| - | 
| -ECOFF is an extended COFF originally introduced for Mips and Alpha | 
| -workstations. | 
| - | 
| -   The basic ECOFF reader is in `mipsread.c'. | 
| - | 
| -8.4.4 XCOFF | 
| ------------ | 
| - | 
| -The IBM RS/6000 running AIX uses an object file format called XCOFF. | 
| -The COFF sections, symbols, and line numbers are used, but debugging | 
| -symbols are `dbx'-style stabs whose strings are located in the `.debug' | 
| -section (rather than the string table).  For more information, see | 
| -*Note Top: (stabs)Top. | 
| - | 
| -   The shared library scheme has a clean interface for figuring out what | 
| -shared libraries are in use, but the catch is that everything which | 
| -refers to addresses (symbol tables and breakpoints at least) needs to be | 
| -relocated for both shared libraries and the main executable.  At least | 
| -using the standard mechanism this can only be done once the program has | 
| -been run (or the core file has been read). | 
| - | 
| -8.4.5 PE | 
| --------- | 
| - | 
| -Windows 95 and NT use the PE ("Portable Executable") format for their | 
| -executables.  PE is basically COFF with additional headers. | 
| - | 
| -   While BFD includes special PE support, GDB needs only the basic COFF | 
| -reader. | 
| - | 
| -8.4.6 ELF | 
| ---------- | 
| - | 
| -The ELF format came with System V Release 4 (SVR4) Unix.  ELF is | 
| -similar to COFF in being organized into a number of sections, but it | 
| -removes many of COFF's limitations.  Debugging info may be either stabs | 
| -encapsulated in ELF sections, or more commonly these days, DWARF. | 
| - | 
| -   The basic ELF reader is in `elfread.c'. | 
| - | 
| -8.4.7 SOM | 
| ---------- | 
| - | 
| -SOM is HP's object file and debug format (not to be confused with IBM's | 
| -SOM, which is a cross-language ABI). | 
| - | 
| -   The SOM reader is in `somread.c'. | 
| - | 
| -8.5 Debugging File Formats | 
| -========================== | 
| - | 
| -This section describes characteristics of debugging information that | 
| -are independent of the object file format. | 
| - | 
| -8.5.1 stabs | 
| ------------ | 
| - | 
| -`stabs' started out as special symbols within the `a.out' format. | 
| -Since then, it has been encapsulated into other file formats, such as | 
| -COFF and ELF. | 
| - | 
| -   While `dbxread.c' does some of the basic stab processing, including | 
| -for encapsulated versions, `stabsread.c' does the real work. | 
| - | 
| -8.5.2 COFF | 
| ----------- | 
| - | 
| -The basic COFF definition includes debugging information.  The level of | 
| -support is minimal and non-extensible, and is not often used. | 
| - | 
| -8.5.3 Mips debug (Third Eye) | 
| ----------------------------- | 
| - | 
| -ECOFF includes a definition of a special debug format. | 
| - | 
| -   The file `mdebugread.c' implements reading for this format. | 
| - | 
| -8.5.4 DWARF 2 | 
| -------------- | 
| - | 
| -DWARF 2 is an improved but incompatible version of DWARF 1. | 
| - | 
| -   The DWARF 2 reader is in `dwarf2read.c'. | 
| - | 
| -8.5.5 Compressed DWARF 2 | 
| ------------------------- | 
| - | 
| -Compressed DWARF 2 is not technically a separate debugging format, but | 
| -merely DWARF 2 debug information that has been compressed.  In this | 
| -format, every object-file section holding DWARF 2 debugging information | 
| -is compressed and prepended with a header.  (The section is also | 
| -typically renamed, so a section called `.debug_info' in a DWARF 2 | 
| -binary would be called `.zdebug_info' in a compressed DWARF 2 binary.) | 
| -The header is 12 bytes long: | 
| - | 
| -   * 4 bytes: the literal string "ZLIB" | 
| - | 
| -   * 8 bytes: the uncompressed size of the section, in big-endian byte | 
| -     order. | 
| - | 
| -   The same reader is used for both compressed an normal DWARF 2 info. | 
| -Section decompression is done in `zlib_decompress_section' in | 
| -`dwarf2read.c'. | 
| - | 
| -8.5.6 DWARF 3 | 
| -------------- | 
| - | 
| -DWARF 3 is an improved version of DWARF 2. | 
| - | 
| -8.5.7 SOM | 
| ---------- | 
| - | 
| -Like COFF, the SOM definition includes debugging information. | 
| - | 
| -8.6 Adding a New Symbol Reader to GDB | 
| -===================================== | 
| - | 
| -If you are using an existing object file format (`a.out', COFF, ELF, | 
| -etc), there is probably little to be done. | 
| - | 
| -   If you need to add a new object file format, you must first add it to | 
| -BFD.  This is beyond the scope of this document. | 
| - | 
| -   You must then arrange for the BFD code to provide access to the | 
| -debugging symbols.  Generally GDB will have to call swapping routines | 
| -from BFD and a few other BFD internal routines to locate the debugging | 
| -information.  As much as possible, GDB should not depend on the BFD | 
| -internal data structures. | 
| - | 
| -   For some targets (e.g., COFF), there is a special transfer vector | 
| -used to call swapping routines, since the external data structures on | 
| -various platforms have different sizes and layouts.  Specialized | 
| -routines that will only ever be implemented by one object file format | 
| -may be called directly.  This interface should be described in a file | 
| -`bfd/libXYZ.h', which is included by GDB. | 
| - | 
| -8.7 Memory Management for Symbol Files | 
| -====================================== | 
| - | 
| -Most memory associated with a loaded symbol file is stored on its | 
| -`objfile_obstack'.  This includes symbols, types, namespace data, and | 
| -other information produced by the symbol readers. | 
| - | 
| -   Because this data lives on the objfile's obstack, it is automatically | 
| -released when the objfile is unloaded or reloaded.  Therefore one | 
| -objfile must not reference symbol or type data from another objfile; | 
| -they could be unloaded at different times. | 
| - | 
| -   User convenience variables, et cetera, have associated types. | 
| -Normally these types live in the associated objfile.  However, when the | 
| -objfile is unloaded, those types are deep copied to global memory, so | 
| -that the values of the user variables and history items are not lost. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Language Support,  Next: Host Definition,  Prev: Symbol Handling,  Up: Top | 
| - | 
| -9 Language Support | 
| -****************** | 
| - | 
| -GDB's language support is mainly driven by the symbol reader, although | 
| -it is possible for the user to set the source language manually. | 
| - | 
| -   GDB chooses the source language by looking at the extension of the | 
| -file recorded in the debug info; `.c' means C, `.f' means Fortran, etc. | 
| -It may also use a special-purpose language identifier if the debug | 
| -format supports it, like with DWARF. | 
| - | 
| -9.1 Adding a Source Language to GDB | 
| -=================================== | 
| - | 
| -To add other languages to GDB's expression parser, follow the following | 
| -steps: | 
| - | 
| -_Create the expression parser._ | 
| -     This should reside in a file `LANG-exp.y'.  Routines for building | 
| -     parsed expressions into a `union exp_element' list are in | 
| -     `parse.c'. | 
| - | 
| -     Since we can't depend upon everyone having Bison, and YACC produces | 
| -     parsers that define a bunch of global names, the following lines | 
| -     *must* be included at the top of the YACC parser, to prevent the | 
| -     various parsers from defining the same global names: | 
| - | 
| -          #define yyparse         LANG_parse | 
| -          #define yylex           LANG_lex | 
| -          #define yyerror         LANG_error | 
| -          #define yylval          LANG_lval | 
| -          #define yychar          LANG_char | 
| -          #define yydebug         LANG_debug | 
| -          #define yypact          LANG_pact | 
| -          #define yyr1            LANG_r1 | 
| -          #define yyr2            LANG_r2 | 
| -          #define yydef           LANG_def | 
| -          #define yychk           LANG_chk | 
| -          #define yypgo           LANG_pgo | 
| -          #define yyact           LANG_act | 
| -          #define yyexca          LANG_exca | 
| -          #define yyerrflag       LANG_errflag | 
| -          #define yynerrs         LANG_nerrs | 
| - | 
| -     At the bottom of your parser, define a `struct language_defn' and | 
| -     initialize it with the right values for your language.  Define an | 
| -     `initialize_LANG' routine and have it call | 
| -     `add_language(LANG_language_defn)' to tell the rest of GDB that | 
| -     your language exists.  You'll need some other supporting variables | 
| -     and functions, which will be used via pointers from your | 
| -     `LANG_language_defn'.  See the declaration of `struct | 
| -     language_defn' in `language.h', and the other `*-exp.y' files, for | 
| -     more information. | 
| - | 
| -_Add any evaluation routines, if necessary_ | 
| -     If you need new opcodes (that represent the operations of the | 
| -     language), add them to the enumerated type in `expression.h'.  Add | 
| -     support code for these operations in the `evaluate_subexp' function | 
| -     defined in the file `eval.c'.  Add cases for new opcodes in two | 
| -     functions from `parse.c': `prefixify_subexp' and | 
| -     `length_of_subexp'.  These compute the number of `exp_element's | 
| -     that a given operation takes up. | 
| - | 
| -_Update some existing code_ | 
| -     Add an enumerated identifier for your language to the enumerated | 
| -     type `enum language' in `defs.h'. | 
| - | 
| -     Update the routines in `language.c' so your language is included. | 
| -     These routines include type predicates and such, which (in some | 
| -     cases) are language dependent.  If your language does not appear | 
| -     in the switch statement, an error is reported. | 
| - | 
| -     Also included in `language.c' is the code that updates the variable | 
| -     `current_language', and the routines that translate the | 
| -     `language_LANG' enumerated identifier into a printable string. | 
| - | 
| -     Update the function `_initialize_language' to include your | 
| -     language.  This function picks the default language upon startup, | 
| -     so is dependent upon which languages that GDB is built for. | 
| - | 
| -     Update `allocate_symtab' in `symfile.c' and/or symbol-reading code | 
| -     so that the language of each symtab (source file) is set properly. | 
| -     This is used to determine the language to use at each stack frame | 
| -     level.  Currently, the language is set based upon the extension of | 
| -     the source file.  If the language can be better inferred from the | 
| -     symbol information, please set the language of the symtab in the | 
| -     symbol-reading code. | 
| - | 
| -     Add helper code to `print_subexp' (in `expprint.c') to handle any | 
| -     new expression opcodes you have added to `expression.h'.  Also, | 
| -     add the printed representations of your operators to | 
| -     `op_print_tab'. | 
| - | 
| -_Add a place of call_ | 
| -     Add a call to `LANG_parse()' and `LANG_error' in `parse_exp_1' | 
| -     (defined in `parse.c'). | 
| - | 
| -_Edit `Makefile.in'_ | 
| -     Add dependencies in `Makefile.in'.  Make sure you update the macro | 
| -     variables such as `HFILES' and `OBJS', otherwise your code may not | 
| -     get linked in, or, worse yet, it may not get `tar'red into the | 
| -     distribution! | 
| - | 
| - | 
| -File: gdbint.info,  Node: Host Definition,  Next: Target Architecture Definition,  Prev: Language Support,  Up: Top | 
| - | 
| -10 Host Definition | 
| -****************** | 
| - | 
| -With the advent of Autoconf, it's rarely necessary to have host | 
| -definition machinery anymore.  The following information is provided, | 
| -mainly, as an historical reference. | 
| - | 
| -10.1 Adding a New Host | 
| -====================== | 
| - | 
| -GDB's host configuration support normally happens via Autoconf.  New | 
| -host-specific definitions should not be needed.  Older hosts GDB still | 
| -use the host-specific definitions and files listed below, but these | 
| -mostly exist for historical reasons, and will eventually disappear. | 
| - | 
| -`gdb/config/ARCH/XYZ.mh' | 
| -     This file is a Makefile fragment that once contained both host and | 
| -     native configuration information (*note Native Debugging::) for the | 
| -     machine XYZ.  The host configuration information is now handled by | 
| -     Autoconf. | 
| - | 
| -     Host configuration information included definitions for `CC', | 
| -     `SYSV_DEFINE', `XM_CFLAGS', `XM_ADD_FILES', `XM_CLIBS', | 
| -     `XM_CDEPS', etc.; see `Makefile.in'. | 
| - | 
| -     New host-only configurations do not need this file. | 
| - | 
| - | 
| -   (Files named `gdb/config/ARCH/xm-XYZ.h' were once used to define | 
| -host-specific macros, but were no longer needed and have all been | 
| -removed.) | 
| - | 
| -Generic Host Support Files | 
| --------------------------- | 
| - | 
| -There are some "generic" versions of routines that can be used by | 
| -various systems. | 
| - | 
| -`ser-unix.c' | 
| -     This contains serial line support for Unix systems.  It is | 
| -     included by default on all Unix-like hosts. | 
| - | 
| -`ser-pipe.c' | 
| -     This contains serial pipe support for Unix systems.  It is | 
| -     included by default on all Unix-like hosts. | 
| - | 
| -`ser-mingw.c' | 
| -     This contains serial line support for 32-bit programs running under | 
| -     Windows using MinGW. | 
| - | 
| -`ser-go32.c' | 
| -     This contains serial line support for 32-bit programs running | 
| -     under DOS, using the DJGPP (a.k.a. GO32) execution environment. | 
| - | 
| -`ser-tcp.c' | 
| -     This contains generic TCP support using sockets.  It is included by | 
| -     default on all Unix-like hosts and with MinGW. | 
| - | 
| -10.2 Host Conditionals | 
| -====================== | 
| - | 
| -When GDB is configured and compiled, various macros are defined or left | 
| -undefined, to control compilation based on the attributes of the host | 
| -system.  While formerly they could be set in host-specific header | 
| -files, at present they can be changed only by setting `CFLAGS' when | 
| -building, or by editing the source code. | 
| - | 
| -   These macros and their meanings (or if the meaning is not documented | 
| -here, then one of the source files where they are used is indicated) | 
| -are: | 
| - | 
| -`GDBINIT_FILENAME' | 
| -     The default name of GDB's initialization file (normally | 
| -     `.gdbinit'). | 
| - | 
| -`SIGWINCH_HANDLER' | 
| -     If your host defines `SIGWINCH', you can define this to be the name | 
| -     of a function to be called if `SIGWINCH' is received. | 
| - | 
| -`SIGWINCH_HANDLER_BODY' | 
| -     Define this to expand into code that will define the function | 
| -     named by the expansion of `SIGWINCH_HANDLER'. | 
| - | 
| -`CRLF_SOURCE_FILES' | 
| -     Define this if host files use `\r\n' rather than `\n' as a line | 
| -     terminator.  This will cause source file listings to omit `\r' | 
| -     characters when printing and it will allow `\r\n' line endings of | 
| -     files which are "sourced" by gdb.  It must be possible to open | 
| -     files in binary mode using `O_BINARY' or, for fopen, `"rb"'. | 
| - | 
| -`DEFAULT_PROMPT' | 
| -     The default value of the prompt string (normally `"(gdb) "'). | 
| - | 
| -`DEV_TTY' | 
| -     The name of the generic TTY device, defaults to `"/dev/tty"'. | 
| - | 
| -`ISATTY' | 
| -     Substitute for isatty, if not available. | 
| - | 
| -`FOPEN_RB' | 
| -     Define this if binary files are opened the same way as text files. | 
| - | 
| -`CC_HAS_LONG_LONG' | 
| -     Define this if the host C compiler supports `long long'.  This is | 
| -     set by the `configure' script. | 
| - | 
| -`PRINTF_HAS_LONG_LONG' | 
| -     Define this if the host can handle printing of long long integers | 
| -     via the printf format conversion specifier `ll'.  This is set by | 
| -     the `configure' script. | 
| - | 
| -`LSEEK_NOT_LINEAR' | 
| -     Define this if `lseek (n)' does not necessarily move to byte number | 
| -     `n' in the file.  This is only used when reading source files.  It | 
| -     is normally faster to define `CRLF_SOURCE_FILES' when possible. | 
| - | 
| -`lint' | 
| -     Define this to help placate `lint' in some situations. | 
| - | 
| -`volatile' | 
| -     Define this to override the defaults of `__volatile__' or `/**/'. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Target Architecture Definition,  Next: Target Descriptions,  Prev: Host Definition,  Up: Top | 
| - | 
| -11 Target Architecture Definition | 
| -********************************* | 
| - | 
| -GDB's target architecture defines what sort of machine-language | 
| -programs GDB can work with, and how it works with them. | 
| - | 
| -   The target architecture object is implemented as the C structure | 
| -`struct gdbarch *'.  The structure, and its methods, are generated | 
| -using the Bourne shell script `gdbarch.sh'. | 
| - | 
| -* Menu: | 
| - | 
| -* OS ABI Variant Handling:: | 
| -* Initialize New Architecture:: | 
| -* Registers and Memory:: | 
| -* Pointers and Addresses:: | 
| -* Address Classes:: | 
| -* Register Representation:: | 
| -* Frame Interpretation:: | 
| -* Inferior Call Setup:: | 
| -* Adding support for debugging core files:: | 
| -* Defining Other Architecture Features:: | 
| -* Adding a New Target:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: OS ABI Variant Handling,  Next: Initialize New Architecture,  Up: Target Architecture Definition | 
| - | 
| -11.1 Operating System ABI Variant Handling | 
| -========================================== | 
| - | 
| -GDB provides a mechanism for handling variations in OS ABIs.  An OS ABI | 
| -variant may have influence over any number of variables in the target | 
| -architecture definition.  There are two major components in the OS ABI | 
| -mechanism: sniffers and handlers. | 
| - | 
| -   A "sniffer" examines a file matching a BFD architecture/flavour pair | 
| -(the architecture may be wildcarded) in an attempt to determine the OS | 
| -ABI of that file.  Sniffers with a wildcarded architecture are | 
| -considered to be "generic", while sniffers for a specific architecture | 
| -are considered to be "specific".  A match from a specific sniffer | 
| -overrides a match from a generic sniffer.  Multiple sniffers for an | 
| -architecture/flavour may exist, in order to differentiate between two | 
| -different operating systems which use the same basic file format.  The | 
| -OS ABI framework provides a generic sniffer for ELF-format files which | 
| -examines the `EI_OSABI' field of the ELF header, as well as note | 
| -sections known to be used by several operating systems. | 
| - | 
| -   A "handler" is used to fine-tune the `gdbarch' structure for the | 
| -selected OS ABI.  There may be only one handler for a given OS ABI for | 
| -each BFD architecture. | 
| - | 
| -   The following OS ABI variants are defined in `defs.h': | 
| - | 
| -`GDB_OSABI_UNINITIALIZED' | 
| -     Used for struct gdbarch_info if ABI is still uninitialized. | 
| - | 
| -`GDB_OSABI_UNKNOWN' | 
| -     The ABI of the inferior is unknown.  The default `gdbarch' | 
| -     settings for the architecture will be used. | 
| - | 
| -`GDB_OSABI_SVR4' | 
| -     UNIX System V Release 4. | 
| - | 
| -`GDB_OSABI_HURD' | 
| -     GNU using the Hurd kernel. | 
| - | 
| -`GDB_OSABI_SOLARIS' | 
| -     Sun Solaris. | 
| - | 
| -`GDB_OSABI_OSF1' | 
| -     OSF/1, including Digital UNIX and Compaq Tru64 UNIX. | 
| - | 
| -`GDB_OSABI_LINUX' | 
| -     GNU using the Linux kernel. | 
| - | 
| -`GDB_OSABI_FREEBSD_AOUT' | 
| -     FreeBSD using the `a.out' executable format. | 
| - | 
| -`GDB_OSABI_FREEBSD_ELF' | 
| -     FreeBSD using the ELF executable format. | 
| - | 
| -`GDB_OSABI_NETBSD_AOUT' | 
| -     NetBSD using the `a.out' executable format. | 
| - | 
| -`GDB_OSABI_NETBSD_ELF' | 
| -     NetBSD using the ELF executable format. | 
| - | 
| -`GDB_OSABI_OPENBSD_ELF' | 
| -     OpenBSD using the ELF executable format. | 
| - | 
| -`GDB_OSABI_WINCE' | 
| -     Windows CE. | 
| - | 
| -`GDB_OSABI_GO32' | 
| -     DJGPP. | 
| - | 
| -`GDB_OSABI_IRIX' | 
| -     Irix. | 
| - | 
| -`GDB_OSABI_INTERIX' | 
| -     Interix (Posix layer for MS-Windows systems). | 
| - | 
| -`GDB_OSABI_HPUX_ELF' | 
| -     HP/UX using the ELF executable format. | 
| - | 
| -`GDB_OSABI_HPUX_SOM' | 
| -     HP/UX using the SOM executable format. | 
| - | 
| -`GDB_OSABI_QNXNTO' | 
| -     QNX Neutrino. | 
| - | 
| -`GDB_OSABI_CYGWIN' | 
| -     Cygwin. | 
| - | 
| -`GDB_OSABI_AIX' | 
| -     AIX. | 
| - | 
| - | 
| -   Here are the functions that make up the OS ABI framework: | 
| - | 
| - -- Function: const char * gdbarch_osabi_name (enum gdb_osabi OSABI) | 
| -     Return the name of the OS ABI corresponding to OSABI. | 
| - | 
| - -- Function: void gdbarch_register_osabi (enum bfd_architecture ARCH, | 
| -          unsigned long MACHINE, enum gdb_osabi OSABI, void | 
| -          (*INIT_OSABI)(struct gdbarch_info INFO, struct gdbarch | 
| -          *GDBARCH)) | 
| -     Register the OS ABI handler specified by INIT_OSABI for the | 
| -     architecture, machine type and OS ABI specified by ARCH, MACHINE | 
| -     and OSABI.  In most cases, a value of zero for the machine type, | 
| -     which implies the architecture's default machine type, will | 
| -     suffice. | 
| - | 
| - -- Function: void gdbarch_register_osabi_sniffer (enum | 
| -          bfd_architecture ARCH, enum bfd_flavour FLAVOUR, enum | 
| -          gdb_osabi (*SNIFFER)(bfd *ABFD)) | 
| -     Register the OS ABI file sniffer specified by SNIFFER for the BFD | 
| -     architecture/flavour pair specified by ARCH and FLAVOUR.  If ARCH | 
| -     is `bfd_arch_unknown', the sniffer is considered to be generic, | 
| -     and is allowed to examine FLAVOUR-flavoured files for any | 
| -     architecture. | 
| - | 
| - -- Function: enum gdb_osabi gdbarch_lookup_osabi (bfd *ABFD) | 
| -     Examine the file described by ABFD to determine its OS ABI.  The | 
| -     value `GDB_OSABI_UNKNOWN' is returned if the OS ABI cannot be | 
| -     determined. | 
| - | 
| - -- Function: void gdbarch_init_osabi (struct gdbarch info INFO, struct | 
| -          gdbarch *GDBARCH, enum gdb_osabi OSABI) | 
| -     Invoke the OS ABI handler corresponding to OSABI to fine-tune the | 
| -     `gdbarch' structure specified by GDBARCH.  If a handler | 
| -     corresponding to OSABI has not been registered for GDBARCH's | 
| -     architecture, a warning will be issued and the debugging session | 
| -     will continue with the defaults already established for GDBARCH. | 
| - | 
| - -- Function: void generic_elf_osabi_sniff_abi_tag_sections (bfd *ABFD, | 
| -          asection *SECT, void *OBJ) | 
| -     Helper routine for ELF file sniffers.  Examine the file described | 
| -     by ABFD and look at ABI tag note sections to determine the OS ABI | 
| -     from the note.  This function should be called via | 
| -     `bfd_map_over_sections'. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Initialize New Architecture,  Next: Registers and Memory,  Prev: OS ABI Variant Handling,  Up: Target Architecture Definition | 
| - | 
| -11.2 Initializing a New Architecture | 
| -==================================== | 
| - | 
| -* Menu: | 
| - | 
| -* How an Architecture is Represented:: | 
| -* Looking Up an Existing Architecture:: | 
| -* Creating a New Architecture:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: How an Architecture is Represented,  Next: Looking Up an Existing Architecture,  Up: Initialize New Architecture | 
| - | 
| -11.2.1 How an Architecture is Represented | 
| ------------------------------------------ | 
| - | 
| -Each `gdbarch' is associated with a single BFD architecture, via a | 
| -`bfd_arch_ARCH' in the `bfd_architecture' enumeration.  The `gdbarch' | 
| -is registered by a call to `register_gdbarch_init', usually from the | 
| -file's `_initialize_FILENAME' routine, which will be automatically | 
| -called during GDB startup.  The arguments are a BFD architecture | 
| -constant and an initialization function. | 
| - | 
| -   A GDB description for a new architecture, ARCH is created by | 
| -defining a global function `_initialize_ARCH_tdep', by convention in | 
| -the source file `ARCH-tdep.c'.  For example, in the case of the | 
| -OpenRISC 1000, this function is called `_initialize_or1k_tdep' and is | 
| -found in the file `or1k-tdep.c'. | 
| - | 
| -   The resulting object files containing the implementation of the | 
| -`_initialize_ARCH_tdep' function are specified in the GDB | 
| -`configure.tgt' file, which includes a large case statement pattern | 
| -matching against the `--target' option of the `configure' script.  The | 
| -new `struct gdbarch' is created within the `_initialize_ARCH_tdep' | 
| -function by calling `gdbarch_register': | 
| - | 
| -     void gdbarch_register (enum bfd_architecture    ARCHITECTURE, | 
| -                            gdbarch_init_ftype      *INIT_FUNC, | 
| -                            gdbarch_dump_tdep_ftype *TDEP_DUMP_FUNC); | 
| - | 
| -   The ARCHITECTURE will identify the unique BFD to be associated with | 
| -this `gdbarch'.  The INIT_FUNC funciton is called to create and return | 
| -the new `struct gdbarch'.  The TDEP_DUMP_FUNC function will dump the | 
| -target specific details associated with this architecture. | 
| - | 
| -   For example the function `_initialize_or1k_tdep' creates its | 
| -architecture for 32-bit OpenRISC 1000 architectures by calling: | 
| - | 
| -     gdbarch_register (bfd_arch_or32, or1k_gdbarch_init, or1k_dump_tdep); | 
| - | 
| - | 
| -File: gdbint.info,  Node: Looking Up an Existing Architecture,  Next: Creating a New Architecture,  Prev: How an Architecture is Represented,  Up: Initialize New Architecture | 
| - | 
| -11.2.2 Looking Up an Existing Architecture | 
| ------------------------------------------- | 
| - | 
| -The initialization function has this prototype: | 
| - | 
| -     static struct gdbarch * | 
| -     ARCH_gdbarch_init (struct gdbarch_info INFO, | 
| -                              struct gdbarch_list *ARCHES) | 
| - | 
| -   The INFO argument contains parameters used to select the correct | 
| -architecture, and ARCHES is a list of architectures which have already | 
| -been created with the same `bfd_arch_ARCH' value. | 
| - | 
| -   The initialization function should first make sure that INFO is | 
| -acceptable, and return `NULL' if it is not.  Then, it should search | 
| -through ARCHES for an exact match to INFO, and return one if found. | 
| -Lastly, if no exact match was found, it should create a new | 
| -architecture based on INFO and return it. | 
| - | 
| -   The lookup is done using `gdbarch_list_lookup_by_info'.  It is | 
| -passed the list of existing architectures, ARCHES, and the `struct | 
| -gdbarch_info', INFO, and returns the first matching architecture it | 
| -finds, or `NULL' if none are found.  If an architecture is found it can | 
| -be returned as the result from the initialization function, otherwise a | 
| -new `struct gdbach' will need to be created. | 
| - | 
| -   The struct gdbarch_info has the following components: | 
| - | 
| -     struct gdbarch_info | 
| -     { | 
| -        const struct bfd_arch_info *bfd_arch_info; | 
| -        int                         byte_order; | 
| -        bfd                        *abfd; | 
| -        struct gdbarch_tdep_info   *tdep_info; | 
| -        enum gdb_osabi              osabi; | 
| -        const struct target_desc   *target_desc; | 
| -     }; | 
| - | 
| -   The `bfd_arch_info' member holds the key details about the | 
| -architecture.  The `byte_order' member is a value in an enumeration | 
| -indicating the endianism.  The `abfd' member is a pointer to the full | 
| -BFD, the `tdep_info' member is additional custom target specific | 
| -information, `osabi' identifies which (if any) of a number of operating | 
| -specific ABIs are used by this architecture and the `target_desc' | 
| -member is a set of name-value pairs with information about register | 
| -usage in this target. | 
| - | 
| -   When the `struct gdbarch' initialization function is called, not all | 
| -the fields are provided--only those which can be deduced from the BFD. | 
| -The `struct gdbarch_info', INFO is used as a look-up key with the list | 
| -of existing architectures, ARCHES to see if a suitable architecture | 
| -already exists.  The TDEP_INFO, OSABI and TARGET_DESC fields may be | 
| -added before this lookup to refine the search. | 
| - | 
| -   Only information in INFO should be used to choose the new | 
| -architecture.  Historically, INFO could be sparse, and defaults would | 
| -be collected from the first element on ARCHES.  However, GDB now fills | 
| -in INFO more thoroughly, so new `gdbarch' initialization functions | 
| -should not take defaults from ARCHES. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Creating a New Architecture,  Prev: Looking Up an Existing Architecture,  Up: Initialize New Architecture | 
| - | 
| -11.2.3 Creating a New Architecture | 
| ----------------------------------- | 
| - | 
| -If no architecture is found, then a new architecture must be created, | 
| -by calling `gdbarch_alloc' using the supplied `struct gdbarch_info' and | 
| -any additional custom target specific information in a `struct | 
| -gdbarch_tdep'.  The prototype for `gdbarch_alloc' is: | 
| - | 
| -     struct gdbarch *gdbarch_alloc (const struct gdbarch_info *INFO, | 
| -                                    struct gdbarch_tdep       *TDEP); | 
| - | 
| -   The newly created struct gdbarch must then be populated.  Although | 
| -there are default values, in most cases they are not what is required. | 
| - | 
| -   For each element, X, there is are a pair of corresponding accessor | 
| -functions, one to set the value of that element, `set_gdbarch_X', the | 
| -second to either get the value of an element (if it is a variable) or | 
| -to apply the element (if it is a function), `gdbarch_X'.  Note that | 
| -both accessor functions take a pointer to the `struct gdbarch' as first | 
| -argument.  Populating the new `gdbarch' should use the `set_gdbarch' | 
| -functions. | 
| - | 
| -   The following sections identify the main elements that should be set | 
| -in this way.  This is not the complete list, but represents the | 
| -functions and elements that must commonly be specified for a new | 
| -architecture.  Many of the functions and variables are described in the | 
| -header file `gdbarch.h'. | 
| - | 
| -   This is the main work in defining a new architecture.  Implementing | 
| -the set of functions to populate the `struct gdbarch'. | 
| - | 
| -   `struct gdbarch_tdep' is not defined within GDB--it is up to the | 
| -user to define this struct if it is needed to hold custom target | 
| -information that is not covered by the standard `struct gdbarch'. For | 
| -example with the OpenRISC 1000 architecture it is used to hold the | 
| -number of matchpoints available in the target (along with other | 
| -information). | 
| - | 
| -   If there is no additional target specific information, it can be set | 
| -to `NULL'. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Registers and Memory,  Next: Pointers and Addresses,  Prev: Initialize New Architecture,  Up: Target Architecture Definition | 
| - | 
| -11.3 Registers and Memory | 
| -========================= | 
| - | 
| -GDB's model of the target machine is rather simple.  GDB assumes the | 
| -machine includes a bank of registers and a block of memory.  Each | 
| -register may have a different size. | 
| - | 
| -   GDB does not have a magical way to match up with the compiler's idea | 
| -of which registers are which; however, it is critical that they do | 
| -match up accurately.  The only way to make this work is to get accurate | 
| -information about the order that the compiler uses, and to reflect that | 
| -in the `gdbarch_register_name' and related functions. | 
| - | 
| -   GDB can handle big-endian, little-endian, and bi-endian | 
| -architectures. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Pointers and Addresses,  Next: Address Classes,  Prev: Registers and Memory,  Up: Target Architecture Definition | 
| - | 
| -11.4 Pointers Are Not Always Addresses | 
| -====================================== | 
| - | 
| -On almost all 32-bit architectures, the representation of a pointer is | 
| -indistinguishable from the representation of some fixed-length number | 
| -whose value is the byte address of the object pointed to.  On such | 
| -machines, the words "pointer" and "address" can be used interchangeably. | 
| -However, architectures with smaller word sizes are often cramped for | 
| -address space, so they may choose a pointer representation that breaks | 
| -this identity, and allows a larger code address space. | 
| - | 
| -   For example, the Renesas D10V is a 16-bit VLIW processor whose | 
| -instructions are 32 bits long(1).  If the D10V used ordinary byte | 
| -addresses to refer to code locations, then the processor would only be | 
| -able to address 64kb of instructions.  However, since instructions must | 
| -be aligned on four-byte boundaries, the low two bits of any valid | 
| -instruction's byte address are always zero--byte addresses waste two | 
| -bits.  So instead of byte addresses, the D10V uses word addresses--byte | 
| -addresses shifted right two bits--to refer to code.  Thus, the D10V can | 
| -use 16-bit words to address 256kb of code space. | 
| - | 
| -   However, this means that code pointers and data pointers have | 
| -different forms on the D10V.  The 16-bit word `0xC020' refers to byte | 
| -address `0xC020' when used as a data address, but refers to byte address | 
| -`0x30080' when used as a code address. | 
| - | 
| -   (The D10V also uses separate code and data address spaces, which also | 
| -affects the correspondence between pointers and addresses, but we're | 
| -going to ignore that here; this example is already too long.) | 
| - | 
| -   To cope with architectures like this--the D10V is not the only | 
| -one!--GDB tries to distinguish between "addresses", which are byte | 
| -numbers, and "pointers", which are the target's representation of an | 
| -address of a particular type of data.  In the example above, `0xC020' | 
| -is the pointer, which refers to one of the addresses `0xC020' or | 
| -`0x30080', depending on the type imposed upon it.  GDB provides | 
| -functions for turning a pointer into an address and vice versa, in the | 
| -appropriate way for the current architecture. | 
| - | 
| -   Unfortunately, since addresses and pointers are identical on almost | 
| -all processors, this distinction tends to bit-rot pretty quickly.  Thus, | 
| -each time you port GDB to an architecture which does distinguish | 
| -between pointers and addresses, you'll probably need to clean up some | 
| -architecture-independent code. | 
| - | 
| -   Here are functions which convert between pointers and addresses: | 
| - | 
| - -- Function: CORE_ADDR extract_typed_address (void *BUF, struct type | 
| -          *TYPE) | 
| -     Treat the bytes at BUF as a pointer or reference of type TYPE, and | 
| -     return the address it represents, in a manner appropriate for the | 
| -     current architecture.  This yields an address GDB can use to read | 
| -     target memory, disassemble, etc.  Note that BUF refers to a buffer | 
| -     in GDB's memory, not the inferior's. | 
| - | 
| -     For example, if the current architecture is the Intel x86, this | 
| -     function extracts a little-endian integer of the appropriate | 
| -     length from BUF and returns it.  However, if the current | 
| -     architecture is the D10V, this function will return a 16-bit | 
| -     integer extracted from BUF, multiplied by four if TYPE is a | 
| -     pointer to a function. | 
| - | 
| -     If TYPE is not a pointer or reference type, then this function | 
| -     will signal an internal error. | 
| - | 
| - -- Function: CORE_ADDR store_typed_address (void *BUF, struct type | 
| -          *TYPE, CORE_ADDR ADDR) | 
| -     Store the address ADDR in BUF, in the proper format for a pointer | 
| -     of type TYPE in the current architecture.  Note that BUF refers to | 
| -     a buffer in GDB's memory, not the inferior's. | 
| - | 
| -     For example, if the current architecture is the Intel x86, this | 
| -     function stores ADDR unmodified as a little-endian integer of the | 
| -     appropriate length in BUF.  However, if the current architecture | 
| -     is the D10V, this function divides ADDR by four if TYPE is a | 
| -     pointer to a function, and then stores it in BUF. | 
| - | 
| -     If TYPE is not a pointer or reference type, then this function | 
| -     will signal an internal error. | 
| - | 
| - -- Function: CORE_ADDR value_as_address (struct value *VAL) | 
| -     Assuming that VAL is a pointer, return the address it represents, | 
| -     as appropriate for the current architecture. | 
| - | 
| -     This function actually works on integral values, as well as | 
| -     pointers.  For pointers, it performs architecture-specific | 
| -     conversions as described above for `extract_typed_address'. | 
| - | 
| - -- Function: CORE_ADDR value_from_pointer (struct type *TYPE, | 
| -          CORE_ADDR ADDR) | 
| -     Create and return a value representing a pointer of type TYPE to | 
| -     the address ADDR, as appropriate for the current architecture. | 
| -     This function performs architecture-specific conversions as | 
| -     described above for `store_typed_address'. | 
| - | 
| -   Here are two functions which architectures can define to indicate the | 
| -relationship between pointers and addresses.  These have default | 
| -definitions, appropriate for architectures on which all pointers are | 
| -simple unsigned byte addresses. | 
| - | 
| - -- Function: CORE_ADDR gdbarch_pointer_to_address (struct gdbarch | 
| -          *GDBARCH, struct type *TYPE, char *BUF) | 
| -     Assume that BUF holds a pointer of type TYPE, in the appropriate | 
| -     format for the current architecture.  Return the byte address the | 
| -     pointer refers to. | 
| - | 
| -     This function may safely assume that TYPE is either a pointer or a | 
| -     C++ reference type. | 
| - | 
| - -- Function: void gdbarch_address_to_pointer (struct gdbarch *GDBARCH, | 
| -          struct type *TYPE, char *BUF, CORE_ADDR ADDR) | 
| -     Store in BUF a pointer of type TYPE representing the address ADDR, | 
| -     in the appropriate format for the current architecture. | 
| - | 
| -     This function may safely assume that TYPE is either a pointer or a | 
| -     C++ reference type. | 
| - | 
| -   ---------- Footnotes ---------- | 
| - | 
| -   (1) Some D10V instructions are actually pairs of 16-bit | 
| -sub-instructions.  However, since you can't jump into the middle of | 
| -such a pair, code addresses can only refer to full 32 bit instructions, | 
| -which is what matters in this explanation. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Address Classes,  Next: Register Representation,  Prev: Pointers and Addresses,  Up: Target Architecture Definition | 
| - | 
| -11.5 Address Classes | 
| -==================== | 
| - | 
| -Sometimes information about different kinds of addresses is available | 
| -via the debug information.  For example, some programming environments | 
| -define addresses of several different sizes.  If the debug information | 
| -distinguishes these kinds of address classes through either the size | 
| -info (e.g, `DW_AT_byte_size' in DWARF 2) or through an explicit address | 
| -class attribute (e.g, `DW_AT_address_class' in DWARF 2), the following | 
| -macros should be defined in order to disambiguate these types within | 
| -GDB as well as provide the added information to a GDB user when | 
| -printing type expressions. | 
| - | 
| - -- Function: int gdbarch_address_class_type_flags (struct gdbarch | 
| -          *GDBARCH, int BYTE_SIZE, int DWARF2_ADDR_CLASS) | 
| -     Returns the type flags needed to construct a pointer type whose | 
| -     size is BYTE_SIZE and whose address class is DWARF2_ADDR_CLASS. | 
| -     This function is normally called from within a symbol reader.  See | 
| -     `dwarf2read.c'. | 
| - | 
| - -- Function: char * gdbarch_address_class_type_flags_to_name (struct | 
| -          gdbarch *GDBARCH, int TYPE_FLAGS) | 
| -     Given the type flags representing an address class qualifier, | 
| -     return its name. | 
| - | 
| - -- Function: int gdbarch_address_class_name_to_type_flags (struct | 
| -          gdbarch *GDBARCH, int NAME, int *TYPE_FLAGS_PTR) | 
| -     Given an address qualifier name, set the `int' referenced by | 
| -     TYPE_FLAGS_PTR to the type flags for that address class qualifier. | 
| - | 
| -   Since the need for address classes is rather rare, none of the | 
| -address class functions are defined by default.  Predicate functions | 
| -are provided to detect when they are defined. | 
| - | 
| -   Consider a hypothetical architecture in which addresses are normally | 
| -32-bits wide, but 16-bit addresses are also supported.  Furthermore, | 
| -suppose that the DWARF 2 information for this architecture simply uses | 
| -a `DW_AT_byte_size' value of 2 to indicate the use of one of these | 
| -"short" pointers.  The following functions could be defined to | 
| -implement the address class functions: | 
| - | 
| -     somearch_address_class_type_flags (int byte_size, | 
| -                                        int dwarf2_addr_class) | 
| -     { | 
| -       if (byte_size == 2) | 
| -         return TYPE_FLAG_ADDRESS_CLASS_1; | 
| -       else | 
| -         return 0; | 
| -     } | 
| - | 
| -     static char * | 
| -     somearch_address_class_type_flags_to_name (int type_flags) | 
| -     { | 
| -       if (type_flags & TYPE_FLAG_ADDRESS_CLASS_1) | 
| -         return "short"; | 
| -       else | 
| -         return NULL; | 
| -     } | 
| - | 
| -     int | 
| -     somearch_address_class_name_to_type_flags (char *name, | 
| -                                                int *type_flags_ptr) | 
| -     { | 
| -       if (strcmp (name, "short") == 0) | 
| -         { | 
| -           *type_flags_ptr = TYPE_FLAG_ADDRESS_CLASS_1; | 
| -           return 1; | 
| -         } | 
| -       else | 
| -         return 0; | 
| -     } | 
| - | 
| -   The qualifier `@short' is used in GDB's type expressions to indicate | 
| -the presence of one of these "short" pointers.  For example if the | 
| -debug information indicates that `short_ptr_var' is one of these short | 
| -pointers, GDB might show the following behavior: | 
| - | 
| -     (gdb) ptype short_ptr_var | 
| -     type = int * @short | 
| - | 
| - | 
| -File: gdbint.info,  Node: Register Representation,  Next: Frame Interpretation,  Prev: Address Classes,  Up: Target Architecture Definition | 
| - | 
| -11.6 Register Representation | 
| -============================ | 
| - | 
| -* Menu: | 
| - | 
| -* Raw and Cooked Registers:: | 
| -* Register Architecture Functions & Variables:: | 
| -* Register Information Functions:: | 
| -* Register and Memory Data:: | 
| -* Register Caching:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: Raw and Cooked Registers,  Next: Register Architecture Functions & Variables,  Up: Register Representation | 
| - | 
| -11.6.1 Raw and Cooked Registers | 
| -------------------------------- | 
| - | 
| -GDB considers registers to be a set with members numbered linearly from | 
| -0 upwards.  The first part of that set corresponds to real physical | 
| -registers, the second part to any "pseudo-registers".  Pseudo-registers | 
| -have no independent physical existence, but are useful representations | 
| -of information within the architecture.  For example the OpenRISC 1000 | 
| -architecture has up to 32 general purpose registers, which are | 
| -typically represented as 32-bit (or 64-bit) integers.  However the GPRs | 
| -are also used as operands to the floating point operations, and it | 
| -could be convenient to define a set of pseudo-registers, to show the | 
| -GPRs represented as floating point values. | 
| - | 
| -   For any architecture, the implementer will decide on a mapping from | 
| -hardware to GDB register numbers.  The registers corresponding to real | 
| -hardware are referred to as "raw" registers, the remaining registers are | 
| -"pseudo-registers".  The total register set (raw and pseudo) is called | 
| -the "cooked" register set. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Register Architecture Functions & Variables,  Next: Register Information Functions,  Prev: Raw and Cooked Registers,  Up: Register Representation | 
| - | 
| -11.6.2 Functions and Variables Specifying the Register Architecture | 
| -------------------------------------------------------------------- | 
| - | 
| -These `struct gdbarch' functions and variables specify the number and | 
| -type of registers in the architecture. | 
| - | 
| - -- Architecture Function: CORE_ADDR read_pc (struct regcache *REGCACHE) | 
| - | 
| - -- Architecture Function: void write_pc (struct regcache *REGCACHE, | 
| -          CORE_ADDR VAL) | 
| -     Read or write the program counter.  The default value of both | 
| -     functions is `NULL' (no function available).  If the program | 
| -     counter is just an ordinary register, it can be specified in | 
| -     `struct gdbarch' instead (see `pc_regnum' below) and it will be | 
| -     read or written using the standard routines to access registers. | 
| -     This function need only be specified if the program counter is not | 
| -     an ordinary register. | 
| - | 
| -     Any register information can be obtained using the supplied | 
| -     register cache, REGCACHE.  *Note Register Caching: Register | 
| -     Caching. | 
| - | 
| - | 
| - -- Architecture Function: void pseudo_register_read (struct gdbarch | 
| -          *GDBARCH, struct regcache *REGCACHE, int REGNUM, const | 
| -          gdb_byte *BUF) | 
| - | 
| - -- Architecture Function: void pseudo_register_write (struct gdbarch | 
| -          *GDBARCH, struct regcache *REGCACHE, int REGNUM, const | 
| -          gdb_byte *BUF) | 
| -     These functions should be defined if there are any | 
| -     pseudo-registers.  The default value is `NULL'.  REGNUM is the | 
| -     number of the register to read or write (which will be a "cooked" | 
| -     register number) and BUF is the buffer where the value read will be | 
| -     placed, or from which the value to be written will be taken.  The | 
| -     value in the buffer may be converted to or from a signed or | 
| -     unsigned integral value using one of the utility functions (*note | 
| -     Using Different Register and Memory Data Representations: Register | 
| -     and Memory Data.). | 
| - | 
| -     The access should be for the specified architecture, GDBARCH.  Any | 
| -     register information can be obtained using the supplied register | 
| -     cache, REGCACHE.  *Note Register Caching: Register Caching. | 
| - | 
| - | 
| - -- Architecture Variable: int sp_regnum | 
| -     This specifies the register holding the stack pointer, which may | 
| -     be a raw or pseudo-register.  It defaults to -1 (not defined), but | 
| -     it is an error for it not to be defined. | 
| - | 
| -     The value of the stack pointer register can be accessed withing | 
| -     GDB as the variable `$sp'. | 
| - | 
| - | 
| - -- Architecture Variable: int pc_regnum | 
| -     This specifies the register holding the program counter, which may | 
| -     be a raw or pseudo-register.  It defaults to -1 (not defined).  If | 
| -     `pc_regnum' is not defined, then the functions `read_pc' and | 
| -     `write_pc' (see above) must be defined. | 
| - | 
| -     The value of the program counter (whether defined as a register, or | 
| -     through `read_pc' and `write_pc') can be accessed withing GDB as | 
| -     the variable `$pc'. | 
| - | 
| - | 
| - -- Architecture Variable: int ps_regnum | 
| -     This specifies the register holding the processor status (often | 
| -     called the status register), which may be a raw or | 
| -     pseudo-register.  It defaults to -1 (not defined). | 
| - | 
| -     If defined, the value of this register can be accessed withing GDB | 
| -     as the variable `$ps'. | 
| - | 
| - | 
| - -- Architecture Variable: int fp0_regnum | 
| -     This specifies the first floating point register.  It defaults to | 
| -     0.  `fp0_regnum' is not needed unless the target offers support | 
| -     for floating point. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Register Information Functions,  Next: Register and Memory Data,  Prev: Register Architecture Functions & Variables,  Up: Register Representation | 
| - | 
| -11.6.3 Functions Giving Register Information | 
| --------------------------------------------- | 
| - | 
| -These functions return information about registers. | 
| - | 
| - -- Architecture Function: const char * register_name (struct gdbarch | 
| -          *GDBARCH, int REGNUM) | 
| -     This function should convert a register number (raw or pseudo) to a | 
| -     register name (as a C `const char *').  This is used both to | 
| -     determine the name of a register for output and to work out the | 
| -     meaning of any register names used as input.  The function may | 
| -     also return `NULL', to indicate that REGNUM is not a valid | 
| -     register. | 
| - | 
| -     For example with the OpenRISC 1000, GDB registers 0-31 are the | 
| -     General Purpose Registers, register 32 is the program counter and | 
| -     register 33 is the supervision register (i.e. the processor status | 
| -     register), which map to the strings `"gpr00"' through `"gpr31"', | 
| -     `"pc"' and `"sr"' respectively. This means that the GDB command | 
| -     `print $gpr5' should print the value of the OR1K general purpose | 
| -     register 5(1). | 
| - | 
| -     The default value for this function is `NULL', meaning undefined. | 
| -     It should always be defined. | 
| - | 
| -     The access should be for the specified architecture, GDBARCH. | 
| - | 
| - | 
| - -- Architecture Function: struct type * register_type (struct gdbarch | 
| -          *GDBARCH, int REGNUM) | 
| -     Given a register number, this function identifies the type of data | 
| -     it may be holding, specified as a `struct type'.  GDB allows | 
| -     creation of arbitrary types, but a number of built in types are | 
| -     provided (`builtin_type_void', `builtin_type_int32' etc), together | 
| -     with functions to derive types from these. | 
| - | 
| -     Typically the program counter will have a type of "pointer to | 
| -     function" (it points to code), the frame pointer and stack pointer | 
| -     will have types of "pointer to void" (they point to data on the | 
| -     stack) and all other integer registers will have a type of 32-bit | 
| -     integer or 64-bit integer. | 
| - | 
| -     This information guides the formatting when displaying register | 
| -     information.  The default value is `NULL' meaning no information is | 
| -     available to guide formatting when displaying registers. | 
| - | 
| - | 
| - -- Architecture Function: void print_registers_info (struct gdbarch | 
| -          *GDBARCH, struct ui_file *FILE, struct frame_info *FRAME, int | 
| -          REGNUM, int ALL) | 
| -     Define this function to print out one or all of the registers for | 
| -     the GDB `info registers' command.  The default value is the | 
| -     function `default_print_registers_info', which uses the register | 
| -     type information (see `register_type' above) to determine how each | 
| -     register should be printed.  Define a custom version of this | 
| -     function for fuller control over how the registers are displayed. | 
| - | 
| -     The access should be for the specified architecture, GDBARCH, with | 
| -     output to the file specified by the User Interface Independent | 
| -     Output file handle, FILE (*note UI-Independent Output--the | 
| -     `ui_out' Functions: UI-Independent Output.). | 
| - | 
| -     The registers should show their values in the frame specified by | 
| -     FRAME.  If REGNUM is -1 and ALL is zero, then all the | 
| -     "significant" registers should be shown (the implementer should | 
| -     decide which registers are "significant"). Otherwise only the | 
| -     value of the register specified by REGNUM should be output.  If | 
| -     REGNUM is -1 and ALL is non-zero (true), then the value of all | 
| -     registers should be shown. | 
| - | 
| -     By default `default_print_registers_info' prints one register per | 
| -     line, and if ALL is zero omits floating-point registers. | 
| - | 
| - | 
| - -- Architecture Function: void print_float_info (struct gdbarch | 
| -          *GDBARCH, struct ui_file *FILE, struct frame_info *FRAME, | 
| -          const char *ARGS) | 
| -     Define this function to provide output about the floating point | 
| -     unit and registers for the GDB `info float' command respectively. | 
| -     The default value is `NULL' (not defined), meaning no information | 
| -     will be provided. | 
| - | 
| -     The GDBARCH and FILE and FRAME arguments have the same meaning as | 
| -     in the `print_registers_info' function above. The string ARGS | 
| -     contains any supplementary arguments to the `info float' command. | 
| - | 
| -     Define this function if the target supports floating point | 
| -     operations. | 
| - | 
| - | 
| - -- Architecture Function: void print_vector_info (struct gdbarch | 
| -          *GDBARCH, struct ui_file *FILE, struct frame_info *FRAME, | 
| -          const char *ARGS) | 
| -     Define this function to provide output about the vector unit and | 
| -     registers for the GDB `info vector' command respectively.  The | 
| -     default value is `NULL' (not defined), meaning no information will | 
| -     be provided. | 
| - | 
| -     The GDBARCH, FILE and FRAME arguments have the same meaning as in | 
| -     the `print_registers_info' function above.  The string ARGS | 
| -     contains any supplementary arguments to the `info vector' command. | 
| - | 
| -     Define this function if the target supports vector operations. | 
| - | 
| - | 
| - -- Architecture Function: int register_reggroup_p (struct gdbarch | 
| -          *GDBARCH, int REGNUM, struct reggroup *GROUP) | 
| -     GDB groups registers into different categories (general, vector, | 
| -     floating point etc).  This function, given a register, REGNUM, and | 
| -     group, GROUP, returns 1 (true) if the register is in the group and | 
| -     0 (false) otherwise. | 
| - | 
| -     The information should be for the specified architecture, GDBARCH | 
| - | 
| -     The default value is the function `default_register_reggroup_p' | 
| -     which will do a reasonable job based on the type of the register | 
| -     (see the function `register_type' above), with groups for general | 
| -     purpose registers, floating point registers, vector registers and | 
| -     raw (i.e not pseudo) registers. | 
| - | 
| - | 
| -   ---------- Footnotes ---------- | 
| - | 
| -   (1) Historically, GDB always had a concept of a frame pointer | 
| -register, which could be accessed via the GDB variable, `$fp'.  That | 
| -concept is now deprecated, recognizing that not all architectures have | 
| -a frame pointer.  However if an architecture does have a frame pointer | 
| -register, and defines a register or pseudo-register with the name | 
| -`"fp"', then that register will be used as the value of the `$fp' | 
| -variable. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Register and Memory Data,  Next: Register Caching,  Prev: Register Information Functions,  Up: Register Representation | 
| - | 
| -11.6.4 Using Different Register and Memory Data Representations | 
| ---------------------------------------------------------------- | 
| - | 
| -Some architectures have different representations of data objects, | 
| -depending whether the object is held in a register or memory.  For | 
| -example: | 
| - | 
| -   * The Alpha architecture can represent 32 bit integer values in | 
| -     floating-point registers. | 
| - | 
| -   * The x86 architecture supports 80-bit floating-point registers.  The | 
| -     `long double' data type occupies 96 bits in memory but only 80 | 
| -     bits when stored in a register. | 
| - | 
| - | 
| -   In general, the register representation of a data type is determined | 
| -by the architecture, or GDB's interface to the architecture, while the | 
| -memory representation is determined by the Application Binary Interface. | 
| - | 
| -   For almost all data types on almost all architectures, the two | 
| -representations are identical, and no special handling is needed. | 
| -However, they do occasionally differ.  An architecture may define the | 
| -following `struct gdbarch' functions to request conversions between the | 
| -register and memory representations of a data type: | 
| - | 
| - -- Architecture Function: int gdbarch_convert_register_p (struct | 
| -          gdbarch *GDBARCH, int REG) | 
| -     Return non-zero (true) if the representation of a data value | 
| -     stored in this register may be different to the representation of | 
| -     that same data value when stored in memory.  The default value is | 
| -     `NULL' (undefined). | 
| - | 
| -     If this function is defined and returns non-zero, the `struct | 
| -     gdbarch' functions `gdbarch_register_to_value' and | 
| -     `gdbarch_value_to_register' (see below) should be used to perform | 
| -     any necessary conversion. | 
| - | 
| -     If defined, this function should return zero for the register's | 
| -     native type, when no conversion is necessary. | 
| - | 
| - -- Architecture Function: void gdbarch_register_to_value (struct | 
| -          gdbarch *GDBARCH, int REG, struct type *TYPE, char *FROM, | 
| -          char *TO) | 
| -     Convert the value of register number REG to a data object of type | 
| -     TYPE.  The buffer at FROM holds the register's value in raw | 
| -     format; the converted value should be placed in the buffer at TO. | 
| - | 
| -          _Note:_ `gdbarch_register_to_value' and | 
| -          `gdbarch_value_to_register' take their REG and TYPE arguments | 
| -          in different orders. | 
| - | 
| -     `gdbarch_register_to_value' should only be used with registers for | 
| -     which the `gdbarch_convert_register_p' function returns a non-zero | 
| -     value. | 
| - | 
| - | 
| - -- Architecture Function: void gdbarch_value_to_register (struct | 
| -          gdbarch *GDBARCH, struct type *TYPE, int REG, char *FROM, | 
| -          char *TO) | 
| -     Convert a data value of type TYPE to register number REG' raw | 
| -     format. | 
| - | 
| -          _Note:_ `gdbarch_register_to_value' and | 
| -          `gdbarch_value_to_register' take their REG and TYPE arguments | 
| -          in different orders. | 
| - | 
| -     `gdbarch_value_to_register' should only be used with registers for | 
| -     which the `gdbarch_convert_register_p' function returns a non-zero | 
| -     value. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Register Caching,  Prev: Register and Memory Data,  Up: Register Representation | 
| - | 
| -11.6.5 Register Caching | 
| ------------------------ | 
| - | 
| -Caching of registers is used, so that the target does not need to be | 
| -accessed and reanalyzed multiple times for each register in | 
| -circumstances where the register value cannot have changed. | 
| - | 
| -   GDB provides `struct regcache', associated with a particular `struct | 
| -gdbarch' to hold the cached values of the raw registers.  A set of | 
| -functions is provided to access both the raw registers (with `raw' in | 
| -their name) and the full set of cooked registers (with `cooked' in | 
| -their name).  Functions are provided to ensure the register cache is | 
| -kept synchronized with the values of the actual registers in the target. | 
| - | 
| -   Accessing registers through the `struct regcache' routines will | 
| -ensure that the appropriate `struct gdbarch' functions are called when | 
| -necessary to access the underlying target architecture.  In general | 
| -users should use the "cooked" functions, since these will map to the | 
| -"raw" functions automatically as appropriate. | 
| - | 
| -   The two key functions are `regcache_cooked_read' and | 
| -`regcache_cooked_write' which read or write a register from or to a | 
| -byte buffer (type `gdb_byte *').  For convenience the wrapper functions | 
| -`regcache_cooked_read_signed', `regcache_cooked_read_unsigned', | 
| -`regcache_cooked_write_signed' and `regcache_cooked_write_unsigned' are | 
| -provided, which read or write the value using the buffer and convert to | 
| -or from an integral value as appropriate. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Frame Interpretation,  Next: Inferior Call Setup,  Prev: Register Representation,  Up: Target Architecture Definition | 
| - | 
| -11.7 Frame Interpretation | 
| -========================= | 
| - | 
| -* Menu: | 
| - | 
| -* All About Stack Frames:: | 
| -* Frame Handling Terminology:: | 
| -* Prologue Caches:: | 
| -* Functions and Variable to Analyze Frames:: | 
| -* Functions to Access Frame Data:: | 
| -* Analyzing Stacks---Frame Sniffers:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: All About Stack Frames,  Next: Frame Handling Terminology,  Up: Frame Interpretation | 
| - | 
| -11.7.1 All About Stack Frames | 
| ------------------------------ | 
| - | 
| -GDB needs to understand the stack on which local (automatic) variables | 
| -are stored.  The area of the stack containing all the local variables | 
| -for a function invocation is known as the "stack frame" for that | 
| -function (or colloquially just as the "frame").  In turn the function | 
| -that called the function will have its stack frame, and so on back | 
| -through the chain of functions that have been called. | 
| - | 
| -   Almost all architectures have one register dedicated to point to the | 
| -end of the stack (the "stack pointer").  Many have a second register | 
| -which points to the start of the currently active stack frame (the | 
| -"frame pointer").  The specific arrangements for an architecture are a | 
| -key part of the ABI. | 
| - | 
| -   A diagram helps to explain this.  Here is a simple program to compute | 
| -factorials: | 
| - | 
| -     #include <stdio.h> | 
| -     int fact (int n) | 
| -     { | 
| -       if (0 == n) | 
| -         { | 
| -           return 1; | 
| -         } | 
| -       else | 
| -         { | 
| -           return n * fact (n - 1); | 
| -         } | 
| -     } | 
| - | 
| -     main () | 
| -     { | 
| -       int i; | 
| - | 
| -       for (i = 0; i < 10; i++) | 
| -         { | 
| -           int   f = fact (i); | 
| -           printf ("%d! = %d\n", i, f); | 
| -         } | 
| -     } | 
| - | 
| -   Consider the state of the stack when the code reaches line 6 after | 
| -the main program has called `fact (3)'.  The chain of function calls | 
| -will be `main ()', `fact (3)', `fact (2)', `fact (1)' and `fact (0)'. | 
| - | 
| -   In this illustration the stack is falling (as used for example by the | 
| -OpenRISC 1000 ABI).  The stack pointer (SP) is at the end of the stack | 
| -(lowest address) and the frame pointer (FP) is at the highest address | 
| -in the current stack frame.  The following diagram shows how the stack | 
| -looks. | 
| - | 
| - [image src="stack_frame.png" text="                  ^    ->|            | | 
| -Frame             |   |  |            | | 
| -Number          - |   |  |============|       int fact (int n) | 
| -               |  |   |  |   i = 3    |       { | 
| -               |  |   |  |------------|         if (0 == n) { | 
| -               |  |   |  |   f = ?    |           return  1;  <-------- PC | 
| -  #4 main()   <   |   |  |------------|        } | 
| -               |  |   |  |            |         else { | 
| -               |  |  -+->|------------|   --->    return n * fact (n - 1); | 
| -               |   -+-+--+-----o      |  |      } | 
| -                =   | |  |============|  |    } | 
| -               |    | |  |   n = 3    |  | | 
| -               |    | |  |------------|  |    main () | 
| -  #3 fact (3) <     | |  |     o---------+-   { | 
| -               |   -+-+->|------------|  | |    int  i; | 
| -               |  | |  --+-----o      |  | | | 
| -                = | |    |============|  | |    for (i = 0; i < 10; i++) { | 
| -               |  | |    |   n = 2    |  |  ->    int  f = fact (i); | 
| -               |  | |    |------------|  |        printf (\"%d! = %d\\n\", i , f); | 
| -  #2 fact (2) <   | |    |     o------+--|      } | 
| -               |  | |  ->|------------|  |    } | 
| -               |  |  -+--+-----o      |  | | 
| -                = |   |  |============|  | | 
| -               |  |   |  |   n = 1    |  | | 
| -               |  |   |  |------------|  | | 
| -  #1 fact (1) <   |   |  |     o------+--| | 
| -               |  |   |  |------------|  | | 
| -               |   ---|--+-----o      |<-+------- FP | 
| -                =     |  |============|  |                   | | 
| -               |      |  |   n = 0    |  |                   | | 
| -               |      |  |------------|  |                   | | 
| -  #0 fact (0) <       |  |     o---------                    | | 
| -               |      |  |------------|                      | | 
| -               |       --+-----o      |<--------- SP         | | 
| -                =        |============|                      | | 
| -               |         |  Red Zone  |                      v | 
| -               |         \\/\\/\\/\\/\\/\\/\\/                 Direction of | 
| -  #-1         <          \\/\\/\\/\\/\\/\\/\\/                 stack growth | 
| -               |         |            | | 
| -" ] | 
| - | 
| -In each stack frame, offset 0 from the stack pointer is the frame | 
| -pointer of the previous frame and offset 4 (this is illustrating a | 
| -32-bit architecture) from the stack pointer is the return address. | 
| -Local variables are indexed from the frame pointer, with negative | 
| -indexes.  In the function `fact', offset -4 from the frame pointer is | 
| -the argument N.  In the `main' function, offset -4 from the frame | 
| -pointer is the local variable I and offset -8 from the frame pointer is | 
| -the local variable F(1). | 
| - | 
| -   It is very easy to get confused when examining stacks.  GDB has | 
| -terminology it uses rigorously throughout.  The stack frame of the | 
| -function currently executing, or where execution stopped is numbered | 
| -zero.  In this example frame #0 is the stack frame of the call to | 
| -`fact (0)'.  The stack frame of its calling function (`fact (1)' in | 
| -this case) is numbered #1 and so on back through the chain of calls. | 
| - | 
| -   The main GDB data structure describing frames is | 
| -`struct frame_info'.  It is not used directly, but only via its | 
| -accessor functions.  `frame_info' includes information about the | 
| -registers in the frame and a pointer to the code of the function with | 
| -which the frame is associated.  The entire stack is represented as a | 
| -linked list of `frame_info' structs. | 
| - | 
| -   ---------- Footnotes ---------- | 
| - | 
| -   (1) This is a simplified example for illustrative purposes only. | 
| -Good optimizing compilers would not put anything on the stack for such | 
| -simple functions.  Indeed they might eliminate the recursion and use of | 
| -the stack entirely! | 
| - | 
| - | 
| -File: gdbint.info,  Node: Frame Handling Terminology,  Next: Prologue Caches,  Prev: All About Stack Frames,  Up: Frame Interpretation | 
| - | 
| -11.7.2 Frame Handling Terminology | 
| ---------------------------------- | 
| - | 
| -It is easy to get confused when referencing stack frames.  GDB uses | 
| -some precise terminology. | 
| - | 
| -   * "THIS" frame is the frame currently under consideration. | 
| - | 
| -   * The "NEXT" frame, also sometimes called the inner or newer frame | 
| -     is the frame of the function called by the function of THIS frame. | 
| - | 
| -   * The "PREVIOUS" frame, also sometimes called the outer or older | 
| -     frame is the frame of the function which called the function of | 
| -     THIS frame. | 
| - | 
| - | 
| -   So in the example in the previous section (*note All About Stack | 
| -Frames: All About Stack Frames.), if THIS frame is #3 (the call to | 
| -`fact (3)'), the NEXT frame is frame #2 (the call to `fact (2)') and | 
| -the PREVIOUS frame is frame #4 (the call to `main ()'). | 
| - | 
| -   The "innermost" frame is the frame of the current executing | 
| -function, or where the program stopped, in this example, in the middle | 
| -of the call to `fact (0))'.  It is always numbered frame #0. | 
| - | 
| -   The "base" of a frame is the address immediately before the start of | 
| -the NEXT frame.  For a stack which grows down in memory (a "falling" | 
| -stack) this will be the lowest address and for a stack which grows up | 
| -in memory (a "rising" stack) this will be the highest address in the | 
| -frame. | 
| - | 
| -   GDB functions to analyze the stack are typically given a pointer to | 
| -the NEXT frame to determine information about THIS frame.  Information | 
| -about THIS frame includes data on where the registers of the PREVIOUS | 
| -frame are stored in this stack frame.  In this example the frame | 
| -pointer of the PREVIOUS frame is stored at offset 0 from the stack | 
| -pointer of THIS frame. | 
| - | 
| -   The process whereby a function is given a pointer to the NEXT frame | 
| -to work out information about THIS frame is referred to as "unwinding". | 
| -The GDB functions involved in this typically include unwind in their | 
| -name. | 
| - | 
| -   The process of analyzing a target to determine the information that | 
| -should go in struct frame_info is called "sniffing".  The functions | 
| -that carry this out are called sniffers and typically include sniffer | 
| -in their name.  More than one sniffer may be required to extract all | 
| -the information for a particular frame. | 
| - | 
| -   Because so many functions work using the NEXT frame, there is an | 
| -issue about addressing the innermost frame--it has no NEXT frame.  To | 
| -solve this GDB creates a dummy frame #-1, known as the "sentinel" frame. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Prologue Caches,  Next: Functions and Variable to Analyze Frames,  Prev: Frame Handling Terminology,  Up: Frame Interpretation | 
| - | 
| -11.7.3 Prologue Caches | 
| ----------------------- | 
| - | 
| -All the frame sniffing functions typically examine the code at the | 
| -start of the corresponding function, to determine the state of | 
| -registers.  The ABI will save old values and set new values of key | 
| -registers at the start of each function in what is known as the | 
| -function "prologue". | 
| - | 
| -   For any particular stack frame this data does not change, so all the | 
| -standard unwinding functions, in addition to receiving a pointer to the | 
| -NEXT frame as their first argument, receive a pointer to a "prologue | 
| -cache" as their second argument.  This can be used to store values | 
| -associated with a particular frame, for reuse on subsequent calls | 
| -involving the same frame. | 
| - | 
| -   It is up to the user to define the structure used (it is a `void *' | 
| -pointer) and arrange allocation and deallocation of storage.  However | 
| -for general use, GDB provides `struct trad_frame_cache', with a set of | 
| -accessor routines.  This structure holds the stack and code address of | 
| -THIS frame, the base address of the frame, a pointer to the struct | 
| -`frame_info' for the NEXT frame and details of where the registers of | 
| -the PREVIOUS frame may be found in THIS frame. | 
| - | 
| -   Typically the first time any sniffer function is called with NEXT | 
| -frame, the prologue sniffer for THIS frame will be `NULL'.  The sniffer | 
| -will analyze the frame, allocate a prologue cache structure and | 
| -populate it.  Subsequent calls using the same NEXT frame will pass in | 
| -this prologue cache, so the data can be returned with no additional | 
| -analysis. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Functions and Variable to Analyze Frames,  Next: Functions to Access Frame Data,  Prev: Prologue Caches,  Up: Frame Interpretation | 
| - | 
| -11.7.4 Functions and Variable to Analyze Frames | 
| ------------------------------------------------ | 
| - | 
| -These struct `gdbarch' functions and variable should be defined to | 
| -provide analysis of the stack frame and allow it to be adjusted as | 
| -required. | 
| - | 
| - -- Architecture Function: CORE_ADDR skip_prologue (struct gdbarch | 
| -          *GDBARCH, CORE_ADDR PC) | 
| -     The prologue of a function is the code at the beginning of the | 
| -     function which sets up the stack frame, saves the return address | 
| -     etc.  The code representing the behavior of the function starts | 
| -     after the prologue. | 
| - | 
| -     This function skips past the prologue of a function if the program | 
| -     counter, PC, is within the prologue of a function.  The result is | 
| -     the program counter immediately after the prologue.  With modern | 
| -     optimizing compilers, this may be a far from trivial exercise. | 
| -     However the required information may be within the binary as | 
| -     DWARF2 debugging information, making the job much easier. | 
| - | 
| -     The default value is `NULL' (not defined).  This function should | 
| -     always be provided, but can take advantage of DWARF2 debugging | 
| -     information, if that is available. | 
| - | 
| - | 
| - -- Architecture Function: int inner_than (CORE_ADDR LHS, CORE_ADDR RHS) | 
| -     Given two frame or stack pointers, return non-zero (true) if the | 
| -     first represents the "inner" stack frame and 0 (false) otherwise. | 
| -     This is used to determine whether the target has a stack which | 
| -     grows up in memory (rising stack) or grows down in memory (falling | 
| -     stack).  *Note All About Stack Frames: All About Stack Frames, for | 
| -     an explanation of "inner" frames. | 
| - | 
| -     The default value of this function is `NULL' and it should always | 
| -     be defined.  However for almost all architectures one of the | 
| -     built-in functions can be used: `core_addr_lessthan' (for stacks | 
| -     growing down in memory) or `core_addr_greaterthan' (for stacks | 
| -     growing up in memory). | 
| - | 
| - | 
| - -- Architecture Function: CORE_ADDR frame_align (struct gdbarch | 
| -          *GDBARCH, CORE_ADDR ADDRESS) | 
| -     The architecture may have constraints on how its frames are | 
| -     aligned.  For example the OpenRISC 1000 ABI requires stack frames | 
| -     to be double-word aligned, but 32-bit versions of the architecture | 
| -     allocate single-word values to the stack.  Thus extra padding may | 
| -     be needed at the end of a stack frame. | 
| - | 
| -     Given a proposed address for the stack pointer, this function | 
| -     returns a suitably aligned address (by expanding the stack frame). | 
| - | 
| -     The default value is `NULL' (undefined).  This function should be | 
| -     defined for any architecture where it is possible the stack could | 
| -     become misaligned.  The utility functions `align_down' (for falling | 
| -     stacks) and `align_up' (for rising stacks) will facilitate the | 
| -     implementation of this function. | 
| - | 
| - | 
| - -- Architecture Variable: int frame_red_zone_size | 
| -     Some ABIs reserve space beyond the end of the stack for use by leaf | 
| -     functions without prologue or epilogue or by exception handlers | 
| -     (for example the OpenRISC 1000). | 
| - | 
| -     This is known as a "red zone" (AMD terminology).  The AMD64 (nee | 
| -     x86-64) ABI documentation refers to the "red zone" when describing | 
| -     this scratch area. | 
| - | 
| -     The default value is 0.  Set this field if the architecture has | 
| -     such a red zone.  The value must be aligned as required by the ABI | 
| -     (see `frame_align' above for an explanation of stack frame | 
| -     alignment). | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Functions to Access Frame Data,  Next: Analyzing Stacks---Frame Sniffers,  Prev: Functions and Variable to Analyze Frames,  Up: Frame Interpretation | 
| - | 
| -11.7.5 Functions to Access Frame Data | 
| -------------------------------------- | 
| - | 
| -These functions provide access to key registers and arguments in the | 
| -stack frame. | 
| - | 
| - -- Architecture Function: CORE_ADDR unwind_pc (struct gdbarch | 
| -          *GDBARCH, struct frame_info *NEXT_FRAME) | 
| -     This function is given a pointer to the NEXT stack frame (*note | 
| -     All About Stack Frames: All About Stack Frames, for how frames are | 
| -     represented) and returns the value of the program counter in the | 
| -     PREVIOUS frame (i.e. the frame of the function that called THIS | 
| -     one).  This is commonly referred to as the "return address". | 
| - | 
| -     The implementation, which must be frame agnostic (work with any | 
| -     frame), is typically no more than: | 
| - | 
| -          ULONGEST pc; | 
| -          pc = frame_unwind_register_unsigned (next_frame, ARCH_PC_REGNUM); | 
| -          return gdbarch_addr_bits_remove (gdbarch, pc); | 
| - | 
| - | 
| - -- Architecture Function: CORE_ADDR unwind_sp (struct gdbarch | 
| -          *GDBARCH, struct frame_info *NEXT_FRAME) | 
| -     This function is given a pointer to the NEXT stack frame (*note | 
| -     All About Stack Frames: All About Stack Frames. for how frames are | 
| -     represented) and returns the value of the stack pointer in the | 
| -     PREVIOUS frame (i.e. the frame of the function that called THIS | 
| -     one). | 
| - | 
| -     The implementation, which must be frame agnostic (work with any | 
| -     frame), is typically no more than: | 
| - | 
| -          ULONGEST sp; | 
| -          sp = frame_unwind_register_unsigned (next_frame, ARCH_SP_REGNUM); | 
| -          return gdbarch_addr_bits_remove (gdbarch, sp); | 
| - | 
| - | 
| - -- Architecture Function: int frame_num_args (struct gdbarch *GDBARCH, | 
| -          struct frame_info *THIS_FRAME) | 
| -     This function is given a pointer to THIS stack frame (*note All | 
| -     About Stack Frames: All About Stack Frames. for how frames are | 
| -     represented), and returns the number of arguments that are being | 
| -     passed, or -1 if not known. | 
| - | 
| -     The default value is `NULL' (undefined), in which case the number | 
| -     of arguments passed on any stack frame is always unknown.  For many | 
| -     architectures this will be a suitable default. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Analyzing Stacks---Frame Sniffers,  Prev: Functions to Access Frame Data,  Up: Frame Interpretation | 
| - | 
| -11.7.6 Analyzing Stacks--Frame Sniffers | 
| ---------------------------------------- | 
| - | 
| -When a program stops, GDB needs to construct the chain of struct | 
| -`frame_info' representing the state of the stack using appropriate | 
| -"sniffers". | 
| - | 
| -   Each architecture requires appropriate sniffers, but they do not form | 
| -entries in `struct gdbarch', since more than one sniffer may be | 
| -required and a sniffer may be suitable for more than one | 
| -`struct gdbarch'.  Instead sniffers are associated with architectures | 
| -using the following functions. | 
| - | 
| -   * `frame_unwind_append_sniffer' is used to add a new sniffer to | 
| -     analyze THIS frame when given a pointer to the NEXT frame. | 
| - | 
| -   * `frame_base_append_sniffer' is used to add a new sniffer which can | 
| -     determine information about the base of a stack frame. | 
| - | 
| -   * `frame_base_set_default' is used to specify the default base | 
| -     sniffer. | 
| - | 
| - | 
| -   These functions all take a reference to `struct gdbarch', so they | 
| -are associated with a specific architecture.  They are usually called | 
| -in the `gdbarch' initialization function, after the `gdbarch' struct | 
| -has been set up.  Unless a default has been set, the most recently | 
| -appended sniffer will be tried first. | 
| - | 
| -   The main frame unwinding sniffer (as set by | 
| -`frame_unwind_append_sniffer)' returns a structure specifying a set of | 
| -sniffing functions: | 
| - | 
| -     struct frame_unwind | 
| -     { | 
| -        enum frame_type            type; | 
| -        frame_this_id_ftype       *this_id; | 
| -        frame_prev_register_ftype *prev_register; | 
| -        const struct frame_data   *unwind_data; | 
| -        frame_sniffer_ftype       *sniffer; | 
| -        frame_prev_pc_ftype       *prev_pc; | 
| -        frame_dealloc_cache_ftype *dealloc_cache; | 
| -     }; | 
| - | 
| -   The `type' field indicates the type of frame this sniffer can | 
| -handle: normal, dummy (*note Functions Creating Dummy Frames: Functions | 
| -Creating Dummy Frames.), signal handler or sentinel.  Signal handlers | 
| -sometimes have their own simplified stack structure for efficiency, so | 
| -may need their own handlers. | 
| - | 
| -   The `unwind_data' field holds additional information which may be | 
| -relevant to particular types of frame.  For example it may hold | 
| -additional information for signal handler frames. | 
| - | 
| -   The remaining fields define functions that yield different types of | 
| -information when given a pointer to the NEXT stack frame.  Not all | 
| -functions need be provided.  If an entry is `NULL', the next sniffer | 
| -will be tried instead. | 
| - | 
| -   * `this_id' determines the stack pointer and function (code entry | 
| -     point) for THIS stack frame. | 
| - | 
| -   * `prev_register' determines where the values of registers for the | 
| -     PREVIOUS stack frame are stored in THIS stack frame. | 
| - | 
| -   * `sniffer' takes a look at THIS frame's registers to determine if | 
| -     this is the appropriate unwinder. | 
| - | 
| -   * `prev_pc' determines the program counter for THIS frame.  Only | 
| -     needed if the program counter is not an ordinary register (*note | 
| -     Functions and Variables Specifying the Register Architecture: | 
| -     Register Architecture Functions & Variables.). | 
| - | 
| -   * `dealloc_cache' frees any additional memory associated with the | 
| -     prologue cache for this frame (*note Prologue Caches: Prologue | 
| -     Caches.). | 
| - | 
| - | 
| -   In general it is only the `this_id' and `prev_register' fields that | 
| -need be defined for custom sniffers. | 
| - | 
| -   The frame base sniffer is much simpler.  It is a | 
| -`struct frame_base', which refers to the corresponding `frame_unwind' | 
| -struct and whose fields refer to functions yielding various addresses | 
| -within the frame. | 
| - | 
| -     struct frame_base | 
| -     { | 
| -        const struct frame_unwind *unwind; | 
| -        frame_this_base_ftype     *this_base; | 
| -        frame_this_locals_ftype   *this_locals; | 
| -        frame_this_args_ftype     *this_args; | 
| -     }; | 
| - | 
| -   All the functions referred to take a pointer to the NEXT frame as | 
| -argument. The function referred to by `this_base' returns the base | 
| -address of THIS frame, the function referred to by `this_locals' | 
| -returns the base address of local variables in THIS frame and the | 
| -function referred to by `this_args' returns the base address of the | 
| -function arguments in this frame. | 
| - | 
| -   As described above, the base address of a frame is the address | 
| -immediately before the start of the NEXT frame.  For a falling stack, | 
| -this is the lowest address in the frame and for a rising stack it is | 
| -the highest address in the frame.  For most architectures the same | 
| -address is also the base address for local variables and arguments, in | 
| -which case the same function can be used for all three entries(1). | 
| - | 
| -   ---------- Footnotes ---------- | 
| - | 
| -   (1) It is worth noting that if it cannot be determined in any other | 
| -way (for example by there being a register with the name `"fp"'), then | 
| -the result of the `this_base' function will be used as the value of the | 
| -frame pointer variable `$fp' in GDB.  This is very often not correct | 
| -(for example with the OpenRISC 1000, this value is the stack pointer, | 
| -`$sp').  In this case a register (raw or pseudo) with the name `"fp"' | 
| -should be defined.  It will be used in preference as the value of `$fp'. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Inferior Call Setup,  Next: Adding support for debugging core files,  Prev: Frame Interpretation,  Up: Target Architecture Definition | 
| - | 
| -11.8 Inferior Call Setup | 
| -======================== | 
| - | 
| -* Menu: | 
| - | 
| -* About Dummy Frames:: | 
| -* Functions Creating Dummy Frames:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: About Dummy Frames,  Next: Functions Creating Dummy Frames,  Up: Inferior Call Setup | 
| - | 
| -11.8.1 About Dummy Frames | 
| -------------------------- | 
| - | 
| -GDB can call functions in the target code (for example by using the | 
| -`call' or `print' commands).  These functions may be breakpointed, and | 
| -it is essential that if a function does hit a breakpoint, commands like | 
| -`backtrace' work correctly. | 
| - | 
| -   This is achieved by making the stack look as though the function had | 
| -been called from the point where GDB had previously stopped.  This | 
| -requires that GDB can set up stack frames appropriate for such function | 
| -calls. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Functions Creating Dummy Frames,  Prev: About Dummy Frames,  Up: Inferior Call Setup | 
| - | 
| -11.8.2 Functions Creating Dummy Frames | 
| --------------------------------------- | 
| - | 
| -The following functions provide the functionality to set up such | 
| -"dummy" stack frames. | 
| - | 
| - -- Architecture Function: CORE_ADDR push_dummy_call (struct gdbarch | 
| -          *GDBARCH, struct value *FUNCTION, struct regcache *REGCACHE, | 
| -          CORE_ADDR BP_ADDR, int NARGS, struct value **ARGS, CORE_ADDR | 
| -          SP, int STRUCT_RETURN, CORE_ADDR STRUCT_ADDR) | 
| -     This function sets up a dummy stack frame for the function about | 
| -     to be called.  `push_dummy_call' is given the arguments to be | 
| -     passed and must copy them into registers or push them on to the | 
| -     stack as appropriate for the ABI. | 
| - | 
| -     FUNCTION is a pointer to the function that will be called and | 
| -     REGCACHE the register cache from which values should be obtained. | 
| -     BP_ADDR is the address to which the function should return (which | 
| -     is breakpointed, so GDB can regain control, hence the name). | 
| -     NARGS is the number of arguments to pass and ARGS an array | 
| -     containing the argument values.  STRUCT_RETURN is non-zero (true) | 
| -     if the function returns a structure, and if so STRUCT_ADDR is the | 
| -     address in which the structure should be returned. | 
| - | 
| -     After calling this function, GDB will pass control to the target | 
| -     at the address of the function, which will find the stack and | 
| -     registers set up just as expected. | 
| - | 
| -     The default value of this function is `NULL' (undefined).  If the | 
| -     function is not defined, then GDB will not allow the user to call | 
| -     functions within the target being debugged. | 
| - | 
| - | 
| - -- Architecture Function: struct frame_id unwind_dummy_id (struct | 
| -          gdbarch *GDBARCH, struct frame_info *NEXT_FRAME) | 
| -     This is the inverse of `push_dummy_call' which restores the stack | 
| -     pointer and program counter after a call to evaluate a function | 
| -     using a dummy stack frame.  The result is a `struct frame_id', | 
| -     which contains the value of the stack pointer and program counter | 
| -     to be used. | 
| - | 
| -     The NEXT frame pointer is provided as argument, NEXT_FRAME.  THIS | 
| -     frame is the frame of the dummy function, which can be unwound, to | 
| -     yield the required stack pointer and program counter from the | 
| -     PREVIOUS frame. | 
| - | 
| -     The default value is `NULL' (undefined).  If `push_dummy_call' is | 
| -     defined, then this function should also be defined. | 
| - | 
| - | 
| - -- Architecture Function: CORE_ADDR push_dummy_code (struct gdbarch | 
| -          *GDBARCH, CORE_ADDR SP, CORE_ADDR FUNADDR, struct value | 
| -          **ARGS, int NARGS, struct type *VALUE_TYPE, CORE_ADDR | 
| -          *REAL_PC, CORE_ADDR *BP_ADDR, struct regcache *REGCACHE) | 
| -     If this function is not defined (its default value is `NULL'), a | 
| -     dummy call will use the entry point of the currently loaded code | 
| -     on the target as its return address.  A temporary breakpoint will | 
| -     be set there, so the location must be writable and have room for a | 
| -     breakpoint. | 
| - | 
| -     It is possible that this default is not suitable.  It might not be | 
| -     writable (in ROM possibly), or the ABI might require code to be | 
| -     executed on return from a call to unwind the stack before the | 
| -     breakpoint is encountered. | 
| - | 
| -     If either of these is the case, then push_dummy_code should be | 
| -     defined to push an instruction sequence onto the end of the stack | 
| -     to which the dummy call should return. | 
| - | 
| -     The arguments are essentially the same as those to | 
| -     `push_dummy_call'.  However the function is provided with the type | 
| -     of the function result, VALUE_TYPE, BP_ADDR is used to return a | 
| -     value (the address at which the breakpoint instruction should be | 
| -     inserted) and REAL PC is used to specify the resume address when | 
| -     starting the call sequence.  The function should return the | 
| -     updated innermost stack address. | 
| - | 
| -          _Note:_ This does require that code in the stack can be | 
| -          executed.  Some Harvard architectures may not allow this. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Adding support for debugging core files,  Next: Defining Other Architecture Features,  Prev: Inferior Call Setup,  Up: Target Architecture Definition | 
| - | 
| -11.9 Adding support for debugging core files | 
| -============================================ | 
| - | 
| -The prerequisite for adding core file support in GDB is to have core | 
| -file support in BFD. | 
| - | 
| -   Once BFD support is available, writing the apropriate | 
| -`regset_from_core_section' architecture function should be all that is | 
| -needed in order to add support for core files in GDB. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Defining Other Architecture Features,  Next: Adding a New Target,  Prev: Adding support for debugging core files,  Up: Target Architecture Definition | 
| - | 
| -11.10 Defining Other Architecture Features | 
| -========================================== | 
| - | 
| -This section describes other functions and values in `gdbarch', | 
| -together with some useful macros, that you can use to define the target | 
| -architecture. | 
| - | 
| -`CORE_ADDR gdbarch_addr_bits_remove (GDBARCH, ADDR)' | 
| -     If a raw machine instruction address includes any bits that are not | 
| -     really part of the address, then this function is used to zero | 
| -     those bits in ADDR.  This is only used for addresses of | 
| -     instructions, and even then not in all contexts. | 
| - | 
| -     For example, the two low-order bits of the PC on the | 
| -     Hewlett-Packard PA 2.0 architecture contain the privilege level of | 
| -     the corresponding instruction.  Since instructions must always be | 
| -     aligned on four-byte boundaries, the processor masks out these | 
| -     bits to generate the actual address of the instruction. | 
| -     `gdbarch_addr_bits_remove' would then for example look like that: | 
| -          arch_addr_bits_remove (CORE_ADDR addr) | 
| -          { | 
| -            return (addr &= ~0x3); | 
| -          } | 
| - | 
| -`int address_class_name_to_type_flags (GDBARCH, NAME, TYPE_FLAGS_PTR)' | 
| -     If NAME is a valid address class qualifier name, set the `int' | 
| -     referenced by TYPE_FLAGS_PTR to the mask representing the qualifier | 
| -     and return 1.  If NAME is not a valid address class qualifier name, | 
| -     return 0. | 
| - | 
| -     The value for TYPE_FLAGS_PTR should be one of | 
| -     `TYPE_FLAG_ADDRESS_CLASS_1', `TYPE_FLAG_ADDRESS_CLASS_2', or | 
| -     possibly some combination of these values or'd together.  *Note | 
| -     Address Classes: Target Architecture Definition. | 
| - | 
| -`int address_class_name_to_type_flags_p (GDBARCH)' | 
| -     Predicate which indicates whether | 
| -     `address_class_name_to_type_flags' has been defined. | 
| - | 
| -`int gdbarch_address_class_type_flags (GDBARCH, BYTE_SIZE, DWARF2_ADDR_CLASS)' | 
| -     Given a pointers byte size (as described by the debug information) | 
| -     and the possible `DW_AT_address_class' value, return the type flags | 
| -     used by GDB to represent this address class.  The value returned | 
| -     should be one of `TYPE_FLAG_ADDRESS_CLASS_1', | 
| -     `TYPE_FLAG_ADDRESS_CLASS_2', or possibly some combination of these | 
| -     values or'd together.  *Note Address Classes: Target Architecture | 
| -     Definition. | 
| - | 
| -`int gdbarch_address_class_type_flags_p (GDBARCH)' | 
| -     Predicate which indicates whether | 
| -     `gdbarch_address_class_type_flags_p' has been defined. | 
| - | 
| -`const char *gdbarch_address_class_type_flags_to_name (GDBARCH, TYPE_FLAGS)' | 
| -     Return the name of the address class qualifier associated with the | 
| -     type flags given by TYPE_FLAGS. | 
| - | 
| -`int gdbarch_address_class_type_flags_to_name_p (GDBARCH)' | 
| -     Predicate which indicates whether | 
| -     `gdbarch_address_class_type_flags_to_name' has been defined. | 
| -     *Note Address Classes: Target Architecture Definition. | 
| - | 
| -`void gdbarch_address_to_pointer (GDBARCH, TYPE, BUF, ADDR)' | 
| -     Store in BUF a pointer of type TYPE representing the address ADDR, | 
| -     in the appropriate format for the current architecture.  This | 
| -     function may safely assume that TYPE is either a pointer or a C++ | 
| -     reference type.  *Note Pointers Are Not Always Addresses: Target | 
| -     Architecture Definition. | 
| - | 
| -`int gdbarch_believe_pcc_promotion (GDBARCH)' | 
| -     Used to notify if the compiler promotes a `short' or `char' | 
| -     parameter to an `int', but still reports the parameter as its | 
| -     original type, rather than the promoted type. | 
| - | 
| -`gdbarch_bits_big_endian (GDBARCH)' | 
| -     This is used if the numbering of bits in the targets does *not* | 
| -     match the endianism of the target byte order.  A value of 1 means | 
| -     that the bits are numbered in a big-endian bit order, 0 means | 
| -     little-endian. | 
| - | 
| -`set_gdbarch_bits_big_endian (GDBARCH, BITS_BIG_ENDIAN)' | 
| -     Calling set_gdbarch_bits_big_endian with a value of 1 indicates | 
| -     that the bits in the target are numbered in a big-endian bit | 
| -     order, 0 indicates little-endian. | 
| - | 
| -`BREAKPOINT' | 
| -     This is the character array initializer for the bit pattern to put | 
| -     into memory where a breakpoint is set.  Although it's common to | 
| -     use a trap instruction for a breakpoint, it's not required; for | 
| -     instance, the bit pattern could be an invalid instruction.  The | 
| -     breakpoint must be no longer than the shortest instruction of the | 
| -     architecture. | 
| - | 
| -     `BREAKPOINT' has been deprecated in favor of | 
| -     `gdbarch_breakpoint_from_pc'. | 
| - | 
| -`BIG_BREAKPOINT' | 
| -`LITTLE_BREAKPOINT' | 
| -     Similar to BREAKPOINT, but used for bi-endian targets. | 
| - | 
| -     `BIG_BREAKPOINT' and `LITTLE_BREAKPOINT' have been deprecated in | 
| -     favor of `gdbarch_breakpoint_from_pc'. | 
| - | 
| -`const gdb_byte *gdbarch_breakpoint_from_pc (GDBARCH, PCPTR, LENPTR)' | 
| -     Use the program counter to determine the contents and size of a | 
| -     breakpoint instruction.  It returns a pointer to a static string | 
| -     of bytes that encode a breakpoint instruction, stores the length | 
| -     of the string to `*LENPTR', and adjusts the program counter (if | 
| -     necessary) to point to the actual memory location where the | 
| -     breakpoint should be inserted.  May return `NULL' to indicate that | 
| -     software breakpoints are not supported. | 
| - | 
| -     Although it is common to use a trap instruction for a breakpoint, | 
| -     it's not required; for instance, the bit pattern could be an | 
| -     invalid instruction.  The breakpoint must be no longer than the | 
| -     shortest instruction of the architecture. | 
| - | 
| -     Provided breakpoint bytes can be also used by | 
| -     `bp_loc_is_permanent' to detect permanent breakpoints. | 
| -     `gdbarch_breakpoint_from_pc' should return an unchanged memory | 
| -     copy if it was called for a location with permanent breakpoint as | 
| -     some architectures use breakpoint instructions containing | 
| -     arbitrary parameter value. | 
| - | 
| -     Replaces all the other BREAKPOINT macros. | 
| - | 
| -`int gdbarch_memory_insert_breakpoint (GDBARCH, BP_TGT)' | 
| -`gdbarch_memory_remove_breakpoint (GDBARCH, BP_TGT)' | 
| -     Insert or remove memory based breakpoints.  Reasonable defaults | 
| -     (`default_memory_insert_breakpoint' and | 
| -     `default_memory_remove_breakpoint' respectively) have been | 
| -     provided so that it is not necessary to set these for most | 
| -     architectures.  Architectures which may want to set | 
| -     `gdbarch_memory_insert_breakpoint' and | 
| -     `gdbarch_memory_remove_breakpoint' will likely have instructions | 
| -     that are oddly sized or are not stored in a conventional manner. | 
| - | 
| -     It may also be desirable (from an efficiency standpoint) to define | 
| -     custom breakpoint insertion and removal routines if | 
| -     `gdbarch_breakpoint_from_pc' needs to read the target's memory for | 
| -     some reason. | 
| - | 
| -`CORE_ADDR gdbarch_adjust_breakpoint_address (GDBARCH, BPADDR)' | 
| -     Given an address at which a breakpoint is desired, return a | 
| -     breakpoint address adjusted to account for architectural | 
| -     constraints on breakpoint placement.  This method is not needed by | 
| -     most targets. | 
| - | 
| -     The FR-V target (see `frv-tdep.c') requires this method.  The FR-V | 
| -     is a VLIW architecture in which a number of RISC-like instructions | 
| -     are grouped (packed) together into an aggregate instruction or | 
| -     instruction bundle.  When the processor executes one of these | 
| -     bundles, the component instructions are executed in parallel. | 
| - | 
| -     In the course of optimization, the compiler may group instructions | 
| -     from distinct source statements into the same bundle.  The line | 
| -     number information associated with one of the latter statements | 
| -     will likely refer to some instruction other than the first one in | 
| -     the bundle.  So, if the user attempts to place a breakpoint on one | 
| -     of these latter statements, GDB must be careful to _not_ place the | 
| -     break instruction on any instruction other than the first one in | 
| -     the bundle.  (Remember though that the instructions within a | 
| -     bundle execute in parallel, so the _first_ instruction is the | 
| -     instruction at the lowest address and has nothing to do with | 
| -     execution order.) | 
| - | 
| -     The FR-V's `gdbarch_adjust_breakpoint_address' method will adjust a | 
| -     breakpoint's address by scanning backwards for the beginning of | 
| -     the bundle, returning the address of the bundle. | 
| - | 
| -     Since the adjustment of a breakpoint may significantly alter a | 
| -     user's expectation, GDB prints a warning when an adjusted | 
| -     breakpoint is initially set and each time that that breakpoint is | 
| -     hit. | 
| - | 
| -`int gdbarch_call_dummy_location (GDBARCH)' | 
| -     See the file `inferior.h'. | 
| - | 
| -     This method has been replaced by `gdbarch_push_dummy_code' (*note | 
| -     gdbarch_push_dummy_code::). | 
| - | 
| -`int gdbarch_cannot_fetch_register (GDBARCH, REGUM)' | 
| -     This function should return nonzero if REGNO cannot be fetched | 
| -     from an inferior process. | 
| - | 
| -`int gdbarch_cannot_store_register (GDBARCH, REGNUM)' | 
| -     This function should return nonzero if REGNO should not be written | 
| -     to the target.  This is often the case for program counters, | 
| -     status words, and other special registers.  This function returns | 
| -     0 as default so that GDB will assume that all registers may be | 
| -     written. | 
| - | 
| -`int gdbarch_convert_register_p (GDBARCH, REGNUM, struct type *TYPE)' | 
| -     Return non-zero if register REGNUM represents data values of type | 
| -     TYPE in a non-standard form.  *Note Using Different Register and | 
| -     Memory Data Representations: Target Architecture Definition. | 
| - | 
| -`int gdbarch_fp0_regnum (GDBARCH)' | 
| -     This function returns the number of the first floating point | 
| -     register, if the machine has such registers.  Otherwise, it | 
| -     returns -1. | 
| - | 
| -`CORE_ADDR gdbarch_decr_pc_after_break (GDBARCH)' | 
| -     This function shall return the amount by which to decrement the PC | 
| -     after the program encounters a breakpoint.  This is often the | 
| -     number of bytes in `BREAKPOINT', though not always.  For most | 
| -     targets this value will be 0. | 
| - | 
| -`DISABLE_UNSETTABLE_BREAK (ADDR)' | 
| -     If defined, this should evaluate to 1 if ADDR is in a shared | 
| -     library in which breakpoints cannot be set and so should be | 
| -     disabled. | 
| - | 
| -`int gdbarch_dwarf2_reg_to_regnum (GDBARCH, DWARF2_REGNR)' | 
| -     Convert DWARF2 register number DWARF2_REGNR into GDB regnum.  If | 
| -     not defined, no conversion will be performed. | 
| - | 
| -`int gdbarch_ecoff_reg_to_regnum (GDBARCH, ECOFF_REGNR)' | 
| -     Convert ECOFF register number  ECOFF_REGNR into GDB regnum.  If | 
| -     not defined, no conversion will be performed. | 
| - | 
| -`GCC_COMPILED_FLAG_SYMBOL' | 
| -`GCC2_COMPILED_FLAG_SYMBOL' | 
| -     If defined, these are the names of the symbols that GDB will look | 
| -     for to detect that GCC compiled the file.  The default symbols are | 
| -     `gcc_compiled.' and `gcc2_compiled.', respectively.  (Currently | 
| -     only defined for the Delta 68.) | 
| - | 
| -`gdbarch_get_longjmp_target' | 
| -     This function determines the target PC address that `longjmp' will | 
| -     jump to, assuming that we have just stopped at a `longjmp' | 
| -     breakpoint.  It takes a `CORE_ADDR *' as argument, and stores the | 
| -     target PC value through this pointer.  It examines the current | 
| -     state of the machine as needed, typically by using a | 
| -     manually-determined offset into the `jmp_buf'.  (While we might | 
| -     like to get the offset from the target's `jmpbuf.h', that header | 
| -     file cannot be assumed to be available when building a | 
| -     cross-debugger.) | 
| - | 
| -`DEPRECATED_IBM6000_TARGET' | 
| -     Shows that we are configured for an IBM RS/6000 system.  This | 
| -     conditional should be eliminated (FIXME) and replaced by | 
| -     feature-specific macros.  It was introduced in haste and we are | 
| -     repenting at leisure. | 
| - | 
| -`I386_USE_GENERIC_WATCHPOINTS' | 
| -     An x86-based target can define this to use the generic x86 | 
| -     watchpoint support; see *Note I386_USE_GENERIC_WATCHPOINTS: | 
| -     Algorithms. | 
| - | 
| -`gdbarch_in_function_epilogue_p (GDBARCH, ADDR)' | 
| -     Returns non-zero if the given ADDR is in the epilogue of a | 
| -     function.  The epilogue of a function is defined as the part of a | 
| -     function where the stack frame of the function already has been | 
| -     destroyed up to the final `return from function call' instruction. | 
| - | 
| -`int gdbarch_in_solib_return_trampoline (GDBARCH, PC, NAME)' | 
| -     Define this function to return nonzero if the program is stopped | 
| -     in the trampoline that returns from a shared library. | 
| - | 
| -`target_so_ops.in_dynsym_resolve_code (PC)' | 
| -     Define this to return nonzero if the program is stopped in the | 
| -     dynamic linker. | 
| - | 
| -`SKIP_SOLIB_RESOLVER (PC)' | 
| -     Define this to evaluate to the (nonzero) address at which execution | 
| -     should continue to get past the dynamic linker's symbol resolution | 
| -     function.  A zero value indicates that it is not important or | 
| -     necessary to set a breakpoint to get through the dynamic linker | 
| -     and that single stepping will suffice. | 
| - | 
| -`CORE_ADDR gdbarch_integer_to_address (GDBARCH, TYPE, BUF)' | 
| -     Define this when the architecture needs to handle non-pointer to | 
| -     address conversions specially.  Converts that value to an address | 
| -     according to the current architectures conventions. | 
| - | 
| -     _Pragmatics: When the user copies a well defined expression from | 
| -     their source code and passes it, as a parameter, to GDB's `print' | 
| -     command, they should get the same value as would have been | 
| -     computed by the target program.  Any deviation from this rule can | 
| -     cause major confusion and annoyance, and needs to be justified | 
| -     carefully.  In other words, GDB doesn't really have the freedom to | 
| -     do these conversions in clever and useful ways.  It has, however, | 
| -     been pointed out that users aren't complaining about how GDB casts | 
| -     integers to pointers; they are complaining that they can't take an | 
| -     address from a disassembly listing and give it to `x/i'.  Adding | 
| -     an architecture method like `gdbarch_integer_to_address' certainly | 
| -     makes it possible for GDB to "get it right" in all circumstances._ | 
| - | 
| -     *Note Pointers Are Not Always Addresses: Target Architecture | 
| -     Definition. | 
| - | 
| -`CORE_ADDR gdbarch_pointer_to_address (GDBARCH, TYPE, BUF)' | 
| -     Assume that BUF holds a pointer of type TYPE, in the appropriate | 
| -     format for the current architecture.  Return the byte address the | 
| -     pointer refers to.  *Note Pointers Are Not Always Addresses: | 
| -     Target Architecture Definition. | 
| - | 
| -`void gdbarch_register_to_value(GDBARCH, FRAME, REGNUM, TYPE, FUR)' | 
| -     Convert the raw contents of register REGNUM into a value of type | 
| -     TYPE.  *Note Using Different Register and Memory Data | 
| -     Representations: Target Architecture Definition. | 
| - | 
| -`REGISTER_CONVERT_TO_VIRTUAL(REG, TYPE, FROM, TO)' | 
| -     Convert the value of register REG from its raw form to its virtual | 
| -     form.  *Note Raw and Virtual Register Representations: Target | 
| -     Architecture Definition. | 
| - | 
| -`REGISTER_CONVERT_TO_RAW(TYPE, REG, FROM, TO)' | 
| -     Convert the value of register REG from its virtual form to its raw | 
| -     form.  *Note Raw and Virtual Register Representations: Target | 
| -     Architecture Definition. | 
| - | 
| -`const struct regset *regset_from_core_section (struct gdbarch * GDBARCH, const char * SECT_NAME, size_t SECT_SIZE)' | 
| -     Return the appropriate register set for a core file section with | 
| -     name SECT_NAME and size SECT_SIZE. | 
| - | 
| -`SOFTWARE_SINGLE_STEP_P()' | 
| -     Define this as 1 if the target does not have a hardware single-step | 
| -     mechanism.  The macro `SOFTWARE_SINGLE_STEP' must also be defined. | 
| - | 
| -`SOFTWARE_SINGLE_STEP(SIGNAL, INSERT_BREAKPOINTS_P)' | 
| -     A function that inserts or removes (depending on | 
| -     INSERT_BREAKPOINTS_P) breakpoints at each possible destinations of | 
| -     the next instruction.  See `sparc-tdep.c' and `rs6000-tdep.c' for | 
| -     examples. | 
| - | 
| -`set_gdbarch_sofun_address_maybe_missing (GDBARCH, SET)' | 
| -     Somebody clever observed that, the more actual addresses you have | 
| -     in the debug information, the more time the linker has to spend | 
| -     relocating them.  So whenever there's some other way the debugger | 
| -     could find the address it needs, you should omit it from the debug | 
| -     info, to make linking faster. | 
| - | 
| -     Calling `set_gdbarch_sofun_address_maybe_missing' with a non-zero | 
| -     argument SET indicates that a particular set of hacks of this sort | 
| -     are in use, affecting `N_SO' and `N_FUN' entries in stabs-format | 
| -     debugging information.  `N_SO' stabs mark the beginning and ending | 
| -     addresses of compilation units in the text segment.  `N_FUN' stabs | 
| -     mark the starts and ends of functions. | 
| - | 
| -     In this case, GDB assumes two things: | 
| - | 
| -        * `N_FUN' stabs have an address of zero.  Instead of using those | 
| -          addresses, you should find the address where the function | 
| -          starts by taking the function name from the stab, and then | 
| -          looking that up in the minsyms (the linker/assembler symbol | 
| -          table).  In other words, the stab has the name, and the | 
| -          linker/assembler symbol table is the only place that carries | 
| -          the address. | 
| - | 
| -        * `N_SO' stabs have an address of zero, too.  You just look at | 
| -          the `N_FUN' stabs that appear before and after the `N_SO' | 
| -          stab, and guess the starting and ending addresses of the | 
| -          compilation unit from them. | 
| - | 
| -`int gdbarch_stabs_argument_has_addr (GDBARCH, TYPE)' | 
| -     Define this function to return nonzero if a function argument of | 
| -     type TYPE is passed by reference instead of value. | 
| - | 
| -`CORE_ADDR gdbarch_push_dummy_call (GDBARCH, FUNCTION, REGCACHE, BP_ADDR, NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR)' | 
| -     Define this to push the dummy frame's call to the inferior | 
| -     function onto the stack.  In addition to pushing NARGS, the code | 
| -     should push STRUCT_ADDR (when STRUCT_RETURN is non-zero), and the | 
| -     return address (BP_ADDR). | 
| - | 
| -     FUNCTION is a pointer to a `struct value'; on architectures that | 
| -     use function descriptors, this contains the function descriptor | 
| -     value. | 
| - | 
| -     Returns the updated top-of-stack pointer. | 
| - | 
| -`CORE_ADDR gdbarch_push_dummy_code (GDBARCH, SP, FUNADDR, USING_GCC, ARGS, NARGS, VALUE_TYPE, REAL_PC, BP_ADDR, REGCACHE)' | 
| -     Given a stack based call dummy, push the instruction sequence | 
| -     (including space for a breakpoint) to which the called function | 
| -     should return. | 
| - | 
| -     Set BP_ADDR to the address at which the breakpoint instruction | 
| -     should be inserted, REAL_PC to the resume address when starting | 
| -     the call sequence, and return the updated inner-most stack address. | 
| - | 
| -     By default, the stack is grown sufficient to hold a frame-aligned | 
| -     (*note frame_align::) breakpoint, BP_ADDR is set to the address | 
| -     reserved for that breakpoint, and REAL_PC set to FUNADDR. | 
| - | 
| -     This method replaces `gdbarch_call_dummy_location (GDBARCH)'. | 
| - | 
| -`int gdbarch_sdb_reg_to_regnum (GDBARCH, SDB_REGNR)' | 
| -     Use this function to convert sdb register SDB_REGNR into GDB | 
| -     regnum.  If not defined, no conversion will be done. | 
| - | 
| -`enum return_value_convention gdbarch_return_value (struct gdbarch *GDBARCH, struct type *VALTYPE, struct regcache *REGCACHE, void *READBUF, const void *WRITEBUF)' | 
| -     Given a function with a return-value of type RETTYPE, return which | 
| -     return-value convention that function would use. | 
| - | 
| -     GDB currently recognizes two function return-value conventions: | 
| -     `RETURN_VALUE_REGISTER_CONVENTION' where the return value is found | 
| -     in registers; and `RETURN_VALUE_STRUCT_CONVENTION' where the return | 
| -     value is found in memory and the address of that memory location is | 
| -     passed in as the function's first parameter. | 
| - | 
| -     If the register convention is being used, and WRITEBUF is | 
| -     non-`NULL', also copy the return-value in WRITEBUF into REGCACHE. | 
| - | 
| -     If the register convention is being used, and READBUF is | 
| -     non-`NULL', also copy the return value from REGCACHE into READBUF | 
| -     (REGCACHE contains a copy of the registers from the just returned | 
| -     function). | 
| - | 
| -     _Maintainer note: This method replaces separate predicate, extract, | 
| -     store methods.  By having only one method, the logic needed to | 
| -     determine the return-value convention need only be implemented in | 
| -     one place.  If GDB were written in an OO language, this method | 
| -     would instead return an object that knew how to perform the | 
| -     register return-value extract and store._ | 
| - | 
| -     _Maintainer note: This method does not take a GCC_P parameter, and | 
| -     such a parameter should not be added.  If an architecture that | 
| -     requires per-compiler or per-function information be identified, | 
| -     then the replacement of RETTYPE with `struct value' FUNCTION | 
| -     should be pursued._ | 
| - | 
| -     _Maintainer note: The REGCACHE parameter limits this methods to | 
| -     the inner most frame.  While replacing REGCACHE with a `struct | 
| -     frame_info' FRAME parameter would remove that limitation there has | 
| -     yet to be a demonstrated need for such a change._ | 
| - | 
| -`void gdbarch_skip_permanent_breakpoint (GDBARCH, REGCACHE)' | 
| -     Advance the inferior's PC past a permanent breakpoint.  GDB | 
| -     normally steps over a breakpoint by removing it, stepping one | 
| -     instruction, and re-inserting the breakpoint.  However, permanent | 
| -     breakpoints are hardwired into the inferior, and can't be removed, | 
| -     so this strategy doesn't work.  Calling | 
| -     `gdbarch_skip_permanent_breakpoint' adjusts the processor's state | 
| -     so that execution will resume just after the breakpoint.  This | 
| -     function does the right thing even when the breakpoint is in the | 
| -     delay slot of a branch or jump. | 
| - | 
| -`CORE_ADDR gdbarch_skip_trampoline_code (GDBARCH, FRAME, PC)' | 
| -     If the target machine has trampoline code that sits between | 
| -     callers and the functions being called, then define this function | 
| -     to return a new PC that is at the start of the real function. | 
| - | 
| -`int gdbarch_deprecated_fp_regnum (GDBARCH)' | 
| -     If the frame pointer is in a register, use this function to return | 
| -     the number of that register. | 
| - | 
| -`int gdbarch_stab_reg_to_regnum (GDBARCH, STAB_REGNR)' | 
| -     Use this function to convert stab register STAB_REGNR into GDB | 
| -     regnum.  If not defined, no conversion will be done. | 
| - | 
| -`TARGET_CHAR_BIT' | 
| -     Number of bits in a char; defaults to 8. | 
| - | 
| -`int gdbarch_char_signed (GDBARCH)' | 
| -     Non-zero if `char' is normally signed on this architecture; zero if | 
| -     it should be unsigned. | 
| - | 
| -     The ISO C standard requires the compiler to treat `char' as | 
| -     equivalent to either `signed char' or `unsigned char'; any | 
| -     character in the standard execution set is supposed to be positive. | 
| -     Most compilers treat `char' as signed, but `char' is unsigned on | 
| -     the IBM S/390, RS6000, and PowerPC targets. | 
| - | 
| -`int gdbarch_double_bit (GDBARCH)' | 
| -     Number of bits in a double float; defaults to | 
| -     `8 * TARGET_CHAR_BIT'. | 
| - | 
| -`int gdbarch_float_bit (GDBARCH)' | 
| -     Number of bits in a float; defaults to `4 * TARGET_CHAR_BIT'. | 
| - | 
| -`int gdbarch_int_bit (GDBARCH)' | 
| -     Number of bits in an integer; defaults to `4 * TARGET_CHAR_BIT'. | 
| - | 
| -`int gdbarch_long_bit (GDBARCH)' | 
| -     Number of bits in a long integer; defaults to | 
| -     `4 * TARGET_CHAR_BIT'. | 
| - | 
| -`int gdbarch_long_double_bit (GDBARCH)' | 
| -     Number of bits in a long double float; defaults to | 
| -     `2 * gdbarch_double_bit (GDBARCH)'. | 
| - | 
| -`int gdbarch_long_long_bit (GDBARCH)' | 
| -     Number of bits in a long long integer; defaults to | 
| -     `2 * gdbarch_long_bit (GDBARCH)'. | 
| - | 
| -`int gdbarch_ptr_bit (GDBARCH)' | 
| -     Number of bits in a pointer; defaults to | 
| -     `gdbarch_int_bit (GDBARCH)'. | 
| - | 
| -`int gdbarch_short_bit (GDBARCH)' | 
| -     Number of bits in a short integer; defaults to | 
| -     `2 * TARGET_CHAR_BIT'. | 
| - | 
| -`void gdbarch_virtual_frame_pointer (GDBARCH, PC, FRAME_REGNUM, FRAME_OFFSET)' | 
| -     Returns a `(REGISTER, OFFSET)' pair representing the virtual frame | 
| -     pointer in use at the code address PC.  If virtual frame pointers | 
| -     are not used, a default definition simply returns | 
| -     `gdbarch_deprecated_fp_regnum' (or `gdbarch_sp_regnum', if no | 
| -     frame pointer is defined), with an offset of zero. | 
| - | 
| -`TARGET_HAS_HARDWARE_WATCHPOINTS' | 
| -     If non-zero, the target has support for hardware-assisted | 
| -     watchpoints.  *Note watchpoints: Algorithms, for more details and | 
| -     other related macros. | 
| - | 
| -`int gdbarch_print_insn (GDBARCH, VMA, INFO)' | 
| -     This is the function used by GDB to print an assembly instruction. | 
| -     It prints the instruction at address VMA in debugged memory and | 
| -     returns the length of the instruction, in bytes.  This usually | 
| -     points to a function in the `opcodes' library (*note Opcodes: | 
| -     Support Libraries.).  INFO is a structure (of type | 
| -     `disassemble_info') defined in the header file | 
| -     `include/dis-asm.h', and used to pass information to the | 
| -     instruction decoding routine. | 
| - | 
| -`frame_id gdbarch_dummy_id (GDBARCH, FRAME)' | 
| -     Given FRAME return a `struct frame_id' that uniquely identifies an | 
| -     inferior function call's dummy frame.  The value returned must | 
| -     match the dummy frame stack value previously saved by | 
| -     `call_function_by_hand'. | 
| - | 
| -`void gdbarch_value_to_register (GDBARCH, FRAME, TYPE, BUF)' | 
| -     Convert a value of type TYPE into the raw contents of a register. | 
| -     *Note Using Different Register and Memory Data Representations: | 
| -     Target Architecture Definition. | 
| - | 
| - | 
| -   Motorola M68K target conditionals. | 
| - | 
| -`BPT_VECTOR' | 
| -     Define this to be the 4-bit location of the breakpoint trap | 
| -     vector.  If not defined, it will default to `0xf'. | 
| - | 
| -`REMOTE_BPT_VECTOR' | 
| -     Defaults to `1'. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Adding a New Target,  Prev: Defining Other Architecture Features,  Up: Target Architecture Definition | 
| - | 
| -11.11 Adding a New Target | 
| -========================= | 
| - | 
| -The following files add a target to GDB: | 
| - | 
| -`gdb/TTT-tdep.c' | 
| -     Contains any miscellaneous code required for this target machine. | 
| -     On some machines it doesn't exist at all. | 
| - | 
| -`gdb/ARCH-tdep.c' | 
| -`gdb/ARCH-tdep.h' | 
| -     This is required to describe the basic layout of the target | 
| -     machine's processor chip (registers, stack, etc.).  It can be | 
| -     shared among many targets that use the same processor architecture. | 
| - | 
| - | 
| -   (Target header files such as `gdb/config/ARCH/tm-TTT.h', | 
| -`gdb/config/ARCH/tm-ARCH.h', and `config/tm-OS.h' are no longer used.) | 
| - | 
| -   A GDB description for a new architecture, arch is created by | 
| -defining a global function `_initialize_ARCH_tdep', by convention in | 
| -the source file `ARCH-tdep.c'.  For example, in the case of the | 
| -OpenRISC 1000, this function is called `_initialize_or1k_tdep' and is | 
| -found in the file `or1k-tdep.c'. | 
| - | 
| -   The object file resulting from compiling this source file, which will | 
| -contain the implementation of the `_initialize_ARCH_tdep' function is | 
| -specified in the GDB `configure.tgt' file, which includes a large case | 
| -statement pattern matching against the `--target' option of the | 
| -`configure' script. | 
| - | 
| -     _Note:_ If the architecture requires multiple source files, the | 
| -     corresponding binaries should be included in `configure.tgt'. | 
| -     However if there are header files, the dependencies on these will | 
| -     not be picked up from the entries in `configure.tgt'. The | 
| -     `Makefile.in' file will need extending to show these dependencies. | 
| - | 
| -   A new struct gdbarch, defining the new architecture, is created | 
| -within the `_initialize_ARCH_tdep' function by calling | 
| -`gdbarch_register': | 
| - | 
| -     void gdbarch_register (enum bfd_architecture    architecture, | 
| -                            gdbarch_init_ftype      *init_func, | 
| -                            gdbarch_dump_tdep_ftype *tdep_dump_func); | 
| - | 
| -   This function has been described fully in an earlier section.  *Note | 
| -How an Architecture is Represented: How an Architecture is Represented. | 
| - | 
| -   The new `struct gdbarch' should contain implementations of the | 
| -necessary functions (described in the previous sections) to describe | 
| -the basic layout of the target machine's processor chip (registers, | 
| -stack, etc.).  It can be shared among many targets that use the same | 
| -processor architecture. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Target Descriptions,  Next: Target Vector Definition,  Prev: Target Architecture Definition,  Up: Top | 
| - | 
| -12 Target Descriptions | 
| -********************** | 
| - | 
| -The target architecture definition (*note Target Architecture | 
| -Definition::) contains GDB's hard-coded knowledge about an | 
| -architecture.  For some platforms, it is handy to have more flexible | 
| -knowledge about a specific instance of the architecture--for instance, | 
| -a processor or development board.  "Target descriptions" provide a | 
| -mechanism for the user to tell GDB more about what their target | 
| -supports, or for the target to tell GDB directly. | 
| - | 
| -   For details on writing, automatically supplying, and manually | 
| -selecting target descriptions, see *Note Target Descriptions: | 
| -(gdb)Target Descriptions.  This section will cover some related topics | 
| -about the GDB internals. | 
| - | 
| -* Menu: | 
| - | 
| -* Target Descriptions Implementation:: | 
| -* Adding Target Described Register Support:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: Target Descriptions Implementation,  Next: Adding Target Described Register Support,  Up: Target Descriptions | 
| - | 
| -12.1 Target Descriptions Implementation | 
| -======================================= | 
| - | 
| -Before GDB connects to a new target, or runs a new program on an | 
| -existing target, it discards any existing target description and | 
| -reverts to a default gdbarch.  Then, after connecting, it looks for a | 
| -new target description by calling `target_find_description'. | 
| - | 
| -   A description may come from a user specified file (XML), the remote | 
| -`qXfer:features:read' packet (also XML), or from any custom | 
| -`to_read_description' routine in the target vector.  For instance, the | 
| -remote target supports guessing whether a MIPS target is 32-bit or | 
| -64-bit based on the size of the `g' packet. | 
| - | 
| -   If any target description is found, GDB creates a new gdbarch | 
| -incorporating the description by calling `gdbarch_update_p'.  Any | 
| -`<architecture>' element is handled first, to determine which | 
| -architecture's gdbarch initialization routine is called to create the | 
| -new architecture.  Then the initialization routine is called, and has a | 
| -chance to adjust the constructed architecture based on the contents of | 
| -the target description.  For instance, it can recognize any properties | 
| -set by a `to_read_description' routine.  Also see *Note Adding Target | 
| -Described Register Support::. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Adding Target Described Register Support,  Prev: Target Descriptions Implementation,  Up: Target Descriptions | 
| - | 
| -12.2 Adding Target Described Register Support | 
| -============================================= | 
| - | 
| -Target descriptions can report additional registers specific to an | 
| -instance of the target.  But it takes a little work in the architecture | 
| -specific routines to support this. | 
| - | 
| -   A target description must either have no registers or a complete | 
| -set--this avoids complexity in trying to merge standard registers with | 
| -the target defined registers.  It is the architecture's responsibility | 
| -to validate that a description with registers has everything it needs. | 
| -To keep architecture code simple, the same mechanism is used to assign | 
| -fixed internal register numbers to standard registers. | 
| - | 
| -   If `tdesc_has_registers' returns 1, the description contains | 
| -registers.  The architecture's `gdbarch_init' routine should: | 
| - | 
| -   * Call `tdesc_data_alloc' to allocate storage, early, before | 
| -     searching for a matching gdbarch or allocating a new one. | 
| - | 
| -   * Use `tdesc_find_feature' to locate standard features by name. | 
| - | 
| -   * Use `tdesc_numbered_register' and `tdesc_numbered_register_choices' | 
| -     to locate the expected registers in the standard features. | 
| - | 
| -   * Return `NULL' if a required feature is missing, or if any standard | 
| -     feature is missing expected registers.  This will produce a | 
| -     warning that the description was incomplete. | 
| - | 
| -   * Free the allocated data before returning, unless | 
| -     `tdesc_use_registers' is called. | 
| - | 
| -   * Call `set_gdbarch_num_regs' as usual, with a number higher than any | 
| -     fixed number passed to `tdesc_numbered_register'. | 
| - | 
| -   * Call `tdesc_use_registers' after creating a new gdbarch, before | 
| -     returning it. | 
| - | 
| - | 
| -   After `tdesc_use_registers' has been called, the architecture's | 
| -`register_name', `register_type', and `register_reggroup_p' routines | 
| -will not be called; that information will be taken from the target | 
| -description.  `num_regs' may be increased to account for any additional | 
| -registers in the description. | 
| - | 
| -   Pseudo-registers require some extra care: | 
| - | 
| -   * Using `tdesc_numbered_register' allows the architecture to give | 
| -     constant register numbers to standard architectural registers, e.g. | 
| -     as an `enum' in `ARCH-tdep.h'.  But because pseudo-registers are | 
| -     always numbered above `num_regs', which may be increased by the | 
| -     description, constant numbers can not be used for pseudos.  They | 
| -     must be numbered relative to `num_regs' instead. | 
| - | 
| -   * The description will not describe pseudo-registers, so the | 
| -     architecture must call `set_tdesc_pseudo_register_name', | 
| -     `set_tdesc_pseudo_register_type', and | 
| -     `set_tdesc_pseudo_register_reggroup_p' to supply routines | 
| -     describing pseudo registers.  These routines will be passed | 
| -     internal register numbers, so the same routines used for the | 
| -     gdbarch equivalents are usually suitable. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Target Vector Definition,  Next: Native Debugging,  Prev: Target Descriptions,  Up: Top | 
| - | 
| -13 Target Vector Definition | 
| -*************************** | 
| - | 
| -The target vector defines the interface between GDB's abstract handling | 
| -of target systems, and the nitty-gritty code that actually exercises | 
| -control over a process or a serial port.  GDB includes some 30-40 | 
| -different target vectors; however, each configuration of GDB includes | 
| -only a few of them. | 
| - | 
| -* Menu: | 
| - | 
| -* Managing Execution State:: | 
| -* Existing Targets:: | 
| - | 
| - | 
| -File: gdbint.info,  Node: Managing Execution State,  Next: Existing Targets,  Up: Target Vector Definition | 
| - | 
| -13.1 Managing Execution State | 
| -============================= | 
| - | 
| -A target vector can be completely inactive (not pushed on the target | 
| -stack), active but not running (pushed, but not connected to a fully | 
| -manifested inferior), or completely active (pushed, with an accessible | 
| -inferior).  Most targets are only completely inactive or completely | 
| -active, but some support persistent connections to a target even when | 
| -the target has exited or not yet started. | 
| - | 
| -   For example, connecting to the simulator using `target sim' does not | 
| -create a running program.  Neither registers nor memory are accessible | 
| -until `run'.  Similarly, after `kill', the program can not continue | 
| -executing.  But in both cases GDB remains connected to the simulator, | 
| -and target-specific commands are directed to the simulator. | 
| - | 
| -   A target which only supports complete activation should push itself | 
| -onto the stack in its `to_open' routine (by calling `push_target'), and | 
| -unpush itself from the stack in its `to_mourn_inferior' routine (by | 
| -calling `unpush_target'). | 
| - | 
| -   A target which supports both partial and complete activation should | 
| -still call `push_target' in `to_open', but not call `unpush_target' in | 
| -`to_mourn_inferior'.  Instead, it should call either | 
| -`target_mark_running' or `target_mark_exited' in its `to_open', | 
| -depending on whether the target is fully active after connection.  It | 
| -should also call `target_mark_running' any time the inferior becomes | 
| -fully active (e.g. in `to_create_inferior' and `to_attach'), and | 
| -`target_mark_exited' when the inferior becomes inactive (in | 
| -`to_mourn_inferior').  The target should also make sure to call | 
| -`target_mourn_inferior' from its `to_kill', to return the target to | 
| -inactive state. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Existing Targets,  Prev: Managing Execution State,  Up: Target Vector Definition | 
| - | 
| -13.2 Existing Targets | 
| -===================== | 
| - | 
| -13.2.1 File Targets | 
| -------------------- | 
| - | 
| -Both executables and core files have target vectors. | 
| - | 
| -13.2.2 Standard Protocol and Remote Stubs | 
| ------------------------------------------ | 
| - | 
| -GDB's file `remote.c' talks a serial protocol to code that runs in the | 
| -target system.  GDB provides several sample "stubs" that can be | 
| -integrated into target programs or operating systems for this purpose; | 
| -they are named `CPU-stub.c'.  Many operating systems, embedded targets, | 
| -emulators, and simulators already have a GDB stub built into them, and | 
| -maintenance of the remote protocol must be careful to preserve | 
| -compatibility. | 
| - | 
| -   The GDB user's manual describes how to put such a stub into your | 
| -target code.  What follows is a discussion of integrating the SPARC | 
| -stub into a complicated operating system (rather than a simple | 
| -program), by Stu Grossman, the author of this stub. | 
| - | 
| -   The trap handling code in the stub assumes the following upon entry | 
| -to `trap_low': | 
| - | 
| -  1. %l1 and %l2 contain pc and npc respectively at the time of the | 
| -     trap; | 
| - | 
| -  2. traps are disabled; | 
| - | 
| -  3. you are in the correct trap window. | 
| - | 
| -   As long as your trap handler can guarantee those conditions, then | 
| -there is no reason why you shouldn't be able to "share" traps with the | 
| -stub.  The stub has no requirement that it be jumped to directly from | 
| -the hardware trap vector.  That is why it calls `exceptionHandler()', | 
| -which is provided by the external environment.  For instance, this could | 
| -set up the hardware traps to actually execute code which calls the stub | 
| -first, and then transfers to its own trap handler. | 
| - | 
| -   For the most point, there probably won't be much of an issue with | 
| -"sharing" traps, as the traps we use are usually not used by the kernel, | 
| -and often indicate unrecoverable error conditions.  Anyway, this is all | 
| -controlled by a table, and is trivial to modify.  The most important | 
| -trap for us is for `ta 1'.  Without that, we can't single step or do | 
| -breakpoints.  Everything else is unnecessary for the proper operation | 
| -of the debugger/stub. | 
| - | 
| -   From reading the stub, it's probably not obvious how breakpoints | 
| -work.  They are simply done by deposit/examine operations from GDB. | 
| - | 
| -13.2.3 ROM Monitor Interface | 
| ----------------------------- | 
| - | 
| -13.2.4 Custom Protocols | 
| ------------------------ | 
| - | 
| -13.2.5 Transport Layer | 
| ----------------------- | 
| - | 
| -13.2.6 Builtin Simulator | 
| ------------------------- | 
| - | 
| - | 
| -File: gdbint.info,  Node: Native Debugging,  Next: Support Libraries,  Prev: Target Vector Definition,  Up: Top | 
| - | 
| -14 Native Debugging | 
| -******************* | 
| - | 
| -Several files control GDB's configuration for native support: | 
| - | 
| -`gdb/config/ARCH/XYZ.mh' | 
| -     Specifies Makefile fragments needed by a _native_ configuration on | 
| -     machine XYZ.  In particular, this lists the required | 
| -     native-dependent object files, by defining `NATDEPFILES=...'. | 
| -     Also specifies the header file which describes native support on | 
| -     XYZ, by defining `NAT_FILE= nm-XYZ.h'.  You can also define | 
| -     `NAT_CFLAGS', `NAT_ADD_FILES', `NAT_CLIBS', `NAT_CDEPS', | 
| -     `NAT_GENERATED_FILES', etc.; see `Makefile.in'. | 
| - | 
| -     _Maintainer's note: The `.mh' suffix is because this file | 
| -     originally contained `Makefile' fragments for hosting GDB on | 
| -     machine XYZ.  While the file is no longer used for this purpose, | 
| -     the `.mh' suffix remains.  Perhaps someone will eventually rename | 
| -     these fragments so that they have a `.mn' suffix._ | 
| - | 
| -`gdb/config/ARCH/nm-XYZ.h' | 
| -     (`nm.h' is a link to this file, created by `configure').  Contains | 
| -     C macro definitions describing the native system environment, such | 
| -     as child process control and core file support. | 
| - | 
| -`gdb/XYZ-nat.c' | 
| -     Contains any miscellaneous C code required for this native support | 
| -     of this machine.  On some machines it doesn't exist at all. | 
| - | 
| -   There are some "generic" versions of routines that can be used by | 
| -various systems.  These can be customized in various ways by macros | 
| -defined in your `nm-XYZ.h' file.  If these routines work for the XYZ | 
| -host, you can just include the generic file's name (with `.o', not | 
| -`.c') in `NATDEPFILES'. | 
| - | 
| -   Otherwise, if your machine needs custom support routines, you will | 
| -need to write routines that perform the same functions as the generic | 
| -file.  Put them into `XYZ-nat.c', and put `XYZ-nat.o' into | 
| -`NATDEPFILES'. | 
| - | 
| -`inftarg.c' | 
| -     This contains the _target_ops vector_ that supports Unix child | 
| -     processes on systems which use ptrace and wait to control the | 
| -     child. | 
| - | 
| -`procfs.c' | 
| -     This contains the _target_ops vector_ that supports Unix child | 
| -     processes on systems which use /proc to control the child. | 
| - | 
| -`fork-child.c' | 
| -     This does the low-level grunge that uses Unix system calls to do a | 
| -     "fork and exec" to start up a child process. | 
| - | 
| -`infptrace.c' | 
| -     This is the low level interface to inferior processes for systems | 
| -     using the Unix `ptrace' call in a vanilla way. | 
| - | 
| -14.1 ptrace | 
| -=========== | 
| - | 
| -14.2 /proc | 
| -========== | 
| - | 
| -14.3 win32 | 
| -========== | 
| - | 
| -14.4 shared libraries | 
| -===================== | 
| - | 
| -14.5 Native Conditionals | 
| -======================== | 
| - | 
| -When GDB is configured and compiled, various macros are defined or left | 
| -undefined, to control compilation when the host and target systems are | 
| -the same.  These macros should be defined (or left undefined) in | 
| -`nm-SYSTEM.h'. | 
| - | 
| -`I386_USE_GENERIC_WATCHPOINTS' | 
| -     An x86-based machine can define this to use the generic x86 | 
| -     watchpoint support; see *Note I386_USE_GENERIC_WATCHPOINTS: | 
| -     Algorithms. | 
| - | 
| -`SOLIB_ADD (FILENAME, FROM_TTY, TARG, READSYMS)' | 
| -     Define this to expand into an expression that will cause the | 
| -     symbols in FILENAME to be added to GDB's symbol table.  If | 
| -     READSYMS is zero symbols are not read but any necessary low level | 
| -     processing for FILENAME is still done. | 
| - | 
| -`SOLIB_CREATE_INFERIOR_HOOK' | 
| -     Define this to expand into any shared-library-relocation code that | 
| -     you want to be run just after the child process has been forked. | 
| - | 
| -`START_INFERIOR_TRAPS_EXPECTED' | 
| -     When starting an inferior, GDB normally expects to trap twice; | 
| -     once when the shell execs, and once when the program itself execs. | 
| -     If the actual number of traps is something other than 2, then | 
| -     define this macro to expand into the number expected. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Support Libraries,  Next: Coding Standards,  Prev: Native Debugging,  Up: Top | 
| - | 
| -15 Support Libraries | 
| -******************** | 
| - | 
| -15.1 BFD | 
| -======== | 
| - | 
| -BFD provides support for GDB in several ways: | 
| - | 
| -_identifying executable and core files_ | 
| -     BFD will identify a variety of file types, including a.out, coff, | 
| -     and several variants thereof, as well as several kinds of core | 
| -     files. | 
| - | 
| -_access to sections of files_ | 
| -     BFD parses the file headers to determine the names, virtual | 
| -     addresses, sizes, and file locations of all the various named | 
| -     sections in files (such as the text section or the data section). | 
| -     GDB simply calls BFD to read or write section X at byte offset Y | 
| -     for length Z. | 
| - | 
| -_specialized core file support_ | 
| -     BFD provides routines to determine the failing command name stored | 
| -     in a core file, the signal with which the program failed, and | 
| -     whether a core file matches (i.e. could be a core dump of) a | 
| -     particular executable file. | 
| - | 
| -_locating the symbol information_ | 
| -     GDB uses an internal interface of BFD to determine where to find | 
| -     the symbol information in an executable file or symbol-file.  GDB | 
| -     itself handles the reading of symbols, since BFD does not | 
| -     "understand" debug symbols, but GDB uses BFD's cached information | 
| -     to find the symbols, string table, etc. | 
| - | 
| -15.2 opcodes | 
| -============ | 
| - | 
| -The opcodes library provides GDB's disassembler.  (It's a separate | 
| -library because it's also used in binutils, for `objdump'). | 
| - | 
| -15.3 readline | 
| -============= | 
| - | 
| -The `readline' library provides a set of functions for use by | 
| -applications that allow users to edit command lines as they are typed | 
| -in. | 
| - | 
| -15.4 libiberty | 
| -============== | 
| - | 
| -The `libiberty' library provides a set of functions and features that | 
| -integrate and improve on functionality found in modern operating | 
| -systems.  Broadly speaking, such features can be divided into three | 
| -groups: supplemental functions (functions that may be missing in some | 
| -environments and operating systems), replacement functions (providing a | 
| -uniform and easier to use interface for commonly used standard | 
| -functions), and extensions (which provide additional functionality | 
| -beyond standard functions). | 
| - | 
| -   GDB uses various features provided by the `libiberty' library, for | 
| -instance the C++ demangler, the IEEE floating format support functions, | 
| -the input options parser `getopt', the `obstack' extension, and other | 
| -functions. | 
| - | 
| -15.4.1 `obstacks' in GDB | 
| ------------------------- | 
| - | 
| -The obstack mechanism provides a convenient way to allocate and free | 
| -chunks of memory.  Each obstack is a pool of memory that is managed | 
| -like a stack.  Objects (of any nature, size and alignment) are | 
| -allocated and freed in a LIFO fashion on an obstack (see `libiberty''s | 
| -documentation for a more detailed explanation of `obstacks'). | 
| - | 
| -   The most noticeable use of the `obstacks' in GDB is in object files. | 
| -There is an obstack associated with each internal representation of an | 
| -object file.  Lots of things get allocated on these `obstacks': | 
| -dictionary entries, blocks, blockvectors, symbols, minimal symbols, | 
| -types, vectors of fundamental types, class fields of types, object | 
| -files section lists, object files section offset lists, line tables, | 
| -symbol tables, partial symbol tables, string tables, symbol table | 
| -private data, macros tables, debug information sections and entries, | 
| -import and export lists (som), unwind information (hppa), dwarf2 | 
| -location expressions data.  Plus various strings such as directory | 
| -names strings, debug format strings, names of types. | 
| - | 
| -   An essential and convenient property of all data on `obstacks' is | 
| -that memory for it gets allocated (with `obstack_alloc') at various | 
| -times during a debugging session, but it is released all at once using | 
| -the `obstack_free' function.  The `obstack_free' function takes a | 
| -pointer to where in the stack it must start the deletion from (much | 
| -like the cleanup chains have a pointer to where to start the cleanups). | 
| -Because of the stack like structure of the `obstacks', this allows to | 
| -free only a top portion of the obstack.  There are a few instances in | 
| -GDB where such thing happens.  Calls to `obstack_free' are done after | 
| -some local data is allocated to the obstack.  Only the local data is | 
| -deleted from the obstack.  Of course this assumes that nothing between | 
| -the `obstack_alloc' and the `obstack_free' allocates anything else on | 
| -the same obstack.  For this reason it is best and safest to use | 
| -temporary `obstacks'. | 
| - | 
| -   Releasing the whole obstack is also not safe per se.  It is safe only | 
| -under the condition that we know the `obstacks' memory is no longer | 
| -needed.  In GDB we get rid of the `obstacks' only when we get rid of | 
| -the whole objfile(s), for instance upon reading a new symbol file. | 
| - | 
| -15.5 gnu-regex | 
| -============== | 
| - | 
| -Regex conditionals. | 
| - | 
| -`C_ALLOCA' | 
| - | 
| -`NFAILURES' | 
| - | 
| -`RE_NREGS' | 
| - | 
| -`SIGN_EXTEND_CHAR' | 
| - | 
| -`SWITCH_ENUM_BUG' | 
| - | 
| -`SYNTAX_TABLE' | 
| - | 
| -`Sword' | 
| - | 
| -`sparc' | 
| - | 
| -15.6 Array Containers | 
| -===================== | 
| - | 
| -Often it is necessary to manipulate a dynamic array of a set of | 
| -objects.  C forces some bookkeeping on this, which can get cumbersome | 
| -and repetitive.  The `vec.h' file contains macros for defining and | 
| -using a typesafe vector type.  The functions defined will be inlined | 
| -when compiling, and so the abstraction cost should be zero.  Domain | 
| -checks are added to detect programming errors. | 
| - | 
| -   An example use would be an array of symbols or section information. | 
| -The array can be grown as symbols are read in (or preallocated), and | 
| -the accessor macros provided keep care of all the necessary | 
| -bookkeeping.  Because the arrays are type safe, there is no danger of | 
| -accidentally mixing up the contents.  Think of these as C++ templates, | 
| -but implemented in C. | 
| - | 
| -   Because of the different behavior of structure objects, scalar | 
| -objects and of pointers, there are three flavors of vector, one for | 
| -each of these variants.  Both the structure object and pointer variants | 
| -pass pointers to objects around -- in the former case the pointers are | 
| -stored into the vector and in the latter case the pointers are | 
| -dereferenced and the objects copied into the vector.  The scalar object | 
| -variant is suitable for `int'-like objects, and the vector elements are | 
| -returned by value. | 
| - | 
| -   There are both `index' and `iterate' accessors.  The iterator | 
| -returns a boolean iteration condition and updates the iteration | 
| -variable passed by reference.  Because the iterator will be inlined, | 
| -the address-of can be optimized away. | 
| - | 
| -   The vectors are implemented using the trailing array idiom, thus they | 
| -are not resizeable without changing the address of the vector object | 
| -itself.  This means you cannot have variables or fields of vector type | 
| --- always use a pointer to a vector.  The one exception is the final | 
| -field of a structure, which could be a vector type.  You will have to | 
| -use the `embedded_size' & `embedded_init' calls to create such objects, | 
| -and they will probably not be resizeable (so don't use the "safe" | 
| -allocation variants).  The trailing array idiom is used (rather than a | 
| -pointer to an array of data), because, if we allow `NULL' to also | 
| -represent an empty vector, empty vectors occupy minimal space in the | 
| -structure containing them. | 
| - | 
| -   Each operation that increases the number of active elements is | 
| -available in "quick" and "safe" variants.  The former presumes that | 
| -there is sufficient allocated space for the operation to succeed (it | 
| -dies if there is not).  The latter will reallocate the vector, if | 
| -needed.  Reallocation causes an exponential increase in vector size. | 
| -If you know you will be adding N elements, it would be more efficient | 
| -to use the reserve operation before adding the elements with the | 
| -"quick" operation.  This will ensure there are at least as many | 
| -elements as you ask for, it will exponentially increase if there are | 
| -too few spare slots.  If you want reserve a specific number of slots, | 
| -but do not want the exponential increase (for instance, you know this | 
| -is the last allocation), use a negative number for reservation.  You | 
| -can also create a vector of a specific size from the get go. | 
| - | 
| -   You should prefer the push and pop operations, as they append and | 
| -remove from the end of the vector.  If you need to remove several items | 
| -in one go, use the truncate operation.  The insert and remove | 
| -operations allow you to change elements in the middle of the vector. | 
| -There are two remove operations, one which preserves the element | 
| -ordering `ordered_remove', and one which does not `unordered_remove'. | 
| -The latter function copies the end element into the removed slot, | 
| -rather than invoke a memmove operation.  The `lower_bound' function | 
| -will determine where to place an item in the array using insert that | 
| -will maintain sorted order. | 
| - | 
| -   If you need to directly manipulate a vector, then the `address' | 
| -accessor will return the address of the start of the vector.  Also the | 
| -`space' predicate will tell you whether there is spare capacity in the | 
| -vector.  You will not normally need to use these two functions. | 
| - | 
| -   Vector types are defined using a `DEF_VEC_{O,P,I}(TYPENAME)' macro. | 
| -Variables of vector type are declared using a `VEC(TYPENAME)' macro. | 
| -The characters `O', `P' and `I' indicate whether TYPENAME is an object | 
| -(`O'), pointer (`P') or integral (`I') type.  Be careful to pick the | 
| -correct one, as you'll get an awkward and inefficient API if you use | 
| -the wrong one.  There is a check, which results in a compile-time | 
| -warning, for the `P' and `I' versions, but there is no check for the | 
| -`O' versions, as that is not possible in plain C. | 
| - | 
| -   An example of their use would be, | 
| - | 
| -     DEF_VEC_P(tree);   // non-managed tree vector. | 
| - | 
| -     struct my_struct { | 
| -       VEC(tree) *v;      // A (pointer to) a vector of tree pointers. | 
| -     }; | 
| - | 
| -     struct my_struct *s; | 
| - | 
| -     if (VEC_length(tree, s->v)) { we have some contents } | 
| -     VEC_safe_push(tree, s->v, decl); // append some decl onto the end | 
| -     for (ix = 0; VEC_iterate(tree, s->v, ix, elt); ix++) | 
| -       { do something with elt } | 
| - | 
| -   The `vec.h' file provides details on how to invoke the various | 
| -accessors provided.  They are enumerated here: | 
| - | 
| -`VEC_length' | 
| -     Return the number of items in the array, | 
| - | 
| -`VEC_empty' | 
| -     Return true if the array has no elements. | 
| - | 
| -`VEC_last' | 
| -`VEC_index' | 
| -     Return the last or arbitrary item in the array. | 
| - | 
| -`VEC_iterate' | 
| -     Access an array element and indicate whether the array has been | 
| -     traversed. | 
| - | 
| -`VEC_alloc' | 
| -`VEC_free' | 
| -     Create and destroy an array. | 
| - | 
| -`VEC_embedded_size' | 
| -`VEC_embedded_init' | 
| -     Helpers for embedding an array as the final element of another | 
| -     struct. | 
| - | 
| -`VEC_copy' | 
| -     Duplicate an array. | 
| - | 
| -`VEC_space' | 
| -     Return the amount of free space in an array. | 
| - | 
| -`VEC_reserve' | 
| -     Ensure a certain amount of free space. | 
| - | 
| -`VEC_quick_push' | 
| -`VEC_safe_push' | 
| -     Append to an array, either assuming the space is available, or | 
| -     making sure that it is. | 
| - | 
| -`VEC_pop' | 
| -     Remove the last item from an array. | 
| - | 
| -`VEC_truncate' | 
| -     Remove several items from the end of an array. | 
| - | 
| -`VEC_safe_grow' | 
| -     Add several items to the end of an array. | 
| - | 
| -`VEC_replace' | 
| -     Overwrite an item in the array. | 
| - | 
| -`VEC_quick_insert' | 
| -`VEC_safe_insert' | 
| -     Insert an item into the middle of the array.  Either the space must | 
| -     already exist, or the space is created. | 
| - | 
| -`VEC_ordered_remove' | 
| -`VEC_unordered_remove' | 
| -     Remove an item from the array, preserving order or not. | 
| - | 
| -`VEC_block_remove' | 
| -     Remove a set of items from the array. | 
| - | 
| -`VEC_address' | 
| -     Provide the address of the first element. | 
| - | 
| -`VEC_lower_bound' | 
| -     Binary search the array. | 
| - | 
| - | 
| -15.7 include | 
| -============ | 
| - | 
| - | 
| -File: gdbint.info,  Node: Coding Standards,  Next: Misc Guidelines,  Prev: Support Libraries,  Up: Top | 
| - | 
| -16 Coding Standards | 
| -******************* | 
| - | 
| -16.1 GDB C Coding Standards | 
| -=========================== | 
| - | 
| -GDB follows the GNU coding standards, as described in | 
| -`etc/standards.texi'.  This file is also available for anonymous FTP | 
| -from GNU archive sites.  GDB takes a strict interpretation of the | 
| -standard; in general, when the GNU standard recommends a practice but | 
| -does not require it, GDB requires it. | 
| - | 
| -   GDB follows an additional set of coding standards specific to GDB, | 
| -as described in the following sections. | 
| - | 
| -16.1.1 ISO C | 
| ------------- | 
| - | 
| -GDB assumes an ISO/IEC 9899:1990 (a.k.a. ISO C90) compliant compiler. | 
| - | 
| -   GDB does not assume an ISO C or POSIX compliant C library. | 
| - | 
| -16.1.2 Formatting | 
| ------------------ | 
| - | 
| -The standard GNU recommendations for formatting must be followed | 
| -strictly.  Any GDB-specific deviation from GNU recomendations is | 
| -described below. | 
| - | 
| -   A function declaration should not have its name in column zero.  A | 
| -function definition should have its name in column zero. | 
| - | 
| -     /* Declaration */ | 
| -     static void foo (void); | 
| -     /* Definition */ | 
| -     void | 
| -     foo (void) | 
| -     { | 
| -     } | 
| - | 
| -   _Pragmatics: This simplifies scripting.  Function definitions can be | 
| -found using `^function-name'._ | 
| - | 
| -   There must be a space between a function or macro name and the | 
| -opening parenthesis of its argument list (except for macro definitions, | 
| -as required by C).  There must not be a space after an open | 
| -paren/bracket or before a close paren/bracket. | 
| - | 
| -   While additional whitespace is generally helpful for reading, do not | 
| -use more than one blank line to separate blocks, and avoid adding | 
| -whitespace after the end of a program line (as of 1/99, some 600 lines | 
| -had whitespace after the semicolon).  Excess whitespace causes | 
| -difficulties for `diff' and `patch' utilities. | 
| - | 
| -   Pointers are declared using the traditional K&R C style: | 
| - | 
| -     void *foo; | 
| - | 
| -and not: | 
| - | 
| -     void * foo; | 
| -     void* foo; | 
| - | 
| -   In addition, whitespace around casts and unary operators should | 
| -follow the following guidelines: | 
| - | 
| -Use...         ...instead of | 
| -`!x'           `! x' | 
| -`~x'           `~ x' | 
| -`-x'           `- x'          (unary minus) | 
| -`(foo) x'      `(foo)x'       (cast) | 
| -`*x'           `* x'          (pointer dereference) | 
| - | 
| -   Any two or more lines in code should be wrapped in braces, even if | 
| -they are comments, as they look like separate statements: | 
| - | 
| -     if (i) | 
| -       { | 
| -         /* Return success.  */ | 
| -         return 0; | 
| -       } | 
| - | 
| -and not: | 
| - | 
| -     if (i) | 
| -       /* Return success.  */ | 
| -       return 0; | 
| - | 
| -16.1.3 Comments | 
| ---------------- | 
| - | 
| -The standard GNU requirements on comments must be followed strictly. | 
| - | 
| -   Block comments must appear in the following form, with no `/*'- or | 
| -`*/'-only lines, and no leading `*': | 
| - | 
| -     /* Wait for control to return from inferior to debugger.  If inferior | 
| -        gets a signal, we may decide to start it up again instead of | 
| -        returning.  That is why there is a loop in this function.  When | 
| -        this function actually returns it means the inferior should be left | 
| -        stopped and GDB should read more commands.  */ | 
| - | 
| -   (Note that this format is encouraged by Emacs; tabbing for a | 
| -multi-line comment works correctly, and `M-q' fills the block | 
| -consistently.) | 
| - | 
| -   Put a blank line between the block comments preceding function or | 
| -variable definitions, and the definition itself. | 
| - | 
| -   In general, put function-body comments on lines by themselves, rather | 
| -than trying to fit them into the 20 characters left at the end of a | 
| -line, since either the comment or the code will inevitably get longer | 
| -than will fit, and then somebody will have to move it anyhow. | 
| - | 
| -16.1.4 C Usage | 
| --------------- | 
| - | 
| -Code must not depend on the sizes of C data types, the format of the | 
| -host's floating point numbers, the alignment of anything, or the order | 
| -of evaluation of expressions. | 
| - | 
| -   Use functions freely.  There are only a handful of compute-bound | 
| -areas in GDB that might be affected by the overhead of a function call, | 
| -mainly in symbol reading.  Most of GDB's performance is limited by the | 
| -target interface (whether serial line or system call). | 
| - | 
| -   However, use functions with moderation.  A thousand one-line | 
| -functions are just as hard to understand as a single thousand-line | 
| -function. | 
| - | 
| -   _Macros are bad, M'kay._ (But if you have to use a macro, make sure | 
| -that the macro arguments are protected with parentheses.) | 
| - | 
| -   Declarations like `struct foo *' should be used in preference to | 
| -declarations like `typedef struct foo { ... } *foo_ptr'. | 
| - | 
| -16.1.5 Function Prototypes | 
| --------------------------- | 
| - | 
| -Prototypes must be used when both _declaring_ and _defining_ a | 
| -function.  Prototypes for GDB functions must include both the argument | 
| -type and name, with the name matching that used in the actual function | 
| -definition. | 
| - | 
| -   All external functions should have a declaration in a header file | 
| -that callers include, except for `_initialize_*' functions, which must | 
| -be external so that `init.c' construction works, but shouldn't be | 
| -visible to random source files. | 
| - | 
| -   Where a source file needs a forward declaration of a static function, | 
| -that declaration must appear in a block near the top of the source file. | 
| - | 
| -16.1.6 File Names | 
| ------------------ | 
| - | 
| -Any file used when building the core of GDB must be in lower case.  Any | 
| -file used when building the core of GDB must be 8.3 unique.  These | 
| -requirements apply to both source and generated files. | 
| - | 
| -   _Pragmatics: The core of GDB must be buildable on many platforms | 
| -including DJGPP and MacOS/HFS.  Every time an unfriendly file is | 
| -introduced to the build process both `Makefile.in' and `configure.in' | 
| -need to be modified accordingly.  Compare the convoluted conversion | 
| -process needed to transform `COPYING' into `copying.c' with the | 
| -conversion needed to transform `version.in' into `version.c'._ | 
| - | 
| -   Any file non 8.3 compliant file (that is not used when building the | 
| -core of GDB) must be added to `gdb/config/djgpp/fnchange.lst'. | 
| - | 
| -   _Pragmatics: This is clearly a compromise._ | 
| - | 
| -   When GDB has a local version of a system header file (ex `string.h') | 
| -the file name based on the POSIX header prefixed with `gdb_' | 
| -(`gdb_string.h').  These headers should be relatively independent: they | 
| -should use only macros defined by `configure', the compiler, or the | 
| -host; they should include only system headers; they should refer only | 
| -to system types.  They may be shared between multiple programs, e.g. | 
| -GDB and GDBSERVER. | 
| - | 
| -   For other files `-' is used as the separator. | 
| - | 
| -16.1.7 Include Files | 
| --------------------- | 
| - | 
| -A `.c' file should include `defs.h' first. | 
| - | 
| -   A `.c' file should directly include the `.h' file of every | 
| -declaration and/or definition it directly refers to.  It cannot rely on | 
| -indirect inclusion. | 
| - | 
| -   A `.h' file should directly include the `.h' file of every | 
| -declaration and/or definition it directly refers to.  It cannot rely on | 
| -indirect inclusion.  Exception: The file `defs.h' does not need to be | 
| -directly included. | 
| - | 
| -   An external declaration should only appear in one include file. | 
| - | 
| -   An external declaration should never appear in a `.c' file. | 
| -Exception: a declaration for the `_initialize' function that pacifies | 
| -`-Wmissing-declaration'. | 
| - | 
| -   A `typedef' definition should only appear in one include file. | 
| - | 
| -   An opaque `struct' declaration can appear in multiple `.h' files. | 
| -Where possible, a `.h' file should use an opaque `struct' declaration | 
| -instead of an include. | 
| - | 
| -   All `.h' files should be wrapped in: | 
| - | 
| -     #ifndef INCLUDE_FILE_NAME_H | 
| -     #define INCLUDE_FILE_NAME_H | 
| -     header body | 
| -     #endif | 
| - | 
| -16.2 GDB Python Coding Standards | 
| -================================ | 
| - | 
| -GDB follows the published `Python' coding standards in `PEP008' | 
| -(http://www.python.org/dev/peps/pep-0008/). | 
| - | 
| -   In addition, the guidelines in the Google Python Style Guide | 
| -(http://google-styleguide.googlecode.com/svn/trunk/pyguide.html) are | 
| -also followed where they do not conflict with `PEP008'. | 
| - | 
| -16.2.1 GDB-specific exceptions | 
| ------------------------------- | 
| - | 
| -There are a few exceptions to the published standards.  They exist | 
| -mainly for consistency with the `C' standards. | 
| - | 
| -   * Use `FIXME' instead of `TODO'. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Misc Guidelines,  Next: Porting GDB,  Prev: Coding Standards,  Up: Top | 
| - | 
| -17 Misc Guidelines | 
| -****************** | 
| - | 
| -This chapter covers topics that are lower-level than the major | 
| -algorithms of GDB. | 
| - | 
| -17.1 Cleanups | 
| -============= | 
| - | 
| -Cleanups are a structured way to deal with things that need to be done | 
| -later. | 
| - | 
| -   When your code does something (e.g., `xmalloc' some memory, or | 
| -`open' a file) that needs to be undone later (e.g., `xfree' the memory | 
| -or `close' the file), it can make a cleanup.  The cleanup will be done | 
| -at some future point: when the command is finished and control returns | 
| -to the top level; when an error occurs and the stack is unwound; or | 
| -when your code decides it's time to explicitly perform cleanups. | 
| -Alternatively you can elect to discard the cleanups you created. | 
| - | 
| -   Syntax: | 
| - | 
| -`struct cleanup *OLD_CHAIN;' | 
| -     Declare a variable which will hold a cleanup chain handle. | 
| - | 
| -`OLD_CHAIN = make_cleanup (FUNCTION, ARG);' | 
| -     Make a cleanup which will cause FUNCTION to be called with ARG (a | 
| -     `char *') later.  The result, OLD_CHAIN, is a handle that can | 
| -     later be passed to `do_cleanups' or `discard_cleanups'.  Unless | 
| -     you are going to call `do_cleanups' or `discard_cleanups', you can | 
| -     ignore the result from `make_cleanup'. | 
| - | 
| -`do_cleanups (OLD_CHAIN);' | 
| -     Do all cleanups added to the chain since the corresponding | 
| -     `make_cleanup' call was made. | 
| - | 
| -`discard_cleanups (OLD_CHAIN);' | 
| -     Same as `do_cleanups' except that it just removes the cleanups from | 
| -     the chain and does not call the specified functions. | 
| - | 
| -   Cleanups are implemented as a chain.  The handle returned by | 
| -`make_cleanups' includes the cleanup passed to the call and any later | 
| -cleanups appended to the chain (but not yet discarded or performed). | 
| -E.g.: | 
| - | 
| -     make_cleanup (a, 0); | 
| -     { | 
| -       struct cleanup *old = make_cleanup (b, 0); | 
| -       make_cleanup (c, 0) | 
| -       ... | 
| -       do_cleanups (old); | 
| -     } | 
| - | 
| -will call `c()' and `b()' but will not call `a()'.  The cleanup that | 
| -calls `a()' will remain in the cleanup chain, and will be done later | 
| -unless otherwise discarded. | 
| - | 
| -   Your function should explicitly do or discard the cleanups it | 
| -creates.  Failing to do this leads to non-deterministic behavior since | 
| -the caller will arbitrarily do or discard your functions cleanups. | 
| -This need leads to two common cleanup styles. | 
| - | 
| -   The first style is try/finally.  Before it exits, your code-block | 
| -calls `do_cleanups' with the old cleanup chain and thus ensures that | 
| -your code-block's cleanups are always performed.  For instance, the | 
| -following code-segment avoids a memory leak problem (even when `error' | 
| -is called and a forced stack unwind occurs) by ensuring that the | 
| -`xfree' will always be called: | 
| - | 
| -     struct cleanup *old = make_cleanup (null_cleanup, 0); | 
| -     data = xmalloc (sizeof blah); | 
| -     make_cleanup (xfree, data); | 
| -     ... blah blah ... | 
| -     do_cleanups (old); | 
| - | 
| -   The second style is try/except.  Before it exits, your code-block | 
| -calls `discard_cleanups' with the old cleanup chain and thus ensures | 
| -that any created cleanups are not performed.  For instance, the | 
| -following code segment, ensures that the file will be closed but only | 
| -if there is an error: | 
| - | 
| -     FILE *file = fopen ("afile", "r"); | 
| -     struct cleanup *old = make_cleanup (close_file, file); | 
| -     ... blah blah ... | 
| -     discard_cleanups (old); | 
| -     return file; | 
| - | 
| -   Some functions, e.g., `fputs_filtered()' or `error()', specify that | 
| -they "should not be called when cleanups are not in place".  This means | 
| -that any actions you need to reverse in the case of an error or | 
| -interruption must be on the cleanup chain before you call these | 
| -functions, since they might never return to your code (they `longjmp' | 
| -instead). | 
| - | 
| -17.2 Per-architecture module data | 
| -================================= | 
| - | 
| -The multi-arch framework includes a mechanism for adding module | 
| -specific per-architecture data-pointers to the `struct gdbarch' | 
| -architecture object. | 
| - | 
| -   A module registers one or more per-architecture data-pointers using: | 
| - | 
| - -- Architecture Function: struct gdbarch_data * | 
| -gdbarch_data_register_pre_init (gdbarch_data_pre_init_ftype *PRE_INIT) | 
| -     PRE_INIT is used to, on-demand, allocate an initial value for a | 
| -     per-architecture data-pointer using the architecture's obstack | 
| -     (passed in as a parameter).  Since PRE_INIT can be called during | 
| -     architecture creation, it is not parameterized with the | 
| -     architecture.  and must not call modules that use per-architecture | 
| -     data. | 
| - | 
| - -- Architecture Function: struct gdbarch_data * | 
| -gdbarch_data_register_post_init (gdbarch_data_post_init_ftype | 
| -          *POST_INIT) | 
| -     POST_INIT is used to obtain an initial value for a | 
| -     per-architecture data-pointer _after_.  Since POST_INIT is always | 
| -     called after architecture creation, it both receives the fully | 
| -     initialized architecture and is free to call modules that use | 
| -     per-architecture data (care needs to be taken to ensure that those | 
| -     other modules do not try to call back to this module as that will | 
| -     create in cycles in the initialization call graph). | 
| - | 
| -   These functions return a `struct gdbarch_data' that is used to | 
| -identify the per-architecture data-pointer added for that module. | 
| - | 
| -   The per-architecture data-pointer is accessed using the function: | 
| - | 
| - -- Architecture Function: void * gdbarch_data (struct gdbarch | 
| -          *GDBARCH, struct gdbarch_data *DATA_HANDLE) | 
| -     Given the architecture ARCH and module data handle DATA_HANDLE | 
| -     (returned by `gdbarch_data_register_pre_init' or | 
| -     `gdbarch_data_register_post_init'), this function returns the | 
| -     current value of the per-architecture data-pointer.  If the data | 
| -     pointer is `NULL', it is first initialized by calling the | 
| -     corresponding PRE_INIT or POST_INIT method. | 
| - | 
| -   The examples below assume the following definitions: | 
| - | 
| -     struct nozel { int total; }; | 
| -     static struct gdbarch_data *nozel_handle; | 
| - | 
| -   A module can extend the architecture vector, adding additional | 
| -per-architecture data, using the PRE_INIT method.  The module's | 
| -per-architecture data is then initialized during architecture creation. | 
| - | 
| -   In the below, the module's per-architecture _nozel_ is added.  An | 
| -architecture can specify its nozel by calling `set_gdbarch_nozel' from | 
| -`gdbarch_init'. | 
| - | 
| -     static void * | 
| -     nozel_pre_init (struct obstack *obstack) | 
| -     { | 
| -       struct nozel *data = OBSTACK_ZALLOC (obstack, struct nozel); | 
| -       return data; | 
| -     } | 
| - | 
| -     extern void | 
| -     set_gdbarch_nozel (struct gdbarch *gdbarch, int total) | 
| -     { | 
| -       struct nozel *data = gdbarch_data (gdbarch, nozel_handle); | 
| -       data->total = nozel; | 
| -     } | 
| - | 
| -   A module can on-demand create architecture dependent data structures | 
| -using `post_init'. | 
| - | 
| -   In the below, the nozel's total is computed on-demand by | 
| -`nozel_post_init' using information obtained from the architecture. | 
| - | 
| -     static void * | 
| -     nozel_post_init (struct gdbarch *gdbarch) | 
| -     { | 
| -       struct nozel *data = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct nozel); | 
| -       nozel->total = gdbarch... (gdbarch); | 
| -       return data; | 
| -     } | 
| - | 
| -     extern int | 
| -     nozel_total (struct gdbarch *gdbarch) | 
| -     { | 
| -       struct nozel *data = gdbarch_data (gdbarch, nozel_handle); | 
| -       return data->total; | 
| -     } | 
| - | 
| -17.3 Wrapping Output Lines | 
| -========================== | 
| - | 
| -Output that goes through `printf_filtered' or `fputs_filtered' or | 
| -`fputs_demangled' needs only to have calls to `wrap_here' added in | 
| -places that would be good breaking points.  The utility routines will | 
| -take care of actually wrapping if the line width is exceeded. | 
| - | 
| -   The argument to `wrap_here' is an indentation string which is | 
| -printed _only_ if the line breaks there.  This argument is saved away | 
| -and used later.  It must remain valid until the next call to | 
| -`wrap_here' or until a newline has been printed through the | 
| -`*_filtered' functions.  Don't pass in a local variable and then return! | 
| - | 
| -   It is usually best to call `wrap_here' after printing a comma or | 
| -space.  If you call it before printing a space, make sure that your | 
| -indentation properly accounts for the leading space that will print if | 
| -the line wraps there. | 
| - | 
| -   Any function or set of functions that produce filtered output must | 
| -finish by printing a newline, to flush the wrap buffer, before switching | 
| -to unfiltered (`printf') output.  Symbol reading routines that print | 
| -warnings are a good example. | 
| - | 
| -17.4 Memory Management | 
| -====================== | 
| - | 
| -GDB does not use the functions `malloc', `realloc', `calloc', `free' | 
| -and `asprintf'. | 
| - | 
| -   GDB uses the functions `xmalloc', `xrealloc' and `xcalloc' when | 
| -allocating memory.  Unlike `malloc' et.al.  these functions do not | 
| -return when the memory pool is empty.  Instead, they unwind the stack | 
| -using cleanups.  These functions return `NULL' when requested to | 
| -allocate a chunk of memory of size zero. | 
| - | 
| -   _Pragmatics: By using these functions, the need to check every | 
| -memory allocation is removed.  These functions provide portable | 
| -behavior._ | 
| - | 
| -   GDB does not use the function `free'. | 
| - | 
| -   GDB uses the function `xfree' to return memory to the memory pool. | 
| -Consistent with ISO-C, this function ignores a request to free a `NULL' | 
| -pointer. | 
| - | 
| -   _Pragmatics: On some systems `free' fails when passed a `NULL' | 
| -pointer._ | 
| - | 
| -   GDB can use the non-portable function `alloca' for the allocation of | 
| -small temporary values (such as strings). | 
| - | 
| -   _Pragmatics: This function is very non-portable.  Some systems | 
| -restrict the memory being allocated to no more than a few kilobytes._ | 
| - | 
| -   GDB uses the string function `xstrdup' and the print function | 
| -`xstrprintf'. | 
| - | 
| -   _Pragmatics: `asprintf' and `strdup' can fail.  Print functions such | 
| -as `sprintf' are very prone to buffer overflow errors._ | 
| - | 
| -17.5 Compiler Warnings | 
| -====================== | 
| - | 
| -With few exceptions, developers should avoid the configuration option | 
| -`--disable-werror' when building GDB.  The exceptions are listed in the | 
| -file `gdb/MAINTAINERS'.  The default, when building with GCC, is | 
| -`--enable-werror'. | 
| - | 
| -   This option causes GDB (when built using GCC) to be compiled with a | 
| -carefully selected list of compiler warning flags.  Any warnings from | 
| -those flags are treated as errors. | 
| - | 
| -   The current list of warning flags includes: | 
| - | 
| -`-Wall' | 
| -     Recommended GCC warnings. | 
| - | 
| -`-Wdeclaration-after-statement' | 
| -     GCC 3.x (and later) and C99 allow declarations mixed with code, | 
| -     but GCC 2.x and C89 do not. | 
| - | 
| -`-Wpointer-arith' | 
| - | 
| -`-Wformat-nonliteral' | 
| -     Non-literal format strings, with a few exceptions, are bugs - they | 
| -     might contain unintended user-supplied format specifiers.  Since | 
| -     GDB uses the `format printf' attribute on all `printf' like | 
| -     functions this checks not just `printf' calls but also calls to | 
| -     functions such as `fprintf_unfiltered'. | 
| - | 
| -`-Wno-pointer-sign' | 
| -     In version 4.0, GCC began warning about pointer argument passing or | 
| -     assignment even when the source and destination differed only in | 
| -     signedness.  However, most GDB code doesn't distinguish carefully | 
| -     between `char' and `unsigned char'.  In early 2006 the GDB | 
| -     developers decided correcting these warnings wasn't worth the time | 
| -     it would take. | 
| - | 
| -`-Wno-unused-parameter' | 
| -     Due to the way that GDB is implemented many functions have unused | 
| -     parameters.  Consequently this warning is avoided.  The macro | 
| -     `ATTRIBUTE_UNUSED' is not used as it leads to false negatives -- | 
| -     it is not an error to have `ATTRIBUTE_UNUSED' on a parameter that | 
| -     is being used. | 
| - | 
| -`-Wno-unused' | 
| -`-Wno-switch' | 
| -`-Wno-char-subscripts' | 
| -     These are warnings which might be useful for GDB, but are | 
| -     currently too noisy to enable with `-Werror'. | 
| - | 
| - | 
| -17.6 Internal Error Recovery | 
| -============================ | 
| - | 
| -During its execution, GDB can encounter two types of errors.  User | 
| -errors and internal errors.  User errors include not only a user | 
| -entering an incorrect command but also problems arising from corrupt | 
| -object files and system errors when interacting with the target. | 
| -Internal errors include situations where GDB has detected, at run time, | 
| -a corrupt or erroneous situation. | 
| - | 
| -   When reporting an internal error, GDB uses `internal_error' and | 
| -`gdb_assert'. | 
| - | 
| -   GDB must not call `abort' or `assert'. | 
| - | 
| -   _Pragmatics: There is no `internal_warning' function.  Either the | 
| -code detected a user error, recovered from it and issued a `warning' or | 
| -the code failed to correctly recover from the user error and issued an | 
| -`internal_error'._ | 
| - | 
| -17.7 Command Names | 
| -================== | 
| - | 
| -GDB U/I commands are written `foo-bar', not `foo_bar'. | 
| - | 
| -17.8 Clean Design and Portable Implementation | 
| -============================================= | 
| - | 
| -In addition to getting the syntax right, there's the little question of | 
| -semantics.  Some things are done in certain ways in GDB because long | 
| -experience has shown that the more obvious ways caused various kinds of | 
| -trouble. | 
| - | 
| -   You can't assume the byte order of anything that comes from a target | 
| -(including VALUEs, object files, and instructions).  Such things must | 
| -be byte-swapped using `SWAP_TARGET_AND_HOST' in GDB, or one of the swap | 
| -routines defined in `bfd.h', such as `bfd_get_32'. | 
| - | 
| -   You can't assume that you know what interface is being used to talk | 
| -to the target system.  All references to the target must go through the | 
| -current `target_ops' vector. | 
| - | 
| -   You can't assume that the host and target machines are the same | 
| -machine (except in the "native" support modules).  In particular, you | 
| -can't assume that the target machine's header files will be available | 
| -on the host machine.  Target code must bring along its own header files | 
| -- written from scratch or explicitly donated by their owner, to avoid | 
| -copyright problems. | 
| - | 
| -   Insertion of new `#ifdef''s will be frowned upon.  It's much better | 
| -to write the code portably than to conditionalize it for various | 
| -systems. | 
| - | 
| -   New `#ifdef''s which test for specific compilers or manufacturers or | 
| -operating systems are unacceptable.  All `#ifdef''s should test for | 
| -features.  The information about which configurations contain which | 
| -features should be segregated into the configuration files.  Experience | 
| -has proven far too often that a feature unique to one particular system | 
| -often creeps into other systems; and that a conditional based on some | 
| -predefined macro for your current system will become worthless over | 
| -time, as new versions of your system come out that behave differently | 
| -with regard to this feature. | 
| - | 
| -   Adding code that handles specific architectures, operating systems, | 
| -target interfaces, or hosts, is not acceptable in generic code. | 
| - | 
| -   One particularly notorious area where system dependencies tend to | 
| -creep in is handling of file names.  The mainline GDB code assumes | 
| -Posix semantics of file names: absolute file names begin with a forward | 
| -slash `/', slashes are used to separate leading directories, | 
| -case-sensitive file names.  These assumptions are not necessarily true | 
| -on non-Posix systems such as MS-Windows.  To avoid system-dependent | 
| -code where you need to take apart or construct a file name, use the | 
| -following portable macros: | 
| - | 
| -`HAVE_DOS_BASED_FILE_SYSTEM' | 
| -     This preprocessing symbol is defined to a non-zero value on hosts | 
| -     whose filesystems belong to the MS-DOS/MS-Windows family.  Use this | 
| -     symbol to write conditional code which should only be compiled for | 
| -     such hosts. | 
| - | 
| -`IS_DIR_SEPARATOR (C)' | 
| -     Evaluates to a non-zero value if C is a directory separator | 
| -     character.  On Unix and GNU/Linux systems, only a slash `/' is | 
| -     such a character, but on Windows, both `/' and `\' will pass. | 
| - | 
| -`IS_ABSOLUTE_PATH (FILE)' | 
| -     Evaluates to a non-zero value if FILE is an absolute file name. | 
| -     For Unix and GNU/Linux hosts, a name which begins with a slash `/' | 
| -     is absolute.  On DOS and Windows, `d:/foo' and `x:\bar' are also | 
| -     absolute file names. | 
| - | 
| -`FILENAME_CMP (F1, F2)' | 
| -     Calls a function which compares file names F1 and F2 as | 
| -     appropriate for the underlying host filesystem.  For Posix systems, | 
| -     this simply calls `strcmp'; on case-insensitive filesystems it | 
| -     will call `strcasecmp' instead. | 
| - | 
| -`DIRNAME_SEPARATOR' | 
| -     Evaluates to a character which separates directories in | 
| -     `PATH'-style lists, typically held in environment variables.  This | 
| -     character is `:' on Unix, `;' on DOS and Windows. | 
| - | 
| -`SLASH_STRING' | 
| -     This evaluates to a constant string you should use to produce an | 
| -     absolute filename from leading directories and the file's basename. | 
| -     `SLASH_STRING' is `"/"' on most systems, but might be `"\\"' for | 
| -     some Windows-based ports. | 
| - | 
| -   In addition to using these macros, be sure to use portable library | 
| -functions whenever possible.  For example, to extract a directory or a | 
| -basename part from a file name, use the `dirname' and `basename' | 
| -library functions (available in `libiberty' for platforms which don't | 
| -provide them), instead of searching for a slash with `strrchr'. | 
| - | 
| -   Another way to generalize GDB along a particular interface is with an | 
| -attribute struct.  For example, GDB has been generalized to handle | 
| -multiple kinds of remote interfaces--not by `#ifdef's everywhere, but | 
| -by defining the `target_ops' structure and having a current target (as | 
| -well as a stack of targets below it, for memory references).  Whenever | 
| -something needs to be done that depends on which remote interface we are | 
| -using, a flag in the current target_ops structure is tested (e.g., | 
| -`target_has_stack'), or a function is called through a pointer in the | 
| -current target_ops structure.  In this way, when a new remote interface | 
| -is added, only one module needs to be touched--the one that actually | 
| -implements the new remote interface.  Other examples of | 
| -attribute-structs are BFD access to multiple kinds of object file | 
| -formats, or GDB's access to multiple source languages. | 
| - | 
| -   Please avoid duplicating code.  For example, in GDB 3.x all the code | 
| -interfacing between `ptrace' and the rest of GDB was duplicated in | 
| -`*-dep.c', and so changing something was very painful.  In GDB 4.x, | 
| -these have all been consolidated into `infptrace.c'.  `infptrace.c' can | 
| -deal with variations between systems the same way any system-independent | 
| -file would (hooks, `#if defined', etc.), and machines which are | 
| -radically different don't need to use `infptrace.c' at all. | 
| - | 
| -   All debugging code must be controllable using the `set debug MODULE' | 
| -command.  Do not use `printf' to print trace messages.  Use | 
| -`fprintf_unfiltered(gdb_stdlog, ...'.  Do not use `#ifdef DEBUG'. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Porting GDB,  Next: Versions and Branches,  Prev: Misc Guidelines,  Up: Top | 
| - | 
| -18 Porting GDB | 
| -************** | 
| - | 
| -Most of the work in making GDB compile on a new machine is in | 
| -specifying the configuration of the machine.  Porting a new | 
| -architecture to GDB can be broken into a number of steps. | 
| - | 
| -   * Ensure a BFD exists for executables of the target architecture in | 
| -     the `bfd' directory.  If one does not exist, create one by | 
| -     modifying an existing similar one. | 
| - | 
| -   * Implement a disassembler for the target architecture in the | 
| -     `opcodes' directory. | 
| - | 
| -   * Define the target architecture in the `gdb' directory (*note | 
| -     Adding a New Target: Adding a New Target.).  Add the pattern for | 
| -     the new target to `configure.tgt' with the names of the files that | 
| -     contain the code.  By convention the target architecture | 
| -     definition for an architecture ARCH is placed in `ARCH-tdep.c'. | 
| - | 
| -     Within `ARCH-tdep.c' define the function `_initialize_ARCH_tdep' | 
| -     which calls `gdbarch_register' to create the new `struct gdbarch' | 
| -     for the architecture. | 
| - | 
| -   * If a new remote target is needed, consider adding a new remote | 
| -     target by defining a function `_initialize_remote_ARCH'.  However | 
| -     if at all possible use the GDB _Remote Serial Protocol_ for this | 
| -     and implement the server side protocol independently with the | 
| -     target. | 
| - | 
| -   * If desired implement a simulator in the `sim' directory.  This | 
| -     should create the library `libsim.a' implementing the interface in | 
| -     `remote-sim.h' (found in the `include' directory). | 
| - | 
| -   * Build and test.  If desired, lobby the GDB steering group to have | 
| -     the new port included in the main distribution! | 
| - | 
| -   * Add a description of the new architecture to the main GDB user | 
| -     guide (*note Configuration Specific Information: | 
| -     (gdb)Configuration Specific Information.). | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Versions and Branches,  Next: Start of New Year Procedure,  Prev: Porting GDB,  Up: Top | 
| - | 
| -19 Versions and Branches | 
| -************************ | 
| - | 
| -19.1 Versions | 
| -============= | 
| - | 
| -GDB's version is determined by the file `gdb/version.in' and takes one | 
| -of the following forms: | 
| - | 
| -MAJOR.MINOR | 
| -MAJOR.MINOR.PATCHLEVEL | 
| -     an official release (e.g., 6.2 or 6.2.1) | 
| - | 
| -MAJOR.MINOR.PATCHLEVEL.YYYYMMDD | 
| -     a snapshot taken at YYYY-MM-DD-gmt (e.g., 6.1.50.20020302, | 
| -     6.1.90.20020304, or 6.1.0.20020308) | 
| - | 
| -MAJOR.MINOR.PATCHLEVEL.YYYYMMDD-cvs | 
| -     a CVS check out drawn on YYYY-MM-DD (e.g., 6.1.50.20020302-cvs, | 
| -     6.1.90.20020304-cvs, or 6.1.0.20020308-cvs) | 
| - | 
| -MAJOR.MINOR.PATCHLEVEL.YYYYMMDD (VENDOR) | 
| -     a vendor specific release of GDB, that while based on | 
| -     MAJOR.MINOR.PATCHLEVEL.YYYYMMDD, may include additional changes | 
| - | 
| -   GDB's mainline uses the MAJOR and MINOR version numbers from the | 
| -most recent release branch, with a PATCHLEVEL of 50.  At the time each | 
| -new release branch is created, the mainline's MAJOR and MINOR version | 
| -numbers are updated. | 
| - | 
| -   GDB's release branch is similar.  When the branch is cut, the | 
| -PATCHLEVEL is changed from 50 to 90.  As draft releases are drawn from | 
| -the branch, the PATCHLEVEL is incremented.  Once the first release | 
| -(MAJOR.MINOR) has been made, the PATCHLEVEL is set to 0 and updates | 
| -have an incremented PATCHLEVEL. | 
| - | 
| -   For snapshots, and CVS check outs, it is also possible to identify | 
| -the CVS origin: | 
| - | 
| -MAJOR.MINOR.50.YYYYMMDD | 
| -     drawn from the HEAD of mainline CVS (e.g., 6.1.50.20020302) | 
| - | 
| -MAJOR.MINOR.90.YYYYMMDD | 
| -MAJOR.MINOR.91.YYYYMMDD ... | 
| -     drawn from a release branch prior to the release (e.g., | 
| -     6.1.90.20020304) | 
| - | 
| -MAJOR.MINOR.0.YYYYMMDD | 
| -MAJOR.MINOR.1.YYYYMMDD ... | 
| -     drawn from a release branch after the release (e.g., | 
| -     6.2.0.20020308) | 
| - | 
| -   If the previous GDB version is 6.1 and the current version is 6.2, | 
| -then, substituting 6 for MAJOR and 1 or 2 for MINOR, here's an | 
| -illustration of a typical sequence: | 
| - | 
| -          <HEAD> | 
| -             | | 
| -     6.1.50.20020302-cvs | 
| -             | | 
| -             +--------------------------. | 
| -             |                    <gdb_6_2-branch> | 
| -             |                          | | 
| -     6.2.50.20020303-cvs        6.1.90 (draft #1) | 
| -             |                          | | 
| -     6.2.50.20020304-cvs        6.1.90.20020304-cvs | 
| -             |                          | | 
| -     6.2.50.20020305-cvs        6.1.91 (draft #2) | 
| -             |                          | | 
| -     6.2.50.20020306-cvs        6.1.91.20020306-cvs | 
| -             |                          | | 
| -     6.2.50.20020307-cvs        6.2 (release) | 
| -             |                          | | 
| -     6.2.50.20020308-cvs        6.2.0.20020308-cvs | 
| -             |                          | | 
| -     6.2.50.20020309-cvs        6.2.1 (update) | 
| -             |                          | | 
| -     6.2.50.20020310-cvs         <branch closed> | 
| -             | | 
| -     6.2.50.20020311-cvs | 
| -             | | 
| -             +--------------------------. | 
| -             |                     <gdb_6_3-branch> | 
| -             |                          | | 
| -     6.3.50.20020312-cvs        6.2.90 (draft #1) | 
| -             |                          | | 
| - | 
| -19.2 Release Branches | 
| -===================== | 
| - | 
| -GDB draws a release series (6.2, 6.2.1, ...) from a single release | 
| -branch, and identifies that branch using the CVS branch tags: | 
| - | 
| -     gdb_MAJOR_MINOR-YYYYMMDD-branchpoint | 
| -     gdb_MAJOR_MINOR-branch | 
| -     gdb_MAJOR_MINOR-YYYYMMDD-release | 
| - | 
| -   _Pragmatics: To help identify the date at which a branch or release | 
| -is made, both the branchpoint and release tags include the date that | 
| -they are cut (YYYYMMDD) in the tag.  The branch tag, denoting the head | 
| -of the branch, does not need this._ | 
| - | 
| -19.3 Vendor Branches | 
| -==================== | 
| - | 
| -To avoid version conflicts, vendors are expected to modify the file | 
| -`gdb/version.in' to include a vendor unique alphabetic identifier (an | 
| -official GDB release never uses alphabetic characters in its version | 
| -identifier).  E.g., `6.2widgit2', or `6.2 (Widgit Inc Patch 2)'. | 
| - | 
| -19.4 Experimental Branches | 
| -========================== | 
| - | 
| -19.4.1 Guidelines | 
| ------------------ | 
| - | 
| -GDB permits the creation of branches, cut from the CVS repository, for | 
| -experimental development.  Branches make it possible for developers to | 
| -share preliminary work, and maintainers to examine significant new | 
| -developments. | 
| - | 
| -   The following are a set of guidelines for creating such branches: | 
| - | 
| -_a branch has an owner_ | 
| -     The owner can set further policy for a branch, but may not change | 
| -     the ground rules.  In particular, they can set a policy for | 
| -     commits (be it adding more reviewers or deciding who can commit). | 
| - | 
| -_all commits are posted_ | 
| -     All changes committed to a branch shall also be posted to the GDB | 
| -     patches mailing list <gdb-patches@sourceware.org>.  While | 
| -     commentary on such changes are encouraged, people should remember | 
| -     that the changes only apply to a branch. | 
| - | 
| -_all commits are covered by an assignment_ | 
| -     This ensures that all changes belong to the Free Software | 
| -     Foundation, and avoids the possibility that the branch may become | 
| -     contaminated. | 
| - | 
| -_a branch is focused_ | 
| -     A focused branch has a single objective or goal, and does not | 
| -     contain unnecessary or irrelevant changes.  Cleanups, where | 
| -     identified, being be pushed into the mainline as soon as possible. | 
| - | 
| -_a branch tracks mainline_ | 
| -     This keeps the level of divergence under control.  It also keeps | 
| -     the pressure on developers to push cleanups and other stuff into | 
| -     the mainline. | 
| - | 
| -_a branch shall contain the entire GDB module_ | 
| -     The GDB module `gdb' should be specified when creating a branch | 
| -     (branches of individual files should be avoided).  *Note Tags::. | 
| - | 
| -_a branch shall be branded using `version.in'_ | 
| -     The file `gdb/version.in' shall be modified so that it identifies | 
| -     the branch OWNER and branch NAME, e.g., | 
| -     `6.2.50.20030303_owner_name' or `6.2 (Owner Name)'. | 
| - | 
| - | 
| -19.4.2 Tags | 
| ------------ | 
| - | 
| -To simplify the identification of GDB branches, the following branch | 
| -tagging convention is strongly recommended: | 
| - | 
| -`OWNER_NAME-YYYYMMDD-branchpoint' | 
| -`OWNER_NAME-YYYYMMDD-branch' | 
| -     The branch point and corresponding branch tag.  YYYYMMDD is the | 
| -     date that the branch was created.  A branch is created using the | 
| -     sequence: | 
| -          cvs rtag OWNER_NAME-YYYYMMDD-branchpoint gdb | 
| -          cvs rtag -b -r OWNER_NAME-YYYYMMDD-branchpoint \ | 
| -             OWNER_NAME-YYYYMMDD-branch gdb | 
| - | 
| -`OWNER_NAME-YYYYMMDD-mergepoint' | 
| -     The tagged point, on the mainline, that was used when merging the | 
| -     branch on YYYYMMDD.  To merge in all changes since the branch was | 
| -     cut, use a command sequence like: | 
| -          cvs rtag OWNER_NAME-YYYYMMDD-mergepoint gdb | 
| -          cvs update \ | 
| -             -jOWNER_NAME-YYYYMMDD-branchpoint | 
| -             -jOWNER_NAME-YYYYMMDD-mergepoint | 
| -     Similar sequences can be used to just merge in changes since the | 
| -     last merge. | 
| - | 
| - | 
| -For further information on CVS, see Concurrent Versions System | 
| -(http://www.gnu.org/software/cvs/). | 
| - | 
| - | 
| -File: gdbint.info,  Node: Start of New Year Procedure,  Next: Releasing GDB,  Prev: Versions and Branches,  Up: Top | 
| - | 
| -20 Start of New Year Procedure | 
| -****************************** | 
| - | 
| -At the start of each new year, the following actions should be | 
| -performed: | 
| - | 
| -   * Rotate the ChangeLog file | 
| - | 
| -     The current `ChangeLog' file should be renamed into | 
| -     `ChangeLog-YYYY' where YYYY is the year that has just passed.  A | 
| -     new `ChangeLog' file should be created, and its contents should | 
| -     contain a reference to the previous ChangeLog.  The following | 
| -     should also be preserved at the end of the new ChangeLog, in order | 
| -     to provide the appropriate settings when editing this file with | 
| -     Emacs: | 
| -          Local Variables: | 
| -          mode: change-log | 
| -          left-margin: 8 | 
| -          fill-column: 74 | 
| -          version-control: never | 
| -          coding: utf-8 | 
| -          End: | 
| - | 
| -   * Add an entry for the newly created ChangeLog file | 
| -     (`ChangeLog-YYYY') in `gdb/config/djgpp/fnchange.lst'. | 
| - | 
| -   * Update the copyright year in the startup message | 
| - | 
| -     Update the copyright year in: | 
| -        *   file `top.c', function `print_gdb_version' | 
| - | 
| -        *   file `gdbserver/server.c', function `gdbserver_version' | 
| - | 
| -        *   file `gdbserver/gdbreplay.c', function `gdbreplay_version' | 
| - | 
| -   * Run the `copyright.py' Python script to add the new year in the | 
| -     copyright notices of most source files.  This script has been | 
| -     tested with Python 2.6 and 2.7. | 
| - | 
| - | 
| - | 
| -File: gdbint.info,  Node: Releasing GDB,  Next: Testsuite,  Prev: Start of New Year Procedure,  Up: Top | 
| - | 
| -21 Releasing GDB | 
| -**************** | 
| - | 
| -21.1 Branch Commit Policy | 
| -========================= | 
| - | 
| -The branch commit policy is pretty slack.  GDB releases 5.0, 5.1 and | 
| -5.2 all used the below: | 
| - | 
| -   * The `gdb/MAINTAINERS' file still holds. | 
| - | 
| -   * Don't fix something on the branch unless/until it is also fixed in | 
| -     the trunk.  If this isn't possible, mentioning it in the | 
| -     `gdb/PROBLEMS' file is better than committing a hack. | 
| - | 
| -   * When considering a patch for the branch, suggested criteria | 
| -     include: Does it fix a build?  Does it fix the sequence `break | 
| -     main; run' when debugging a static binary? | 
| - | 
| -   * The further a change is from the core of GDB, the less likely the | 
| -     change will worry anyone (e.g., target specific code). | 
| - | 
| -   * Only post a proposal to change the core of GDB after you've sent | 
| -     individual bribes to all the people listed in the `MAINTAINERS' | 
| -     file ;-) | 
| - | 
| -   _Pragmatics: Provided updates are restricted to non-core | 
| -functionality there is little chance that a broken change will be fatal. | 
| -This means that changes such as adding a new architectures or (within | 
| -reason) support for a new host are considered acceptable._ | 
| - | 
| -21.2 Obsoleting code | 
| -==================== | 
| - | 
| -Before anything else, poke the other developers (and around the source | 
| -code) to see if there is anything that can be removed from GDB (an old | 
| -target, an unused file). | 
| - | 
| -   Obsolete code is identified by adding an `OBSOLETE' prefix to every | 
| -line.  Doing this means that it is easy to identify something that has | 
| -been obsoleted when greping through the sources. | 
| - | 
| -   The process is done in stages -- this is mainly to ensure that the | 
| -wider GDB community has a reasonable opportunity to respond.  Remember, | 
| -everything on the Internet takes a week. | 
| - | 
| -  1. Post the proposal on the GDB mailing list <gdb@sourceware.org> | 
| -     Creating a bug report to track the task's state, is also highly | 
| -     recommended. | 
| - | 
| -  2. Wait a week or so. | 
| - | 
| -  3. Post the proposal on the GDB Announcement mailing list | 
| -     <gdb-announce@sourceware.org>. | 
| - | 
| -  4. Wait a week or so. | 
| - | 
| -  5. Go through and edit all relevant files and lines so that they are | 
| -     prefixed with the word `OBSOLETE'. | 
| - | 
| -  6. Wait until the next GDB version, containing this obsolete code, | 
| -     has been released. | 
| - | 
| -  7. Remove the obsolete code. | 
| - | 
| -_Maintainer note: While removing old code is regrettable it is | 
| -hopefully better for GDB's long term development.  Firstly it helps the | 
| -developers by removing code that is either no longer relevant or simply | 
| -wrong.  Secondly since it removes any history associated with the file | 
| -(effectively clearing the slate) the developer has a much freer hand | 
| -when it comes to fixing broken files._ | 
| - | 
| -21.3 Before the Branch | 
| -====================== | 
| - | 
| -The most important objective at this stage is to find and fix simple | 
| -changes that become a pain to track once the branch is created.  For | 
| -instance, configuration problems that stop GDB from even building.  If | 
| -you can't get the problem fixed, document it in the `gdb/PROBLEMS' file. | 
| - | 
| -Prompt for `gdb/NEWS' | 
| ---------------------- | 
| - | 
| -People always forget.  Send a post reminding them but also if you know | 
| -something interesting happened add it yourself.  The `schedule' script | 
| -will mention this in its e-mail. | 
| - | 
| -Review `gdb/README' | 
| -------------------- | 
| - | 
| -Grab one of the nightly snapshots and then walk through the | 
| -`gdb/README' looking for anything that can be improved.  The `schedule' | 
| -script will mention this in its e-mail. | 
| - | 
| -Refresh any imported files. | 
| ---------------------------- | 
| - | 
| -A number of files are taken from external repositories.  They include: | 
| - | 
| -   * `texinfo/texinfo.tex' | 
| - | 
| -   * `config.guess' et. al. (see the top-level `MAINTAINERS' file) | 
| - | 
| -   * `etc/standards.texi', `etc/make-stds.texi' | 
| - | 
| -Check the ARI | 
| -------------- | 
| - | 
| -A.R.I. is an `awk' script (Awk Regression Index ;-) that checks for a | 
| -number of errors and coding conventions.  The checks include things | 
| -like using `malloc' instead of `xmalloc' and file naming problems. | 
| -There shouldn't be any regressions. | 
| - | 
| -21.3.1 Review the bug data base | 
| -------------------------------- | 
| - | 
| -Close anything obviously fixed. | 
| - | 
| -21.3.2 Check all cross targets build | 
| ------------------------------------- | 
| - | 
| -The targets are listed in `gdb/MAINTAINERS'. | 
| - | 
| -21.4 Cut the Branch | 
| -=================== | 
| - | 
| -Create the branch | 
| ------------------ | 
| - | 
| -     $  u=5.1 | 
| -     $  v=5.2 | 
| -     $  V=`echo $v | sed 's/\./_/g'` | 
| -     $  D=`date -u +%Y-%m-%d` | 
| -     $  echo $u $V $D | 
| -     5.1 5_2 2002-03-03 | 
| -     $  echo cvs -f -d :ext:sourceware.org:/cvs/src rtag \ | 
| -     -D $D-gmt gdb_$V-$D-branchpoint insight | 
| -     cvs -f -d :ext:sourceware.org:/cvs/src rtag | 
| -     -D 2002-03-03-gmt gdb_5_2-2002-03-03-branchpoint insight | 
| -     $  ^echo ^^ | 
| -     ... | 
| -     $  echo cvs -f -d :ext:sourceware.org:/cvs/src rtag \ | 
| -     -b -r gdb_$V-$D-branchpoint gdb_$V-branch insight | 
| -     cvs -f -d :ext:sourceware.org:/cvs/src rtag \ | 
| -     -b -r gdb_5_2-2002-03-03-branchpoint gdb_5_2-branch insight | 
| -     $  ^echo ^^ | 
| -     ... | 
| -     $ | 
| - | 
| -   * By using `-D YYYY-MM-DD-gmt', the branch is forced to an exact | 
| -     date/time. | 
| - | 
| -   * The trunk is first tagged so that the branch point can easily be | 
| -     found. | 
| - | 
| -   * Insight, which includes GDB, is tagged at the same time. | 
| - | 
| -   * `version.in' gets bumped to avoid version number conflicts. | 
| - | 
| -   * The reading of `.cvsrc' is disabled using `-f'. | 
| - | 
| -Update `version.in' | 
| -------------------- | 
| - | 
| -     $  u=5.1 | 
| -     $  v=5.2 | 
| -     $  V=`echo $v | sed 's/\./_/g'` | 
| -     $  echo $u $v$V | 
| -     5.1 5_2 | 
| -     $  cd /tmp | 
| -     $  echo cvs -f -d :ext:sourceware.org:/cvs/src co \ | 
| -     -r gdb_$V-branch src/gdb/version.in | 
| -     cvs -f -d :ext:sourceware.org:/cvs/src co | 
| -      -r gdb_5_2-branch src/gdb/version.in | 
| -     $  ^echo ^^ | 
| -     U src/gdb/version.in | 
| -     $  cd src/gdb | 
| -     $  echo $u.90-0000-00-00-cvs > version.in | 
| -     $  cat version.in | 
| -     5.1.90-0000-00-00-cvs | 
| -     $  cvs -f commit version.in | 
| - | 
| -   * `0000-00-00' is used as a date to pump prime the version.in update | 
| -     mechanism. | 
| - | 
| -   * `.90' and the previous branch version are used as fairly arbitrary | 
| -     initial branch version number. | 
| - | 
| -Update the web and news pages | 
| ------------------------------ | 
| - | 
| -Something? | 
| - | 
| -Tweak cron to track the new branch | 
| ----------------------------------- | 
| - | 
| -The file `gdbadmin/cron/crontab' contains gdbadmin's cron table.  This | 
| -file needs to be updated so that: | 
| - | 
| -   * A daily timestamp is added to the file `version.in'. | 
| - | 
| -   * The new branch is included in the snapshot process. | 
| - | 
| -See the file `gdbadmin/cron/README' for how to install the updated cron | 
| -table. | 
| - | 
| -   The file `gdbadmin/ss/README' should also be reviewed to reflect any | 
| -changes.  That file is copied to both the branch/ and current/ snapshot | 
| -directories. | 
| - | 
| -Update the NEWS and README files | 
| --------------------------------- | 
| - | 
| -The `NEWS' file needs to be updated so that on the branch it refers to | 
| -_changes in the current release_ while on the trunk it also refers to | 
| -_changes since the current release_. | 
| - | 
| -   The `README' file needs to be updated so that it refers to the | 
| -current release. | 
| - | 
| -Post the branch info | 
| --------------------- | 
| - | 
| -Send an announcement to the mailing lists: | 
| - | 
| -   * GDB Announcement mailing list <gdb-announce@sourceware.org> | 
| - | 
| -   * GDB Discussion mailing list <gdb@sourceware.org> and GDB Testers | 
| -     mailing list <gdb-testers@sourceware.org> | 
| - | 
| -   _Pragmatics: The branch creation is sent to the announce list to | 
| -ensure that people people not subscribed to the higher volume discussion | 
| -list are alerted._ | 
| - | 
| -   The announcement should include: | 
| - | 
| -   * The branch tag. | 
| - | 
| -   * How to check out the branch using CVS. | 
| - | 
| -   * The date/number of weeks until the release. | 
| - | 
| -   * The branch commit policy still holds. | 
| - | 
| -21.5 Stabilize the branch | 
| -========================= | 
| - | 
| -Something goes here. | 
| - | 
| -21.6 Create a Release | 
| -===================== | 
| - | 
| -The process of creating and then making available a release is broken | 
| -down into a number of stages.  The first part addresses the technical | 
| -process of creating a releasable tar ball.  The later stages address the | 
| -process of releasing that tar ball. | 
| - | 
| -   When making a release candidate just the first section is needed. | 
| - | 
| -21.6.1 Create a release candidate | 
| ---------------------------------- | 
| - | 
| -The objective at this stage is to create a set of tar balls that can be | 
| -made available as a formal release (or as a less formal release | 
| -candidate). | 
| - | 
| -Freeze the branch | 
| -................. | 
| - | 
| -Send out an e-mail notifying everyone that the branch is frozen to | 
| -<gdb-patches@sourceware.org>. | 
| - | 
| -Establish a few defaults. | 
| -......................... | 
| - | 
| -     $  b=gdb_5_2-branch | 
| -     $  v=5.2 | 
| -     $  t=/sourceware/snapshot-tmp/gdbadmin-tmp | 
| -     $  echo $t/$b/$v | 
| -     /sourceware/snapshot-tmp/gdbadmin-tmp/gdb_5_2-branch/5.2 | 
| -     $  mkdir -p $t/$b/$v | 
| -     $  cd $t/$b/$v | 
| -     $  pwd | 
| -     /sourceware/snapshot-tmp/gdbadmin-tmp/gdb_5_2-branch/5.2 | 
| -     $  which autoconf | 
| -     /home/gdbadmin/bin/autoconf | 
| -     $ | 
| - | 
| -Notes: | 
| - | 
| -   * Check the `autoconf' version carefully.  You want to be using the | 
| -     version documented in the toplevel `README-maintainer-mode' file. | 
| -     It is very unlikely that the version of `autoconf' installed in | 
| -     system directories (e.g., `/usr/bin/autoconf') is correct. | 
| - | 
| -Check out the relevant modules: | 
| -............................... | 
| - | 
| -     $  for m in gdb insight | 
| -     do | 
| -     ( mkdir -p $m && cd $m && cvs -q -f -d /cvs/src co -P -r $b $m ) | 
| -     done | 
| -     $ | 
| - | 
| -Note: | 
| - | 
| -   * The reading of `.cvsrc' is disabled (`-f') so that there isn't any | 
| -     confusion between what is written here and what your local `cvs' | 
| -     really does. | 
| - | 
| -Update relevant files. | 
| -...................... | 
| - | 
| -`gdb/NEWS' | 
| -     Major releases get their comments added as part of the mainline. | 
| -     Minor releases should probably mention any significant bugs that | 
| -     were fixed. | 
| - | 
| -     Don't forget to include the `ChangeLog' entry. | 
| - | 
| -          $  emacs gdb/src/gdb/NEWS | 
| -          ... | 
| -          c-x 4 a | 
| -          ... | 
| -          c-x c-s c-x c-c | 
| -          $  cp gdb/src/gdb/NEWS insight/src/gdb/NEWS | 
| -          $  cp gdb/src/gdb/ChangeLog insight/src/gdb/ChangeLog | 
| - | 
| -`gdb/README' | 
| -     You'll need to update: | 
| - | 
| -        * The version. | 
| - | 
| -        * The update date. | 
| - | 
| -        * Who did it. | 
| - | 
| -          $  emacs gdb/src/gdb/README | 
| -          ... | 
| -          c-x 4 a | 
| -          ... | 
| -          c-x c-s c-x c-c | 
| -          $  cp gdb/src/gdb/README insight/src/gdb/README | 
| -          $  cp gdb/src/gdb/ChangeLog insight/src/gdb/ChangeLog | 
| - | 
| -     _Maintainer note: Hopefully the `README' file was reviewed before | 
| -     the initial branch was cut so just a simple substitute is needed | 
| -     to get it updated._ | 
| - | 
| -     _Maintainer note: Other projects generate `README' and `INSTALL' | 
| -     from the core documentation.  This might be worth pursuing._ | 
| - | 
| -`gdb/version.in' | 
| -          $  echo $v > gdb/src/gdb/version.in | 
| -          $  cat gdb/src/gdb/version.in | 
| -          5.2 | 
| -          $  emacs gdb/src/gdb/version.in | 
| -          ... | 
| -          c-x 4 a | 
| -          ... Bump to version ... | 
| -          c-x c-s c-x c-c | 
| -          $  cp gdb/src/gdb/version.in insight/src/gdb/version.in | 
| -          $  cp gdb/src/gdb/ChangeLog insight/src/gdb/ChangeLog | 
| - | 
| - | 
| -Do the dirty work | 
| -................. | 
| - | 
| -This is identical to the process used to create the daily snapshot. | 
| - | 
| -     $  for m in gdb insight | 
| -     do | 
| -     ( cd $m/src && gmake -f src-release $m.tar ) | 
| -     done | 
| - | 
| -   If the top level source directory does not have `src-release' (GDB | 
| -version 5.3.1 or earlier), try these commands instead: | 
| - | 
| -     $  for m in gdb insight | 
| -     do | 
| -     ( cd $m/src && gmake -f Makefile.in $m.tar ) | 
| -     done | 
| - | 
| -Check the source files | 
| -...................... | 
| - | 
| -You're looking for files that have mysteriously disappeared. | 
| -`distclean' has the habit of deleting files it shouldn't.  Watch out | 
| -for the `version.in' update `cronjob'. | 
| - | 
| -     $  ( cd gdb/src && cvs -f -q -n update ) | 
| -     M djunpack.bat | 
| -     ? gdb-5.1.91.tar | 
| -     ? proto-toplev | 
| -     ... lots of generated files ... | 
| -     M gdb/ChangeLog | 
| -     M gdb/NEWS | 
| -     M gdb/README | 
| -     M gdb/version.in | 
| -     ... lots of generated files ... | 
| -     $ | 
| - | 
| -_Don't worry about the `gdb.info-??' or `gdb/p-exp.tab.c'.  They were | 
| -generated (and yes `gdb.info-1' was also generated only something | 
| -strange with CVS means that they didn't get suppressed).  Fixing it | 
| -would be nice though._ | 
| - | 
| -Create compressed versions of the release | 
| -......................................... | 
| - | 
| -     $  cp */src/*.tar . | 
| -     $  cp */src/*.bz2 . | 
| -     $  ls -F | 
| -     gdb/ gdb-5.2.tar insight/ insight-5.2.tar | 
| -     $  for m in gdb insight | 
| -     do | 
| -     bzip2 -v -9 -c $m-$v.tar > $m-$v.tar.bz2 | 
| -     gzip -v -9 -c $m-$v.tar > $m-$v.tar.gz | 
| -     done | 
| -     $ | 
| - | 
| -Note: | 
| - | 
| -   * A pipe such as `bunzip2 < xxx.bz2 | gzip -9 > xxx.gz' is not since, | 
| -     in that mode, `gzip' does not know the name of the file and, hence, | 
| -     can not include it in the compressed file.  This is also why the | 
| -     release process runs `tar' and `bzip2' as separate passes. | 
| - | 
| -21.6.2 Sanity check the tar ball | 
| --------------------------------- | 
| - | 
| -Pick a popular machine (Solaris/PPC?) and try the build on that. | 
| - | 
| -     $  bunzip2 < gdb-5.2.tar.bz2 | tar xpf - | 
| -     $  cd gdb-5.2 | 
| -     $  ./configure | 
| -     $  make | 
| -     ... | 
| -     $  ./gdb/gdb ./gdb/gdb | 
| -     GNU gdb 5.2 | 
| -     ... | 
| -     (gdb)  b main | 
| -     Breakpoint 1 at 0x80732bc: file main.c, line 734. | 
| -     (gdb)  run | 
| -     Starting program: /tmp/gdb-5.2/gdb/gdb | 
| - | 
| -     Breakpoint 1, main (argc=1, argv=0xbffff8b4) at main.c:734 | 
| -     734       catch_errors (captured_main, &args, "", RETURN_MASK_ALL); | 
| -     (gdb)  print args | 
| -     $1 = {argc = 136426532, argv = 0x821b7f0} | 
| -     (gdb) | 
| - | 
| -21.6.3 Make a release candidate available | 
| ------------------------------------------ | 
| - | 
| -If this is a release candidate then the only remaining steps are: | 
| - | 
| -  1. Commit `version.in' and `ChangeLog' | 
| - | 
| -  2. Tweak `version.in' (and `ChangeLog' to read L.M.N-0000-00-00-cvs | 
| -     so that the version update process can restart. | 
| - | 
| -  3. Make the release candidate available in | 
| -     `ftp://sourceware.org/pub/gdb/snapshots/branch' | 
| - | 
| -  4. Notify the relevant mailing lists ( <gdb@sourceware.org> and | 
| -     <gdb-testers@sourceware.org> that the candidate is available. | 
| - | 
| -21.6.4 Make a formal release available | 
| --------------------------------------- | 
| - | 
| -(And you thought all that was required was to post an e-mail.) | 
| - | 
| -Install on sware | 
| -................ | 
| - | 
| -Copy the new files to both the release and the old release directory: | 
| - | 
| -     $  cp *.bz2 *.gz ~ftp/pub/gdb/old-releases/ | 
| -     $  cp *.bz2 *.gz ~ftp/pub/gdb/releases | 
| - | 
| -Clean up the releases directory so that only the most recent releases | 
| -are available (e.g. keep 5.2 and 5.2.1 but remove 5.1): | 
| - | 
| -     $  cd ~ftp/pub/gdb/releases | 
| -     $  rm ... | 
| - | 
| -Update the file `README' and `.message' in the releases directory: | 
| - | 
| -     $  vi README | 
| -     ... | 
| -     $  rm -f .message | 
| -     $  ln README .message | 
| - | 
| -Update the web pages. | 
| -..................... | 
| - | 
| -`htdocs/download/ANNOUNCEMENT' | 
| -     This file, which is posted as the official announcement, includes: | 
| -        * General announcement. | 
| - | 
| -        * News.  If making an M.N.1 release, retain the news from | 
| -          earlier M.N release. | 
| - | 
| -        * Errata. | 
| - | 
| -`htdocs/index.html' | 
| -`htdocs/news/index.html' | 
| -`htdocs/download/index.html' | 
| -     These files include: | 
| -        * Announcement of the most recent release. | 
| - | 
| -        * News entry (remember to update both the top level and the | 
| -          news directory). | 
| -     These pages also need to be regenerate using `index.sh'. | 
| - | 
| -`download/onlinedocs/' | 
| -     You need to find the magic command that is used to generate the | 
| -     online docs from the `.tar.bz2'.  The best way is to look in the | 
| -     output from one of the nightly `cron' jobs and then just edit | 
| -     accordingly.  Something like: | 
| - | 
| -          $  ~/ss/update-web-docs \ | 
| -           ~ftp/pub/gdb/releases/gdb-5.2.tar.bz2 \ | 
| -           $PWD/www \ | 
| -           /www/sourceware/htdocs/gdb/download/onlinedocs \ | 
| -           gdb | 
| - | 
| -`download/ari/' | 
| -     Just like the online documentation.  Something like: | 
| - | 
| -          $  /bin/sh ~/ss/update-web-ari \ | 
| -           ~ftp/pub/gdb/releases/gdb-5.2.tar.bz2 \ | 
| -           $PWD/www \ | 
| -           /www/sourceware/htdocs/gdb/download/ari \ | 
| -           gdb | 
| - | 
| - | 
| -Shadow the pages onto gnu | 
| -......................... | 
| - | 
| -Something goes here. | 
| - | 
| -Install the GDB tar ball on GNU | 
| -............................... | 
| - | 
| -At the time of writing, the GNU machine was `gnudist.gnu.org' in | 
| -`~ftp/gnu/gdb'. | 
| - | 
| -Make the `ANNOUNCEMENT' | 
| -....................... | 
| - | 
| -Post the `ANNOUNCEMENT' file you created above to: | 
| - | 
| -   * GDB Announcement mailing list <gdb-announce@sourceware.org> | 
| - | 
| -   * General GNU Announcement list <info-gnu@gnu.org> (but delay it a | 
| -     day or so to let things get out) | 
| - | 
| -   * GDB Bug Report mailing list <bug-gdb@gnu.org> | 
| - | 
| -21.6.5 Cleanup | 
| --------------- | 
| - | 
| -The release is out but you're still not finished. | 
| - | 
| -Commit outstanding changes | 
| -.......................... | 
| - | 
| -In particular you'll need to commit any changes to: | 
| - | 
| -   * `gdb/ChangeLog' | 
| - | 
| -   * `gdb/version.in' | 
| - | 
| -   * `gdb/NEWS' | 
| - | 
| -   * `gdb/README' | 
| - | 
| -Tag the release | 
| -............... | 
| - | 
| -Something like: | 
| - | 
| -     $  d=`date -u +%Y-%m-%d` | 
| -     $  echo $d | 
| -     2002-01-24 | 
| -     $  ( cd insight/src/gdb && cvs -f -q update ) | 
| -     $  ( cd insight/src && cvs -f -q tag gdb_5_2-$d-release ) | 
| - | 
| -   Insight is used since that contains more of the release than GDB. | 
| - | 
| -Mention the release on the trunk | 
| -................................ | 
| - | 
| -Just put something in the `ChangeLog' so that the trunk also indicates | 
| -when the release was made. | 
| - | 
| -Restart `gdb/version.in' | 
| -........................ | 
| - | 
| -If `gdb/version.in' does not contain an ISO date such as `2002-01-24' | 
| -then the daily `cronjob' won't update it.  Having committed all the | 
| -release changes it can be set to `5.2.0_0000-00-00-cvs' which will | 
| -restart things (yes the `_' is important - it affects the snapshot | 
| -process). | 
| - | 
| -   Don't forget the `ChangeLog'. | 
| - | 
| -Merge into trunk | 
| -................ | 
| - | 
| -The files committed to the branch may also need changes merged into the | 
| -trunk. | 
| - | 
| -Revise the release schedule | 
| -........................... | 
| - | 
| -Post a revised release schedule to GDB Discussion List | 
| -<gdb@sourceware.org> with an updated announcement.  The schedule can be | 
| -generated by running: | 
| - | 
| -     $  ~/ss/schedule `date +%s` schedule | 
| - | 
| -The first parameter is approximate date/time in seconds (from the epoch) | 
| -of the most recent release. | 
| - | 
| -   Also update the schedule `cronjob'. | 
| - | 
| -21.7 Post release | 
| -================= | 
| - | 
| -Remove any `OBSOLETE' code. | 
| - | 
| - | 
| -File: gdbint.info,  Node: Testsuite,  Next: Hints,  Prev: Releasing GDB,  Up: Top | 
| - | 
| -22 Testsuite | 
| -************ | 
| - | 
| -The testsuite is an important component of the GDB package.  While it | 
| -is always worthwhile to encourage user testing, in practice this is | 
| -rarely sufficient; users typically use only a small subset of the | 
| -available commands, and it has proven all too common for a change to | 
| -cause a significant regression that went unnoticed for some time. | 
| - | 
| -   The GDB testsuite uses the DejaGNU testing framework.  The tests | 
| -themselves are calls to various `Tcl' procs; the framework runs all the | 
| -procs and summarizes the passes and fails. | 
| - | 
| -22.1 Using the Testsuite | 
| -======================== | 
| - | 
| -To run the testsuite, simply go to the GDB object directory (or to the | 
| -testsuite's objdir) and type `make check'.  This just sets up some | 
| -environment variables and invokes DejaGNU's `runtest' script.  While | 
| -the testsuite is running, you'll get mentions of which test file is in | 
| -use, and a mention of any unexpected passes or fails.  When the | 
| -testsuite is finished, you'll get a summary that looks like this: | 
| - | 
| -                     === gdb Summary === | 
| - | 
| -     # of expected passes            6016 | 
| -     # of unexpected failures        58 | 
| -     # of unexpected successes       5 | 
| -     # of expected failures          183 | 
| -     # of unresolved testcases       3 | 
| -     # of untested testcases         5 | 
| - | 
| -   To run a specific test script, type: | 
| -     make check RUNTESTFLAGS='TESTS' | 
| -   where TESTS is a list of test script file names, separated by spaces. | 
| - | 
| -   If you use GNU make, you can use its `-j' option to run the | 
| -testsuite in parallel.  This can greatly reduce the amount of time it | 
| -takes for the testsuite to run.  In this case, if you set | 
| -`RUNTESTFLAGS' then, by default, the tests will be run serially even | 
| -under `-j'.  You can override this and force a parallel run by setting | 
| -the `make' variable `FORCE_PARALLEL' to any non-empty value.  Note that | 
| -the parallel `make check' assumes that you want to run the entire | 
| -testsuite, so it is not compatible with some dejagnu options, like | 
| -`--directory'. | 
| - | 
| -   The ideal test run consists of expected passes only; however, reality | 
| -conspires to keep us from this ideal.  Unexpected failures indicate | 
| -real problems, whether in GDB or in the testsuite.  Expected failures | 
| -are still failures, but ones which have been decided are too hard to | 
| -deal with at the time; for instance, a test case might work everywhere | 
| -except on AIX, and there is no prospect of the AIX case being fixed in | 
| -the near future.  Expected failures should not be added lightly, since | 
| -you may be masking serious bugs in GDB.  Unexpected successes are | 
| -expected fails that are passing for some reason, while unresolved and | 
| -untested cases often indicate some minor catastrophe, such as the | 
| -compiler being unable to deal with a test program. | 
| - | 
| -   When making any significant change to GDB, you should run the | 
| -testsuite before and after the change, to confirm that there are no | 
| -regressions.  Note that truly complete testing would require that you | 
| -run the testsuite with all supported configurations and a variety of | 
| -compilers; however this is more than really necessary.  In many cases | 
| -testing with a single configuration is sufficient.  Other useful | 
| -options are to test one big-endian (Sparc) and one little-endian (x86) | 
| -host, a cross config with a builtin simulator (powerpc-eabi, mips-elf), | 
| -or a 64-bit host (Alpha). | 
| - | 
| -   If you add new functionality to GDB, please consider adding tests | 
| -for it as well; this way future GDB hackers can detect and fix their | 
| -changes that break the functionality you added.  Similarly, if you fix | 
| -a bug that was not previously reported as a test failure, please add a | 
| -test case for it.  Some cases are extremely difficult to test, such as | 
| -code that handles host OS failures or bugs in particular versions of | 
| -compilers, and it's OK not to try to write tests for all of those. | 
| - | 
| -   DejaGNU supports separate build, host, and target machines.  However, | 
| -some GDB test scripts do not work if the build machine and the host | 
| -machine are not the same.  In such an environment, these scripts will | 
| -give a result of "UNRESOLVED", like this: | 
| - | 
| -     UNRESOLVED: gdb.base/example.exp: This test script does not work on a remote host. | 
| - | 
| -22.2 Testsuite Parameters | 
| -========================= | 
| - | 
| -Several variables exist to modify the behavior of the testsuite. | 
| - | 
| -   * `TRANSCRIPT' | 
| - | 
| -     Sometimes it is convenient to get a transcript of the commands | 
| -     which the testsuite sends to GDB.  For example, if GDB crashes | 
| -     during testing, a transcript can be used to more easily | 
| -     reconstruct the failure when running GDB under GDB. | 
| - | 
| -     You can instruct the GDB testsuite to write transcripts by setting | 
| -     the DejaGNU variable `TRANSCRIPT' (to any value) before invoking | 
| -     `runtest' or `make check'.  The transcripts will be written into | 
| -     DejaGNU's output directory.  One transcript will be made for each | 
| -     invocation of GDB; they will be named `transcript.N', where N is | 
| -     an integer.  The first line of the transcript file will show how | 
| -     GDB was invoked; each subsequent line is a command sent as input | 
| -     to GDB. | 
| - | 
| -          make check RUNTESTFLAGS=TRANSCRIPT=y | 
| - | 
| -     Note that the transcript is not always complete.  In particular, | 
| -     tests of completion can yield partial command lines. | 
| - | 
| -   * `GDB' | 
| - | 
| -     Sometimes one wishes to test a different GDB than the one in the | 
| -     build directory.  For example, one may wish to run the testsuite on | 
| -     `/usr/bin/gdb'. | 
| - | 
| -          make check RUNTESTFLAGS=GDB=/usr/bin/gdb | 
| - | 
| -   * `GDBSERVER' | 
| - | 
| -     When testing a different GDB, it is often useful to also test a | 
| -     different gdbserver. | 
| - | 
| -          make check RUNTESTFLAGS="GDB=/usr/bin/gdb GDBSERVER=/usr/bin/gdbserver" | 
| - | 
| -   * `INTERNAL_GDBFLAGS' | 
| - | 
| -     When running the testsuite normally one doesn't want whatever is in | 
| -     `~/.gdbinit' to interfere with the tests, therefore the test | 
| -     harness passes `-nx' to GDB.  One also doesn't want any windowed | 
| -     version of GDB, e.g., `gdb -tui', to run.  This is achieved via | 
| -     `INTERNAL_GDBFLAGS'. | 
| - | 
| -          set INTERNAL_GDBFLAGS "-nw -nx" | 
| - | 
| -     This is all well and good, except when testing an installed GDB | 
| -     that has been configured with `--with-system-gdbinit'.  Here one | 
| -     does not want `~/.gdbinit' loaded but one may want the system | 
| -     `.gdbinit' file loaded.  This can be achieved by pointing `$HOME' | 
| -     at a directory without a `.gdbinit' and by overriding | 
| -     `INTERNAL_GDBFLAGS' and removing `-nx'. | 
| - | 
| -          cd testsuite | 
| -          HOME=`pwd` runtest \ | 
| -            GDB=/usr/bin/gdb \ | 
| -            GDBSERVER=/usr/bin/gdbserver \ | 
| -            INTERNAL_GDBFLAGS=-nw | 
| - | 
| - | 
| -   There are two ways to run the testsuite and pass additional | 
| -parameters to DejaGnu.  The first is with `make check' and specifying | 
| -the makefile variable `RUNTESTFLAGS'. | 
| - | 
| -     make check RUNTESTFLAGS=TRANSCRIPT=y | 
| - | 
| -   The second is to cd to the `testsuite' directory and invoke the | 
| -DejaGnu `runtest' command directly. | 
| - | 
| -     cd testsuite | 
| -     make site.exp | 
| -     runtest TRANSCRIPT=y | 
| - | 
| -22.3 Testsuite Configuration | 
| -============================ | 
| - | 
| -It is possible to adjust the behavior of the testsuite by defining the | 
| -global variables listed below, either in a `site.exp' file, or in a | 
| -board file. | 
| - | 
| -   * `gdb_test_timeout' | 
| - | 
| -     Defining this variable changes the default timeout duration used | 
| -     during communication with GDB.  More specifically, the global | 
| -     variable used during testing is `timeout', but this variable gets | 
| -     reset to `gdb_test_timeout' at the beginning of each testcase, | 
| -     making sure that any local change to `timeout' in a testcase does | 
| -     not affect subsequent testcases. | 
| - | 
| -     This global variable comes in handy when the debugger is slower | 
| -     than normal due to the testing environment, triggering unexpected | 
| -     `TIMEOUT' test failures.  Examples include when testing on a | 
| -     remote machine, or against a system where communications are slow. | 
| - | 
| -     If not specifically defined, this variable gets automatically | 
| -     defined to the same value as `timeout' during the testsuite | 
| -     initialization.  The default value of the timeout is defined in | 
| -     the file `gdb/testsuite/config/unix.exp' that is part of the GDB | 
| -     test suite(1). | 
| - | 
| - | 
| -22.4 Testsuite Organization | 
| -=========================== | 
| - | 
| -The testsuite is entirely contained in `gdb/testsuite'.  While the | 
| -testsuite includes some makefiles and configury, these are very minimal, | 
| -and used for little besides cleaning up, since the tests themselves | 
| -handle the compilation of the programs that GDB will run.  The file | 
| -`testsuite/lib/gdb.exp' contains common utility procs useful for all | 
| -GDB tests, while the directory `testsuite/config' contains | 
| -configuration-specific files, typically used for special-purpose | 
| -definitions of procs like `gdb_load' and `gdb_start'. | 
| - | 
| -   The tests themselves are to be found in `testsuite/gdb.*' and | 
| -subdirectories of those.  The names of the test files must always end | 
| -with `.exp'.  DejaGNU collects the test files by wildcarding in the | 
| -test directories, so both subdirectories and individual files get | 
| -chosen and run in alphabetical order. | 
| - | 
| -   The following table lists the main types of subdirectories and what | 
| -they are for.  Since DejaGNU finds test files no matter where they are | 
| -located, and since each test file sets up its own compilation and | 
| -execution environment, this organization is simply for convenience and | 
| -intelligibility. | 
| - | 
| -`gdb.base' | 
| -     This is the base testsuite.  The tests in it should apply to all | 
| -     configurations of GDB (but generic native-only tests may live | 
| -     here).  The test programs should be in the subset of C that is | 
| -     valid K&R, ANSI/ISO, and C++ (`#ifdef's are allowed if necessary, | 
| -     for instance for prototypes). | 
| - | 
| -`gdb.LANG' | 
| -     Language-specific tests for any language LANG besides C.  Examples | 
| -     are `gdb.cp' and `gdb.java'. | 
| - | 
| -`gdb.PLATFORM' | 
| -     Non-portable tests.  The tests are specific to a specific | 
| -     configuration (host or target), such as HP-UX or eCos.  Example is | 
| -     `gdb.hp', for HP-UX. | 
| - | 
| -`gdb.COMPILER' | 
| -     Tests specific to a particular compiler.  As of this writing (June | 
| -     1999), there aren't currently any groups of tests in this category | 
| -     that couldn't just as sensibly be made platform-specific, but one | 
| -     could imagine a `gdb.gcc', for tests of GDB's handling of GCC | 
| -     extensions. | 
| - | 
| -`gdb.SUBSYSTEM' | 
| -     Tests that exercise a specific GDB subsystem in more depth.  For | 
| -     instance, `gdb.disasm' exercises various disassemblers, while | 
| -     `gdb.stabs' tests pathways through the stabs symbol reader. | 
| - | 
| -22.5 Writing Tests | 
| -================== | 
| - | 
| -In many areas, the GDB tests are already quite comprehensive; you | 
| -should be able to copy existing tests to handle new cases. | 
| - | 
| -   You should try to use `gdb_test' whenever possible, since it | 
| -includes cases to handle all the unexpected errors that might happen. | 
| -However, it doesn't cost anything to add new test procedures; for | 
| -instance, `gdb.base/exprs.exp' defines a `test_expr' that calls | 
| -`gdb_test' multiple times. | 
| - | 
| -   Only use `send_gdb' and `gdb_expect' when absolutely necessary. | 
| -Even if GDB has several valid responses to a command, you can use | 
| -`gdb_test_multiple'.  Like `gdb_test', `gdb_test_multiple' recognizes | 
| -internal errors and unexpected prompts. | 
| - | 
| -   Do not write tests which expect a literal tab character from GDB. | 
| -On some operating systems (e.g. OpenBSD) the TTY layer expands tabs to | 
| -spaces, so by the time GDB's output reaches expect the tab is gone. | 
| - | 
| -   The source language programs do _not_ need to be in a consistent | 
| -style.  Since GDB is used to debug programs written in many different | 
| -styles, it's worth having a mix of styles in the testsuite; for | 
| -instance, some GDB bugs involving the display of source lines would | 
| -never manifest themselves if the programs used GNU coding style | 
| -uniformly. | 
| - | 
| -   Some testcase results need more detailed explanation: | 
| - | 
| -`KFAIL' | 
| -     Known problem of GDB itself.  You must specify the GDB bug report | 
| -     number like in these sample tests: | 
| -          kfail "gdb/13392" "continue to marker 2" | 
| -     or | 
| -          setup_kfail gdb/13392 "*-*-*" | 
| -          kfail "continue to marker 2" | 
| - | 
| -`XFAIL' | 
| -     Known problem of environment.  This typically includes GCC but it | 
| -     includes also many other system components which cannot be fixed | 
| -     in the GDB project.  Sample test with sanity check not knowing the | 
| -     specific cause of the problem: | 
| -          # On x86_64 it is commonly about 4MB. | 
| -          if {$stub_size > 25000000} { | 
| -              xfail "stub size $stub_size is too large" | 
| -              return | 
| -          } | 
| - | 
| -     You should provide bug report number for the failing component of | 
| -     the environment, if such bug report is available: | 
| -          if {[test_compiler_info {gcc-[0-3]-*}] | 
| -             || [test_compiler_info {gcc-4-[0-5]-*}]} { | 
| -             setup_xfail "gcc/46955" *-*-* | 
| -          } | 
| -          gdb_test "python print ttype.template_argument(2)" "&C::c" | 
| - | 
| -22.6 Board settings | 
| -=================== | 
| - | 
| -In GDB testsuite, the tests can be configured or customized in the board | 
| -file by means of "Board Settings".  Each setting   should be consulted | 
| -by test cases that depend on the corresponding feature. | 
| - | 
| -   Here are the supported board settings: | 
| - | 
| -`gdb,cannot_call_functions' | 
| -     The board does not support inferior call, that is, invoking | 
| -     inferior functions in GDB. | 
| - | 
| -`gdb,can_reverse' | 
| -     The board supports reverse execution. | 
| - | 
| -`gdb,no_hardware_watchpoints' | 
| -     The board does not support hardware watchpoints. | 
| - | 
| -`gdb,nofileio' | 
| -     GDB is unable to intercept target file operations in remote and | 
| -     perform them on the host. | 
| - | 
| -`gdb,noinferiorio' | 
| -     The board is unable to provide I/O capability to the inferior. | 
| - | 
| -`gdb,nosignals' | 
| -     The board does not support signals. | 
| - | 
| -`gdb,skip_huge_test' | 
| -     Skip time-consuming tests on the board with slow connection. | 
| - | 
| -`gdb,skip_float_tests' | 
| -     Skip tests related to float points on target board. | 
| - | 
| -`gdb,use_precord' | 
| -     The board supports process record. | 
| - | 
| -`gdb_server_prog' | 
| -     The location of GDBserver.  If GDBserver somewhere other than its | 
| -     default location is used in test, specify the location of | 
| -     GDBserver in this variable.  The location is a file name of | 
| -     GDBserver that can be either absolute or relative to testsuite | 
| -     subdirectory in build directory. | 
| - | 
| -`in_proc_agent' | 
| -     The location of in-process agent.  If in-process agent other than | 
| -     its default location is used in test, specify the location of | 
| -     in-process agent in this variable.  The location is a file name of | 
| -     in-process agent that can be either  absolute or relative to | 
| -     testsuite subdirectory in build directory. | 
| - | 
| -`noargs' | 
| -     GDB does not support argument passing for inferior. | 
| - | 
| -`no_long_long' | 
| -     The board does not support type `long long'. | 
| - | 
| -`use_gdb_stub' | 
| -     The tests are running with gdb stub. | 
| - | 
| -   ---------- Footnotes ---------- | 
| - | 
| -   (1) If you are using a board file, it could override the test-suite | 
| -default; search the board file for "timeout". | 
| - | 
| - | 
| -File: gdbint.info,  Node: Hints,  Next: GDB Observers,  Prev: Testsuite,  Up: Top | 
| - | 
| -23 Hints | 
| -******** | 
| - | 
| -Check the `README' file, it often has useful information that does not | 
| -appear anywhere else in the directory. | 
| - | 
| -* Menu: | 
| - | 
| -* Getting Started::		Getting started working on GDB | 
| -* Debugging GDB::		Debugging GDB with itself | 
| - | 
| - | 
| -File: gdbint.info,  Node: Getting Started,  Next: Debugging GDB,  Up: Hints | 
| - | 
| -23.1 Getting Started | 
| -==================== | 
| - | 
| -GDB is a large and complicated program, and if you first starting to | 
| -work on it, it can be hard to know where to start.  Fortunately, if you | 
| -know how to go about it, there are ways to figure out what is going on. | 
| - | 
| -   This manual, the GDB Internals manual, has information which applies | 
| -generally to many parts of GDB. | 
| - | 
| -   Information about particular functions or data structures are | 
| -located in comments with those functions or data structures.  If you | 
| -run across a function or a global variable which does not have a | 
| -comment correctly explaining what is does, this can be thought of as a | 
| -bug in GDB; feel free to submit a bug report, with a suggested comment | 
| -if you can figure out what the comment should say.  If you find a | 
| -comment which is actually wrong, be especially sure to report that. | 
| - | 
| -   Comments explaining the function of macros defined in host, target, | 
| -or native dependent files can be in several places.  Sometimes they are | 
| -repeated every place the macro is defined.  Sometimes they are where the | 
| -macro is used.  Sometimes there is a header file which supplies a | 
| -default definition of the macro, and the comment is there.  This manual | 
| -also documents all the available macros. | 
| - | 
| -   Start with the header files.  Once you have some idea of how GDB's | 
| -internal symbol tables are stored (see `symtab.h', `gdbtypes.h'), you | 
| -will find it much easier to understand the code which uses and creates | 
| -those symbol tables. | 
| - | 
| -   You may wish to process the information you are getting somehow, to | 
| -enhance your understanding of it.  Summarize it, translate it to another | 
| -language, add some (perhaps trivial or non-useful) feature to GDB, use | 
| -the code to predict what a test case would do and write the test case | 
| -and verify your prediction, etc.  If you are reading code and your eyes | 
| -are starting to glaze over, this is a sign you need to use a more active | 
| -approach. | 
| - | 
| -   Once you have a part of GDB to start with, you can find more | 
| -specifically the part you are looking for by stepping through each | 
| -function with the `next' command.  Do not use `step' or you will | 
| -quickly get distracted; when the function you are stepping through | 
| -calls another function try only to get a big-picture understanding | 
| -(perhaps using the comment at the beginning of the function being | 
| -called) of what it does.  This way you can identify which of the | 
| -functions being called by the function you are stepping through is the | 
| -one which you are interested in.  You may need to examine the data | 
| -structures generated at each stage, with reference to the comments in | 
| -the header files explaining what the data structures are supposed to | 
| -look like. | 
| - | 
| -   Of course, this same technique can be used if you are just reading | 
| -the code, rather than actually stepping through it.  The same general | 
| -principle applies--when the code you are looking at calls something | 
| -else, just try to understand generally what the code being called does, | 
| -rather than worrying about all its details. | 
| - | 
| -   A good place to start when tracking down some particular area is with | 
| -a command which invokes that feature.  Suppose you want to know how | 
| -single-stepping works.  As a GDB user, you know that the `step' command | 
| -invokes single-stepping.  The command is invoked via command tables | 
| -(see `command.h'); by convention the function which actually performs | 
| -the command is formed by taking the name of the command and adding | 
| -`_command', or in the case of an `info' subcommand, `_info'.  For | 
| -example, the `step' command invokes the `step_command' function and the | 
| -`info display' command invokes `display_info'.  When this convention is | 
| -not followed, you might have to use `grep' or `M-x tags-search' in | 
| -emacs, or run GDB on itself and set a breakpoint in `execute_command'. | 
| - | 
| -   If all of the above fail, it may be appropriate to ask for | 
| -information on `bug-gdb'.  But _never_ post a generic question like "I | 
| -was wondering if anyone could give me some tips about understanding | 
| -GDB"--if we had some magic secret we would put it in this manual. | 
| -Suggestions for improving the manual are always welcome, of course. | 
| - | 
|  |