xref: /titanic_50/usr/src/lib/libdwarf/common/pro_opaque.h (revision f3e7f55e73a39377d55a030f124cc86b3b66a9cc)
1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi 
3*f3e7f55eSRobert Mustacchi   Copyright (C) 2000,2002,2004 Silicon Graphics, Inc.  All Rights Reserved.
4*f3e7f55eSRobert Mustacchi   Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved.
5*f3e7f55eSRobert Mustacchi 
6*f3e7f55eSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
7*f3e7f55eSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
8*f3e7f55eSRobert Mustacchi   as published by the Free Software Foundation.
9*f3e7f55eSRobert Mustacchi 
10*f3e7f55eSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
11*f3e7f55eSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
12*f3e7f55eSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13*f3e7f55eSRobert Mustacchi 
14*f3e7f55eSRobert Mustacchi   Further, this software is distributed without any warranty that it is
15*f3e7f55eSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16*f3e7f55eSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
17*f3e7f55eSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
18*f3e7f55eSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19*f3e7f55eSRobert Mustacchi   other software, or any other product whatsoever.
20*f3e7f55eSRobert Mustacchi 
21*f3e7f55eSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22*f3e7f55eSRobert Mustacchi   License along with this program; if not, write the Free Software
23*f3e7f55eSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
24*f3e7f55eSRobert Mustacchi   USA.
25*f3e7f55eSRobert Mustacchi 
26*f3e7f55eSRobert Mustacchi   Contact information:  Silicon Graphics, Inc., 1500 Crittenden Lane,
27*f3e7f55eSRobert Mustacchi   Mountain View, CA 94043, or:
28*f3e7f55eSRobert Mustacchi 
29*f3e7f55eSRobert Mustacchi   http://www.sgi.com
30*f3e7f55eSRobert Mustacchi 
31*f3e7f55eSRobert Mustacchi   For further information regarding this notice, see:
32*f3e7f55eSRobert Mustacchi 
33*f3e7f55eSRobert Mustacchi   http://oss.sgi.com/projects/GenInfo/NoticeExplan
34*f3e7f55eSRobert Mustacchi 
35*f3e7f55eSRobert Mustacchi */
36*f3e7f55eSRobert Mustacchi 
37*f3e7f55eSRobert Mustacchi 
38*f3e7f55eSRobert Mustacchi #include <stddef.h>
39*f3e7f55eSRobert Mustacchi 
40*f3e7f55eSRobert Mustacchi /*
41*f3e7f55eSRobert Mustacchi     Sgidefs included to define __uint32_t,
42*f3e7f55eSRobert Mustacchi     a guaranteed 4-byte quantity.
43*f3e7f55eSRobert Mustacchi */
44*f3e7f55eSRobert Mustacchi #include "libdwarfdefs.h"
45*f3e7f55eSRobert Mustacchi 
46*f3e7f55eSRobert Mustacchi #define true                    1
47*f3e7f55eSRobert Mustacchi #define false                   0
48*f3e7f55eSRobert Mustacchi 
49*f3e7f55eSRobert Mustacchi /* to identify a cie */
50*f3e7f55eSRobert Mustacchi #define DW_CIE_ID 		~(0x0)
51*f3e7f55eSRobert Mustacchi #define DW_CIE_VERSION		1
52*f3e7f55eSRobert Mustacchi 
53*f3e7f55eSRobert Mustacchi /*Dwarf_Word  is unsigned word usable for index, count in memory */
54*f3e7f55eSRobert Mustacchi /*Dwarf_Sword is   signed word usable for index, count in memory */
55*f3e7f55eSRobert Mustacchi /* The are 32 or 64 bits depending if 64 bit longs or not, which
56*f3e7f55eSRobert Mustacchi ** fits the  ILP32 and LP64 models
57*f3e7f55eSRobert Mustacchi ** These work equally well with ILP64.
58*f3e7f55eSRobert Mustacchi */
59*f3e7f55eSRobert Mustacchi 
60*f3e7f55eSRobert Mustacchi typedef unsigned long Dwarf_Word;
61*f3e7f55eSRobert Mustacchi typedef long Dwarf_Sword;
62*f3e7f55eSRobert Mustacchi 
63*f3e7f55eSRobert Mustacchi 
64*f3e7f55eSRobert Mustacchi typedef signed char Dwarf_Sbyte;
65*f3e7f55eSRobert Mustacchi typedef unsigned char Dwarf_Ubyte;
66*f3e7f55eSRobert Mustacchi typedef signed short Dwarf_Shalf;
67*f3e7f55eSRobert Mustacchi 
68*f3e7f55eSRobert Mustacchi /*
69*f3e7f55eSRobert Mustacchi 	On any change that makes libdwarf producer
70*f3e7f55eSRobert Mustacchi 	incompatible, increment this number.
71*f3e7f55eSRobert Mustacchi 	1->2->3 ...
72*f3e7f55eSRobert Mustacchi 
73*f3e7f55eSRobert Mustacchi */
74*f3e7f55eSRobert Mustacchi #define  PRO_VERSION_MAGIC 0xdead1
75*f3e7f55eSRobert Mustacchi 
76*f3e7f55eSRobert Mustacchi 
77*f3e7f55eSRobert Mustacchi /* these 2 are fixed sizes which must not vary with the
78*f3e7f55eSRobert Mustacchi ** ILP32/LP64 model. These two stay at 32 bit.
79*f3e7f55eSRobert Mustacchi */
80*f3e7f55eSRobert Mustacchi typedef __uint32_t Dwarf_ufixed;
81*f3e7f55eSRobert Mustacchi typedef __int32_t Dwarf_sfixed;
82*f3e7f55eSRobert Mustacchi 
83*f3e7f55eSRobert Mustacchi /*
84*f3e7f55eSRobert Mustacchi 	producer:
85*f3e7f55eSRobert Mustacchi 	This struct is used to hold information about all
86*f3e7f55eSRobert Mustacchi 	debug* sections. On creating a new section, section
87*f3e7f55eSRobert Mustacchi 	names and indices are added to this struct
88*f3e7f55eSRobert Mustacchi 	definition in pro_section.h
89*f3e7f55eSRobert Mustacchi */
90*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Section_Data_s *Dwarf_P_Section_Data;
91*f3e7f55eSRobert Mustacchi 
92*f3e7f55eSRobert Mustacchi /*
93*f3e7f55eSRobert Mustacchi 	producer:
94*f3e7f55eSRobert Mustacchi 	This struct is used to hold entries in the include directories
95*f3e7f55eSRobert Mustacchi 	part of statement prologue. Definition in pro_line.h
96*f3e7f55eSRobert Mustacchi */
97*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Inc_Dir_s *Dwarf_P_Inc_Dir;
98*f3e7f55eSRobert Mustacchi 
99*f3e7f55eSRobert Mustacchi /*
100*f3e7f55eSRobert Mustacchi 	producer:
101*f3e7f55eSRobert Mustacchi 	This struct holds file entries for the statement prologue.
102*f3e7f55eSRobert Mustacchi 	Defined in pro_line.h
103*f3e7f55eSRobert Mustacchi */
104*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_F_Entry_s *Dwarf_P_F_Entry;
105*f3e7f55eSRobert Mustacchi 
106*f3e7f55eSRobert Mustacchi /*
107*f3e7f55eSRobert Mustacchi 	producer:
108*f3e7f55eSRobert Mustacchi 	This struct holds information for each cie. Defn in pro_frame.h
109*f3e7f55eSRobert Mustacchi */
110*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Cie_s *Dwarf_P_Cie;
111*f3e7f55eSRobert Mustacchi 
112*f3e7f55eSRobert Mustacchi /*
113*f3e7f55eSRobert Mustacchi 	producer:
114*f3e7f55eSRobert Mustacchi 	Struct to hold line number information, different from
115*f3e7f55eSRobert Mustacchi 	Dwarf_Line opaque type.
116*f3e7f55eSRobert Mustacchi */
117*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Line_s *Dwarf_P_Line;
118*f3e7f55eSRobert Mustacchi 
119*f3e7f55eSRobert Mustacchi /*
120*f3e7f55eSRobert Mustacchi 	producer:
121*f3e7f55eSRobert Mustacchi 	Struct to hold information about address ranges.
122*f3e7f55eSRobert Mustacchi */
123*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Simple_nameentry_s *Dwarf_P_Simple_nameentry;
124*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Simple_name_header_s *Dwarf_P_Simple_name_header;
125*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Arange_s *Dwarf_P_Arange;
126*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Per_Reloc_Sect_s *Dwarf_P_Per_Reloc_Sect;
127*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Per_Sect_String_Attrs_s *Dwarf_P_Per_Sect_String_Attrs;
128*f3e7f55eSRobert Mustacchi 
129*f3e7f55eSRobert Mustacchi /* Defined to get at the elf section numbers and section name
130*f3e7f55eSRobert Mustacchi    indices in symtab for the dwarf sections
131*f3e7f55eSRobert Mustacchi    Must match .rel.* names in _dwarf_rel_section_names
132*f3e7f55eSRobert Mustacchi    exactly.
133*f3e7f55eSRobert Mustacchi */
134*f3e7f55eSRobert Mustacchi #define         DEBUG_INFO      0
135*f3e7f55eSRobert Mustacchi #define         DEBUG_LINE      1
136*f3e7f55eSRobert Mustacchi #define         DEBUG_ABBREV    2
137*f3e7f55eSRobert Mustacchi #define         DEBUG_FRAME     3
138*f3e7f55eSRobert Mustacchi #define         DEBUG_ARANGES   4
139*f3e7f55eSRobert Mustacchi #define         DEBUG_PUBNAMES  5
140*f3e7f55eSRobert Mustacchi #define         DEBUG_STR       6
141*f3e7f55eSRobert Mustacchi #define         DEBUG_FUNCNAMES 7
142*f3e7f55eSRobert Mustacchi #define         DEBUG_TYPENAMES 8
143*f3e7f55eSRobert Mustacchi #define         DEBUG_VARNAMES  9
144*f3e7f55eSRobert Mustacchi #define         DEBUG_WEAKNAMES 10
145*f3e7f55eSRobert Mustacchi #define         DEBUG_MACINFO   11
146*f3e7f55eSRobert Mustacchi #define         DEBUG_LOC   12
147*f3e7f55eSRobert Mustacchi 
148*f3e7f55eSRobert Mustacchi     /* number of debug_* sections not including the relocations */
149*f3e7f55eSRobert Mustacchi #define         NUM_DEBUG_SECTIONS      DEBUG_LOC + 1
150*f3e7f55eSRobert Mustacchi 
151*f3e7f55eSRobert Mustacchi 
152*f3e7f55eSRobert Mustacchi struct Dwarf_P_Die_s {
153*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned di_offset;	/* offset in debug info */
154*f3e7f55eSRobert Mustacchi     char *di_abbrev;		/* abbreviation */
155*f3e7f55eSRobert Mustacchi     Dwarf_Word di_abbrev_nbytes;	/* # of bytes in abbrev */
156*f3e7f55eSRobert Mustacchi     Dwarf_Tag di_tag;
157*f3e7f55eSRobert Mustacchi     Dwarf_P_Die di_parent;	/* parent of current die */
158*f3e7f55eSRobert Mustacchi     Dwarf_P_Die di_child;	/* first child */
159*f3e7f55eSRobert Mustacchi     /* The last child field makes linking up children an O(1) operation,
160*f3e7f55eSRobert Mustacchi        See pro_die.c. */
161*f3e7f55eSRobert Mustacchi     Dwarf_P_Die di_last_child;
162*f3e7f55eSRobert Mustacchi     Dwarf_P_Die di_left;	/* left sibling */
163*f3e7f55eSRobert Mustacchi     Dwarf_P_Die di_right;	/* right sibling */
164*f3e7f55eSRobert Mustacchi     Dwarf_P_Attribute di_attrs;	/* list of attributes */
165*f3e7f55eSRobert Mustacchi     Dwarf_P_Attribute di_last_attr;	/* last attribute */
166*f3e7f55eSRobert Mustacchi     int di_n_attr;		/* number of attributes */
167*f3e7f55eSRobert Mustacchi     Dwarf_P_Debug di_dbg;	/* For memory management */
168*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned di_marker;   /* used to attach symbols to dies */
169*f3e7f55eSRobert Mustacchi };
170*f3e7f55eSRobert Mustacchi 
171*f3e7f55eSRobert Mustacchi 
172*f3e7f55eSRobert Mustacchi /* producer fields */
173*f3e7f55eSRobert Mustacchi struct Dwarf_P_Attribute_s {
174*f3e7f55eSRobert Mustacchi     Dwarf_Half ar_attribute;	/* Attribute Value. */
175*f3e7f55eSRobert Mustacchi     Dwarf_Half ar_attribute_form;	/* Attribute Form. */
176*f3e7f55eSRobert Mustacchi     Dwarf_P_Die ar_ref_die;	/* die pointer if form ref */
177*f3e7f55eSRobert Mustacchi     char *ar_data;		/* data, format given by form */
178*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned ar_nbytes;	/* no. of bytes of data */
179*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned ar_rel_symidx;	/* when attribute has a
180*f3e7f55eSRobert Mustacchi 					   relocatable value, holds
181*f3e7f55eSRobert Mustacchi 					   index of symbol in SYMTAB */
182*f3e7f55eSRobert Mustacchi     Dwarf_Ubyte ar_rel_type;	/* relocation type */
183*f3e7f55eSRobert Mustacchi     Dwarf_Word ar_rel_offset;	/* Offset of relocation within block */
184*f3e7f55eSRobert Mustacchi     char ar_reloc_len;		/* Number of bytes that relocation
185*f3e7f55eSRobert Mustacchi 				   applies to. 4 or 8. Unused and may
186*f3e7f55eSRobert Mustacchi 				   be 0 if if ar_rel_type is
187*f3e7f55eSRobert Mustacchi 				   R_MIPS_NONE */
188*f3e7f55eSRobert Mustacchi     Dwarf_P_Attribute ar_next;
189*f3e7f55eSRobert Mustacchi };
190*f3e7f55eSRobert Mustacchi 
191*f3e7f55eSRobert Mustacchi /* A block of .debug_macinfo data: this forms a series of blocks.
192*f3e7f55eSRobert Mustacchi ** Each macinfo input is compressed immediately and put into
193*f3e7f55eSRobert Mustacchi ** the current block if room, else a newblock allocated.
194*f3e7f55eSRobert Mustacchi ** The space allocation is such that the block and the macinfo
195*f3e7f55eSRobert Mustacchi ** data are one malloc block: free with a pointer to this and the
196*f3e7f55eSRobert Mustacchi ** mb_data is freed automatically.
197*f3e7f55eSRobert Mustacchi ** Like the struct hack, but legal ANSI C.
198*f3e7f55eSRobert Mustacchi */
199*f3e7f55eSRobert Mustacchi struct dw_macinfo_block_s {
200*f3e7f55eSRobert Mustacchi     struct dw_macinfo_block_s *mb_next;
201*f3e7f55eSRobert Mustacchi     unsigned long mb_avail_len;
202*f3e7f55eSRobert Mustacchi     unsigned long mb_used_len;
203*f3e7f55eSRobert Mustacchi     unsigned long mb_macinfo_data_space_len;
204*f3e7f55eSRobert Mustacchi     char *mb_data;		/* original malloc ptr. */
205*f3e7f55eSRobert Mustacchi };
206*f3e7f55eSRobert Mustacchi 
207*f3e7f55eSRobert Mustacchi /* dwarf_sn_kind is for the array of similarly-treated
208*f3e7f55eSRobert Mustacchi    name -> cu ties
209*f3e7f55eSRobert Mustacchi */
210*f3e7f55eSRobert Mustacchi enum dwarf_sn_kind { dwarf_snk_pubname, dwarf_snk_funcname,
211*f3e7f55eSRobert Mustacchi     dwarf_snk_weakname, dwarf_snk_typename,
212*f3e7f55eSRobert Mustacchi     dwarf_snk_varname,
213*f3e7f55eSRobert Mustacchi     dwarf_snk_entrycount	/* this one must be last */
214*f3e7f55eSRobert Mustacchi };
215*f3e7f55eSRobert Mustacchi 
216*f3e7f55eSRobert Mustacchi 
217*f3e7f55eSRobert Mustacchi 
218*f3e7f55eSRobert Mustacchi /* The calls to add a varname etc use a list of
219*f3e7f55eSRobert Mustacchi    these as the list.
220*f3e7f55eSRobert Mustacchi */
221*f3e7f55eSRobert Mustacchi struct Dwarf_P_Simple_nameentry_s {
222*f3e7f55eSRobert Mustacchi     Dwarf_P_Die sne_die;
223*f3e7f55eSRobert Mustacchi     char *sne_name;
224*f3e7f55eSRobert Mustacchi     int sne_name_len;
225*f3e7f55eSRobert Mustacchi     Dwarf_P_Simple_nameentry sne_next;
226*f3e7f55eSRobert Mustacchi };
227*f3e7f55eSRobert Mustacchi 
228*f3e7f55eSRobert Mustacchi /* An array of these, each of which heads a list
229*f3e7f55eSRobert Mustacchi    of Dwarf_P_Simple_nameentry
230*f3e7f55eSRobert Mustacchi */
231*f3e7f55eSRobert Mustacchi struct Dwarf_P_Simple_name_header_s {
232*f3e7f55eSRobert Mustacchi     Dwarf_P_Simple_nameentry sn_head;
233*f3e7f55eSRobert Mustacchi     Dwarf_P_Simple_nameentry sn_tail;
234*f3e7f55eSRobert Mustacchi     Dwarf_Signed sn_count;
235*f3e7f55eSRobert Mustacchi 
236*f3e7f55eSRobert Mustacchi     /* length that will be generated, not counting fixed header or
237*f3e7f55eSRobert Mustacchi        trailer */
238*f3e7f55eSRobert Mustacchi     Dwarf_Signed sn_net_len;
239*f3e7f55eSRobert Mustacchi };
240*f3e7f55eSRobert Mustacchi typedef int (*_dwarf_pro_reloc_name_func_ptr) (Dwarf_P_Debug dbg,
241*f3e7f55eSRobert Mustacchi     int sec_index,
242*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned offset,/* r_offset */
243*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned symidx,
244*f3e7f55eSRobert Mustacchi     enum Dwarf_Rel_Type type,
245*f3e7f55eSRobert Mustacchi     int reltarget_length);
246*f3e7f55eSRobert Mustacchi 
247*f3e7f55eSRobert Mustacchi typedef int (*_dwarf_pro_reloc_length_func_ptr) (Dwarf_P_Debug dbg,
248*f3e7f55eSRobert Mustacchi     int sec_index, Dwarf_Unsigned offset,/* r_offset */
249*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned start_symidx,
250*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned end_symidx,
251*f3e7f55eSRobert Mustacchi     enum Dwarf_Rel_Type type,
252*f3e7f55eSRobert Mustacchi     int reltarget_length);
253*f3e7f55eSRobert Mustacchi typedef int (*_dwarf_pro_transform_relocs_func_ptr) (Dwarf_P_Debug dbg,
254*f3e7f55eSRobert Mustacchi 						     Dwarf_Signed *
255*f3e7f55eSRobert Mustacchi 						     new_sec_count);
256*f3e7f55eSRobert Mustacchi 
257*f3e7f55eSRobert Mustacchi /*
258*f3e7f55eSRobert Mustacchi     Each slot in a block of slots could be:
259*f3e7f55eSRobert Mustacchi     a binary stream relocation entry (32 or 64bit relocation data)
260*f3e7f55eSRobert Mustacchi     a SYMBOLIC relocation entry.
261*f3e7f55eSRobert Mustacchi     During creation sometimes we create multiple chained blocks,
262*f3e7f55eSRobert Mustacchi     but sometimes we create a single long block.
263*f3e7f55eSRobert Mustacchi     Before returning reloc data to caller,
264*f3e7f55eSRobert Mustacchi     we switch to a single, long-enough,
265*f3e7f55eSRobert Mustacchi     block.
266*f3e7f55eSRobert Mustacchi 
267*f3e7f55eSRobert Mustacchi     We make counters here Dwarf_Unsigned so that we
268*f3e7f55eSRobert Mustacchi     get sufficient alignment. Since we use space after
269*f3e7f55eSRobert Mustacchi     the struct (at malloc time) for user data which
270*f3e7f55eSRobert Mustacchi     must have Dwarf_Unsigned alignment, this
271*f3e7f55eSRobert Mustacchi     struct must have that alignment too.
272*f3e7f55eSRobert Mustacchi */
273*f3e7f55eSRobert Mustacchi struct Dwarf_P_Relocation_Block_s {
274*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned rb_slots_in_block;	/* slots in block, as created */
275*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned rb_next_slot_to_use;	/* counter, start at 0. */
276*f3e7f55eSRobert Mustacchi     struct Dwarf_P_Relocation_Block_s *rb_next;
277*f3e7f55eSRobert Mustacchi     char *rb_where_to_add_next;	/* pointer to next slot (might be past
278*f3e7f55eSRobert Mustacchi 				   end, depending on
279*f3e7f55eSRobert Mustacchi 				   rb_next_slot_to_use) */
280*f3e7f55eSRobert Mustacchi     char *rb_data;		/* data area */
281*f3e7f55eSRobert Mustacchi };
282*f3e7f55eSRobert Mustacchi 
283*f3e7f55eSRobert Mustacchi /* One of these per potential relocation section
284*f3e7f55eSRobert Mustacchi    So one per actual dwarf section.
285*f3e7f55eSRobert Mustacchi    Left zeroed when not used (some sections have
286*f3e7f55eSRobert Mustacchi    no relocations).
287*f3e7f55eSRobert Mustacchi */
288*f3e7f55eSRobert Mustacchi struct Dwarf_P_Per_Reloc_Sect_s {
289*f3e7f55eSRobert Mustacchi     unsigned long pr_reloc_total_count;	/* total number of entries
290*f3e7f55eSRobert Mustacchi         across all blocks */
291*f3e7f55eSRobert Mustacchi 
292*f3e7f55eSRobert Mustacchi     unsigned long pr_slots_per_block_to_alloc;	/* at Block alloc, this
293*f3e7f55eSRobert Mustacchi         is the default number of slots to use */
294*f3e7f55eSRobert Mustacchi 
295*f3e7f55eSRobert Mustacchi     int pr_sect_num_of_reloc_sect;	/* sect number returned by
296*f3e7f55eSRobert Mustacchi         de_callback_func() or de_callback_func_b() call, this is the sect
297*f3e7f55eSRobert Mustacchi         number of the relocation section. */
298*f3e7f55eSRobert Mustacchi 
299*f3e7f55eSRobert Mustacchi     /* singly-linked list. add at and ('last') with count of blocks */
300*f3e7f55eSRobert Mustacchi     struct Dwarf_P_Relocation_Block_s *pr_first_block;
301*f3e7f55eSRobert Mustacchi     struct Dwarf_P_Relocation_Block_s *pr_last_block;
302*f3e7f55eSRobert Mustacchi     unsigned long pr_block_count;
303*f3e7f55eSRobert Mustacchi };
304*f3e7f55eSRobert Mustacchi 
305*f3e7f55eSRobert Mustacchi #define DEFAULT_SLOTS_PER_BLOCK 3
306*f3e7f55eSRobert Mustacchi 
307*f3e7f55eSRobert Mustacchi typedef struct memory_list_s {
308*f3e7f55eSRobert Mustacchi   struct memory_list_s *prev;
309*f3e7f55eSRobert Mustacchi   struct memory_list_s *next;
310*f3e7f55eSRobert Mustacchi } memory_list_t;
311*f3e7f55eSRobert Mustacchi 
312*f3e7f55eSRobert Mustacchi struct Dwarf_P_Per_Sect_String_Attrs_s {
313*f3e7f55eSRobert Mustacchi     int sect_sa_section_number;
314*f3e7f55eSRobert Mustacchi     unsigned sect_sa_n_alloc;
315*f3e7f55eSRobert Mustacchi     unsigned sect_sa_n_used;
316*f3e7f55eSRobert Mustacchi     Dwarf_P_String_Attr sect_sa_list;
317*f3e7f55eSRobert Mustacchi };
318*f3e7f55eSRobert Mustacchi 
319*f3e7f55eSRobert Mustacchi /* Fields used by producer */
320*f3e7f55eSRobert Mustacchi struct Dwarf_P_Debug_s {
321*f3e7f55eSRobert Mustacchi     /* used to catch dso passing dbg to another DSO with incompatible
322*f3e7f55eSRobert Mustacchi        version of libdwarf See PRO_VERSION_MAGIC */
323*f3e7f55eSRobert Mustacchi     int de_version_magic_number;
324*f3e7f55eSRobert Mustacchi 
325*f3e7f55eSRobert Mustacchi     Dwarf_Handler de_errhand;
326*f3e7f55eSRobert Mustacchi     Dwarf_Ptr de_errarg;
327*f3e7f55eSRobert Mustacchi 
328*f3e7f55eSRobert Mustacchi     /* Call back function, used to create .debug* sections. Provided
329*f3e7f55eSRobert Mustacchi        by user. Only of these used per dbg. */
330*f3e7f55eSRobert Mustacchi     Dwarf_Callback_Func de_callback_func;
331*f3e7f55eSRobert Mustacchi     Dwarf_Callback_Func_b de_callback_func_b;
332*f3e7f55eSRobert Mustacchi 
333*f3e7f55eSRobert Mustacchi     /* Flags from producer_init call */
334*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned de_flags;
335*f3e7f55eSRobert Mustacchi 
336*f3e7f55eSRobert Mustacchi     /* This holds information on debug section stream output, including
337*f3e7f55eSRobert Mustacchi        the stream data */
338*f3e7f55eSRobert Mustacchi     Dwarf_P_Section_Data de_debug_sects;
339*f3e7f55eSRobert Mustacchi 
340*f3e7f55eSRobert Mustacchi     /* Pointer to the 'current active' section */
341*f3e7f55eSRobert Mustacchi     Dwarf_P_Section_Data de_current_active_section;
342*f3e7f55eSRobert Mustacchi 
343*f3e7f55eSRobert Mustacchi     /* Number of debug data streams globs. */
344*f3e7f55eSRobert Mustacchi     Dwarf_Word de_n_debug_sect;
345*f3e7f55eSRobert Mustacchi 
346*f3e7f55eSRobert Mustacchi     /* File entry information, null terminated singly-linked list */
347*f3e7f55eSRobert Mustacchi     Dwarf_P_F_Entry de_file_entries;
348*f3e7f55eSRobert Mustacchi     Dwarf_P_F_Entry de_last_file_entry;
349*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned de_n_file_entries;
350*f3e7f55eSRobert Mustacchi 
351*f3e7f55eSRobert Mustacchi     /* Has the directories used to search for source files */
352*f3e7f55eSRobert Mustacchi     Dwarf_P_Inc_Dir de_inc_dirs;
353*f3e7f55eSRobert Mustacchi     Dwarf_P_Inc_Dir de_last_inc_dir;
354*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned de_n_inc_dirs;
355*f3e7f55eSRobert Mustacchi 
356*f3e7f55eSRobert Mustacchi     /* Has all the line number info for the stmt program */
357*f3e7f55eSRobert Mustacchi     Dwarf_P_Line de_lines;
358*f3e7f55eSRobert Mustacchi     Dwarf_P_Line de_last_line;
359*f3e7f55eSRobert Mustacchi 
360*f3e7f55eSRobert Mustacchi     /* List of cie's for the debug unit */
361*f3e7f55eSRobert Mustacchi     Dwarf_P_Cie de_frame_cies;
362*f3e7f55eSRobert Mustacchi     Dwarf_P_Cie de_last_cie;
363*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned de_n_cie;
364*f3e7f55eSRobert Mustacchi 
365*f3e7f55eSRobert Mustacchi     /* Singly-linked list of fde's for the debug unit */
366*f3e7f55eSRobert Mustacchi     Dwarf_P_Fde de_frame_fdes;
367*f3e7f55eSRobert Mustacchi     Dwarf_P_Fde de_last_fde;
368*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned de_n_fde;
369*f3e7f55eSRobert Mustacchi 
370*f3e7f55eSRobert Mustacchi     /* First die, leads to all others */
371*f3e7f55eSRobert Mustacchi     Dwarf_P_Die de_dies;
372*f3e7f55eSRobert Mustacchi 
373*f3e7f55eSRobert Mustacchi     /* Pointer to list of strings */
374*f3e7f55eSRobert Mustacchi     char *de_strings;
375*f3e7f55eSRobert Mustacchi 
376*f3e7f55eSRobert Mustacchi     /* Pointer to chain of aranges */
377*f3e7f55eSRobert Mustacchi     Dwarf_P_Arange de_arange;
378*f3e7f55eSRobert Mustacchi     Dwarf_P_Arange de_last_arange;
379*f3e7f55eSRobert Mustacchi     Dwarf_Sword de_arange_count;
380*f3e7f55eSRobert Mustacchi 
381*f3e7f55eSRobert Mustacchi     /* macinfo controls. */
382*f3e7f55eSRobert Mustacchi     /* first points to beginning of the list during creation */
383*f3e7f55eSRobert Mustacchi     struct dw_macinfo_block_s *de_first_macinfo;
384*f3e7f55eSRobert Mustacchi 
385*f3e7f55eSRobert Mustacchi     /* current points to the current, unfilled, block */
386*f3e7f55eSRobert Mustacchi     struct dw_macinfo_block_s *de_current_macinfo;
387*f3e7f55eSRobert Mustacchi 
388*f3e7f55eSRobert Mustacchi     /* Pointer to the first section, to support reset_section_bytes */
389*f3e7f55eSRobert Mustacchi     Dwarf_P_Section_Data de_first_debug_sect;
390*f3e7f55eSRobert Mustacchi 
391*f3e7f55eSRobert Mustacchi     /* handles pubnames, weaknames, etc. See dwarf_sn_kind in
392*f3e7f55eSRobert Mustacchi        pro_opaque.h */
393*f3e7f55eSRobert Mustacchi     struct Dwarf_P_Simple_name_header_s
394*f3e7f55eSRobert Mustacchi       de_simple_name_headers[dwarf_snk_entrycount];
395*f3e7f55eSRobert Mustacchi 
396*f3e7f55eSRobert Mustacchi     /* relocation data. not all sections will actally have relocation
397*f3e7f55eSRobert Mustacchi        info, of course */
398*f3e7f55eSRobert Mustacchi     struct Dwarf_P_Per_Reloc_Sect_s de_reloc_sect[NUM_DEBUG_SECTIONS];
399*f3e7f55eSRobert Mustacchi     int de_reloc_next_to_return;	/* iterator on reloc sections
400*f3e7f55eSRobert Mustacchi 					   (SYMBOLIC output) */
401*f3e7f55eSRobert Mustacchi 
402*f3e7f55eSRobert Mustacchi     /* used in remembering sections */
403*f3e7f55eSRobert Mustacchi     int de_elf_sects[NUM_DEBUG_SECTIONS];  /* elf sect number of
404*f3e7f55eSRobert Mustacchi         the section itself, DEBUG_LINE for example */
405*f3e7f55eSRobert Mustacchi 
406*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned de_sect_name_idx[NUM_DEBUG_SECTIONS]; /* section
407*f3e7f55eSRobert Mustacchi         name index or handle for the name of the symbol for
408*f3e7f55eSRobert Mustacchi         DEBUG_LINE for example */
409*f3e7f55eSRobert Mustacchi 
410*f3e7f55eSRobert Mustacchi     int de_offset_reloc;	/* offset reloc type, R_MIPS_32 for
411*f3e7f55eSRobert Mustacchi 				   example. Specific to the ABI being
412*f3e7f55eSRobert Mustacchi 				   produced. Relocates offset size
413*f3e7f55eSRobert Mustacchi 				   field */
414*f3e7f55eSRobert Mustacchi     int de_exc_reloc;		/* reloc type specific to exception
415*f3e7f55eSRobert Mustacchi 				   table relocs. */
416*f3e7f55eSRobert Mustacchi     int de_ptr_reloc;		/* standard reloc type, R_MIPS_32 for
417*f3e7f55eSRobert Mustacchi 				   example. Specific to the ABI being
418*f3e7f55eSRobert Mustacchi 				   produced. relocates pointer size
419*f3e7f55eSRobert Mustacchi 				   field */
420*f3e7f55eSRobert Mustacchi 
421*f3e7f55eSRobert Mustacchi     unsigned char de_offset_size;  /* section offset. Here to
422*f3e7f55eSRobert Mustacchi                                       avoid test of abi in macro
423*f3e7f55eSRobert Mustacchi                                       at run time MIPS -n32 4,
424*f3e7f55eSRobert Mustacchi                                       -64 8.  */
425*f3e7f55eSRobert Mustacchi 
426*f3e7f55eSRobert Mustacchi     unsigned char de_pointer_size;	/* size of pointer in target.
427*f3e7f55eSRobert Mustacchi 					   Here to avoid test of abi in
428*f3e7f55eSRobert Mustacchi 					   macro at run time MIPS -n32
429*f3e7f55eSRobert Mustacchi 					   4, -64 is 8.  */
430*f3e7f55eSRobert Mustacchi 
431*f3e7f55eSRobert Mustacchi     unsigned char de_is_64bit;	/* non-zero if is 64bit. Else 32 bit:
432*f3e7f55eSRobert Mustacchi 				   used for passing this info as a flag
433*f3e7f55eSRobert Mustacchi 				 */
434*f3e7f55eSRobert Mustacchi     unsigned char de_relocation_record_size;	/* reloc record size
435*f3e7f55eSRobert Mustacchi 						   varies by ABI and
436*f3e7f55eSRobert Mustacchi 						   relocation-output
437*f3e7f55eSRobert Mustacchi 						   method (stream or
438*f3e7f55eSRobert Mustacchi 						   symbolic) */
439*f3e7f55eSRobert Mustacchi 
440*f3e7f55eSRobert Mustacchi     unsigned char de_64bit_extension;	/* non-zero if creating 64 bit
441*f3e7f55eSRobert Mustacchi 					   offsets using dwarf2-99
442*f3e7f55eSRobert Mustacchi 					   extension proposal */
443*f3e7f55eSRobert Mustacchi 
444*f3e7f55eSRobert Mustacchi     int de_ar_data_attribute_form;	/* data8, data4 abi dependent */
445*f3e7f55eSRobert Mustacchi     int de_ar_ref_attr_form;	/* ref8 ref4 , abi dependent */
446*f3e7f55eSRobert Mustacchi 
447*f3e7f55eSRobert Mustacchi     /* simple name relocations */
448*f3e7f55eSRobert Mustacchi     _dwarf_pro_reloc_name_func_ptr de_reloc_name;
449*f3e7f55eSRobert Mustacchi 
450*f3e7f55eSRobert Mustacchi     /* relocations for a length, requiring a pair of symbols */
451*f3e7f55eSRobert Mustacchi     _dwarf_pro_reloc_length_func_ptr de_reloc_pair;
452*f3e7f55eSRobert Mustacchi 
453*f3e7f55eSRobert Mustacchi     _dwarf_pro_transform_relocs_func_ptr de_transform_relocs_to_disk;
454*f3e7f55eSRobert Mustacchi 
455*f3e7f55eSRobert Mustacchi     /* following used for macro buffers */
456*f3e7f55eSRobert Mustacchi     unsigned long de_compose_avail;
457*f3e7f55eSRobert Mustacchi     unsigned long de_compose_used_len;
458*f3e7f55eSRobert Mustacchi 
459*f3e7f55eSRobert Mustacchi     unsigned char de_same_endian;
460*f3e7f55eSRobert Mustacchi     void *(*de_copy_word) (void *, const void *, size_t);
461*f3e7f55eSRobert Mustacchi 
462*f3e7f55eSRobert Mustacchi     /* Add new fields at the END of this struct to preserve some hope
463*f3e7f55eSRobert Mustacchi        of sensible behavior on dbg passing between DSOs linked with
464*f3e7f55eSRobert Mustacchi        mismatched libdwarf producer versions. */
465*f3e7f55eSRobert Mustacchi 
466*f3e7f55eSRobert Mustacchi     Dwarf_P_Marker de_markers;  /* pointer to array of markers */
467*f3e7f55eSRobert Mustacchi     unsigned de_marker_n_alloc;
468*f3e7f55eSRobert Mustacchi     unsigned de_marker_n_used;
469*f3e7f55eSRobert Mustacchi     int de_sect_sa_next_to_return;  /* Iterator on sring attrib sects */
470*f3e7f55eSRobert Mustacchi     /* String attributes data of each section. */
471*f3e7f55eSRobert Mustacchi     struct Dwarf_P_Per_Sect_String_Attrs_s de_sect_string_attr[NUM_DEBUG_SECTIONS];
472*f3e7f55eSRobert Mustacchi };
473*f3e7f55eSRobert Mustacchi 
474*f3e7f55eSRobert Mustacchi #define CURRENT_VERSION_STAMP		2
475*f3e7f55eSRobert Mustacchi 
476*f3e7f55eSRobert Mustacchi Dwarf_Unsigned _dwarf_add_simple_name_entry(Dwarf_P_Debug dbg,
477*f3e7f55eSRobert Mustacchi 					    Dwarf_P_Die die,
478*f3e7f55eSRobert Mustacchi 					    char *entry_name,
479*f3e7f55eSRobert Mustacchi 					    enum dwarf_sn_kind
480*f3e7f55eSRobert Mustacchi 					    entrykind,
481*f3e7f55eSRobert Mustacchi 					    Dwarf_Error * error);
482*f3e7f55eSRobert Mustacchi 
483*f3e7f55eSRobert Mustacchi 
484*f3e7f55eSRobert Mustacchi #define DISTINGUISHED_VALUE 0xffffffff	/* 64bit extension flag */
485