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