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. */
40 enum dw_cfi_oprnd_type
: int {
49 typedef union GTY(()) {
50 unsigned int GTY ((tag ("dw_cfi_oprnd_reg_num"))) dw_cfi_reg_num
;
51 HOST_WIDE_INT
GTY ((tag ("dw_cfi_oprnd_offset"))) dw_cfi_offset
;
52 const char * GTY ((tag ("dw_cfi_oprnd_addr"))) dw_cfi_addr
;
53 struct dw_loc_descr_node
* GTY ((tag ("dw_cfi_oprnd_loc"))) dw_cfi_loc
;
54 struct dw_cfa_location
* GTY ((tag ("dw_cfi_oprnd_cfa_loc")))
58 struct GTY(()) dw_cfi_node
{
59 enum dwarf_call_frame_info dw_cfi_opc
;
60 dw_cfi_oprnd
GTY ((desc ("dw_cfi_oprnd1_desc (%1.dw_cfi_opc)")))
62 dw_cfi_oprnd
GTY ((desc ("dw_cfi_oprnd2_desc (%1.dw_cfi_opc)")))
67 typedef vec
<dw_cfi_ref
, va_gc
> *cfi_vec
;
69 typedef struct dw_fde_node
*dw_fde_ref
;
71 /* All call frame descriptions (FDE's) in the GCC generated DWARF
72 refer to a single Common Information Entry (CIE), defined at
73 the beginning of the .debug_frame section. This use of a single
74 CIE obviates the need to keep track of multiple CIE's
75 in the DWARF generation routines below. */
77 struct GTY(()) dw_fde_node
{
79 const char *dw_fde_begin
;
80 const char *dw_fde_current_label
;
81 const char *dw_fde_end
;
82 const char *dw_fde_vms_end_prologue
;
83 const char *dw_fde_vms_begin_epilogue
;
84 const char *dw_fde_second_begin
;
85 const char *dw_fde_second_end
;
87 int dw_fde_switch_cfi_index
; /* Last CFI before switching sections. */
88 HOST_WIDE_INT stack_realignment
;
90 unsigned funcdef_number
;
93 /* Dynamic realign argument pointer register. */
94 unsigned int drap_reg
;
95 /* Virtual dynamic realign argument pointer register. */
96 unsigned int vdrap_reg
;
97 /* These 3 flags are copied from rtl_data in function.h. */
98 unsigned all_throwers_are_sibcalls
: 1;
99 unsigned uses_eh_lsda
: 1;
100 unsigned nothrow
: 1;
101 /* Whether we did stack realign in this call frame. */
102 unsigned stack_realign
: 1;
103 /* Whether dynamic realign argument pointer register has been saved. */
104 unsigned drap_reg_saved
: 1;
105 /* True iff dw_fde_begin label is in text_section or cold_text_section. */
106 unsigned in_std_section
: 1;
107 /* True iff dw_fde_second_begin label is in text_section or
108 cold_text_section. */
109 unsigned second_in_std_section
: 1;
110 /* True if Rule 18 described in dwarf2cfi.cc is in action, i.e. for dynamic
111 stack realignment in between pushing of hard frame pointer to stack
112 and setting hard frame pointer to stack pointer. The register save for
113 hard frame pointer register should be emitted only on the latter
116 /* True if this function is to be ignored by debugger. */
117 unsigned ignored_debug
: 1;
121 /* This represents a register, in DWARF_FRAME_REGNUM space, for use in CFA
122 definitions and expressions.
123 Most architectures only need a single register number, but some (amdgcn)
124 have pointers that span multiple registers. DWARF permits arbitrary
125 register sets but existing use-cases only require contiguous register
126 sets, as represented here. */
127 struct GTY(()) cfa_reg
{
130 unsigned short span_width
; /* A.K.A. register mode size. */
132 cfa_reg
& set_by_dwreg (unsigned int r
)
136 span_width
= 0; /* Unknown size (permitted when span == 1). */
140 bool operator== (const cfa_reg
&other
) const
142 return (reg
== other
.reg
&& span
== other
.span
143 && (span_width
== other
.span_width
145 && (span_width
== 0 || other
.span_width
== 0))));
148 bool operator!= (const cfa_reg
&other
) const
150 return !(*this == other
);
154 /* This is how we define the location of the CFA. We use to handle it
155 as REG + OFFSET all the time, but now it can be more complex.
156 It can now be either REG + CFA_OFFSET or *(REG + BASE_OFFSET) + CFA_OFFSET.
157 Instead of passing around REG and OFFSET, we pass a copy
158 of this structure. */
159 struct GTY(()) dw_cfa_location
{
161 poly_int64 base_offset
;
162 /* REG is in DWARF_FRAME_REGNUM space, *not* normal REGNO space. */
164 BOOL_BITFIELD indirect
: 1; /* 1 if CFA is accessed via a dereference. */
165 BOOL_BITFIELD in_use
: 1; /* 1 if a saved cfa is stored here. */
169 /* Each DIE may have a series of attribute/value pairs. Values
170 can take on several forms. The forms that are used in this
171 implementation are listed below. */
179 dw_val_class_loc_list
,
180 dw_val_class_range_list
,
182 dw_val_class_unsigned_const
,
183 dw_val_class_const_double
,
184 dw_val_class_wide_int
,
187 dw_val_class_die_ref
,
188 dw_val_class_fde_ref
,
190 dw_val_class_lineptr
,
193 dw_val_class_loclistsptr
,
196 dw_val_class_decl_ref
,
197 dw_val_class_vms_delta
,
198 dw_val_class_high_pc
,
199 dw_val_class_discr_value
,
200 dw_val_class_discr_list
,
201 dw_val_class_const_implicit
,
202 dw_val_class_unsigned_const_implicit
,
203 dw_val_class_file_implicit
,
204 dw_val_class_view_list
,
208 /* Describe a floating point constant value, or a vector constant value. */
210 struct GTY(()) dw_vec_const
{
211 void * GTY((atomic
)) array
;
216 /* Describe a single value that a discriminant can match.
218 Discriminants (in the "record variant part" meaning) are scalars.
219 dw_discr_list_ref and dw_discr_value are a mean to describe a set of
220 discriminant values that are matched by a particular variant.
222 Discriminants can be signed or unsigned scalars, and can be discriminants
223 values. Both have to be consistent, though. */
225 struct GTY(()) dw_discr_value
{
226 int pos
; /* Whether the discriminant value is positive (unsigned). */
229 HOST_WIDE_INT
GTY ((tag ("0"))) sval
;
230 unsigned HOST_WIDE_INT
GTY ((tag ("1"))) uval
;
232 GTY ((desc ("%1.pos"))) v
;
235 struct addr_table_entry
;
237 typedef unsigned int var_loc_view
;
239 /* Location lists are ranges + location descriptions for that range,
240 so you can track variables that are in different places over
241 their entire life. */
242 typedef struct GTY(()) dw_loc_list_struct
{
243 dw_loc_list_ref dw_loc_next
;
244 const char *begin
; /* Label and addr_entry for start of range */
245 addr_table_entry
*begin_entry
;
246 const char *end
; /* Label for end of range */
247 addr_table_entry
*end_entry
;
248 char *ll_symbol
; /* Label for beginning of location list.
249 Only on head of list. */
250 char *vl_symbol
; /* Label for beginning of view list. Ditto. */
251 const char *section
; /* Section this loclist is relative to */
252 dw_loc_descr_ref expr
;
253 var_loc_view vbegin
, vend
;
255 /* True if all addresses in this and subsequent lists are known to be
258 /* True if this list has been replaced by dw_loc_next. */
260 /* True if it has been emitted into .debug_loc* / .debug_loclists*
262 unsigned char emitted
: 1;
263 /* True if hash field is index rather than hash value. */
264 unsigned char num_assigned
: 1;
265 /* True if .debug_loclists.dwo offset has been emitted for it already. */
266 unsigned char offset_emitted
: 1;
267 /* True if note_variable_value_in_expr has been called on it. */
268 unsigned char noted_variable_value
: 1;
269 /* True if the range should be emitted even if begin and end
274 /* The dw_val_node describes an attribute's value, as it is
275 represented internally. */
277 struct GTY(()) dw_val_node
{
278 enum dw_val_class val_class
;
279 struct addr_table_entry
* GTY(()) val_entry
;
280 union dw_val_struct_union
282 rtx
GTY ((tag ("dw_val_class_addr"))) val_addr
;
283 unsigned HOST_WIDE_INT
GTY ((tag ("dw_val_class_offset"))) val_offset
;
284 dw_loc_list_ref
GTY ((tag ("dw_val_class_loc_list"))) val_loc_list
;
285 dw_die_ref
GTY ((tag ("dw_val_class_view_list"))) val_view_list
;
286 dw_loc_descr_ref
GTY ((tag ("dw_val_class_loc"))) val_loc
;
287 HOST_WIDE_INT
GTY ((default)) val_int
;
288 unsigned HOST_WIDE_INT
289 GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned
;
290 double_int
GTY ((tag ("dw_val_class_const_double"))) val_double
;
291 dw_wide_int_ptr
GTY ((tag ("dw_val_class_wide_int"))) val_wide
;
292 dw_vec_const
GTY ((tag ("dw_val_class_vec"))) val_vec
;
293 struct dw_val_die_union
297 } GTY ((tag ("dw_val_class_die_ref"))) val_die_ref
;
298 unsigned GTY ((tag ("dw_val_class_fde_ref"))) val_fde_index
;
299 struct indirect_string_node
* GTY ((tag ("dw_val_class_str"))) val_str
;
300 char * GTY ((tag ("dw_val_class_lbl_id"))) val_lbl_id
;
301 unsigned char GTY ((tag ("dw_val_class_flag"))) val_flag
;
302 struct dwarf_file_data
* GTY ((tag ("dw_val_class_file"))) val_file
;
303 struct dwarf_file_data
*
304 GTY ((tag ("dw_val_class_file_implicit"))) val_file_implicit
;
305 unsigned char GTY ((tag ("dw_val_class_data8"))) val_data8
[8];
306 tree
GTY ((tag ("dw_val_class_decl_ref"))) val_decl_ref
;
307 struct dw_val_vms_delta_union
311 } GTY ((tag ("dw_val_class_vms_delta"))) val_vms_delta
;
312 dw_discr_value
GTY ((tag ("dw_val_class_discr_value"))) val_discr_value
;
313 dw_discr_list_ref
GTY ((tag ("dw_val_class_discr_list"))) val_discr_list
;
314 char * GTY ((tag ("dw_val_class_symview"))) val_symbolic_view
;
316 GTY ((desc ("%1.val_class"))) v
;
319 /* Locations in memory are described using a sequence of stack machine
322 struct GTY((chain_next ("%h.dw_loc_next"))) dw_loc_descr_node
{
323 dw_loc_descr_ref dw_loc_next
;
324 ENUM_BITFIELD (dwarf_location_atom
) dw_loc_opc
: 8;
325 /* Used to distinguish DW_OP_addr with a direct symbol relocation
326 from DW_OP_addr with a dtp-relative symbol relocation. */
327 unsigned int dtprel
: 1;
328 /* For DW_OP_pick, DW_OP_dup and DW_OP_over operations: true iff.
329 it targets a DWARF prodecure argument. In this case, it needs to be
330 relocated according to the current frame offset. */
331 unsigned int frame_offset_rel
: 1;
333 dw_val_node dw_loc_oprnd1
;
334 dw_val_node dw_loc_oprnd2
;
337 /* A variant (inside a record variant part) is selected when the corresponding
338 discriminant matches its set of values (see the comment for dw_discr_value).
339 The following datastructure holds such matching information. */
341 struct GTY(()) dw_discr_list_node
{
342 dw_discr_list_ref dw_discr_next
;
344 dw_discr_value dw_discr_lower_bound
;
345 dw_discr_value dw_discr_upper_bound
;
346 /* This node represents only the value in dw_discr_lower_bound when it's
347 zero. It represents the range between the two fields (bounds included)
352 struct GTY((variable_size
)) dw_wide_int
{
353 unsigned int precision
;
355 HOST_WIDE_INT val
[1];
357 unsigned int get_precision () const { return precision
; }
358 unsigned int get_len () const { return len
; }
359 const HOST_WIDE_INT
*get_val () const { return val
; }
360 inline HOST_WIDE_INT
elt (unsigned int) const;
361 inline bool operator == (const dw_wide_int
&) const;
365 dw_wide_int::elt (unsigned int i
) const
369 wide_int_ref ref
= wi::storage_ref (val
, len
, precision
);
370 return wi::sign_mask (ref
);
374 dw_wide_int::operator == (const dw_wide_int
&o
) const
376 wide_int_ref ref1
= wi::storage_ref (val
, len
, precision
);
377 wide_int_ref ref2
= wi::storage_ref (o
.val
, o
.len
, o
.precision
);
381 /* Interface from dwarf2out.cc to dwarf2cfi.cc. */
382 extern struct dw_loc_descr_node
*build_cfa_loc
383 (dw_cfa_location
*, poly_int64
);
384 extern struct dw_loc_descr_node
*build_cfa_aligned_loc
385 (dw_cfa_location
*, poly_int64
, HOST_WIDE_INT
);
386 extern struct dw_loc_descr_node
*build_span_loc (struct cfa_reg
);
387 extern struct dw_loc_descr_node
*mem_loc_descriptor
388 (rtx
, machine_mode mode
, machine_mode mem_mode
,
389 enum var_init_status
);
390 extern bool loc_descr_equal_p (dw_loc_descr_ref
, dw_loc_descr_ref
);
391 extern dw_fde_ref
dwarf2out_alloc_current_fde (void);
393 extern unsigned long size_of_locs (dw_loc_descr_ref
);
394 extern void output_loc_sequence (dw_loc_descr_ref
, int);
395 extern void output_loc_sequence_raw (dw_loc_descr_ref
);
397 /* Interface from dwarf2cfi.cc to dwarf2out.cc. */
398 extern void lookup_cfa_1 (dw_cfi_ref cfi
, dw_cfa_location
*loc
,
399 dw_cfa_location
*remember
);
400 extern bool cfa_equal_p (const dw_cfa_location
*, const dw_cfa_location
*);
402 extern void output_cfi (dw_cfi_ref
, dw_fde_ref
, int);
404 extern GTY(()) cfi_vec cie_cfi_vec
;
406 /* Interface from dwarf2*.c to the rest of the compiler. */
407 extern enum dw_cfi_oprnd_type
dw_cfi_oprnd1_desc (dwarf_call_frame_info cfi
);
408 extern enum dw_cfi_oprnd_type
dw_cfi_oprnd2_desc (dwarf_call_frame_info cfi
);
410 extern void output_cfi_directive (FILE *f
, dw_cfi_ref cfi
);
412 extern void dwarf2out_emit_cfi (dw_cfi_ref cfi
);
414 extern void debug_dwarf (void);
416 extern void debug_dwarf_die (struct die_struct
*);
417 extern void debug_dwarf_loc_descr (dw_loc_descr_ref
);
418 extern void debug (die_struct
&ref
);
419 extern void debug (die_struct
*ptr
);
420 extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *));
421 #ifdef VMS_DEBUGGING_INFO
422 extern void dwarf2out_vms_debug_main_pointer (void);
425 enum array_descr_ordering
427 array_descr_ordering_default
,
428 array_descr_ordering_row_major
,
429 array_descr_ordering_column_major
432 #define DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN 16
434 struct array_descr_info
437 enum array_descr_ordering ordering
;
446 struct array_descr_dimen
448 /* GCC uses sizetype for array indices, so lower_bound and upper_bound
449 will likely be "sizetype" values. However, bounds may have another
450 type in the original source code. */
455 /* Only Fortran uses more than one dimension for array types. For other
456 languages, the stride can be rather specified for the whole array. */
458 } dimen
[DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN
];
461 enum fixed_point_scale_factor
463 fixed_point_scale_factor_binary
,
464 fixed_point_scale_factor_decimal
,
465 fixed_point_scale_factor_arbitrary
468 struct fixed_point_type_info
470 /* The scale factor is the value one has to multiply the actual data with
471 to get the fixed point value. We support three ways to encode it. */
472 enum fixed_point_scale_factor scale_factor_kind
;
475 /* For a binary scale factor, the scale factor is 2 ** binary. */
477 /* For a decimal scale factor, the scale factor is 10 ** decimal. */
479 /* For an arbitrary scale factor, the scale factor is the ratio
480 numerator / denominator. */
481 struct { tree numerator
; tree denominator
; } arbitrary
;
485 void dwarf2cfi_cc_finalize (void);
486 void dwarf2out_cc_finalize (void);
488 /* Some DWARF internals are exposed for the needs of DWARF-based debug
491 /* Each DIE attribute has a field specifying the attribute kind,
492 a link to the next attribute in the chain, and an attribute value.
493 Attributes are typically linked below the DIE they modify. */
495 typedef struct GTY(()) dw_attr_struct
{
496 enum dwarf_attribute dw_attr
;
497 dw_val_node dw_attr_val
;
501 extern dw_attr_node
*get_AT (dw_die_ref
, enum dwarf_attribute
);
502 extern HOST_WIDE_INT
AT_int (dw_attr_node
*);
503 extern unsigned HOST_WIDE_INT
AT_unsigned (dw_attr_node
*a
);
504 extern dw_loc_descr_ref
AT_loc (dw_attr_node
*);
505 extern dw_die_ref
get_AT_ref (dw_die_ref
, enum dwarf_attribute
);
506 extern const char *get_AT_string (dw_die_ref
, enum dwarf_attribute
);
507 extern enum dw_val_class
AT_class (dw_attr_node
*);
508 extern unsigned HOST_WIDE_INT
AT_unsigned (dw_attr_node
*);
509 extern unsigned get_AT_unsigned (dw_die_ref
, enum dwarf_attribute
);
510 extern int get_AT_flag (dw_die_ref
, enum dwarf_attribute
);
512 extern void add_name_attribute (dw_die_ref
, const char *);
514 extern dw_die_ref
new_die_raw (enum dwarf_tag
);
515 extern dw_die_ref
base_type_die (tree
, bool);
517 extern dw_die_ref
lookup_decl_die (tree
);
518 extern dw_die_ref
lookup_type_die (tree
);
520 extern dw_die_ref
dw_get_die_child (dw_die_ref
);
521 extern dw_die_ref
dw_get_die_sib (dw_die_ref
);
522 extern dw_die_ref
dw_get_die_parent (dw_die_ref
);
523 extern enum dwarf_tag
dw_get_die_tag (dw_die_ref
);
525 /* Data about a single source file. */
526 struct GTY((for_user
)) dwarf_file_data
{
528 const char * filename
;
532 extern struct dwarf_file_data
*get_AT_file (dw_die_ref
,
533 enum dwarf_attribute
);
535 #endif /* GCC_DWARF2OUT_H */