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