NTT DOCOMO, INC - Fix for Bug 2917 - svphostfs filesystem doesn't return UID details for RFs:Entry
\."\." the following line may be removed if the ff ligature works on your machine.lg 0\." set up heading formats.ds HF 3 3 3 3 3 2 2.ds HP +2 +2 +1 +0 +0.nr Hs 5.nr Hb 5\." ==============================================\." Put current date in the following at each rev.ds vE rev 1.66, 04 July 2007\." ==============================================\." ==============================================.ds | |.ds ~ ~.ds ' '.if t .ds Cw \&\f(CW.if n .ds Cw \fB.de Cf \" Place every other arg in Cw font, beginning with first.if \\n(.$=1 \&\*(Cw\\$1\fP.if \\n(.$=2 \&\*(Cw\\$1\fP\\$2.if \\n(.$=3 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP.if \\n(.$=4 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4.if \\n(.$=5 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP.if \\n(.$=6 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6.if \\n(.$=7 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6\*(Cw\\$7\fP.if \\n(.$=8 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6\*(Cw\\$7\fP\\$8.if \\n(.$=9 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6\*(Cw\\$7\fP\\$8\*(Cw...nr Cl 4.SA 1.TLA Consumer Library Interface to DWARF .AF "".AU "David Anderson".PF "'\*(vE'- \\\\nP -''".AS 1This document describes an interface to a library of functions.FS UNIX is a registered trademark of UNIX System Laboratories, Inc.in the United States and other countries..FEto access DWARF debugging information entries and DWARF line numberinformation (and other DWARF2/3 information). It does not make recommendations as to how the functionsdescribed in this document should be implemented nor does itsuggest possible optimizations. .PThe document is oriented to reading DWARF version 2 and version 3.There are certain sections which are SGI-specific (thoseare clearly identified in the document)..P\*(vE.AE.MT 4.H 1 "INTRODUCTION"This document describes an interface to \fIlibdwarf\fP, alibrary of functions to provide access to DWARF debugging informationrecords, DWARF line number information, DWARF address range and global names information, weak names information, DWARF frame description information, DWARF static function names, DWARF static variables, and DWARF type information..PThe document has long mentioned the "Unix International Programming Languages Special Interest Group" (PLSIG), under whose auspices theDWARF committtee was formed around 1991."Unix International" was disbanded in the 1990's and no longer exists..PThe DWARF committee published DWARF2 July 27, 1993..PIn the mid 1990's this document and the library it describes(which the committee never endorsed, having decidednot to endorse or approve any particular library interface)was made available on the internet by Silcon Graphics, Inc..PIn 2005 the DWARF committee began an affiliation with FreeStandards.org.In 2007 FreeStandards.org merged with The Linux Foundation.The DWARF committee dropped its affiliation with FreeStandards.orgin 2007 and established the dwarfstd.org website.See "http://www.dwarfstd.org" for currentinformation on standardization activities and a copy of the standard..H 2 "Copyright"Copyright 1993-2006 Silicon Graphics, Inc.Copyright 2007 David Anderson. Permission is hereby granted to copy or republish or use any or all of this document withoutrestriction except that when publishing more than a small amountof the documentplease acknowledge Silicon Graphics, Inc and David Anderson.This document is distributed in the hope that it would be useful, butWITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .P.H 2 "Purpose and Scope"The purpose of this document is to document a library of functions to access DWARF debugging information. There is no effort made in this document to address the creation of these records as thoseissues are addressed separately (see "A Producer Library Interface to DWARF")..PAdditionally, the focus of this document is the functional interface,and as such, implementation as well as optimization issues areintentionally ignored..H 2 "Document History".PA document was written about 1991 which had similarlayout and interfaces. Written by people from Hal Corporation,That document described a library for reading DWARF1.The authors distributed paper copies to the committeewith the clearly expressed intent to propose the document asa supported interface definition.The committee decided not to pursue a library definition..PSGI wrote the document you are now reading in 1993with a similar layout and content and organization, but it was complete document rewrite with the intent to read DWARF2(the DWARF version then in existence).The intent was (and is) to also coverfuture revisions of DWARF.All the function interfaces were changed in 1994 to uniformlyreturn a simple integer success-code (see DW_DLV_OK etc), generally followingthe recomendations in the chapter titled "Candy Machine Interfaces"of "Writing Solid Code", a book bySteve Maguire (published by Microsoft Press)..H 2 "Definitions"DWARF debugging information entries (DIEs) are the segments of information placed in the \f(CW.debug_*\fP sections by compilers, assemblers, and linkage editors that, in conjunction with line number entries, are necessary for symbolic source-level debugging. Refer to the latest"\fIDWARF Debugging Information Format\fP" from www.dwarfstd.org for a more complete description of these entries..PThis document adopts all the terms and definitions in "\fIDWARF Debugging Information Format\fP" versions 2 and 3. It originally focused on the implementation atSilicon Graphics, Inc., but nowattempts to be more generally useful..H 2 "Overview"The remaining sections of this document describe the proposed interfaceto \f(CWlibdwarf\fP, first by describing the purpose of additional typesdefined by the interface, followed by descriptions of the available operations. This document assumes you are thoroughly familiar with the information contained in the \fIDWARF Debugging Information Format\fP document. .PWe separate the functions into several categories to emphasize that not all consumers want to use all the functions. We call the categories Debugger, Internal-level, High-level, and Miscellaneous not because one is more important than another but as a way of making the rather large set of function calls easier to understand..PUnless otherwise specified, all functions and structures should betaken as being designed for Debugger consumers..PThe Debugger Interface of this library is intended to be used by debuggers. The interface is low-level (close to dwarf) but suppresses irrelevant detail.A debugger will want to absorb all of some sections at startup and will want to see little or nothing of some sections except at need. And even then will probably want to absorb only the information in a single compilation unit at a time. A debugger does not care aboutimplementation details of the library..PThe Internal-level Interface is for a DWARF prettyprinter and checker. A thorough prettyprinter will want to know all kinds of internal things (like actual FORM numbers and actual offsets) so it can check for appropriate structure in the DWARF data and print (on request) all that internal information for human users and libdwarf authors and compiler-writers. Calls in this interface provide data a debugger does not care about..PThe High-level Interface is for higher level access(it's not really a high level interface!). Programs such as disassemblers will want to be able to display relevant information about functions and line numbers without having to invest too much effort in looking at DWARF..PThe miscellaneous interface is just what is left over: the error handler functions..PThe following is a brief mention of the changes in this libdwarf from the libdwarf draft for DWARF Version 1 and recent changes..H 2 "Items Changed".PAdded support for various DWARF3 features, but primarilya new frame-information interface tailorable at run-timeto more than a single ABI.See dwarf_set_frame_rule_inital_value() and dwarf_set_frame_rule_table_size().See also dwarf_get_fde_info_for_reg3() anddwarf_get_fde_info_for_cfa_reg3(). (April 2006).PAdded support for DWARF3 .debug_pubtypes section.Corrected various leaks (revising dealloc() calls, addingnew functions) and corrected dwarf_formstring() documentation..P Added dwarf_srclines_dealloc() as the previous deallocationmethod documented for data returned bydwarf_srclines() was incapable of freeingall the allocated storage (14 July 2005)..Pdwarf_nextglob(), dwarf_globname(), and dwarf_globdie() were all changed to operate on the items in the .debug_pubnames section..PAll functions were modified to return solely an error code.Data is returned through pointer arguments.This makes writing safe and correct library-using-code far easier.For justification for this approach, see the book bySteve Maguire titled "Writing Solid Code" at your bookstore..H 2 "Items Removed".PDwarf_Typewas removed since types are no longer special..Pdwarf_typeof()was removed since types are no longer special..PDwarf_Ellistwas removed since element lists no longer are a special format..PDwarf_Boundswas removed since bounds have been generalized..Pdwarf_nextdie()was replaced by dwarf_next_cu_header() to reflect thereal way DWARF is organized.The dwarf_nextdie() was only useful for getting to compilationunit beginnings, so it does not seem harmful to remove it in favorof a more direct function..Pdwarf_childcnt() is removed on groundsthat no good use was apparent..Pdwarf_prevline() and dwarf_nextline() were removed on grounds thisis better left to a debugger to do.Similarly, dwarf_dieline() was removed..Pdwarf_is1stline() was removed as it was not meaningful for therevised DWARF line operations..PAny libdwarf implementation might well decide to support all theremoved functionality and to retain the DWARF Version 1 meaningsof that functionality. This would be difficult because theoriginal libdwarf draftspecification used traditional C library interfaces whichconfuse the values returned by successful calls withexceptional conditions like failures and 'no more data' indications..H 2 "Revision History".VL 15.LI "March 93"Work on DWARF2 SGI draft begins.LI "June 94"The function returns are changed to return an error/success codeonly..LI "April 2006:Support for DWARF3 consumer operations is close to completion..LE.H 1 "Types Definitions".H 2 "General Description"The \fIlibdwarf.h\fP header file contains typedefs and preprocessor definitions of types and symbolic names used to reference objects of \fIlibdwarf\fP. The types defined by typedefs contained in \fIlibdwarf.h\fP all use the convention of adding \f(CWDwarf_\fP as a prefix and can be placed in three categories: .BL.LIScalar types : The scalar types defined in \fIlibdwarf.h\fP aredefined primarily for notational convenience and identification.Depending on the individual definition, they are interpreted as a value, a pointer, or as a flag..LIAggregate types : Some values can not be represented by a single scalar type; they must be represented by a collection of, or as a union of, scalar and/or aggregate types. .LIOpaque types : The complete definition of these types is intentionallyomitted; their use is as handles for query operations, which will yieldeither an instance of another opaque type to be used in another query, or an instance of a scalar or aggregate type, which is the actual result..P.H 2 "Scalar Types"The following are the defined by \fIlibdwarf.h\fP:.DS\f(CWtypedef int Dwarf_Bool;typedef unsigned long long Dwarf_Off;typedef unsigned long long Dwarf_Unsigned;typedef unsigned short Dwarf_Half;typedef unsigned char Dwarf_Small;typedef signed long long Dwarf_Signed;typedef unsigned long long Dwarf_Addr;typedef void *Dwarf_Ptr;typedef void (*Dwarf_Handler)(Dwarf_Error *error, Dwarf_Ptr errarg);.DE.nr aX \n(Fg+1Dwarf_Ptr is an address for use by the host program calling the library,not for representing pc-values/addresses within the target object file.Dwarf_Addr is for pc-values within the target object file. The sample scalar type assignments above are for a \fIlibdwarf.h\fP that can read and write32-bit or 64-bit binaries on a 32-bit or 64-bit host machine.The types must be defined appropriatelyfor each implementation of libdwarf.A description of these scalar types in the SGI/MIPSenvironment is given in Figure \n(aX..DS.TScenter box, tab(:);lfB lfB lfB lfBl c c l.NAME:SIZE:ALIGNMENT:PURPOSE_Dwarf_Bool:4:4:Boolean statesDwarf_Off:8:8:Unsigned file offsetDwarf_Unsigned:8:8:Unsigned large integerDwarf_Half:2:2:Unsigned medium integerDwarf_Small:1:1:Unsigned small integerDwarf_Signed:8:8:Signed large integerDwarf_Addr:8:8:Program address:::(target program)Dwarf_Ptr:4|8:4|8:Dwarf section pointer :::(host program)Dwarf_Handler:4|8:4|8:Pointer to:::error handler function .TE.FG "Scalar Types".DE.H 2 "Aggregate Types"The following aggregate types are defined by \fIlibdwarf.h\fP:\f(CWDwarf_Loc\fP,\f(CWDwarf_Locdesc\fP,\f(CWDwarf_Block\fP, \f(CWDwarf_Frame_Op\fP. \f(CWDwarf_Regtable\fP. \f(CWDwarf_Regtable3\fP. While most of \f(CWlibdwarf\fP acts on or returns simple values oropaque pointer types, this small set of structures seems useful..H 3 "Location Record"The \f(CWDwarf_Loc\fP type identifies a single atom of a location descriptionor a location expression..DS\f(CWtypedef struct { Dwarf_Small lr_atom; Dwarf_Unsigned lr_number; Dwarf_Unsigned lr_number2; Dwarf_Unsigned lr_offset; } Dwarf_Loc;\fP.DEThe \f(CWlr_atom\fP identifies the atom corresponding to the \f(CWDW_OP_*\fP definition in \fIdwarf.h\fP and it represents the operation to be performed in order to locate the item in question..PThe \f(CWlr_number\fP field is the operand to be used in the calculationspecified by the \f(CWlr_atom\fP field; not all atoms use this field.Some atom operations imply signed numbers so it is necessary to cast this to a \f(CWDwarf_Signed\fP type for those operations..PThe \f(CWlr_number2\fP field is the second operand specified by the \f(CWlr_atom\fP field; only \f(CWDW_OP_BREGX\fP has this field. Some atom operations imply signed numbers so it may be necessary to cast this to a \f(CWDwarf_Signed\fP type for those operations..PThe \f(CWlr_offset\fP field is the byte offset (within the block the location record came from) of the atom specified by the \f(CWlr_atom\fP field. This is set on all atoms. This is useful for operations \f(CWDW_OP_SKIP\fP and \f(CWDW_OP_BRA\fP..H 3 "Location Description"The \f(CWDwarf_Locdesc\fP type represents an ordered list of \f(CWDwarf_Loc\fP records used in the calculation to locate an item. Note that in many cases, the location can only be calculated at runtime of the associated program..DS\f(CWtypedef struct { Dwarf_Addr ld_lopc; Dwarf_Addr ld_hipc; Dwarf_Unsigned ld_cents; Dwarf_Loc* ld_s;} Dwarf_Locdesc;\fP.DEThe \f(CWld_lopc\fP and \f(CWld_hipc\fP fields provide an address range forwhich this location descriptor is valid. Both of these fields are set to\fIzero\fP if the location descriptor is valid throughout the scope of theitem it is associated with. These addresses are virtual memory addresses, not offsets-from-something. The virtual memory addresses do not account for dso movement (none of the pc values from libdwarf do that, it is up to the consumer to do that)..PThe \f(CWld_cents\fP field contains a count of the number of \f(CWDwarf_Loc\fP entries pointed to by the \f(CWld_s\fP field..PThe \f(CWld_s\fP field points to an array of \f(CWDwarf_Loc\fP records. .H 3 "Data Block".SPThe \f(CWDwarf_Block\fP type is used to contain the value of an attributewhose form is either \f(CWDW_FORM_block1\fP, \f(CWDW_FORM_block2\fP, \f(CWDW_FORM_block4\fP, \f(CWDW_FORM_block8\fP, or \f(CWDW_FORM_block\fP.Its intended use is to deliver the value for an attribute of any of these forms..DS\f(CWtypedef struct { Dwarf_Unsigned bl_len; Dwarf_Ptr bl_data;} Dwarf_Block;\fP.DE.PThe \f(CWbl_len\fP field contains the length in bytes of the data pointedto by the \f(CWbl_data\fP field. .PThe \f(CWbl_data\fP field contains a pointer to the uninterpreted data.Since we use a \f(CWDwarf_Ptr\fP here one must copy the pointer to some other type (typically an \f(CWunsigned char *\fP) so one can add increments to index through the data. The data pointed to by \f(CWbl_data\fP is not necessarily at any useful alignment..H 3 "Frame Operation Codes: DWARF 2"This interface is adequate for DWARF2 but not for DWARF3.A separate interface usable for DWARF3 and for DWARF2 is described below..PThe DWARF2 \f(CWDwarf_Frame_Op\fP type is used to contain the data of a singleinstruction of an instruction-sequence of low-level information from the section containing frame information. This is ordinarily used by Internal-level Consumers trying to print everything in detail..DS\f(CWtypedef struct { Dwarf_Small fp_base_op; Dwarf_Small fp_extended_op; Dwarf_Half fp_register; Dwarf_Signed fp_offset; Dwarf_Offset fp_instr_offset;} Dwarf_Frame_Op;.DE\f(CWfp_base_op\fP is the 2-bit basic op code. \f(CWfp_extended_op\fP is the 6-bit extended opcode (if \f(CWfp_base_op\fP indicated there was an extended op code) and is zero otherwise..P\f(CWfp_register\fP is any (or the first) register value as definedin the \f(CWCall Frame Instruction Encodings\fP figurein the \f(CWdwarf\fP document.If not used with the Op it is 0..P\f(CWfp_offset\fPis the address, delta, offset, or second register as definedin the \f(CWCall Frame Instruction Encodings\fP figurein the \f(CWdwarf\fP document.If this is an \f(CWaddress\fP then the value should be cast to\f(CW(Dwarf_Addr)\fP before being used.In any implementation this field *must* be as large as thelarger of Dwarf_Signed and Dwarf_Addr for this to work properly.If not used with the op it is 0..P\f(CWfp_instr_offset\fP is the byte_offset (within the instructionstream of the frame instructions) of this operation. It starts at 0for a given frame descriptor..H 3 "Frame Regtable: DWARF 2"This interface is adequate for DWARF2 but not for DWARF3.A separate interface usable for DWARF3 and for DWARF2 is described below..PThe \f(CWDwarf_Regtable\fP type is used to contain the register-restore information for all registers at a givenPC value.Normally used by debuggers..DS/* DW_REG_TABLE_SIZE must reflect the number of registers *(DW_FRAME_LAST_REG_NUM) as defined in dwarf.h */#define DW_REG_TABLE_SIZE <fill in size here, 66 for MIPS/IRIX>\f(CWtypedef struct { struct { Dwarf_Small dw_offset_relevant; Dwarf_Half dw_regnum; Dwarf_Addr dw_offset; } rules[DW_REG_TABLE_SIZE];} Dwarf_Regtable;\fP.DE.PThe array is indexed by register number.The field values for each index are described next.For clarity we describe the field values for index rules[M](M being any legal array element index)..P\f(CWdw_offset_relevant\fP is non-zero to indicate the \f(CWdw_offset\fPfield is meaningful. If zero then the \f(CWdw_offset\fP is zeroand should be ignored..P\f(CWdw_regnum \fPis the register number\fP applicable.If \f(CWdw_offset_relevant\fP is zero, then this is the registernumber of the register containing the value for register M.If \f(CWdw_offset_relevant\fP is non-zero, then this isthe register number of the register to use as a base (M may beDW_FRAME_CFA_COL, for example) and the \f(CWdw_offset\fPvalue applies. The value of register M is thereforethe value of register \f(CWdw_regnum\vP ..P\f(CWdw_offset\fP should be ignored if \f(CWdw_offset_relevant\fP is zero.If \f(CWdw_offset_relevant\fP is non-zero, then the consumer code should add the value tothe value of the register \f(CWdw_regnum\fP to produce thevalue. .H 3 "Frame Operation Codes: DWARF 3 (and DWARF2)"This interface is adequate for DWARF3 and for DWARF2.It is new in libdwarf in April 2006..PThe DWARF2 \f(CWDwarf_Frame_Op3\fP type is used to contain the data of a singleinstruction of an instruction-sequence of low-level information from the section containing frame information. This is ordinarily used by Internal-level Consumers trying to print everything in detail..DS\f(CWtypedef struct { Dwarf_Small fp_base_op; Dwarf_Small fp_extended_op; Dwarf_Half fp_register; /* Value may be signed, depends on op. Any applicable data_alignment_factor has not been applied, this is the raw offset. */ Dwarf_Unsigned fp_offset_or_block_len; Dwarf_Small *fp_expr_block; Dwarf_Off fp_instr_offset;} Dwarf_Frame_Op3;\fP.DE\f(CWfp_base_op\fP is the 2-bit basic op code. \f(CWfp_extended_op\fP is the 6-bit extended opcode (if \f(CWfp_base_op\fP indicated there was an extended op code) and is zero otherwise..P\f(CWfp_register\fP is any (or the first) register value as definedin the \f(CWCall Frame Instruction Encodings\fP figurein the \f(CWdwarf\fP document.If not used with the Op it is 0..P\f(CWfp_offset_or_block_len\fPis the address, delta, offset, or second register as definedin the \f(CWCall Frame Instruction Encodings\fP figurein the \f(CWdwarf\fP document. Or (depending on the op, itmay be the length of the dwarf-expression block pointed toby \f(CWfp_expr_block\fP.If this is an \f(CWaddress\fP then the value should be cast to\f(CW(Dwarf_Addr)\fP before being used.In any implementation this field *must* be as large as thelarger of Dwarf_Signed and Dwarf_Addr for this to work properly.If not used with the op it is 0..P\f(CWfp_expr_block\fP (if applicable to the op)points to a dwarf-expression block whch is \f(CWfp_offset_or_block_len\fPbytes long..P\f(CWfp_instr_offset\fP is the byte_offset (within the instructionstream of the frame instructions) of this operation. It starts at 0for a given frame descriptor..H 3 "Frame Regtable: DWARF 3"This interface is adequate for DWARF3 and for DWARF2.It is new in libdwarf as of April 2006..PThe \f(CWDwarf_Regtable3\fP type is used to contain the register-restore information for all registers at a givenPC value.Normally used by debuggers..DS\f(CWtypedef struct Dwarf_Regtable_Entry3_s { Dwarf_Small dw_offset_relevant; Dwarf_Small dw_value_type; Dwarf_Half dw_regnum; Dwarf_Unsigned dw_offset_or_block_len; Dwarf_Ptr dw_block_ptr;}Dwarf_Regtable_Entry3;typedef struct Dwarf_Regtable3_s { struct Dwarf_Regtable_Entry3_s rt3_cfa_rule; Dwarf_Half rt3_reg_table_size; struct Dwarf_Regtable_Entry3_s * rt3_rules;} Dwarf_Regtable3;\fP.DE.PThe array is indexed by register number.The field values for each index are described next.For clarity we describe the field values for index rules[M](M being any legal array element index).(DW_FRAME_CFA_COL3 DW_FRAME_SAME_VAL, DW_FRAME_UNDEFINED_VALare not legal array indexes, nor is any index < 0 or >rt3_reg_table_size);The caller of routines using thisstruct must create data space for rt3_reg_table_size entriesof struct Dwarf_Regtable_Entry3_s and arrange thatrt3_rules points to that space and that rt3_reg_table_sizeis set correctly. The caller need not (but may)initialize the contents of the rt3_cfa_rule or the rt3_rules array.The following applies to each rt3_rules rule M:.P.in +4\f(CWdw_regnum\fP is the register number applicable.If \f(CWdw_regnum\fP is DW_FRAME_UNDEFINED_VAL, then theregister I has undefined value.If \f(CWdw_regnum\fP is DW_FRAME_SAME_VAL, then theregister I has the same value as in the previous frame..PIf \f(CWdw_regnum\fP is neither of these two, then the following apply:.P.P\f(CWdw_value_type\fP determines the meaning of the other fields.It is one of DW_EXPR_OFFSET (0),DW_EXPR_VAL_OFFSET(1), DW_EXPR_EXPRESSION(2) or DW_EXPR_VAL_EXPRESSION(3)..PIf \f(CWdw_value_type\fP is DW_EXPR_OFFSET (0) thenthis is as in DWARF2 and the offset(N) rule or the register(R)ruleof the DWARF3 and DWARF2 document applies.The value is either:.in +4If \f(CWdw_offset_relevant\fP is non-zero, then \f(CWdw_regnum\fP is effectively ignored but must be identical toDW_FRAME_CFA_COL3 and the \f(CWdw_offset\fP value applies. The value of register M is thereforethe value of CFA plus the valueof \f(CWdw_offset\fP. The result of the calculationis the address in memory where the value of register M resides.This is the offset(N) rule of the DWARF2 and DWARF3 documents..P\f(CWdw_offset_relevant\fP is zero it indicates the \f(CWdw_offset\fPfield is not meaningful. The value of register M is the value currently in register \f(CWdw_regnum\fP (thevalue DW_FRAME_CFA_COL3 must not appear, only real registers).This is the register(R) rule of the DWARF3 spec..in -4.PIf \f(CWdw_value_type\fP is DW_EXPR_OFFSET (1) thenthis is the the val_offset(N) rule of the DWARF3 spec applies.The calculation is identical to that of DW_EXPR_OFFSET (0) but the value is interpreted as the value of register M(rather than the address where register M's value is stored)..PIf \f(CWdw_value_type\fP is DW_EXPR_EXPRESSION (2) thenthis is the the expression(E) rule of the DWARF3 document..P.in +4\f(CWdw_offset_or_block_len\fP is the length in bytes ofthe in-memory block pointed at by \f(CWdw_block_ptr\fP.\f(CWdw_block_ptr\fP is a DWARF expression.Evaluate that expression and the result is the addresswhere the previous value of register M is found..in -4.PIf \f(CWdw_value_type\fP is DW_EXPR_VAL_EXPRESSION (3) thenthis is the the val_expression(E) rule of the DWARF3 spec..P.in +4\f(CWdw_offset_or_block_len\fP is the length in bytes ofthe in-memory block pointed at by \f(CWdw_block_ptr\fP.\f(CWdw_block_ptr\fP is a DWARF expression.Evaluate that expression and the result is the previous value of register M..in -4.PThe rule \f(CWrt3_cfa_rule\fP is the current value ofthe CFA. It is interpreted exactly likeany register M rule (as described just above) except that \f(CWdw_regnum\fP cannot be CW_FRAME_CFA_REG3 orDW_FRAME_UNDEFINED_VAL or DW_FRAME_SAME_VAL but mustbe a real register number..in -4.H 3 "Macro Details Record"The \f(CWDwarf_Macro_Details\fP type gives information abouta single entry in the .debug.macinfo section..DS\f(CWstruct Dwarf_Macro_Details_s { Dwarf_Off dmd_offset; Dwarf_Small dmd_type; Dwarf_Signed dmd_lineno; Dwarf_Signed dmd_fileindex; char * dmd_macro;};typedef struct Dwarf_Macro_Details_s Dwarf_Macro_Details;.DE.P\f(CWdmd_offset\fP is the byte offset, within the .debug_macinfosection, of this macro information..P\f(CWdmd_type\fP is the type code of this macro info entry(or 0, the type code indicating that this is the end ofmacro information entries for a compilation unit.See \f(CWDW_MACINFO_define\fP, etc in the DWARF document..P\f(CWdmd_lineno\fP is the line number where this entry was found,or 0 if there is no applicable line number..P\f(CWdmd_fileindex\fP is the file index of the file involved.This is only guaranteed meaningful on a \f(CWDW_MACINFO_start_file\fP\f(CWdmd_type\fP. Set to -1 if unknown (see the functionalinterface for more details)..P\f(CWdmd_macro\fP is the applicable string.For a \f(CWDW_MACINFO_define\fPthis is the macro name and value.For a\f(CWDW_MACINFO_undef\fP, orthis is the macro name.For a\f(CWDW_MACINFO_vendor_ext\fPthis is the vendor-defined string value.For other \f(CWdmd_type\fPs this is 0..H 2 "Opaque Types"The opaque types declared in \fIlibdwarf.h\fP are used as descriptorsfor queries against DWARF information stored in various debugging sections. Each time an instance of an opaque type is returned as a result of a \fIlibdwarf\fP operation (\f(CWDwarf_Debug\fP excepted), it should be free'd, using \f(CWdwarf_dealloc()\fP when it is no longer of use (read the following documentation for details, as in at leastone case there is a special routine provided for deallocationand \f(CWdwarf_dealloc()\fP is not directly called: see \f(CWdwarf_srclines()\fP).Some functions return a number of instances of an opaque type in a block, by means of a pointer to the block and a count of the numberof opaque descriptors in the block:see the function description for deallocation rules for such functions.The list of opaque types defined in \fIlibdwarf.h\fP that are pertinent to the Consumer Library, and their intended use is described below..DS\f(CWtypedef struct Dwarf_Debug_s* Dwarf_Debug;\fP.DEAn instance of the \f(CWDwarf_Debug\fP type is created as a result of a successful call to \f(CWdwarf_init()\fP, or \f(CWdwarf_elf_init()\fP, and is used as a descriptor for subsequent access to most \f(CWlibdwarf\fPfunctions on that object. The storage pointed to by this descriptor should be not be free'd, using the \f(CWdwarf_dealloc()\fP function.Instead free it with \f(CWdwarf_finish()\fP..P.DS\f(CWtypedef struct Dwarf_Die_s* Dwarf_Die;\fP.DEAn instance of a \f(CWDwarf_Die\fP type is returned from a successful call to the \f(CWdwarf_siblingof()\fP, \f(CWdwarf_child\fP, or \f(CWdwarf_offdie()\fP function, and is used as a descriptor for queries about information related to that DIE. The storage pointed to by this descriptor should be free'd, using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_DIE\fP when no longer needed..DS\f(CWtypedef struct Dwarf_Line_s* Dwarf_Line;\fP.DEInstances of \f(CWDwarf_Line\fP type are returned from a successful call to the \f(CWdwarf_srclines()\fP function, and are used as descriptors for queries about source lines. The storage pointed to by these descriptorsshould be individually free'd, using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_LINE\fP when no longer needed..DS\f(CWtypedef struct Dwarf_Global_s* Dwarf_Global;\fP.DEInstances of \f(CWDwarf_Global\fP type are returned from a successful call to the \f(CWdwarf_get_globals()\fP function, and are used as descriptors for queries about global names (pubnames)..DS\f(CWtypedef struct Dwarf_Weak_s* Dwarf_Weak;\fP.DEInstances of \f(CWDwarf_Weak\fP type are returned from a successful call to the SGI-specific \f(CWdwarf_get_weaks()\fPfunction, and are used as descriptors for queries about weak names. The storage pointed to by these descriptors should be individually free'd, using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_WEAK_CONTEXT\fP (or\f(CWDW_DLA_WEAK\fP, an older name, supported for compatibility)when no longer needed..DS\f(CWtypedef struct Dwarf_Func_s* Dwarf_Func;\fP.DEInstances of \f(CWDwarf_Func\fP type are returned from a successfulcall to the SGI-specific \f(CWdwarf_get_funcs()\fPfunction, and are used as descriptors for queries about static function names. .DS\f(CWtypedef struct Dwarf_Type_s* Dwarf_Type;\fP.DEInstances of \f(CWDwarf_Type\fP type are returned from a successful call to the SGI-specific \f(CWdwarf_get_types()\fPfunction, and are used as descriptors for queries about user defined types. .DS\f(CWtypedef struct Dwarf_Var_s* Dwarf_Var;\fP.DEInstances of \f(CWDwarf_Var\fP type are returned from a successful call to the SGI-specific \f(CWdwarf_get_vars()\fPfunction, and are used as descriptors for queries about static variables. .DS\f(CWtypedef struct Dwarf_Error_s* Dwarf_Error;\fP.DEThis descriptor points to a structure that provides detailed informationabout errors detected by \f(CWlibdwarf\fP. Users typically provide alocation for \f(CWlibdwarf\fP to store this descriptor for the user toobtain more information about the error. The storage pointed to by thisdescriptor should be free'd, using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_ERROR\fP when no longer needed..DS\f(CWtypedef struct Dwarf_Attribute_s* Dwarf_Attribute;\fP.DEInstances of \f(CWDwarf_Attribute\fP type are returned from a successful call to the \f(CWdwarf_attrlist()\fP, or \f(CWdwarf_attr()\fP functions, and are used as descriptors for queries about attribute values. The storage pointed to by this descriptor should be individually free'd, using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_ATTR\fP when no longer needed..DS\f(CWtypedef struct Dwarf_Abbrev_s* Dwarf_Abbrev;\fP.DEAn instance of a \f(CWDwarf_Abbrev\fP type is returned from a successful call to \f(CWdwarf_get_abbrev()\fP, and is used as a descriptor for queries about abbreviations in the .debug_abbrev section. The storage pointed to by this descriptor should be free'd, using \f(CWdwarf_dealloc()\fP with theallocation type \f(CWDW_DLA_ABBREV\fP when no longer needed..DS\f(CWtypedef struct Dwarf_Fde_s* Dwarf_Fde;\fP.DEInstances of \f(CWDwarf_Fde\fP type are returned from a successful call to the \f(CWdwarf_get_fde_list()\fP, \f(CWdwarf_get_fde_for_die()\fP, or\f(CWdwarf_get_fde_at_pc()\fP functions, and are used as descriptors for queries about frames descriptors..DS\f(CWtypedef struct Dwarf_Cie_s* Dwarf_Cie;\fP.DEInstances of \f(CWDwarf_Cie\fP type are returned from a successful call to the \f(CWdwarf_get_fde_list()\fP function, and are used as descriptors for queries about information that is common to several frames..DS\f(CWtypedef struct Dwarf_Arange_s* Dwarf_Arange;\fP.DEInstances of \f(CWDwarf_Arange\fP type are returned from successful calls to the \f(CWdwarf_get_aranges()\fP, or \f(CWdwarf_get_arange()\fP functions, and are used as descriptors for queries about address ranges. The storage pointed to by this descriptor should be individually free'd, using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_ARANGE\fP when no longer needed..H 1 "Error Handling"The method for detection and disposition of error conditions that arise during access of debugging information via \fIlibdwarf\fP is consistentacross all \fIlibdwarf\fP functions that are capable of producing anerror. This section describes the method used by \fIlibdwarf\fP innotifying client programs of error conditions. .PMost functions within \fIlibdwarf\fP accept as an argument a pointer to a \f(CWDwarf_Error\fP descriptor where a \f(CWDwarf_Error\fP descriptor is stored if an error is detected by the function. Routines in the client program that provide this argument can query the \f(CWDwarf_Error\fP descriptor to determine the nature of the error and perform appropriate processing. .PA client program can also specify a function to be invoked upon detection of an error at the time the library is initialized (see \f(CWdwarf_init()\fP). When a \fIlibdwarf\fP routine detects an error, this function is calledwith two arguments: a code indicating the nature of the error and a pointerprovided by the client at initialization (again see \f(CWdwarf_init()\fP).This pointer argument can be used to relay information between the error handler and other routines of the client program. A client program can specify or change both the error handling function and the pointer argument after initialization using \f(CWdwarf_seterrhand()\fP and \f(CWdwarf_seterrarg()\fP..PIn the case where \fIlibdwarf\fP functions are not provided a pointerto a \f(CWDwarf_Error\fP descriptor, and no error handling function was provided at initialization, \fIlibdwarf\fP functions terminate execution by calling \f(CWabort(3C)\fP..PThe following lists the processing steps taken upon detection of anerror:.AL 1.LICheck the \f(CWerror\fP argument; if not a \fINULL\fP pointer, allocateand initialize a \f(CWDwarf_Error\fP descriptor with information describingthe error, place this descriptor in the area pointed to by \f(CWerror\fP,and return a value indicating an error condition..LIIf an \f(CWerrhand\fP argument was provided to \f(CWdwarf_init()\fPat initialization, call \f(CWerrhand()\fP passing it the error descriptorand the value of the \f(CWerrarg\fP argument provided to \f(CWdwarf_init()\fP. If the error handling function returns, return a value indicating an error condition..LITerminate program execution by calling \f(CWabort(3C)\fP..LE.SPIn all cases, it is clear from the value returned from a function that an error occurred in executing the function, sinceDW_DLV_ERROR is returned..PAs can be seen from the above steps, the client program can providean error handler at initialization, and still provide an \f(CWerror\fPargument to \fIlibdwarf\fP functions when it is not desired to havethe error handler invoked..PIf a \f(CWlibdwarf\fP function is called with invalid arguments, the behaviour is undefined. In particular, supplying a \f(CWNULL\fP pointer to a \f(CWlibdwarf\fP function (except where explicitly permitted), or pointers to invalid addresses or uninitialized data causes undefined behaviour; the return value in such cases is undefined, and the function may fail to invoke the caller supplied error handler or to return a meaningful error number. Implementations also may abort execution for such cases..P.H 2 "Returned values in the functional interface"Values returned by \f(CWlibdwarf\fP functions to indicate success and errors.nr aX \n(Fg+1are enumerated in Figure \n(aX.The \f(CWDW_DLV_NO_ENTRY\fPcase is useful for functions need to indicate that while there was no data to returnthere was no error either.For example, \f(CWdwarf_siblingof()\fPmay return \f(CWDW_DLV_NO_ENTRY\fP to indicate that that there wasno sibling to return..DS.TScenter box, tab(:);lfB cfB lfB l c l.SYMBOLIC NAME:VALUE:MEANING_DW_DLV_ERROR:1:ErrorDW_DLV_OK:0:Successful callDW_DLV_NO_ENTRY:-1:No applicable value.TE.FG "Error Indications".DE.PEach function in the interface that returns a value returns oneof the integers in the above figure..PIf \f(CWDW_DLV_ERROR\fP is returned and a pointer to a \f(CWDwarf_Error\fPpointer is passed to the function, then a Dwarf_Error handle is returnedthru the pointer. No other pointer value in the interface returns a value.After the \f(CWDwarf_Error\fP is no longer of interest,a \f(CWdwarf_dealloc(dbg,dw_err,DW_DLA_ERROR)\fP on the errorpointer is appropriate to free any space used by the error information..PIf \f(CWDW_DLV_NO_ENTRY\fP is returned no pointer value in theinterface returns a value..PIf \f(CWDW_DLV_OK\fP is returned the \f(CWDwarf_Error\fP pointer, ifsupplied, is not touched, but any other values to be returnedthrough pointers are returned.In this case calls (depending on the exact functionreturning the error) to \f(CWdwarf_dealloc()\fP may be appropriateonce the particular pointer returned is no longer of interest..PPointers passed to allow values to be returned thru them are uniformly the last pointersin each argument list..PAll the interface functions are defined from the point of view ofthe writer-of-the-library (as is traditional for UN*X librarydocumentation), not from the point of view of the user of the library.The caller might code:.P.DSDwarf_Line line;Dwarf_Signed ret_loff;Dwarf_Error err;int retval = dwarf_lineoff(line,&ret_loff,&err); .DEfor the function defined as.P.DSint dwarf_lineoff(Dwarf_Line line,Dwarf_Signed *return_lineoff, Dwarf_Error* err);.DEand this document refers to the function as returning the value thru *err or *return_lineoff or uses the phrase "returns inthe location pointed to by err".Sometimes other similar phrases are used..H 1 "Memory Management"Several of the functions that comprise \fIlibdwarf\fP return pointers (opaque descriptors) to structures that have been dynamically allocated by the library. To aid in the management of dynamic memory, the function \f(CWdwarf_dealloc()\fP is provided to free storage allocated as a result of a call to a \fIlibdwarf\fP function. This section describes the strategy that should be taken by a client program in managing dynamic storage..H 2 "Read-only Properties"All pointers (opaque descriptors) returned by or as a result of a \fIlibdwarf Consumer Library\fP call should be assumed to point to read-only memory. The results are undefined for \fIlibdwarf\fP clients that attempt to write to a region pointed to by a value returned by a \fIlibdwarf Consumer Library\fP call..H 2 "Storage Deallocation"See the section "Returned values in the functional interface",above, for the general rules where calls to \f(CWdwarf_dealloc()\fPis appropriate..PIn some cases the pointers returned by a \fIlibdwarf\fP call are pointersto data which is not free-able. The library knows from the allocation typeprovided to it whether the space is freeable or not and will not free inappropriately when \f(CWdwarf_dealloc()\fP is called. So it is vitalthat \f(CWdwarf_dealloc()\fP be called with the proper allocation type..PFor most storage allocated by \fIlibdwarf\fP, the client can free thestorage for reuse by calling \f(CWdwarf_dealloc()\fP, providing it with the \f(CWDwarf_Debug\fP descriptor specifying the object for which thestorage was allocated, a pointer to the area to be free-ed, and an identifier that specifies what the pointer points to (the allocationtype). For example, to free a \f(CWDwarf_Die die\fP belonging the theobject represented by \f(CWDwarf_Debug dbg\fP, allocated by a call to \f(CWdwarf_siblingof()\fP, the call to \f(CWdwarf_dealloc()\fP would be:.DS \f(CWdwarf_dealloc(dbg, die, DW_DLA_DIE);\fP.DETo free storage allocated in the form of a list of pointers (opaque descriptors), each member of the list should be deallocated, followed by deallocation of the actual list itself. The following code fragment uses an invocation of \f(CWdwarf_attrlist()\fP as an example to illustrate a technique that can be used to free storage from any \fIlibdwarf\fP routine that returns a list:.DS\f(CWDwarf_Unsigned atcnt;Dwarf_Attribute *atlist;int errv;errv = dwarf_attrlist(somedie, &atlist,&atcnt, &error);if (errv == DW_DLV_OK) { for (i = 0; i < atcnt; ++i) { /* use atlist[i] */ dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); } dwarf_dealloc(dbg, atlist, DW_DLA_LIST);}\fP.DEThe \f(CWDwarf_Debug\fP returned from \f(CWdwarf_init()\fP or \f(CWdwarf_elf_init()\fP cannot be free'd using \f(CWdwarf_dealloc()\fP.The function \f(CWdwarf_finish()\fP will deallocate all dynamic storageassociated with an instance of a \f(CWDwarf_Debug\fP type. In particular,it will deallocate all dynamically allocated space associated with the\f(CWDwarf_Debug\fP descriptor, and finally make the descriptor invalid.An \f(CWDwarf_Error\fP returned from \f(CWdwarf_init()\fPor \f(CWdwarf_elf_init()\fPin case of a failure cannot be free'dusing \f(CWdwarf_dealloc()\fP.The only way to free the \f(CWDwarf_Error\fP from either of thosecalls is to use \f2free(3)\fP directly.Every \f(CWDwarf_Error\fP must be free'd by \f(CWdwarf_dealloc()\fP except thosereturned by \f(CWdwarf_init()\fPor \f(CWdwarf_elf_init()\fP..PThe codes that identify the storage pointed to in calls to .nr aX \n(Fg+1\f(CWdwarf_dealloc()\fP are described in figure \n(aX..DS.TScenter box, tab(:);lfB lfB l l.IDENTIFIER:USED TO FREE _DW_DLA_STRING : char* DW_DLA_LOC : Dwarf_Loc DW_DLA_LOCDESC : Dwarf_Locdesc DW_DLA_ELLIST : Dwarf_Ellist (not used)DW_DLA_BOUNDS : Dwarf_Bounds (not used) DW_DLA_BLOCK : Dwarf_Block DW_DLA_DEBUG : Dwarf_Debug (do not use)DW_DLA_DIE : Dwarf_DieDW_DLA_LINE : Dwarf_Line DW_DLA_ATTR : Dwarf_Attribute DW_DLA_TYPE : Dwarf_Type (not used) DW_DLA_SUBSCR : Dwarf_Subscr (not used) DW_DLA_GLOBAL_CONTEXT : Dwarf_Global DW_DLA_ERROR : Dwarf_Error DW_DLA_LIST : a list of opaque descriptorsDW_DLA_LINEBUF : Dwarf_Line* (not used) DW_DLA_ARANGE : Dwarf_Arange DW_DLA_ABBREV : Dwarf_Abbrev DW_DLA_FRAME_OP : Dwarf_Frame_Op DW_DLA_CIE : Dwarf_Cie DW_DLA_FDE : Dwarf_FdeDW_DLA_LOC_BLOCK : Dwarf_Loc BlockDW_DLA_FRAME_BLOCK : Dwarf_Frame Block (not used) DW_DLA_FUNC_CONTEXT : Dwarf_Func DW_DLA_TYPENAME_CONTEXT : Dwarf_TypeDW_DLA_VAR_CONTEXT : Dwarf_VarDW_DLA_WEAK_CONTEXT : Dwarf_WeakDW_DLA_PUBTYPES_CONTEXT : Dwarf_Pubtype.TE.FG "Allocation/Deallocation Identifiers".DE.P.H 1 "Functional Interface"This section describes the functions available in the \fIlibdwarf\fPlibrary. Each function description includes its definition, followed by one or more paragraph describing the function's operation..PThe following sections describe these functions..H 2 "Initialization Operations"These functions are concerned with preparing an object file for subsequentaccess by the functions in \fIlibdwarf\fP and with releasing allocatedresources when access is complete. .H 3 "dwarf_init()".DS\f(CWint dwarf_init( int fd, Dwarf_Unsigned access, Dwarf_Handler errhand, Dwarf_Ptr errarg, Dwarf_Debug * dbg, Dwarf_Error *error)\fP.DEWhen it returns \f(CWDW_DLV_OK\fP,the function \f(CWdwarf_init()\fP returns thru\f(CWdbg\fP a \f(CWDwarf_Debug\fP descriptor that represents a handle for accessing debugging records associated with the open file descriptor \f(CWfd\fP. \f(CWDW_DLV_NO_ENTRY\fP is returned if the objectdoes not contain DWARF debugging information.\f(CWDW_DLV_ERROR\fP is returned ifan error occurred.The \f(CWaccess\fP argument indicates what access is allowed for the section. The \f(CWDW_DLC_READ\fP parameter is validfor read access (only read access is defined or discussed in thisdocument). The \f(CWerrhand\fP argument is a pointer to a function that will be invoked whenever an error is detected as a result of a \fIlibdwarf\fP operation. The \f(CWerrarg\fP argument is passed as an argument to the \f(CWerrhand\fP function. The file descriptor associated with the \f(CWfd\fP argument must refer to an ordinary file (i.e. not a pipe, socket, device, /proc entry, etc.), be opened with the at least as much permission as specified by the \f(CWaccess\fP argument, and cannot be closed or used as an argument to any system calls by the client until after \f(CWdwarf_finish()\fP is called. The seek position of the file associated with \f(CWfd\fP is undefined upon return of \f(CWdwarf_init()\fP.With SGI IRIX, by default it is allowed that the app\f(CWclose()\fP \f(CWfd\fP immediately after calling \f(CWdwarf_init()\fP,but that is not a portable approach (that itworks is an accidentalside effect of the fact that SGI IRIX uses \f(CWELF_C_READ_MMAP\fP in its hidden internal call to \f(CWelf_begin()\fP).The portable approach is to consider that \f(CWfd\fPmust be left open till after the corresponding dwarf_finish() callhas returned.Since \f(CWdwarf_init()\fP uses the same error handling processing as other \fIlibdwarf\fP functions (see \fIError Handling\fP above), client programs will generally supply an \f(CWerror\fP parameter to bypass the default actions during initialization unless the default actions are appropriate. .H 3 "dwarf_elf_init()".DS\f(CWint dwarf_elf_init( Elf * elf_file_pointer, Dwarf_Unsigned access, Dwarf_Handler errhand, Dwarf_Ptr errarg, Dwarf_Debug * dbg, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_elf_init()\fP is identical to \f(CWdwarf_init()\fP except that an open \f(CWElf *\fP pointer is passed instead of a file descriptor. In systems supporting \f(CWELF\fP object files this may be more space or time-efficient than using \f(CWdwarf_init()\fP.The client is allowed to use the \f(CWElf *\fP pointerfor its own purposes without restriction during the time the \f(CWDwarf_Debug\fPis open, except that the client should not \f(CWelf_end()\fP thepointer till after \f(CWdwarf_finish\fP is called..H 3 "dwarf_get_elf()".DS\f(CWint dwarf_get_elf( Dwarf_Debug dbg, Elf ** elf, Dwarf_Error *error)\fP.DEWhen it returns \f(CWDW_DLV_OK\fP,the function \f(CWdwarf_get_elf()\fP returns thru thepointer \f(CWelf\fP the \f(CWElf *\fP handleused to access the object represented by the \f(CWDwarf_Debug\fPdescriptor \f(CWdbg\fP. It returns \f(CWDW_DLV_ERROR\fP on error.Because \f(CWint dwarf_init()\fP opens an Elf descriptoron its fd and \f(CWdwarf_finish()\fP does not close thatdescriptor, an app should use \f(CWdwarf_get_elf\fPand should call \f(CWelf_end\fP with the pointer returnedthru the \f(CWElf**\fP handle created by \f(CWint dwarf_init()\fP.This function is not meaningful for a system that does not use theElf format for objects..H 3 "dwarf_finish()".DS\f(CWint dwarf_finish( Dwarf_Debug dbg, Dwarf_Error *error)\fP.DEThe function\f(CWdwarf_finish()\fP releases all \fILibdwarf\fP internal resources associated with the descriptor \f(CWdbg\fP, and invalidates \f(CWdbg\fP. It returns \f(CWDW_DLV_ERROR\fP if there is an error during thefinishing operation. It returns \f(CWDW_DLV_OK\fP for a successful operation.Because \f(CWint dwarf_init()\fP opens an Elf descriptoron its fd and \f(CWdwarf_finish()\fP does not close thatdescriptor, an app should use \f(CWdwarf_get_elf\fPand should call \f(CWelf_end\fP with the pointer returnedthru the \f(CWElf**\fP handle created by \f(CWint dwarf_init()\fP..H 2 "Debugging Information Entry Delivery Operations"These functions are concerned with accessing debugging information entries. .H 3 "Debugging Information Entry Debugger Delivery Operations".H 3 "dwarf_next_cu_header()".DS\f(CWint dwarf_next_cu_header( Dwarf_debug dbg, Dwarf_Unsigned *cu_header_length, Dwarf_Half *version_stamp, Dwarf_Unsigned *abbrev_offset, Dwarf_Half *address_size, Dwarf_Unsigned *next_cu_header, Dwarf_Error *error);.DEThe function\f(CWdwarf_next_cu_header()\fP returns \f(CWDW_DLV_ERROR\fP if it fails, and\f(CWDW_DLV_OK\fP if it succeeds..PIf it succeeds, \f(CW*next_cu_header\fP is set tothe offset in the .debug_info section of the next compilation-unit header if it succeeds. On reading the last compilation-unit header in the .debug_info section it contains the size of the .debug_info section.The next call to \f(CWdwarf_next_cu_header()\fP returns \f(CWDW_DLV_NO_ENTRY\fPwithout reading a compilation-unit or setting \f(CW*next_cu_header\fP. Subsequent calls to \f(CWdwarf_next_cu_header()\fP repeat the cycle by reading the first compilation-unit and so on. .PThe other values returned through pointers are the values in the compilation-unit header. If any of \f(CWcu_header_length\fP, \f(CWversion_stamp\fP,\f(CWabbrev_offset\fP, or \f(CWaddress_size\fP is \f(CWNULL\fP, the argument is ignored (meaning it is not an error to provide a \f(CWNULL\fP pointer)..H 3 "dwarf_siblingof()".DS\f(CWint dwarf_siblingof( Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *return_sib, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_siblingof()\fP returns \f(CWDW_DLV_ERROR\fP and sets the \f(CWerror\fP pointer on error.If there is no sibling it returns \f(CWDW_DLV_NO_ENTRY\fP.When it succeeds,\f(CWdwarf_siblingof()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_sib\fP to the \f(CWDwarf_Die\fP descriptor of the sibling of \f(CWdie\fP.If \f(CWdie\fP is \fINULL\fP, the \f(CWDwarf_Die\fP descriptor of thefirst die in the compilation-unit is returned. This die has the\f(CWDW_TAG_compile_unit\fP tag..H 3 "dwarf_child()".DS\f(CWint dwarf_child( Dwarf_Die die, Dwarf_Die *return_kid, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_child()\fP returns \f(CWDW_DLV_ERROR\fP and sets the \f(CWerror\fP die on error.If there is no child it returns \f(CWDW_DLV_NO_ENTRY\fP.When it succeeds,\f(CWdwarf_child()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_kid\fPto the \f(CWDwarf_Die\fP descriptor of the first child of \f(CWdie\fP.The function \f(CWdwarf_siblingof()\fP can be used with the return value of \f(CWdwarf_child()\fP to access the other children of \f(CWdie\fP. .H 3 "dwarf_offdie()".DS\f(CWint dwarf_offdie( Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die *return_die, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_offdie()\fP returns \f(CWDW_DLV_ERROR\fP and sets the \f(CWerror\fP die on error.When it succeeds,\f(CWdwarf_offdie()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_die\fPto thethe \f(CWDwarf_Die\fP descriptor of the debugging information entry at \f(CWoffset\fP in the section containing debugging information entries i.e the .debug_infosection. A return of \f(CWDW_DLV_NO_ENTRY\fPmeans that the \f(CWoffset\fP in the section is of a byte containingall 0 bits, indicating that thereis no abbreviation code. Meaning this 'die offset' is notthe offset of a real die, but is instead an offset of a null die,a padding die, or of some random zero byte: this shouldnot be returned in normal use.It is the user's responsibility to make sure that \f(CWoffset\fP is the start of a valid debugging information entry. The result of passing it an invalid offset could be chaos..\"#if 0.\".H 3 "Debugging Entry Delivery High-level Operations".\"The following "higher level" operations are typically not used by .\"debuggers or DWARF prettyprinters. A disassembler (for example) .\"might find them useful..\".\".DS.\"\f(CWDwarf_Die dwarf_pcfile(.\" Dwarf_Debug dbg, .\" Dwarf_Addr pc, .\" Dwarf_Error *error)\fP.\".DE.\"The function \f(CWdwarf_pcfile()\fP returns the \f(CWDwarf_Die\fP .\"descriptor of the compilation unit debugging information entry that .\"contains the address of \f(CWpc\fP. It returns \fINULL\fP if no .\"entry exists or an error occurred. Currently compilation unit .\"debugging information entries are defined as those having a tag of: .\"\f(CWDW_TAG_compile_unit\fP. This function is currently unimplemented..\".\".DS.\"\f(CWDwarf_Die dwarf_pcsubr(.\" Dwarf_Debug dbg, .\" Dwarf_Addr pc, .\" Dwarf_Error *error)\fP.\".DE.\"The function.\"\f(CWdwarf_pcsubr()\fP returns the \f(CWDwarf_Die\fP descriptor of the .\"subroutine debugging entry that contains the address of \f(CWpc\fP. It .\"returns \fINULL\fP if no entry exists or an error occurred. Currently .\"subroutine debugging information entries are defined as those having a .\"tag of: \f(CWDW_TAG_subprogram\fP, or \f(CWTAG_inlined_subroutine\fP..\"This function is currently unimplemented..\".\".DS.\"\f(CWDwarf_Die dwarf_pcscope(.\" Dwarf_Debug dbg, .\" Dwarf_Addr pc, .\" Dwarf_Error *error)\fP.\".DE.\"The function.\"\f(CWdwarf_pcscope()\fP returns the \f(CWDwarf_Die\fP descriptor for .\"the debugging information entry that represents the innermost enclosing .\"scope containing \f(CWpc\fP, or \fINULL\fP if no entry exists or an .\"error occurred. Debugging information entries that represent a \fIscope\fP .\"are those containing a low pc attribute and either a high pc or byte .\"size attribute that delineates a range. For example: a debugging information .\"entry for a lexical block is considered one having a scope whereas a .\"debugging information entry for a label is not. This function is.\"currently unimplemented..\"#endif.H 2 "Debugging Information Entry Query Operations"These queries return specific information about debugging information entries or a descriptor that can be used on subsequent queries when given a \f(CWDwarf_Die\fP descriptor. Note that some operations are specific to debugging information entries that are represented by a \f(CWDwarf_Die\fP descriptor of a specific type. For example, not all debugging information entries contain an attribute having a name, so consequently, a call to \f(CWdwarf_diename()\fP using a \f(CWDwarf_Die\fP descriptor that does not have a name attribute will return\f(CWDW_DLV_NO_ENTRY\fP.This is not an error, i.e. calling a function that needs a specificattribute is not an error for a die that does not contain that specificattribute..PThere are several methods that can be used to obtain the value of anattribute in a given die:.AL 1.LICall \f(CWdwarf_hasattr()\fP to determine if the debugging informationentry has the attribute of interest prior to issuing the query forinformation about the attribute..LISupply an \f(CWerror\fP argument, and check its value after the call to a query indicates an unsuccessful return, to determine the nature of the problem. The \f(CWerror\fP argument will indicate whether an error occurred, or the specific attribute needed was missing in that die..LIArrange to have an error handling function invoked upon detection of an error (see \f(CWdwarf_init()\fP)..LICall \f(CWdwarf_attrlist()\fP and iterate through the returned list ofattributes, dealing with each one as appropriate..LE.P.H 3 "dwarf_tag()".DS\f(CWint dwarf_tag( Dwarf_Die die, Dwarf_Half *tagval, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_tag()\fP returns the \fItag\fP of \f(CWdie\fPthru the pointer \f(CWtagval\fP if it succeeds. It returns \f(CWDW_DLV_OK\fP if it succeeds.It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_dieoffset()".DS\f(CWint dwarf_dieoffset( Dwarf_Die die, Dwarf_Off * return_offset, Dwarf_Error *error)\fP.DEWhen it succeeds,the function \f(CWdwarf_dieoffset()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fPto the position of \f(CWdie\fP in the section containing debugging information entries(the \f(CWreturn_offset\fP is a section-relative offset). In other words,it sets \f(CWreturn_offset\fP to the offset of the start of the debugging information entrydescribed by \f(CWdie\fP in the section containing die's i.e .debug_info. It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_die_CU_offset()".DS\f(CWint dwarf_die_CU_offset( Dwarf_Die die, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_die_CU_offset()\fP is similar to \f(CWdwarf_dieoffset()\fP, except that it puts the offset of the DIE represented by the \f(CWDwarf_Die\fP \f(CWdie\fP, from the start of the compilation-unit that it belongs to rather than the start of .debug_info (the \f(CWreturn_offset\fP is a CU-relative offset). .H 3 "dwarf_diename()".DS\f(CWint dwarf_diename( Dwarf_Die die, char ** return_name, Dwarf_Error *error)\fP.DEWhen it succeeds,the function \f(CWdwarf_diename()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_name\fPtoa pointer to anull-terminated string of characters that represents the nameattribute of \f(CWdie\fP.It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not have a name attribute.It returns \f(CWDW_DLV_ERROR\fP ifan error occurred. The storage pointed to by a successful return of \f(CWdwarf_diename()\fP should be free'd using the allocation type\f(CWDW_DLA_STRING\fP when no longer of interest (see \f(CWdwarf_dealloc()\fP)..H 3 "dwarf_attrlist()".DS\f(CWint dwarf_attrlist( Dwarf_Die die, Dwarf_Attribute** attrbuf, Dwarf_Signed *attrcount, Dwarf_Error *error)\fP.DEWhen it returns \f(CWDW_DLV_OK\fP,the function \f(CWdwarf_attrlist()\fP sets \f(CWattrbuf\fP to point to an array of \f(CWDwarf_Attribute\fP descriptors corresponding toeach of the attributes in die, and returns the number of elements in the array thru \f(CWattrcount\fP. \f(CWDW_DLV_NO_ENTRY\fP is returned if the count is zero (no \f(CWattrbuf\fP is allocated in this case).\f(CWDW_DLV_ERROR\fP is returned on error.On a successful return from \f(CWdwarf_attrlist()\fP, each of the\f(CWDwarf_Attribute\fP descriptors should be individually free'd using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_ATTR\fP, followed by free-ing the list pointed to by \f(CW*attrbuf\fP using\f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_LIST\fP, when no longer of interest (see \f(CWdwarf_dealloc()\fP).Freeing the attrlist:.in +2.DS\f(CWDwarf_Unsigned atcnt;Dwarf_Attribute *atlist;int errv;errv = dwarf_attrlist(somedie, &atlist,&atcnt, &error);if (errv == DW_DLV_OK) { for (i = 0; i < atcnt; ++i) { /* use atlist[i] */ dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR); } dwarf_dealloc(dbg, atlist, DW_DLA_LIST);}\fP.DE.in -2.P.H 3 "dwarf_hasattr()".DS\f(CWint dwarf_hasattr( Dwarf_Die die, Dwarf_Half attr, Dwarf_Bool *return_bool, Dwarf_Error *error)\fP.DEWhen it succeeds, thefunction \f(CWdwarf_hasattr()\fP returns \f(CWDW_DLV_OK\fPand sets \f(CW*return_bool\fP to \fInon-zero\fP if \f(CWdie\fP has the attribute \f(CWattr\fP and \fIzero\fP otherwise.If it fails, it returns \f(CWDW_DLV_ERROR\fP..H 3 "dwarf_attr()".DS\f(CWint dwarf_attr( Dwarf_Die die, Dwarf_Half attr, Dwarf_Attribute *return_attr, Dwarf_Error *error)\fP.DEWhen it returns \f(CWDW_DLV_OK\fP,the function \f(CWdwarf_attr()\fPsets \f(CW*return_attr\fP to the \f(CWDwarf_Attribute\fP descriptor of \f(CWdie\fP having the attribute \f(CWattr\fP.It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWattr\fP is not contained in \f(CWdie\fP. It returns \f(CWDW_DLV_ERROR\fP if an error occurred..\"#if 0.\".DS.\"\f(CWDwarf_Locdesc* dwarf_stringlen(.\" Dwarf_Die die, .\" Dwarf_Error *error)\fP.\".DE.\"The function \f(CWdwarf_stringlen()\fP returns a pointer to a .\"\f(CWDwarf_Locdesc\fP with one Locdesc entry that when evaluated,.\"yields the length of the string represented by \f(CWdie\fP. It.\"returns \f(CWNULL\fP if \f(CWdie\fP does not contain a string length .\"attribute or the string length attribute is not a location-description .\"or an error occurred. The address range of the list is set to 0 thru .\"the highest possible address if a loclist pointer is returned. The .\"storage pointed to by a successful return of \f(CWdwarf_stringlen()\fP .\"should be free'd when no longer of interest (see \f(CWdwarf_dealloc()\fP)..\"This function is currently unimplemented..\"#endif.\"#if 0.\".DS.\"\f(CWDwarf_Signed dwarf_subscrcnt(.\" Dwarf_Die die, .\" Dwarf_Error *error)\fP.\".DE.\"The function \f(CWdwarf_subscrcnt()\fP returns the number of subscript .\"die's that are owned by the array type represented by \f(CWdie\fP. It.\"returns \f(CWDW_DLV_NOCOUNT\fP on error. This function is currently.\"unimplemented..\".\".DS.\"\f(CWDwarf_Die dwarf_nthsubscr(.\" Dwarf_Die die, .\" Dwarf_Unsigned ssndx, .\" Dwarf_Error *error)\fP.\".DE.\"The function \f(CWdwarf_nthsubscr()\fP returns a \f(CWDwarf_Die\fP .\"descriptor that describes the \f(CWssndx\fP subscript of the array .\"type debugging information entry represented by \f(CWdie\fP, where .\"\fI1\fP is the first member. It returns \fINULL\fP if \f(CWdie\fP .\"does not have an \f(CWssndx\fP subscript, or an error occurred. .\"This function is currently unimplemented..\"#endif.H 3 "dwarf_lowpc()".DS\f(CWint dwarf_lowpc( Dwarf_Die die, Dwarf_Addr * return_lowpc, Dwarf_Error * error)\fP.DEThe function \f(CWdwarf_lowpc()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_lowpc\fPto the low program counter value associated with the \f(CWdie\fP descriptor if \f(CWdie\fP represents a debugging information entry with this attribute. It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not have this attribute. It returns \f(CWDW_DLV_ERROR\fP if an error occurred. .H 3 "dwarf_highpc()".DS\f(CWint dwarf_highpc( Dwarf_Die die, Dwarf_Addr * return_highpc, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_highpc()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_highpc\fPthe high program counter value associated with the \f(CWdie\fP descriptor if \f(CWdie\fP represents a debugging information entry with this attribute. It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not have this attribute. It returns \f(CWDW_DLV_ERROR\fP if an error occurred. .H 3 "dwarf_bytesize()".DS\f(CWDwarf_Signed dwarf_bytesize( Dwarf_Die die, Dwarf_Unsigned *return_size, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_bytesize()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_size\fPto the number of bytes needed to contain an instance of the aggregate debugging information entry represented by \f(CWdie\fP. It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not contain the byte size attribute \f(CWDW_AT_byte_size\fP.It returns \f(CWDW_DLV_ERROR\fP if an error occurred..\"#if 0.\".DS.\"\f(CWDwarf_Bool dwarf_isbitfield(.\" Dwarf_Die die, .\" Dwarf_Error *error)\fP.\".DE.\"The function \f(CWdwarf_isbitfield()\fP returns \fInon-zero\fP if .\"\f(CWdie\fP is a descriptor for a debugging information entry that .\"represents a bit field member. It returns \fIzero\fP if \f(CWdie\fP .\"is not associated with a bit field member. This function is currently.\"unimplemented..\"#endif.H 3 "dwarf_bitsize()".DS\f(CWint dwarf_bitsize( Dwarf_Die die, Dwarf_Unsigned *return_size, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_bitsize()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_size\fPto the number of bits occupied by the bit field value that is an attribute of the givendie. It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not contain the bit size attribute \f(CWDW_AT_bit_size\fP.It returns \f(CWDW_DLV_ERROR\fP if an error occurred..H 3 "dwarf_bitoffset()".DS\f(CWint dwarf_bitoffset( Dwarf_Die die, Dwarf_Unsigned *return_size, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_bitoffset()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_size\fPto the number of bits to the left of the most significant bit of the bit field value. This bit offset is not necessarily the net bit offset within thestructure or class , since \f(CWDW_AT_data_member_location\fPmay give a byte offset to this \f(CWDIE\fP and the bit offsetreturned through the pointerdoes not include the bits in the byte offset.It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not contain the bit offset attribute \f(CWDW_AT_bit_offset\fP.It returns \f(CWDW_DLV_ERROR\fP if an error occurred..H 3 "dwarf_srclang()".DS\f(CWint dwarf_srclang( Dwarf_Die die, Dwarf_Unsigned *return_lang, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_srclang()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_lang\fPtoa code indicating the source language of the compilation unit represented by the descriptor \f(CWdie\fP. It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not represent a source file debugging information entry (i.e. contain the attribute \f(CWDW_AT_language\fP).It returns \f(CWDW_DLV_ERROR\fP if an error occurred..H 3 "dwarf_arrayorder()".DS\f(CWint dwarf_arrayorder( Dwarf_Die die, Dwarf_Unsigned *return_order, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_arrayorder()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_order\fPa code indicating the ordering of the array represented by the descriptor \f(CWdie\fP.It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWdie\fP does not contain thearray order attribute \f(CWDW_AT_ordering\fP.It returns \f(CWDW_DLV_ERROR\fP if an error occurred..H 2 "Attribute Form Queries"Based on the attribute's form, these operations are concerned with returning uninterpreted attribute data. Since it is not always obvious from the return value of these functions if an error occurred, one should always supply an \f(CWerror\fP parameter or have arranged to have an error handling function invoked (see \f(CWdwarf_init()\fP)to determine the validity of the returned value and the nature of any errors that may have occurred.A \f(CWDwarf_Attribute\fP descriptor describes an attribute of aspecific die. Thus, each \f(CWDwarf_Attribute\fP descriptor isimplicitly associated with a specific die..H 3 "dwarf_hasform()".DS\f(CWnt dwarf_hasform( Dwarf_Attribute attr, Dwarf_Half form, Dwarf_Bool *return_hasform, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_hasform()\fP returns \f(CWDW_DLV_OK\fP and and puts a \fInon-zero\fP value in the \f(CW*return_hasform\fP boolean if the attribute represented by the \f(CWDwarf_Attribute\fP descriptor \f(CWattr\fP has the attribute form \f(CWform\fP. If the attribute does not have that form \fIzero\fPis put into \f(CW*return_hasform\fP. \f(CWDW_DLV_ERROR\fP is returned on error..H 3 "dwarf_whatform()".DS\f(CWint dwarf_whatform( Dwarf_Attribute attr, Dwarf_Half *return_form, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_whatform()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_form\fPto the attribute form code of the attribute represented by the \f(CWDwarf_Attribute\fP descriptor \f(CWattr\fP. It returns \f(CWDW_DLV_ERROR\fP on error.An attribute using DW_FORM_indirect effectively has two forms.This function returns the 'final' form for \f(CWDW_FORM_indirect\fP,not the \f(CWDW_FORM_indirect\fP itself. This function iswhat most applications will want to call..H 3 "dwarf_whatform_direct()".DS\f(CWint dwarf_whatform_direct( Dwarf_Attribute attr, Dwarf_Half *return_form, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_whatform_direct()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_form\fPto the attribute form code of the attribute represented by the \f(CWDwarf_Attribute\fP descriptor \f(CWattr\fP. It returns \f(CWDW_DLV_ERROR\fP on error.An attribute using \f(CWDW_FORM_indirect\fP effectively has two forms.This returns the form 'directly' in the initial form field.So when the form field is \f(CWDW_FORM_indirect\fPthis call returns the \f(CWDW_FORM_indirect\fP form, which is sometimes useful for dump utilities..H 3 "dwarf_whatattr()".DS\f(CWint dwarf_whatattr( Dwarf_Attribute attr, Dwarf_Half *return_attr, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_whatattr()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_attr\fPto the attribute code represented by the \f(CWDwarf_Attribute\fP descriptor \f(CWattr\fP. It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_formref()".DS\f(CWint dwarf_formref( Dwarf_Attribute attr, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_formref()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fPto the CU-relative offsetrepresented by the descriptor \f(CWattr\fP if the form of the attribute belongs to the \f(CWREFERENCE\fP class.\f(CWattr\fP must be a CU-local reference, not form \f(CWDW_FORM_ref_addr\fP. It is an error for the form tonot belong to this class or to be form \f(CWDW_FORM_ref_addr\fP. It returns \f(CWDW_DLV_ERROR\fP on error.See also \f(CWdwarf_global_formref\fP below..H 3 "dwarf_global_formref()".DS\f(CWint dwarf_global_formref( Dwarf_Attribute attr, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_global_formref()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fPto the .debug_info-section-relative offsetrepresented by the descriptor \f(CWattr\fP if the form of the attribute belongs to the \f(CWREFERENCE\fP class. \f(CWattr\fP can be any legal \f(CWREFERENCE\fP class form including \f(CWDW_FORM_ref_addr\fP.It is an error for the form tonot belong to this class.It returns \f(CWDW_DLV_ERROR\fP on error.See also \f(CWdwarf_formref\fP above..H 3 "dwarf_formaddr()".DS\f(CWint dwarf_formaddr( Dwarf_Attribute attr, Dwarf_Addr * return_addr, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_formaddr()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_addr\fPtothe address represented by the descriptor \f(CWattr\fP if the form of the attributebelongs to the \f(CWADDRESS\fP class. It is an error for the form tonot belong to this class. It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_formflag()".DS\f(CWint dwarf_formflag( Dwarf_Attribute attr, Dwarf_Bool * return_bool, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_formflag()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_bool\fP\f(CW1\fP (i.e. true) (if the attribute has a non-zero value)or \f(CW0\fP (i.e. false) (if the attribute has a zero value).It returns \f(CWDW_DLV_ERROR\fP on error or if the \f(CWattr\fPdoes not have form flag..H 3 "dwarf_formudata()".DS\f(CWint dwarf_formudata( Dwarf_Attribute attr, Dwarf_Unsigned * return_uvalue, Dwarf_Error * error)\fP.DEThe function\f(CWdwarf_formudata()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_uvalue\fPtothe \f(CWDwarf_Unsigned\fP value of the attribute represented by the descriptor \f(CWattr\fP if theform of the attribute belongs to the \f(CWCONSTANT\fP class. It is an error for the form to not belong to this class. It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_formsdata()".DS\f(CWint dwarf_formsdata( Dwarf_Attribute attr, Dwarf_Signed * return_svalue, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_formsdata()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_svalue\fPtothe \f(CWDwarf_Signed\fP value of the attribute represented by the descriptor \f(CWattr\fP if theform of the attribute belongs to the \f(CWCONSTANT\fP class. It is an error for the form to not belong to this class. If the size of the data attribute referenced is smaller than the size of the \f(CWDwarf_Signed\fPtype, its value is sign extended. It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_formblock()".DS\f(CWint dwarf_formblock( Dwarf_Attribute attr, Dwarf_Block ** return_block, Dwarf_Error * error)\fP.DEThe function \f(CWdwarf_formblock()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_block\fPtoa pointer to a \f(CWDwarf_Block\fP structure containing the value of the attribute represented by the descriptor \f(CWattr\fP if the form of the attribute belongs to the \f(CWBLOCK\fP class. It is an errorfor the form to not belong to this class. The storage pointed to by a successful return of \f(CWdwarf_formblock()\fP should be free'd using the allocation type \f(CWDW_DLA_BLOCK\fP, when no longer of interest (see \f(CWdwarf_dealloc()\fP). It returns\f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_formstring()".DS\f(CWint dwarf_formstring( Dwarf_Attribute attr, char ** return_string, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_formstring()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_string\fPtoa pointer to a null-terminated string containing the value of the attribute represented by the descriptor \f(CWattr\fP if the form of theattribute belongs to the \f(CWSTRING\fP class. It is an errorfor the form to not belong to this class. The storage pointed to by a successful return of \f(CWdwarf_formstring()\fP should not be free'd. The pointer points intoexisting DWARF memory and the pointer becomes stale/invalidafter a call to \f(CWdwarf_finish\fP.\f(CWdwarf_formstring()\fP returns \f(CWDW_DLV_ERROR\fP on error..H 4 "dwarf_loclist_n()".DS\f(CWint dwarf_loclist_n( Dwarf_Attribute attr, Dwarf_Locdesc ***llbuf, Dwarf_Signed *listlen, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_loclist_n()\fP sets \f(CW*llbuf\fP to point to an array of \f(CWDwarf_Locdesc\fP pointers corresponding to each ofthe location expressions in a location list, and sets\f(CW*listlen\fP to the number of elements in the array and returns \f(CWDW_DLV_OK\fP if the attribute isappropriate..PThis is the preferred function for Dwarf_Locdesc asit is the interface allowing access to an entireloclist. (use of \f(CWdwarf_loclist_n()\fP issuggested as the better interface, though \f(CWdwarf_loclist()\fP is stillsupported.).PIf the attribute is a reference to a location list(DW_FORM_data4 or DW_FORM_data8)the location list entries are used to fillin all the fields of the \f(CWDwarf_Locdesc\fP(s) returned..PIf the attribute is a location description(DW_FORM_block2 or DW_FORM_block4)then some of the \f(CWDwarf_Locdesc\fP values of the single\f(CWDwarf_Locdesc\fP record are set to 'sensible'but arbitrary values. Specifically, ld_lopc is set to 0 andld_hipc is set to all-bits-on. And \f(CW*listlen\fP is set to 1..PIt returns \f(CWDW_DLV_ERROR\fP on error. \f(CWdwarf_loclist_n()\fP works on \f(CWDW_AT_location\fP, \f(CWDW_AT_data_member_location\fP, \f(CWDW_AT_vtable_elem_location\fP,\f(CWDW_AT_string_length\fP, \f(CWDW_AT_use_location\fP, and \f(CWDW_AT_return_addr\fP attributes. .PStorage allocated by a successful call of \f(CWdwarf_loclist_n()\fP should be deallocated when no longer of interest (see \f(CWdwarf_dealloc()\fP).The block of \f(CWDwarf_Loc\fP structs pointed to by the \f(CWld_s\fP field of each \f(CWDwarf_Locdesc\fP structure should be deallocated with the allocation type \f(CWDW_DLA_LOC_BLOCK\fP. and the \f(CWllbuf[]\fP space pointed to should be deallocated withallocation type \f(CWDW_DLA_LOCDESC\fP.This should be followed by deallocation of the \f(CWllbuf\fPusing the allocation type \f(CWDW_DLA_LIST\fP..in +2.DS\f(CWDwarf_Signed lcnt;Dwarf_Locdesc **llbuf;int lres;lres = dwarf_loclist_n(someattr, &llbuf,&lcnt &error);if (lres == DW_DLV_OK) { for (i = 0; i < lcnt; ++i) { /* use llbuf[i] */ dwarf_dealloc(dbg, llbuf[i]->ld_s, DW_DLA_LOC_BLOCK); dwarf_dealloc(dbg,llbuf[i], DW_DLA_LOCDESC); } dwarf_dealloc(dbg, llbuf, DW_DLA_LIST);}\fP.DE.in -2.P.H 4 "dwarf_loclist()".DS\f(CWint dwarf_loclist( Dwarf_Attribute attr, Dwarf_Locdesc **llbuf, Dwarf_Signed *listlen, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_loclist()\fP sets \f(CW*llbuf\fP to point to a \f(CWDwarf_Locdesc\fP pointer for the single location expressionit can return.It sets\f(CW*listlen\fP to 1.and returns \f(CWDW_DLV_OK\fP if the attribute isappropriate..PIt is less flexible than \f(CWdwarf_loclist_n()\fP in that\f(CWdwarf_loclist()\fP can handle a maximum of onelocation expression, not a full location list.If a location-list is present it returns onlythe first location-list entry location description.Use \f(CWdwarf_loclist_n()\fP instead..PIt returns \f(CWDW_DLV_ERROR\fP on error. \f(CWdwarf_loclist()\fP works on \f(CWDW_AT_location\fP, \f(CWDW_AT_data_member_location\fP, \f(CWDW_AT_vtable_elem_location\fP,\f(CWDW_AT_string_length\fP, \f(CWDW_AT_use_location\fP, and \f(CWDW_AT_return_addr\fP attributes. .PStorage allocated by a successful call of \f(CWdwarf_loclist()\fP should be deallocated when no longer of interest (see \f(CWdwarf_dealloc()\fP).The block of \f(CWDwarf_Loc\fP structs pointed to by the \f(CWld_s\fP field of each \f(CWDwarf_Locdesc\fP structure should be deallocated with the allocation type \f(CWDW_DLA_LOC_BLOCK\fP. This should be followed by deallocation of the \f(CWllbuf\fPusing the allocation type \f(CWDW_DLA_LOCDESC\fP..in +2.DS\f(CWDwarf_Signed lcnt;Dwarf_Locdesc *llbuf;int lres;lres = dwarf_loclist(someattr, &llbuf,&lcnt,&error);if (lres == DW_DLV_OK) { /* lcnt is always 1, (and has always been 1) */ */ /* Use llbuf here. */ dwarf_dealloc(dbg, llbuf->ld_s, DW_DLA_LOC_BLOCK); dwarf_dealloc(dbg, llbuf, DW_DLA_LOCDESC);/* Earlier version. * for (i = 0; i < lcnt; ++i) {* /* use llbuf[i] */* * /* Deallocate Dwarf_Loc block of llbuf[i] */* dwarf_dealloc(dbg, llbuf[i].ld_s, DW_DLA_LOC_BLOCK);* }* dwarf_dealloc(dbg, llbuf, DW_DLA_LOCDESC);*/}\fP.DE.in -2.P.H 4 "dwarf_loclist_from_expr()".DS\f(CWint dwarf_loclist_from_expr( Dwarf_Ptr bytes_in, Dwarf_Unsigned bytes_len, Dwarf_Locdesc **llbuf, Dwarf_Signed *listlen, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_loclist_from_expr()\fP sets \f(CW*llbuf\fP to point to a \f(CWDwarf_Locdesc\fP pointer for the single location expressionwhich is pointed to by \f(CW*bytes_in\fP (whose length is\f(CW*bytes_len\fP).It sets\f(CW*listlen\fP to 1.and returns \f(CWDW_DLV_OK\fP if decoding is successful.Some sources of bytes of expressions are dwarf expressionsin frame operations like \f(CWDW_CFA_def_cfa_expression\fP,\f(CWDW_CFA_expression\fP, and \f(CWDW_CFA_val_expression\fP..PIt returns \f(CWDW_DLV_ERROR\fP on error. .PStorage allocated by a successful call of \f(CWdwarf_loclist_from_expr()\fP should be deallocated when no longer of interest (see \f(CWdwarf_dealloc()\fP).The block of \f(CWDwarf_Loc\fP structs pointed to by the \f(CWld_s\fP field of each \f(CWDwarf_Locdesc\fP structure should be deallocated with the allocation type \f(CWDW_DLA_LOC_BLOCK\fP. This should be followed by deallocation of the \f(CWllbuf\fPusing the allocation type \f(CWDW_DLA_LOCDESC\fP..in +2.DS\f(CWDwarf_Signed lcnt;Dwarf_Locdesc *llbuf;int lres;/* Example with an empty buffer here. */Dwarf_Ptr data = "";Dwarf_Unsigned len = 0;lres = dwarf_loclist_from_expr(data,len, &llbuf,&lcnt, &error);if (lres == DW_DLV_OK) { /* lcnt is always 1 */ /* Use llbuf here.*/ dwarf_dealloc(dbg, llbuf->ld_s, DW_DLA_LOC_BLOCK); dwarf_dealloc(dbg, llbuf, DW_DLA_LOCDESC);}\fP.DE.in -2.P.P.H 2 "Line Number Operations"These functions are concerned with accessing line number entries,mapping debugging information entry objects to their correspondingsource lines, and providing a mechanism for obtaining informationabout line number entries. Although, the interface talks of "lines"what is really meant is "statements". In case there is more thanone statement on the same line, there will be at least one descriptorper statement, all with the same line number. If column number isalso being represented they will have the column numbers of the startof the statements also represented..PThere can also be more than one Dwarf_Line per statement.For example, if a file is preprocessed by a language translator,this could result in translator output showing 2 or more sets of linenumbers per translated line of output..H 3 "Get A Set of Lines"The function returns information about every source line for a particular compilation-unit. The compilation-unit is specifiedby the corresponding die..H 4 "dwarf_srclines()".DS\f(CWint dwarf_srclines( Dwarf_Die die, Dwarf_Line **linebuf, Dwarf_Signed *linecount, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_srclines()\fP places all line number descriptors for a single compilation unit into a single block, sets \f(CW*linebuf\fP to point to that block, sets \f(CW*linecount\fP to the number of descriptors in this blockand returns \f(CWDW_DLV_OK\fP.The compilation-unit is indicated by the given \f(CWdie\fP which must bea compilation-unit die. It returns \f(CWDW_DLV_ERROR\fP on error. Onsuccessful return, line number information should be free'd using \f(CWdwarf_srclines_dealloc()\fPwhen no longer of interest. .P.in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Line *linebuf;int sres;sres = dwarf_srclines(somedie, &linebuf,&cnt, &error);if (sres == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use linebuf[i] */ } dwarf_srclines_dealloc(dbg, linebuf, cnt);}\fP.DE.in -2.PThe following dealloc code (the only documented method before July 2005)still works, but does not completely free all data allocated.The \f(CWdwarf_srclines_dealloc()\fP routine was createdto fix the problem of incomplete deallocation..P.in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Line *linebuf;int sres;sres = dwarf_srclines(somedie, &linebuf,&cnt, &error);if (sres == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use linebuf[i] */ dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE); } dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);}\fP.DE.in -2.H 3 "Get the set of Source File Names"The function returns the names of the source files that have contributedto the compilation-unit represented by the given DIE. Only the sourcefiles named in the statement program prologue are returned..DS\f(CWint dwarf_srcfiles( Dwarf_Die die, char ***srcfiles, Dwarf_Signed *srccount, Dwarf_Error *error)\fP.DEWhen it succeeds\f(CWdwarf_srcfiles()\fP returns \f(CWDW_DLV_OK\fPandputsthe number of sourcefiles named in the statement program prologue indicated by the given\f(CWdie\fPinto \f(CW*srccount\fP. Source files defined in the statement program are ignored.The given \f(CWdie\fP should have the tag \f(CWDW_TAG_compile_unit\fP.The location pointed to by \f(CWsrcfiles\fP is set to point to a listof pointers to null-terminated strings that name the sourcefiles. On a successful return from this function, each of thestrings returned should be individually free'd using \f(CWdwarf_dealloc()\fPwith the allocation type \f(CWDW_DLA_STRING\fP when no longer ofinterest. This should be followed by free-ing the list using\f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_LIST\fP.It returns \f(CWDW_DLV_ERROR\fP on error. It returns \f(CWDW_DLV_NO_ENTRY\fPif there is nocorresponding statement program (i.e., if there is no line information)..in +2.DS\f(CWDwarf_Signed cnt;char **srcfiles;int res;res = dwarf_srcfiles(somedie, &srcfiles,&cnt &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use srcfiles[i] */ dwarf_dealloc(dbg, srcfiles[i], DW_DLA_STRING); } dwarf_dealloc(dbg, srcfiles, DW_DLA_LIST);}\fP.DE.in -2.H 3 "Get information about a Single Table Line"The following functions can be used on the \f(CWDwarf_Line\fP descriptorsreturned by \f(CWdwarf_srclines()\fP to obtain information about thesource lines..H 4 "dwarf_linebeginstatement()".DS\f(CWint dwarf_linebeginstatement( Dwarf_Line line, Dwarf_Bool *return_bool, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_linebeginstatement()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_bool\fPto\fInon-zero\fP (if \f(CWline\fP represents a line number entry that is marked asbeginning a statement). or\fIzero\fP ((if \f(CWline\fP represents a line number entrythat is not marked as beginning a statement).It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..P.H 4 "dwarf_lineendsequence()".DS\f(CWint dwarf_lineendsequence( Dwarf_Line line, Dwarf_Bool *return_bool, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_lineendsequence()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_bool\fP\fInon-zero\fP(in which case \f(CWline\fP represents a line number entry that is marked asending a text sequence)or\fIzero\fP (in which case \f(CWline\fP represents a line number entrythat is not marked as ending a text sequence).A line number entry that is marked asending a text sequence is an entry with an address one beyond the highest address used by the currentsequence of line table entries (that is, the table entry isa DW_LNE_end_sequence entry (see the DWARF specification))..PThe function \f(CWdwarf_lineendsequence()\fP returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..P.H 4 "dwarf_lineno()".DS\f(CWint dwarf_lineno( Dwarf_Line line, Dwarf_Unsigned * returned_lineno, Dwarf_Error * error)\fP.DEThe function \f(CWdwarf_lineno()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_lineno\fP tothe source statement line number corresponding to the descriptor \f(CWline\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..P.H 4 "dwarf_line_srcfileno()".DS\f(CWint dwarf_line_srcfileno( Dwarf_Line line, Dwarf_Unsigned * returned_fileno, Dwarf_Error * error)\fP.DEThe function \f(CWdwarf_line_srcfileno()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*returned_fileno\fP tothe source statement line number corresponding to the descriptor \f(CWfile number\fP. When the number returned thru \f(CW*returned_fileno\fP is zero it meansthe file name is unknown (see the DWARF2/3 line table specification).When the number returned thru \f(CW*returned_fileno\fP is non-zeroit is a file number:subtract 1 from this file numberto get anindex into the array of strings returned by \f(CWdwarf_srcfiles()\fP(verify the resulting index is in range for the array of stringsbefore indexing into the array of strings).The file number may exceed the size of the array of strings returned by \f(CWdwarf_srcfiles()\fPbecause \f(CWdwarf_srcfiles()\fP does not return files names defined withthe \f(CWDW_DLE_define_file\fP operator.The function \f(CWdwarf_line_srcfileno()\fP returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..P.H 4 "dwarf_lineaddr()".DS\f(CWint dwarf_lineaddr( Dwarf_Line line, Dwarf_Addr *return_lineaddr, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_lineaddr()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_lineaddr\fP tothe address associated with the descriptor \f(CWline\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..P.H 4 "dwarf_lineoff()".DS\f(CWint dwarf_lineoff( Dwarf_Line line, Dwarf_Signed * return_lineoff, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_lineoff()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_lineoff\fP tothe column number at whichthe statement represented by \f(CWline\fP begins. It sets \f(CWreturn_lineoff\fP to \fI-1\fP if the column number of the statement is not represented(meaning the producer library call was given zeroas the column number). .POn error it returns \f(CWDW_DLV_ERROR\fP.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_linesrc()".DS\f(CWint dwarf_linesrc( Dwarf_Line line, char ** return_linesrc, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_linesrc()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_linesrc\fP toa pointer to anull-terminated string of characters that represents the name of the source-file where \f(CWline\fP occurs. It returns \f(CWDW_DLV_ERROR\fP on error. .PIf the applicable file name in the line table Statement Program Prolog does not start with a '/' characterthe string in \f(CWDW_AT_comp_dir\fP (if applicable and present)or the applicabledirectory name from the line Statement Program Prolog is prepended to thefile name in the line table Statement Program Prologto make a full path..PThe storage pointed to by a successful return of \f(CWdwarf_linesrc()\fP should be free'd using \f(CWdwarf_dealloc()\fP withthe allocation type \f(CWDW_DLA_STRING\fP when no longer of interest.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_lineblock()".DS\f(CWint dwarf_lineblock( Dwarf_Line line, Dwarf_Bool *return_bool, Dwarf_Error *error)\fP.DEThe function\f(CWdwarf_lineblock()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_linesrc\fP tonon-zero (i.e. true)(if the line is marked as beginning a basic block)or zero (i.e. false) (if the line is marked as notbeginning a basic block). It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..\"#if 0.\".H 3 "Finding a Line Given A PC value".\"This is a 'higher level' (High-level) interface to line information..\".\".DS.\"\f(CWint dwarf_pclines(.\" Dwarf_Debug dbg,.\" Dwarf_Addr pc,.\" Dwarf_Line **linebuf,.\" Dwarf_Signed slide,.\" Dwarf_Signed *linecount,.\" Dwarf_Error *error)\fP.\".DE.\"The function \f(CWdwarf_pclines()\fP places all line number descriptors .\"that correspond to the value of \f(CWpc\fP into a single block and sets .\"\f(CWlinebuf\fP to point to that block. A count of the number of .\"\f(CWDwarf_Line\fP descriptors that are in this block is returned. For .\"most cases, the count returned will be \fIone\fP, though it may be higher .\"if optimizations such as common subexpression elimination result in multiple .\"line number entries for a given value of \f(CWpc\fP. The \f(CWslide\fP .\"argument specifies the direction to search for the nearest line number .\"entry in the event that there is no line number entry that contains an .\"exact match for \f(CWpc\fP. This argument may be one of: .\"\f(CWDLS_BACKWARD\fP, \f(CWDLS_NOSLIDE\fP, \f(CWDLS_FORWARD\fP..\"\f(CWDW_DLV_NOCOUNT\fP is returned on error. On successful return, each .\"line information structure pointed to by an entry in the block should be .\"free'd using \f(CWdwarf_dealloc()\fP with the allocation type .\"\f(CWDW_DLA_LINE\fP when no longer of interest. The block itself should .\"be free'd using \f(CWdwarf_dealloc()\fP with the allocation type .\"\f(CWDW_DLA_LIST\fP when no longer of interest..\"#endif.H 2 "Global Name Space Operations" These operations operate on the .debug_pubnames section of the debugging information..H 3 "Debugger Interface Operations".H 4 "dwarf_get_globals()".DS\f(CWint dwarf_get_globals( Dwarf_Debug dbg, Dwarf_Global **globals, Dwarf_Signed * return_count, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_globals()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_count\fP tothe count of pubnamesrepresented in the section containing pubnames i.e. .debug_pubnames. It also stores at \f(CW*globals\fP, a pointer to a list of \f(CWDwarf_Global\fP descriptors, one for each of the pubnames in the .debug_pubnames section. It returns \f(CWDW_DLV_ERROR\fP on error. It returns \f(CWDW_DLV_NO_ENTRY\fP if the .debug_pubnames section does not exist..POn a successful return from\f(CWdwarf_get_globals()\fP, the \f(CWDwarf_Global\fP descriptors should befree'd using \f(CWdwarf_globals_dealloc()\fP.\f(CWdwarf_globals_dealloc()\fP is new as of July 15, 2005and is the preferred approach to freeing this memory...in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Global *globs;int res;res = dwarf_get_globals(dbg, &globs,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use globs[i] */ } dwarf_globals_dealloc(dbg, globs, cnt);}\fP.DE.in -2.PThe following code is deprecated as of July 15, 2005 as it does notfree all relevant memory.This approach still works as well as it ever did.On a successful return from \f(CWdwarf_get_globals()\fP, the \f(CWDwarf_Global\fP descriptors should be individually free'd using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_GLOBAL_CONTEXT\fP, (or\f(CWDW_DLA_GLOBAL\fP, an older name, supported for compatibility)followed by the deallocation of the list itself with the allocation type \f(CWDW_DLA_LIST\fP when the descriptors are no longer of interest..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Global *globs;int res;res = dwarf_get_globals(dbg, &globs,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use globs[i] */ dwarf_dealloc(dbg, globs[i], DW_DLA_GLOBAL_CONTEXT); } dwarf_dealloc(dbg, globs, DW_DLA_LIST);}\fP.DE.in -2.H 4 "dwarf_globname()".DS\f(CWint dwarf_globname( Dwarf_Global global, char ** return_name, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_globname()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_name\fP toa pointer to a null-terminated string that names the pubname represented by the \f(CWDwarf_Global\fP descriptor, \f(CWglobal\fP. It returns \f(CWDW_DLV_ERROR\fP on error. On a successful return from this function, the string shouldbe free'd using \f(CWdwarf_dealloc()\fP, with the allocation type\f(CWDW_DLA_STRING\fP when no longer of interest.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_global_die_offset()".DS\f(CWint dwarf_global_die_offset( Dwarf_Global global, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_global_die_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the DIE representingthe pubname that is described by the \f(CWDwarf_Global\fP descriptor, \f(CWglob\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_global_cu_offset()".DS\f(CWint dwarf_global_cu_offset( Dwarf_Global global, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_global_cu_offset()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the compilation-unitheader of the compilation-unit that contains the pubname described by the \f(CWDwarf_Global\fP descriptor, \f(CWglobal\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_get_cu_die_offset_given_cu_header_offset()".DS\f(CWint dwarf_get_cu_die_offset_given_cu_header_offset( Dwarf_Debug dbg, Dwarf_Off in_cu_header_offset, Dwarf_Off * out_cu_die_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_cu_die_offset_given_cu_header_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*out_cu_die_offset\fP tothe offset of the compilation-unit DIE given theoffset \f(CWin_cu_header_offset\fP of a compilation-unit header.It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP.This effectively turns a compilation-unit-header offsetinto a compilation-unit DIE offset (by adding thesize of the applicable CU header).This function is also sometimes useful with the \f(CWdwarf_weak_cu_offset()\fP,\f(CWdwarf_func_cu_offset()\fP,\f(CWdwarf_type_cu_offset()\fP,and\f(CWint dwarf_var_cu_offset()\fP functions.\f(CWdwarf_get_cu_die_offset_given_cu_header_offset()\fP added Rev 1.45, June, 2001.This function is declared as 'optional' in libdwarf.hon IRIX systems so the _MIPS_SYMBOL_PRESENTpredicate may be used at run time to determine if the version oflibdwarf linked into an application has this function..H 4 "dwarf_global_name_offsets()".DS\f(CWint dwarf_global_name_offsets( Dwarf_Global global, char **return_name, Dwarf_Off *die_offset, Dwarf_Off *cu_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_global_name_offsets()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_name\fP toa pointer toa null-terminated string that gives the name of the pubnamedescribed by the \f(CWDwarf_Global\fP descriptor \f(CWglobal\fP. It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.It also returns in the locations pointed to by \f(CWdie_offset\fP, and \f(CWcu_offset\fP, the offsetsof the DIE representing the pubname, and the DIErepresenting the compilation-unit containing the pubname, respectively.On a successful return from \f(CWdwarf_global_name_offsets()\fP the storage pointed to by \f(CWreturn_name\fP should be free'd using \f(CWdwarf_dealloc()\fP, with the allocation type \f(CWDW_DLA_STRING\fP when no longer of interest..H 2 "DWARF3 Type Names Operations"Section ".debug_pubtypes" is new in DWARF3..PThese functions operate on the .debug_pubtypes section of the debugginginformation. The .debug_pubtypes section contains the names of file-scopeuser-defined types, the offsets of the \f(CWDIE\fPs that represent thedefinitions of those types, and the offsets of the compilation-units that contain the definitions of those types..H 3 "Debugger Interface Operations".H 4 "dwarf_get_pubtypes()".DS\f(CWint dwarf_get_pubtypes( Dwarf_Debug dbg, Dwarf_Type **types, Dwarf_Signed *typecount, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_pubtypes()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*typecount\fP tothe count of user-definedtype names represented in the section containing user-defined type names,i.e. .debug_pubtypes. It also stores at \f(CW*types\fP, a pointer to a list of \f(CWDwarf_Pubtype\fP descriptors, one for each of the user-defined type names in the .debug_pubtypes section. It returns \f(CWDW_DLV_NOCOUNT\fP on error. It returns \f(CWDW_DLV_NO_ENTRY\fP if the .debug_pubtypes section does not exist. .POn a successful return from \f(CWdwarf_get_pubtypes()\fP, the \f(CWDwarf_Type\fP descriptors should be free'd using \f(CWdwarf_types_dealloc()\fP.\f(CWdwarf_types_dealloc()\fP is used for both\f(CWdwarf_get_pubtypes()\fP and \f(CWdwarf_get_types()\fPas the data types are the same..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Pubtype *types;int res;res = dwarf_get_pubtypes(dbg, &types,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use types[i] */ } dwarf_types_dealloc(dbg, types, cnt);}\fP.DE.in -2.H 4 "dwarf_pubtypename()".DS\f(CWint dwarf_pubtypename( Dwarf_Pubtype type, char **return_name, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_pubtypename()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_name\fP toa pointer to anull-terminated string that names the user-defined type represented by the\f(CWDwarf_Pubtype\fP descriptor, \f(CWtype\fP. It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from this function, the string shouldbe free'd using \f(CWdwarf_dealloc()\fP, with the allocation type\f(CWDW_DLA_STRING\fP when no longer of interest..H 4 "dwarf_pubtype_die_offset()".DS\f(CWint dwarf_pubtype_die_offset( Dwarf_Pubtype type, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_pubtype_die_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the DIE representingthe user-defined type that is described by the \f(CWDwarf_Pubtype\fP descriptor, \f(CWtype\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_pubtype_cu_offset()".DS\f(CWint dwarf_pubtype_cu_offset( Dwarf_Pubtype type, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_pubtype_cu_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the compilation-unitheader of the compilation-unit that contains the user-defined typedescribed by the \f(CWDwarf_Pubtype\fP descriptor, \f(CWtype\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_pubtype_name_offsets()".DS\f(CWint dwarf_pubtype_name_offsets( Dwarf_Pubtype type, char ** returned_name, Dwarf_Off * die_offset, Dwarf_Off * cu_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_pubtype_name_offsets()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_name\fP toa pointer toa null-terminated string that gives the name of the user-definedtype described by the \f(CWDwarf_Pubtype\fP descriptor \f(CWtype\fP.It also returns in the locationspointed to by \f(CWdie_offset\fP, and \f(CWcu_offset\fP, the offsetsof the DIE representing the user-defined type, and the DIErepresenting the compilation-unit containing the user-defined type, respectively.It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from \f(CWdwarf_pubtype_name_offsets()\fPthe storage pointed to by \f(CWreturned_name\fP shouldbe free'd using\f(CWdwarf_dealloc()\fP, with the allocation type \f(CWDW_DLA_STRING\fPwhen no longer of interest..H 2 "User Defined Static Variable Names Operations"This section is SGI specific and is not part of standard DWARF version 2..PThese functions operate on the .debug_varnames section of the debugginginformation. The .debug_varnames section contains the names of file-scopestatic variables, the offsets of the \f(CWDIE\fPs that represent the definitions of those variables, and the offsets of the compilation-unitsthat contain the definitions of those variables..P.H 2 "Weak Name Space Operations" These operations operate on the .debug_weaknames section of the debugging information..PThese operations are SGI specific, not part of standard DWARF..P.H 3 "Debugger Interface Operations".H 4 "dwarf_get_weaks()".DS\f(CWint dwarf_get_weaks( Dwarf_Debug dbg, Dwarf_Weak **weaks, Dwarf_Signed *weak_count, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_weaks()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*weak_count\fP tothe count of weak namesrepresented in the section containing weak names i.e. .debug_weaknames. It returns \f(CWDW_DLV_ERROR\fP on error. It returns \f(CWDW_DLV_NO_ENTRY\fP if the section does not exist. It also stores in \f(CW*weaks\fP, a pointer to a list of \f(CWDwarf_Weak\fP descriptors, one for each of the weak names in the .debug_weaknames section. .POn a successful return from this function,the \f(CWDwarf_Weak\fP descriptors should be free'd using\f(CWdwarf_weaks_dealloc()\fP when the data is no longer ofinterest. \f(CWdwarf_weaks_dealloc()\fPis new as of July 15, 2005..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Weak *weaks;int res;res = dwarf_get_weaks(dbg, &weaks,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use weaks[i] */ } dwarf_weaks_dealloc(dbg, weaks, cnt);}\fP.DE.in -2.PThe following code is deprecated as of July 15, 2005 as it does notfree all relevant memory.This approach still works as well as it ever did.On a successful return from \f(CWdwarf_get_weaks()\fPthe \f(CWDwarf_Weak\fP descriptors should be individually free'd using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_WEAK_CONTEXT\fP, (or\f(CWDW_DLA_WEAK\fP, an older name, supported for compatibility)followed by the deallocation of the list itself with the allocation type \f(CWDW_DLA_LIST\fP when the descriptors are no longer of interest..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Weak *weaks;int res;res = dwarf_get_weaks(dbg, &weaks,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use weaks[i] */ dwarf_dealloc(dbg, weaks[i], DW_DLA_WEAK_CONTEXT); } dwarf_dealloc(dbg, weaks, DW_DLA_LIST);}\fP.DE.in -2.H 4 "dwarf_weakname()".DS\f(CWint dwarf_weakname( Dwarf_Weak weak, char ** return_name, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_weakname()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_name\fP toa pointer to a null-terminatedstring that names the weak name represented by the \f(CWDwarf_Weak\fP descriptor, \f(CWweak\fP. It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from this function, the string shouldbe free'd using \f(CWdwarf_dealloc()\fP, with the allocation type\f(CWDW_DLA_STRING\fP when no longer of interest..DS\f(CWint dwarf_weak_die_offset( Dwarf_Weak weak, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_weak_die_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP to the offset inthe section containing DIE's, i.e. .debug_info, of the DIE representingthe weak name that is described by the \f(CWDwarf_Weak\fP descriptor, \f(CWweak\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_weak_cu_offset()".DS\f(CWint dwarf_weak_cu_offset( Dwarf_Weak weak, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_weak_cu_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP to the offset inthe section containing DIE's, i.e. .debug_info, of the compilation-unitheader of the compilation-unit that contains the weak name described by the \f(CWDwarf_Weak\fP descriptor, \f(CWweak\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_weak_name_offsets()".DS\f(CWint dwarf_weak_name_offsets( Dwarf_Weak weak, char ** weak_name, Dwarf_Off *die_offset, Dwarf_Off *cu_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_weak_name_offsets()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*weak_name\fP toa pointer toa null-terminated string that gives the name of the weak namedescribed by the \f(CWDwarf_Weak\fP descriptor \f(CWweak\fP. It also returns in the locations pointed to by \f(CWdie_offset\fP, and \f(CWcu_offset\fP, the offsetsof the DIE representing the weakname, and the DIErepresenting the compilation-unit containing the weakname, respectively.It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from \f(CWdwarf_weak_name_offsets()\fP the storage pointed to by \f(CWweak_name\fPshould be free'd using \f(CWdwarf_dealloc()\fP, with the allocation type \f(CWDW_DLA_STRING\fP when no longer of interest..H 2 "Static Function Names Operations"This section is SGI specific and is not part of standard DWARF version 2..PThese function operate on the .debug_funcnames section of the debugginginformation. The .debug_funcnames section contains the names of staticfunctions defined in the object, the offsets of the \f(CWDIE\fPs thatrepresent the definitions of the corresponding functions, and the offsetsof the start of the compilation-units that contain the definitions ofthose functions..H 3 "Debugger Interface Operations".H 4 "dwarf_get_funcs()".DS\f(CWint dwarf_get_funcs( Dwarf_Debug dbg, Dwarf_Func **funcs, Dwarf_Signed *func_count, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_funcs()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*func_count\fP tothe count of staticfunction names represented in the section containing static functionnames, i.e. .debug_funcnames. It also stores, at \f(CW*funcs\fP, a pointer to a list of \f(CWDwarf_Func\fP descriptors, one for each of the static functions in the .debug_funcnames section. It returns \f(CWDW_DLV_NOCOUNT\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fPif the .debug_funcnames section does not exist. .POn a successful return from \f(CWdwarf_get_funcs()\fP, the \f(CWDwarf_Func\fPdescriptors should be free'd using \f(CWdwarf_funcs_dealloc()\fP.\f(CWdwarf_funcs_dealloc()\fP is new as of July 15, 2005..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Func *funcs;int fres;fres = dwarf_get_funcs(dbg, &funcs, &error);if (fres == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use funcs[i] */ } dwarf_funcs_dealloc(dbg, funcs, cnt);}\fP.DE.in -2.PThe following code is deprecated as of July 15, 2005 as it does notfree all relevant memory.This approach still works as well as it ever did.On a successful return from \f(CWdwarf_get_funcs()\fP, the \f(CWDwarf_Func\fP descriptors should be individually free'd using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_FUNC_CONTEXT\fP, (or\f(CWDW_DLA_FUNC\fP, an older name, supported for compatibility)followed by the deallocation of the list itself with the allocation type \f(CWDW_DLA_LIST\fP when the descriptors are no longer of interest..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Func *funcs;int fres;fres = dwarf_get_funcs(dbg, &funcs, &error);if (fres == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use funcs[i] */ dwarf_dealloc(dbg, funcs[i], DW_DLA_FUNC_CONTEXT); } dwarf_dealloc(dbg, funcs, DW_DLA_LIST);}\fP.DE.in -2.H 4 "dwarf_funcname()".DS\f(CWint dwarf_funcname( Dwarf_Func func, char ** return_name, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_funcname()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_name\fP toa pointer to anull-terminated string that names the static function represented by the\f(CWDwarf_Func\fP descriptor, \f(CWfunc\fP. It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from this function, the string shouldbe free'd using \f(CWdwarf_dealloc()\fP, with the allocation type\f(CWDW_DLA_STRING\fP when no longer of interest..H 4 "dwarf_func_die_offset()".DS\f(CWint dwarf_func_die_offset( Dwarf_Func func, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_func_die_offset()\fP, returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the DIE representingthe static function that is described by the \f(CWDwarf_Func\fP descriptor, \f(CWfunc\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_func_cu_offset()".DS\f(CWint dwarf_func_cu_offset( Dwarf_Func func, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_func_cu_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the compilation-unitheader of the compilation-unit that contains the static functiondescribed by the \f(CWDwarf_Func\fP descriptor, \f(CWfunc\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_func_name_offsets()".DS\f(CWint dwarf_func_name_offsets( Dwarf_Func func, char **func_name, Dwarf_Off *die_offset, Dwarf_Off *cu_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_func_name_offsets()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*func_name\fP toa pointer toa null-terminated string that gives the name of the staticfunction described by the \f(CWDwarf_Func\fP descriptor \f(CWfunc\fP.It also returns in the locationspointed to by \f(CWdie_offset\fP, and \f(CWcu_offset\fP, the offsetsof the DIE representing the static function, and the DIErepresenting the compilation-unit containing the static function, respectively.It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from \f(CWdwarf_func_name_offsets()\fPthe storage pointed to by \f(CWfunc_name\fP should be free'd using\f(CWdwarf_dealloc()\fP, with the allocation type \f(CWDW_DLA_STRING\fPwhen no longer of interest..H 2 "User Defined Type Names Operations"Section "debug_typenames" is SGI specific and is not part of standard DWARF version 2.(However, an identical section is part of DWARF version 3named ".debug_pubtypes", see \f(CWdwarf_get_pubtypes()\fP above.).PThese functions operate on the .debug_typenames section of the debugginginformation. The .debug_typenames section contains the names of file-scopeuser-defined types, the offsets of the \f(CWDIE\fPs that represent thedefinitions of those types, and the offsets of the compilation-units that contain the definitions of those types..H 3 "Debugger Interface Operations".H 4 "dwarf_get_types()".DS\f(CWint dwarf_get_types( Dwarf_Debug dbg, Dwarf_Type **types, Dwarf_Signed *typecount, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_types()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*typecount\fP tothe count of user-definedtype names represented in the section containing user-defined type names,i.e. .debug_typenames. It also stores at \f(CW*types\fP, a pointer to a list of \f(CWDwarf_Type\fP descriptors, one for each of the user-defined type names in the .debug_typenames section. It returns \f(CWDW_DLV_NOCOUNT\fP on error. It returns \f(CWDW_DLV_NO_ENTRY\fP if the .debug_typenames section does not exist. .POn a successfulreturn from \f(CWdwarf_get_types()\fP, the \f(CWDwarf_Type\fP descriptors should befree'd using \f(CWdwarf_types_dealloc()\fP.\f(CWdwarf_types_dealloc()\fP is new as of July 15, 2005and frees all memory allocated by \f(CWdwarf_get_types()\fP..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Type *types;int res;res = dwarf_get_types(dbg, &types,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use types[i] */ } dwarf_types_dealloc(dbg, types, cnt);}\fP.DE.in -2.PThe following code is deprecated as of July 15, 2005 as it does notfree all relevant memory.This approach still works as well as it ever did.On a successful return from \f(CWdwarf_get_types()\fP, the \f(CWDwarf_Type\fP descriptors should be individually free'd using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_TYPENAME_CONTEXT\fP, (or\f(CWDW_DLA_TYPENAME\fP, an older name, supported for compatibility)followed by the deallocation of the list itself with the allocation type \f(CWDW_DLA_LIST\fP when the descriptors are no longer of interest..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Type *types;int res;res = dwarf_get_types(dbg, &types,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use types[i] */ dwarf_dealloc(dbg, types[i], DW_DLA_TYPENAME_CONTEXT); } dwarf_dealloc(dbg, types, DW_DLA_LIST);}\fP.DE.in -2.H 4 "dwarf_typename()".DS\f(CWint dwarf_typename( Dwarf_Type type, char **return_name, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_typename()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_name\fP toa pointer to anull-terminated string that names the user-defined type represented by the\f(CWDwarf_Type\fP descriptor, \f(CWtype\fP. It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from this function, the string shouldbe free'd using \f(CWdwarf_dealloc()\fP, with the allocation type\f(CWDW_DLA_STRING\fP when no longer of interest..H 4 "dwarf_type_die_offset()".DS\f(CWint dwarf_type_die_offset( Dwarf_Type type, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_type_die_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the DIE representingthe user-defined type that is described by the \f(CWDwarf_Type\fP descriptor, \f(CWtype\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_type_cu_offset()".DS\f(CWint dwarf_type_cu_offset( Dwarf_Type type, Dwarf_Off *return_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_type_cu_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the compilation-unitheader of the compilation-unit that contains the user-defined typedescribed by the \f(CWDwarf_Type\fP descriptor, \f(CWtype\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_type_name_offsets()".DS\f(CWint dwarf_type_name_offsets( Dwarf_Type type, char ** returned_name, Dwarf_Off * die_offset, Dwarf_Off * cu_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_type_name_offsets()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_name\fP toa pointer toa null-terminated string that gives the name of the user-definedtype described by the \f(CWDwarf_Type\fP descriptor \f(CWtype\fP.It also returns in the locationspointed to by \f(CWdie_offset\fP, and \f(CWcu_offset\fP, the offsetsof the DIE representing the user-defined type, and the DIErepresenting the compilation-unit containing the user-defined type, respectively.It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from \f(CWdwarf_type_name_offsets()\fPthe storage pointed to by \f(CWreturned_name\fP shouldbe free'd using\f(CWdwarf_dealloc()\fP, with the allocation type \f(CWDW_DLA_STRING\fPwhen no longer of interest..H 2 "User Defined Static Variable Names Operations"This section is SGI specific and is not part of standard DWARF version 2..PThese functions operate on the .debug_varnames section of the debugginginformation. The .debug_varnames section contains the names of file-scopestatic variables, the offsets of the \f(CWDIE\fPs that represent the definitions of those variables, and the offsets of the compilation-unitsthat contain the definitions of those variables..P.H 3 "Debugger Interface Operations".H 4 "dwarf_get_vars()".DS\f(CWint dwarf_get_vars( Dwarf_Debug dbg, Dwarf_Var **vars, Dwarf_Signed *var_count, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_vars()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*var_count\fP tothe count of file-scopestatic variable names represented in the section containing file-scope static variable names, i.e. .debug_varnames. It also stores, at \f(CW*vars\fP, a pointer to a list of \f(CWDwarf_Var\fP descriptors, one for each of the file-scope staticvariable names in the .debug_varnames section. It returns \f(CWDW_DLV_ERROR\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fP if the .debug_varnames section does not exist. .P The following is new as of July 15, 2005.On a successful returnfrom \f(CWdwarf_get_vars()\fP, the \f(CWDwarf_Var\fP descriptors should befree'd using \f(CWdwarf_vars_dealloc()\fP..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Var *vars;int res;res = dwarf_get_vars(dbg, &vars,&cnt &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use vars[i] */ } dwarf_vars_dealloc(dbg, vars, cnt);}\fP.DE.in -2.P The following code is deprecated as of July 15, 2005 as it does notfree all relevant memory.This approach still works as well as it ever did.On a successful return from \f(CWdwarf_get_vars()\fP, the \f(CWDwarf_Var\fP descriptors should be individually free'd using \f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_VAR_CONTEXT\fP, (or\f(CWDW_DLA_VAR\fP, an older name, supported for compatibility)followed by the deallocation of the list itself with the allocation type \f(CWDW_DLA_LIST\fP when the descriptors are no longer of interest..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Var *vars;int res;res = dwarf_get_vars(dbg, &vars,&cnt &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use vars[i] */ dwarf_dealloc(dbg, vars[i], DW_DLA_VAR_CONTEXT); } dwarf_dealloc(dbg, vars, DW_DLA_LIST);}\fP.DE.in -2.H 4 "dwarf_varname()".DS\f(CWint dwarf_varname( Dwarf_Var var, char ** returned_name, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_varname()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_name\fP toa pointer to anull-terminated string that names the file-scope static variable represented by the \f(CWDwarf_Var\fP descriptor, \f(CWvar\fP. It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from this function, the string shouldbe free'd using \f(CWdwarf_dealloc()\fP, with the allocation type\f(CWDW_DLA_STRING\fP when no longer of interest..H 4 "dwarf_var_die_offset()".DS\f(CWint dwarf_var_die_offset( Dwarf_Var var, Dwarf_Off *returned_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_var_die_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the DIE representingthe file-scope static variable that is described by the \f(CWDwarf_Var\fP descriptor, \f(CWvar\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_var_cu_offset()".DS\f(CWint dwarf_var_cu_offset( Dwarf_Var var, Dwarf_Off *returned_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_var_cu_offset()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_offset\fP tothe offset inthe section containing DIE's, i.e. .debug_info, of the compilation-unitheader of the compilation-unit that contains the file-scope staticvariable described by the \f(CWDwarf_Var\fP descriptor, \f(CWvar\fP. It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 4 "dwarf_var_name_offsets()".DS\f(CWint dwarf_var_name_offsets( Dwarf_Var var, char **returned_name, Dwarf_Off *die_offset, Dwarf_Off *cu_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_var_name_offsets()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_name\fP toa pointer toa null-terminated string that gives the name of the file-scopestatic variable described by the \f(CWDwarf_Var\fP descriptor \f(CWvar\fP.It also returns in the locationspointed to by \f(CWdie_offset\fP, and \f(CWcu_offset\fP, the offsetsof the DIE representing the file-scope static variable, and the DIErepresenting the compilation-unit containing the file-scope static variable, respectively.It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.On a successful return from \f(CWdwarf_var_name_offsets()\fP the storage pointed to by\f(CWreturned_name\fPshould be free'd using \f(CWdwarf_dealloc()\fP, with the allocation type \f(CWDW_DLA_STRING\fP when no longer of interest..H 2 "Macro Information Operations".H 3 "General Macro Operations".H 4 "dwarf_find_macro_value_start()".DS\f(CWchar *dwarf_find_macro_value_start(char * macro_string);\fP.DEGiven a macro string in the standard form defined in the DWARFdocument ("name <space> value" or "name(args)<space>value")this returns a pointer to the first byte of the macro value.It does not alter the string pointed to by macro_string or copythe string: it returns a pointer into the string whoseaddress was passed in..H 3 "Debugger Interface Macro Operations"Macro information is accessed from the .debug_info section via theDW_AT_macro_info attribute (whose value is an offset into .debug_macinfo)..PNo Functions yet defined..H 3 "Low Level Macro Information Operations".H 4 "dwarf_get_macro_details()".DS\f(CWint dwarf_get_macro_details(Dwarf_Debug /*dbg*/, Dwarf_Off macro_offset, Dwarf_Unsigned maximum_count, Dwarf_Signed * entry_count, Dwarf_Macro_Details ** details, Dwarf_Error * err);\fP.DE\f(CWdwarf_get_macro_details()\fPreturns \f(CWDW_DLV_OK\fP and sets\f(CWentry_count\fP to the number of \f(CWdetails\fP recordsreturned through the \f(CWdetails\fP pointer.The data returned thru \f(CWdetails\fP should be freedby a call to \f(CWdwarf_dealloc()\fP with the allocation type\f(CWDW_DLA_STRING\fP.If \f(CWDW_DLV_OK\fP is returned, the \f(CWentry_count\fP willbe at least 1, sincea compilation unit with macro information but no macros willhave at least one macro data byte of 0..P\f(CWdwarf_get_macro_details()\fPbegins at the \f(CWmacro_offset\fP offset you supplyand ends at the end of a compilation unit or at \f(CWmaximum_count\fPdetail records (whichever comes first).If \f(CWmaximum_count\fP is 0, it is treated as if it were the maximumpossible unsigned integer..P\f(CWdwarf_get_macro_details()\fPattempts to set \f(CWdmd_fileindex\fP to the correct file in every\f(CWdetails\fP record. If it is unable to do so (or wheneverthe current file index is unknown, it sets \f(CWdmd_fileindex\fPto -1..P\f(CWdwarf_get_macro_details()\fP returns \f(CWDW_DLV_ERROR\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fP if there is no moremacro information at that \f(CWmacro_offset\fP. If \f(CWmacro_offset\fPis passed in as 0, a \f(CWDW_DLV_NO_ENTRY\fP return means there isno macro information..P.in +2.DS\f(CWDwarf_Unsigned max = 0;Dwarf_Off cur_off = 0;Dwarf_Signed count = 0;Dwarf_Macro_Details *maclist;int errv;/* loop thru all the compilation units macro info */while((errv = dwarf_macro_details(dbg, cur_off,max, &count,&maclist,&error))== DW_DLV_OK) { for (i = 0; i < count; ++i) { /* use maclist[i] */ } cur_off = maclist[count-1].dmd_offset + 1; dwarf_dealloc(dbg, maclist, DW_DLA_STRING);}\fP.DE.H 2 "Low Level Frame Operations"These functions provide information about stack frames to beused to perform stack traces. The information is an abstractionof a table with a row per instruction and a column per registerand a column for the canonical frame address (CFA, which correspondsto the notion of a frame pointer), as well as a column for the return address. .PFrom 1993-2006 the interface we'll here refer to as DWARF2made the CFA be a column in the matrix, but leftDW_FRAME_UNDEFINED_VAL, and DW_FRAME_SAME_VAL out of the matrix(giving them high numbers). As of the DWARF3 interfacesintroduced in this document in April 2006, there are *two*interfaces. .PThe original still exists (see.dwarf_get_fde_info_for_reg() and dwarf_get_fde_info_for_all_regs() below)and works adequately for MIPS/IRIX DWARF2 and ABI/ISA setsthat are sufficiently similar (but the settings for non-MIPSmust be set into libdwarf.h and cannot be changed at runtime)..PA new interface set of dwarf_get_fde_info_for_reg3(),dwarf_get_fde_info_for_cfa_reg3(), dwarf_get_fde_info_for_all_regs3()dwarf_set_frame_rule_inital_value(), dwarf_set_frame_rule_table_size()is more flexibleand should work for many more architecturesand the setting of DW_FRAME_CFA_COL and the size ofthe table can be set at runtime..PEach cell in the table contains one of the following:.AL .LIA register + offset(a)(b).LIA register(c)(d).LIA marker (DW_FRAME_UNDEFINED_VAL) meaning \fIregister value undefined\fP.LIA marker (DW_FRAME_SAME_VAL) meaning \fIregister value same as in caller\fP.LE.P(a old DWARF2 interface) When the column is DW_FRAME_CFA_COL: the registernumber is a real hardware register, not a referenceto DW_FRAME_CFA_COL, not DW_FRAME_UNDEFINED_VAL,and not DW_FRAME_SAME_VAL. The CFA rule value should be the stack pointerplus offset 0 when no other value makes sense.A value of DW_FRAME_SAME_VAL wouldbe semi-logical, but since the CFA is not a real register,not really correct.A value of DW_FRAME_UNDEFINED_VAL would implythe CFA is undefined --this seems to be a useless notion, asthe CFA is a means to finding real registers,so those real registers should be marked DW_FRAME_UNDEFINED_VAL,and the CFA column content (whatever register itspecifies) becomes unreferenced by anything..P(a new April 2006 DWARF2/3 interface): The CFA isseparately accessible and not part of the table.The 'rule number' for the CFA is a number outside the table. So the CFA is a marker, not a register number.See DW_FRAME_CFA_COL3 in libdwarf.h anddwarf_get_fde_info_for_cfa_reg3()..P(b) When the column is not DW_FRAME_CFA_COL, the 'register'will and must be DW_FRAME_CFA_COL, implying thatto get the final location for the column one must addthe offset here plus the DW_FRAME_CFA_COL rule value..P(c) When the column is DW_FRAME_CFA_COL, then the registernumber is (must be) a real hardware register .If it were DW_FRAME_UNDEFINED_VAL or DW_FRAME_SAME_VALit would be a marker, not a register number..P(d) When the column is not DW_FRAME_CFA_COL, the registermay be a hardware register.It will not be DW_FRAME_CFA_COL..PThere is no 'column' for DW_FRAME_UNDEFINED_VAL or DW_FRAME_SAME_VAL.Figure \n(aXis machine dependent and represents MIPS cpu registerassignments..DS.TScenter box, tab(:);lfB lfB lfBl c l.NAME:value:PURPOSE_DW_FRAME_CFA_COL:0:column used for CFADW_FRAME_REG1:1:integer regster 1DW_FRAME_REG2:2:integer register 2---::obvious names and values hereDW_FRAME_REG30:30:integer register 30 DW_FRAME_REG31:31:integer register 31DW_FRAME_FREG0:32:floating point register 0DW_FRAME_FREG1:33:floating point register 1---::obvious names and values hereDW_FRAME_FREG30:62:floating point register 30DW_FRAME_FREG31:63:floating point register 31DW_FRAME_RA_COL:64:column recording raDW_FRAME_UNDEFINED_VAL:1034:register val undefinedDW_FRAME_SAME_VAL:1035:register same as in caller.TE.FG "Frame Information Rule Assignments".DE.PThe following table shows SGI/MIPS specificspecial cell values: these values mean that the cell has the value \fIundefined\fP or \fIsame value\fPrespectively, rather than containing a \fIregister\fP or\fIregister+offset\fP. It assumes DW_FRAME_CFA_COL is a table rule, whichis not readily accomplished or sensible for some architectures..P.DS.TScenter box, tab(:);lfB lfB lfBl c l.NAME:value:PURPOSE_DW_FRAME_UNDEFINED_VAL:1034:means undefined value.::Not a column or register valueDW_FRAME_SAME_VAL:1035:means 'same value' as::caller had. Not a column or ::register value.TE.FG "Frame Information Special Values".DE.PThe following table shows more general special cell values. These values meanthat the cell register-number refers to the \fIcfa-register\fP or \fIundefined-value\fP or \fIsame-value\fPrespectively, rather than referring to a \fIregister in the table\fP.The generality arises from making DW_FRAME_CFA_COL3 beoutside the set of registers and making the cfa rule accessiblefrom outside the rule-table..P.DS.TScenter box, tab(:);lfB lfB lfBl c l.NAME:value:PURPOSE_DW_FRAME_UNDEFINED_VAL:1034:means undefined value.::Not a column or register valueDW_FRAME_SAME_VAL:1035:means 'same value' as::caller had. Not a column or::register valueDW_FRAME_CFA_COL3:1036:means 'cfa register'is referred to,::not a real register, not a column, but the cfa (the cfa::does have a value, but in the DWARF3 libdwarf interface::it does not have a 'real register number')..TE.DE.\"#if 0.\".P.\"Since the cie and fde entries are not "organized" by anything.\"outside of the .debug_frame section one must scan them all to .\"find all entry addresses and lengths. Since there is one fde .\"per function this can be a rather long list..\"#endif.P.H 4 "dwarf_get_fde_list()".DS\f(CWint dwarf_get_fde_list( Dwarf_Debug dbg, Dwarf_Cie **cie_data, Dwarf_Signed *cie_element_count, Dwarf_Fde **fde_data, Dwarf_Signed *fde_element_count, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_fde_list()\fP stores a pointer to a list of \f(CWDwarf_Cie\fP descriptors in \f(CW*cie_data\fP, and the count of the number of descriptors in \f(CW*cie_element_count\fP. There is a descriptor for each CIE in the .debug_frame section. Similarly, it stores a pointer to a list of \f(CWDwarf_Fde\fP descriptors in \f(CW*fde_data\fP, and the count of the number of descriptors in \f(CW*fde_element_count\fP. There is one descriptor per FDE in the .debug_frame section. \f(CWdwarf_get_fde_list()\fP returns \f(CWDW_DLV_EROR\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fP if it cannot find frame entries.It returns \f(CWDW_DLV_OK\fP on a successful return..POn successful return, structures pointed to by adescriptor should be free'd using \f(CWdwarf_fde_cie_list_dealloc()\fP.This dealloc approach is new as of July 15, 2005..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Cie *cie_data;Dwarf_Signed cie_count;Dwarf_Fde *fde_data;Dwarf_Signed fde_count;int fres;fres = dwarf_get_fde_list(dbg,&cie_data,&cie_count, &fde_data,&fde_count,&error);if (fres == DW_DLV_OK) { dwarf_fde_cie_list_dealloc(dbg, cie_data, cie_count, fde_data,fde_count);}\fP.DE.in -2.PThe following code is deprecated as of July 15, 2005 as it does notfree all relevant memory.This approach still works as well as it ever did..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Cie *cie_data;Dwarf_Signed cie_count;Dwarf_Fde *fde_data;Dwarf_Signed fde_count;int fres;fres = dwarf_get_fde_list(dbg,&cie_data,&cie_count, &fde_data,&fde_count,&error);if (fres == DW_DLV_OK) { for (i = 0; i < cie_count; ++i) { /* use cie[i] */ dwarf_dealloc(dbg, cie_data[i], DW_DLA_CIE); } for (i = 0; i < fde_count; ++i) { /* use fde[i] */ dwarf_dealloc(dbg, fde_data[i], DW_DLA_FDE); } dwarf_dealloc(dbg, cie_data, DW_DLA_LIST); dwarf_dealloc(dbg, fde_data, DW_DLA_LIST);}\fP.DE.in -2.P.H 4 "dwarf_get_fde_list_eh()".DS\f(CWint dwarf_get_fde_list_eh( Dwarf_Debug dbg, Dwarf_Cie **cie_data, Dwarf_Signed *cie_element_count, Dwarf_Fde **fde_data, Dwarf_Signed *fde_element_count, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_fde_list_eh()\fP is identical to\f(CWdwarf_get_fde_list()\fP except that\f(CWdwarf_get_fde_list_eh()\fP reads the GNU ecgssection named .eh_frame (C++ exception handling information).\f(CWdwarf_get_fde_list_eh()\fP stores a pointer to a list of\f(CWDwarf_Cie\fP descriptors in \f(CW*cie_data\fP, and thecount of the number of descriptors in \f(CW*cie_element_count\fP.There is a descriptor for each CIE in the .debug_frame section.Similarly, it stores a pointer to a list of \f(CWDwarf_Fde\fPdescriptors in \f(CW*fde_data\fP, and the count of the numberof descriptors in \f(CW*fde_element_count\fP. There is onedescriptor per FDE in the .debug_frame section.\f(CWdwarf_get_fde_list()\fP returns \f(CWDW_DLV_EROR\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fP if it cannot find exception handling entries.It returns \f(CWDW_DLV_OK\fP on a successful return..POn successful return, structures pointed to by adescriptor should be free'd using \f(CWdwarf_fde_cie_list_dealloc()\fP.This dealloc approach is new as of July 15, 2005..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Cie *cie_data;Dwarf_Signed cie_count;Dwarf_Fde *fde_data;Dwarf_Signed fde_count;int fres;fres = dwarf_get_fde_list(dbg,&cie_data,&cie_count, &fde_data,&fde_count,&error);if (fres == DW_DLV_OK) { dwarf_fde_cie_list_dealloc(dbg, cie_data, cie_count, fde_data,fde_count);}\fP.DE.in -2.P.H 4 "dwarf_get_cie_of_fde()".DS\f(CWint dwarf_get_cie_of_fde(Dwarf_Fde fde, Dwarf_Cie *cie_returned, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_cie_of_fde()\fP stores a \f(CWDwarf_Cie\fPinto the \f(CWDwarf_Cie\fP that \f(CWcie_returned\fP points at.If one has called dwarf_get_fde_list and does not wishto dwarf_dealloc() all the individual FDEs immediately, onemust also avoid dwarf_dealloc-ing the CIEs for those FDEsnot immediately dealloc'd.Failing to observe this restriction will cause the FDE(s) notdealloced to become invalid: an FDE contains (hidden in it)a CIE pointer which will be be invalid (stale, pointing to freed memory)if the CIE is dealloc'd.The invalid CIE pointer internal to the FDE cannot be detectedas invalid by libdwarf.If one later passes an FDE with a stale internal CIE pointerto one of the routines taking an FDE as input the result willbe failure of the call (returning DW_DLV_ERROR) at best andit is possible a coredump or worse will happpen (eventually).\f(CWdwarf_get_cie_of_fde()\fP returns \f(CWDW_DLV_OK\fP if it is successful (it will beunless fde is the NULL pointer).It returns \f(CWDW_DLV_ERROR\fP if the fde is invalid (NULL)..PEach \f(CWDwarf_Fde\fP descriptor describes information about theframe for a particular subroutine or function.\f(CWint dwarf_get_fde_for_die\fP is SGI/MIPS specific..H 4 "dwarf_get_fde_for_die()".DS\f(CWint dwarf_get_fde_for_die( Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Fde * return_fde, Dwarf_Error *error)\fP.DEWhen it succeeds,\f(CWdwarf_get_fde_for_die()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*return_fde\fPtoa \f(CWDwarf_Fde\fPdescriptor representing frame information for the given \f(CWdie\fP. It looks for the \f(CWDW_AT_MIPS_fde\fP attribute in the given \f(CWdie\fP.If it finds it, is uses the value of the attribute as the offset in the .debug_frame section where the FDE begins.If there is no \f(CWDW_AT_MIPS_fde\fP it returns \f(CWDW_DLV_NO_ENTRY\fP.If there is an error it returns \f(CWDW_DLV_ERROR\fP..H 4 "dwarf_get_fde_range()".DS\f(CWint dwarf_get_fde_range( Dwarf_Fde fde, Dwarf_Addr *low_pc, Dwarf_Unsigned *func_length, Dwarf_Ptr *fde_bytes, Dwarf_Unsigned *fde_byte_length, Dwarf_Off *cie_offset, Dwarf_Signed *cie_index, Dwarf_Off *fde_offset, Dwarf_Error *error);\fP.DEOn success,\f(CWdwarf_get_fde_range()\fP returns\f(CWDW_DLV_OK\fP.The location pointed to by \f(CWlow_pc\fP is set to the low pc value forthis function. The location pointed to by \f(CWfunc_length\fP is set to the length of the function in bytes. This is essentially thelength of the text section for the function. The location pointedto by \f(CWfde_bytes\fP is set to the address where the FDE beginsin the .debug_frame section. The location pointed to by \f(CWfde_byte_length\fP is set to the length in bytes of the portionof .debug_frame for this FDE. This is the same as the value returnedby \f(CWdwarf_get_fde_range\fP. The location pointed to by \f(CWcie_offset\fP is set to the offset in the .debug_frame sectionof the CIE used by this FDE. The location pointed to by \f(CWcie_index\fPis set to the index of the CIE used by this FDE. The index is the index of the CIE in the list pointed to by \f(CWcie_data\fP as set by the function \f(CWdwarf_get_fde_list()\fP. However, if the function\f(CWdwarf_get_fde_for_die()\fP was used to obtain the given \f(CWfde\fP, this index may not be correct. The location pointed to by \f(CWfde_offset\fP is set to the offset of the start of this FDE in the .debug_frame section. \f(CWdwarf_get_fde_range()\fP returns \f(CWDW_DLV_ERROR\fP on error..H 4 "dwarf_get_cie_info()".DS\f(CWint dwarf_get_cie_info( Dwarf_Cie cie, Dwarf_Unsigned *bytes_in_cie, Dwarf_Small *version, char **augmenter, Dwarf_Unsigned *code_alignment_factor, Dwarf_Signed *data_alignment_factor, Dwarf_Half *return_address_register_rule, Dwarf_Ptr *initial_instructions, Dwarf_Unsigned *initial_instructions_length, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_cie_info()\fP is primarily for Internal-level Interface consumers. If successful,it returns\f(CWDW_DLV_OK\fP and sets \f(CW*bytes_in_cie\fP tothe number of bytes in the portion of theframes section for the CIE represented by the given \f(CWDwarf_Cie\fPdescriptor, \f(CWcie\fP. The other fields are directly taken from the cie and returned, via the pointers to the caller. It returns \f(CWDW_DLV_ERROR\fP on error..H 4 "dwarf_get_fde_instr_bytes()".DS\f(CWint dwarf_get_fde_instr_bytes( Dwarf_Fde fde, Dwarf_Ptr *outinstrs, Dwarf_Unsigned *outlen, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_fde_instr_bytes()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*outinstrs\fP toa pointer to a set of bytes which are theactual frame instructions for this fde.It also sets \f(CW*outlen\fP to the length, inbytes, of the frame instructions.It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP.The intent is to allow low-level consumers like a dwarf-dumperto print the bytes in some fashion.The memory pointed to by \f(CWoutinstrs\fPmust not be changed and thereis nothing to free..H 4 "dwarf_get_fde_info_for_reg()"This interface is suitable for DWARF2 but is notsufficient for DWARF3. See \f(CWint dwarf_get_fde_info_for_reg3\fP..DS\f(CWint dwarf_get_fde_info_for_reg( Dwarf_Fde fde, Dwarf_Half table_column, Dwarf_Addr pc_requested, Dwarf_Signed *offset_relevant, Dwarf_Signed *register_num, Dwarf_Signed *offset, Dwarf_Addr *row_pc, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_fde_info_for_reg()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*offset_relevant\fP tonon-zero if the offset is relevant for therow specified by \f(CWpc_requested\fP and column specified by\f(CWtable_column\fP, for the FDE specified by \f(CWfde\fP. Theintent is to return the rule for the given pc value and register.The location pointed to by \f(CWregister_num\fP is set to the registervalue for the rule. The location pointed to by \f(CWoffset\fP is set to the offset value for the rule. If offset is not relevant for this rule, \f(CW*offset_relevant\fP isset to zero.Since more than one pc value will have rows with identical entries, the user may want toknow the earliest pc value after which the rules for all the columnsremained unchanged. Recall that in the virtual table that the frame informationrepresents there may be one or more table rows with identical data(each such table row at a different pc value).Given a \f(CWpc_requested\fP which refers to a pc in such a groupof identical rows, the location pointed to by \f(CWrow_pc\fP is set to the lowest pc valuewithin the group of identical rows.The value put in \f(CW*register_num\fP any of the\f(CWDW_FRAME_*\fP table columns values specified in \f(CWlibdwarf.h\fPor \f(CWdwarf.h\fP.\f(CWdwarf_get_fde_info_for_reg\fP returns \f(CWDW_DLV_ERROR\fP if there is an error. It is usable with either \f(CWdwarf_get_fde_n()\fP or \f(CWdwarf_get_fde_at_pc()\fP..H 4 "dwarf_get_fde_info_for_all_regs()".DS\f(CWint dwarf_get_fde_info_for_all_regs( Dwarf_Fde fde, Dwarf_Addr pc_requested, Dwarf_Regtable *reg_table, Dwarf_Addr *row_pc, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_fde_info_for_all_regs()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*reg_table\fP for the row specified by\f(CWpc_requested\fP for the FDE specified by \f(CWfde\fP. .PThe intent isto return the rules for decoding all the registers, given a pc value.\f(CWreg_table\fP is an array of rules, one for each register specified in\f(CWdwarf.h\fP. The rule for each register contains three items - \f(CWdw_regnum\fP which denotes the register value for that rule,\f(CWdw_offset\fP which denotes the offset value for that rule and \f(CWdw_offset_relevant\fP which is set to zero if offset is not relevant for that rule. See \f(CWdwarf_get_fde_info_fo_reg()\fP for a description of \f(CWrow_pc\fP..P\f(CWdwarf_get_fde_info_for_all_regs\fP returns \f(CWDW_DLV_ERROR\fP if there is an error. .P\f(CWint dwarf_get_fde_info_for_all_regs\fP is SGI/MIPS specific..H 4 "dwarf_set_frame_rule_table_size()".PThis allows consumers to set the size of the (internal to libdwarf)rule table. It should be at least as large as thenumber of real registers in the ABI which is to be read infor the dwarf_get_fde_info_for_reg3() or dwarf_get_fde_info_for_all_regs3()functions to work properly.It must be less than the marker valuesDW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL, DW_FRAME_CFA_COL3..P.DS\f(CWDwarf_Halfdwarf_set_frame_rule_table_size(Dwarf_Debug dbg, Dwarf_Half value);\fP.DE\f(CWddwarf_set_frame_rule_table_size()\fP sets thevalue \f(CWvalue\fP as the size of libdwarf-internalrules tables of \f(CWdbg\fP.The function returnsthe previous value of the rules table size setting (taken from the \f(CWdbg\fP structure)..H 4 "dwarf_set_frame_rule_inital_value()"This allows consumers to set the initial valuefor rows in the frame tables. By default itis taken from libdwarf.h and is DW_FRAME_REG_INITIAL_VALUE(which itself is either DW_FRAME_SAME_VAL or DW_FRAME_UNDEFINED_VAL).The MIPS/IRIX default is DW_FRAME_SAME_VAL.Comsumer code should set this appropriately and formany architectures (but probably not MIPS) DW_FRAME_UNDEFINED_VAL is anappropriate setting..DS\f(CWDwarf_Halfdwarf_set_frame_rule_inital_value(Dwarf_Debug dbg, Dwarf_Half value);\fP.DE\f(CWdwarf_set_frame_rule_inital_value()\fP sets thevalue \f(CWvalue\fP as the initial value for this \f(CWdbg\fPwhen initializing rules tables. The function returnsthe previous value of the initial setting (taken from the \f(CWdbg\fP structure)..H 4 "dwarf_get_fde_info_for_reg3()"This interface is suitable for DWARF3 and DWARF2.It returns the values for a particular real register(Not for the CFA register, see dwarf_get_fde_info_for_cfa_reg3()below)..DS\f(CWint dwarf_get_fde_info_for_reg3( Dwarf_Fde fde, Dwarf_Half table_column, Dwarf_Addr pc_requested, Dwarf_Small *value_type, Dwarf_Signed *offset_relevant, Dwarf_Signed *register_num, Dwarf_Signed *offset_or_block_len, Dwarf_Ptr *block_ptr, Dwarf_Addr *row_pc, Dwarf_Error *error);\fP.DE\f(CWdwarf_get_fde_info_for_re3()\fP returns\f(CWDW_DLV_OK\fP on success. It sets \f(CW*value_type\fPto one of DW_EXPR_OFFSET (0),DW_EXPR_VAL_OFFSET(1), DW_EXPR_EXPRESSION(2) orDW_EXPR_VAL_EXPRESSION(3).On call, \f(CWtable_column\fP must be set to theregister number of a real register. Notthe cfa 'register' or DW_FRAME_SAME_VALUE orDW_FRAME_UNDEFINED_VALUE.if \f(CW*value_type\fP has the value DW_EXPR_OFFSET (0) then:.in +4.PIt sets \f(CW*offset_relevant\fP tonon-zero if the offset is relevant for therow specified by \f(CWpc_requested\fP and column specified by\f(CWtable_column\fP or, for the FDE specified by \f(CWfde\fP. In this case the \f(CW*register_num\fP will be setto DW_FRAME_CFA_COL3. This is an offset(N) ruleas specified in the DWARF3/2 documents.Adding the value of \f(CW*offset_or_block_len\fPto the value of the CFA register gives the addressof a location holding the previous value of register \f(CWtable_column\fP..PIf offset is not relevant for this rule, \f(CW*offset_relevant\fP isset to zero. \f(CW*register_num\fP will be setto the number of the real register holding the value of the \f(CWtable_column\fP register.This is the register(R) rule as specifified in DWARF3/2 documents..PTheintent is to return the rule for the given pc value and register.The location pointed to by \f(CWregister_num\fP is set to the registervalue for the rule. The location pointed to by \f(CWoffset\fP is set to the offset value for the rule. Since more than one pc value will have rows with identical entries, the user may want toknow the earliest pc value after which the rules for all the columnsremained unchanged. Recall that in the virtual table that the frame informationrepresents there may be one or more table rows with identical data(each such table row at a different pc value).Given a \f(CWpc_requested\fP which refers to a pc in such a groupof identical rows, the location pointed to by \f(CWrow_pc\fP is set to the lowest pc valuewithin the group of identical rows..in -4.PIf \f(CW*value_type\fP has the value DW_EXPR_VAL_OFFSET (1) then:.in +4This will be a val_offset(N) rule as specified in theDWARF3/2 documents so \f(CW*offset_relevant\fP willbe non zero. The calculation is identical to the DW_EXPR_OFFSET (0)calculation with \f(CW*offset_relevant\fP non-zero, but the value resulting is the actual \f(CWtable_column\fPvalue (rather than the address where the value may be found)..in -4.PIf \f(CW*value_type\fP has the value DW_EXPR_EXPRESSION (1) then:.in +4 \f(CW*offset_or_block_len\fPis set to the length in bytes of a block of memorywith a DWARF expression in the block.\f(CW*block_ptr\fP is set to point at the block of memory.The consumer code should evaluate the block asa DWARF-expression. The result is the address wherethe previous value of the register may be found.This is a DWARF3/2 expression(E) rule..in -4.PIf \f(CW*value_type\fP has the value DW_EXPR_VAL_EXPRESSION (1) then:.in +4The calculation is exactly as for DW_EXPR_EXPRESSION (1)but the result of the DWARF-expression evaluation isthe value of the \f(CWtable_column\fP (notthe address of the value).This is a DWARF3/2 val_expression(E) rule..in -4\f(CWdwarf_get_fde_info_for_reg\fP returns \f(CWDW_DLV_ERROR\fP if there is an error andif there is an error only the \f(CWerror\fP pointer is set, noneof the other output arguments are touched.It is usable with either \f(CWdwarf_get_fde_n()\fP or \f(CWdwarf_get_fde_at_pc()\fP..H 4 "dwarf_get_fde_info_for_cfa_reg3()".DS \f(CWint dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde fde, Dwarf_Addr pc_requested, Dwarf_Small * value_type, Dwarf_Signed* offset_relevant, Dwarf_Signed* register_num, Dwarf_Signed* offset_or_block_len, Dwarf_Ptr * block_ptr , Dwarf_Addr * row_pc_out, Dwarf_Error * error)\fP.DE.PThis is identical to \f(CWdwarf_get_fde_info_for_reg3()\fPexcept the returned values are for the CFA rule.So register number \f(CW*register_num\fP will be setto a real register, not DW_FRAME_CFA_COL3, DW_FRAME_SAME_VALUE, orDW_FRAME_UNDEFINED_VALUE..H 4 "dwarf_get_fde_info_for_all_regs3()".DS\f(CWint dwarf_get_fde_info_for_all_regs3( Dwarf_Fde fde, Dwarf_Addr pc_requested, Dwarf_Regtable3 *reg_table, Dwarf_Addr *row_pc, Dwarf_Error *error)\fP.DE\f(CWdwarf_get_fde_info_for_all_regs3()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*reg_table\fP for the row specified by\f(CWpc_requested\fP for the FDE specified by \f(CWfde\fP. The intent isto return the rules for decoding all the registers, given a pcvalue. \f(CWreg_table\fP is an array of rules, the array size specifed by the caller.plus a rule for the CFA.The rule for the cfa returned in \f(CW*reg_table\fPdefines the CFA value at \f(CWpc_requested\fPThe rule for eachregister contains several values that enablethe consumer to determine the previous valueof the register (see the earlier documentation of Dwarf_Regtable3).\f(CWdwarf_get_fde_info_for_reg3()\fP andthe Dwarf_Regtable3 documentation above for a description ofthe values for each row.\f(CWdwarf_get_fde_info_for_all_regs\fP returns \f(CWDW_DLV_ERROR\fP if there is an error. It's up to the caller to allocate space for \f(CW*reg_table\fP and initialize it properly..H 4 "dwarf_get_fde_n()".DS\f(CWint dwarf_get_fde_n( Dwarf_Fde *fde_data, Dwarf_Unsigned fde_index, Dwarf_Fde *returned_fde Dwarf_Error *error)\fP.DE\f(CWdwarf_get_fde_n()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CWreturned_fde\fP tothe \f(CWDwarf_Fde\fP descriptor whose index is \f(CWfde_index\fP in the table of \f(CWDwarf_Fde\fP descriptorspointed to by \fPfde_data\fP. The index starts with 0. Returns \f(CWDW_DLV_NO_ENTRY\fP if the index does not exist in the table of \f(CWDwarf_Fde\fP descriptors. Returns \f(CWDW_DLV_ERROR\fP if there is an error.This function cannot be used unlessthe block of \f(CWDwarf_Fde\fP descriptors has been created by a call to\f(CWdwarf_get_fde_list()\fP..H 4 "dwarf_get_fde_at_pc()".DS\f(CWint dwarf_get_fde_at_pc( Dwarf_Fde *fde_data, Dwarf_Addr pc_of_interest, Dwarf_Fde *returned_fde, Dwarf_Addr *lopc, Dwarf_Addr *hipc, Dwarf_Error *error)\fP.DE\f(CWdwarf_get_fde_at_pc()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CWreturned_fde\fP toa \f(CWDwarf_Fde\fP descriptorfor a function which contains the pc value specified by \f(CWpc_of_interest\fP.In addition, it sets the locations pointed to by \f(CWlopc\fP and \f(CWhipc\fP to the low address and the high address covered by this FDE, respectively. It returns \f(CWDW_DLV_ERROR\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fP if \f(CWpc_of_interest\fP is not in any of theFDEs represented by the block of \f(CWDwarf_Fde\fP descriptors pointedto by \f(CWfde_data\fP. This function cannot be used unlessthe block of \f(CWDwarf_Fde\fP descriptors has been created by a call to\f(CWdwarf_get_fde_list()\fP..H 4 "dwarf_expand_frame_instructions()".DS\f(CWint dwarf_expand_frame_instructions( Dwarf_Debug dbg, Dwarf_Ptr instruction, Dwarf_Unsigned i_length, Dwarf_Frame_Op **returned_op_list, Dwarf_Signed * returned_op_count, Dwarf_Error *error);\fP.DE\f(CWdwarf_expand_frame_instructions()\fP is a High-level interface function which expands a frame instruction byte stream into an array of \f(CWDwarf_Frame_Op\fP structures. To indicate success, it returns \f(CWDW_DLV_OK\fP.The address where the byte stream begins is specified by \f(CWinstruction\fP, andthe length of the byte stream is specified by \f(CWi_length\fP.The location pointed to by \f(CWreturned_op_list\fP is set topoint to a table of \f(CWreturned_op_count\fPpointers to \f(CWDwarf_Frame_Op\fP whichcontain the frame instructions in the byte stream. It returns \f(CWDW_DLV_ERROR\fP on error. It never returns \f(CWDW_DLV_NO_ENTRY\fP.After a successful return, thearray of structures should be freed using\f(CWdwarf_dealloc()\fP with the allocation type \f(CWDW_DLA_FRAME_BLOCK\fP(when they are no longer of interest)..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Frame_Op *frameops;Dwarf_Ptr instruction;Dwarf_Unsigned len;int res;res = expand_frame_instructions(dbg,instruction,len, &frameops,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use frameops[i] */ } dwarf_dealloc(dbg, frameops, DW_DLA_FRAME_BLOCK);}\fP.DE.in -2.H 4 "dwarf_get_fde_exception_info()".DS\f(CWint dwarf_get_fde_exception_info( Dwarf_Fde fde, Dwarf_Signed * offset_into_exception_tables, Dwarf_Error * error);.DE\f(CWdwarf_get_fde_exception_info()\fP is an IRIX specificfunction which returns an exception table signed offsetthru \f(CWoffset_into_exception_tables\fP.The function never returns \f(CWDW_DLV_NO_ENTRY\fP.If \f(CWDW_DLV_NO_ENTRY\fP is NULL the function returns \f(CWDW_DLV_ERROR\fP.For non-IRIX objects the offset returned will always be zero.For non-C++ objects the offset returned will always be zero.The meaning of the offset and the content of the tablesis not defined in this document.The applicable CIE augmentation string (see above)determines whether the value returned has meaning..H 2 "Location Expression Evaluation"An "interpreter" which evaluates a location expressionis required in any debugger. There is no interface definedhere at this time. .POne problem with defining an interface is that operations aremachine dependent: they depend on the interpretation ofregister numbers and the methods of getting values from theenvironment the expression is applied to..PIt would be desirable to specify an interface..H 3 "Location List Internal-level Interface".H 4 "dwarf_get_loclist_entry()".DS\f(CWint dwarf_get_loclist_entry( Dwarf_Debug dbg, Dwarf_Unsigned offset, Dwarf_Addr *hipc_offset, Dwarf_Addr *lopc_offset, Dwarf_Ptr *data, Dwarf_Unsigned *entry_len, Dwarf_Unsigned *next_entry, Dwarf_Error *error)\fP.DEThe function reads a location list entry starting at \f(CWoffset\fP and returns through pointers (when successful)the high pc \f(CWhipc_offset\fP, low pc \f(CWlopc_offset\fP, a pointer to the location description data \f(CWdata\fP, the length of the location description data \f(CWentry_len\fP, and the offset of the next location description entry \f(CWnext_entry\fP. \f(CWdwarf_dwarf_get_loclist_entry()\fP returns \f(CWDW_DLV_OK\fP if successful.\f(CWDW_DLV_NO_ENTRY\fP is returned when the offset passedin is beyond the end of the .debug_loc section (expected ifyou start at offset zero and proceed thru all the entries). \f(CWDW_DLV_ERROR\fP is returned on error. .PThe \f(CWhipc_offset\fP,low pc \f(CWlopc_offset\fP are offsets from the beginning of thecurrent procedure, not genuine pc values..in +2.DS\f(CW/* Looping thru the dwarf_loc section finding loclists: an example. */int res;Dwarf_Unsigned next_entry;Dwarf_unsigned offset=0;Dwarf_Addr hipc_off;Dwarf_Addr lopc_off;Dwarf_Ptr data;Dwarf_Unsigned entry_len;Dwarf_Unsigned next_entry;Dwarf_Error err; for(;;) { res = dwarf_get_loclist_entry(dbg,newoffset,&hipc_off, &lowpc_off, &data, &entry_len,&next_entry,&err); if (res == DW_DLV_OK) { /* A valid entry. */ newoffset = next_entry; continue; } else if (res ==DW_DLV_NO_ENTRY) { /* Done! */ break; } else { /* Error! */ break; } }}\fP.DE.in -2.H 2 "Abbreviations access"These are Internal-level Interface functions. Debuggers can ignore this..H 3 "dwarf_get_abbrev()".DS\f(CWint dwarf_get_abbrev( Dwarf_Debug dbg, Dwarf_Unsigned offset, Dwarf_Abbrev *returned_abbrev, Dwarf_Unsigned *length, Dwarf_Unsigned *attr_count, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_abbrev()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_abbrev\fP to\f(CWDwarf_Abbrev\fP descriptor for an abbreviation at offset \f(CW*offset\fP in the abbreviations section (i.e .debug_abbrev) on success. The user is responsible for making sure that a valid abbreviation begins at \f(CWoffset\fP in the abbreviations section. The location pointed to by \f(CWlength\fP is set to the length in bytes of the abbreviation in the abbreviations section. The location pointed to by \f(CWattr_count\fP is set to the number of attributes in the abbreviation. An abbreviation entry with a length of 1 is the 0 byte of the last abbreviation entry of a compilation unit.\f(CWdwarf_get_abbrev()\fP returns \f(CWDW_DLV_ERROR\fP on error. If the call succeeds, the storage pointed toby \f(CW*returned_abbrev\fPshould be free'd, using \f(CWdwarf_dealloc()\fP with theallocation type \f(CWDW_DLA_ABBREV\fP when no longer needed..H 3 "dwarf_get_abbrev_tag()".DS\f(CWint dwarf_get_abbrev_tag( Dwarf_abbrev abbrev, Dwarf_Half *return_tag, Dwarf_Error *error);\fP.DEIf successful,\f(CWdwarf_get_abbrev_tag()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_tag\fP tothe \fItag\fP of the given abbreviation.It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 3 "dwarf_get_abbrev_code()".DS\f(CWint dwarf_get_abbrev_code( Dwarf_abbrev abbrev, Dwarf_Unsigned *return_code, Dwarf_Error *error);\fP.DEIf successful,\f(CWdwarf_get_abbrev_code()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*return_code\fP tothe abbreviation code ofthe given abbreviation.It returns \f(CWDW_DLV_ERROR\fP on error.It never returns \f(CWDW_DLV_NO_ENTRY\fP..H 3 "dwarf_get_abbrev_children_flag()".DS\f(CWint dwarf_get_abbrev_children_flag( Dwarf_Abbrev abbrev, Dwarf_Signed *returned_flag, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_abbrev_children_flag()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CWreturned_flag\fP to\f(CWDW_children_no\fP (if the given abbreviation indicates that a die with that abbreviation has no children) or \f(CWDW_children_yes\fP (if the given abbreviation indicates that a die with that abbreviation has a child). It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_get_abbrev_entry()".DS\f(CWint dwarf_get_abbrev_entry( Dwarf_Abbrev abbrev, Dwarf_Signed index, Dwarf_Half *attr_num, Dwarf_Signed *form, Dwarf_Off *offset, Dwarf_Error *error)\fP.DEIf successful,\f(CWdwarf_get_abbrev_entry()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*attr_num\fP to the attribute code ofthe attribute whose index is specified by \f(CWindex\fP in the given abbreviation. The index starts at 0. The location pointed to by \f(CWform\fP is set to the form of the attribute. The location pointed to by \f(CWoffset\fP is set to the byte offset of the attribute in the abbreviations section. It returns \f(CWDW_DLV_NO_ENTRY\fP if the index specified is outsidethe range of attributes in this abbreviation.It returns \f(CWDW_DLV_ERROR\fP on error..H 2 "String Section Operations"The .debug_str section contains only strings. Debuggers need never use this interface: it is only for debugging problems with the string section itself. .H 3 "dwarf_get_str()".DS\f(CWint dwarf_get_str( Dwarf_Debug dbg, Dwarf_Off offset, char **string, Dwarf_Signed *returned_str_len, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_str()\fP returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_str_len\fP tothe length of the string, not counting the null terminator, that begins at the offset specified by \f(CWoffset\fP in the .debug_str section. The location pointed to by \f(CWstring\fP is set to a pointer to this string.The next string in the .debug_strsection begins at the previous \f(CWoffset\fP + 1 + \f(CW*returned_str_len\fP.A zero-length string is NOT the end of the section.If there is no .debug_str section, \f(CWDW_DLV_NO_ENTRY\fP is returned.If there is an error, \f(CWDW_DLV_ERROR\fP is returned.If we are at the end of the section (that is, \f(CWoffset\fPis one past the end of the section) \f(CWDW_DLV_NO_ENTRY\fP is returned.If the \f(CWoffset\fP is some other too-large value then\f(CWDW_DLV_ERROR\fP is returned..H 2 "Address Range Operations"These functions provide information about address ranges. Addressranges map ranges of pc values to the corresponding compilation-unitdie that covers the address range..H 3 "dwarf_get_aranges()".DS\f(CWint dwarf_get_aranges( Dwarf_Debug dbg, Dwarf_Arange **aranges, Dwarf_Signed * returned_arange_count, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_aranges()\fP returns \f(CWDW_DLV_OK\fP and sets \f(CW*returned_arange_count\fP tothe count of thenumber of address ranges in the .debug_aranges section. It sets\f(CW*aranges\fP to point to a block of \f(CWDwarf_Arange\fP descriptors, one for each address range. It returns \f(CWDW_DLV_ERROR\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fP if there is no .debug_arangessection..in +2.DS\f(CWDwarf_Signed cnt;Dwarf_Arange *arang;int res;res = dwarf_get_aranges(dbg, &arang,&cnt, &error);if (res == DW_DLV_OK) { for (i = 0; i < cnt; ++i) { /* use arang[i] */ dwarf_dealloc(dbg, arang[i], DW_DLA_ARANGE); } dwarf_dealloc(dbg, arang, DW_DLA_LIST);}\fP.DE.in -2.DS\f(CWint dwarf_get_arange( Dwarf_Arange *aranges, Dwarf_Unsigned arange_count, Dwarf_Addr address, Dwarf_Arange *returned_arange, Dwarf_Error *error);\fP.DEThe function \f(CWdwarf_get_arange()\fP takes as input a pointer to a block of \f(CWDwarf_Arange\fP pointers, and a count of thenumber of descriptors in the block. It then searches for thedescriptor that covers the given \f(CWaddress\fP. If it findsone, it returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_arange\fP tothe descriptor. It returns \f(CWDW_DLV_ERROR\fP on error.It returns \f(CWDW_DLV_NO_ENTRY\fP if there is no .debug_arangesentry covering that address..H 3 "dwarf_get_cu_die_offset()".DS\f(CWint dwarf_get_cu_die_offset( Dwarf_Arange arange, Dwarf_Off *returned_cu_die_offset, Dwarf_Error *error);\fP.DEThe function \f(CWdwarf_get_cu_die_offset()\fP takes a\f(CWDwarf_Arange\fP descriptor as input, and if successful returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_cu_die_offset\fP tothe offsetin the .debug_info section of the compilation-unit DIE for the compilation-unit represented by the given address range.It returns \f(CWDW_DLV_ERROR\fP on error..H 3 "dwarf_get_arange_cu_header_offset()".DS\f(CWint dwarf_get_arange_cu_header_offset( Dwarf_Arange arange, Dwarf_Off *returned_cu_header_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_arange_cu_header_offset()\fP takes a\f(CWDwarf_Arange\fP descriptor as input, and if successful returns\f(CWDW_DLV_OK\fP and sets \f(CW*returned_cu_header_offset\fP tothe offsetin the .debug_info section of the compilation-unit header for the compilation-unit represented by the given address range.It returns \f(CWDW_DLV_ERROR\fP on error.This function added Rev 1.45, June, 2001.This function is declared as 'optional' in libdwarf.hon IRIX systems so the _MIPS_SYMBOL_PRESENTpredicate may be used at run time to determine if the version oflibdwarf linked into an application has this function..H 3 "dwarf_get_arange_info()".DS\f(CWint dwarf_get_arange_info( Dwarf_Arange arange, Dwarf_Addr *start, Dwarf_Unsigned *length, Dwarf_Off *cu_die_offset, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_arange_info()\fP returns\f(CWDW_DLV_OK\fPandstores the starting value of the address range in the location pointed to by \f(CWstart\fP, the length of the address range in the location pointed to by \f(CWlength\fP, and the offset in the .debug_info section of the compilation-unit DIE for the compilation-unit represented by the address range.It returns \f(CWDW_DLV_ERROR\fP on error..H 2 "General Low Level Operations"This function is low-level and intended for use onlyby programs such as dwarf-dumpers..H 3 "dwarf_get_address_size()".DS\f(CWint dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Half *addr_size, Dwarf_Error *error)\fP.DEThe function \f(CWdwarf_get_address_size()\fP returns \f(CWDW_DLV_OK\fP on success and sets the \f(CW*addr_size\fPto the size in bytes of an address.In case of error, it returns \f(CWDW_DLV_ERROR\fPand does not set \f(CW*addr_size\fP..H 2 "Utility Operations"These functions aid in the management of errors encountered when using functions in the \fIlibdwarf\fP library and releasing memory allocated as a result of a \fIlibdwarf\fP operation. .H 3 "dwarf_errno()".DS\f(CWDwarf_Unsigned dwarf_errno( Dwarf_Error error)\fP.DEThe function \f(CWdwarf_errno()\fP returns the error number corresponding to the error specified by \f(CWerror\fP..H 3 "dwarf_errmsg()".DS\f(CWconst char* dwarf_errmsg( Dwarf_Error error)\fP.DEThe function \f(CWdwarf_errmsg()\fP returns a pointer to anull-terminated error message string corresponding to the error specified by \f(CWerror\fP. The string returned by \f(CWdwarf_errmsg()\fP should not be deallocated using \f(CWdwarf_dealloc()\fP..PThe set of errors enumerated in Figure \n(aX below were defined in Dwarf 1.These errors are not used by the current implementationof Dwarf 2. .DS.TScenter box, tab(:);lfB lfB l l.SYMBOLIC NAME:DESCRIPTION_DW_DLE_NE:No error (0)DW_DLE_VMM:Version of DWARF information newer than libdwarfDW_DLE_MAP:Memory map failureDW_DLE_LEE:Propagation of libelf errorDW_DLE_NDS:No debug sectionDW_DLE_NLS:No line sectionDW_DLE_ID:Requested information not associated with descriptorDW_DLE_IOF:I/O failureDW_DLE_MAF:Memory allocation failureDW_DLE_IA:Invalid argumentDW_DLE_MDE:Mangled debugging entryDW_DLE_MLE:Mangled line number entryDW_DLE_FNO:File descriptor does not refer to an open fileDW_DLE_FNR:File is not a regular fileDW_DLE_FWA:File is opened with wrong accessDW_DLE_NOB:File is not an object fileDW_DLE_MOF:Mangled object file headerDW_DLE_EOLL:End of location list entriesDW_DLE_NOLL:No location list sectionDW_DLE_BADOFF:Invalid offsetDW_DLE_EOS:End of sectionDW_DLE_ATRUNC:Abbreviations section appears truncatedDW_DLE_BADBITC:Address size passed to dwarf bad.TE.FG "List of Dwarf Error Codes".DEThe set of errors returned by SGI \f(CWLibdwarf\fP functionsis listed below.Some of the errors are SGI specific..DS.TScenter box, tab(:);lfB lfBl l.SYMBOLIC NAME:DESCRIPTION_DW_DLE_DBG_ALLOC:Could not allocate Dwarf_Debug structDW_DLE_FSTAT_ERROR:Error in fstat()-ing objectDW_DLE_FSTAT_MODE_ERROR:Error in mode of object fileDW_DLE_INIT_ACCESS_WRONG:Incorrect access to dwarf_init()DW_DLE_ELF_BEGIN_ERROR:Error in elf_begin() on objectDW_DLE_ELF_GETEHDR_ERROR:Error in elf_getehdr() on objectDW_DLE_ELF_GETSHDR_ERROR:Error in elf_getshdr() on objectDW_DLE_ELF_STRPTR_ERROR:Error in elf_strptr() on objectDW_DLE_DEBUG_INFO_DUPLICATE:Multiple .debug_info sectionsDW_DLE_DEBUG_INFO_NULL:No data in .debug_info sectionDW_DLE_DEBUG_ABBREV_DUPLICATE:Multiple .debug_abbrev sectionsDW_DLE_DEBUG_ABBREV_NULL:No data in .debug_abbrev sectionDW_DLE_DEBUG_ARANGES_DUPLICATE:Multiple .debug_arange sectionsDW_DLE_DEBUG_ARANGES_NULL:No data in .debug_arange sectionDW_DLE_DEBUG_LINE_DUPLICATE:Multiple .debug_line sectionsDW_DLE_DEBUG_LINE_NULL:No data in .debug_line sectionDW_DLE_DEBUG_LOC_DUPLICATE:Multiple .debug_loc sectionsDW_DLE_DEBUG_LOC_NULL:No data in .debug_loc sectionDW_DLE_DEBUG_MACINFO_DUPLICATE:Multiple .debug_macinfo sectionsDW_DLE_DEBUG_MACINFO_NULL:No data in .debug_macinfo sectionDW_DLE_DEBUG_PUBNAMES_DUPLICATE:Multiple .debug_pubnames sectionsDW_DLE_DEBUG_PUBNAMES_NULL:No data in .debug_pubnames sectionDW_DLE_DEBUG_STR_DUPLICATE:Multiple .debug_str sectionsDW_DLE_DEBUG_STR_NULL:No data in .debug_str sectionDW_DLE_CU_LENGTH_ERROR:Length of compilation-unit badDW_DLE_VERSION_STAMP_ERROR:Incorrect Version StampDW_DLE_ABBREV_OFFSET_ERROR:Offset in .debug_abbrev badDW_DLE_ADDRESS_SIZE_ERROR:Size of addresses in target badDW_DLE_DEBUG_INFO_PTR_NULL:Pointer into .debug_info in DIE nullDW_DLE_DIE_NULL:Null Dwarf_DieDW_DLE_STRING_OFFSET_BAD:Offset in .debug_str badDW_DLE_DEBUG_LINE_LENGTH_BAD:Length of .debug_line segment badDW_DLE_LINE_PROLOG_LENGTH_BAD:Length of .debug_line prolog badDW_DLE_LINE_NUM_OPERANDS_BAD:Number of operands to line instr badDW_DLE_LINE_SET_ADDR_ERROR:Error in DW_LNE_set_address instructionDW_DLE_LINE_EXT_OPCODE_BAD:Error in DW_EXTENDED_OPCODE instructionDW_DLE_DWARF_LINE_NULL:Null Dwarf_line argumentDW_DLE_INCL_DIR_NUM_BAD:Error in included directory for given lineDW_DLE_LINE_FILE_NUM_BAD:File number in .debug_line badDW_DLE_ALLOC_FAIL:Failed to allocate required structsDW_DLE_DBG_NULL:Null Dwarf_Debug argumentDW_DLE_DEBUG_FRAME_LENGTH_BAD:Error in length of frameDW_DLE_FRAME_VERSION_BAD:Bad version stamp for frameDW_DLE_CIE_RET_ADDR_REG_ERROR:Bad register specified for return addressDW_DLE_FDE_NULL:Null Dwarf_Fde argumentDW_DLE_FDE_DBG_NULL:No Dwarf_Debug associated with FDEDW_DLE_CIE_NULL:Null Dwarf_Cie argumentDW_DLE_CIE_DBG_NULL:No Dwarf_Debug associated with CIEDW_DLE_FRAME_TABLE_COL_BAD:Bad column in frame table specified.TE.FG "List of Dwarf 2 Error Codes (continued)".DE.DS.TScenter box, tab(:);lfB lfBl l.SYMBOLIC NAME:DESCRIPTION_DW_DLE_PC_NOT_IN_FDE_RANGE:PC requested not in address range of FDEDW_DLE_CIE_INSTR_EXEC_ERROR:Error in executing instructions in CIEDW_DLE_FRAME_INSTR_EXEC_ERROR:Error in executing instructions in FDEDW_DLE_FDE_PTR_NULL:Null Pointer to Dwarf_Fde specifiedDW_DLE_RET_OP_LIST_NULL:No location to store pointer to Dwarf_Frame_OpDW_DLE_LINE_CONTEXT_NULL:Dwarf_Line has no contextDW_DLE_DBG_NO_CU_CONTEXT:dbg has no CU context for dwarf_siblingof()DW_DLE_DIE_NO_CU_CONTEXT:Dwarf_Die has no CU contextDW_DLE_FIRST_DIE_NOT_CU:First DIE in CU not DW_TAG_compilation_unitDW_DLE_NEXT_DIE_PTR_NULL:Error in moving to next DIE in .debug_infoDW_DLE_DEBUG_FRAME_DUPLICATE:Multiple .debug_frame sectionsDW_DLE_DEBUG_FRAME_NULL:No data in .debug_frame sectionDW_DLE_ABBREV_DECODE_ERROR:Error in decoding abbreviationDW_DLE_DWARF_ABBREV_NULL:Null Dwarf_Abbrev specifiedDW_DLE_ATTR_NULL:Null Dwarf_Attribute specifiedDW_DLE_DIE_BAD:DIE badDW_DLE_DIE_ABBREV_BAD:No abbreviation found for code in DIEDW_DLE_ATTR_FORM_BAD:Inappropriate attribute form for attributeDW_DLE_ATTR_NO_CU_CONTEXT:No CU context for Dwarf_Attribute structDW_DLE_ATTR_FORM_SIZE_BAD:Size of block in attribute value badDW_DLE_ATTR_DBG_NULL:No Dwarf_Debug for Dwarf_Attribute structDW_DLE_BAD_REF_FORM:Inappropriate form for reference attributeDW_DLE_ATTR_FORM_OFFSET_BAD:Offset reference attribute outside current CUDW_DLE_LINE_OFFSET_BAD:Offset of lines for current CU outside .debug_lineDW_DLE_DEBUG_STR_OFFSET_BAD:Offset into .debug_str past its endDW_DLE_STRING_PTR_NULL:Pointer to pointer into .debug_str NULLDW_DLE_PUBNAMES_VERSION_ERROR:Version stamp of pubnames incorrectDW_DLE_PUBNAMES_LENGTH_BAD:Read pubnames past end of .debug_pubnamesDW_DLE_GLOBAL_NULL:Null Dwarf_Global specifiedDW_DLE_GLOBAL_CONTEXT_NULL:No context for Dwarf_Global givenDW_DLE_DIR_INDEX_BAD:Error in directory index readDW_DLE_LOC_EXPR_BAD:Bad operator read for location expressionDW_DLE_DIE_LOC_EXPR_BAD:Expected block value for attribute not foundDW_DLE_OFFSET_BAD:Offset for next compilation-unit in .debug_info badDW_DLE_MAKE_CU_CONTEXT_FAIL:Could not make CU contextDW_DLE_ARANGE_OFFSET_BAD:Offset into .debug_info in .debug_aranges badDW_DLE_SEGMENT_SIZE_BAD:Segment size should be 0 for MIPS processorsDW_DLE_ARANGE_LENGTH_BAD:Length of arange section in .debug_arange badDW_DLE_ARANGE_DECODE_ERROR:Aranges do not end at end of .debug_arangesDW_DLE_ARANGES_NULL:NULL pointer to Dwarf_Arange specifiedDW_DLE_ARANGE_NULL:NULL Dwarf_Arange specifiedDW_DLE_NO_FILE_NAME:No file name for Dwarf_Line structDW_DLE_NO_COMP_DIR:No Compilation directory for compilation-unitDW_DLE_CU_ADDRESS_SIZE_BAD:CU header address size not match Elf classDW_DLE_ELF_GETIDENT_ERROR:Error in elf_getident() on objectDW_DLE_NO_AT_MIPS_FDE:DIE does not have DW_AT_MIPS_fde attributeDW_DLE_NO_CIE_FOR_FDE:No CIE specified for FDEDW_DLE_DIE_ABBREV_LIST_NULL:No abbreviation for the code in DIE foundDW_DLE_DEBUG_FUNCNAMES_DUPLICATE:Multiple .debug_funcnames sectionsDW_DLE_DEBUG_FUNCNAMES_NULL:No data in .debug_funcnames section.TE.FG "List of Dwarf 2 Error Codes (continued)".DE.DS.TScenter box, tab(:);lfB lfBl l.SYMBOLIC NAME:DESCRIPTION_DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR:Version stamp in .debug_funcnames badDW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD:Length error in reading .debug_funcnamesDW_DLE_FUNC_NULL:NULL Dwarf_Func specifiedDW_DLE_FUNC_CONTEXT_NULL:No context for Dwarf_Func structDW_DLE_DEBUG_TYPENAMES_DUPLICATE:Multiple .debug_typenames sectionsDW_DLE_DEBUG_TYPENAMES_NULL:No data in .debug_typenames sectionDW_DLE_DEBUG_TYPENAMES_VERSION_ERROR:Version stamp in .debug_typenames badDW_DLE_DEBUG_TYPENAMES_LENGTH_BAD:Length error in reading .debug_typenamesDW_DLE_TYPE_NULL:NULL Dwarf_Type specifiedDW_DLE_TYPE_CONTEXT_NULL:No context for Dwarf_Type givenDW_DLE_DEBUG_VARNAMES_DUPLICATE:Multiple .debug_varnames sectionsDW_DLE_DEBUG_VARNAMES_NULL:No data in .debug_varnames sectionDW_DLE_DEBUG_VARNAMES_VERSION_ERROR:Version stamp in .debug_varnames badDW_DLE_DEBUG_VARNAMES_LENGTH_BAD:Length error in reading .debug_varnamesDW_DLE_VAR_NULL:NULL Dwarf_Var specifiedDW_DLE_VAR_CONTEXT_NULL:No context for Dwarf_Var givenDW_DLE_DEBUG_WEAKNAMES_DUPLICATE:Multiple .debug_weaknames sectionDW_DLE_DEBUG_WEAKNAMES_NULL:No data in .debug_varnames sectionDW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR:Version stamp in .debug_varnames badDW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD:Length error in reading .debug_weaknamesDW_DLE_WEAK_NULL:NULL Dwarf_Weak specifiedDW_DLE_WEAK_CONTEXT_NULL:No context for Dwarf_Weak given.TE.FG "List of Dwarf 2 Error Codes".DEThis list of errors is not necessarily complete;additional errorsmight be added when functionality to create debugging information entries are added to \fIlibdwarf\fP and by the implementors of \fIlibdwarf\fP to describe internal errors not addressed by the above list.Some of the above errors may be unused.Errors may not have the same meaning in different implementations..H 3 "dwarf_seterrhand()".DS\f(CWDwarf_Handler dwarf_seterrhand( Dwarf_Debug dbg, Dwarf_Handler errhand)\fP.DEThe function \f(CWdwarf_seterrhand()\fP replaces the error handler (see \f(CWdwarf_init()\fP) with \f(CWerrhand\fP. The old error handler is returned. This function is currently unimplemented..H 3 "dwarf_seterrarg()".DS\f(CWDwarf_Ptr dwarf_seterrarg( Dwarf_Debug dbg, Dwarf_Ptr errarg)\fP.DEThe function \f(CWdwarf_seterrarg()\fP replaces the pointer to the error handler communication area (see \f(CWdwarf_init()\fP) with \f(CWerrarg\fP. A pointer to the old area is returned. Thisfunction is currently unimplemented..H 3 "dwarf_dealloc()".DS\f(CWvoid dwarf_dealloc( Dwarf_Debug dbg, void* space, Dwarf_Unsigned type)\fP.DEThe function \f(CWdwarf_dealloc\fP frees the dynamic storage pointedto by \f(CWspace\fP, and allocated to the given \f(CWDwarf_Debug\fP.The argument \f(CWtype\fP is an integer code that specifies the allocation type of the region pointed to by the \f(CWspace\fP. Refer to section 4 for details on \fIlibdwarf\fP memory management..SK.S.TC 1 1 4.CS