diff options
Diffstat (limited to 'gdb/doc/gdbint.info-1')
-rw-r--r-- | gdb/doc/gdbint.info-1 | 1075 |
1 files changed, 1075 insertions, 0 deletions
diff --git a/gdb/doc/gdbint.info-1 b/gdb/doc/gdbint.info-1 new file mode 100644 index 0000000..cfd12a8 --- /dev/null +++ b/gdb/doc/gdbint.info-1 @@ -0,0 +1,1075 @@ +This is Info file gdbint.info, produced by Makeinfo version 1.68 from +the input file ./gdbint.texinfo. + +START-INFO-DIR-ENTRY +* Gdb-Internals: (gdbint). The GNU debugger's internals. +END-INFO-DIR-ENTRY + + This file documents the internals of the GNU debugger GDB. + + Copyright 1990-1999 Free Software Foundation, Inc. Contributed by +Cygnus Solutions. Written by John Gilmore. Second Edition by Stan +Shebs. + + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + + Permission is granted to copy or distribute modified versions of this +manual under the terms of the GPL (for which purpose this text may be +regarded as a program in the language TeX). + + +File: gdbint.info, Node: Top, Next: Requirements, 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: + +* Requirements:: +* Overall Structure:: +* Algorithms:: +* User Interface:: +* Symbol Handling:: +* Language Support:: +* Host Definition:: +* Target Architecture Definition:: +* Target Vector Definition:: +* Native Debugging:: +* Support Libraries:: +* Coding:: +* Porting GDB:: +* Hints:: + + +File: gdbint.info, Node: Requirements, Next: Overall Structure, Prev: Top, Up: Top + +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: Overall Structure, Next: Algorithms, Prev: Requirements, Up: Top + +Overall Structure +***************** + + GDB consists of three major subsystems: user interface, symbol +handling (the "symbol side"), and target system handling (the "target +side"). + + Ther 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. + +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. + +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. + +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. + + 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, doing a 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 "native" on a particular machine, you +have to include all three kinds of information. + + +File: gdbint.info, Node: Algorithms, Next: User Interface, Prev: Overall Structure, Up: Top + +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. + +Frames +====== + + A frame is a construct that GDB uses to keep track of calling and +called functions. + + `FRAME_FP' in the machine description has no meaning to the +machine-independent part of GDB, except that it is used when setting up +a new frame from scratch, as follows: + + create_new_frame (read_register (FP_REGNUM), read_pc ())); + + Other than that, all the meaning imparted to `FP_REGNUM' is imparted +by the machine-dependent code. So, `FP_REGNUM' can have any value that +is convenient for the code that creates new frames. +(`create_new_frame' calls `INIT_EXTRA_FRAME_INFO' if it is defined; +that is where you should use the `FP_REGNUM' value, if your frames are +nonstandard.) + + Given a GDB frame, define `FRAME_CHAIN' to determine the address of +the calling function's frame. This will be used to create a new GDB +frame struct, and then `INIT_EXTRA_FRAME_INFO' and `INIT_FRAME_PC' will +be called for the new frame. + +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 +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 nothing 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. + + Software breakpoints require GDB to do somewhat more work. The basic +theory is that GDB will replace a program instruction 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 writeable, so this technique won't work on programs in +ROM. It can also distort the behavior of programs that examine +themselves, although the 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. + + The basic definition of the software breakpoint is the macro +`BREAKPOINT'. + + Basic breakpoint object handling is in `breakpoint.c'. However, +much of the interesting breakpoint action is in `infrun.c'. + +Single Stepping +=============== + +Signal Handling +=============== + +Thread Handling +=============== + +Inferior Function Calls +======================= + +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 `maint info breakpoint' command. + + To make this work, you need to define a macro called +`GET_LONGJMP_TARGET', which will examine the `jmp_buf' structure and +extract the longjmp target address. Since `jmp_buf' is target +specific, you will need to define it in the appropriate `tm-XYZ.h' +file. Look in `tm-sun4os4.h' and `sparc-tdep.c' for examples of how to +do this. + + +File: gdbint.info, Node: User Interface, Next: Symbol Handling, Prev: Algorithms, Up: Top + +User Interface +************** + + GDB has several user interfaces. Although the command-line interface +is the most common and most familiar, there are others. + +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. + +Console Printing +================ + +TUI +=== + +libgdb +====== + + `libgdb' was an abortive project of years ago. The theory was to +provide an API to GDB's functionality. + + +File: gdbint.info, Node: Symbol Handling, Next: Language Support, Prev: User Interface, Up: Top + +Symbol Handling +*************** + + Symbols are a key part of GDB's operation. Symbols include +variables, functions, and types. + +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, or while reading symbols from shared libraries. + + Symbol files are initially opened by code in `symfile.c' using the +BFD library. BFD identifies the type of the file by examining its +header. `symfile_init' 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 need 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. + +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. + +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. + +Object File Formats +=================== + +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'. + +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. + + The COFF reader is in `coffread.c'. + +ECOFF +----- + + ECOFF is an extended COFF originally introduced for Mips and Alpha +workstations. + + The basic ECOFF reader is in `mipsread.c'. + +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). + +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. + +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. + + The basic ELF reader is in `elfread.c'. + +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 `hpread.c'. + +Other File Formats +------------------ + + Other file formats that have been supported by GDB include Netware +Loadable Modules (`nlmread.c'. + +Debugging File Formats +====================== + + This section describes characteristics of debugging information that +are independent of the object file format. + +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. + +COFF +---- + + The basic COFF definition includes debugging information. The level +of support is minimal and non-extensible, and is not often used. + +Mips debug (Third Eye) +---------------------- + + ECOFF includes a definition of a special debug format. + + The file `mdebugread.c' implements reading for this format. + +DWARF 1 +------- + + DWARF 1 is a debugging format that was originally designed to be +used with ELF in SVR4 systems. + + The DWARF 1 reader is in `dwarfread.c'. + +DWARF 2 +------- + + DWARF 2 is an improved but incompatible version of DWARF 1. + + The DWARF 2 reader is in `dwarf2read.c'. + +SOM +--- + + Like COFF, the SOM definition includes debugging information. + +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. + + +File: gdbint.info, Node: Language Support, Next: Host Definition, Prev: Symbol Handling, Up: Top + +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, such as DWARF. + +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 `eval.c:evaluate_subexp()'. + 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 `expprint.c:print_subexp()' 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.c:parse_exp_1()'. + +*Use macros to trim code* + The user has the option of building GDB for some or all of the + languages. If the user decides to build GDB for the language + LANG, then every file dependent on `language.h' will have the + macro `_LANG_LANG' defined in it. Use `#ifdef's to leave out + large routines that the user won't need if he or she is not using + your language. + + Note that you do not need to do this in your YACC parser, since if + GDB is not build for LANG, then `LANG-exp.tab.o' (the compiled + form of your parser) is not linked into GDB at all. + + See the file `configure.in' for how GDB is configured for different + languages. + +*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 + +Host Definition +*************** + + With the advent of autoconf, it's rarely necessary to have host +definition machinery anymore. + +Adding a New Host +================= + + Most of GDB's host configuration support happens via autoconf. It +should be rare to need new host-specific definitions. GDB still uses +the host-specific definitions and files listed below, but these mostly +exist for historical reasons, and should eventually disappear. + + Several files control GDB's configuration for host systems: + +`gdb/config/ARCH/XYZ.mh' + Specifies Makefile fragments needed when hosting on machine XYZ. + In particular, this lists the required machine-dependent object + files, by defining `XDEPFILES=...'. Also specifies the header file + which describes host XYZ, by defining `XM_FILE= xm-XYZ.h'. You + can also define `CC', `SYSV_DEFINE', `XM_CFLAGS', `XM_ADD_FILES', + `XM_CLIBS', `XM_CDEPS', etc.; see `Makefile.in'. + +`gdb/config/ARCH/xm-XYZ.h' + (`xm.h' is a link to this file, created by configure). Contains C + macro definitions describing the host system environment, such as + byte order, host C compiler and library. + +`gdb/XYZ-xdep.c' + Contains any miscellaneous C code required for this machine as a + host. On most machines it doesn't exist at all. If it does + exist, put `XYZ-xdep.o' into the `XDEPFILES' line in + `gdb/config/ARCH/XYZ.mh'. + +Generic Host Support Files +-------------------------- + + 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 `xm-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 `XDEPFILES'. + + 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-xdep.c', and put `XYZ-xdep.o' into +`XDEPFILES'. + +`ser-unix.c' + This contains serial line support for Unix systems. This is always + included, via the makefile variable `SER_HARDWIRE'; override this + variable in the `.mh' file to avoid it. + +`ser-go32.c' + This contains serial line support for 32-bit programs running + under DOS, using the GO32 execution environment. + +`ser-tcp.c' + This contains generic TCP support using sockets. + +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. 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'). + +`MEM_FNS_DECLARED' + Your host config file defines this if it includes declarations of + `memcpy' and `memset'. Define this to avoid conflicts between the + native include files and the declarations in `defs.h'. + +`NO_SYS_FILE' + Define this if your system does not have a `<sys/file.h>'. + +`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'. + +`ALIGN_STACK_ON_STARTUP' + Define this if your system is of a sort that will crash in + `tgetent' if the stack happens not to be longword-aligned when + `main' is called. This is a rare situation, but is known to occur + on several different types of systems. + +`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"'. + +`FCLOSE_PROVIDED' + Define this if the system declares `fclose' in the headers included + in `defs.h'. This isn't needed unless your compiler is unusually + anal. + +`FOPEN_RB' + Define this if binary files are opened the same way as text files. + +`GETENV_PROVIDED' + Define this if the system declares `getenv' in its headers included + in `defs.h'. This isn't needed unless your compiler is unusually + anal. + +`HAVE_MMAP' + In some cases, use the system call `mmap' for reading symbol + tables. For some machines this allows for sharing and quick + updates. + +`HAVE_SIGSETMASK' + Define this if the host system has job control, but does not define + `sigsetmask()'. Currently, this is only true of the RS/6000. + +`HAVE_TERMIO' + Define this if the host system has `termio.h'. + +`HOST_BYTE_ORDER' + The ordering of bytes in the host. This must be defined to be + either `BIG_ENDIAN' or `LITTLE_ENDIAN'. + +`INT_MAX' + +`INT_MIN' + +`LONG_MAX' + +`UINT_MAX' + +`ULONG_MAX' + Values for host-side constants. + +`ISATTY' + Substitute for isatty, if not available. + +`LONGEST' + This is the longest integer type available on the host. If not + defined, it will default to `long long' or `long', depending on + `CC_HAS_LONG_LONG'. + +`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 directive "ll". This is set by the configure + script. + +`HAVE_LONG_DOUBLE' + Define this if the host C compiler supports "long double". This is + set by the configure script. + +`PRINTF_HAS_LONG_DOUBLE' + Define this if the host can handle printing of long double + float-point numbers via the printf format directive "Lg". This is + set by the configure script. + +`SCANF_HAS_LONG_DOUBLE' + Define this if the host can handle the parsing of long double + float-point numbers via the scanf format directive directive "Lg". + 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. + +`L_SET' + This macro is used as the argument to lseek (or, most commonly, + bfd_seek). FIXME, should be replaced by SEEK_SET instead, which + is the POSIX equivalent. + +`MAINTENANCE_CMDS' + If the value of this is 1, then a number of optional maintenance + commands are compiled in. + +`MALLOC_INCOMPATIBLE' + Define this if the system's prototype for `malloc' differs from the + ANSI definition. + +`MMAP_BASE_ADDRESS' + When using HAVE_MMAP, the first mapping should go at this address. + +`MMAP_INCREMENT' + when using HAVE_MMAP, this is the increment between mappings. + +`NEED_POSIX_SETPGID' + Define this to use the POSIX version of `setpgid' to determine + whether job control is available. + +`NORETURN' + If defined, this should be one or more tokens, such as `volatile', + that can be used in both the declaration and definition of + functions to indicate that they never return. The default is + already set correctly if compiling with GCC. This will almost + never need to be defined. + +`ATTR_NORETURN' + If defined, this should be one or more tokens, such as + `__attribute__ ((noreturn))', that can be used in the declarations + of functions to indicate that they never return. The default is + already set correctly if compiling with GCC. This will almost + never need to be defined. + +`USE_MMALLOC' + GDB will use the `mmalloc' library for memory allocation for symbol + reading if this symbol is defined. Be careful defining it since + there are systems on which `mmalloc' does not work for some + reason. One example is the DECstation, where its RPC library + can't cope with our redefinition of `malloc' to call `mmalloc'. + When defining `USE_MMALLOC', you will also have to set `MMALLOC' + in the Makefile, to point to the mmalloc library. This define is + set when you configure with -with-mmalloc. + +`NO_MMCHECK' + Define this if you are using `mmalloc', but don't want the overhead + of checking the heap with `mmcheck'. Note that on some systems, + the C runtime makes calls to malloc prior to calling `main', and if + `free' is ever called with these pointers after calling `mmcheck' + to enable checking, a memory corruption abort is certain to occur. + These systems can still use mmalloc, but must define NO_MMCHECK. + +`MMCHECK_FORCE' + Define this to 1 if the C runtime allocates memory prior to + `mmcheck' being called, but that memory is never freed so we don't + have to worry about it triggering a memory corruption abort. The + default is 0, which means that `mmcheck' will only install the heap + checking functions if there has not yet been any memory allocation + calls, and if it fails to install the functions, gdb will issue a + warning. This is currently defined if you configure using + -with-mmalloc. + +`NO_SIGINTERRUPT' + Define this to indicate that siginterrupt() is not available. + +`R_OK' + Define if this is not in a system .h file. + +`SEEK_CUR' + +`SEEK_SET' + Define these to appropriate value for the system lseek(), if not + already defined. + +`STOP_SIGNAL' + This is the signal for stopping GDB. Defaults to SIGTSTP. (Only + redefined for the Convex.) + +`USE_O_NOCTTY' + Define this if the interior's tty should be opened with the + O_NOCTTY flag. (FIXME: This should be a native-only flag, but + `inflow.c' is always linked in.) + +`USG' + Means that System V (prior to SVR4) include files are in use. + (FIXME: This symbol is abused in `infrun.c', `regex.c', + `remote-nindy.c', and `utils.c' for other things, at the moment.) + +`lint' + Define this to help placate lint in some situations. + +`volatile' + Define this to override the defaults of `__volatile__' or `/**/'. + |