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