1 /* dwarf2out.h - Various declarations for functions found in dwarf2out.cc
2 Copyright (C) 1998-2024 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #ifndef GCC_DWARF2OUT_H
21 #define GCC_DWARF2OUT_H 1
23 #include "dwarf2.h" /* ??? Remove this once only used by dwarf2foo.c. */
25 typedef struct die_struct
*dw_die_ref
;
26 typedef const struct die_struct
*const_dw_die_ref
;
28 typedef struct dw_val_node
*dw_val_ref
;
29 typedef struct dw_cfi_node
*dw_cfi_ref
;
30 typedef struct dw_loc_descr_node
*dw_loc_descr_ref
;
31 typedef struct dw_loc_list_struct
*dw_loc_list_ref
;
32 typedef struct dw_discr_list_node
*dw_discr_list_ref
;
33 typedef struct dw_wide_int
*dw_wide_int_ptr
;
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. */
41 enum dw_cfi_oprnd_type
{
50 typedef union GTY(()) {
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
;
54 struct dw_loc_descr_node
* GTY ((tag ("dw_cfi_oprnd_loc"))) dw_cfi_loc
;
55 struct dw_cfa_location
* GTY ((tag ("dw_cfi_oprnd_cfa_loc")))
59 struct GTY(()) dw_cfi_node
{
60 enum dwarf_call_frame_info dw_cfi_opc
;
61 dw_cfi_oprnd
GTY ((desc ("dw_cfi_oprnd1_desc (%1.dw_cfi_opc)")))
63 dw_cfi_oprnd
GTY ((desc ("dw_cfi_oprnd2_desc (%1.dw_cfi_opc)")))
68 typedef vec
<dw_cfi_ref
, va_gc
> *cfi_vec
;
70 typedef struct dw_fde_node
*dw_fde_ref
;
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. */
78 struct GTY(()) dw_fde_node
{
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
;
88 int dw_fde_switch_cfi_index
; /* Last CFI before switching sections. */
89 HOST_WIDE_INT stack_realignment
;
91 unsigned funcdef_number
;
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;
111 /* True if Rule 18 described in dwarf2cfi.cc is in action, i.e. for dynamic
112 stack realignment in between pushing of hard frame pointer to stack
113 and setting hard frame pointer to stack pointer. The register save for
114 hard frame pointer register should be emitted only on the latter
117 /* True if this function is to be ignored by debugger. */
118 unsigned ignored_debug
: 1;
122 /* This represents a register, in DWARF_FRAME_REGNUM space, for use in CFA
123 definitions and expressions.
124 Most architectures only need a single register number, but some (amdgcn)
125 have pointers that span multiple registers. DWARF permits arbitrary
126 register sets but existing use-cases only require contiguous register
127 sets, as represented here. */
128 struct GTY(()) cfa_reg
{
131 unsigned short span_width
; /* A.K.A. register mode size. */
133 cfa_reg
& set_by_dwreg (unsigned int r
)
137 span_width
= 0; /* Unknown size (permitted when span == 1). */
141 bool operator== (const cfa_reg
&other
) const
143 return (reg
== other
.reg
&& span
== other
.span
144 && (span_width
== other
.span_width
146 && (span_width
== 0 || other
.span_width
== 0))));
149 bool operator!= (const cfa_reg
&other
) const
151 return !(*this == other
);
155 /* This is how we define the location of the CFA. We use to handle it
156 as REG + OFFSET all the time, but now it can be more complex.
157 It can now be either REG + CFA_OFFSET or *(REG + BASE_OFFSET) + CFA_OFFSET.
158 Instead of passing around REG and OFFSET, we pass a copy
159 of this structure. */
160 struct GTY(()) dw_cfa_location
{
162 poly_int64 base_offset
;
163 /* REG is in DWARF_FRAME_REGNUM space, *not* normal REGNO space. */
165 BOOL_BITFIELD indirect
: 1; /* 1 if CFA is accessed via a dereference. */
166 BOOL_BITFIELD in_use
: 1; /* 1 if a saved cfa is stored here. */
170 /* Each DIE may have a series of attribute/value pairs. Values
171 can take on several forms. The forms that are used in this
172 implementation are listed below. */
180 dw_val_class_loc_list
,
181 dw_val_class_range_list
,
183 dw_val_class_unsigned_const
,
184 dw_val_class_const_double
,
185 dw_val_class_wide_int
,
188 dw_val_class_die_ref
,
189 dw_val_class_fde_ref
,
191 dw_val_class_lineptr
,
194 dw_val_class_loclistsptr
,
197 dw_val_class_decl_ref
,
198 dw_val_class_vms_delta
,
199 dw_val_class_high_pc
,
200 dw_val_class_discr_value
,
201 dw_val_class_discr_list
,
202 dw_val_class_const_implicit
,
203 dw_val_class_unsigned_const_implicit
,
204 dw_val_class_file_implicit
,
205 dw_val_class_view_list
,
209 /* Describe a floating point constant value, or a vector constant value. */
211 struct GTY(()) dw_vec_const
{
212 void * GTY((atomic
)) array
;
217 /* Describe a single value that a discriminant can match.
219 Discriminants (in the "record variant part" meaning) are scalars.
220 dw_discr_list_ref and dw_discr_value are a mean to describe a set of
221 discriminant values that are matched by a particular variant.
223 Discriminants can be signed or unsigned scalars, and can be discriminants
224 values. Both have to be consistent, though. */
226 struct GTY(()) dw_discr_value
{
227 int pos
; /* Whether the discriminant value is positive (unsigned). */
230 HOST_WIDE_INT
GTY ((tag ("0"))) sval
;
231 unsigned HOST_WIDE_INT
GTY ((tag ("1"))) uval
;
233 GTY ((desc ("%1.pos"))) v
;
236 struct addr_table_entry
;
238 typedef unsigned int var_loc_view
;
240 /* Location lists are ranges + location descriptions for that range,
241 so you can track variables that are in different places over
242 their entire life. */
243 typedef struct GTY(()) dw_loc_list_struct
{
244 dw_loc_list_ref dw_loc_next
;
245 const char *begin
; /* Label and addr_entry for start of range */
246 addr_table_entry
*begin_entry
;
247 const char *end
; /* Label for end of range */
248 addr_table_entry
*end_entry
;
249 char *ll_symbol
; /* Label for beginning of location list.
250 Only on head of list. */
251 char *vl_symbol
; /* Label for beginning of view list. Ditto. */
252 const char *section
; /* Section this loclist is relative to */
253 dw_loc_descr_ref expr
;
254 var_loc_view vbegin
, vend
;
256 /* True if all addresses in this and subsequent lists are known to be
259 /* True if this list has been replaced by dw_loc_next. */
261 /* True if it has been emitted into .debug_loc* / .debug_loclists*
263 unsigned char emitted
: 1;
264 /* True if hash field is index rather than hash value. */
265 unsigned char num_assigned
: 1;
266 /* True if .debug_loclists.dwo offset has been emitted for it already. */
267 unsigned char offset_emitted
: 1;
268 /* True if note_variable_value_in_expr has been called on it. */
269 unsigned char noted_variable_value
: 1;
270 /* True if the range should be emitted even if begin and end
275 /* The dw_val_node describes an attribute's value, as it is
276 represented internally. */
278 struct GTY(()) dw_val_node
{
279 enum dw_val_class val_class
;
280 struct addr_table_entry
* GTY(()) val_entry
;
281 union dw_val_struct_union
283 rtx
GTY ((tag ("dw_val_class_addr"))) val_addr
;
284 unsigned HOST_WIDE_INT
GTY ((tag ("dw_val_class_offset"))) val_offset
;
285 dw_loc_list_ref
GTY ((tag ("dw_val_class_loc_list"))) val_loc_list
;
286 dw_die_ref
GTY ((tag ("dw_val_class_view_list"))) val_view_list
;
287 dw_loc_descr_ref
GTY ((tag ("dw_val_class_loc"))) val_loc
;
288 HOST_WIDE_INT
GTY ((default)) val_int
;
289 unsigned HOST_WIDE_INT
290 GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned
;
291 double_int
GTY ((tag ("dw_val_class_const_double"))) val_double
;
292 dw_wide_int_ptr
GTY ((tag ("dw_val_class_wide_int"))) val_wide
;
293 dw_vec_const
GTY ((tag ("dw_val_class_vec"))) val_vec
;
294 struct dw_val_die_union
298 } GTY ((tag ("dw_val_class_die_ref"))) val_die_ref
;
299 unsigned GTY ((tag ("dw_val_class_fde_ref"))) val_fde_index
;
300 struct indirect_string_node
* GTY ((tag ("dw_val_class_str"))) val_str
;
301 char * GTY ((tag ("dw_val_class_lbl_id"))) val_lbl_id
;
302 unsigned char GTY ((tag ("dw_val_class_flag"))) val_flag
;
303 struct dwarf_file_data
* GTY ((tag ("dw_val_class_file"))) val_file
;
304 struct dwarf_file_data
*
305 GTY ((tag ("dw_val_class_file_implicit"))) val_file_implicit
;
306 unsigned char GTY ((tag ("dw_val_class_data8"))) val_data8
[8];
307 tree
GTY ((tag ("dw_val_class_decl_ref"))) val_decl_ref
;
308 struct dw_val_vms_delta_union
312 } GTY ((tag ("dw_val_class_vms_delta"))) val_vms_delta
;
313 dw_discr_value
GTY ((tag ("dw_val_class_discr_value"))) val_discr_value
;
314 dw_discr_list_ref
GTY ((tag ("dw_val_class_discr_list"))) val_discr_list
;
315 char * GTY ((tag ("dw_val_class_symview"))) val_symbolic_view
;
317 GTY ((desc ("%1.val_class"))) v
;
320 /* Locations in memory are described using a sequence of stack machine
323 struct GTY((chain_next ("%h.dw_loc_next"))) dw_loc_descr_node
{
324 dw_loc_descr_ref dw_loc_next
;
325 ENUM_BITFIELD (dwarf_location_atom
) dw_loc_opc
: 8;
326 /* Used to distinguish DW_OP_addr with a direct symbol relocation
327 from DW_OP_addr with a dtp-relative symbol relocation. */
328 unsigned int dtprel
: 1;
329 /* For DW_OP_pick, DW_OP_dup and DW_OP_over operations: true iff.
330 it targets a DWARF prodecure argument. In this case, it needs to be
331 relocated according to the current frame offset. */
332 unsigned int frame_offset_rel
: 1;
334 dw_val_node dw_loc_oprnd1
;
335 dw_val_node dw_loc_oprnd2
;
338 /* A variant (inside a record variant part) is selected when the corresponding
339 discriminant matches its set of values (see the comment for dw_discr_value).
340 The following datastructure holds such matching information. */
342 struct GTY(()) dw_discr_list_node
{
343 dw_discr_list_ref dw_discr_next
;
345 dw_discr_value dw_discr_lower_bound
;
346 dw_discr_value dw_discr_upper_bound
;
347 /* This node represents only the value in dw_discr_lower_bound when it's
348 zero. It represents the range between the two fields (bounds included)
353 struct GTY((variable_size
)) dw_wide_int
{
354 unsigned int precision
;
356 HOST_WIDE_INT val
[1];
358 unsigned int get_precision () const { return precision
; }
359 unsigned int get_len () const { return len
; }
360 const HOST_WIDE_INT
*get_val () const { return val
; }
361 inline HOST_WIDE_INT
elt (unsigned int) const;
362 inline bool operator == (const dw_wide_int
&) const;
366 dw_wide_int::elt (unsigned int i
) const
370 wide_int_ref ref
= wi::storage_ref (val
, len
, precision
);
371 return wi::sign_mask (ref
);
375 dw_wide_int::operator == (const dw_wide_int
&o
) const
377 wide_int_ref ref1
= wi::storage_ref (val
, len
, precision
);
378 wide_int_ref ref2
= wi::storage_ref (o
.val
, o
.len
, o
.precision
);
382 /* Interface from dwarf2out.cc to dwarf2cfi.cc. */
383 extern struct dw_loc_descr_node
*build_cfa_loc
384 (dw_cfa_location
*, poly_int64
);
385 extern struct dw_loc_descr_node
*build_cfa_aligned_loc
386 (dw_cfa_location
*, poly_int64
, HOST_WIDE_INT
);
387 extern struct dw_loc_descr_node
*build_span_loc (struct cfa_reg
);
388 extern struct dw_loc_descr_node
*mem_loc_descriptor
389 (rtx
, machine_mode mode
, machine_mode mem_mode
,
390 enum var_init_status
);
391 extern bool loc_descr_equal_p (dw_loc_descr_ref
, dw_loc_descr_ref
);
392 extern dw_fde_ref
dwarf2out_alloc_current_fde (void);
394 extern unsigned long size_of_locs (dw_loc_descr_ref
);
395 extern void output_loc_sequence (dw_loc_descr_ref
, int);
396 extern void output_loc_sequence_raw (dw_loc_descr_ref
);
398 /* Interface from dwarf2cfi.cc to dwarf2out.cc. */
399 extern void lookup_cfa_1 (dw_cfi_ref cfi
, dw_cfa_location
*loc
,
400 dw_cfa_location
*remember
);
401 extern bool cfa_equal_p (const dw_cfa_location
*, const dw_cfa_location
*);
403 extern void output_cfi (dw_cfi_ref
, dw_fde_ref
, int);
405 extern GTY(()) cfi_vec cie_cfi_vec
;
407 /* Interface from dwarf2*.c to the rest of the compiler. */
408 extern enum dw_cfi_oprnd_type dw_cfi_oprnd1_desc
409 (enum dwarf_call_frame_info cfi
);
410 extern enum dw_cfi_oprnd_type dw_cfi_oprnd2_desc
411 (enum dwarf_call_frame_info cfi
);
413 extern void output_cfi_directive (FILE *f
, struct dw_cfi_node
*cfi
);
415 extern void dwarf2out_emit_cfi (dw_cfi_ref cfi
);
417 extern void debug_dwarf (void);
419 extern void debug_dwarf_die (struct die_struct
*);
420 extern void debug_dwarf_loc_descr (dw_loc_descr_ref
);
421 extern void debug (die_struct
&ref
);
422 extern void debug (die_struct
*ptr
);
423 extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *));
424 #ifdef VMS_DEBUGGING_INFO
425 extern void dwarf2out_vms_debug_main_pointer (void);
428 enum array_descr_ordering
430 array_descr_ordering_default
,
431 array_descr_ordering_row_major
,
432 array_descr_ordering_column_major
435 #define DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN 16
437 struct array_descr_info
440 enum array_descr_ordering ordering
;
449 struct array_descr_dimen
451 /* GCC uses sizetype for array indices, so lower_bound and upper_bound
452 will likely be "sizetype" values. However, bounds may have another
453 type in the original source code. */
458 /* Only Fortran uses more than one dimension for array types. For other
459 languages, the stride can be rather specified for the whole array. */
461 } dimen
[DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN
];
464 enum fixed_point_scale_factor
466 fixed_point_scale_factor_binary
,
467 fixed_point_scale_factor_decimal
,
468 fixed_point_scale_factor_arbitrary
471 struct fixed_point_type_info
473 /* The scale factor is the value one has to multiply the actual data with
474 to get the fixed point value. We support three ways to encode it. */
475 enum fixed_point_scale_factor scale_factor_kind
;
478 /* For a binary scale factor, the scale factor is 2 ** binary. */
480 /* For a decimal scale factor, the scale factor is 10 ** decimal. */
482 /* For an arbitrary scale factor, the scale factor is the ratio
483 numerator / denominator. */
484 struct { tree numerator
; tree denominator
; } arbitrary
;
488 void dwarf2cfi_cc_finalize (void);
489 void dwarf2out_cc_finalize (void);
491 /* Some DWARF internals are exposed for the needs of DWARF-based debug
494 /* Each DIE attribute has a field specifying the attribute kind,
495 a link to the next attribute in the chain, and an attribute value.
496 Attributes are typically linked below the DIE they modify. */
498 typedef struct GTY(()) dw_attr_struct
{
499 enum dwarf_attribute dw_attr
;
500 dw_val_node dw_attr_val
;
504 extern dw_attr_node
*get_AT (dw_die_ref
, enum dwarf_attribute
);
505 extern HOST_WIDE_INT
AT_int (dw_attr_node
*);
506 extern unsigned HOST_WIDE_INT
AT_unsigned (dw_attr_node
*a
);
507 extern dw_loc_descr_ref
AT_loc (dw_attr_node
*);
508 extern dw_die_ref
get_AT_ref (dw_die_ref
, enum dwarf_attribute
);
509 extern const char *get_AT_string (dw_die_ref
, enum dwarf_attribute
);
510 extern enum dw_val_class
AT_class (dw_attr_node
*);
511 extern unsigned HOST_WIDE_INT
AT_unsigned (dw_attr_node
*);
512 extern unsigned get_AT_unsigned (dw_die_ref
, enum dwarf_attribute
);
513 extern int get_AT_flag (dw_die_ref
, enum dwarf_attribute
);
515 extern void add_name_attribute (dw_die_ref
, const char *);
517 extern dw_die_ref
new_die_raw (enum dwarf_tag
);
518 extern dw_die_ref
base_type_die (tree
, bool);
520 extern dw_die_ref
lookup_decl_die (tree
);
521 extern dw_die_ref
lookup_type_die (tree
);
523 extern dw_die_ref
dw_get_die_child (dw_die_ref
);
524 extern dw_die_ref
dw_get_die_sib (dw_die_ref
);
525 extern dw_die_ref
dw_get_die_parent (dw_die_ref
);
526 extern enum dwarf_tag
dw_get_die_tag (dw_die_ref
);
528 /* Data about a single source file. */
529 struct GTY((for_user
)) dwarf_file_data
{
531 const char * filename
;
535 extern struct dwarf_file_data
*get_AT_file (dw_die_ref
,
536 enum dwarf_attribute
);
538 #endif /* GCC_DWARF2OUT_H */