dwarf2out.h revision 1.6 1 1.1 mrg /* dwarf2out.h - Various declarations for functions found in dwarf2out.c
2 1.6 mrg Copyright (C) 1998-2016 Free Software Foundation, Inc.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
7 1.1 mrg the terms of the GNU General Public License as published by the Free
8 1.1 mrg Software Foundation; either version 3, or (at your option) any later
9 1.1 mrg version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 1.1 mrg for more details.
15 1.1 mrg
16 1.1 mrg You should have received a copy of the GNU General Public License
17 1.1 mrg along with GCC; see the file COPYING3. If not see
18 1.1 mrg <http://www.gnu.org/licenses/>. */
19 1.1 mrg
20 1.3 mrg #ifndef GCC_DWARF2OUT_H
21 1.3 mrg #define GCC_DWARF2OUT_H 1
22 1.3 mrg
23 1.3 mrg #include "dwarf2.h" /* ??? Remove this once only used by dwarf2foo.c. */
24 1.3 mrg
25 1.3 mrg typedef struct die_struct *dw_die_ref;
26 1.3 mrg typedef const struct die_struct *const_dw_die_ref;
27 1.3 mrg
28 1.5 mrg typedef struct dw_val_node *dw_val_ref;
29 1.5 mrg typedef struct dw_cfi_node *dw_cfi_ref;
30 1.5 mrg typedef struct dw_loc_descr_node *dw_loc_descr_ref;
31 1.3 mrg typedef struct dw_loc_list_struct *dw_loc_list_ref;
32 1.6 mrg typedef struct dw_discr_list_node *dw_discr_list_ref;
33 1.5 mrg typedef wide_int *wide_int_ptr;
34 1.3 mrg
35 1.3 mrg
36 1.3 mrg /* Call frames are described using a sequence of Call Frame
37 1.3 mrg Information instructions. The register number, offset
38 1.3 mrg and address fields are provided as possible operands;
39 1.3 mrg their use is selected by the opcode field. */
40 1.3 mrg
41 1.3 mrg enum dw_cfi_oprnd_type {
42 1.3 mrg dw_cfi_oprnd_unused,
43 1.3 mrg dw_cfi_oprnd_reg_num,
44 1.3 mrg dw_cfi_oprnd_offset,
45 1.3 mrg dw_cfi_oprnd_addr,
46 1.3 mrg dw_cfi_oprnd_loc
47 1.3 mrg };
48 1.3 mrg
49 1.5 mrg typedef union GTY(()) {
50 1.3 mrg unsigned int GTY ((tag ("dw_cfi_oprnd_reg_num"))) dw_cfi_reg_num;
51 1.3 mrg HOST_WIDE_INT GTY ((tag ("dw_cfi_oprnd_offset"))) dw_cfi_offset;
52 1.3 mrg const char * GTY ((tag ("dw_cfi_oprnd_addr"))) dw_cfi_addr;
53 1.5 mrg struct dw_loc_descr_node * GTY ((tag ("dw_cfi_oprnd_loc"))) dw_cfi_loc;
54 1.5 mrg } dw_cfi_oprnd;
55 1.3 mrg
56 1.5 mrg struct GTY(()) dw_cfi_node {
57 1.3 mrg enum dwarf_call_frame_info dw_cfi_opc;
58 1.3 mrg dw_cfi_oprnd GTY ((desc ("dw_cfi_oprnd1_desc (%1.dw_cfi_opc)")))
59 1.3 mrg dw_cfi_oprnd1;
60 1.3 mrg dw_cfi_oprnd GTY ((desc ("dw_cfi_oprnd2_desc (%1.dw_cfi_opc)")))
61 1.3 mrg dw_cfi_oprnd2;
62 1.5 mrg };
63 1.3 mrg
64 1.3 mrg
65 1.3 mrg typedef vec<dw_cfi_ref, va_gc> *cfi_vec;
66 1.3 mrg
67 1.5 mrg typedef struct dw_fde_node *dw_fde_ref;
68 1.3 mrg
69 1.3 mrg /* All call frame descriptions (FDE's) in the GCC generated DWARF
70 1.3 mrg refer to a single Common Information Entry (CIE), defined at
71 1.3 mrg the beginning of the .debug_frame section. This use of a single
72 1.3 mrg CIE obviates the need to keep track of multiple CIE's
73 1.3 mrg in the DWARF generation routines below. */
74 1.3 mrg
75 1.5 mrg struct GTY(()) dw_fde_node {
76 1.3 mrg tree decl;
77 1.3 mrg const char *dw_fde_begin;
78 1.3 mrg const char *dw_fde_current_label;
79 1.3 mrg const char *dw_fde_end;
80 1.3 mrg const char *dw_fde_vms_end_prologue;
81 1.3 mrg const char *dw_fde_vms_begin_epilogue;
82 1.3 mrg const char *dw_fde_second_begin;
83 1.3 mrg const char *dw_fde_second_end;
84 1.3 mrg cfi_vec dw_fde_cfi;
85 1.3 mrg int dw_fde_switch_cfi_index; /* Last CFI before switching sections. */
86 1.3 mrg HOST_WIDE_INT stack_realignment;
87 1.3 mrg
88 1.3 mrg unsigned funcdef_number;
89 1.3 mrg unsigned fde_index;
90 1.3 mrg
91 1.3 mrg /* Dynamic realign argument pointer register. */
92 1.3 mrg unsigned int drap_reg;
93 1.3 mrg /* Virtual dynamic realign argument pointer register. */
94 1.3 mrg unsigned int vdrap_reg;
95 1.3 mrg /* These 3 flags are copied from rtl_data in function.h. */
96 1.3 mrg unsigned all_throwers_are_sibcalls : 1;
97 1.3 mrg unsigned uses_eh_lsda : 1;
98 1.3 mrg unsigned nothrow : 1;
99 1.3 mrg /* Whether we did stack realign in this call frame. */
100 1.3 mrg unsigned stack_realign : 1;
101 1.3 mrg /* Whether dynamic realign argument pointer register has been saved. */
102 1.3 mrg unsigned drap_reg_saved: 1;
103 1.3 mrg /* True iff dw_fde_begin label is in text_section or cold_text_section. */
104 1.3 mrg unsigned in_std_section : 1;
105 1.3 mrg /* True iff dw_fde_second_begin label is in text_section or
106 1.3 mrg cold_text_section. */
107 1.3 mrg unsigned second_in_std_section : 1;
108 1.5 mrg };
109 1.3 mrg
110 1.3 mrg
111 1.3 mrg /* This is how we define the location of the CFA. We use to handle it
112 1.3 mrg as REG + OFFSET all the time, but now it can be more complex.
113 1.3 mrg It can now be either REG + CFA_OFFSET or *(REG + BASE_OFFSET) + CFA_OFFSET.
114 1.3 mrg Instead of passing around REG and OFFSET, we pass a copy
115 1.3 mrg of this structure. */
116 1.5 mrg struct GTY(()) dw_cfa_location {
117 1.3 mrg HOST_WIDE_INT offset;
118 1.3 mrg HOST_WIDE_INT base_offset;
119 1.3 mrg /* REG is in DWARF_FRAME_REGNUM space, *not* normal REGNO space. */
120 1.3 mrg unsigned int reg;
121 1.3 mrg BOOL_BITFIELD indirect : 1; /* 1 if CFA is accessed via a dereference. */
122 1.3 mrg BOOL_BITFIELD in_use : 1; /* 1 if a saved cfa is stored here. */
123 1.5 mrg };
124 1.3 mrg
125 1.3 mrg
126 1.3 mrg /* Each DIE may have a series of attribute/value pairs. Values
127 1.3 mrg can take on several forms. The forms that are used in this
128 1.3 mrg implementation are listed below. */
129 1.3 mrg
130 1.3 mrg enum dw_val_class
131 1.3 mrg {
132 1.3 mrg dw_val_class_none,
133 1.3 mrg dw_val_class_addr,
134 1.3 mrg dw_val_class_offset,
135 1.3 mrg dw_val_class_loc,
136 1.3 mrg dw_val_class_loc_list,
137 1.3 mrg dw_val_class_range_list,
138 1.3 mrg dw_val_class_const,
139 1.3 mrg dw_val_class_unsigned_const,
140 1.3 mrg dw_val_class_const_double,
141 1.5 mrg dw_val_class_wide_int,
142 1.3 mrg dw_val_class_vec,
143 1.3 mrg dw_val_class_flag,
144 1.3 mrg dw_val_class_die_ref,
145 1.3 mrg dw_val_class_fde_ref,
146 1.3 mrg dw_val_class_lbl_id,
147 1.3 mrg dw_val_class_lineptr,
148 1.3 mrg dw_val_class_str,
149 1.3 mrg dw_val_class_macptr,
150 1.3 mrg dw_val_class_file,
151 1.3 mrg dw_val_class_data8,
152 1.3 mrg dw_val_class_decl_ref,
153 1.3 mrg dw_val_class_vms_delta,
154 1.6 mrg dw_val_class_high_pc,
155 1.6 mrg dw_val_class_discr_value,
156 1.6 mrg dw_val_class_discr_list
157 1.3 mrg };
158 1.3 mrg
159 1.3 mrg /* Describe a floating point constant value, or a vector constant value. */
160 1.3 mrg
161 1.5 mrg struct GTY(()) dw_vec_const {
162 1.3 mrg unsigned char * GTY((atomic)) array;
163 1.3 mrg unsigned length;
164 1.3 mrg unsigned elt_size;
165 1.5 mrg };
166 1.3 mrg
167 1.6 mrg /* Describe a single value that a discriminant can match.
168 1.6 mrg
169 1.6 mrg Discriminants (in the "record variant part" meaning) are scalars.
170 1.6 mrg dw_discr_list_ref and dw_discr_value are a mean to describe a set of
171 1.6 mrg discriminant values that are matched by a particular variant.
172 1.6 mrg
173 1.6 mrg Discriminants can be signed or unsigned scalars, and can be discriminants
174 1.6 mrg values. Both have to be consistent, though. */
175 1.6 mrg
176 1.6 mrg struct GTY(()) dw_discr_value {
177 1.6 mrg int pos; /* Whether the discriminant value is positive (unsigned). */
178 1.6 mrg union
179 1.6 mrg {
180 1.6 mrg HOST_WIDE_INT GTY ((tag ("0"))) sval;
181 1.6 mrg unsigned HOST_WIDE_INT GTY ((tag ("1"))) uval;
182 1.6 mrg }
183 1.6 mrg GTY ((desc ("%1.pos"))) v;
184 1.6 mrg };
185 1.6 mrg
186 1.6 mrg struct addr_table_entry;
187 1.3 mrg
188 1.3 mrg /* The dw_val_node describes an attribute's value, as it is
189 1.3 mrg represented internally. */
190 1.3 mrg
191 1.5 mrg struct GTY(()) dw_val_node {
192 1.3 mrg enum dw_val_class val_class;
193 1.6 mrg struct addr_table_entry * GTY(()) val_entry;
194 1.3 mrg union dw_val_struct_union
195 1.3 mrg {
196 1.3 mrg rtx GTY ((tag ("dw_val_class_addr"))) val_addr;
197 1.3 mrg unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_offset"))) val_offset;
198 1.3 mrg dw_loc_list_ref GTY ((tag ("dw_val_class_loc_list"))) val_loc_list;
199 1.3 mrg dw_loc_descr_ref GTY ((tag ("dw_val_class_loc"))) val_loc;
200 1.3 mrg HOST_WIDE_INT GTY ((default)) val_int;
201 1.3 mrg unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned;
202 1.3 mrg double_int GTY ((tag ("dw_val_class_const_double"))) val_double;
203 1.5 mrg wide_int_ptr GTY ((tag ("dw_val_class_wide_int"))) val_wide;
204 1.3 mrg dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec;
205 1.3 mrg struct dw_val_die_union
206 1.3 mrg {
207 1.3 mrg dw_die_ref die;
208 1.3 mrg int external;
209 1.3 mrg } GTY ((tag ("dw_val_class_die_ref"))) val_die_ref;
210 1.3 mrg unsigned GTY ((tag ("dw_val_class_fde_ref"))) val_fde_index;
211 1.3 mrg struct indirect_string_node * GTY ((tag ("dw_val_class_str"))) val_str;
212 1.3 mrg char * GTY ((tag ("dw_val_class_lbl_id"))) val_lbl_id;
213 1.3 mrg unsigned char GTY ((tag ("dw_val_class_flag"))) val_flag;
214 1.3 mrg struct dwarf_file_data * GTY ((tag ("dw_val_class_file"))) val_file;
215 1.3 mrg unsigned char GTY ((tag ("dw_val_class_data8"))) val_data8[8];
216 1.3 mrg tree GTY ((tag ("dw_val_class_decl_ref"))) val_decl_ref;
217 1.3 mrg struct dw_val_vms_delta_union
218 1.3 mrg {
219 1.3 mrg char * lbl1;
220 1.3 mrg char * lbl2;
221 1.3 mrg } GTY ((tag ("dw_val_class_vms_delta"))) val_vms_delta;
222 1.6 mrg dw_discr_value GTY ((tag ("dw_val_class_discr_value"))) val_discr_value;
223 1.6 mrg dw_discr_list_ref GTY ((tag ("dw_val_class_discr_list"))) val_discr_list;
224 1.3 mrg }
225 1.3 mrg GTY ((desc ("%1.val_class"))) v;
226 1.5 mrg };
227 1.3 mrg
228 1.3 mrg /* Locations in memory are described using a sequence of stack machine
229 1.3 mrg operations. */
230 1.3 mrg
231 1.5 mrg struct GTY((chain_next ("%h.dw_loc_next"))) dw_loc_descr_node {
232 1.3 mrg dw_loc_descr_ref dw_loc_next;
233 1.3 mrg ENUM_BITFIELD (dwarf_location_atom) dw_loc_opc : 8;
234 1.3 mrg /* Used to distinguish DW_OP_addr with a direct symbol relocation
235 1.3 mrg from DW_OP_addr with a dtp-relative symbol relocation. */
236 1.3 mrg unsigned int dtprel : 1;
237 1.6 mrg /* For DW_OP_pick operations: true iff. it targets a DWARF prodecure
238 1.6 mrg argument. In this case, it needs to be relocated according to the current
239 1.6 mrg frame offset. */
240 1.6 mrg unsigned int frame_offset_rel : 1;
241 1.3 mrg int dw_loc_addr;
242 1.6 mrg #if CHECKING_P
243 1.6 mrg /* When translating a function into a DWARF procedure, contains the frame
244 1.6 mrg offset *before* evaluating this operation. It is -1 when not yet
245 1.6 mrg initialized. */
246 1.6 mrg int dw_loc_frame_offset;
247 1.6 mrg #endif
248 1.3 mrg dw_val_node dw_loc_oprnd1;
249 1.3 mrg dw_val_node dw_loc_oprnd2;
250 1.5 mrg };
251 1.3 mrg
252 1.6 mrg /* A variant (inside a record variant part) is selected when the corresponding
253 1.6 mrg discriminant matches its set of values (see the comment for dw_discr_value).
254 1.6 mrg The following datastructure holds such matching information. */
255 1.6 mrg
256 1.6 mrg struct GTY(()) dw_discr_list_node {
257 1.6 mrg dw_discr_list_ref dw_discr_next;
258 1.6 mrg
259 1.6 mrg dw_discr_value dw_discr_lower_bound;
260 1.6 mrg dw_discr_value dw_discr_upper_bound;
261 1.6 mrg /* This node represents only the value in dw_discr_lower_bound when it's
262 1.6 mrg zero. It represents the range between the two fields (bounds included)
263 1.6 mrg otherwise. */
264 1.6 mrg int dw_discr_range;
265 1.6 mrg };
266 1.3 mrg
267 1.3 mrg /* Interface from dwarf2out.c to dwarf2cfi.c. */
268 1.5 mrg extern struct dw_loc_descr_node *build_cfa_loc
269 1.3 mrg (dw_cfa_location *, HOST_WIDE_INT);
270 1.5 mrg extern struct dw_loc_descr_node *build_cfa_aligned_loc
271 1.3 mrg (dw_cfa_location *, HOST_WIDE_INT offset, HOST_WIDE_INT alignment);
272 1.5 mrg extern struct dw_loc_descr_node *mem_loc_descriptor
273 1.5 mrg (rtx, machine_mode mode, machine_mode mem_mode,
274 1.3 mrg enum var_init_status);
275 1.3 mrg extern bool loc_descr_equal_p (dw_loc_descr_ref, dw_loc_descr_ref);
276 1.3 mrg extern dw_fde_ref dwarf2out_alloc_current_fde (void);
277 1.3 mrg
278 1.3 mrg extern unsigned long size_of_locs (dw_loc_descr_ref);
279 1.3 mrg extern void output_loc_sequence (dw_loc_descr_ref, int);
280 1.3 mrg extern void output_loc_sequence_raw (dw_loc_descr_ref);
281 1.3 mrg
282 1.3 mrg /* Interface from dwarf2cfi.c to dwarf2out.c. */
283 1.3 mrg extern void lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_location *loc,
284 1.3 mrg dw_cfa_location *remember);
285 1.3 mrg extern bool cfa_equal_p (const dw_cfa_location *, const dw_cfa_location *);
286 1.3 mrg
287 1.3 mrg extern void output_cfi (dw_cfi_ref, dw_fde_ref, int);
288 1.3 mrg
289 1.3 mrg extern GTY(()) cfi_vec cie_cfi_vec;
290 1.3 mrg
291 1.3 mrg /* Interface from dwarf2*.c to the rest of the compiler. */
292 1.3 mrg extern enum dw_cfi_oprnd_type dw_cfi_oprnd1_desc
293 1.3 mrg (enum dwarf_call_frame_info cfi);
294 1.3 mrg extern enum dw_cfi_oprnd_type dw_cfi_oprnd2_desc
295 1.3 mrg (enum dwarf_call_frame_info cfi);
296 1.3 mrg
297 1.5 mrg extern void output_cfi_directive (FILE *f, struct dw_cfi_node *cfi);
298 1.3 mrg
299 1.3 mrg extern void dwarf2out_emit_cfi (dw_cfi_ref cfi);
300 1.1 mrg
301 1.1 mrg extern void debug_dwarf (void);
302 1.1 mrg struct die_struct;
303 1.1 mrg extern void debug_dwarf_die (struct die_struct *);
304 1.5 mrg extern void debug_dwarf_loc_descr (dw_loc_descr_ref);
305 1.5 mrg extern void debug (die_struct &ref);
306 1.5 mrg extern void debug (die_struct *ptr);
307 1.1 mrg extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *));
308 1.3 mrg #ifdef VMS_DEBUGGING_INFO
309 1.3 mrg extern void dwarf2out_vms_debug_main_pointer (void);
310 1.3 mrg #endif
311 1.1 mrg
312 1.5 mrg enum array_descr_ordering
313 1.5 mrg {
314 1.5 mrg array_descr_ordering_default,
315 1.5 mrg array_descr_ordering_row_major,
316 1.5 mrg array_descr_ordering_column_major
317 1.5 mrg };
318 1.5 mrg
319 1.6 mrg #define DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN 16
320 1.6 mrg
321 1.1 mrg struct array_descr_info
322 1.1 mrg {
323 1.1 mrg int ndimensions;
324 1.5 mrg enum array_descr_ordering ordering;
325 1.1 mrg tree element_type;
326 1.1 mrg tree base_decl;
327 1.1 mrg tree data_location;
328 1.1 mrg tree allocated;
329 1.1 mrg tree associated;
330 1.6 mrg tree stride;
331 1.6 mrg bool stride_in_bits;
332 1.1 mrg struct array_descr_dimen
333 1.1 mrg {
334 1.5 mrg /* GCC uses sizetype for array indices, so lower_bound and upper_bound
335 1.5 mrg will likely be "sizetype" values. However, bounds may have another
336 1.5 mrg type in the original source code. */
337 1.5 mrg tree bounds_type;
338 1.1 mrg tree lower_bound;
339 1.1 mrg tree upper_bound;
340 1.6 mrg
341 1.6 mrg /* Only Fortran uses more than one dimension for array types. For other
342 1.6 mrg languages, the stride can be rather specified for the whole array. */
343 1.1 mrg tree stride;
344 1.6 mrg } dimen[DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN];
345 1.6 mrg };
346 1.6 mrg
347 1.6 mrg enum fixed_point_scale_factor
348 1.6 mrg {
349 1.6 mrg fixed_point_scale_factor_binary,
350 1.6 mrg fixed_point_scale_factor_decimal,
351 1.6 mrg fixed_point_scale_factor_arbitrary
352 1.6 mrg };
353 1.6 mrg
354 1.6 mrg struct fixed_point_type_info
355 1.6 mrg {
356 1.6 mrg /* A scale factor is the value one has to multiply with physical data in
357 1.6 mrg order to get the fixed point logical data. The DWARF standard enables one
358 1.6 mrg to encode it in three ways. */
359 1.6 mrg enum fixed_point_scale_factor scale_factor_kind;
360 1.6 mrg union
361 1.6 mrg {
362 1.6 mrg /* For binary scale factor, the scale factor is: 2 ** binary. */
363 1.6 mrg int binary;
364 1.6 mrg /* For decimal scale factor, the scale factor is: 10 ** binary. */
365 1.6 mrg int decimal;
366 1.6 mrg /* For arbitrary scale factor, the scale factor is:
367 1.6 mrg numerator / denominator. */
368 1.6 mrg struct
369 1.6 mrg {
370 1.6 mrg unsigned HOST_WIDE_INT numerator;
371 1.6 mrg HOST_WIDE_INT denominator;
372 1.6 mrg } arbitrary;
373 1.6 mrg } scale_factor;
374 1.1 mrg };
375 1.3 mrg
376 1.5 mrg void dwarf2out_c_finalize (void);
377 1.5 mrg
378 1.3 mrg #endif /* GCC_DWARF2OUT_H */
379