|
|
1.1 ! root 1: Notes on the GNU Implementation of Dwarf Debugging Information ! 2: -------------------------------------------------------------- ! 3: Last Updated: Sun Feb 16 21:31:53 1991 by [email protected] ! 4: ----------------------------------------------------- ! 5: ! 6: This file describes special and unique aspects of the GNU implementation ! 7: of the Dwarf debugging information language in the GCC Version 2 compiler. ! 8: ! 9: For general information about the Dwarf debugging information language, ! 10: you should obtain the latest Dwarf draft specification document developed ! 11: by the UNIX(tm) International Programming Languages Special Interest Group. ! 12: A copy of the this document (in PostScript form) may be obtained either ! 13: from me <[email protected]> or from the UI/PLSIG draft specification editor, ! 14: Joel Silverstein <[email protected]>. This file describes only known deviations ! 15: from the current UI/PLSIG Dwarf specification document together with ! 16: those things which are allowed by the current Dwarf specification but ! 17: which are known to cause interoperability problems (e.g. with svr4 SDB). ! 18: ! 19: The generation of Dwarf debugging information in GCC2 has now been tested ! 20: lightly (C language front end only) for m88k, i386, and i860 targets. ! 21: Significant interoperability problems may still exist (e.g. with the ! 22: USL svr4 version of the SDB debugger) due to a lack of accepted ! 23: standards for numbering registers for various target architectures. ! 24: (That is only one of the potential interoperability problems. See below ! 25: for notes on other known interoperability problems applicable to the ! 26: combination of GCC and svr4 SDB.) Note however that it is currently ! 27: believed that the register numbering conventions used by GCC (in Dwarf ! 28: output) are consistant with those used by the svr4 SDB debuggers provided ! 29: with the System V Release 4 reference ports for the m88k, i386, and i860 ! 30: processors. ! 31: ! 32: The Dwarf generation enhancement for GCC has been generously donated ! 33: by Network Computing Devices to the Free Software Foundation. The ! 34: additional code involved is covered under the GNU General Public ! 35: Licence (aka `copyleft') just as the rest of GCC is. ! 36: ! 37: If you have questions or comments about the Dwarf generation feature ! 38: of GCC, please send mail to me <[email protected]>. I will be happy to ! 39: investigate any bugs reported and I may even provide fixes (but of ! 40: course, I can make no promises). ! 41: ! 42: The Dwarf debugging information produced by GCC may deviate in a few minor ! 43: (but perhaps significant) respects from the Dwarf debugging information ! 44: currently produced by other C compilers. A serious attempt has been ! 45: made however to conform to existing practice and generally accepted ! 46: standards in the GNU implementation of Dwarf. ! 47: ! 48: If you are interested in obtaining more information about Dwarf or in ! 49: participating in the continuing evolution of Dwarf within the UI/PLSIG ! 50: group, please contact either myself or the UI/PLSIG chairman, Dan Oldman ! 51: <[email protected]>. The UI/PLSIG welcomes and encourages the partici- ! 52: pation of new members who might be interested in discussing debugging ! 53: issues in general, and Dwarf in particular. There are no dues and you ! 54: DO NOT have to be a UI member in order to join the UI/PLSIG. The UI/PLSIG ! 55: operates an E-mail mailing list and holds regular meeting in various cities. ! 56: If you don't have time to participate actively, but would like to be kept ! 57: abrest of recent developments, you con join the UI/PLSIG mailing list and ! 58: just listen in on our lively discussions. ! 59: ! 60: (Footnote: Within this file, the term `Debugging Information Entry' will ! 61: be abbreviated as `DIE'.) ! 62: ! 63: ! 64: Release Notes (aka known bugs) ! 65: ------------------------------- ! 66: ! 67: At this time, GCC does not know how to handle the GNU C "nested functions" ! 68: extension. (See the GCC manual for more info on this extension to ANSI C.) ! 69: ! 70: -------------------------------- ! 71: ! 72: At this time, GCC does not represent inlined instances of inline functions ! 73: as called for by the current Dwarf draft specification. Support for inlined ! 74: instances of inline functions is still "under construction". ! 75: ! 76: -------------------------------- ! 77: ! 78: At this time, GCC does not generate the kind of really precise information ! 79: about the exact declared types of entities with signed integral types which ! 80: is required by the current Dwarf draft specification. ! 81: ! 82: Specifically, the current Dwarf draft specification seems to require that ! 83: the type of an non-unsigned integral bit-field member of a struct or union ! 84: type be represented as either a "signed" type or as a "plain" type, ! 85: depending upon the the exact set of keywords that were used in the ! 86: type specification for the given bit-field member. It was felt (by the ! 87: UI/PLSIG) that this distinction between "plain" and "signed" integral types ! 88: could have some significance (in the case of bit-fields) because ANSI C ! 89: does not constrain the signedness of a plain bit-field, whereas it does ! 90: constrain the signedness of an explicitly "signed" bit-field. For this ! 91: reason, the current Dwarf specification calls for compilers to produce ! 92: type information (for *all* integral typed entities... not just bit-fields) ! 93: which explicitly indicates the signedness of the relevant type to be ! 94: "signed" or "plain" or "unsigned". ! 95: ! 96: Unfortunately, the GNU Dwarf implementation is currently incapable of making ! 97: such distinctions. ! 98: ! 99: -------------------------------- ! 100: ! 101: Full Dwarf support for the GNU C++ language/front-end (aka g++) is not ! 102: implemented at this time. ! 103: ! 104: -------------------------------- ! 105: ! 106: ! 107: Known Interoperability Problems ! 108: ------------------------------- ! 109: ! 110: Although the GNU implementation of Dwarf conforms (for the most part) with ! 111: the current UI/PLSIG Dwarf draft specification, there are a few known cases ! 112: where GCC's Dwarf output causes confusion in System V Release 4 SDB debuggers ! 113: anyway. There cases are described in this section. ! 114: ! 115: -------------------------------- ! 116: ! 117: The current Dwarf draft specification includes the fundamental type codes ! 118: FT_ext_prec_float, FT_complex, FT_dbl_prec_complex, and FT_ext_prec_complex. ! 119: Since GNU C is only a C compiler (and since C doesn't provide any "complex" ! 120: data types) the only one of these fundamental type codes which GCC ever ! 121: generates is FT_ext_prec_float. This fundamental type code is generated ! 122: by GCC for the `long double' data type. Unfortunately, due to an apparent ! 123: bug, SVR4 SDB can become very confused wherever any attempt is made to ! 124: print a variable, parameter, or field whose type was given in terms of ! 125: FT_ext_prec_float. ! 126: ! 127: (Actually, SVR4 SDB fails to understand *any* of the four fundamental type ! 128: codes mentioned here. This will fact will cause additional problems when ! 129: there is a GNU FORTRAN front-end.) ! 130: ! 131: -------------------------------- ! 132: ! 133: In general, it appears that SVR4 SDB is not able to effectively ignore ! 134: fundamental type codes in the "implementation defined" range. This can ! 135: cause problems when a program being debugged uses the `long long' data ! 136: type (or the signed or unsigned varieties thereof) because these types ! 137: are not defined by ANSI C, and thus, GCC must use its own private fundamental ! 138: type codes (from the implementation-defined range) to represent these types. ! 139: ! 140: -------------------------------- ! 141: ! 142: ! 143: General GNU Dwarf extensions ! 144: ---------------------------- ! 145: ! 146: In the current Dwarf draft specification, no provision is made for providing ! 147: accurate information about executable lines which came into the current ! 148: compilation unit by way of an include file. ! 149: ! 150: Recently, a scheme for providing accurate information about code in include ! 151: files was proposed (by me) to the UI/PLSIG. This scheme was rejected by the ! 152: UI/PLSIG for inclusion into the Dwarf Version 1 specification, but GNU Dwarf ! 153: implements this extension anyway. ! 154: ! 155: To understand this GNU Dwarf extension, imagine that the sequence of entries ! 156: in the .lines section is broken up into several subsections. Each contiguous ! 157: sequence of .line entries which relates to a sequence of lines (or statements) ! 158: from one particular file (either a `base' file or an `include' file) could ! 159: be called a `line entries chunk' (LEC). ! 160: ! 161: For each LEC there is one entry in the .debug_srcinfo section. ! 162: ! 163: Each normal entry in the .debug_srcinfo section consists of two 4-byte ! 164: words of data as follows: ! 165: ! 166: (1) The starting address (relative to the entire .line section) ! 167: of the first .line entry in the relevant LEC. ! 168: ! 169: (2) The starting address (relative to the entire .debug_sfnames ! 170: section) of a NUL terminated string representing the ! 171: relevant filename. (This filename name be either a ! 172: relative or an absolute filename, depending upon how the ! 173: given source file was located during compilation.) ! 174: ! 175: Obviously, each .debug_srcinfo entry allows you to find the relevant filename, ! 176: and it also points you to the first .line entry that was generated as a result ! 177: of having compiled a given source line from the given source file. ! 178: ! 179: Each subsequent .line entry should also be assumed to have been produced ! 180: as a result of compiling yet more lines from the same file. The end of ! 181: any given LEC is easily found by looking at the first 4-byte pointer in ! 182: the *next* .debug_srcinfo entry. That next .debug_srcinfo entry points ! 183: to a new and different LEC, so the preceeding LEC (implicitly) must have ! 184: ended with the last .line section entry which occurs at the 2 1/2 words ! 185: just before the address given in the first pointer of the new .debug_srcinfo ! 186: entry. ! 187: ! 188: The following picture may help to clarify this feature. Let's assume that ! 189: `LE' stands for `.line entry'. Also, assume that `* 'stands for a pointer. ! 190: ! 191: ! 192: .line section .debug_srcinfo section .debug_sfnames section ! 193: ---------------------------------------------------------------- ! 194: ! 195: LE <---------------------- * ! 196: LE * -----------------> "foobar.c" <--- ! 197: LE | ! 198: LE | ! 199: LE <---------------------- * | ! 200: LE * -----------------> "foobar.h" <| | ! 201: LE | | ! 202: LE | | ! 203: LE <---------------------- * | | ! 204: LE * -----------------> "inner.h" | | ! 205: LE | | ! 206: LE <---------------------- * | | ! 207: LE * ------------------------------- | ! 208: LE | ! 209: LE | ! 210: LE | ! 211: LE | ! 212: LE <---------------------- * | ! 213: LE * ----------------------------------- ! 214: LE ! 215: LE ! 216: LE ! 217: ! 218: In effect, each entry in the .debug_srcinfo section points to *both* a ! 219: filename (in the .debug_sfnames section) and to the start of a block of ! 220: consecutive LEs (in the .line section). ! 221: ! 222: Note that just like in the .line section, there are specialized first and ! 223: last entries in the .debug_srcinfo section for each object file. These ! 224: special first and last entries for the .debug_srcinfo section are very ! 225: different from the normal .debug_srcinfo section entries. They provide ! 226: additional information which may be helpful to a debugger when it is ! 227: interpreting the data in the .debug_srcinfo, .debug_sfnames, and .line ! 228: sections. ! 229: ! 230: The first entry in the .debug_srcinfo section for each compilation unit ! 231: consists of five 4-byte words of data. The contents of these five words ! 232: should be interpreted (by debuggers) as follows: ! 233: ! 234: (1) The starting address (relative to the entire .line section) ! 235: of the .line section for this compilation unit. ! 236: ! 237: (2) The starting address (relative to the entire .debug_sfnames ! 238: section) of the .debug_sfnames section for this compilation ! 239: unit. ! 240: ! 241: (3) The starting address (in the execution virtual address space) ! 242: of the .text section for this compilation unit. ! 243: ! 244: (4) The ending address plus one (in the execution virtual address ! 245: space) of the .text section for this compilation unit. ! 246: ! 247: (5) The date/time (in seconds since midnight 1/1/70) at which the ! 248: compilation of this compilation unit occured. This value ! 249: should be interpreted as an unsigned quantity because gcc ! 250: might be configured to generate a default value of 0xffffffff ! 251: in this field (in cases where it is desired to have object ! 252: files created at different times from identical source files ! 253: be byte-for-byte identical). ! 254: ! 255: Note that the first string placed into the .debug_sfnames section for each ! 256: compilation unit is the name of the directory in which compilation occured. ! 257: This string ends with a `/' (to help indicate that it is the pathname of a ! 258: directory). Thus, the second word of each specialized initial .debug_srcinfo ! 259: entry for each compilation unit may be used as a pointer to the (string) ! 260: name of the compilation directory, and that string may in trun be used to ! 261: "absolutize" any relative pathnames which may appear later on in the ! 262: .debug_sfnames section entries for the same compilation unit. ! 263: ! 264: The fifth and last word of each specialized starting entry for a compilation ! 265: unit in the .debug_srcinfo section indicates the date/time of compilation, ! 266: and this may be used (by the debugger) to determine if any of the source ! 267: files which contributed code to this compilation unit are newer than the ! 268: object code for the compilation unit itself. If so, the debugger may wish ! 269: to print an "out-of-date" warning about the compilation unit. ! 270: ! 271: The .debug_srcinfo section associated with each compilation will also have ! 272: a specialized terminating entry. This terminating .debug_srcinfo section ! 273: entry will consist of the following two 4-byte words of data: ! 274: ! 275: (1) The offset, measured from the start of the .line section to ! 276: the beginning of the terminating entry for the .line section. ! 277: ! 278: (2) A word containing the value 0xffffffff. ! 279: ! 280: -------------------------------- ! 281: ! 282: In the current Dwarf draft specification, no provision is made for recording ! 283: any information about macro definitions and un-definitions. ! 284: ! 285: Recently, a scheme for providing accurate information about macro definitions ! 286: an un-definitions was proposed (by me) to the UI/PLSIG. This scheme was ! 287: rejected by the UI/PLSIG for inclusion into the Dwarf Version 1 specification, ! 288: but GNU Dwarf implements this extension anyway (when the -g3 option is used). ! 289: ! 290: GCC records information about macro definitions and undefinitions primarily ! 291: in a section called the .debug_macinfo section. Normal entries in the ! 292: .debug_macinfo section consist of the following three parts: ! 293: ! 294: (1) A special "type" byte. ! 295: ! 296: (2) A 3-byte line-number/filename-offset field. ! 297: ! 298: (3) A NUL terminated string. ! 299: ! 300: The interpretation of the second and third parts is dependent upon the ! 301: value of the leading (type) byte. ! 302: ! 303: The type byte may have one of four values depending upon the type of the ! 304: .debug_macinfo entry which follows. The 1-byte MACINFO type codes presently ! 305: used, and their meanings are as follows: ! 306: ! 307: MACINFO_start A base file or an include file starts here. ! 308: MACINFO_resume The current base or include file ends here. ! 309: MACINFO_define A #define directive occurs here. ! 310: MACINFO_undef A #undef directive occur here. ! 311: ! 312: (Note that the MACINFO_... codes mentioned here are simply symbolic names ! 313: for constants which are defined in the GNU dwarf.h file.) ! 314: ! 315: For MACINFO_define and MACINFO_undef entries, the second (3-byte) field ! 316: contains the number of the source line (relative to the start of the current ! 317: base source file or the current include files) when the #define or #undef ! 318: directive appears. For a MACINFO_define entry, the following string field ! 319: contains the name of the macro which is defined, followed by its definition. ! 320: Note that the definition is always separated from the name of the macro ! 321: by at least one whitespace character. For a MACINFO_undef entry, the ! 322: string which follows the 3-byte line number field contains just the name ! 323: of the macro which is being undef'ed. ! 324: ! 325: For a MACINFO_start entry, the 3-byte field following the type byte contains ! 326: the offset, relative to the start of the .debug_sfnames section for the ! 327: current compilation unit, of a string which names the new source file which ! 328: is beginning its inclusion at this point. Following that 3-byte field, ! 329: each MACINFO_start entry always contains a zero length NUL terminated ! 330: string. ! 331: ! 332: For a MACINFO_resume entry, the 3-byte field following the type byte contains ! 333: the line number WITHIN THE INCLUDING FILE at which the inclusion of the ! 334: current file (whose inclusion ends here) was initiated. Following that ! 335: 3-byte field, each MACINFO_resume entry always contains a zero length NUL ! 336: terminated string. ! 337: ! 338: Each set of .debug_macinfo entries for each compilation unit is terminated ! 339: by a special .debug_macinfo entry consisting of a 4-byte zero value followed ! 340: by a single NUL byte. ! 341: ! 342: -------------------------------- ! 343: ! 344: In the current Dwarf draft specification, no provision is made for providing ! 345: a separate level of (limited) debugging information necessary to support ! 346: tracebacks (only) through fully-debugged code (e.g. code in system libraries). ! 347: ! 348: Recently, a proposal to define such a level was submitted (by me) to the ! 349: UI/PLSIG. This proposal was rejected by the UI/PLSIG for inclusion into ! 350: the Dwarf Version 1 specification because it was felt that the issues ! 351: involved in supporting a "traceback only" subset of dwarf were not yet ! 352: well understood. Nonetheless, the GNU implementation of Dwarf provides ! 353: this extension anyway (when the -g1 option is used). ! 354: ! 355: -------------------------------- ! 356: ! 357: ! 358: GNU Dwarf Representation of GNU C Extensions to ANSI C ! 359: ------------------------------------------------------ ! 360: ! 361: The file dwarfout.c has been designed and implemented so as to provide ! 362: some reasonable Dwarf representation for each and every declarative ! 363: construct which is accepted by the GNU C compiler. Since the GNU C ! 364: compiler accepts a superset of ANSI C, this means that there are some ! 365: cases in which the Dwarf information produced by GCC must take some ! 366: liberties in improvising Dwarf representations for declarations which ! 367: are only valid in (extended) GNU C. ! 368: ! 369: In particular, GNU C provides at least three significant extensions to ! 370: ANSI C when it comes to declarations. These are (1) inline functions, ! 371: and (2) dynamic arrays, and (3) incomplete enum types. (See the GCC ! 372: manual for more information on these GNU extensions to ANSI C.) When ! 373: used, these GNU C extensions are represented (in the generated Dwarf ! 374: output of GCC) in the most natural and intutively obvious ways. ! 375: ! 376: In the case of inline functions, the Dwarf representation is exactly as ! 377: called for (in the current UI/PLSIG Dwarf draft specification) for an ! 378: identical function written in C++; i.e. we "reuse" the representation ! 379: of inline functions defined for C++ to support this GNU C extension. ! 380: ! 381: In the case of dynamic arrays, we use the most obvious representational ! 382: mechanism available; i.e. an array type in which the upper bound of ! 383: some dimension (usually the first and only dimension) is a variable ! 384: rather than a constant. See the UI/PLSIG Dwarf draft specification ! 385: for more details. ! 386: ! 387: In the case of incomplete enum types, such types are represented simply ! 388: as TAG_enumeration_type DIEs which DO NOT contain either AT_byte_size ! 389: attributes or AT_element_list attributes. ! 390: ! 391: -------------------------------- ! 392: ! 393: ! 394: Future Directions ! 395: ----------------- ! 396: ! 397: The codes, formats, and other paraphernalia necessary to provide proper ! 398: support for symbolic debugging for the C++ language have now been defined ! 399: and accepted by the UI/PLSIG. Support for C++ (i.e. the g++ front-end) ! 400: in dwarfout.c has not been fully implemented yet however. ! 401: ! 402: Likewise, the UI/PLSIG has defined what is believed to be a complete and ! 403: sufficient set of codes and rules for adequately representing all of ! 404: FORTRAN 77, and most of Fortran 90 in Dwarf. While some support for ! 405: this has been implemented in dwarfout.c, further implementation and ! 406: testing will have to await the arrival of the GNU Fortran front-end. ! 407: ! 408: Dwarf support for other languages (i.e. Pascal and Modula) currently has ! 409: a number of known problems as far as the current UI/PLSIG Dwarf draft ! 410: specification is concerned. Hopefully, A more complete form of Dwarf ! 411: which can handle *all* of the symbolic debugging requirements for Pascal, ! 412: Modula, and Ada will evolve in the future. Efforts are currently underway ! 413: to develop Dwarf more fully for these and other languages under the auspices ! 414: of the UI/PLSIG. Contact the Chairman, Dan Oldman <[email protected]> ! 415: for further information. ! 416: ! 417: As currently defined, Dwarf only describes a (binary) language which can ! 418: be used to communicate symbolic debugging information from a compiler ! 419: through an assembler and a linker, to a debugger. There is no clear ! 420: specification of what processing should be (or must be) done by the ! 421: assembler and/or the linker. Fortunately, the role of the assembler ! 422: is easily inferred (by anyone knowledgeable about assemblers) just by ! 423: looking at examples of assembly-level Dwarf code. Sadly though, the ! 424: allowable (or required) processing steps performed by a linker are ! 425: harder to infer and (perhaps) even harder to agree upon. There are ! 426: several forms of very useful `post-processing' steps which intelligent ! 427: linkers *could* (in theory) perform on object files containing Dwarf, ! 428: but any and all such link-time transformations are currently both disallowed ! 429: and unspecified. ! 430: ! 431: In particular, possible link-time transformations of Dwarf code which could ! 432: provide significant benefits include (but are not limited to): ! 433: ! 434: Commonization of duplicate DIEs obtained from multiple input ! 435: (object) files. ! 436: ! 437: Cross-compilation type checking based upon Dwarf type information ! 438: for objects and functions. ! 439: ! 440: Other possible `compacting' transformations designed to save disk ! 441: space and to reduce linker & debugger I/O activity.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.