1 1.12 mrg /* dwarf2out.h - Various declarations for functions found in dwarf2out.cc 2 1.12 mrg Copyright (C) 1998-2022 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.12 mrg /* True if Rule 18 described in dwarf2cfi.cc 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.12 mrg /* True if this function is to be ignored by debugger. */ 118 1.12 mrg unsigned ignored_debug : 1; 119 1.5 mrg }; 120 1.3 mrg 121 1.3 mrg 122 1.12 mrg /* This represents a register, in DWARF_FRAME_REGNUM space, for use in CFA 123 1.12 mrg definitions and expressions. 124 1.12 mrg Most architectures only need a single register number, but some (amdgcn) 125 1.12 mrg have pointers that span multiple registers. DWARF permits arbitrary 126 1.12 mrg register sets but existing use-cases only require contiguous register 127 1.12 mrg sets, as represented here. */ 128 1.12 mrg struct GTY(()) cfa_reg { 129 1.12 mrg unsigned int reg; 130 1.12 mrg unsigned short span; 131 1.12 mrg unsigned short span_width; /* A.K.A. register mode size. */ 132 1.12 mrg 133 1.12 mrg cfa_reg& set_by_dwreg (unsigned int r) 134 1.12 mrg { 135 1.12 mrg reg = r; 136 1.12 mrg span = 1; 137 1.12 mrg span_width = 0; /* Unknown size (permitted when span == 1). */ 138 1.12 mrg return *this; 139 1.12 mrg } 140 1.12 mrg 141 1.12 mrg bool operator== (const cfa_reg &other) const 142 1.12 mrg { 143 1.12 mrg return (reg == other.reg && span == other.span 144 1.12 mrg && (span_width == other.span_width 145 1.12 mrg || (span == 1 146 1.12 mrg && (span_width == 0 || other.span_width == 0)))); 147 1.12 mrg } 148 1.12 mrg 149 1.12 mrg bool operator!= (const cfa_reg &other) const 150 1.12 mrg { 151 1.12 mrg return !(*this == other); 152 1.12 mrg } 153 1.12 mrg }; 154 1.12 mrg 155 1.3 mrg /* This is how we define the location of the CFA. We use to handle it 156 1.3 mrg as REG + OFFSET all the time, but now it can be more complex. 157 1.3 mrg It can now be either REG + CFA_OFFSET or *(REG + BASE_OFFSET) + CFA_OFFSET. 158 1.3 mrg Instead of passing around REG and OFFSET, we pass a copy 159 1.3 mrg of this structure. */ 160 1.5 mrg struct GTY(()) dw_cfa_location { 161 1.9 mrg poly_int64_pod offset; 162 1.9 mrg poly_int64_pod base_offset; 163 1.3 mrg /* REG is in DWARF_FRAME_REGNUM space, *not* normal REGNO space. */ 164 1.12 mrg struct cfa_reg reg; 165 1.3 mrg BOOL_BITFIELD indirect : 1; /* 1 if CFA is accessed via a dereference. */ 166 1.3 mrg BOOL_BITFIELD in_use : 1; /* 1 if a saved cfa is stored here. */ 167 1.5 mrg }; 168 1.3 mrg 169 1.3 mrg 170 1.3 mrg /* Each DIE may have a series of attribute/value pairs. Values 171 1.3 mrg can take on several forms. The forms that are used in this 172 1.3 mrg implementation are listed below. */ 173 1.3 mrg 174 1.3 mrg enum dw_val_class 175 1.3 mrg { 176 1.3 mrg dw_val_class_none, 177 1.3 mrg dw_val_class_addr, 178 1.3 mrg dw_val_class_offset, 179 1.3 mrg dw_val_class_loc, 180 1.3 mrg dw_val_class_loc_list, 181 1.3 mrg dw_val_class_range_list, 182 1.3 mrg dw_val_class_const, 183 1.3 mrg dw_val_class_unsigned_const, 184 1.3 mrg dw_val_class_const_double, 185 1.5 mrg dw_val_class_wide_int, 186 1.3 mrg dw_val_class_vec, 187 1.3 mrg dw_val_class_flag, 188 1.3 mrg dw_val_class_die_ref, 189 1.3 mrg dw_val_class_fde_ref, 190 1.3 mrg dw_val_class_lbl_id, 191 1.3 mrg dw_val_class_lineptr, 192 1.3 mrg dw_val_class_str, 193 1.3 mrg dw_val_class_macptr, 194 1.8 mrg dw_val_class_loclistsptr, 195 1.3 mrg dw_val_class_file, 196 1.3 mrg dw_val_class_data8, 197 1.3 mrg dw_val_class_decl_ref, 198 1.3 mrg dw_val_class_vms_delta, 199 1.6 mrg dw_val_class_high_pc, 200 1.6 mrg dw_val_class_discr_value, 201 1.8 mrg dw_val_class_discr_list, 202 1.8 mrg dw_val_class_const_implicit, 203 1.8 mrg dw_val_class_unsigned_const_implicit, 204 1.9 mrg dw_val_class_file_implicit, 205 1.9 mrg dw_val_class_view_list, 206 1.9 mrg dw_val_class_symview 207 1.3 mrg }; 208 1.3 mrg 209 1.3 mrg /* Describe a floating point constant value, or a vector constant value. */ 210 1.3 mrg 211 1.5 mrg struct GTY(()) dw_vec_const { 212 1.8 mrg void * GTY((atomic)) array; 213 1.3 mrg unsigned length; 214 1.3 mrg unsigned elt_size; 215 1.5 mrg }; 216 1.3 mrg 217 1.6 mrg /* Describe a single value that a discriminant can match. 218 1.6 mrg 219 1.6 mrg Discriminants (in the "record variant part" meaning) are scalars. 220 1.6 mrg dw_discr_list_ref and dw_discr_value are a mean to describe a set of 221 1.6 mrg discriminant values that are matched by a particular variant. 222 1.6 mrg 223 1.6 mrg Discriminants can be signed or unsigned scalars, and can be discriminants 224 1.6 mrg values. Both have to be consistent, though. */ 225 1.6 mrg 226 1.6 mrg struct GTY(()) dw_discr_value { 227 1.6 mrg int pos; /* Whether the discriminant value is positive (unsigned). */ 228 1.6 mrg union 229 1.6 mrg { 230 1.6 mrg HOST_WIDE_INT GTY ((tag ("0"))) sval; 231 1.6 mrg unsigned HOST_WIDE_INT GTY ((tag ("1"))) uval; 232 1.6 mrg } 233 1.6 mrg GTY ((desc ("%1.pos"))) v; 234 1.6 mrg }; 235 1.6 mrg 236 1.6 mrg struct addr_table_entry; 237 1.3 mrg 238 1.3 mrg /* The dw_val_node describes an attribute's value, as it is 239 1.3 mrg represented internally. */ 240 1.3 mrg 241 1.5 mrg struct GTY(()) dw_val_node { 242 1.3 mrg enum dw_val_class val_class; 243 1.6 mrg struct addr_table_entry * GTY(()) val_entry; 244 1.3 mrg union dw_val_struct_union 245 1.3 mrg { 246 1.3 mrg rtx GTY ((tag ("dw_val_class_addr"))) val_addr; 247 1.3 mrg unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_offset"))) val_offset; 248 1.3 mrg dw_loc_list_ref GTY ((tag ("dw_val_class_loc_list"))) val_loc_list; 249 1.9 mrg dw_die_ref GTY ((tag ("dw_val_class_view_list"))) val_view_list; 250 1.3 mrg dw_loc_descr_ref GTY ((tag ("dw_val_class_loc"))) val_loc; 251 1.3 mrg HOST_WIDE_INT GTY ((default)) val_int; 252 1.8 mrg unsigned HOST_WIDE_INT 253 1.8 mrg GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned; 254 1.3 mrg double_int GTY ((tag ("dw_val_class_const_double"))) val_double; 255 1.5 mrg wide_int_ptr GTY ((tag ("dw_val_class_wide_int"))) val_wide; 256 1.3 mrg dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec; 257 1.3 mrg struct dw_val_die_union 258 1.3 mrg { 259 1.3 mrg dw_die_ref die; 260 1.3 mrg int external; 261 1.3 mrg } GTY ((tag ("dw_val_class_die_ref"))) val_die_ref; 262 1.3 mrg unsigned GTY ((tag ("dw_val_class_fde_ref"))) val_fde_index; 263 1.3 mrg struct indirect_string_node * GTY ((tag ("dw_val_class_str"))) val_str; 264 1.3 mrg char * GTY ((tag ("dw_val_class_lbl_id"))) val_lbl_id; 265 1.3 mrg unsigned char GTY ((tag ("dw_val_class_flag"))) val_flag; 266 1.3 mrg struct dwarf_file_data * GTY ((tag ("dw_val_class_file"))) val_file; 267 1.8 mrg struct dwarf_file_data * 268 1.8 mrg GTY ((tag ("dw_val_class_file_implicit"))) val_file_implicit; 269 1.3 mrg unsigned char GTY ((tag ("dw_val_class_data8"))) val_data8[8]; 270 1.3 mrg tree GTY ((tag ("dw_val_class_decl_ref"))) val_decl_ref; 271 1.3 mrg struct dw_val_vms_delta_union 272 1.3 mrg { 273 1.3 mrg char * lbl1; 274 1.3 mrg char * lbl2; 275 1.3 mrg } GTY ((tag ("dw_val_class_vms_delta"))) val_vms_delta; 276 1.6 mrg dw_discr_value GTY ((tag ("dw_val_class_discr_value"))) val_discr_value; 277 1.6 mrg dw_discr_list_ref GTY ((tag ("dw_val_class_discr_list"))) val_discr_list; 278 1.9 mrg char * GTY ((tag ("dw_val_class_symview"))) val_symbolic_view; 279 1.3 mrg } 280 1.3 mrg GTY ((desc ("%1.val_class"))) v; 281 1.5 mrg }; 282 1.3 mrg 283 1.3 mrg /* Locations in memory are described using a sequence of stack machine 284 1.3 mrg operations. */ 285 1.3 mrg 286 1.5 mrg struct GTY((chain_next ("%h.dw_loc_next"))) dw_loc_descr_node { 287 1.3 mrg dw_loc_descr_ref dw_loc_next; 288 1.3 mrg ENUM_BITFIELD (dwarf_location_atom) dw_loc_opc : 8; 289 1.3 mrg /* Used to distinguish DW_OP_addr with a direct symbol relocation 290 1.3 mrg from DW_OP_addr with a dtp-relative symbol relocation. */ 291 1.3 mrg unsigned int dtprel : 1; 292 1.8 mrg /* For DW_OP_pick, DW_OP_dup and DW_OP_over operations: true iff. 293 1.8 mrg it targets a DWARF prodecure argument. In this case, it needs to be 294 1.8 mrg relocated according to the current frame offset. */ 295 1.6 mrg unsigned int frame_offset_rel : 1; 296 1.3 mrg int dw_loc_addr; 297 1.3 mrg dw_val_node dw_loc_oprnd1; 298 1.3 mrg dw_val_node dw_loc_oprnd2; 299 1.5 mrg }; 300 1.3 mrg 301 1.6 mrg /* A variant (inside a record variant part) is selected when the corresponding 302 1.6 mrg discriminant matches its set of values (see the comment for dw_discr_value). 303 1.6 mrg The following datastructure holds such matching information. */ 304 1.6 mrg 305 1.6 mrg struct GTY(()) dw_discr_list_node { 306 1.6 mrg dw_discr_list_ref dw_discr_next; 307 1.6 mrg 308 1.6 mrg dw_discr_value dw_discr_lower_bound; 309 1.6 mrg dw_discr_value dw_discr_upper_bound; 310 1.6 mrg /* This node represents only the value in dw_discr_lower_bound when it's 311 1.6 mrg zero. It represents the range between the two fields (bounds included) 312 1.6 mrg otherwise. */ 313 1.6 mrg int dw_discr_range; 314 1.6 mrg }; 315 1.3 mrg 316 1.12 mrg /* Interface from dwarf2out.cc to dwarf2cfi.cc. */ 317 1.5 mrg extern struct dw_loc_descr_node *build_cfa_loc 318 1.9 mrg (dw_cfa_location *, poly_int64); 319 1.5 mrg extern struct dw_loc_descr_node *build_cfa_aligned_loc 320 1.9 mrg (dw_cfa_location *, poly_int64, HOST_WIDE_INT); 321 1.12 mrg extern struct dw_loc_descr_node *build_span_loc (struct cfa_reg); 322 1.5 mrg extern struct dw_loc_descr_node *mem_loc_descriptor 323 1.5 mrg (rtx, machine_mode mode, machine_mode mem_mode, 324 1.3 mrg enum var_init_status); 325 1.3 mrg extern bool loc_descr_equal_p (dw_loc_descr_ref, dw_loc_descr_ref); 326 1.3 mrg extern dw_fde_ref dwarf2out_alloc_current_fde (void); 327 1.3 mrg 328 1.3 mrg extern unsigned long size_of_locs (dw_loc_descr_ref); 329 1.3 mrg extern void output_loc_sequence (dw_loc_descr_ref, int); 330 1.3 mrg extern void output_loc_sequence_raw (dw_loc_descr_ref); 331 1.3 mrg 332 1.12 mrg /* Interface from dwarf2cfi.cc to dwarf2out.cc. */ 333 1.3 mrg extern void lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_location *loc, 334 1.3 mrg dw_cfa_location *remember); 335 1.3 mrg extern bool cfa_equal_p (const dw_cfa_location *, const dw_cfa_location *); 336 1.3 mrg 337 1.3 mrg extern void output_cfi (dw_cfi_ref, dw_fde_ref, int); 338 1.3 mrg 339 1.3 mrg extern GTY(()) cfi_vec cie_cfi_vec; 340 1.3 mrg 341 1.3 mrg /* Interface from dwarf2*.c to the rest of the compiler. */ 342 1.3 mrg extern enum dw_cfi_oprnd_type dw_cfi_oprnd1_desc 343 1.3 mrg (enum dwarf_call_frame_info cfi); 344 1.3 mrg extern enum dw_cfi_oprnd_type dw_cfi_oprnd2_desc 345 1.3 mrg (enum dwarf_call_frame_info cfi); 346 1.3 mrg 347 1.5 mrg extern void output_cfi_directive (FILE *f, struct dw_cfi_node *cfi); 348 1.3 mrg 349 1.3 mrg extern void dwarf2out_emit_cfi (dw_cfi_ref cfi); 350 1.1 mrg 351 1.1 mrg extern void debug_dwarf (void); 352 1.1 mrg struct die_struct; 353 1.1 mrg extern void debug_dwarf_die (struct die_struct *); 354 1.5 mrg extern void debug_dwarf_loc_descr (dw_loc_descr_ref); 355 1.5 mrg extern void debug (die_struct &ref); 356 1.5 mrg extern void debug (die_struct *ptr); 357 1.1 mrg extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *)); 358 1.3 mrg #ifdef VMS_DEBUGGING_INFO 359 1.3 mrg extern void dwarf2out_vms_debug_main_pointer (void); 360 1.3 mrg #endif 361 1.1 mrg 362 1.5 mrg enum array_descr_ordering 363 1.5 mrg { 364 1.5 mrg array_descr_ordering_default, 365 1.5 mrg array_descr_ordering_row_major, 366 1.5 mrg array_descr_ordering_column_major 367 1.5 mrg }; 368 1.5 mrg 369 1.6 mrg #define DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN 16 370 1.6 mrg 371 1.1 mrg struct array_descr_info 372 1.1 mrg { 373 1.1 mrg int ndimensions; 374 1.5 mrg enum array_descr_ordering ordering; 375 1.1 mrg tree element_type; 376 1.1 mrg tree base_decl; 377 1.1 mrg tree data_location; 378 1.1 mrg tree allocated; 379 1.1 mrg tree associated; 380 1.6 mrg tree stride; 381 1.8 mrg tree rank; 382 1.6 mrg bool stride_in_bits; 383 1.1 mrg struct array_descr_dimen 384 1.1 mrg { 385 1.5 mrg /* GCC uses sizetype for array indices, so lower_bound and upper_bound 386 1.5 mrg will likely be "sizetype" values. However, bounds may have another 387 1.5 mrg type in the original source code. */ 388 1.5 mrg tree bounds_type; 389 1.1 mrg tree lower_bound; 390 1.1 mrg tree upper_bound; 391 1.6 mrg 392 1.6 mrg /* Only Fortran uses more than one dimension for array types. For other 393 1.6 mrg languages, the stride can be rather specified for the whole array. */ 394 1.1 mrg tree stride; 395 1.6 mrg } dimen[DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN]; 396 1.6 mrg }; 397 1.6 mrg 398 1.6 mrg enum fixed_point_scale_factor 399 1.6 mrg { 400 1.6 mrg fixed_point_scale_factor_binary, 401 1.6 mrg fixed_point_scale_factor_decimal, 402 1.6 mrg fixed_point_scale_factor_arbitrary 403 1.6 mrg }; 404 1.6 mrg 405 1.6 mrg struct fixed_point_type_info 406 1.6 mrg { 407 1.12 mrg /* The scale factor is the value one has to multiply the actual data with 408 1.12 mrg to get the fixed point value. We support three ways to encode it. */ 409 1.6 mrg enum fixed_point_scale_factor scale_factor_kind; 410 1.6 mrg union 411 1.6 mrg { 412 1.12 mrg /* For a binary scale factor, the scale factor is 2 ** binary. */ 413 1.6 mrg int binary; 414 1.12 mrg /* For a decimal scale factor, the scale factor is 10 ** decimal. */ 415 1.6 mrg int decimal; 416 1.12 mrg /* For an arbitrary scale factor, the scale factor is the ratio 417 1.6 mrg numerator / denominator. */ 418 1.12 mrg struct { tree numerator; tree denominator; } arbitrary; 419 1.6 mrg } scale_factor; 420 1.1 mrg }; 421 1.3 mrg 422 1.12 mrg void dwarf2out_cc_finalize (void); 423 1.12 mrg 424 1.12 mrg /* Some DWARF internals are exposed for the needs of DWARF-based debug 425 1.12 mrg formats. */ 426 1.12 mrg 427 1.12 mrg /* Each DIE attribute has a field specifying the attribute kind, 428 1.12 mrg a link to the next attribute in the chain, and an attribute value. 429 1.12 mrg Attributes are typically linked below the DIE they modify. */ 430 1.12 mrg 431 1.12 mrg typedef struct GTY(()) dw_attr_struct { 432 1.12 mrg enum dwarf_attribute dw_attr; 433 1.12 mrg dw_val_node dw_attr_val; 434 1.12 mrg } 435 1.12 mrg dw_attr_node; 436 1.12 mrg 437 1.12 mrg extern dw_attr_node *get_AT (dw_die_ref, enum dwarf_attribute); 438 1.12 mrg extern HOST_WIDE_INT AT_int (dw_attr_node *); 439 1.12 mrg extern unsigned HOST_WIDE_INT AT_unsigned (dw_attr_node *a); 440 1.12 mrg extern dw_loc_descr_ref AT_loc (dw_attr_node *); 441 1.12 mrg extern dw_die_ref get_AT_ref (dw_die_ref, enum dwarf_attribute); 442 1.12 mrg extern const char *get_AT_string (dw_die_ref, enum dwarf_attribute); 443 1.12 mrg extern enum dw_val_class AT_class (dw_attr_node *); 444 1.12 mrg extern unsigned HOST_WIDE_INT AT_unsigned (dw_attr_node *); 445 1.12 mrg extern unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute); 446 1.12 mrg extern int get_AT_flag (dw_die_ref, enum dwarf_attribute); 447 1.12 mrg 448 1.12 mrg extern void add_name_attribute (dw_die_ref, const char *); 449 1.12 mrg 450 1.12 mrg extern dw_die_ref new_die_raw (enum dwarf_tag); 451 1.12 mrg extern dw_die_ref base_type_die (tree, bool); 452 1.12 mrg 453 1.12 mrg extern dw_die_ref lookup_decl_die (tree); 454 1.12 mrg extern dw_die_ref lookup_type_die (tree); 455 1.12 mrg 456 1.12 mrg extern dw_die_ref dw_get_die_child (dw_die_ref); 457 1.12 mrg extern dw_die_ref dw_get_die_sib (dw_die_ref); 458 1.12 mrg extern enum dwarf_tag dw_get_die_tag (dw_die_ref); 459 1.12 mrg 460 1.12 mrg /* Data about a single source file. */ 461 1.12 mrg struct GTY((for_user)) dwarf_file_data { 462 1.12 mrg const char * key; 463 1.12 mrg const char * filename; 464 1.12 mrg int emitted_number; 465 1.12 mrg }; 466 1.12 mrg 467 1.12 mrg extern struct dwarf_file_data *get_AT_file (dw_die_ref, 468 1.12 mrg enum dwarf_attribute); 469 1.5 mrg 470 1.3 mrg #endif /* GCC_DWARF2OUT_H */ 471