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