1/*
2
3  Copyright (C) 2000-2010 Silicon Graphics, Inc.  All Rights Reserved.
4  Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved.
5  Portions Copyright 2008-2010 David Anderson. All rights reserved.
6  Portions Copyright 2008-2010 Arxan Technologies, Inc. All rights reserved.
7
8  This program is free software; you can redistribute it and/or modify it
9  under the terms of version 2.1 of the GNU Lesser General Public License
10  as published by the Free Software Foundation.
11
12  This program is distributed in the hope that it would be useful, but
13  WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
16  Further, this software is distributed without any warranty that it is
17  free of the rightful claim of any third person regarding infringement
18  or the like.  Any license provided herein, whether implied or
19  otherwise, applies only to this software file.  Patent licenses, if
20  any, provided herein do not apply to combinations of this program with
21  other software, or any other product whatsoever.
22
23  You should have received a copy of the GNU Lesser General Public
24  License along with this program; if not, write the Free Software
25  Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
26  USA.
27
28  Contact information:  Silicon Graphics, Inc., 1500 Crittenden Lane,
29  Mountain View, CA 94043, or:
30
31  http://www.sgi.com
32
33  For further information regarding this notice, see:
34
35  http://oss.sgi.com/projects/GenInfo/NoticeExplan
36
37*/
38
39
40#ifndef _LIBDWARF_H
41#define _LIBDWARF_H
42#ifdef __cplusplus
43extern "C" {
44#endif
45/*
46    libdwarf.h
47    $Revision: #9 $ $Date: 2008/01/17 $
48
49    For libdwarf producers and consumers
50
51    The interface is defined as having 8-byte signed and unsigned
52    values so it can handle 64-or-32bit target on 64-or-32bit host.
53    Addr is the native size: it represents pointers on
54    the host machine (not the target!).
55
56    This contains declarations for types and all producer
57    and consumer functions.
58
59    Function declarations are written on a single line each here
60    so one can use grep  to each declaration in its entirety.
61    The declarations are a little harder to read this way, but...
62
63*/
64
65struct Elf;
66typedef struct Elf* dwarf_elf_handle;
67
68/* To enable printing with printf regardless of the
69   actual underlying data type, we define the DW_PR_xxx macros. */
70#if (_MIPS_SZLONG == 64)
71/* Special case for MIPS, so -64 (LP64) build gets simple -long-.
72   Non-MIPS LP64 or ILP64 environments should probably ensure
73   _MIPS_SZLONG set to 64 everywhere this header is #included.
74*/
75typedef int             Dwarf_Bool;         /* boolean type */
76typedef unsigned long   Dwarf_Off;          /* 4 or 8 byte file offset */
77typedef unsigned long   Dwarf_Unsigned;     /* 4 or 8 byte unsigned value */
78typedef unsigned short  Dwarf_Half;         /* 2 byte unsigned value */
79typedef unsigned char   Dwarf_Small;        /* 1 byte unsigned value */
80typedef signed   long   Dwarf_Signed;       /* 4 or 8 byte signed value */
81typedef unsigned long   Dwarf_Addr;         /* target memory address */
82#define  DW_PR_DUx  "lx"
83#define  DW_PR_DSx  "lx"
84#define  DW_PR_DUu  "lu"
85#define  DW_PR_DSd  "ld"
86
87#else /* 32-bit */
88/* This is for ILP32, allowing i/o of 64bit dwarf info.
89   Also should be fine for LP64 and ILP64 cases.
90*/
91typedef int                 Dwarf_Bool;     /* boolean type */
92typedef unsigned long long  Dwarf_Off;      /* 8 byte file offset */
93typedef unsigned long long  Dwarf_Unsigned; /* 8 byte unsigned value*/
94typedef unsigned short      Dwarf_Half;     /* 2 byte unsigned value */
95typedef unsigned char       Dwarf_Small;    /* 1 byte unsigned value */
96typedef signed   long long  Dwarf_Signed;   /* 8 byte signed value */
97typedef unsigned long long  Dwarf_Addr;     /* target memory address */
98#define  DW_PR_DUx  "llx"
99#define  DW_PR_DSx  "llx"
100#define  DW_PR_DUu  "llu"
101#define  DW_PR_DSd  "lld"
102#endif
103#ifdef HAVE_NONSTANDARD_PRINTF_64_FORMAT
104/* Windows does not use std C formatting, so allow it. */
105#undef DW_PR_DUx
106#undef DW_PR_DSx
107#undef DW_PR_DUu
108#undef DW_PR_DSd
109#define  DW_PR_DUx  "I64x"
110#define  DW_PR_DSx  "I64x"
111#define  DW_PR_DUu  "I64u"
112#define  DW_PR_DSd  "I64d"
113#endif /* HAVE_NONSTANDARD_FORMAT */
114
115typedef void*        Dwarf_Ptr;          /* host machine pointer */
116
117/* Used for DW_FORM_ref_sig8. It is not a string, it
118   is 8 bytes of a signature one would use to find
119   a type unit. See dwarf_formsig8()
120*/
121typedef struct  {
122    char signature[8];
123} Dwarf_Sig8;
124
125/* Contains info on an uninterpreted block of data
126*/
127typedef struct {
128    Dwarf_Unsigned  bl_len;         /* length of block */
129    Dwarf_Ptr       bl_data;        /* uninterpreted data */
130    Dwarf_Small     bl_from_loclist; /*non-0 if loclist, else debug_info*/
131    Dwarf_Unsigned  bl_section_offset; /* Section (not CU) offset
132                                        which 'data' comes from. */
133} Dwarf_Block;
134
135
136/* location record
137*/
138typedef struct {
139    Dwarf_Small     lr_atom;        /* location operation */
140    Dwarf_Unsigned  lr_number;      /* operand */
141    Dwarf_Unsigned  lr_number2;     /* for OP_BREGx */
142    Dwarf_Unsigned  lr_offset;      /* offset in locexpr for OP_BRA etc */
143} Dwarf_Loc;
144
145
146/* location description
147*/
148typedef struct {
149    Dwarf_Addr      ld_lopc;        /* beginning of active range */
150    Dwarf_Addr      ld_hipc;        /* end of active range */
151    Dwarf_Half      ld_cents;       /* count of location records */
152    Dwarf_Loc*      ld_s;           /* pointer to list of same */
153    Dwarf_Small     ld_from_loclist;
154                      /* non-0 if loclist, else debug_info*/
155
156    Dwarf_Unsigned  ld_section_offset; /* Section (not CU) offset
157                    where loc-expr begins*/
158} Dwarf_Locdesc;
159
160/* First appears in DWARF3.
161   The dwr_addr1/addr2 data is either an offset (DW_RANGES_ENTRY)
162   or an address (dwr_addr2 in DW_RANGES_ADDRESS_SELECTION) or
163   both are zero (DW_RANGES_END).
164*/
165enum Dwarf_Ranges_Entry_Type { DW_RANGES_ENTRY,
166    DW_RANGES_ADDRESS_SELECTION,
167    DW_RANGES_END };
168typedef struct {
169    Dwarf_Addr dwr_addr1;
170    Dwarf_Addr dwr_addr2;
171    enum Dwarf_Ranges_Entry_Type  dwr_type;
172} Dwarf_Ranges;
173
174/* Frame description instructions expanded.
175*/
176typedef struct {
177    Dwarf_Small     fp_base_op;
178    Dwarf_Small     fp_extended_op;
179    Dwarf_Half      fp_register;
180
181    /* Value may be signed, depends on op.
182           Any applicable data_alignment_factor has
183           not been applied, this is the  raw offset. */
184    Dwarf_Unsigned  fp_offset;
185    Dwarf_Off       fp_instr_offset;
186} Dwarf_Frame_Op; /* DWARF2 */
187
188typedef struct {
189    Dwarf_Small     fp_base_op;
190    Dwarf_Small     fp_extended_op;
191    Dwarf_Half      fp_register;
192
193    /* Value may be signed, depends on op.
194           Any applicable data_alignment_factor has
195           not been applied, this is the  raw offset. */
196    Dwarf_Unsigned  fp_offset_or_block_len;
197    Dwarf_Small     *fp_expr_block;
198
199    Dwarf_Off       fp_instr_offset;
200} Dwarf_Frame_Op3;  /* DWARF3 and DWARF2 compatible */
201
202/*  ***IMPORTANT NOTE, TARGET DEPENDENCY ****
203   DW_REG_TABLE_SIZE must be at least as large as
204   the number of registers
205   (DW_FRAME_LAST_REG_NUM) as defined in dwarf.h
206   Preferably identical to DW_FRAME_LAST_REG_NUM.
207   Ensure [0-DW_REG_TABLE_SIZE] does not overlap
208   DW_FRAME_UNDEFINED_VAL or DW_FRAME_SAME_VAL.
209   Also ensure DW_FRAME_REG_INITIAL_VALUE is set to what
210   is appropriate to your cpu.
211   For various CPUs  DW_FRAME_UNDEFINED_VAL is correct
212   as the value for DW_FRAME_REG_INITIAL_VALUE.
213
214   For consumer apps, this can be set dynamically: see
215   dwarf_set_frame_rule_table_size();
216 */
217#ifndef DW_REG_TABLE_SIZE
218#define DW_REG_TABLE_SIZE  66
219#endif
220
221/* For MIPS, DW_FRAME_SAME_VAL is the correct default value
222   for a frame register value. For other CPUS another value
223   may be better, such as DW_FRAME_UNDEFINED_VAL.
224   See dwarf_set_frame_rule_table_size
225*/
226#ifndef DW_FRAME_REG_INITIAL_VALUE
227#define DW_FRAME_REG_INITIAL_VALUE DW_FRAME_SAME_VAL
228#endif
229
230/* Taken as meaning 'undefined value', this is not
231   a column or register number.
232   Only present at libdwarf runtime in the consumer
233   interfaces. Never on disk.
234   DW_FRAME_* Values present on disk are in dwarf.h
235   Ensure this is > DW_REG_TABLE_SIZE (the reg table
236   size is changeable at runtime with the *reg3() interfaces,
237   and this value must be greater than the reg table size).
238*/
239#define DW_FRAME_UNDEFINED_VAL          1034
240
241/* Taken as meaning 'same value' as caller had, not a column
242   or register number.
243   Only present at libdwarf runtime in the consumer
244   interfaces. Never on disk.
245   DW_FRAME_* Values present on disk are in dwarf.h
246   Ensure this is > DW_REG_TABLE_SIZE (the reg table
247   size is changeable at runtime with the *reg3() interfaces,
248   and this value must be greater than the reg table size).
249*/
250#define DW_FRAME_SAME_VAL               1035
251
252/* For DWARF3 consumer interfaces, make the CFA a column with no
253   real table number.  This is what should have been done
254   for the DWARF2 interfaces.  This actually works for
255   both DWARF2 and DWARF3, but see the libdwarf documentation
256   on Dwarf_Regtable3 and  dwarf_get_fde_info_for_reg3()
257   and  dwarf_get_fde_info_for_all_regs3()
258   Do NOT use this with the older dwarf_get_fde_info_for_reg()
259   or dwarf_get_fde_info_for_all_regs() consumer interfaces.
260   Must be higher than any register count for *any* ABI
261   (ensures maximum applicability with minimum effort).
262   Ensure this is > DW_REG_TABLE_SIZE (the reg table
263   size is changeable at runtime with the *reg3() interfaces,
264   and this value must be greater than the reg table size).
265   Only present at libdwarf runtime in the consumer
266   interfaces. Never on disk.
267*/
268#define DW_FRAME_CFA_COL3               1436
269
270/* The following are all needed to evaluate DWARF3 register rules.
271*/
272#define DW_EXPR_OFFSET 0  /* DWARF2 only sees this. */
273#define DW_EXPR_VAL_OFFSET 1
274#define DW_EXPR_EXPRESSION 2
275#define DW_EXPR_VAL_EXPRESSION 3
276
277typedef struct Dwarf_Regtable_Entry_s {
278    /*  For each index i (naming a hardware register with dwarf number
279            i) the following is true and defines the value of that register:
280
281           If dw_regnum is Register DW_FRAME_UNDEFINED_VAL
282         it is not DWARF register number but
283        a place holder indicating the register has no defined value.
284           If dw_regnum is Register DW_FRAME_SAME_VAL
285           it  is not DWARF register number but
286        a place holder indicating the register has the same
287                value in the previous frame.
288       DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL are
289           only present at libdwarf runtime. Never on disk.
290           DW_FRAME_* Values present on disk are in dwarf.h
291
292          Otherwise: the register number is a DWARF register number
293          (see ABI documents for how this translates to hardware/
294           software register numbers in the machine hardware)
295      and the following applies:
296
297          if dw_value_type == DW_EXPR_OFFSET (the only case for dwarf2):
298            If dw_offset_relevant is non-zero, then
299                the value is stored at at the address CFA+N where
300                N is a signed offset.
301                Rule: Offset(N)
302            If dw_offset_relevant is zero, then the value of the register
303                is the value of (DWARF) register number dw_regnum.
304                Rule: register(F)
305          Other values of dw_value_type are an error.
306        */
307    Dwarf_Small         dw_offset_relevant;
308
309    /* For DWARF2, always 0 */
310        Dwarf_Small         dw_value_type;
311
312    Dwarf_Half          dw_regnum;
313
314    /* The data type here should  the larger of Dwarf_Addr
315           and Dwarf_Unsigned and Dwarf_Signed. */
316    Dwarf_Addr          dw_offset;
317} Dwarf_Regtable_Entry;
318
319typedef struct Dwarf_Regtable_s {
320    struct Dwarf_Regtable_Entry_s rules[DW_REG_TABLE_SIZE];
321} Dwarf_Regtable;
322
323/* opaque type. Functional interface shown later. */
324struct Dwarf_Reg_value3_s;
325typedef struct Dwarf_Reg_value3_s Dwarf_Reg_Value3;
326
327typedef struct Dwarf_Regtable_Entry3_s {
328    /*  For each index i (naming a hardware register with dwarf number
329        i) the following is true and defines the value of that register:
330
331          If dw_regnum is Register DW_FRAME_UNDEFINED_VAL
332             it is not DWARF register number but
333             a place holder indicating the register has no defined value.
334          If dw_regnum is Register DW_FRAME_SAME_VAL
335             it  is not DWARF register number but
336             a place holder indicating the register has the same
337             value in the previous frame.
338           DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL and
339             DW_FRAME_CFA_COL3 are only present at libdwarf runtime.
340             Never on disk.
341             DW_FRAME_* Values present on disk are in dwarf.h
342           Because DW_FRAME_SAME_VAL and DW_FRAME_UNDEFINED_VAL
343           and DW_FRAME_CFA_COL3 are defineable at runtime
344           consider the names symbolic in this comment, not absolute.
345
346          Otherwise: the register number is a DWARF register number
347            (see ABI documents for how this translates to hardware/
348             software register numbers in the machine hardware)
349             and the following applies:
350
351           In a cfa-defining entry (rt3_cfa_rule) the regnum is the
352           CFA 'register number'. Which is some 'normal' register,
353           not DW_FRAME_CFA_COL3, nor DW_FRAME_SAME_VAL, nor
354           DW_FRAME_UNDEFINED_VAL.
355
356          If dw_value_type == DW_EXPR_OFFSET (the only  possible case for
357             dwarf2):
358            If dw_offset_relevant is non-zero, then
359               the value is stored at at the address
360               CFA+N where N is a signed offset.
361               dw_regnum is the cfa register rule which means
362               one ignores dw_regnum and uses the CFA appropriately.
363               So dw_offset_or_block_len is a signed value, really,
364               and must be printed/evaluated as such.
365               Rule: Offset(N)
366            If dw_offset_relevant is zero, then the value of the register
367               is the value of (DWARF) register number dw_regnum.
368               Rule: register(R)
369          If dw_value_type  == DW_EXPR_VAL_OFFSET
370            the  value of this register is CFA +N where N is a signed offset.
371            dw_regnum is the cfa register rule which means
372            one ignores dw_regnum and uses the CFA appropriately.
373            Rule: val_offset(N)
374          If dw_value_type  == DW_EXPR_EXPRESSION
375            The value of the register is the value at the address
376            computed by evaluating the DWARF expression E.
377            Rule: expression(E)
378            The expression E byte stream is pointed to by dw_block_ptr.
379            The expression length in bytes is given by
380            dw_offset_or_block_len.
381          If dw_value_type  == DW_EXPR_VAL_EXPRESSION
382            The value of the register is the value
383            computed by evaluating the DWARF expression E.
384            Rule: val_expression(E)
385            The expression E byte stream is pointed to by dw_block_ptr.
386            The expression length in bytes is given by
387            dw_offset_or_block_len.
388          Other values of dw_value_type are an error.
389        */
390    Dwarf_Small         dw_offset_relevant;
391    Dwarf_Small         dw_value_type;
392    Dwarf_Half          dw_regnum;
393    Dwarf_Unsigned      dw_offset_or_block_len;
394    Dwarf_Ptr           dw_block_ptr;
395
396}Dwarf_Regtable_Entry3;
397
398/* For the DWARF3 version, moved the DW_FRAME_CFA_COL
399   out of the array and into its own struct.
400   Having it part of the array is not very easy to work
401   with from a portability point of view: changing
402   the number for every architecture is a pain (if one fails
403   to set it correctly a register rule gets clobbered when
404   setting CFA).  With MIPS it just happened to be easy to use
405   DW_FRAME_CFA_COL (it was wrong conceptually but it was easy...).
406
407   rt3_rules and rt3_reg_table_size must be filled in before
408   calling libdwarf.  Filled in with a pointer to an array
409   (pointer and array  set up by the calling application)
410   of rt3_reg_table_size Dwarf_Regtable_Entry3_s structs.
411   libdwarf does not allocate or deallocate space for the
412   rules, you must do so.   libdwarf will initialize the
413   contents rules array, you do not need to do so (though
414   if you choose to initialize the array somehow that is ok:
415   libdwarf will overwrite your initializations with its own).
416
417*/
418typedef struct Dwarf_Regtable3_s {
419    struct Dwarf_Regtable_Entry3_s   rt3_cfa_rule;
420
421    Dwarf_Half                       rt3_reg_table_size;
422    struct Dwarf_Regtable_Entry3_s * rt3_rules;
423} Dwarf_Regtable3;
424
425
426/* Use for DW_EPXR_STANDARD., DW_EXPR_VAL_OFFSET.
427   Returns DW_DLV_OK if the value is available.
428   If DW_DLV_OK returns the regnum and offset thru the pointers
429   (which the consumer must use appropriately).
430*/
431int dwarf_frame_get_reg_register(struct Dwarf_Regtable_Entry3_s *reg_in,
432    Dwarf_Small *offset_relevant,
433    Dwarf_Half *regnum_out,
434    Dwarf_Signed *offset_out);
435
436/* Use for DW_EXPR_EXPRESSION, DW_EXPR_VAL_EXPRESSION.
437   Returns DW_DLV_OK if the value is available.
438   The caller must pass in the address of a valid
439   Dwarf_Block (the caller need not initialize it).
440*/
441int dwarf_frame_get_reg_expression(struct Dwarf_Regtable_Entry3_s *reg_in,
442    Dwarf_Block *block_out);
443
444
445/* For DW_DLC_SYMBOLIC_RELOCATIONS output to caller
446   v2, adding drd_length: some relocations are 4 and
447   some 8 bytes (pointers are 8, section offsets 4) in
448   some dwarf environments. (MIPS relocations are all one
449   size in any given ABI.) Changing drd_type to an unsigned char
450   to keep struct size down.
451*/
452enum Dwarf_Rel_Type {
453        dwarf_drt_none,        /* Should not get to caller */
454        dwarf_drt_data_reloc,  /* Simple normal relocation. */
455        dwarf_drt_segment_rel, /* Special reloc, exceptions. */
456        /* dwarf_drt_first_of_length_pair  and drt_second
457           are for for the  .word end - begin case. */
458        dwarf_drt_first_of_length_pair,
459        dwarf_drt_second_of_length_pair
460};
461
462typedef struct Dwarf_P_Marker_s * Dwarf_P_Marker;
463struct Dwarf_P_Marker_s {
464    Dwarf_Unsigned ma_marker;
465    Dwarf_Unsigned ma_offset;
466};
467
468typedef struct Dwarf_Relocation_Data_s  * Dwarf_Relocation_Data;
469struct Dwarf_Relocation_Data_s {
470    unsigned char drd_type;   /* Cast to/from Dwarf_Rel_Type
471                               to keep size small in struct. */
472    unsigned char drd_length; /* Length in bytes of data being
473                               relocated. 4 for 32bit data,
474                               8 for 64bit data. */
475    Dwarf_Unsigned       drd_offset; /* Where the data to reloc is. */
476    Dwarf_Unsigned       drd_symbol_index;
477};
478
479typedef struct Dwarf_P_String_Attr_s  * Dwarf_P_String_Attr;
480struct Dwarf_P_String_Attr_s {
481    Dwarf_Unsigned        sa_offset;  /* Offset of string attribute data */
482    Dwarf_Unsigned        sa_nbytes;
483};
484
485
486/* Opaque types for Consumer Library. */
487typedef struct Dwarf_Debug_s*      Dwarf_Debug;
488typedef struct Dwarf_Die_s*        Dwarf_Die;
489typedef struct Dwarf_Line_s*       Dwarf_Line;
490typedef struct Dwarf_Global_s*     Dwarf_Global;
491typedef struct Dwarf_Func_s*       Dwarf_Func;
492typedef struct Dwarf_Type_s*       Dwarf_Type;
493typedef struct Dwarf_Var_s*        Dwarf_Var;
494typedef struct Dwarf_Weak_s*       Dwarf_Weak;
495typedef struct Dwarf_Error_s*      Dwarf_Error;
496typedef struct Dwarf_Attribute_s*  Dwarf_Attribute;
497typedef struct Dwarf_Abbrev_s*       Dwarf_Abbrev;
498typedef struct Dwarf_Fde_s*         Dwarf_Fde;
499typedef struct Dwarf_Cie_s*         Dwarf_Cie;
500typedef struct Dwarf_Arange_s*       Dwarf_Arange;
501
502/* Opaque types for Producer Library. */
503typedef struct Dwarf_P_Debug_s*           Dwarf_P_Debug;
504typedef struct Dwarf_P_Die_s*           Dwarf_P_Die;
505typedef struct Dwarf_P_Attribute_s*    Dwarf_P_Attribute;
506typedef struct Dwarf_P_Fde_s*        Dwarf_P_Fde;
507typedef struct Dwarf_P_Expr_s*        Dwarf_P_Expr;
508typedef Dwarf_Unsigned                Dwarf_Tag;
509
510
511/* error handler function
512*/
513typedef void  (*Dwarf_Handler)(Dwarf_Error /*error*/, Dwarf_Ptr /*errarg*/);
514
515
516/* Begin libdwarf Object File Interface declarations.
517
518As of February 2008 there are multiple dwarf_reader object access
519initialization methods available:
520The traditional dwarf_elf_init() and dwarf_init()  and dwarf_finish()
521    which assume libelf and POSIX file access.
522An object-file and library agnostic dwarf_object_init() and dwarf_object_finish()
523    which allow the coder to provide object access routines
524    abstracting away the elf interface.  So there is no dependence in the
525    reader code on the object format and no dependence on libelf.
526    See the code in dwarf_elf_access.c  and dwarf_original_elf_init.c
527    to see an example of initializing the structures mentioned below.
528
529Projects using dwarf_elf_init() or dwarf_init() can ignore
530the Dwarf_Obj_Access* structures entirely as all these details
531are completed for you.
532
533*/
534
535typedef struct Dwarf_Obj_Access_Interface_s   Dwarf_Obj_Access_Interface;
536typedef struct Dwarf_Obj_Access_Methods_s     Dwarf_Obj_Access_Methods;
537typedef struct Dwarf_Obj_Access_Section_s     Dwarf_Obj_Access_Section;
538
539
540/* Used in the get_section interface function
541   in Dwarf_Obj_Access_Section_s.  Since libdwarf
542   depends on standard DWARF section names an object
543   format that has no such names (but has some
544   method of setting up 'sections equivalents')
545   must arrange to return standard DWARF section
546   names in the 'name' field.  libdwarf does
547   not free the strings in 'name'. */
548struct Dwarf_Obj_Access_Section_s {
549    Dwarf_Addr     addr;
550    Dwarf_Unsigned size;
551    const char*    name;
552    /* Set link to zero if it is meaningless.  If non-zero
553       it should be a link to a rela section or from symtab
554       to strtab.  In Elf it is sh_link. */
555    Dwarf_Unsigned link;
556};
557
558/* Returned by the get_endianness function in
559   Dwarf_Obj_Access_Methods_s. */
560typedef enum {
561    DW_OBJECT_MSB,
562    DW_OBJECT_LSB
563} Dwarf_Endianness;
564
565/* The functions we need to access object data from libdwarf are declared here.
566
567   In these function pointer declarations
568   'void *obj' is intended to be a pointer (the object field in
569   Dwarf_Obj_Access_Interface_s)
570   that hides the library-specific and object-specific data that makes
571   it possible to handle multiple object formats and multiple libraries.
572   It's not required that one handles multiple such in a single libdwarf
573   archive/shared-library (but not ruled out either).
574   See  dwarf_elf_object_access_internals_t and dwarf_elf_access.c
575   for an example.
576
577*/
578struct Dwarf_Obj_Access_Methods_s {
579    /**
580     * get_section_info
581     *
582     * Get address, size, and name info about a section.
583     *
584     * Parameters
585     * section_index - Zero-based index.
586     * return_section - Pointer to a structure in which section info
587     *   will be placed.   Caller must provide a valid pointer to a
588     *   structure area.  The structure's contents will be overwritten
589     *   by the call to get_section_info.
590     * error - A pointer to an integer in which an error code may be stored.
591     *
592     * Return
593     * DW_DLV_OK - Everything ok.
594     * DW_DLV_ERROR - Error occurred. Use 'error' to determine the
595     *    libdwarf defined error.
596     * DW_DLV_NO_ENTRY - No such section.
597     */
598    int    (*get_section_info)(void* obj, Dwarf_Half section_index,
599        Dwarf_Obj_Access_Section* return_section, int* error);
600    /**
601     * get_byte_order
602     *
603     * Get whether the object file represented by this interface is big-endian
604     * (DW_OBJECT_MSB) or little endian (DW_OBJECT_LSB).
605     *
606     * Parameters
607     * obj - Equivalent to 'this' in OO languages.
608     *
609     * Return
610     * Endianness of object. Cannot fail.
611     */
612    Dwarf_Endianness  (*get_byte_order)(void* obj);
613    /**
614     * get_length_size
615     *
616     * Get the size of a length field in the underlying object file.
617     * libdwarf currently supports * 4 and 8 byte sizes, but may
618     * support larger in the future.
619     * Perhaps the return type should be an enumeration?
620     *
621     * Parameters
622     * obj - Equivalent to 'this' in OO languages.
623     *
624     * Return
625     * Size of length. Cannot fail.
626     */
627    Dwarf_Small   (*get_length_size)(void* obj);
628    /**
629     * get_pointer_size
630     *
631     * Get the size of a pointer field in the underlying object file.
632     * libdwarf currently supports  4 and 8 byte sizes.
633     * Perhaps the return type should be an enumeration?
634
635     * Return
636     * Size of pointer. Cannot fail.
637     */
638    Dwarf_Small   (*get_pointer_size)(void* obj);
639    /**
640     * get_section_count
641     *
642     * Get the number of sections in the object file.
643     *
644     * Parameters
645     *
646     * Return
647     * Number of sections
648     */
649    Dwarf_Unsigned  (*get_section_count)(void* obj);
650    /**
651     * load_section
652     *
653     * Get a pointer to an array of bytes that represent the section.
654     *
655     * Parameters
656     * section_index - Zero-based index.
657     * return_data - The address of a pointer to which the section data block
658     *   will be assigned.
659     * error - Pointer to an integer for returning libdwarf-defined
660     *   error numbers.
661     *
662     * Return
663     * DW_DLV_OK - No error.
664     * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined
665     *    error number.
666     * DW_DLV_NO_ENTRY - No such section.
667     */
668    int    (*load_section)(void* obj, Dwarf_Half section_index,
669        Dwarf_Small** return_data, int* error);
670
671   /**
672    * relocate_a_section
673    * If relocations are not supported leave this pointer NULL.
674    *
675    * Get a pointer to an array of bytes that represent the section.
676    *
677    * Parameters
678    * section_index - Zero-based index of the section to be relocated.
679    * error - Pointer to an integer for returning libdwarf-defined
680    *   error numbers.
681    *
682    * Return
683    * DW_DLV_OK - No error.
684    * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined
685    *    error number.
686    * DW_DLV_NO_ENTRY - No such section.
687    */
688    int    (*relocate_a_section)(void* obj, Dwarf_Half section_index,
689         Dwarf_Debug dbg,
690         int* error);
691
692};
693
694
695
696/* These structures are allocated and deallocated by your code
697   when you are using the libdwarf Object File Interface
698   [dwarf_object_init() and dwarf_object_finish()] directly.
699   dwarf_object_finish() does not free
700   struct Dwarf_Obj_Access_Interface_s or its content.
701   (libdwarf does record a pointer to this struct: you must
702   ensure that pointer remains valid for as long as
703   a libdwarf instance is open (meaning
704   after dwarf_init() and before dwarf_finish()).
705
706   If you are reading Elf objects and libelf use dwarf_init()
707   or dwarf_elf_init() which take care of these details.
708*/
709struct Dwarf_Obj_Access_Interface_s {
710    /* object is a void* as it hides the data the object access routines
711       need (which varies by library in use and object format).
712    */
713    void* object;
714    const Dwarf_Obj_Access_Methods * methods;
715};
716
717/* End libdwarf Object File Interface */
718
719/*
720    Dwarf_dealloc() alloc_type arguments.
721    Argument points to:
722*/
723#define DW_DLA_STRING          0x01     /* char* */
724#define DW_DLA_LOC             0x02     /* Dwarf_Loc */
725#define DW_DLA_LOCDESC         0x03     /* Dwarf_Locdesc */
726#define DW_DLA_ELLIST          0x04     /* Dwarf_Ellist (not used)*/
727#define DW_DLA_BOUNDS          0x05     /* Dwarf_Bounds (not used) */
728#define DW_DLA_BLOCK           0x06     /* Dwarf_Block */
729#define DW_DLA_DEBUG           0x07     /* Dwarf_Debug */
730#define DW_DLA_DIE             0x08     /* Dwarf_Die */
731#define DW_DLA_LINE            0x09     /* Dwarf_Line */
732#define DW_DLA_ATTR            0x0a     /* Dwarf_Attribute */
733#define DW_DLA_TYPE            0x0b     /* Dwarf_Type  (not used) */
734#define DW_DLA_SUBSCR          0x0c     /* Dwarf_Subscr (not used) */
735#define DW_DLA_GLOBAL          0x0d     /* Dwarf_Global */
736#define DW_DLA_ERROR           0x0e     /* Dwarf_Error */
737#define DW_DLA_LIST            0x0f     /* a list */
738#define DW_DLA_LINEBUF         0x10     /* Dwarf_Line* (not used) */
739#define DW_DLA_ARANGE          0x11     /* Dwarf_Arange */
740#define DW_DLA_ABBREV          0x12      /* Dwarf_Abbrev */
741#define DW_DLA_FRAME_OP        0x13      /* Dwarf_Frame_Op */
742#define DW_DLA_CIE             0x14     /* Dwarf_Cie */
743#define DW_DLA_FDE             0x15     /* Dwarf_Fde */
744#define DW_DLA_LOC_BLOCK       0x16     /* Dwarf_Loc Block (not used) */
745#define DW_DLA_FRAME_BLOCK     0x17     /* Dwarf_Frame Block (not used) */
746#define DW_DLA_FUNC            0x18     /* Dwarf_Func */
747#define DW_DLA_TYPENAME        0x19     /* Dwarf_Type */
748#define DW_DLA_VAR             0x1a     /* Dwarf_Var */
749#define DW_DLA_WEAK            0x1b     /* Dwarf_Weak */
750#define DW_DLA_ADDR            0x1c     /* Dwarf_Addr sized entries */
751#define DW_DLA_RANGES          0x1d     /* Dwarf_Ranges */
752
753/* The augmenter string for CIE */
754#define DW_CIE_AUGMENTER_STRING_V0              "z"
755
756/* dwarf_init() access arguments
757*/
758#define DW_DLC_READ        0        /* read only access */
759#define DW_DLC_WRITE       1        /* write only access */
760#define DW_DLC_RDWR        2        /* read/write access NOT SUPPORTED*/
761
762/* pro_init() access flag modifiers
763   If HAVE_DWARF2_99_EXTENSION is defined at libdwarf build time
764   and DW_DLC_OFFSET_SIZE_64  is passed in pro_init() flags then the DWARF3
765   64 bit offset extension is used to generate 64 bit offsets.
766*/
767#define DW_DLC_SIZE_64     0x40000000 /* 32-bit address-size target */
768#define DW_DLC_SIZE_32     0x20000000 /* 64-bit address-size target */
769#define DW_DLC_OFFSET_SIZE_64 0x10000000 /* 64-bit offset-size DWARF */
770
771/* dwarf_pro_init() access flag modifiers
772*/
773#define DW_DLC_ISA_MIPS             0x00000000 /* MIPS target */
774#define DW_DLC_ISA_IA64             0x01000000 /* IA64 target */
775#define DW_DLC_STREAM_RELOCATIONS   0x02000000 /* Old style binary relocs */
776
777    /* Usable with assembly output because it is up to the producer to
778       deal with locations in whatever manner the producer code wishes.
779       Possibly emitting text an assembler will recognize. */
780#define DW_DLC_SYMBOLIC_RELOCATIONS 0x04000000
781
782#define DW_DLC_TARGET_BIGENDIAN     0x08000000 /* Big    endian target */
783#define DW_DLC_TARGET_LITTLEENDIAN  0x00100000 /* Little endian target */
784
785#if 0
786  /*
787   The libdwarf producer interfaces jumble these two semantics together in
788   confusing ways.  We *should* have flags like these...
789   But changing the code means a lot of diffs.  So for now,
790   we leave things as they are
791  */
792  #define DW_DLC_SUN_OFFSET32        0x00010000 /* use 32-bit sec offsets */
793  #define DW_DLC_SUN_OFFSET64        0x00020000 /* use 64-bit sec offsets */
794  #define DW_DLC_SUN_POINTER32        0x00040000 /* use 4 for address_size */
795  #define DW_DLC_SUN_POINTER64        0x00080000 /* use 8 for address_size */
796#endif
797
798/* dwarf_pcline() slide arguments
799*/
800#define DW_DLS_BACKWARD   -1       /* slide backward to find line */
801#define DW_DLS_NOSLIDE     0       /* match exactly without sliding */
802#define DW_DLS_FORWARD     1       /* slide forward to find line */
803
804/* libdwarf error numbers
805*/
806#define DW_DLE_NE          0     /* no error */
807#define DW_DLE_VMM         1     /* dwarf format/library version mismatch */
808#define DW_DLE_MAP         2     /* memory map failure */
809#define DW_DLE_LEE         3     /* libelf error */
810#define DW_DLE_NDS         4     /* no debug section */
811#define DW_DLE_NLS         5     /* no line section */
812#define DW_DLE_ID          6     /* invalid descriptor for query */
813#define DW_DLE_IOF         7     /* I/O failure */
814#define DW_DLE_MAF         8     /* memory allocation failure */
815#define DW_DLE_IA          9     /* invalid argument */
816#define DW_DLE_MDE         10     /* mangled debugging entry */
817#define DW_DLE_MLE         11     /* mangled line number entry */
818#define DW_DLE_FNO         12     /* file not open */
819#define DW_DLE_FNR         13     /* file not a regular file */
820#define DW_DLE_FWA         14     /* file open with wrong access */
821#define DW_DLE_NOB         15     /* not an object file */
822#define DW_DLE_MOF         16     /* mangled object file header */
823#define DW_DLE_EOLL        17     /* end of location list entries */
824#define DW_DLE_NOLL        18     /* no location list section */
825#define DW_DLE_BADOFF      19     /* Invalid offset */
826#define DW_DLE_EOS         20     /* end of section  */
827#define DW_DLE_ATRUNC      21     /* abbreviations section appears truncated*/
828#define DW_DLE_BADBITC     22     /* Address size passed to dwarf bad*/
829                    /* It is not an allowed size (64 or 32) */
830    /* Error codes defined by the current Libdwarf Implementation. */
831#define DW_DLE_DBG_ALLOC                        23
832#define DW_DLE_FSTAT_ERROR                      24
833#define DW_DLE_FSTAT_MODE_ERROR                 25
834#define DW_DLE_INIT_ACCESS_WRONG                26
835#define DW_DLE_ELF_BEGIN_ERROR                  27
836#define DW_DLE_ELF_GETEHDR_ERROR                28
837#define DW_DLE_ELF_GETSHDR_ERROR                29
838#define DW_DLE_ELF_STRPTR_ERROR                 30
839#define DW_DLE_DEBUG_INFO_DUPLICATE             31
840#define DW_DLE_DEBUG_INFO_NULL                  32
841#define DW_DLE_DEBUG_ABBREV_DUPLICATE           33
842#define DW_DLE_DEBUG_ABBREV_NULL                34
843#define DW_DLE_DEBUG_ARANGES_DUPLICATE          35
844#define DW_DLE_DEBUG_ARANGES_NULL               36
845#define DW_DLE_DEBUG_LINE_DUPLICATE             37
846#define DW_DLE_DEBUG_LINE_NULL                  38
847#define DW_DLE_DEBUG_LOC_DUPLICATE              39
848#define DW_DLE_DEBUG_LOC_NULL                   40
849#define DW_DLE_DEBUG_MACINFO_DUPLICATE          41
850#define DW_DLE_DEBUG_MACINFO_NULL               42
851#define DW_DLE_DEBUG_PUBNAMES_DUPLICATE         43
852#define DW_DLE_DEBUG_PUBNAMES_NULL              44
853#define DW_DLE_DEBUG_STR_DUPLICATE              45
854#define DW_DLE_DEBUG_STR_NULL                   46
855#define DW_DLE_CU_LENGTH_ERROR                  47
856#define DW_DLE_VERSION_STAMP_ERROR              48
857#define DW_DLE_ABBREV_OFFSET_ERROR              49
858#define DW_DLE_ADDRESS_SIZE_ERROR               50
859#define DW_DLE_DEBUG_INFO_PTR_NULL              51
860#define DW_DLE_DIE_NULL                         52
861#define DW_DLE_STRING_OFFSET_BAD                53
862#define DW_DLE_DEBUG_LINE_LENGTH_BAD            54
863#define DW_DLE_LINE_PROLOG_LENGTH_BAD           55
864#define DW_DLE_LINE_NUM_OPERANDS_BAD            56
865#define DW_DLE_LINE_SET_ADDR_ERROR              57 /* No longer used. */
866#define DW_DLE_LINE_EXT_OPCODE_BAD              58
867#define DW_DLE_DWARF_LINE_NULL                  59
868#define DW_DLE_INCL_DIR_NUM_BAD                 60
869#define DW_DLE_LINE_FILE_NUM_BAD                61
870#define DW_DLE_ALLOC_FAIL                       62
871#define DW_DLE_NO_CALLBACK_FUNC                 63
872#define DW_DLE_SECT_ALLOC                       64
873#define DW_DLE_FILE_ENTRY_ALLOC                 65
874#define DW_DLE_LINE_ALLOC                       66
875#define DW_DLE_FPGM_ALLOC                       67
876#define DW_DLE_INCDIR_ALLOC                     68
877#define DW_DLE_STRING_ALLOC                     69
878#define DW_DLE_CHUNK_ALLOC                      70
879#define DW_DLE_BYTEOFF_ERR                      71
880#define DW_DLE_CIE_ALLOC                        72
881#define DW_DLE_FDE_ALLOC                        73
882#define DW_DLE_REGNO_OVFL                       74
883#define DW_DLE_CIE_OFFS_ALLOC                   75
884#define DW_DLE_WRONG_ADDRESS                    76
885#define DW_DLE_EXTRA_NEIGHBORS                  77
886#define    DW_DLE_WRONG_TAG                     78
887#define DW_DLE_DIE_ALLOC                        79
888#define DW_DLE_PARENT_EXISTS                    80
889#define DW_DLE_DBG_NULL                         81
890#define DW_DLE_DEBUGLINE_ERROR                  82
891#define DW_DLE_DEBUGFRAME_ERROR                 83
892#define DW_DLE_DEBUGINFO_ERROR                  84
893#define DW_DLE_ATTR_ALLOC                       85
894#define DW_DLE_ABBREV_ALLOC                     86
895#define DW_DLE_OFFSET_UFLW                      87
896#define DW_DLE_ELF_SECT_ERR                     88
897#define DW_DLE_DEBUG_FRAME_LENGTH_BAD           89
898#define DW_DLE_FRAME_VERSION_BAD                90
899#define DW_DLE_CIE_RET_ADDR_REG_ERROR           91
900#define DW_DLE_FDE_NULL                         92
901#define DW_DLE_FDE_DBG_NULL                     93
902#define DW_DLE_CIE_NULL                         94
903#define DW_DLE_CIE_DBG_NULL                     95
904#define DW_DLE_FRAME_TABLE_COL_BAD              96
905#define DW_DLE_PC_NOT_IN_FDE_RANGE              97
906#define DW_DLE_CIE_INSTR_EXEC_ERROR             98
907#define DW_DLE_FRAME_INSTR_EXEC_ERROR           99
908#define DW_DLE_FDE_PTR_NULL                    100
909#define DW_DLE_RET_OP_LIST_NULL                101
910#define DW_DLE_LINE_CONTEXT_NULL               102
911#define DW_DLE_DBG_NO_CU_CONTEXT               103
912#define DW_DLE_DIE_NO_CU_CONTEXT               104
913#define DW_DLE_FIRST_DIE_NOT_CU                105
914#define DW_DLE_NEXT_DIE_PTR_NULL               106
915#define DW_DLE_DEBUG_FRAME_DUPLICATE           107
916#define DW_DLE_DEBUG_FRAME_NULL                108
917#define DW_DLE_ABBREV_DECODE_ERROR             109
918#define DW_DLE_DWARF_ABBREV_NULL               110
919#define DW_DLE_ATTR_NULL                       111
920#define DW_DLE_DIE_BAD                         112
921#define DW_DLE_DIE_ABBREV_BAD                  113
922#define DW_DLE_ATTR_FORM_BAD                   114
923#define DW_DLE_ATTR_NO_CU_CONTEXT              115
924#define DW_DLE_ATTR_FORM_SIZE_BAD              116
925#define DW_DLE_ATTR_DBG_NULL                   117
926#define DW_DLE_BAD_REF_FORM                    118
927#define DW_DLE_ATTR_FORM_OFFSET_BAD            119
928#define DW_DLE_LINE_OFFSET_BAD                 120
929#define DW_DLE_DEBUG_STR_OFFSET_BAD            121
930#define DW_DLE_STRING_PTR_NULL                 122
931#define DW_DLE_PUBNAMES_VERSION_ERROR          123
932#define DW_DLE_PUBNAMES_LENGTH_BAD             124
933#define DW_DLE_GLOBAL_NULL                     125
934#define DW_DLE_GLOBAL_CONTEXT_NULL             126
935#define DW_DLE_DIR_INDEX_BAD                   127
936#define DW_DLE_LOC_EXPR_BAD                    128
937#define DW_DLE_DIE_LOC_EXPR_BAD                129
938#define DW_DLE_ADDR_ALLOC                      130
939#define DW_DLE_OFFSET_BAD                      131
940#define DW_DLE_MAKE_CU_CONTEXT_FAIL            132
941#define DW_DLE_REL_ALLOC                       133
942#define DW_DLE_ARANGE_OFFSET_BAD               134
943#define DW_DLE_SEGMENT_SIZE_BAD                135
944#define DW_DLE_ARANGE_LENGTH_BAD               136
945#define DW_DLE_ARANGE_DECODE_ERROR             137
946#define DW_DLE_ARANGES_NULL                    138
947#define DW_DLE_ARANGE_NULL                     139
948#define DW_DLE_NO_FILE_NAME                    140
949#define DW_DLE_NO_COMP_DIR                     141
950#define DW_DLE_CU_ADDRESS_SIZE_BAD             142
951#define DW_DLE_INPUT_ATTR_BAD                  143
952#define DW_DLE_EXPR_NULL                       144
953#define DW_DLE_BAD_EXPR_OPCODE                 145
954#define DW_DLE_EXPR_LENGTH_BAD                 146
955#define DW_DLE_MULTIPLE_RELOC_IN_EXPR          147
956#define DW_DLE_ELF_GETIDENT_ERROR              148
957#define DW_DLE_NO_AT_MIPS_FDE                  149
958#define DW_DLE_NO_CIE_FOR_FDE                  150
959#define DW_DLE_DIE_ABBREV_LIST_NULL            151
960#define DW_DLE_DEBUG_FUNCNAMES_DUPLICATE       152
961#define DW_DLE_DEBUG_FUNCNAMES_NULL            153
962#define DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR   154
963#define DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD      155
964#define DW_DLE_FUNC_NULL                       156
965#define DW_DLE_FUNC_CONTEXT_NULL               157
966#define DW_DLE_DEBUG_TYPENAMES_DUPLICATE       158
967#define DW_DLE_DEBUG_TYPENAMES_NULL            159
968#define DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR   160
969#define DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD      161
970#define DW_DLE_TYPE_NULL                       162
971#define DW_DLE_TYPE_CONTEXT_NULL               163
972#define DW_DLE_DEBUG_VARNAMES_DUPLICATE        164
973#define DW_DLE_DEBUG_VARNAMES_NULL             165
974#define DW_DLE_DEBUG_VARNAMES_VERSION_ERROR    166
975#define DW_DLE_DEBUG_VARNAMES_LENGTH_BAD       167
976#define DW_DLE_VAR_NULL                        168
977#define DW_DLE_VAR_CONTEXT_NULL                169
978#define DW_DLE_DEBUG_WEAKNAMES_DUPLICATE       170
979#define DW_DLE_DEBUG_WEAKNAMES_NULL            171
980#define DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR   172
981#define DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD      173
982#define DW_DLE_WEAK_NULL                       174
983#define DW_DLE_WEAK_CONTEXT_NULL               175
984#define DW_DLE_LOCDESC_COUNT_WRONG             176
985#define DW_DLE_MACINFO_STRING_NULL             177
986#define DW_DLE_MACINFO_STRING_EMPTY            178
987#define DW_DLE_MACINFO_INTERNAL_ERROR_SPACE    179
988#define DW_DLE_MACINFO_MALLOC_FAIL             180
989#define DW_DLE_DEBUGMACINFO_ERROR              181
990#define DW_DLE_DEBUG_MACRO_LENGTH_BAD          182
991#define DW_DLE_DEBUG_MACRO_MAX_BAD             183
992#define DW_DLE_DEBUG_MACRO_INTERNAL_ERR        184
993#define DW_DLE_DEBUG_MACRO_MALLOC_SPACE        185
994#define DW_DLE_DEBUG_MACRO_INCONSISTENT        186
995#define DW_DLE_DF_NO_CIE_AUGMENTATION          187
996#define DW_DLE_DF_REG_NUM_TOO_HIGH             188
997#define DW_DLE_DF_MAKE_INSTR_NO_INIT           189
998#define DW_DLE_DF_NEW_LOC_LESS_OLD_LOC         190
999#define DW_DLE_DF_POP_EMPTY_STACK              191
1000#define DW_DLE_DF_ALLOC_FAIL                   192
1001#define DW_DLE_DF_FRAME_DECODING_ERROR         193
1002#define DW_DLE_DEBUG_LOC_SECTION_SHORT         194
1003#define DW_DLE_FRAME_AUGMENTATION_UNKNOWN      195
1004#define DW_DLE_PUBTYPE_CONTEXT                 196 /* Unused. */
1005#define DW_DLE_DEBUG_PUBTYPES_LENGTH_BAD       197
1006#define DW_DLE_DEBUG_PUBTYPES_VERSION_ERROR    198
1007#define DW_DLE_DEBUG_PUBTYPES_DUPLICATE        199
1008#define DW_DLE_FRAME_CIE_DECODE_ERROR          200
1009#define DW_DLE_FRAME_REGISTER_UNREPRESENTABLE  201
1010#define DW_DLE_FRAME_REGISTER_COUNT_MISMATCH   202
1011#define DW_DLE_LINK_LOOP                       203
1012#define DW_DLE_STRP_OFFSET_BAD                 204
1013#define DW_DLE_DEBUG_RANGES_DUPLICATE          205
1014#define DW_DLE_DEBUG_RANGES_OFFSET_BAD         206
1015#define DW_DLE_DEBUG_RANGES_MISSING_END        207
1016#define DW_DLE_DEBUG_RANGES_OUT_OF_MEM         208
1017#define DW_DLE_DEBUG_SYMTAB_ERR                209
1018#define DW_DLE_DEBUG_STRTAB_ERR                210
1019#define DW_DLE_RELOC_MISMATCH_INDEX            211
1020#define DW_DLE_RELOC_MISMATCH_RELOC_INDEX      212
1021#define DW_DLE_RELOC_MISMATCH_STRTAB_INDEX     213
1022#define DW_DLE_RELOC_SECTION_MISMATCH          214
1023#define DW_DLE_RELOC_SECTION_MISSING_INDEX     215
1024#define DW_DLE_RELOC_SECTION_LENGTH_ODD        216
1025#define DW_DLE_RELOC_SECTION_PTR_NULL          217
1026#define DW_DLE_RELOC_SECTION_MALLOC_FAIL       218
1027#define DW_DLE_NO_ELF64_SUPPORT                219
1028#define DW_DLE_MISSING_ELF64_SUPPORT           220
1029#define DW_DLE_ORPHAN_FDE                      221
1030#define DW_DLE_DUPLICATE_INST_BLOCK            222
1031#define DW_DLE_BAD_REF_SIG8_FORM               223
1032#define DW_DLE_ATTR_EXPRLOC_FORM_BAD           224
1033#define DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD      225
1034#define DW_DLE_NOT_REF_FORM                    226
1035#define DW_DLE_DEBUG_FRAME_LENGTH_NOT_MULTIPLE 227
1036
1037
1038
1039    /* DW_DLE_LAST MUST EQUAL LAST ERROR NUMBER */
1040#define DW_DLE_LAST        227
1041#define DW_DLE_LO_USER     0x10000
1042
1043   /* Taken as meaning 'undefined value', this is not
1044      a column or register number.
1045      Only present at libdwarf runtime. Never on disk.
1046      DW_FRAME_* Values present on disk are in dwarf.h
1047   */
1048#define DW_FRAME_UNDEFINED_VAL          1034
1049
1050   /* Taken as meaning 'same value' as caller had, not a column
1051      or register number
1052      Only present at libdwarf runtime. Never on disk.
1053      DW_FRAME_* Values present on disk are in dwarf.h
1054   */
1055#define DW_FRAME_SAME_VAL               1035
1056
1057
1058
1059/* error return values
1060*/
1061#define DW_DLV_BADADDR     (~(Dwarf_Addr)0)
1062    /* for functions returning target address */
1063
1064#define DW_DLV_NOCOUNT     ((Dwarf_Signed)-1)
1065    /* for functions returning count */
1066
1067#define DW_DLV_BADOFFSET   (~(Dwarf_Off)0)
1068    /* for functions returning offset */
1069
1070/* standard return values for functions */
1071#define DW_DLV_NO_ENTRY -1
1072#define DW_DLV_OK        0
1073#define DW_DLV_ERROR     1
1074
1075/* Special values for offset_into_exception_table field of dwarf fde's. */
1076/* The following value indicates that there is no Exception table offset
1077   associated with a dwarf frame. */
1078#define DW_DLX_NO_EH_OFFSET         (-1LL)
1079/* The following value indicates that the producer was unable to analyse the
1080   source file to generate Exception tables for this function. */
1081#define DW_DLX_EH_OFFSET_UNAVAILABLE  (-2LL)
1082
1083
1084/*===========================================================================*/
1085/*  Dwarf consumer interface initialization and termination operations */
1086
1087/* Initialization based on Unix open fd (using libelf internally). */
1088int dwarf_init(int    /*fd*/,
1089    Dwarf_Unsigned    /*access*/,
1090    Dwarf_Handler     /*errhand*/,
1091    Dwarf_Ptr         /*errarg*/,
1092    Dwarf_Debug*      /*dbg*/,
1093    Dwarf_Error*      /*error*/);
1094
1095/* Initialization based on libelf/sgi-fastlibelf open pointer. */
1096int dwarf_elf_init(dwarf_elf_handle /*elf*/,
1097    Dwarf_Unsigned    /*access*/,
1098    Dwarf_Handler     /*errhand*/,
1099    Dwarf_Ptr         /*errarg*/,
1100    Dwarf_Debug*      /*dbg*/,
1101    Dwarf_Error*      /*error*/);
1102
1103/* Undocumented function for memory allocator. */
1104void dwarf_print_memory_stats(Dwarf_Debug  /*dbg*/);
1105
1106int dwarf_get_elf(Dwarf_Debug /*dbg*/,
1107    dwarf_elf_handle* /*return_elfptr*/,
1108    Dwarf_Error*      /*error*/);
1109
1110int dwarf_finish(Dwarf_Debug /*dbg*/, Dwarf_Error* /*error*/);
1111
1112
1113int dwarf_object_init(Dwarf_Obj_Access_Interface* /* obj */,
1114    Dwarf_Handler /* errhand */,
1115    Dwarf_Ptr     /* errarg */,
1116    Dwarf_Debug*  /* dbg */,
1117    Dwarf_Error*  /* error */);
1118
1119int dwarf_object_finish(Dwarf_Debug /* dbg */,
1120    Dwarf_Error* /* error */);
1121
1122/* die traversal operations */
1123int dwarf_next_cu_header_b(Dwarf_Debug /*dbg*/,
1124    Dwarf_Unsigned* /*cu_header_length*/,
1125    Dwarf_Half*     /*version_stamp*/,
1126    Dwarf_Off*      /*abbrev_offset*/,
1127    Dwarf_Half*     /*address_size*/,
1128    Dwarf_Half*     /*length_size*/,
1129    Dwarf_Half*     /*extension_size*/,
1130    Dwarf_Unsigned* /*next_cu_header_offset*/,
1131    Dwarf_Error*    /*error*/);
1132/* The following is now obsolete, though supported. November 2009. */
1133int dwarf_next_cu_header(Dwarf_Debug /*dbg*/,
1134    Dwarf_Unsigned* /*cu_header_length*/,
1135    Dwarf_Half*     /*version_stamp*/,
1136    Dwarf_Off*      /*abbrev_offset*/,
1137    Dwarf_Half*     /*address_size*/,
1138    Dwarf_Unsigned* /*next_cu_header_offset*/,
1139    Dwarf_Error*    /*error*/);
1140
1141int dwarf_siblingof(Dwarf_Debug /*dbg*/,
1142    Dwarf_Die        /*die*/,
1143    Dwarf_Die*       /*return_siblingdie*/,
1144    Dwarf_Error*     /*error*/);
1145
1146int dwarf_child(Dwarf_Die /*die*/,
1147    Dwarf_Die*       /*return_childdie*/,
1148    Dwarf_Error*     /*error*/);
1149
1150/* Finding die given global (not CU-relative) offset */
1151int dwarf_offdie(Dwarf_Debug /*dbg*/,
1152    Dwarf_Off        /*offset*/,
1153    Dwarf_Die*       /*return_die*/,
1154    Dwarf_Error*     /*error*/);
1155
1156/* Higher level functions (Unimplemented) */
1157int dwarf_pcfile(Dwarf_Debug /*dbg*/,
1158    Dwarf_Addr       /*pc*/,
1159    Dwarf_Die*       /*return_die*/,
1160    Dwarf_Error*     /*error*/);
1161
1162/* Unimplemented */
1163int dwarf_pcsubr(Dwarf_Debug /*dbg*/,
1164    Dwarf_Addr       /*pc*/,
1165    Dwarf_Die*       /*return_die*/,
1166    Dwarf_Error*     /*error*/);
1167
1168/* Unimplemented */
1169int dwarf_pcscope(Dwarf_Debug /*dbg*/,
1170    Dwarf_Addr       /*pc*/,
1171    Dwarf_Die*       /*return_die*/,
1172    Dwarf_Error*     /*error*/);
1173
1174/* operations on DIEs */
1175int dwarf_tag(Dwarf_Die /*die*/,
1176    Dwarf_Half*      /*return_tag*/,
1177    Dwarf_Error*     /*error*/);
1178
1179/* utility? */
1180/* dwarf_dieoffset returns the global debug_info
1181   section offset, not the CU relative offset. */
1182int dwarf_dieoffset(Dwarf_Die /*die*/,
1183    Dwarf_Off*       /*return_offset*/,
1184    Dwarf_Error*     /*error*/);
1185
1186/* dwarf_CU_dieoffset_given_die returns
1187   the global debug_info section offset of the CU die
1188   that is the CU containing the given_die
1189   (the passed in DIE can be any DIE).
1190   This information makes it possible for a consumer to
1191   find and print CU context information for any die.
1192   See also dwarf_get_cu_die_offset_given_cu_header_offset(). */
1193int dwarf_CU_dieoffset_given_die(Dwarf_Die /*given_die*/,
1194    Dwarf_Off*       /*return_offset*/,
1195    Dwarf_Error*     /*error*/);
1196
1197/* dwarf_die_CU_offset returns the CU relative offset
1198   not the global debug_info section offset, given
1199   any DIE in the CU.  See also dwarf_CU_dieoffset_given_die().
1200   */
1201int dwarf_die_CU_offset(Dwarf_Die /*die*/,
1202    Dwarf_Off*       /*return_offset*/,
1203    Dwarf_Error*     /*error*/);
1204
1205int dwarf_die_CU_offset_range(Dwarf_Die /*die*/,
1206    Dwarf_Off*       /*return_CU_header_offset*/,
1207    Dwarf_Off*       /*return_CU_length_bytes*/,
1208    Dwarf_Error*     /*error*/);
1209
1210int dwarf_attr (Dwarf_Die /*die*/,
1211    Dwarf_Half        /*attr*/,
1212    Dwarf_Attribute * /*returned_attr*/,
1213    Dwarf_Error*      /*error*/);
1214
1215int dwarf_diename(Dwarf_Die /*die*/,
1216    char   **        /*diename*/,
1217    Dwarf_Error*     /*error*/);
1218
1219/* Returns the  abbrev code of the die. Cannot fail. */
1220int dwarf_die_abbrev_code(Dwarf_Die /*die */);
1221
1222
1223/* convenience functions, alternative to using dwarf_attrlist() */
1224int dwarf_hasattr(Dwarf_Die /*die*/,
1225    Dwarf_Half       /*attr*/,
1226    Dwarf_Bool *     /*returned_bool*/,
1227    Dwarf_Error*     /*error*/);
1228
1229/* dwarf_loclist_n preferred over dwarf_loclist */
1230int dwarf_loclist_n(Dwarf_Attribute /*attr*/,
1231    Dwarf_Locdesc*** /*llbuf*/,
1232    Dwarf_Signed *   /*locCount*/,
1233    Dwarf_Error*     /*error*/);
1234
1235int dwarf_loclist(Dwarf_Attribute /*attr*/,  /* inflexible! */
1236    Dwarf_Locdesc**  /*llbuf*/,
1237    Dwarf_Signed *   /*locCount*/,
1238    Dwarf_Error*     /*error*/);
1239
1240/* Extracts a dwarf expression from an expression byte stream.
1241   Useful to get expressions from DW_CFA_def_cfa_expression
1242   DW_CFA_expression DW_CFA_val_expression expression bytes.
1243   27 April 2009: dwarf_loclist_from_expr() interface with
1244   no addr_size is obsolete but supported,
1245   use dwarf_loclist_from_expr_a() instead.
1246*/
1247int dwarf_loclist_from_expr(Dwarf_Debug dbg,
1248    Dwarf_Ptr expression_in,
1249    Dwarf_Unsigned expression_length,
1250    Dwarf_Locdesc ** llbuf,
1251    Dwarf_Signed * listlen, Dwarf_Error * error);
1252
1253/* dwarf_loclist_from_expr_a() new 27 Apr 2009: added addr_size argument. */
1254int dwarf_loclist_from_expr_a(Dwarf_Debug dbg,
1255    Dwarf_Ptr expression_in,
1256    Dwarf_Unsigned expression_length,
1257    Dwarf_Half addr_size,
1258    Dwarf_Locdesc ** llbuf,
1259    Dwarf_Signed * listlen, Dwarf_Error * error);
1260
1261/* Unimplemented */
1262int dwarf_stringlen(Dwarf_Die /*die*/,
1263    Dwarf_Locdesc ** /*returned_locdesc*/,
1264    Dwarf_Error*     /*error*/);
1265
1266/* Unimplemented */
1267int dwarf_subscrcnt(Dwarf_Die /*die*/,
1268    Dwarf_Signed *   /*returned_count*/,
1269    Dwarf_Error*     /*error*/);
1270
1271/* Unimplemented */
1272int dwarf_nthsubscr(Dwarf_Die /*die*/,
1273    Dwarf_Unsigned   /*ssndx*/,
1274    Dwarf_Die *      /*returned_die*/,
1275    Dwarf_Error*     /*error*/);
1276
1277int dwarf_lowpc(Dwarf_Die /*die*/,
1278    Dwarf_Addr  *    /*returned_addr*/,
1279    Dwarf_Error*     /*error*/);
1280
1281int dwarf_highpc(Dwarf_Die /*die*/,
1282    Dwarf_Addr  *    /*returned_addr*/,
1283    Dwarf_Error*     /*error*/);
1284
1285int dwarf_bytesize(Dwarf_Die /*die*/,
1286    Dwarf_Unsigned * /*returned_size*/,
1287    Dwarf_Error*     /*error*/);
1288
1289/* Unimplemented */
1290int dwarf_isbitfield(Dwarf_Die /*die*/,
1291    Dwarf_Bool  *    /*returned_bool*/,
1292    Dwarf_Error*     /*error*/);
1293
1294int dwarf_bitsize(Dwarf_Die /*die*/,
1295    Dwarf_Unsigned * /*returned_size*/,
1296    Dwarf_Error*     /*error*/);
1297
1298int dwarf_bitoffset(Dwarf_Die /*die*/,
1299    Dwarf_Unsigned * /*returned_offset*/,
1300    Dwarf_Error*     /*error*/);
1301
1302int dwarf_srclang(Dwarf_Die /*die*/,
1303    Dwarf_Unsigned * /*returned_lang*/,
1304    Dwarf_Error*     /*error*/);
1305
1306int dwarf_arrayorder(Dwarf_Die /*die*/,
1307    Dwarf_Unsigned * /*returned_order*/,
1308    Dwarf_Error*     /*error*/);
1309
1310/* end of convenience function list */
1311
1312/* this is the main interface to attributes of a DIE */
1313int dwarf_attrlist(Dwarf_Die /*die*/,
1314    Dwarf_Attribute** /*attrbuf*/,
1315    Dwarf_Signed   * /*attrcount*/,
1316    Dwarf_Error*     /*error*/);
1317
1318/* query operations for attributes */
1319int dwarf_hasform(Dwarf_Attribute /*attr*/,
1320    Dwarf_Half       /*form*/,
1321    Dwarf_Bool *     /*returned_bool*/,
1322    Dwarf_Error*     /*error*/);
1323
1324int dwarf_whatform(Dwarf_Attribute /*attr*/,
1325    Dwarf_Half *     /*returned_form*/,
1326    Dwarf_Error*     /*error*/);
1327
1328int dwarf_whatform_direct(Dwarf_Attribute /*attr*/,
1329    Dwarf_Half *     /*returned_form*/,
1330    Dwarf_Error*     /*error*/);
1331
1332int dwarf_whatattr(Dwarf_Attribute /*attr*/,
1333    Dwarf_Half *     /*returned_attr_num*/,
1334    Dwarf_Error*     /*error*/);
1335
1336/*
1337    The following are concerned with the Primary Interface: getting
1338    the actual data values. One function per 'kind' of FORM.
1339*/
1340/*  dwarf_formref returns, thru return_offset, a CU-relative offset
1341    and does not allow DW_FORM_ref_addr*/
1342int dwarf_formref(Dwarf_Attribute /*attr*/,
1343    Dwarf_Off*       /*return_offset*/,
1344    Dwarf_Error*     /*error*/);
1345/*  dwarf_global_formref returns, thru return_offset,
1346    a debug_info-relative offset and does allow all reference forms*/
1347int dwarf_global_formref(Dwarf_Attribute /*attr*/,
1348    Dwarf_Off*       /*return_offset*/,
1349    Dwarf_Error*     /*error*/);
1350
1351/*  dwarf_formsig8 returns in the caller-provided 8 byte area
1352    the 8 bytes of a DW_FORM_ref_sig8.  Not a string.  */
1353int dwarf_formsig8(Dwarf_Attribute /*attr*/,
1354    Dwarf_Sig8 * /*returned sig bytes*/,
1355    Dwarf_Error*     /*error*/);
1356
1357int dwarf_formaddr(Dwarf_Attribute /*attr*/,
1358    Dwarf_Addr   *   /*returned_addr*/,
1359    Dwarf_Error*     /*error*/);
1360
1361int dwarf_formflag(Dwarf_Attribute /*attr*/,
1362    Dwarf_Bool *     /*returned_bool*/,
1363    Dwarf_Error*     /*error*/);
1364
1365int dwarf_formudata(Dwarf_Attribute /*attr*/,
1366    Dwarf_Unsigned  * /*returned_val*/,
1367    Dwarf_Error*     /*error*/);
1368
1369int dwarf_formsdata(Dwarf_Attribute     /*attr*/,
1370    Dwarf_Signed  *  /*returned_val*/,
1371    Dwarf_Error*     /*error*/);
1372
1373int dwarf_formblock(Dwarf_Attribute /*attr*/,
1374    Dwarf_Block    ** /*returned_block*/,
1375    Dwarf_Error*     /*error*/);
1376
1377int dwarf_formstring(Dwarf_Attribute /*attr*/,
1378    char   **        /*returned_string*/,
1379    Dwarf_Error*     /*error*/);
1380
1381int dwarf_formexprloc(Dwarf_Attribute /*attr*/,
1382    Dwarf_Unsigned * /*return_exprlen*/,
1383    Dwarf_Ptr  * /*block_ptr*/,
1384    Dwarf_Error * /*error*/);
1385
1386
1387/* end attribute query operations. */
1388
1389/* line number operations */
1390/* dwarf_srclines  is the normal interface */
1391int dwarf_srclines(Dwarf_Die /*die*/,
1392    Dwarf_Line**     /*linebuf*/,
1393    Dwarf_Signed *   /*linecount*/,
1394    Dwarf_Error*     /*error*/);
1395
1396/* dwarf_srclines_dealloc, created July 2005, is the new
1397   method for deallocating what dwarf_srclines returns.
1398   More complete free than using dwarf_dealloc directly. */
1399void dwarf_srclines_dealloc(Dwarf_Debug /*dbg*/,
1400    Dwarf_Line*       /*linebuf*/,
1401    Dwarf_Signed      /*count */);
1402
1403
1404int dwarf_srcfiles(Dwarf_Die /*die*/,
1405    char***          /*srcfiles*/,
1406    Dwarf_Signed *   /*filecount*/,
1407    Dwarf_Error*     /*error*/);
1408
1409/* Unimplemented. */
1410int dwarf_dieline(Dwarf_Die /*die*/,
1411    Dwarf_Line  *    /*returned_line*/,
1412    Dwarf_Error *    /*error*/);
1413
1414int dwarf_linebeginstatement(Dwarf_Line /*line*/,
1415    Dwarf_Bool  *    /*returned_bool*/,
1416    Dwarf_Error*     /*error*/);
1417
1418int dwarf_lineendsequence(Dwarf_Line /*line*/,
1419    Dwarf_Bool  *    /*returned_bool*/,
1420    Dwarf_Error*     /*error*/);
1421
1422int dwarf_lineno(Dwarf_Line /*line*/,
1423    Dwarf_Unsigned * /*returned_lineno*/,
1424    Dwarf_Error*     /*error*/);
1425
1426int dwarf_line_srcfileno(Dwarf_Line /*line*/,
1427    Dwarf_Unsigned * /*ret_fileno*/,
1428    Dwarf_Error *    /*error*/);
1429
1430int dwarf_lineaddr(Dwarf_Line /*line*/,
1431    Dwarf_Addr *     /*returned_addr*/,
1432    Dwarf_Error*     /*error*/);
1433
1434int dwarf_lineoff(Dwarf_Line /*line*/,
1435    Dwarf_Signed  *  /*returned_lineoffset*/,
1436    Dwarf_Error*     /*error*/);
1437
1438int dwarf_linesrc(Dwarf_Line /*line*/,
1439    char   **        /*returned_name*/,
1440    Dwarf_Error*     /*error*/);
1441
1442int dwarf_lineblock(Dwarf_Line /*line*/,
1443    Dwarf_Bool  *    /*returned_bool*/,
1444    Dwarf_Error*     /*error*/);
1445
1446/* tertiary interface to line info */
1447/* Unimplemented */
1448int dwarf_pclines(Dwarf_Debug /*dbg*/,
1449    Dwarf_Addr       /*pc*/,
1450    Dwarf_Line**     /*linebuf*/,
1451    Dwarf_Signed *   /*linecount*/,
1452    Dwarf_Signed     /*slide*/,
1453    Dwarf_Error*     /*error*/);
1454/* end line number operations */
1455
1456/* global name space operations (.debug_pubnames access) */
1457int dwarf_get_globals(Dwarf_Debug /*dbg*/,
1458    Dwarf_Global**   /*globals*/,
1459    Dwarf_Signed *   /*number_of_globals*/,
1460    Dwarf_Error*     /*error*/);
1461void dwarf_globals_dealloc(Dwarf_Debug /*dbg*/,
1462    Dwarf_Global*    /*globals*/,
1463    Dwarf_Signed     /*number_of_globals*/);
1464
1465int dwarf_globname(Dwarf_Global /*glob*/,
1466    char   **        /*returned_name*/,
1467    Dwarf_Error*     /*error*/);
1468
1469int dwarf_global_die_offset(Dwarf_Global /*global*/,
1470    Dwarf_Off*       /*return_offset*/,
1471    Dwarf_Error *    /*error*/);
1472
1473/* This returns the CU die global offset if one knows the
1474   CU header global offset.
1475   See also dwarf_CU_dieoffset_given_die(). */
1476int dwarf_get_cu_die_offset_given_cu_header_offset(
1477    Dwarf_Debug      /*dbg*/,
1478    Dwarf_Off        /*in_cu_header_offset*/,
1479    Dwarf_Off *  /*out_cu_die_offset*/,
1480    Dwarf_Error *    /*err*/);
1481#ifdef __sgi /* pragma is sgi MIPS only */
1482#pragma optional dwarf_get_cu_die_offset_given_cu_header_offset
1483#endif
1484
1485int dwarf_global_cu_offset(Dwarf_Global /*global*/,
1486    Dwarf_Off*       /*return_offset*/,
1487    Dwarf_Error*     /*error*/);
1488
1489int dwarf_global_name_offsets(Dwarf_Global /*global*/,
1490    char   **        /*returned_name*/,
1491    Dwarf_Off*       /*die_offset*/,
1492    Dwarf_Off*       /*cu_offset*/,
1493    Dwarf_Error*     /*error*/);
1494
1495/* Static function name operations.  */
1496int dwarf_get_funcs(Dwarf_Debug    /*dbg*/,
1497    Dwarf_Func**     /*funcs*/,
1498    Dwarf_Signed *   /*number_of_funcs*/,
1499    Dwarf_Error*     /*error*/);
1500void dwarf_funcs_dealloc(Dwarf_Debug /*dbg*/,
1501    Dwarf_Func*      /*funcs*/,
1502    Dwarf_Signed     /*number_of_funcs*/);
1503
1504int dwarf_funcname(Dwarf_Func /*func*/,
1505    char   **        /*returned_name*/,
1506    Dwarf_Error*     /*error*/);
1507
1508int dwarf_func_die_offset(Dwarf_Func /*func*/,
1509    Dwarf_Off*       /*return_offset*/,
1510    Dwarf_Error*     /*error*/);
1511
1512int dwarf_func_cu_offset(Dwarf_Func /*func*/,
1513    Dwarf_Off*       /*return_offset*/,
1514    Dwarf_Error*     /*error*/);
1515
1516int dwarf_func_name_offsets(Dwarf_Func /*func*/,
1517    char   **        /*returned_name*/,
1518    Dwarf_Off*       /*die_offset*/,
1519    Dwarf_Off*       /*cu_offset*/,
1520    Dwarf_Error*     /*error*/);
1521
1522/* User-defined type name operations, SGI IRIX .debug_typenames section.
1523   Same content as DWARF3 .debug_pubtypes, but defined years before
1524   .debug_pubtypes was defined.   SGI IRIX only. */
1525int dwarf_get_types(Dwarf_Debug    /*dbg*/,
1526    Dwarf_Type**     /*types*/,
1527    Dwarf_Signed *   /*number_of_types*/,
1528    Dwarf_Error*     /*error*/);
1529void dwarf_types_dealloc(Dwarf_Debug /*dbg*/,
1530    Dwarf_Type*      /*types*/,
1531    Dwarf_Signed     /*number_of_types*/);
1532
1533
1534int dwarf_typename(Dwarf_Type /*type*/,
1535    char   **        /*returned_name*/,
1536    Dwarf_Error*     /*error*/);
1537
1538int dwarf_type_die_offset(Dwarf_Type /*type*/,
1539    Dwarf_Off*       /*return_offset*/,
1540    Dwarf_Error*     /*error*/);
1541
1542int dwarf_type_cu_offset(Dwarf_Type /*type*/,
1543    Dwarf_Off*       /*return_offset*/,
1544    Dwarf_Error*     /*error*/);
1545
1546int dwarf_type_name_offsets(Dwarf_Type    /*type*/,
1547    char   **        /*returned_name*/,
1548    Dwarf_Off*       /*die_offset*/,
1549    Dwarf_Off*       /*cu_offset*/,
1550    Dwarf_Error*     /*error*/);
1551
1552/* User-defined type name operations, DWARF3  .debug_pubtypes section.
1553*/
1554int dwarf_get_pubtypes(Dwarf_Debug    /*dbg*/,
1555    Dwarf_Type**     /*types*/,
1556    Dwarf_Signed *   /*number_of_types*/,
1557    Dwarf_Error*     /*error*/);
1558void dwarf_pubtypes_dealloc(Dwarf_Debug /*dbg*/,
1559    Dwarf_Type*      /*pubtypes*/,
1560    Dwarf_Signed     /*number_of_pubtypes*/);
1561
1562
1563int dwarf_pubtypename(Dwarf_Type /*type*/,
1564    char   **        /*returned_name*/,
1565    Dwarf_Error*     /*error*/);
1566
1567int dwarf_pubtype_die_offset(Dwarf_Type /*type*/,
1568    Dwarf_Off*       /*return_offset*/,
1569    Dwarf_Error*     /*error*/);
1570
1571int dwarf_pubtype_cu_offset(Dwarf_Type /*type*/,
1572    Dwarf_Off*       /*return_offset*/,
1573    Dwarf_Error*     /*error*/);
1574
1575int dwarf_pubtype_name_offsets(Dwarf_Type    /*type*/,
1576    char   **        /*returned_name*/,
1577    Dwarf_Off*       /*die_offset*/,
1578    Dwarf_Off*       /*cu_offset*/,
1579    Dwarf_Error*     /*error*/);
1580
1581/* File-scope static variable name operations.  */
1582int dwarf_get_vars(Dwarf_Debug    /*dbg*/,
1583    Dwarf_Var**      /*vars*/,
1584    Dwarf_Signed *   /*number_of_vars*/,
1585    Dwarf_Error*     /*error*/);
1586void dwarf_vars_dealloc(Dwarf_Debug /*dbg*/,
1587    Dwarf_Var*       /*vars*/,
1588    Dwarf_Signed     /*number_of_vars*/);
1589
1590
1591int dwarf_varname(Dwarf_Var /*var*/,
1592    char   **        /*returned_name*/,
1593    Dwarf_Error*     /*error*/);
1594
1595int dwarf_var_die_offset(Dwarf_Var /*var*/,
1596    Dwarf_Off*       /*return_offset*/,
1597    Dwarf_Error*     /*error*/);
1598
1599int dwarf_var_cu_offset(Dwarf_Var /*var*/,
1600    Dwarf_Off*       /*return_offset*/,
1601    Dwarf_Error*     /*error*/);
1602
1603int dwarf_var_name_offsets(Dwarf_Var /*var*/,
1604    char   **        /*returned_name*/,
1605    Dwarf_Off*       /*die_offset*/,
1606    Dwarf_Off*       /*cu_offset*/,
1607    Dwarf_Error*     /*error*/);
1608
1609/* weak name operations.  */
1610int dwarf_get_weaks(Dwarf_Debug    /*dbg*/,
1611    Dwarf_Weak**     /*weaks*/,
1612    Dwarf_Signed *   /*number_of_weaks*/,
1613    Dwarf_Error*     /*error*/);
1614void dwarf_weaks_dealloc(Dwarf_Debug /*dbg*/,
1615    Dwarf_Weak*      /*weaks*/,
1616    Dwarf_Signed     /*number_of_weaks*/);
1617
1618
1619int dwarf_weakname(Dwarf_Weak /*weak*/,
1620    char   **        /*returned_name*/,
1621    Dwarf_Error*     /*error*/);
1622
1623int dwarf_weak_die_offset(Dwarf_Weak /*weak*/,
1624    Dwarf_Off*       /*return_offset*/,
1625    Dwarf_Error*     /*error*/);
1626
1627int dwarf_weak_cu_offset(Dwarf_Weak /*weak*/,
1628    Dwarf_Off*       /*return_offset*/,
1629    Dwarf_Error*     /*error*/);
1630
1631int dwarf_weak_name_offsets(Dwarf_Weak    /*weak*/,
1632    char   **        /*returned_name*/,
1633    Dwarf_Off*       /*die_offset*/,
1634    Dwarf_Off*       /*cu_offset*/,
1635    Dwarf_Error*     /*error*/);
1636
1637/* location list section operation.  (.debug_loc access) */
1638int dwarf_get_loclist_entry(Dwarf_Debug /*dbg*/,
1639    Dwarf_Unsigned   /*offset*/,
1640    Dwarf_Addr*      /*hipc*/,
1641    Dwarf_Addr*      /*lopc*/,
1642    Dwarf_Ptr*       /*data*/,
1643    Dwarf_Unsigned*  /*entry_len*/,
1644    Dwarf_Unsigned*  /*next_entry*/,
1645    Dwarf_Error*     /*error*/);
1646
1647/* abbreviation section operations */
1648int dwarf_get_abbrev(Dwarf_Debug /*dbg*/,
1649    Dwarf_Unsigned   /*offset*/,
1650    Dwarf_Abbrev  *  /*returned_abbrev*/,
1651    Dwarf_Unsigned*  /*length*/,
1652    Dwarf_Unsigned*  /*attr_count*/,
1653    Dwarf_Error*     /*error*/);
1654
1655int dwarf_get_abbrev_tag(Dwarf_Abbrev /*abbrev*/,
1656    Dwarf_Half*      /*return_tag_number*/,
1657    Dwarf_Error*     /*error*/);
1658int dwarf_get_abbrev_code(Dwarf_Abbrev /*abbrev*/,
1659    Dwarf_Unsigned*  /*return_code_number*/,
1660    Dwarf_Error*     /*error*/);
1661
1662int dwarf_get_abbrev_children_flag(Dwarf_Abbrev /*abbrev*/,
1663    Dwarf_Signed*    /*return_flag*/,
1664    Dwarf_Error*     /*error*/);
1665
1666int dwarf_get_abbrev_entry(Dwarf_Abbrev /*abbrev*/,
1667    Dwarf_Signed     /*index*/,
1668    Dwarf_Half  *    /*returned_attr_num*/,
1669    Dwarf_Signed*    /*form*/,
1670    Dwarf_Off*       /*offset*/,
1671    Dwarf_Error*     /*error*/);
1672
1673/* consumer string section operation */
1674int dwarf_get_str(Dwarf_Debug /*dbg*/,
1675    Dwarf_Off        /*offset*/,
1676    char**           /*string*/,
1677    Dwarf_Signed *   /*strlen_of_string*/,
1678    Dwarf_Error*     /*error*/);
1679
1680/* Consumer op on  gnu .eh_frame info */
1681int dwarf_get_fde_list_eh(
1682    Dwarf_Debug      /*dbg*/,
1683    Dwarf_Cie**      /*cie_data*/,
1684    Dwarf_Signed*    /*cie_element_count*/,
1685    Dwarf_Fde**      /*fde_data*/,
1686    Dwarf_Signed*    /*fde_element_count*/,
1687    Dwarf_Error*     /*error*/);
1688
1689
1690/* consumer operations on frame info: .debug_frame */
1691int dwarf_get_fde_list(Dwarf_Debug /*dbg*/,
1692    Dwarf_Cie**      /*cie_data*/,
1693    Dwarf_Signed*    /*cie_element_count*/,
1694    Dwarf_Fde**      /*fde_data*/,
1695    Dwarf_Signed*    /*fde_element_count*/,
1696    Dwarf_Error*     /*error*/);
1697
1698/* Release storage gotten by dwarf_get_fde_list_eh() or
1699   dwarf_get_fde_list() */
1700void dwarf_fde_cie_list_dealloc(Dwarf_Debug dbg,
1701    Dwarf_Cie *cie_data,
1702    Dwarf_Signed cie_element_count,
1703    Dwarf_Fde *fde_data,
1704    Dwarf_Signed fde_element_count);
1705
1706
1707
1708int dwarf_get_fde_range(Dwarf_Fde /*fde*/,
1709    Dwarf_Addr*      /*low_pc*/,
1710    Dwarf_Unsigned*  /*func_length*/,
1711    Dwarf_Ptr*       /*fde_bytes*/,
1712    Dwarf_Unsigned*  /*fde_byte_length*/,
1713    Dwarf_Off*       /*cie_offset*/,
1714    Dwarf_Signed*    /*cie_index*/,
1715    Dwarf_Off*       /*fde_offset*/,
1716    Dwarf_Error*     /*error*/);
1717
1718/*  Useful for IRIX only:  see dwarf_get_cie_augmentation_data()
1719       dwarf_get_fde_augmentation_data() for GNU .eh_frame. */
1720int dwarf_get_fde_exception_info(Dwarf_Fde /*fde*/,
1721    Dwarf_Signed*    /* offset_into_exception_tables */,
1722    Dwarf_Error*     /*error*/);
1723
1724
1725int dwarf_get_cie_of_fde(Dwarf_Fde /*fde*/,
1726    Dwarf_Cie *      /*cie_returned*/,
1727    Dwarf_Error*     /*error*/);
1728
1729int dwarf_get_cie_info(Dwarf_Cie /*cie*/,
1730    Dwarf_Unsigned * /*bytes_in_cie*/,
1731    Dwarf_Small*     /*version*/,
1732    char        **   /*augmenter*/,
1733    Dwarf_Unsigned*  /*code_alignment_factor*/,
1734    Dwarf_Signed*    /*data_alignment_factor*/,
1735    Dwarf_Half*      /*return_address_register_rule*/,
1736    Dwarf_Ptr*       /*initial_instructions*/,
1737    Dwarf_Unsigned*  /*initial_instructions_length*/,
1738    Dwarf_Error*     /*error*/);
1739
1740/* dwarf_get_cie_index new September 2009. */
1741int dwarf_get_cie_index(
1742    Dwarf_Cie /*cie*/,
1743    Dwarf_Signed* /*index*/,
1744    Dwarf_Error* /*error*/ );
1745
1746
1747int dwarf_get_fde_instr_bytes(Dwarf_Fde /*fde*/,
1748    Dwarf_Ptr *      /*outinstrs*/, Dwarf_Unsigned * /*outlen*/,
1749    Dwarf_Error *    /*error*/);
1750
1751int dwarf_get_fde_info_for_all_regs(Dwarf_Fde /*fde*/,
1752    Dwarf_Addr       /*pc_requested*/,
1753    Dwarf_Regtable*  /*reg_table*/,
1754    Dwarf_Addr*      /*row_pc*/,
1755    Dwarf_Error*     /*error*/);
1756
1757int dwarf_get_fde_info_for_all_regs3(Dwarf_Fde /*fde*/,
1758    Dwarf_Addr       /*pc_requested*/,
1759    Dwarf_Regtable3* /*reg_table*/,
1760    Dwarf_Addr*      /*row_pc*/,
1761    Dwarf_Error*     /*error*/);
1762
1763/* In this older interface DW_FRAME_CFA_COL is a meaningful
1764    column (which does not work well with DWARF3 or
1765    non-MIPS architectures). */
1766int dwarf_get_fde_info_for_reg(Dwarf_Fde /*fde*/,
1767    Dwarf_Half       /*table_column*/,
1768    Dwarf_Addr       /*pc_requested*/,
1769    Dwarf_Signed*    /*offset_relevant*/,
1770    Dwarf_Signed*    /*register*/,
1771    Dwarf_Signed*    /*offset*/,
1772    Dwarf_Addr*      /*row_pc*/,
1773    Dwarf_Error*     /*error*/);
1774
1775/* See discussion of dw_value_type, libdwarf.h.
1776   Use of DW_FRAME_CFA_COL is not meaningful in this interface.
1777   See dwarf_get_fde_info_for_cfa_reg3().
1778*/
1779/* dwarf_get_fde_info_for_reg3 is useful on a single column, but
1780   it is inefficient to iterate across all table_columns using this
1781   function.  Instead call dwarf_get_fde_info_for_all_regs3() and index
1782   into the table it fills in. */
1783int dwarf_get_fde_info_for_reg3(Dwarf_Fde /*fde*/,
1784    Dwarf_Half       /*table_column*/,
1785    Dwarf_Addr       /*pc_requested*/,
1786    Dwarf_Small  *   /*value_type*/,
1787    Dwarf_Signed *   /*offset_relevant*/,
1788    Dwarf_Signed*    /*register*/,
1789    Dwarf_Signed*    /*offset_or_block_len*/,
1790    Dwarf_Ptr   *    /*block_ptr */,
1791    Dwarf_Addr*      /*row_pc_out*/,
1792    Dwarf_Error*     /*error*/);
1793
1794/* Use this to get the cfa. */
1795int dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde /*fde*/,
1796    Dwarf_Addr       /*pc_requested*/,
1797    Dwarf_Small  *   /*value_type*/,
1798    Dwarf_Signed *   /*offset_relevant*/,
1799    Dwarf_Signed*    /*register*/,
1800    Dwarf_Signed*    /*offset_or_block_len*/,
1801    Dwarf_Ptr   *    /*block_ptr */,
1802    Dwarf_Addr*      /*row_pc_out*/,
1803    Dwarf_Error*     /*error*/);
1804
1805int dwarf_get_fde_for_die(Dwarf_Debug /*dbg*/,
1806    Dwarf_Die        /*subr_die */,
1807    Dwarf_Fde  *     /*returned_fde*/,
1808    Dwarf_Error*     /*error*/);
1809
1810int dwarf_get_fde_n(Dwarf_Fde* /*fde_data*/,
1811    Dwarf_Unsigned   /*fde_index*/,
1812    Dwarf_Fde  *     /*returned_fde*/,
1813    Dwarf_Error*     /*error*/);
1814
1815int dwarf_get_fde_at_pc(Dwarf_Fde* /*fde_data*/,
1816    Dwarf_Addr       /*pc_of_interest*/,
1817    Dwarf_Fde  *     /*returned_fde*/,
1818    Dwarf_Addr*      /*lopc*/,
1819    Dwarf_Addr*      /*hipc*/,
1820    Dwarf_Error*     /*error*/);
1821
1822/* GNU .eh_frame augmentation information, raw form, see
1823   Linux Standard Base Core Specification version 3.0 . */
1824int dwarf_get_cie_augmentation_data(Dwarf_Cie /* cie*/,
1825    Dwarf_Small **   /* augdata */,
1826    Dwarf_Unsigned * /* augdata_len */,
1827    Dwarf_Error*     /*error*/);
1828/* GNU .eh_frame augmentation information, raw form, see
1829   Linux Standard Base Core Specification version 3.0 . */
1830int dwarf_get_fde_augmentation_data(Dwarf_Fde /* fde*/,
1831    Dwarf_Small **   /* augdata */,
1832    Dwarf_Unsigned * /* augdata_len */,
1833    Dwarf_Error*     /*error*/);
1834
1835int dwarf_expand_frame_instructions(Dwarf_Cie /*cie*/,
1836    Dwarf_Ptr        /*instruction*/,
1837    Dwarf_Unsigned   /*i_length*/,
1838    Dwarf_Frame_Op** /*returned_op_list*/,
1839    Dwarf_Signed*    /*op_count*/,
1840    Dwarf_Error*     /*error*/);
1841
1842/* Operations on .debug_aranges. */
1843int dwarf_get_aranges(Dwarf_Debug /*dbg*/,
1844    Dwarf_Arange**   /*aranges*/,
1845    Dwarf_Signed *   /*arange_count*/,
1846    Dwarf_Error*     /*error*/);
1847
1848
1849
1850int dwarf_get_arange(
1851    Dwarf_Arange*    /*aranges*/,
1852    Dwarf_Unsigned   /*arange_count*/,
1853    Dwarf_Addr       /*address*/,
1854    Dwarf_Arange *   /*returned_arange*/,
1855    Dwarf_Error*     /*error*/);
1856
1857int dwarf_get_cu_die_offset(
1858    Dwarf_Arange     /*arange*/,
1859    Dwarf_Off*       /*return_offset*/,
1860    Dwarf_Error*     /*error*/);
1861
1862int dwarf_get_arange_cu_header_offset(
1863    Dwarf_Arange     /*arange*/,
1864    Dwarf_Off*       /*return_cu_header_offset*/,
1865    Dwarf_Error*     /*error*/);
1866#ifdef __sgi /* pragma is sgi MIPS only */
1867#pragma optional dwarf_get_arange_cu_header_offset
1868#endif
1869
1870/* DWARF2,3 interface. No longer really adequate (it was never
1871   right for segmented address spaces, please switch
1872   to using dwarf_get_arange_info_b instead.
1873   There is no effective difference between these
1874   functions  if the address space
1875   of the target is not segmented.  */
1876int dwarf_get_arange_info(
1877    Dwarf_Arange     /*arange*/,
1878    Dwarf_Addr*      /*start*/,
1879    Dwarf_Unsigned*  /*length*/,
1880    Dwarf_Off*       /*cu_die_offset*/,
1881    Dwarf_Error*     /*error*/ );
1882
1883/* New for DWARF4, entries may have segment information.
1884   *segment is only meaningful if *segment_entry_size is non-zero. */
1885int dwarf_get_arange_info_b(
1886    Dwarf_Arange     /*arange*/,
1887    Dwarf_Unsigned*  /*segment*/,
1888    Dwarf_Unsigned*  /*segment_entry_size*/,
1889    Dwarf_Addr    *  /*start*/,
1890    Dwarf_Unsigned*  /*length*/,
1891    Dwarf_Off     *  /*cu_die_offset*/,
1892    Dwarf_Error   *  /*error*/ );
1893
1894
1895/* consumer .debug_macinfo information interface.
1896*/
1897struct Dwarf_Macro_Details_s {
1898    Dwarf_Off    dmd_offset; /* offset, in the section,
1899                              of this macro info */
1900    Dwarf_Small  dmd_type;   /* the type, DW_MACINFO_define etc*/
1901    Dwarf_Signed dmd_lineno; /* the source line number where
1902                              applicable and vend_def # if
1903                              vendor_extension op
1904                             */
1905
1906    Dwarf_Signed dmd_fileindex;/* the source file index:
1907                              applies to define undef start_file
1908                               */
1909    char *       dmd_macro;  /* macro name (with value for defineop)
1910                              string from vendor ext
1911                             */
1912};
1913
1914/* dwarf_print_lines is for use by dwarfdump: it prints
1915   line info to stdout.
1916   The _dwarf name is obsolete. Use dwarf_ instead.
1917   Added extra argnument 2/2009 for better checking.
1918*/
1919int _dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/);
1920int dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/,
1921   int * /*error_count_out */);
1922
1923/* dwarf_check_lineheader lets dwarfdump get detailed messages
1924   about some compiler errors we detect.
1925   We return the count of detected errors throught the
1926   pointer.
1927*/
1928void dwarf_check_lineheader(Dwarf_Die /*cu_die*/,int *errcount_out);
1929
1930/* dwarf_ld_sort_lines helps SGI IRIX ld
1931   rearrange lines in .debug_line in a .o created with a text
1932   section per function.
1933        -OPT:procedure_reorder=ON
1934   where ld-cord (cord(1)ing by ld,
1935   not by cord(1)) may have changed the function order.
1936   The _dwarf name is obsolete. Use dwarf_ instead.
1937*/
1938int _dwarf_ld_sort_lines(
1939    void *         /*orig_buffer*/,
1940    unsigned long  /* buffer_len*/,
1941    int            /*is_64_bit*/,
1942    int *          /*any_change*/,
1943    int *          /*err_code*/);
1944int dwarf_ld_sort_lines(
1945    void *         /*orig_buffer*/,
1946    unsigned long  /*buffer_len*/,
1947    int            /*is_64_bit*/,
1948    int *          /*any_change*/,
1949    int *          /*err_code*/);
1950
1951/* Used by dwarfdump -v to print fde offsets from debugging
1952   info.
1953   The _dwarf name is obsolete. Use dwarf_ instead.
1954*/
1955int _dwarf_fde_section_offset(Dwarf_Debug dbg,
1956    Dwarf_Fde         /*in_fde*/,
1957    Dwarf_Off *       /*fde_off*/,
1958    Dwarf_Off *       /*cie_off*/,
1959    Dwarf_Error *     /*err*/);
1960int dwarf_fde_section_offset(Dwarf_Debug dbg,
1961    Dwarf_Fde         /*in_fde*/,
1962    Dwarf_Off *       /*fde_off*/,
1963    Dwarf_Off *       /*cie_off*/,
1964    Dwarf_Error *     /*err*/);
1965
1966/* Used by dwarfdump -v to print cie offsets from debugging
1967   info.
1968   The _dwarf name is obsolete. Use dwarf_ instead.
1969*/
1970int dwarf_cie_section_offset(Dwarf_Debug /*dbg*/,
1971    Dwarf_Cie     /*in_cie*/,
1972    Dwarf_Off *   /*cie_off */,
1973    Dwarf_Error * /*err*/);
1974int _dwarf_cie_section_offset(Dwarf_Debug /*dbg*/,
1975    Dwarf_Cie     /*in_cie*/,
1976    Dwarf_Off *   /*cie_off*/,
1977    Dwarf_Error * /*err*/);
1978
1979typedef struct Dwarf_Macro_Details_s Dwarf_Macro_Details;
1980
1981int dwarf_get_macro(Dwarf_Debug /*dbg*/,
1982    char *        /*requested_macro_name*/,
1983    Dwarf_Addr    /*pc_of_request*/,
1984    char **       /*returned_macro_value*/,
1985    Dwarf_Error * /*error*/);
1986
1987int dwarf_get_all_defined_macros(Dwarf_Debug /*dbg*/,
1988    Dwarf_Addr     /*pc_of_request*/,
1989    Dwarf_Signed * /*returned_count*/,
1990    char ***       /*returned_pointers_to_macros*/,
1991    Dwarf_Error *  /*error*/);
1992
1993char *dwarf_find_macro_value_start(char * /*macro_string*/);
1994
1995int dwarf_get_macro_details(Dwarf_Debug /*dbg*/,
1996    Dwarf_Off            /*macro_offset*/,
1997    Dwarf_Unsigned       /*maximum_count*/,
1998    Dwarf_Signed         * /*entry_count*/,
1999    Dwarf_Macro_Details ** /*details*/,
2000    Dwarf_Error *        /*err*/);
2001
2002
2003int dwarf_get_address_size(Dwarf_Debug /*dbg*/,
2004    Dwarf_Half  *    /*addr_size*/,
2005    Dwarf_Error *    /*error*/);
2006int dwarf_get_die_address_size(Dwarf_Die /*die*/,
2007    Dwarf_Half  *    /*addr_size*/,
2008    Dwarf_Error *    /*error*/);
2009
2010/* The dwarf specification separates FORMs into
2011different classes.  To do the seperation properly
2012requires 4 pieces of data as of DWARF4 (thus the
2013function arguments listed here).
2014The DWARF4 specification class definition suffices to
2015describe all DWARF versions.
2016See section 7.5.4, Attribute Encodings.
2017A return of DW_FORM_CLASS_UNKNOWN means we could not properly figure
2018out what form-class it is.
2019
2020    DW_FORM_CLASS_FRAMEPTR is MIPS/IRIX only, and refers
2021    to the DW_AT_MIPS_fde attribute (a reference to the
2022    .debug_frame section).
2023*/
2024enum Dwarf_Form_Class {
2025    DW_FORM_CLASS_UNKNOWN,   DW_FORM_CLASS_ADDRESS,
2026    DW_FORM_CLASS_BLOCK,     DW_FORM_CLASS_CONSTANT,
2027    DW_FORM_CLASS_EXPRLOC,   DW_FORM_CLASS_FLAG,
2028    DW_FORM_CLASS_LINEPTR,   DW_FORM_CLASS_LOCLISTPTR,
2029    DW_FORM_CLASS_MACPTR,    DW_FORM_CLASS_RANGELISTPTR,
2030    DW_FORM_CLASS_REFERENCE, DW_FORM_CLASS_STRING,
2031    DW_FORM_CLASS_FRAMEPTR
2032};
2033
2034enum Dwarf_Form_Class dwarf_get_form_class(
2035    Dwarf_Half /* dwversion */,
2036    Dwarf_Half /* attrnum */,
2037    Dwarf_Half /*offset_size */,
2038    Dwarf_Half /*form*/);
2039
2040/* utility operations */
2041Dwarf_Unsigned dwarf_errno(Dwarf_Error     /*error*/);
2042
2043char* dwarf_errmsg(Dwarf_Error    /*error*/);
2044
2045/* stringcheck zero is default and means do all
2046** string length validity checks.
2047** Call with parameter value 1 to turn off many such checks (and
2048** increase performance).
2049** Call with zero for safest running.
2050** Actual value saved and returned is only 8 bits! Upper bits
2051** ignored by libdwarf (and zero on return).
2052** Returns previous value.
2053*/
2054int dwarf_set_stringcheck(int /*stringcheck*/);
2055
2056/* 'apply' defaults to 1 and means do all
2057 * 'rela' relocations on reading in a dwarf object section with
2058 * such relocations.
2059 * Call with parameter value 0 to turn off application of
2060 * such relocations.
2061 * Since the static linker leaves 'bogus' data in object sections
2062 * with a 'rela' relocation section such data cannot be read
2063 * sensibly without processing the relocations.  Such relocations
2064 * do not exist in executables and shared objects (.so), the
2065 * relocations only exist in plain .o relocatable object files.
2066 * Actual value saved and returned is only 8 bits! Upper bits
2067 * ignored by libdwarf (and zero on return).
2068 * Returns previous value.
2069 * */
2070int dwarf_set_reloc_application(int /*apply*/);
2071
2072
2073/* Unimplemented */
2074Dwarf_Handler dwarf_seterrhand(Dwarf_Debug /*dbg*/, Dwarf_Handler /*errhand*/);
2075
2076/* Unimplemented */
2077Dwarf_Ptr dwarf_seterrarg(Dwarf_Debug /*dbg*/, Dwarf_Ptr /*errarg*/);
2078
2079void dwarf_dealloc(Dwarf_Debug /*dbg*/, void* /*space*/,
2080    Dwarf_Unsigned /*type*/);
2081
2082/* DWARF Producer Interface */
2083
2084typedef int (*Dwarf_Callback_Func)(
2085    char*           /*name*/,
2086    int             /*size*/,
2087    Dwarf_Unsigned  /*type*/,
2088    Dwarf_Unsigned  /*flags*/,
2089    Dwarf_Unsigned  /*link*/,
2090    Dwarf_Unsigned  /*info*/,
2091    int*            /*sect name index*/,
2092    int*            /*error*/);
2093
2094Dwarf_P_Debug dwarf_producer_init(
2095    Dwarf_Unsigned  /*creation_flags*/,
2096    Dwarf_Callback_Func    /*func*/,
2097    Dwarf_Handler   /*errhand*/,
2098    Dwarf_Ptr       /*errarg*/,
2099    Dwarf_Error*    /*error*/);
2100
2101typedef int (*Dwarf_Callback_Func_b)(
2102    char*           /*name*/,
2103    int             /*size*/,
2104    Dwarf_Unsigned  /*type*/,
2105    Dwarf_Unsigned  /*flags*/,
2106    Dwarf_Unsigned  /*link*/,
2107    Dwarf_Unsigned  /*info*/,
2108    Dwarf_Unsigned* /*sect_name_index*/,
2109    int*            /*error*/);
2110
2111
2112Dwarf_P_Debug dwarf_producer_init_b(
2113    Dwarf_Unsigned        /*flags*/,
2114    Dwarf_Callback_Func_b /*func*/,
2115    Dwarf_Handler         /*errhand*/,
2116    Dwarf_Ptr             /*errarg*/,
2117    Dwarf_Error *         /*error*/);
2118
2119
2120Dwarf_Signed dwarf_transform_to_disk_form(Dwarf_P_Debug /*dbg*/,
2121    Dwarf_Error*     /*error*/);
2122
2123Dwarf_Ptr dwarf_get_section_bytes(Dwarf_P_Debug /*dbg*/,
2124    Dwarf_Signed     /*dwarf_section*/,
2125    Dwarf_Signed*    /*elf_section_index*/,
2126    Dwarf_Unsigned*  /*length*/,
2127    Dwarf_Error*     /*error*/);
2128
2129int  dwarf_get_relocation_info_count(
2130    Dwarf_P_Debug    /*dbg*/,
2131    Dwarf_Unsigned * /*count_of_relocation_sections*/,
2132    int *                /*drd_buffer_version*/,
2133    Dwarf_Error*     /*error*/);
2134
2135int dwarf_get_relocation_info(
2136    Dwarf_P_Debug           /*dbg*/,
2137    Dwarf_Signed          * /*elf_section_index*/,
2138    Dwarf_Signed          * /*elf_section_index_link*/,
2139    Dwarf_Unsigned        * /*relocation_buffer_count*/,
2140    Dwarf_Relocation_Data * /*reldata_buffer*/,
2141    Dwarf_Error*            /*error*/);
2142
2143/* v1:  no drd_length field, enum explicit */
2144/* v2:  has the drd_length field, enum value in uchar member */
2145#define DWARF_DRD_BUFFER_VERSION 2
2146
2147/* Markers are not written  to DWARF2/3/4, they are user
2148   defined and may be used for any purpose.
2149*/
2150Dwarf_Signed dwarf_get_die_markers(
2151    Dwarf_P_Debug     /*dbg*/,
2152    Dwarf_P_Marker *  /*marker_list*/,
2153    Dwarf_Unsigned *  /*marker_count*/,
2154    Dwarf_Error *     /*error*/);
2155
2156int dwarf_get_string_attributes_count(Dwarf_P_Debug,
2157    Dwarf_Unsigned *,
2158    int *,
2159    Dwarf_Error *);
2160
2161int dwarf_get_string_attributes_info(Dwarf_P_Debug,
2162    Dwarf_Signed *,
2163    Dwarf_Unsigned *,
2164    Dwarf_P_String_Attr *,
2165    Dwarf_Error *);
2166
2167void dwarf_reset_section_bytes(Dwarf_P_Debug /*dbg*/);
2168
2169Dwarf_Unsigned dwarf_producer_finish(Dwarf_P_Debug /*dbg*/,
2170    Dwarf_Error* /*error*/);
2171
2172/* Producer attribute addition functions. */
2173Dwarf_P_Attribute dwarf_add_AT_targ_address(Dwarf_P_Debug /*dbg*/,
2174    Dwarf_P_Die     /*ownerdie*/,
2175    Dwarf_Half      /*attr*/,
2176    Dwarf_Unsigned  /*pc_value*/,
2177    Dwarf_Signed    /*sym_index*/,
2178    Dwarf_Error*    /*error*/);
2179
2180Dwarf_P_Attribute dwarf_add_AT_block(Dwarf_P_Debug /*dbg*/,
2181    Dwarf_P_Die     /*ownerdie*/,
2182    Dwarf_Half      /*attr*/,
2183    Dwarf_Small*    /*block_data*/,
2184    Dwarf_Unsigned  /*block_len*/,
2185    Dwarf_Error*    /*error*/);
2186
2187Dwarf_P_Attribute dwarf_add_AT_targ_address_b(Dwarf_P_Debug /*dbg*/,
2188    Dwarf_P_Die     /*ownerdie*/,
2189    Dwarf_Half      /*attr*/,
2190    Dwarf_Unsigned  /*pc_value*/,
2191    Dwarf_Unsigned  /*sym_index*/,
2192    Dwarf_Error*    /*error*/);
2193
2194Dwarf_P_Attribute dwarf_add_AT_ref_address(Dwarf_P_Debug /*dbg*/,
2195    Dwarf_P_Die     /*ownerdie*/,
2196    Dwarf_Half      /*attr*/,
2197    Dwarf_Unsigned  /*pc_value*/,
2198    Dwarf_Unsigned  /*sym_index*/,
2199    Dwarf_Error*    /*error*/);
2200
2201Dwarf_P_Attribute dwarf_add_AT_unsigned_const(Dwarf_P_Debug /*dbg*/,
2202    Dwarf_P_Die     /*ownerdie*/,
2203    Dwarf_Half      /*attr*/,
2204    Dwarf_Unsigned  /*value*/,
2205    Dwarf_Error*    /*error*/);
2206
2207Dwarf_P_Attribute dwarf_add_AT_signed_const(Dwarf_P_Debug /*dbg*/,
2208    Dwarf_P_Die     /*ownerdie*/,
2209    Dwarf_Half      /*attr*/,
2210    Dwarf_Signed    /*value*/,
2211    Dwarf_Error*    /*error*/);
2212
2213Dwarf_P_Attribute dwarf_add_AT_reference(Dwarf_P_Debug /*dbg*/,
2214    Dwarf_P_Die     /*ownerdie*/,
2215    Dwarf_Half      /*attr*/,
2216    Dwarf_P_Die     /*otherdie*/,
2217    Dwarf_Error*    /*error*/);
2218
2219Dwarf_P_Attribute dwarf_add_AT_dataref(
2220    Dwarf_P_Debug   /* dbg*/,
2221    Dwarf_P_Die     /*ownerdie*/,
2222    Dwarf_Half      /*attr*/,
2223    Dwarf_Unsigned  /*pcvalue*/,
2224    Dwarf_Unsigned  /*sym_index*/,
2225    Dwarf_Error*    /*error*/);
2226
2227Dwarf_P_Attribute dwarf_add_AT_const_value_string(Dwarf_P_Die /*ownerdie*/,
2228    char*           /*string_value*/,
2229    Dwarf_Error*    /*error*/);
2230
2231Dwarf_P_Attribute dwarf_add_AT_location_expr(Dwarf_P_Debug /*dbg*/,
2232    Dwarf_P_Die     /*ownerdie*/,
2233    Dwarf_Half      /*attr*/,
2234    Dwarf_P_Expr    /*loc_expr*/,
2235    Dwarf_Error*    /*error*/);
2236
2237Dwarf_P_Attribute dwarf_add_AT_string(Dwarf_P_Debug /*dbg*/,
2238    Dwarf_P_Die     /*ownerdie*/,
2239    Dwarf_Half      /*attr*/,
2240    char*           /*string*/,
2241    Dwarf_Error*     /*error*/);
2242
2243Dwarf_P_Attribute dwarf_add_AT_flag(Dwarf_P_Debug /*dbg*/,
2244    Dwarf_P_Die     /*ownerdie*/,
2245    Dwarf_Half      /*attr*/,
2246    Dwarf_Small     /*flag*/,
2247    Dwarf_Error*    /*error*/);
2248
2249Dwarf_P_Attribute dwarf_add_AT_producer(Dwarf_P_Die /*ownerdie*/,
2250    char*           /*producer_string*/,
2251    Dwarf_Error*    /*error*/);
2252
2253Dwarf_P_Attribute dwarf_add_AT_const_value_signedint(Dwarf_P_Die /*ownerdie*/,
2254    Dwarf_Signed    /*signed_value*/,
2255    Dwarf_Error*    /*error*/);
2256
2257Dwarf_P_Attribute dwarf_add_AT_const_value_unsignedint(
2258    Dwarf_P_Die     /*ownerdie*/,
2259    Dwarf_Unsigned  /*unsigned_value*/,
2260    Dwarf_Error*    /*error*/);
2261
2262Dwarf_P_Attribute dwarf_add_AT_comp_dir(Dwarf_P_Die /*ownerdie*/,
2263    char*           /*current_working_directory*/,
2264    Dwarf_Error*    /*error*/);
2265
2266Dwarf_P_Attribute dwarf_add_AT_name(Dwarf_P_Die    /*die*/,
2267    char*           /*name*/,
2268    Dwarf_Error*    /*error*/);
2269
2270/* Producer line creation functions (.debug_line) */
2271Dwarf_Unsigned dwarf_add_directory_decl(Dwarf_P_Debug /*dbg*/,
2272    char*           /*name*/,
2273    Dwarf_Error*    /*error*/);
2274
2275Dwarf_Unsigned dwarf_add_file_decl(Dwarf_P_Debug /*dbg*/,
2276    char*           /*name*/,
2277    Dwarf_Unsigned  /*dir_index*/,
2278    Dwarf_Unsigned  /*time_last_modified*/,
2279    Dwarf_Unsigned  /*length*/,
2280    Dwarf_Error*    /*error*/);
2281
2282Dwarf_Unsigned dwarf_add_line_entry(Dwarf_P_Debug /*dbg*/,
2283    Dwarf_Unsigned  /*file_index*/,
2284    Dwarf_Addr      /*code_address*/,
2285    Dwarf_Unsigned  /*lineno*/,
2286    Dwarf_Signed    /*column_number*/,
2287    Dwarf_Bool      /*is_source_stmt_begin*/,
2288    Dwarf_Bool      /*is_basic_block_begin*/,
2289    Dwarf_Error*    /*error*/);
2290
2291Dwarf_Unsigned dwarf_lne_set_address(Dwarf_P_Debug /*dbg*/,
2292    Dwarf_Unsigned  /*offset*/,
2293    Dwarf_Unsigned  /*symbol_index*/,
2294    Dwarf_Error*    /*error*/);
2295
2296Dwarf_Unsigned dwarf_lne_end_sequence(Dwarf_P_Debug /*dbg*/,
2297    Dwarf_Addr      /*end_address*/,
2298    Dwarf_Error*    /*error*/);
2299
2300/* Producer .debug_frame functions */
2301Dwarf_Unsigned dwarf_add_frame_cie(Dwarf_P_Debug /*dbg*/,
2302    char*           /*augmenter*/,
2303    Dwarf_Small     /*code_alignent_factor*/,
2304    Dwarf_Small     /*data_alignment_factor*/,
2305    Dwarf_Small     /*return_address_reg*/,
2306    Dwarf_Ptr       /*initialization_bytes*/,
2307    Dwarf_Unsigned  /*init_byte_len*/,
2308    Dwarf_Error*    /*error*/);
2309
2310Dwarf_Unsigned dwarf_add_frame_fde(
2311    Dwarf_P_Debug   /*dbg*/,
2312    Dwarf_P_Fde     /*fde*/,
2313    Dwarf_P_Die     /*corresponding subprogram die*/,
2314    Dwarf_Unsigned  /*cie_to_use*/,
2315    Dwarf_Unsigned  /*virt_addr_of_described_code*/,
2316    Dwarf_Unsigned  /*length_of_code*/,
2317    Dwarf_Unsigned  /*symbol_index*/,
2318    Dwarf_Error*    /*error*/);
2319
2320Dwarf_Unsigned dwarf_add_frame_fde_b(
2321    Dwarf_P_Debug  /*dbg*/,
2322    Dwarf_P_Fde    /*fde*/,
2323    Dwarf_P_Die    /*die*/,
2324    Dwarf_Unsigned /*cie*/,
2325    Dwarf_Addr     /*virt_addr*/,
2326    Dwarf_Unsigned /*code_len*/,
2327    Dwarf_Unsigned /*sym_idx*/,
2328    Dwarf_Unsigned /*sym_idx_of_end*/,
2329    Dwarf_Addr     /*offset_from_end_sym*/,
2330    Dwarf_Error*   /*error*/);
2331
2332Dwarf_Unsigned dwarf_add_frame_info_b(
2333    Dwarf_P_Debug dbg   /*dbg*/,
2334    Dwarf_P_Fde     /*fde*/,
2335    Dwarf_P_Die     /*die*/,
2336    Dwarf_Unsigned  /*cie*/,
2337    Dwarf_Addr      /*virt_addr*/,
2338    Dwarf_Unsigned  /*code_len*/,
2339    Dwarf_Unsigned  /*symidx*/,
2340    Dwarf_Unsigned  /*end_symbol */,
2341    Dwarf_Addr      /*offset_from_end_symbol */,
2342    Dwarf_Signed    /*offset_into_exception_tables*/,
2343    Dwarf_Unsigned  /*exception_table_symbol*/,
2344    Dwarf_Error*    /*error*/);
2345
2346Dwarf_Unsigned dwarf_add_frame_info(
2347    Dwarf_P_Debug dbg   /*dbg*/,
2348    Dwarf_P_Fde     /*fde*/,
2349    Dwarf_P_Die     /*die*/,
2350    Dwarf_Unsigned  /*cie*/,
2351    Dwarf_Addr      /*virt_addr*/,
2352    Dwarf_Unsigned  /*code_len*/,
2353    Dwarf_Unsigned  /*symidx*/,
2354    Dwarf_Signed    /*offset_into_exception_tables*/,
2355    Dwarf_Unsigned  /*exception_table_symbol*/,
2356    Dwarf_Error*    /*error*/);
2357
2358Dwarf_P_Fde dwarf_add_fde_inst(
2359    Dwarf_P_Fde     /*fde*/,
2360    Dwarf_Small     /*op*/,
2361    Dwarf_Unsigned  /*val1*/,
2362    Dwarf_Unsigned  /*val2*/,
2363    Dwarf_Error*    /*error*/);
2364
2365/* New September 17, 2009 */
2366int dwarf_insert_fde_inst_bytes(
2367    Dwarf_P_Debug  /*dbg*/,
2368    Dwarf_P_Fde    /*fde*/,
2369    Dwarf_Unsigned /*len*/,
2370    Dwarf_Ptr      /*ibytes*/,
2371    Dwarf_Error*   /*error*/);
2372
2373
2374Dwarf_P_Fde dwarf_new_fde(Dwarf_P_Debug    /*dbg*/, Dwarf_Error* /*error*/);
2375
2376Dwarf_P_Fde dwarf_fde_cfa_offset(
2377    Dwarf_P_Fde     /*fde*/,
2378    Dwarf_Unsigned  /*register_number*/,
2379    Dwarf_Signed    /*offset*/,
2380    Dwarf_Error*    /*error*/);
2381
2382/* die creation & addition routines */
2383Dwarf_P_Die dwarf_new_die(
2384    Dwarf_P_Debug    /*dbg*/,
2385    Dwarf_Tag         /*tag*/,
2386    Dwarf_P_Die     /*parent*/,
2387    Dwarf_P_Die     /*child*/,
2388    Dwarf_P_Die     /*left */,
2389    Dwarf_P_Die     /*right*/,
2390    Dwarf_Error*    /*error*/);
2391
2392Dwarf_Unsigned dwarf_add_die_to_debug(
2393    Dwarf_P_Debug   /*dbg*/,
2394    Dwarf_P_Die     /*die*/,
2395    Dwarf_Error*    /*error*/);
2396
2397/* Markers are not written  to DWARF2/3/4, they are user
2398   defined and may be used for any purpose.
2399*/
2400Dwarf_Unsigned dwarf_add_die_marker(
2401    Dwarf_P_Debug   /*dbg*/,
2402    Dwarf_P_Die     /*die*/,
2403    Dwarf_Unsigned  /*marker*/,
2404    Dwarf_Error *   /*error*/);
2405
2406Dwarf_Unsigned dwarf_get_die_marker(
2407    Dwarf_P_Debug   /*dbg*/,
2408    Dwarf_P_Die     /*die*/,
2409    Dwarf_Unsigned *  /*marker*/,
2410    Dwarf_Error *   /*error*/);
2411
2412Dwarf_P_Die dwarf_die_link(
2413    Dwarf_P_Die     /*die*/,
2414    Dwarf_P_Die     /*parent*/,
2415    Dwarf_P_Die     /*child*/,
2416    Dwarf_P_Die     /*left*/,
2417    Dwarf_P_Die     /*right*/,
2418    Dwarf_Error*    /*error*/);
2419
2420void dwarf_dealloc_compressed_block(
2421    Dwarf_P_Debug,
2422    void *
2423);
2424
2425/* Call this passing in return value from dwarf_uncompress_integer_block()
2426 * to free the space the decompression allocated. */
2427void dwarf_dealloc_uncompressed_block(
2428    Dwarf_Debug,
2429    void *
2430);
2431
2432void * dwarf_compress_integer_block(
2433    Dwarf_P_Debug,    /* dbg */
2434    Dwarf_Bool,       /* signed==true (or unsigned) */
2435    Dwarf_Small,      /* size of integer units: 8, 16, 32, 64 */
2436    void*,            /* data */
2437    Dwarf_Unsigned,   /* number of elements */
2438    Dwarf_Unsigned*,  /* number of bytes in output block */
2439    Dwarf_Error*      /* error */
2440);
2441
2442/* Decode an array of signed leb integers (so of course the
2443 * array is not composed of fixed length values, but is instead
2444 * a sequence of sleb values).
2445 * Returns a DW_DLV_BADADDR on error.
2446 * Otherwise returns a pointer to an array of 32bit integers.
2447 * The signed argument must be non-zero (the decode
2448 * assumes sleb integers in the input data) at this time.
2449 * Size of integer units must be 32 (32 bits each) at this time.
2450 * Number of bytes in block is a byte count (not array count).
2451 * Returns number of units in output block (ie, number of elements
2452 * of the array that the return value points to) thru the argument.
2453 */
2454void * dwarf_uncompress_integer_block(
2455    Dwarf_Debug,      /* dbg */
2456    Dwarf_Bool,       /* signed==true (or unsigned) */
2457    Dwarf_Small,      /* size of integer units: 8, 16, 32, 64 */
2458    void*,            /* input data */
2459    Dwarf_Unsigned,   /* number of bytes in input */
2460    Dwarf_Unsigned*,  /* number of units in output block */
2461    Dwarf_Error*      /* error */
2462);
2463
2464/* Operations to create location expressions. */
2465Dwarf_P_Expr dwarf_new_expr(Dwarf_P_Debug /*dbg*/, Dwarf_Error* /*error*/);
2466
2467void dwarf_expr_reset(
2468    Dwarf_P_Expr      /*expr*/,
2469    Dwarf_Error*      /*error*/);
2470
2471Dwarf_Unsigned dwarf_add_expr_gen(
2472    Dwarf_P_Expr      /*expr*/,
2473    Dwarf_Small       /*opcode*/,
2474    Dwarf_Unsigned    /*val1*/,
2475    Dwarf_Unsigned    /*val2*/,
2476    Dwarf_Error*      /*error*/);
2477
2478Dwarf_Unsigned dwarf_add_expr_addr(
2479    Dwarf_P_Expr      /*expr*/,
2480    Dwarf_Unsigned    /*addr*/,
2481    Dwarf_Signed      /*sym_index*/,
2482    Dwarf_Error*      /*error*/);
2483
2484Dwarf_Unsigned dwarf_add_expr_addr_b(
2485    Dwarf_P_Expr      /*expr*/,
2486    Dwarf_Unsigned    /*addr*/,
2487    Dwarf_Unsigned    /*sym_index*/,
2488    Dwarf_Error*      /*error*/);
2489
2490Dwarf_Unsigned dwarf_expr_current_offset(
2491    Dwarf_P_Expr      /*expr*/,
2492    Dwarf_Error*      /*error*/);
2493
2494Dwarf_Addr dwarf_expr_into_block(
2495    Dwarf_P_Expr      /*expr*/,
2496    Dwarf_Unsigned*   /*length*/,
2497    Dwarf_Error*      /*error*/);
2498
2499Dwarf_Unsigned dwarf_add_arange(Dwarf_P_Debug /*dbg*/,
2500    Dwarf_Addr        /*begin_address*/,
2501    Dwarf_Unsigned    /*length*/,
2502    Dwarf_Signed      /*symbol_index*/,
2503    Dwarf_Error*      /*error*/);
2504
2505Dwarf_Unsigned dwarf_add_arange_b(
2506    Dwarf_P_Debug  /*dbg*/,
2507    Dwarf_Addr     /*begin_address*/,
2508    Dwarf_Unsigned /*length*/,
2509    Dwarf_Unsigned /*symbol_index*/,
2510    Dwarf_Unsigned /*end_symbol_index*/,
2511    Dwarf_Addr     /*offset_from_end_symbol*/,
2512    Dwarf_Error *  /*error*/);
2513
2514Dwarf_Unsigned dwarf_add_pubname(
2515    Dwarf_P_Debug      /*dbg*/,
2516    Dwarf_P_Die        /*die*/,
2517    char*              /*pubname_name*/,
2518    Dwarf_Error*       /*error*/);
2519
2520Dwarf_Unsigned dwarf_add_funcname(
2521    Dwarf_P_Debug      /*dbg*/,
2522    Dwarf_P_Die        /*die*/,
2523    char*              /*func_name*/,
2524    Dwarf_Error*       /*error*/);
2525
2526Dwarf_Unsigned dwarf_add_typename(
2527    Dwarf_P_Debug     /*dbg*/,
2528    Dwarf_P_Die       /*die*/,
2529    char*             /*type_name*/,
2530    Dwarf_Error*      /*error*/);
2531
2532Dwarf_Unsigned dwarf_add_varname(
2533    Dwarf_P_Debug     /*dbg*/,
2534    Dwarf_P_Die       /*die*/,
2535    char*             /*var_name*/,
2536    Dwarf_Error*      /*error*/);
2537
2538Dwarf_Unsigned dwarf_add_weakname(
2539    Dwarf_P_Debug    /*dbg*/,
2540    Dwarf_P_Die      /*die*/,
2541    char*            /*weak_name*/,
2542    Dwarf_Error*     /*error*/);
2543
2544/* .debug_macinfo producer functions
2545   Functions must be called in right order: the section is output
2546   In the order these are presented.
2547*/
2548int dwarf_def_macro(Dwarf_P_Debug /*dbg*/,
2549    Dwarf_Unsigned   /*line*/,
2550    char *           /*macname, with (arglist), no space before (*/,
2551    char *           /*macvalue*/,
2552    Dwarf_Error*     /*error*/);
2553
2554int dwarf_undef_macro(Dwarf_P_Debug /*dbg*/,
2555    Dwarf_Unsigned   /*line*/,
2556    char *           /*macname, no arglist, of course*/,
2557    Dwarf_Error*     /*error*/);
2558
2559int dwarf_start_macro_file(Dwarf_P_Debug /*dbg*/,
2560    Dwarf_Unsigned   /*fileindex*/,
2561    Dwarf_Unsigned   /*linenumber*/,
2562    Dwarf_Error*     /*error*/);
2563
2564int dwarf_end_macro_file(Dwarf_P_Debug /*dbg*/,
2565    Dwarf_Error*     /*error*/);
2566
2567int dwarf_vendor_ext(Dwarf_P_Debug /*dbg*/,
2568    Dwarf_Unsigned   /*constant*/,
2569    char *           /*string*/,
2570    Dwarf_Error*     /*error*/);
2571
2572/* end macinfo producer functions */
2573
2574int dwarf_attr_offset(Dwarf_Die /*die*/,
2575    Dwarf_Attribute /*attr of above die*/,
2576    Dwarf_Off     * /*returns offset thru this ptr */,
2577    Dwarf_Error   * /*error*/);
2578
2579/* This is a hack so clients can verify offsets.
2580   Added April 2005 so that debugger can detect broken offsets
2581   (which happened in an IRIX executable larger than 2GB
2582    with MIPSpro 7.3.1.3 toolchain.).
2583*/
2584int
2585dwarf_get_section_max_offsets(Dwarf_Debug /*dbg*/,
2586    Dwarf_Unsigned * /*debug_info_size*/,
2587    Dwarf_Unsigned * /*debug_abbrev_size*/,
2588    Dwarf_Unsigned * /*debug_line_size*/,
2589    Dwarf_Unsigned * /*debug_loc_size*/,
2590    Dwarf_Unsigned * /*debug_aranges_size*/,
2591    Dwarf_Unsigned * /*debug_macinfo_size*/,
2592    Dwarf_Unsigned * /*debug_pubnames_size*/,
2593    Dwarf_Unsigned * /*debug_str_size*/,
2594    Dwarf_Unsigned * /*debug_frame_size*/,
2595    Dwarf_Unsigned * /*debug_ranges_size*/,
2596    Dwarf_Unsigned * /*debug_pubtypes_size*/);
2597
2598/* Multiple releases spelled 'initial' as 'inital' .
2599   The 'inital' spelling should not be used. */
2600Dwarf_Half dwarf_set_frame_rule_inital_value(Dwarf_Debug /*dbg*/,
2601    Dwarf_Half /*value*/);
2602/* Additional interface with correct 'initial' spelling. */
2603/* It is likely you will want to call the following 5 functions
2604   before accessing any frame information.  All are useful
2605   to tailor handling of pseudo-registers needed to turn
2606   frame operation references into simpler forms and to
2607   reflect ABI specific data.  Of course altering libdwarf.h
2608   and dwarf.h allow the same capabilities, but such header changes
2609   do not let one change these values at runtime. */
2610Dwarf_Half dwarf_set_frame_rule_initial_value(Dwarf_Debug /*dbg*/,
2611    Dwarf_Half /*value*/);
2612Dwarf_Half dwarf_set_frame_rule_table_size(Dwarf_Debug /*dbg*/,
2613    Dwarf_Half /*value*/);
2614Dwarf_Half dwarf_set_frame_cfa_value(Dwarf_Debug /*dbg*/,
2615    Dwarf_Half /*value*/);
2616Dwarf_Half dwarf_set_frame_same_value(Dwarf_Debug /*dbg*/,
2617    Dwarf_Half /*value*/);
2618Dwarf_Half dwarf_set_frame_undefined_value(Dwarf_Debug /*dbg*/,
2619    Dwarf_Half /*value*/);
2620
2621/* As of April 27, 2009, this version with no diepointer is
2622   obsolete though supported.  Use dwarf_get_ranges_a() instead. */
2623int dwarf_get_ranges(Dwarf_Debug /*dbg*/,
2624    Dwarf_Off /*rangesoffset*/,
2625    Dwarf_Ranges ** /*rangesbuf*/,
2626    Dwarf_Signed * /*listlen*/,
2627    Dwarf_Unsigned * /*bytecount*/,
2628    Dwarf_Error * /*error*/);
2629
2630/* This adds the address_size argument. New April 27, 2009 */
2631int dwarf_get_ranges_a(Dwarf_Debug /*dbg*/,
2632    Dwarf_Off /*rangesoffset*/,
2633    Dwarf_Die  /* diepointer */,
2634    Dwarf_Ranges ** /*rangesbuf*/,
2635    Dwarf_Signed * /*listlen*/,
2636    Dwarf_Unsigned * /*bytecount*/,
2637    Dwarf_Error * /*error*/);
2638
2639void dwarf_ranges_dealloc(Dwarf_Debug /*dbg*/,
2640    Dwarf_Ranges * /*rangesbuf*/,
2641    Dwarf_Signed /*rangecount*/);
2642
2643/* The harmless error list is a circular buffer of
2644   errors we note but which do not stop us from processing
2645   the object.  Created so dwarfdump or other tools
2646   can report such inconsequential errors without causing
2647   anything to stop early. */
2648#define DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE 4
2649#define DW_HARMLESS_ERROR_MSG_STRING_SIZE   200
2650/* User code supplies size of array of pointers errmsg_ptrs_array
2651    in count and the array of pointers (the pointers themselves
2652    need not be initialized).
2653    The pointers returned in the array of pointers
2654    are invalidated by ANY call to libdwarf.
2655    Use them before making another libdwarf call!
2656    The array of string pointers passed in always has
2657    a final null pointer, so if there are N pointers the
2658    and M actual strings, then MIN(M,N-1) pointers are
2659    set to point to error strings.  The array of pointers
2660    to strings always terminates with a NULL pointer.
2661    If 'count' is passed in zero then errmsg_ptrs_array
2662    is not touched.
2663
2664    The function returns DW_DLV_NO_ENTRY if no harmless errors
2665    were noted so far.  Returns DW_DLV_OK if there are errors.
2666    Never returns DW_DLV_ERROR.
2667
2668    Each call empties the error list (discarding all current entries).
2669    If newerr_count is non-NULL the count of harmless errors
2670    since the last call is returned through the pointer
2671    (some may have been discarded or not returned, it is a circular
2672    list...).
2673    If DW_DLV_NO_ENTRY is returned none of the arguments
2674    here are touched or used.
2675    */
2676int dwarf_get_harmless_error_list(Dwarf_Debug /*dbg*/,
2677    unsigned  /*count*/,
2678    const char ** /*errmsg_ptrs_array*/,
2679    unsigned * /*newerr_count*/);
2680
2681/* Insertion is only for testing the harmless error code, it is not
2682    necessarily useful otherwise. */
2683void dwarf_insert_harmless_error(Dwarf_Debug /*dbg*/,
2684    char * /*newerror*/);
2685
2686/* The size of the circular list of strings may be set
2687   and reset as needed.  If it is shortened excess
2688   messages are simply dropped.  It returns the previous
2689   size. If zero passed in the size is unchanged
2690   and it simply returns the current size  */
2691unsigned dwarf_set_harmless_error_list_size(Dwarf_Debug /*dbg*/,
2692    unsigned /*maxcount*/);
2693/* The harmless error strings (if any) are freed when the dbg
2694   is dwarf_finish()ed. */
2695
2696/*  When the val_in is known these dwarf_get_TAG_name (etc)
2697    functions return the string corresponding to the val_in passed in
2698    through the pointer s_out and the value returned is DW_DLV_OK.
2699    The strings are in static storage
2700    and must not be freed.
2701    If DW_DLV_NO_ENTRY is returned the val_in is not known and
2702    *s_out is not set.  DW_DLV_ERROR is never returned.*/
2703
2704extern int dwarf_get_TAG_name(unsigned int /*val_in*/, const char ** /*s_out */);
2705extern int dwarf_get_children_name(unsigned int /*val_in*/, const char ** /*s_out */);
2706extern int dwarf_get_FORM_name(unsigned int /*val_in*/, const char ** /*s_out */);
2707extern int dwarf_get_AT_name(unsigned int /*val_in*/, const char ** /*s_out */);
2708extern int dwarf_get_OP_name(unsigned int /*val_in*/, const char ** /*s_out */);
2709extern int dwarf_get_ATE_name(unsigned int /*val_in*/, const char ** /*s_out */);
2710extern int dwarf_get_DS_name(unsigned int /*val_in*/, const char ** /*s_out */);
2711extern int dwarf_get_END_name(unsigned int /*val_in*/, const char ** /*s_out */);
2712extern int dwarf_get_ATCF_name(unsigned int /*val_in*/, const char ** /*s_out */);
2713extern int dwarf_get_ACCESS_name(unsigned int /*val_in*/, const char ** /*s_out */);
2714extern int dwarf_get_VIS_name(unsigned int /*val_in*/, const char ** /*s_out */);
2715extern int dwarf_get_VIRTUALITY_name(unsigned int /*val_in*/, const char ** /*s_out */);
2716extern int dwarf_get_LANG_name(unsigned int /*val_in*/, const char ** /*s_out */);
2717extern int dwarf_get_ID_name(unsigned int /*val_in*/, const char ** /*s_out */);
2718extern int dwarf_get_CC_name(unsigned int /*val_in*/, const char ** /*s_out */);
2719extern int dwarf_get_INL_name(unsigned int /*val_in*/, const char ** /*s_out */);
2720extern int dwarf_get_ORD_name(unsigned int /*val_in*/, const char ** /*s_out */);
2721extern int dwarf_get_DSC_name(unsigned int /*val_in*/, const char ** /*s_out */);
2722extern int dwarf_get_LNS_name(unsigned int /*val_in*/, const char ** /*s_out */);
2723extern int dwarf_get_LNE_name(unsigned int /*val_in*/, const char ** /*s_out */);
2724extern int dwarf_get_MACINFO_name(unsigned int /*val_in*/, const char ** /*s_out */);
2725extern int dwarf_get_CFA_name(unsigned int /*val_in*/, const char ** /*s_out */);
2726extern int dwarf_get_EH_name(unsigned int /*val_in*/, const char ** /*s_out */);
2727extern int dwarf_get_FRAME_name(unsigned int /*val_in*/, const char ** /*s_out */);
2728extern int dwarf_get_CHILDREN_name(unsigned int /*val_in*/, const char ** /*s_out */);
2729extern int dwarf_get_ADDR_name(unsigned int /*val_in*/, const char ** /*s_out */);
2730
2731#ifdef __cplusplus
2732}
2733#endif
2734#endif /* _LIBDWARF_H */
2735
2736
2737