Home | History | Annotate | Line # | Download | only in gcc
dwarf2out.h revision 1.6
      1  1.1  mrg /* dwarf2out.h - Various declarations for functions found in dwarf2out.c
      2  1.6  mrg    Copyright (C) 1998-2016 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.3  mrg   dw_cfi_oprnd_loc
     47  1.3  mrg };
     48  1.3  mrg 
     49  1.5  mrg typedef union GTY(()) {
     50  1.3  mrg   unsigned int GTY ((tag ("dw_cfi_oprnd_reg_num"))) dw_cfi_reg_num;
     51  1.3  mrg   HOST_WIDE_INT GTY ((tag ("dw_cfi_oprnd_offset"))) dw_cfi_offset;
     52  1.3  mrg   const char * GTY ((tag ("dw_cfi_oprnd_addr"))) dw_cfi_addr;
     53  1.5  mrg   struct dw_loc_descr_node * GTY ((tag ("dw_cfi_oprnd_loc"))) dw_cfi_loc;
     54  1.5  mrg } dw_cfi_oprnd;
     55  1.3  mrg 
     56  1.5  mrg struct GTY(()) dw_cfi_node {
     57  1.3  mrg   enum dwarf_call_frame_info dw_cfi_opc;
     58  1.3  mrg   dw_cfi_oprnd GTY ((desc ("dw_cfi_oprnd1_desc (%1.dw_cfi_opc)")))
     59  1.3  mrg     dw_cfi_oprnd1;
     60  1.3  mrg   dw_cfi_oprnd GTY ((desc ("dw_cfi_oprnd2_desc (%1.dw_cfi_opc)")))
     61  1.3  mrg     dw_cfi_oprnd2;
     62  1.5  mrg };
     63  1.3  mrg 
     64  1.3  mrg 
     65  1.3  mrg typedef vec<dw_cfi_ref, va_gc> *cfi_vec;
     66  1.3  mrg 
     67  1.5  mrg typedef struct dw_fde_node *dw_fde_ref;
     68  1.3  mrg 
     69  1.3  mrg /* All call frame descriptions (FDE's) in the GCC generated DWARF
     70  1.3  mrg    refer to a single Common Information Entry (CIE), defined at
     71  1.3  mrg    the beginning of the .debug_frame section.  This use of a single
     72  1.3  mrg    CIE obviates the need to keep track of multiple CIE's
     73  1.3  mrg    in the DWARF generation routines below.  */
     74  1.3  mrg 
     75  1.5  mrg struct GTY(()) dw_fde_node {
     76  1.3  mrg   tree decl;
     77  1.3  mrg   const char *dw_fde_begin;
     78  1.3  mrg   const char *dw_fde_current_label;
     79  1.3  mrg   const char *dw_fde_end;
     80  1.3  mrg   const char *dw_fde_vms_end_prologue;
     81  1.3  mrg   const char *dw_fde_vms_begin_epilogue;
     82  1.3  mrg   const char *dw_fde_second_begin;
     83  1.3  mrg   const char *dw_fde_second_end;
     84  1.3  mrg   cfi_vec dw_fde_cfi;
     85  1.3  mrg   int dw_fde_switch_cfi_index; /* Last CFI before switching sections.  */
     86  1.3  mrg   HOST_WIDE_INT stack_realignment;
     87  1.3  mrg 
     88  1.3  mrg   unsigned funcdef_number;
     89  1.3  mrg   unsigned fde_index;
     90  1.3  mrg 
     91  1.3  mrg   /* Dynamic realign argument pointer register.  */
     92  1.3  mrg   unsigned int drap_reg;
     93  1.3  mrg   /* Virtual dynamic realign argument pointer register.  */
     94  1.3  mrg   unsigned int vdrap_reg;
     95  1.3  mrg   /* These 3 flags are copied from rtl_data in function.h.  */
     96  1.3  mrg   unsigned all_throwers_are_sibcalls : 1;
     97  1.3  mrg   unsigned uses_eh_lsda : 1;
     98  1.3  mrg   unsigned nothrow : 1;
     99  1.3  mrg   /* Whether we did stack realign in this call frame.  */
    100  1.3  mrg   unsigned stack_realign : 1;
    101  1.3  mrg   /* Whether dynamic realign argument pointer register has been saved.  */
    102  1.3  mrg   unsigned drap_reg_saved: 1;
    103  1.3  mrg   /* True iff dw_fde_begin label is in text_section or cold_text_section.  */
    104  1.3  mrg   unsigned in_std_section : 1;
    105  1.3  mrg   /* True iff dw_fde_second_begin label is in text_section or
    106  1.3  mrg      cold_text_section.  */
    107  1.3  mrg   unsigned second_in_std_section : 1;
    108  1.5  mrg };
    109  1.3  mrg 
    110  1.3  mrg 
    111  1.3  mrg /* This is how we define the location of the CFA. We use to handle it
    112  1.3  mrg    as REG + OFFSET all the time,  but now it can be more complex.
    113  1.3  mrg    It can now be either REG + CFA_OFFSET or *(REG + BASE_OFFSET) + CFA_OFFSET.
    114  1.3  mrg    Instead of passing around REG and OFFSET, we pass a copy
    115  1.3  mrg    of this structure.  */
    116  1.5  mrg struct GTY(()) dw_cfa_location {
    117  1.3  mrg   HOST_WIDE_INT offset;
    118  1.3  mrg   HOST_WIDE_INT base_offset;
    119  1.3  mrg   /* REG is in DWARF_FRAME_REGNUM space, *not* normal REGNO space.  */
    120  1.3  mrg   unsigned int reg;
    121  1.3  mrg   BOOL_BITFIELD indirect : 1;  /* 1 if CFA is accessed via a dereference.  */
    122  1.3  mrg   BOOL_BITFIELD in_use : 1;    /* 1 if a saved cfa is stored here.  */
    123  1.5  mrg };
    124  1.3  mrg 
    125  1.3  mrg 
    126  1.3  mrg /* Each DIE may have a series of attribute/value pairs.  Values
    127  1.3  mrg    can take on several forms.  The forms that are used in this
    128  1.3  mrg    implementation are listed below.  */
    129  1.3  mrg 
    130  1.3  mrg enum dw_val_class
    131  1.3  mrg {
    132  1.3  mrg   dw_val_class_none,
    133  1.3  mrg   dw_val_class_addr,
    134  1.3  mrg   dw_val_class_offset,
    135  1.3  mrg   dw_val_class_loc,
    136  1.3  mrg   dw_val_class_loc_list,
    137  1.3  mrg   dw_val_class_range_list,
    138  1.3  mrg   dw_val_class_const,
    139  1.3  mrg   dw_val_class_unsigned_const,
    140  1.3  mrg   dw_val_class_const_double,
    141  1.5  mrg   dw_val_class_wide_int,
    142  1.3  mrg   dw_val_class_vec,
    143  1.3  mrg   dw_val_class_flag,
    144  1.3  mrg   dw_val_class_die_ref,
    145  1.3  mrg   dw_val_class_fde_ref,
    146  1.3  mrg   dw_val_class_lbl_id,
    147  1.3  mrg   dw_val_class_lineptr,
    148  1.3  mrg   dw_val_class_str,
    149  1.3  mrg   dw_val_class_macptr,
    150  1.3  mrg   dw_val_class_file,
    151  1.3  mrg   dw_val_class_data8,
    152  1.3  mrg   dw_val_class_decl_ref,
    153  1.3  mrg   dw_val_class_vms_delta,
    154  1.6  mrg   dw_val_class_high_pc,
    155  1.6  mrg   dw_val_class_discr_value,
    156  1.6  mrg   dw_val_class_discr_list
    157  1.3  mrg };
    158  1.3  mrg 
    159  1.3  mrg /* Describe a floating point constant value, or a vector constant value.  */
    160  1.3  mrg 
    161  1.5  mrg struct GTY(()) dw_vec_const {
    162  1.3  mrg   unsigned char * GTY((atomic)) array;
    163  1.3  mrg   unsigned length;
    164  1.3  mrg   unsigned elt_size;
    165  1.5  mrg };
    166  1.3  mrg 
    167  1.6  mrg /* Describe a single value that a discriminant can match.
    168  1.6  mrg 
    169  1.6  mrg    Discriminants (in the "record variant part" meaning) are scalars.
    170  1.6  mrg    dw_discr_list_ref and dw_discr_value are a mean to describe a set of
    171  1.6  mrg    discriminant values that are matched by a particular variant.
    172  1.6  mrg 
    173  1.6  mrg    Discriminants can be signed or unsigned scalars, and can be discriminants
    174  1.6  mrg    values.  Both have to be consistent, though.  */
    175  1.6  mrg 
    176  1.6  mrg struct GTY(()) dw_discr_value {
    177  1.6  mrg   int pos; /* Whether the discriminant value is positive (unsigned).  */
    178  1.6  mrg   union
    179  1.6  mrg     {
    180  1.6  mrg       HOST_WIDE_INT GTY ((tag ("0"))) sval;
    181  1.6  mrg       unsigned HOST_WIDE_INT GTY ((tag ("1"))) uval;
    182  1.6  mrg     }
    183  1.6  mrg   GTY ((desc ("%1.pos"))) v;
    184  1.6  mrg };
    185  1.6  mrg 
    186  1.6  mrg struct addr_table_entry;
    187  1.3  mrg 
    188  1.3  mrg /* The dw_val_node describes an attribute's value, as it is
    189  1.3  mrg    represented internally.  */
    190  1.3  mrg 
    191  1.5  mrg struct GTY(()) dw_val_node {
    192  1.3  mrg   enum dw_val_class val_class;
    193  1.6  mrg   struct addr_table_entry * GTY(()) val_entry;
    194  1.3  mrg   union dw_val_struct_union
    195  1.3  mrg     {
    196  1.3  mrg       rtx GTY ((tag ("dw_val_class_addr"))) val_addr;
    197  1.3  mrg       unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_offset"))) val_offset;
    198  1.3  mrg       dw_loc_list_ref GTY ((tag ("dw_val_class_loc_list"))) val_loc_list;
    199  1.3  mrg       dw_loc_descr_ref GTY ((tag ("dw_val_class_loc"))) val_loc;
    200  1.3  mrg       HOST_WIDE_INT GTY ((default)) val_int;
    201  1.3  mrg       unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned;
    202  1.3  mrg       double_int GTY ((tag ("dw_val_class_const_double"))) val_double;
    203  1.5  mrg       wide_int_ptr GTY ((tag ("dw_val_class_wide_int"))) val_wide;
    204  1.3  mrg       dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec;
    205  1.3  mrg       struct dw_val_die_union
    206  1.3  mrg 	{
    207  1.3  mrg 	  dw_die_ref die;
    208  1.3  mrg 	  int external;
    209  1.3  mrg 	} GTY ((tag ("dw_val_class_die_ref"))) val_die_ref;
    210  1.3  mrg       unsigned GTY ((tag ("dw_val_class_fde_ref"))) val_fde_index;
    211  1.3  mrg       struct indirect_string_node * GTY ((tag ("dw_val_class_str"))) val_str;
    212  1.3  mrg       char * GTY ((tag ("dw_val_class_lbl_id"))) val_lbl_id;
    213  1.3  mrg       unsigned char GTY ((tag ("dw_val_class_flag"))) val_flag;
    214  1.3  mrg       struct dwarf_file_data * GTY ((tag ("dw_val_class_file"))) val_file;
    215  1.3  mrg       unsigned char GTY ((tag ("dw_val_class_data8"))) val_data8[8];
    216  1.3  mrg       tree GTY ((tag ("dw_val_class_decl_ref"))) val_decl_ref;
    217  1.3  mrg       struct dw_val_vms_delta_union
    218  1.3  mrg 	{
    219  1.3  mrg 	  char * lbl1;
    220  1.3  mrg 	  char * lbl2;
    221  1.3  mrg 	} GTY ((tag ("dw_val_class_vms_delta"))) val_vms_delta;
    222  1.6  mrg       dw_discr_value GTY ((tag ("dw_val_class_discr_value"))) val_discr_value;
    223  1.6  mrg       dw_discr_list_ref GTY ((tag ("dw_val_class_discr_list"))) val_discr_list;
    224  1.3  mrg     }
    225  1.3  mrg   GTY ((desc ("%1.val_class"))) v;
    226  1.5  mrg };
    227  1.3  mrg 
    228  1.3  mrg /* Locations in memory are described using a sequence of stack machine
    229  1.3  mrg    operations.  */
    230  1.3  mrg 
    231  1.5  mrg struct GTY((chain_next ("%h.dw_loc_next"))) dw_loc_descr_node {
    232  1.3  mrg   dw_loc_descr_ref dw_loc_next;
    233  1.3  mrg   ENUM_BITFIELD (dwarf_location_atom) dw_loc_opc : 8;
    234  1.3  mrg   /* Used to distinguish DW_OP_addr with a direct symbol relocation
    235  1.3  mrg      from DW_OP_addr with a dtp-relative symbol relocation.  */
    236  1.3  mrg   unsigned int dtprel : 1;
    237  1.6  mrg   /* For DW_OP_pick operations: true iff. it targets a DWARF prodecure
    238  1.6  mrg      argument.  In this case, it needs to be relocated according to the current
    239  1.6  mrg      frame offset.  */
    240  1.6  mrg   unsigned int frame_offset_rel : 1;
    241  1.3  mrg   int dw_loc_addr;
    242  1.6  mrg #if CHECKING_P
    243  1.6  mrg   /* When translating a function into a DWARF procedure, contains the frame
    244  1.6  mrg      offset *before* evaluating this operation.  It is -1 when not yet
    245  1.6  mrg      initialized.  */
    246  1.6  mrg   int dw_loc_frame_offset;
    247  1.6  mrg #endif
    248  1.3  mrg   dw_val_node dw_loc_oprnd1;
    249  1.3  mrg   dw_val_node dw_loc_oprnd2;
    250  1.5  mrg };
    251  1.3  mrg 
    252  1.6  mrg /* A variant (inside a record variant part) is selected when the corresponding
    253  1.6  mrg    discriminant matches its set of values (see the comment for dw_discr_value).
    254  1.6  mrg    The following datastructure holds such matching information.  */
    255  1.6  mrg 
    256  1.6  mrg struct GTY(()) dw_discr_list_node {
    257  1.6  mrg   dw_discr_list_ref dw_discr_next;
    258  1.6  mrg 
    259  1.6  mrg   dw_discr_value dw_discr_lower_bound;
    260  1.6  mrg   dw_discr_value dw_discr_upper_bound;
    261  1.6  mrg   /* This node represents only the value in dw_discr_lower_bound when it's
    262  1.6  mrg      zero.  It represents the range between the two fields (bounds included)
    263  1.6  mrg      otherwise.  */
    264  1.6  mrg   int dw_discr_range;
    265  1.6  mrg };
    266  1.3  mrg 
    267  1.3  mrg /* Interface from dwarf2out.c to dwarf2cfi.c.  */
    268  1.5  mrg extern struct dw_loc_descr_node *build_cfa_loc
    269  1.3  mrg   (dw_cfa_location *, HOST_WIDE_INT);
    270  1.5  mrg extern struct dw_loc_descr_node *build_cfa_aligned_loc
    271  1.3  mrg   (dw_cfa_location *, HOST_WIDE_INT offset, HOST_WIDE_INT alignment);
    272  1.5  mrg extern struct dw_loc_descr_node *mem_loc_descriptor
    273  1.5  mrg   (rtx, machine_mode mode, machine_mode mem_mode,
    274  1.3  mrg    enum var_init_status);
    275  1.3  mrg extern bool loc_descr_equal_p (dw_loc_descr_ref, dw_loc_descr_ref);
    276  1.3  mrg extern dw_fde_ref dwarf2out_alloc_current_fde (void);
    277  1.3  mrg 
    278  1.3  mrg extern unsigned long size_of_locs (dw_loc_descr_ref);
    279  1.3  mrg extern void output_loc_sequence (dw_loc_descr_ref, int);
    280  1.3  mrg extern void output_loc_sequence_raw (dw_loc_descr_ref);
    281  1.3  mrg 
    282  1.3  mrg /* Interface from dwarf2cfi.c to dwarf2out.c.  */
    283  1.3  mrg extern void lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_location *loc,
    284  1.3  mrg 			  dw_cfa_location *remember);
    285  1.3  mrg extern bool cfa_equal_p (const dw_cfa_location *, const dw_cfa_location *);
    286  1.3  mrg 
    287  1.3  mrg extern void output_cfi (dw_cfi_ref, dw_fde_ref, int);
    288  1.3  mrg 
    289  1.3  mrg extern GTY(()) cfi_vec cie_cfi_vec;
    290  1.3  mrg 
    291  1.3  mrg /* Interface from dwarf2*.c to the rest of the compiler.  */
    292  1.3  mrg extern enum dw_cfi_oprnd_type dw_cfi_oprnd1_desc
    293  1.3  mrg   (enum dwarf_call_frame_info cfi);
    294  1.3  mrg extern enum dw_cfi_oprnd_type dw_cfi_oprnd2_desc
    295  1.3  mrg   (enum dwarf_call_frame_info cfi);
    296  1.3  mrg 
    297  1.5  mrg extern void output_cfi_directive (FILE *f, struct dw_cfi_node *cfi);
    298  1.3  mrg 
    299  1.3  mrg extern void dwarf2out_emit_cfi (dw_cfi_ref cfi);
    300  1.1  mrg 
    301  1.1  mrg extern void debug_dwarf (void);
    302  1.1  mrg struct die_struct;
    303  1.1  mrg extern void debug_dwarf_die (struct die_struct *);
    304  1.5  mrg extern void debug_dwarf_loc_descr (dw_loc_descr_ref);
    305  1.5  mrg extern void debug (die_struct &ref);
    306  1.5  mrg extern void debug (die_struct *ptr);
    307  1.1  mrg extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *));
    308  1.3  mrg #ifdef VMS_DEBUGGING_INFO
    309  1.3  mrg extern void dwarf2out_vms_debug_main_pointer (void);
    310  1.3  mrg #endif
    311  1.1  mrg 
    312  1.5  mrg enum array_descr_ordering
    313  1.5  mrg {
    314  1.5  mrg   array_descr_ordering_default,
    315  1.5  mrg   array_descr_ordering_row_major,
    316  1.5  mrg   array_descr_ordering_column_major
    317  1.5  mrg };
    318  1.5  mrg 
    319  1.6  mrg #define DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN 16
    320  1.6  mrg 
    321  1.1  mrg struct array_descr_info
    322  1.1  mrg {
    323  1.1  mrg   int ndimensions;
    324  1.5  mrg   enum array_descr_ordering ordering;
    325  1.1  mrg   tree element_type;
    326  1.1  mrg   tree base_decl;
    327  1.1  mrg   tree data_location;
    328  1.1  mrg   tree allocated;
    329  1.1  mrg   tree associated;
    330  1.6  mrg   tree stride;
    331  1.6  mrg   bool stride_in_bits;
    332  1.1  mrg   struct array_descr_dimen
    333  1.1  mrg     {
    334  1.5  mrg       /* GCC uses sizetype for array indices, so lower_bound and upper_bound
    335  1.5  mrg 	 will likely be "sizetype" values. However, bounds may have another
    336  1.5  mrg 	 type in the original source code.  */
    337  1.5  mrg       tree bounds_type;
    338  1.1  mrg       tree lower_bound;
    339  1.1  mrg       tree upper_bound;
    340  1.6  mrg 
    341  1.6  mrg       /* Only Fortran uses more than one dimension for array types.  For other
    342  1.6  mrg 	 languages, the stride can be rather specified for the whole array.  */
    343  1.1  mrg       tree stride;
    344  1.6  mrg     } dimen[DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN];
    345  1.6  mrg };
    346  1.6  mrg 
    347  1.6  mrg enum fixed_point_scale_factor
    348  1.6  mrg {
    349  1.6  mrg   fixed_point_scale_factor_binary,
    350  1.6  mrg   fixed_point_scale_factor_decimal,
    351  1.6  mrg   fixed_point_scale_factor_arbitrary
    352  1.6  mrg };
    353  1.6  mrg 
    354  1.6  mrg struct fixed_point_type_info
    355  1.6  mrg {
    356  1.6  mrg   /* A scale factor is the value one has to multiply with physical data in
    357  1.6  mrg      order to get the fixed point logical data.  The DWARF standard enables one
    358  1.6  mrg      to encode it in three ways.  */
    359  1.6  mrg   enum fixed_point_scale_factor scale_factor_kind;
    360  1.6  mrg   union
    361  1.6  mrg     {
    362  1.6  mrg       /* For binary scale factor, the scale factor is: 2 ** binary.  */
    363  1.6  mrg       int binary;
    364  1.6  mrg       /* For decimal scale factor, the scale factor is: 10 ** binary.  */
    365  1.6  mrg       int decimal;
    366  1.6  mrg       /* For arbitrary scale factor, the scale factor is:
    367  1.6  mrg 	 numerator / denominator.  */
    368  1.6  mrg       struct
    369  1.6  mrg 	{
    370  1.6  mrg 	  unsigned HOST_WIDE_INT numerator;
    371  1.6  mrg 	  HOST_WIDE_INT denominator;
    372  1.6  mrg 	} arbitrary;
    373  1.6  mrg     } scale_factor;
    374  1.1  mrg };
    375  1.3  mrg 
    376  1.5  mrg void dwarf2out_c_finalize (void);
    377  1.5  mrg 
    378  1.3  mrg #endif /* GCC_DWARF2OUT_H */
    379