(root)/
gcc-13.2.0/
gcc/
ctfc.h
       1  /* ctfc.h - Declarations and definitions related to the CTF container.
       2     Copyright (C) 2019-2023 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  /* This file defines the data structures and functions used by the compiler
      21     to generate the CTF debug info.  The definitions below are compiler internal
      22     representations and closely reflect the CTF format requirements in <ctf.h>.
      23  
      24     The contents of the CTF container are used eventually for emission of both
      25     CTF (ctfout.cc) and BTF debug info (btfout.cc), as the two type debug formats
      26     are close cousins.  */
      27  
      28  #ifndef GCC_CTFC_H
      29  #define GCC_CTFC_H 1
      30  
      31  #include "config.h"
      32  #include "system.h"
      33  #include "tree.h"
      34  #include "fold-const.h"
      35  #include "dwarf2ctf.h"
      36  #include "ctf.h"
      37  #include "btf.h"
      38  
      39  /* Invalid CTF type ID definition.  */
      40  
      41  #define CTF_NULL_TYPEID 0
      42  
      43  /* Value to start generating the CTF type ID from.  */
      44  
      45  #define CTF_INIT_TYPEID 1
      46  
      47  /* CTF type ID.  */
      48  
      49  typedef uint64_t ctf_id_t;
      50  
      51  /* CTF string table element (list node).  */
      52  
      53  typedef struct GTY ((chain_next ("%h.cts_next"))) ctf_string
      54  {
      55    const char * cts_str;		  /* CTF string.  */
      56    struct ctf_string * cts_next;   /* A list node.  */
      57  } ctf_string_t;
      58  
      59  /* Internal representation of CTF string table.  */
      60  
      61  typedef struct GTY (()) ctf_strtable
      62  {
      63    ctf_string_t * ctstab_head;	    /* Head str ptr.  */
      64    ctf_string_t * ctstab_tail;	    /* Tail.  new str appended to tail.  */
      65    int ctstab_num;		    /* Number of strings in the table.  */
      66    size_t ctstab_len;		    /* Size of string table in bytes.  */
      67    const char * ctstab_estr;	    /* Empty string "".  */
      68  } ctf_strtable_t;
      69  
      70  /* Encoding information for integers, floating-point values etc.  The flags
      71     field will contain values appropriate for the type defined in <ctf.h>.  */
      72  
      73  typedef struct GTY (()) ctf_encoding
      74  {
      75    unsigned int cte_format;  /* Data format (CTF_INT_* or CTF_FP_* flags).  */
      76    unsigned int cte_offset;  /* Offset of value in bits.  */
      77    unsigned int cte_bits;    /* Size of storage in bits.  */
      78  } ctf_encoding_t;
      79  
      80  /* Array information for CTF generation.  */
      81  
      82  typedef struct GTY (()) ctf_arinfo
      83  {
      84    ctf_id_t ctr_contents;	/* Type of array contents.  */
      85    ctf_id_t ctr_index;		/* Type of array index.  */
      86    unsigned int ctr_nelems;	/* Number of elements.  */
      87  } ctf_arinfo_t;
      88  
      89  /* Function information for CTF generation.  */
      90  
      91  typedef struct GTY (()) ctf_funcinfo
      92  {
      93    ctf_id_t ctc_return;		/* Function return type.  */
      94    unsigned int ctc_argc;	/* Number of typed arguments to function.  */
      95    unsigned int ctc_flags;	/* Function attributes (see below).  */
      96  } ctf_funcinfo_t;
      97  
      98  typedef struct GTY (()) ctf_sliceinfo
      99  {
     100    unsigned int cts_type;	/* Reference CTF type.  */
     101    unsigned short cts_offset;	/* Offset in bits of the first bit.  */
     102    unsigned short cts_bits;	/* Size in bits.  */
     103  } ctf_sliceinfo_t;
     104  
     105  /* CTF type representation internal to the compiler.  It closely reflects the
     106     ctf_type_t type node in <ctf.h> except the GTY (()) tags.  */
     107  
     108  typedef struct GTY (()) ctf_itype
     109  {
     110    uint32_t ctti_name;		/* Reference to name in string table.  */
     111    uint32_t ctti_info;		/* Encoded kind, variant length (see below).  */
     112    union GTY ((desc ("0")))
     113    {
     114      uint32_t GTY ((tag ("0"))) _size;/* Size of entire type in bytes.  */
     115      uint32_t GTY ((tag ("1"))) _type;/* Reference to another type.  */
     116    } _u;
     117    uint32_t ctti_lsizehi;	/* High 32 bits of type size in bytes.  */
     118    uint32_t ctti_lsizelo;	/* Low 32 bits of type size in bytes.  */
     119  } ctf_itype_t;
     120  
     121  #define ctti_size _u._size
     122  #define ctti_type _u._type
     123  
     124  /* Function arguments end with varargs.  */
     125  
     126  #define CTF_FUNC_VARARG 0x1
     127  
     128  /* Struct/union/enum member definition for CTF generation.  */
     129  
     130  typedef struct GTY ((chain_next ("%h.dmd_next"))) ctf_dmdef
     131  {
     132    const char * dmd_name;	/* Name of this member.  */
     133    ctf_id_t dmd_type;		/* Type of this member (for sou).  */
     134    uint32_t dmd_name_offset;	/* Offset of the name in str table.  */
     135    uint64_t dmd_offset;		/* Offset of this member in bits (for sou).  */
     136    HOST_WIDE_INT dmd_value;	/* Value of this member (for enum).  */
     137    struct ctf_dmdef * dmd_next;	/* A list node.  */
     138  } ctf_dmdef_t;
     139  
     140  #define ctf_dmd_list_next(elem) ((ctf_dmdef_t *)((elem)->dmd_next))
     141  
     142  /* Function Argument.  */
     143  
     144  typedef struct GTY (()) ctf_func_arg
     145  {
     146    ctf_id_t farg_type;		  /* Type identifier of the argument.  */
     147    const char * farg_name;	  /* Name of the argument.  */
     148    uint32_t farg_name_offset;	  /* Offset of the name in str table.  */
     149    struct ctf_func_arg * farg_next;/* A list node.  */
     150  } ctf_func_arg_t;
     151  
     152  #define ctf_farg_list_next(elem) ((ctf_func_arg_t *)((elem)->farg_next))
     153  
     154  /* Type definition for CTF generation.  */
     155  
     156  struct GTY ((for_user)) ctf_dtdef
     157  {
     158    dw_die_ref dtd_key;	      /* Type key for hashing.  */
     159    const char * dtd_name;      /* Name associated with definition (if any).  */
     160    ctf_id_t dtd_type;	      /* Type identifier for this definition.  */
     161    ctf_itype_t dtd_data;	      /* Type node.  */
     162    bool from_global_func; /* Whether this type was added from a global
     163  			    function.  */
     164    uint32_t linkage;           /* Used in function types.  0=local, 1=global.  */
     165    bool dtd_enum_unsigned;     /* Enum signedness.  */
     166    union GTY ((desc ("ctf_dtu_d_union_selector (&%1)")))
     167    {
     168      /* struct, union, or enum.  */
     169      ctf_dmdef_t * GTY ((tag ("CTF_DTU_D_MEMBERS"))) dtu_members;
     170      /* array.  */
     171      ctf_arinfo_t GTY ((tag ("CTF_DTU_D_ARRAY"))) dtu_arr;
     172      /* integer or float.  */
     173      ctf_encoding_t GTY ((tag ("CTF_DTU_D_ENCODING"))) dtu_enc;
     174      /* function.  */
     175      ctf_func_arg_t * GTY ((tag ("CTF_DTU_D_ARGUMENTS"))) dtu_argv;
     176      /* slice.  */
     177      ctf_sliceinfo_t GTY ((tag ("CTF_DTU_D_SLICE"))) dtu_slice;
     178    } dtd_u;
     179  };
     180  
     181  typedef struct ctf_dtdef ctf_dtdef_t;
     182  
     183  /* Variable definition for CTF generation.  */
     184  
     185  struct GTY ((for_user)) ctf_dvdef
     186  {
     187    dw_die_ref dvd_key;		/* DWARF DIE corresponding to the variable.  */
     188    const char * dvd_name;	/* Name associated with variable.  */
     189    uint32_t dvd_name_offset;	/* Offset of the name in str table.  */
     190    unsigned int dvd_visibility;	/* External visibility.  0=static,1=global.  */
     191    ctf_id_t dvd_type;		/* Type of variable.  */
     192  };
     193  
     194  typedef struct ctf_dvdef ctf_dvdef_t;
     195  
     196  typedef ctf_dvdef_t * ctf_dvdef_ref;
     197  typedef ctf_dtdef_t * ctf_dtdef_ref;
     198  
     199  /* Location information for CTF Types and CTF Variables.  */
     200  
     201  typedef struct GTY (()) ctf_srcloc
     202  {
     203    const char * ctsloc_file;
     204    unsigned int ctsloc_line;
     205    unsigned int ctsloc_col;
     206  } ctf_srcloc_t;
     207  
     208  typedef ctf_srcloc_t * ctf_srcloc_ref;
     209  
     210  /* Helper enum and api for the GTY machinery to work on union dtu_d.  */
     211  
     212  enum ctf_dtu_d_union_enum {
     213    CTF_DTU_D_MEMBERS,
     214    CTF_DTU_D_ARRAY,
     215    CTF_DTU_D_ENCODING,
     216    CTF_DTU_D_ARGUMENTS,
     217    CTF_DTU_D_SLICE
     218  };
     219  
     220  enum ctf_dtu_d_union_enum
     221  ctf_dtu_d_union_selector (ctf_dtdef_ref);
     222  
     223  struct ctfc_dtd_hasher : ggc_ptr_hash <ctf_dtdef_t>
     224  {
     225    typedef ctf_dtdef_ref compare_type;
     226  
     227    static hashval_t hash (ctf_dtdef_ref);
     228    static bool equal (ctf_dtdef_ref, ctf_dtdef_ref);
     229  };
     230  
     231  inline hashval_t
     232  ctfc_dtd_hasher::hash (ctf_dtdef_ref dtd)
     233  {
     234    return htab_hash_pointer (dtd->dtd_key);
     235  }
     236  
     237  inline bool
     238  ctfc_dtd_hasher::equal (ctf_dtdef_ref dtd, ctf_dtdef_ref dtd2)
     239  {
     240    return (dtd->dtd_key == dtd2->dtd_key);
     241  }
     242  
     243  struct ctfc_dvd_hasher : ggc_ptr_hash <ctf_dvdef_t>
     244  {
     245    typedef ctf_dvdef_ref compare_type;
     246  
     247    static hashval_t hash (ctf_dvdef_ref);
     248    static bool equal (ctf_dvdef_ref, ctf_dvdef_ref);
     249  };
     250  
     251  inline hashval_t
     252  ctfc_dvd_hasher::hash (ctf_dvdef_ref dvd)
     253  {
     254    return htab_hash_pointer (dvd->dvd_key);
     255  }
     256  
     257  inline bool
     258  ctfc_dvd_hasher::equal (ctf_dvdef_ref dvd, ctf_dvdef_ref dvd2)
     259  {
     260    return (dvd->dvd_key == dvd2->dvd_key);
     261  }
     262  
     263  /* CTF container structure.
     264     It is the context passed around when generating ctf debug info.  There is
     265     one container per translation unit.  */
     266  
     267  typedef struct GTY (()) ctf_container
     268  {
     269    /* CTF Preamble.  */
     270    unsigned short ctfc_magic;
     271    unsigned char ctfc_version;
     272    unsigned char ctfc_flags;
     273    uint32_t ctfc_cuname_offset;
     274  
     275    /* CTF types.  */
     276    hash_table <ctfc_dtd_hasher> * GTY (()) ctfc_types;
     277    /* CTF variables.  */
     278    hash_table <ctfc_dvd_hasher> * GTY (()) ctfc_vars;
     279    /* CTF variables to be ignored.  */
     280    hash_table <ctfc_dvd_hasher> * GTY (()) ctfc_ignore_vars;
     281  
     282    /* CTF string table.  */
     283    ctf_strtable_t ctfc_strtable;
     284    /* Auxilliary string table.  At this time, used for keeping func arg names
     285       for BTF.  */
     286    ctf_strtable_t ctfc_aux_strtable;
     287  
     288    uint64_t ctfc_num_types;
     289    uint64_t ctfc_num_stypes;
     290    uint64_t ctfc_num_global_funcs;
     291    uint64_t ctfc_num_global_objts;
     292  
     293    /* Number of vlen bytes - the variable length portion after ctf_type_t and
     294       ctf_stype_t in the CTF section.  This is used to calculate the offsets in
     295       the CTF header.  */
     296    uint64_t ctfc_num_vlen_bytes;
     297  
     298    /* Next CTF type id to assign.  */
     299    ctf_id_t ctfc_nextid;
     300  
     301    /* Specify an explicit length of 0 so that the GC marking routines steer
     302       clear of marking the CTF vars and CTF types twice. These lists below do
     303       not own the pointed to objects, they simply hold references to them.  */
     304  
     305    /* List of pre-processed CTF Variables.  CTF requires that the variables
     306       appear in the sorted order of their names.  */
     307    ctf_dvdef_t ** GTY ((length ("0"))) ctfc_vars_list;
     308    /* Count of pre-processed CTF Variables in the list.  */
     309    uint64_t ctfc_vars_list_count;
     310    /* List of pre-processed CTF types.  CTF requires that a shared type must
     311       appear before the type that uses it.  For the compiler, this means types
     312       are emitted in sorted order of their type IDs.  */
     313    ctf_dtdef_t ** GTY ((length ("0"))) ctfc_types_list;
     314    /* List of CTF function types for global functions.  The order of global
     315       function entries in the CTF funcinfo section is undefined by the
     316       compiler.  */
     317    ctf_dtdef_t ** GTY ((length ("0"))) ctfc_gfuncs_list;
     318    /* List of CTF variables at global scope.  The order of global object entries
     319       in the CTF objinfo section is undefined by the  compiler.  */
     320    ctf_dvdef_t ** GTY ((length ("0"))) ctfc_gobjts_list;
     321  
     322    /* Following members are for debugging only.  They do not add functional
     323       value to the task of CTF creation.  These can be cleaned up once CTF
     324       generation stabilizes.  */
     325  
     326    /* Keep a count of the number of bytes dumped in asm for debugging
     327       purposes.  */
     328    uint64_t ctfc_numbytes_asm;
     329     /* Total length of all strings in CTF.  */
     330    size_t ctfc_strlen;
     331    /* Total length of all strings in aux string table.  */
     332    size_t ctfc_aux_strlen;
     333  
     334  } ctf_container_t;
     335  
     336  /* Markers for which string table from the CTF container to use.  */
     337  
     338  #define CTF_STRTAB 0	    /* CTF string table.  */
     339  #define CTF_AUX_STRTAB 1    /* CTF auxilliary string table.  */
     340  
     341  typedef ctf_container_t * ctf_container_ref;
     342  
     343  extern GTY (()) ctf_container_ref tu_ctfc;
     344  
     345  extern void ctfc_delete_container (ctf_container_ref);
     346  
     347  /* If the next ctf type id is still set to the init value, no ctf records to
     348     report.  */
     349  extern bool ctfc_is_empty_container (ctf_container_ref);
     350  
     351  /* Get the total number of CTF types in the container.  */
     352  
     353  extern unsigned int ctfc_get_num_ctf_types (ctf_container_ref);
     354  
     355  /* Get the total number of CTF variables in the container.  */
     356  
     357  extern unsigned int ctfc_get_num_ctf_vars (ctf_container_ref);
     358  
     359  /* Get reference to the CTF string table or the CTF auxilliary
     360     string table.  */
     361  
     362  extern ctf_strtable_t * ctfc_get_strtab (ctf_container_ref, int);
     363  
     364  /* Get the length of the specified string table in the CTF container.  */
     365  
     366  extern size_t ctfc_get_strtab_len (ctf_container_ref, int);
     367  
     368  /* Get the number of bytes to represent the variable length portion of all CTF
     369     types in the CTF container.  */
     370  
     371  extern size_t ctfc_get_num_vlen_bytes (ctf_container_ref);
     372  
     373  /* The compiler demarcates whether types are visible at top-level scope or not.
     374     The only example so far of a type not visible at top-level scope is slices.
     375     CTF_ADD_NONROOT is used to indicate the latter.  */
     376  #define	CTF_ADD_NONROOT	0	/* CTF type only visible in nested scope.  */
     377  #define	CTF_ADD_ROOT	1	/* CTF type visible at top-level scope.  */
     378  
     379  /* These APIs allow to initialize and finalize the CTF machinery and
     380     to add types to the CTF container associated to the current
     381     translation unit.  Used in dwarf2ctf.cc.  */
     382  
     383  extern void ctf_init (void);
     384  extern void ctf_output (const char * filename);
     385  extern void ctf_finalize (void);
     386  
     387  extern void btf_output (const char * filename);
     388  extern void btf_init_postprocess (void);
     389  extern void btf_finalize (void);
     390  
     391  extern ctf_container_ref ctf_get_tu_ctfc (void);
     392  
     393  extern bool ctf_type_exists (ctf_container_ref, dw_die_ref, ctf_id_t *);
     394  
     395  extern void ctf_add_cuname (ctf_container_ref, const char *);
     396  
     397  extern ctf_dtdef_ref ctf_dtd_lookup (const ctf_container_ref ctfc,
     398  				     dw_die_ref die);
     399  extern ctf_dvdef_ref ctf_dvd_lookup (const ctf_container_ref ctfc,
     400  				     dw_die_ref die);
     401  extern bool ctf_dvd_ignore_lookup (const ctf_container_ref ctfc,
     402  				   dw_die_ref die);
     403  
     404  extern const char * ctf_add_string (ctf_container_ref, const char *,
     405  				    uint32_t *, int);
     406  
     407  extern ctf_id_t ctf_add_reftype (ctf_container_ref, uint32_t, ctf_id_t,
     408  				 uint32_t, dw_die_ref);
     409  extern ctf_id_t ctf_add_enum (ctf_container_ref, uint32_t, const char *,
     410  			      HOST_WIDE_INT, bool, dw_die_ref);
     411  extern ctf_id_t ctf_add_slice (ctf_container_ref, uint32_t, ctf_id_t,
     412  			       uint32_t, uint32_t, dw_die_ref);
     413  extern ctf_id_t ctf_add_float (ctf_container_ref, uint32_t, const char *,
     414  			       const ctf_encoding_t *, dw_die_ref);
     415  extern ctf_id_t ctf_add_integer (ctf_container_ref, uint32_t, const char *,
     416  				 const ctf_encoding_t *, dw_die_ref);
     417  extern ctf_id_t ctf_add_unknown (ctf_container_ref, uint32_t, const char *,
     418  				 const ctf_encoding_t *, dw_die_ref);
     419  extern ctf_id_t ctf_add_pointer (ctf_container_ref, uint32_t, ctf_id_t,
     420  				 dw_die_ref);
     421  extern ctf_id_t ctf_add_array (ctf_container_ref, uint32_t,
     422  			       const ctf_arinfo_t *, dw_die_ref);
     423  extern ctf_id_t ctf_add_forward (ctf_container_ref, uint32_t, const char *,
     424  				 uint32_t, dw_die_ref);
     425  extern ctf_id_t ctf_add_typedef (ctf_container_ref, uint32_t, const char *,
     426  				 ctf_id_t, dw_die_ref);
     427  extern ctf_id_t ctf_add_function (ctf_container_ref, uint32_t, const char *,
     428  				  const ctf_funcinfo_t *, dw_die_ref, bool, int);
     429  extern ctf_id_t ctf_add_sou (ctf_container_ref, uint32_t, const char *,
     430  			     uint32_t, size_t, dw_die_ref);
     431  
     432  extern int ctf_add_enumerator (ctf_container_ref, ctf_id_t, const char *,
     433  			       HOST_WIDE_INT, dw_die_ref);
     434  extern int ctf_add_member_offset (ctf_container_ref, dw_die_ref, const char *,
     435  				  ctf_id_t, uint64_t);
     436  extern int ctf_add_function_arg (ctf_container_ref, dw_die_ref,
     437  				 const char *, ctf_id_t);
     438  extern int ctf_add_variable (ctf_container_ref, const char *, ctf_id_t,
     439  			     dw_die_ref, unsigned int, dw_die_ref);
     440  
     441  extern ctf_id_t ctf_lookup_tree_type (ctf_container_ref, const tree);
     442  extern ctf_id_t get_btf_id (ctf_id_t);
     443  
     444  /* CTF section does not emit location information; at this time, location
     445     information is needed for BTF CO-RE use-cases.  */
     446  
     447  extern int ctfc_get_dtd_srcloc (ctf_dtdef_ref, ctf_srcloc_ref);
     448  extern int ctfc_get_dvd_srcloc (ctf_dvdef_ref, ctf_srcloc_ref);
     449  
     450  #endif /* GCC_CTFC_H */