LCOV - code coverage report
Current view: top level - gcc - ctfc.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 92.6 % 445 412
Test Date: 2025-10-18 14:39:06 Functions: 92.2 % 51 47
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Generate CTF.
       2                 :             :    Copyright (C) 2019-2025 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                 :             : #include "config.h"
      21                 :             : #include "system.h"
      22                 :             : #include "coretypes.h"
      23                 :             : #include "target.h"
      24                 :             : #include "toplev.h"
      25                 :             : #include "ctfc.h"
      26                 :             : #include "diagnostic-core.h"
      27                 :             : 
      28                 :             : /* A CTF container object - one per translation unit.  */
      29                 :             : 
      30                 :             : ctf_container_ref tu_ctfc;
      31                 :             : 
      32                 :             : ctf_container_ref
      33                 :        3244 : ctf_get_tu_ctfc (void)
      34                 :             : {
      35                 :        3244 :   return tu_ctfc;
      36                 :             : }
      37                 :             : 
      38                 :             : /* If the next ctf type id is still set to the init value, no ctf records to
      39                 :             :    report.  */
      40                 :             : bool
      41                 :         428 : ctfc_is_empty_container (ctf_container_ref ctfc)
      42                 :             : {
      43                 :         428 :   return ((ctfc)->ctfc_nextid == CTF_INIT_TYPEID);
      44                 :             : }
      45                 :             : 
      46                 :             : /* Get the total number of CTF types in the container.  */
      47                 :             : 
      48                 :             : unsigned int
      49                 :         318 : ctfc_get_num_ctf_types (ctf_container_ref ctfc)
      50                 :             : {
      51                 :         318 :   return ctfc->ctfc_types->elements ();
      52                 :             : }
      53                 :             : 
      54                 :             : /* Get the total number of CTF variables in the container.  */
      55                 :             : 
      56                 :         318 : unsigned int ctfc_get_num_ctf_vars (ctf_container_ref ctfc)
      57                 :             : {
      58                 :         318 :   return ctfc->ctfc_vars->elements ();
      59                 :             : }
      60                 :             : 
      61                 :             : /* Get reference to the CTF string table or the CTF auxilliary
      62                 :             :    string table.  */
      63                 :             : 
      64                 :             : ctf_strtable_t *
      65                 :        3314 : ctfc_get_strtab (ctf_container_ref ctfc, int aux)
      66                 :             : {
      67                 :        3314 :   return aux ? &(ctfc)->ctfc_aux_strtable : &(ctfc->ctfc_strtable);
      68                 :             : }
      69                 :             : 
      70                 :             : /* Get the length of the specified string table of the CTF container.  */
      71                 :             : 
      72                 :             : size_t
      73                 :         481 : ctfc_get_strtab_len (ctf_container_ref ctfc, int aux)
      74                 :             : {
      75                 :         481 :   ctf_strtable_t * strtab = ctfc_get_strtab (ctfc, aux);
      76                 :         481 :   return strtab->ctstab_len;
      77                 :             : }
      78                 :             : 
      79                 :             : /* Get the number of bytes to represent the variable length portion of all CTF
      80                 :             :    types in the CTF container.  */
      81                 :             : 
      82                 :         318 : size_t ctfc_get_num_vlen_bytes (ctf_container_ref ctfc)
      83                 :             : {
      84                 :         318 :   return ctfc->ctfc_num_vlen_bytes;
      85                 :             : }
      86                 :             : 
      87                 :             : /* Return which member of the union is used in CTFTYPE.  Used for garbage
      88                 :             :    collection.  */
      89                 :             : 
      90                 :             : enum ctf_dtu_d_union_enum
      91                 :           0 : ctf_dtu_d_union_selector (ctf_dtdef_ref ctftype)
      92                 :             : {
      93                 :           0 :   uint32_t kind = CTF_V2_INFO_KIND (ctftype->dtd_data.ctti_info);
      94                 :           0 :   switch (kind)
      95                 :             :     {
      96                 :             :     case CTF_K_UNKNOWN:
      97                 :             :     case CTF_K_INTEGER:
      98                 :             :     case CTF_K_FLOAT:
      99                 :             :       return CTF_DTU_D_ENCODING;
     100                 :             :     case CTF_K_STRUCT:
     101                 :             :     case CTF_K_UNION:
     102                 :             :     case CTF_K_ENUM:
     103                 :             :       return CTF_DTU_D_MEMBERS;
     104                 :             :     case CTF_K_ARRAY:
     105                 :             :       return CTF_DTU_D_ARRAY;
     106                 :             :     case CTF_K_FUNCTION:
     107                 :             :       return CTF_DTU_D_ARGUMENTS;
     108                 :             :     case CTF_K_SLICE:
     109                 :             :       return CTF_DTU_D_SLICE;
     110                 :             :     case CTF_K_DECL_TAG:
     111                 :             :     case CTF_K_TYPE_TAG:
     112                 :             :       return CTF_DTU_D_TAG;
     113                 :             :     default:
     114                 :             :       /* The largest member as default.  */
     115                 :             :       return CTF_DTU_D_ARRAY;
     116                 :             :     }
     117                 :             : }
     118                 :             : 
     119                 :             : /* Insert CTF type into the CTF container.  */
     120                 :             : 
     121                 :             : static void
     122                 :        1653 : ctf_dtd_insert (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
     123                 :             : {
     124                 :        1653 :   bool existed = false;
     125                 :        1653 :   ctf_dtdef_ref entry = dtd;
     126                 :             : 
     127                 :        1653 :   ctf_dtdef_ref * item = ctfc->ctfc_types->find_slot (entry, INSERT);
     128                 :        1653 :   if (*item == NULL)
     129                 :        1653 :      *item = dtd;
     130                 :             :   else
     131                 :             :     existed = true;
     132                 :             :   /* Duplicate CTF type records not expected to be inserted.  */
     133                 :        1653 :   gcc_assert (!existed);
     134                 :        1653 : }
     135                 :             : 
     136                 :             : /* Lookup CTF type given a DWARF die for the type.  */
     137                 :             : 
     138                 :             : ctf_dtdef_ref
     139                 :        5409 : ctf_dtd_lookup (const ctf_container_ref ctfc, const dw_die_ref type)
     140                 :             : {
     141                 :        5409 :   ctf_dtdef_t entry;
     142                 :        5409 :   entry.dtd_key = type;
     143                 :             : 
     144                 :        5409 :   ctf_dtdef_ref * slot = ctfc->ctfc_types->find_slot (&entry, NO_INSERT);
     145                 :             : 
     146                 :        5409 :   if (slot)
     147                 :        2079 :     return (ctf_dtdef_ref)*slot;
     148                 :             : 
     149                 :             :   return NULL;
     150                 :             : }
     151                 :             : 
     152                 :             : /* Insert CTF variable into the CTF container.  */
     153                 :             : 
     154                 :             : static void
     155                 :         275 : ctf_dvd_insert (ctf_container_ref ctfc, ctf_dvdef_ref dvd)
     156                 :             : {
     157                 :         275 :   bool existed = false;
     158                 :         275 :   ctf_dvdef_ref entry = dvd;
     159                 :             : 
     160                 :         275 :   ctf_dvdef_ref * item = ctfc->ctfc_vars->find_slot (entry, INSERT);
     161                 :         275 :   if (*item == NULL)
     162                 :         275 :      *item = dvd;
     163                 :             :   else
     164                 :             :     existed = true;
     165                 :             :   /* Duplicate variable records not expected to be inserted.  */
     166                 :         275 :   gcc_assert (!existed);
     167                 :         275 : }
     168                 :             : 
     169                 :             : /* Lookup CTF variable given a DWARF die for the decl.  */
     170                 :             : 
     171                 :             : ctf_dvdef_ref
     172                 :         378 : ctf_dvd_lookup (const ctf_container_ref ctfc, dw_die_ref die)
     173                 :             : {
     174                 :         378 :   ctf_dvdef_t entry;
     175                 :         378 :   entry.dvd_key = die;
     176                 :             : 
     177                 :         378 :   ctf_dvdef_ref * slot = ctfc->ctfc_vars->find_slot (&entry, NO_INSERT);
     178                 :             : 
     179                 :         378 :   if (slot)
     180                 :         103 :     return (ctf_dvdef_ref)*slot;
     181                 :             : 
     182                 :             :   return NULL;
     183                 :             : }
     184                 :             : 
     185                 :             : /* Insert a dummy CTF variable into the list of variables to be ignored.  */
     186                 :             : 
     187                 :             : static void
     188                 :           2 : ctf_dvd_ignore_insert (ctf_container_ref ctfc, ctf_dvdef_ref dvd)
     189                 :             : {
     190                 :           2 :   bool existed = false;
     191                 :           2 :   ctf_dvdef_ref entry = dvd;
     192                 :             : 
     193                 :           2 :   ctf_dvdef_ref * item = ctfc->ctfc_ignore_vars->find_slot (entry, INSERT);
     194                 :           2 :   if (*item == NULL)
     195                 :           2 :      *item = dvd;
     196                 :             :   else
     197                 :             :     existed = true;
     198                 :             :   /* Duplicate variable records not expected to be inserted.  */
     199                 :           2 :   gcc_assert (!existed);
     200                 :           2 : }
     201                 :             : 
     202                 :             : /* Lookup the dummy CTF variable given the DWARF die for the non-defining
     203                 :             :    decl to be ignored.  */
     204                 :             : 
     205                 :             : bool
     206                 :         549 : ctf_dvd_ignore_lookup (const ctf_container_ref ctfc, dw_die_ref die)
     207                 :             : {
     208                 :         549 :   ctf_dvdef_t entry;
     209                 :         549 :   entry.dvd_key = die;
     210                 :             : 
     211                 :         549 :   ctf_dvdef_ref * slot = ctfc->ctfc_ignore_vars->find_slot (&entry, NO_INSERT);
     212                 :             : 
     213                 :         549 :   if (slot)
     214                 :           1 :     return true;
     215                 :             : 
     216                 :             :   return false;
     217                 :             : }
     218                 :             : 
     219                 :             : /* Append member definition to the list.  Member list is a singly-linked list
     220                 :             :    with list start pointing to the head.  */
     221                 :             : 
     222                 :             : static void
     223                 :         282 : ctf_dmd_list_append (ctf_dmdef_t ** dmd, ctf_dmdef_t * elem)
     224                 :             : {
     225                 :         282 :   ctf_dmdef_t * tail = (dmd && *dmd) ? *dmd : NULL;
     226                 :             :   if (tail)
     227                 :             :     {
     228                 :         251 :       while (tail->dmd_next)
     229                 :             :         tail = tail->dmd_next;
     230                 :             : 
     231                 :         159 :       tail->dmd_next = elem;
     232                 :             :     }
     233                 :             :   else
     234                 :         123 :     *dmd = elem;
     235                 :             : 
     236                 :         282 :   elem->dmd_next = NULL;
     237                 :         282 : }
     238                 :             : 
     239                 :             : /* Append function argument to the list.  Member list is a singly-linked list
     240                 :             :    with list start pointing to the head.  */
     241                 :             : 
     242                 :             : static void
     243                 :         144 : ctf_farg_list_append (ctf_func_arg_t ** farg, ctf_func_arg_t * elem)
     244                 :             : {
     245                 :         144 :   ctf_func_arg_t * tail = (farg && *farg) ? *farg : NULL;
     246                 :             :   if (tail)
     247                 :             :     {
     248                 :          60 :       while (tail->farg_next)
     249                 :             :         tail = tail->farg_next;
     250                 :             : 
     251                 :          51 :       tail->farg_next = elem;
     252                 :             :     }
     253                 :             :   else
     254                 :          93 :     *farg = elem;
     255                 :             : 
     256                 :         144 :   elem->farg_next = NULL;
     257                 :         144 : }
     258                 :             : 
     259                 :             : /* Append str to the CTF string table.  */
     260                 :             : 
     261                 :             : static void
     262                 :        3273 : ctfc_strtable_append_str (ctf_strtable_t * str_table, const char * str)
     263                 :             : {
     264                 :        3273 :   ctf_string_t * ctf_string = ggc_cleared_alloc<ctf_string_t> ();
     265                 :             :   /* Keep a reference to the input STR.  */
     266                 :        3273 :   ctf_string->cts_str = str;
     267                 :        3273 :   ctf_string->cts_next = NULL;
     268                 :             : 
     269                 :        3273 :   if (!str_table->ctstab_head)
     270                 :         861 :     str_table->ctstab_head = ctf_string;
     271                 :             : 
     272                 :             :   /* Append to the end of the list.  */
     273                 :        3273 :   if (str_table->ctstab_tail)
     274                 :        2412 :     str_table->ctstab_tail->cts_next = ctf_string;
     275                 :             : 
     276                 :        3273 :   str_table->ctstab_tail = ctf_string;
     277                 :        3273 : }
     278                 :             : 
     279                 :             : /* Wrapper function to add str to the CTF string table.  No de-duplication of
     280                 :             :    CTF strings is done by the compiler.  */
     281                 :             : 
     282                 :             : static const char *
     283                 :        3694 : ctfc_strtable_add_str (ctf_strtable_t * str_table, const char * name,
     284                 :             :                       uint32_t * name_offset)
     285                 :             : {
     286                 :        3694 :   size_t len;
     287                 :        3694 :   char * ctf_string;
     288                 :             :   /* Return value is the offset to the string in the string table.  */
     289                 :        3694 :   uint32_t str_offset = str_table->ctstab_len;
     290                 :             : 
     291                 :             :   /* Add empty string only once at the beginning of the string table.  Also, do
     292                 :             :      not add null strings, return the offset to the empty string for them.  */
     293                 :        3694 :   if ((!name || (name != NULL && !strcmp (name, ""))) && str_offset)
     294                 :             :     {
     295                 :         421 :       ctf_string = CONST_CAST (char *, str_table->ctstab_estr);
     296                 :         421 :       str_offset = 0;
     297                 :             :     }
     298                 :             :   else
     299                 :             :     {
     300                 :         861 :       gcc_assert (name);
     301                 :             :       /* Add null-terminated strings to the string table.  */
     302                 :        3273 :       len = strlen (name) + 1;
     303                 :        3273 :       ctf_string = CONST_CAST (char *, ggc_strdup (name));
     304                 :             : 
     305                 :        3273 :       ctfc_strtable_append_str (str_table, ctf_string);
     306                 :             :       /* Add string to the string table.  Keep number of strings updated.  */
     307                 :        3273 :       str_table->ctstab_num++;
     308                 :             :       /* Keep the number of bytes contained in the string table updated.  */
     309                 :        3273 :       str_table->ctstab_len += len;
     310                 :             :     }
     311                 :             : 
     312                 :        3694 :   *name_offset = str_offset;
     313                 :             : 
     314                 :        3694 :   return (const char *) ctf_string;
     315                 :             : 
     316                 :             : }
     317                 :             : 
     318                 :             : /* Add string to the appropriate string table in the CTF container.  */
     319                 :             : 
     320                 :             : const char *
     321                 :        2833 : ctf_add_string (ctf_container_ref ctfc, const char * name,
     322                 :             :                 uint32_t * name_offset, int aux_str = CTF_STRTAB)
     323                 :             : {
     324                 :             :   /* Get the CTF string table or the CTF auxilliary string table,
     325                 :             :      as applicable.  */
     326                 :        2833 :   ctf_strtable_t *str_table = ctfc_get_strtab (ctfc, aux_str);
     327                 :        2833 :   return ctfc_strtable_add_str (str_table, name, name_offset);
     328                 :             : }
     329                 :             : 
     330                 :             : /* Add the compilation unit (CU) name string to the CTF string table.  The
     331                 :             :    CU name has a prepended pwd string if it is a relative path.  Also set the
     332                 :             :    CU name offset in the CTF container.  */
     333                 :             : 
     334                 :             : void
     335                 :         318 : ctf_add_cuname (ctf_container_ref ctfc, const char * filename)
     336                 :             : {
     337                 :         318 :   char * cuname = NULL;
     338                 :             : 
     339                 :             :   /* (filename at this point of compilation cannot be null).  */
     340                 :             : 
     341                 :         318 :   if (!IS_DIR_SEPARATOR (filename[0]))
     342                 :             :     {
     343                 :             :       /* Filename is a relative path.  */
     344                 :           0 :       const char * cu_pwd = get_src_pwd ();
     345                 :           0 :       const int cu_pwd_len = strlen (cu_pwd);
     346                 :             : 
     347                 :             :       /* Add a DIR_SEPARATOR char before the filename.  */
     348                 :           0 :       const int len = cu_pwd_len + 2 + strlen (filename);
     349                 :             : 
     350                 :           0 :       cuname = (char *) ggc_alloc_atomic (len);
     351                 :           0 :       memset (cuname, 0, len);
     352                 :             : 
     353                 :           0 :       strcpy (cuname, cu_pwd);
     354                 :           0 :       cuname[cu_pwd_len] = DIR_SEPARATOR;
     355                 :           0 :       cuname[cu_pwd_len+1] = 0;
     356                 :           0 :       strcat (cuname, filename);
     357                 :             :     }
     358                 :             :   else
     359                 :             :     /* Filename is an absolute path.  */
     360                 :         318 :     cuname = CONST_CAST (char *, ggc_strdup (filename));
     361                 :             : 
     362                 :         318 :   ctf_add_string (ctfc, cuname, &(ctfc->ctfc_cuname_offset));
     363                 :             :   /* Add 1 as CTF strings in the CTF string table are null-terminated
     364                 :             :      strings.  */
     365                 :         318 :   ctfc->ctfc_strlen += strlen (cuname) + 1;
     366                 :             : 
     367                 :             :   /* Mark cuname for garbage collection.  */
     368                 :         318 :   cuname = NULL;
     369                 :         318 : }
     370                 :             : 
     371                 :             : /* Functions to create CTF types.
     372                 :             : 
     373                 :             :    These functions perform the task of adding CTF types to the CTF container.
     374                 :             :    No de-duplication is done by them; the onus is on the calling function to do
     375                 :             :    so.  The caller must first do a lookup via ctf_dtd_lookup or
     376                 :             :    ctf_dvd_lookup, as applicable, to ascertain that the CTF type or the CTF
     377                 :             :    variable respectively does not already exist, and then add it.  */
     378                 :             : 
     379                 :             : static ctf_dtdef_ref
     380                 :        1653 : ctf_add_generic (ctf_container_ref ctfc, uint32_t flag, const char * name,
     381                 :             :                  dw_die_ref die)
     382                 :             : {
     383                 :        1653 :   ctf_dtdef_ref dtd;
     384                 :        1653 :   ctf_id_t type;
     385                 :             : 
     386                 :        1653 :   gcc_assert (flag == CTF_ADD_NONROOT || flag == CTF_ADD_ROOT);
     387                 :             : 
     388                 :        1653 :   dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
     389                 :             : 
     390                 :        1653 :   type = ctfc->ctfc_nextid++;
     391                 :        1653 :   gcc_assert (type < CTF_MAX_TYPE); /* CTF type ID overflow.  */
     392                 :             : 
     393                 :             :   /* Buffer the strings in the CTF string table.  */
     394                 :        1653 :   dtd->dtd_name = ctf_add_string (ctfc, name, &(dtd->dtd_data.ctti_name));
     395                 :        1653 :   dtd->dtd_type = type;
     396                 :        1653 :   dtd->dtd_key = die;
     397                 :             : 
     398                 :        1653 :   if ((name != NULL) && strcmp (name, ""))
     399                 :        1288 :     ctfc->ctfc_strlen += strlen (name) + 1;
     400                 :             : 
     401                 :        1653 :   ctf_dtd_insert (ctfc, dtd);
     402                 :             : 
     403                 :        1653 :   return dtd;
     404                 :             : }
     405                 :             : 
     406                 :             : static ctf_dtdef_ref
     407                 :         678 : ctf_add_encoded (ctf_container_ref ctfc, uint32_t flag, const char * name,
     408                 :             :                  const ctf_encoding_t * ep, uint32_t kind, dw_die_ref die)
     409                 :             : {
     410                 :         678 :   ctf_dtdef_ref dtd;
     411                 :             : 
     412                 :         678 :   dtd = ctf_add_generic (ctfc, flag, name, die);
     413                 :             : 
     414                 :         678 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, flag, 0);
     415                 :             : 
     416                 :         678 :   uint32_t roundup_nbytes = (ROUND_UP (ep->cte_bits, BITS_PER_UNIT)
     417                 :             :                                     / BITS_PER_UNIT);
     418                 :             : 
     419                 :             :   /* FIXME, stay close to what libctf does.  But by getting next power of two,
     420                 :             :      aren't we conveying less precise information.  E.g. floating point mode
     421                 :             :      XF has a size of 12 bytes.  */
     422                 :        1212 :   dtd->dtd_data.ctti_size = roundup_nbytes ? (1 << ceil_log2 (roundup_nbytes))
     423                 :             :                            : roundup_nbytes;
     424                 :         678 :   dtd->dtd_u.dtu_enc = *ep;
     425                 :             : 
     426                 :         678 :   ctfc->ctfc_num_stypes++;
     427                 :             : 
     428                 :         678 :   return dtd;
     429                 :             : }
     430                 :             : 
     431                 :             : ctf_dtdef_ref
     432                 :         216 : ctf_add_reftype (ctf_container_ref ctfc, uint32_t flag, ctf_dtdef_ref ref,
     433                 :             :                  uint32_t kind, dw_die_ref die)
     434                 :             : {
     435                 :         216 :   ctf_dtdef_ref dtd;
     436                 :             : 
     437                 :         216 :   gcc_assert (ref != NULL);
     438                 :             : 
     439                 :         216 :   dtd = ctf_add_generic (ctfc, flag, NULL, die);
     440                 :         216 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, flag, 0);
     441                 :             :   /* Caller of this API must guarantee that a CTF type with id = ref already
     442                 :             :      exists.  This will also be validated for us at link-time.  */
     443                 :         216 :   dtd->dtd_data.ctti_type = (uint32_t) ref->dtd_type;
     444                 :         216 :   dtd->ref_type = ref;
     445                 :             : 
     446                 :         216 :   ctfc->ctfc_num_stypes++;
     447                 :             : 
     448                 :         216 :   return dtd;
     449                 :             : }
     450                 :             : 
     451                 :             : ctf_dtdef_ref
     452                 :          13 : ctf_add_type_tag (ctf_container_ref ctfc, uint32_t flag, const char *value,
     453                 :             :                   ctf_dtdef_ref ref_dtd)
     454                 :             : {
     455                 :          13 :   ctf_dtdef_ref dtd;
     456                 :             :    /* Create a DTD for the tag, but do not place it in the regular types list;
     457                 :             :       CTF format does not (yet) encode tags.  */
     458                 :          13 :   dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
     459                 :             : 
     460                 :          13 :   dtd->dtd_name = ctf_add_string (ctfc, value, &(dtd->dtd_data.ctti_name),
     461                 :             :                                   CTF_AUX_STRTAB);
     462                 :             :   /* A single DW_TAG_GNU_annotation DIE may be referenced by multiple DIEs,
     463                 :             :      e.g. when multiple distinct types specify the same type tag.  We will
     464                 :             :      synthesize multiple CTF DTD records in that case, so we cannot tie them
     465                 :             :      all to the same key (the DW_TAG_GNU_annotation DIE) in ctfc_types.  */
     466                 :          13 :   dtd->dtd_key = NULL;
     467                 :          13 :   dtd->ref_type = ref_dtd;
     468                 :          13 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_TYPE_TAG, flag, 0);
     469                 :          13 :   dtd->dtd_u.dtu_tag.ref_var = NULL; /* Not used for type tags.  */
     470                 :          13 :   dtd->dtd_u.dtu_tag.component_idx = 0; /* Not used for type tags.  */
     471                 :             : 
     472                 :             :   /* Insert tag directly into the tag list.  Type ID will be assigned later.  */
     473                 :          13 :   vec_safe_push (ctfc->ctfc_tags, dtd);
     474                 :             : 
     475                 :             :   /* Keep ctfc_aux_strlen updated.  */
     476                 :          13 :   if ((value != NULL) && strcmp (value, ""))
     477                 :          13 :     ctfc->ctfc_aux_strlen += strlen (value) + 1;
     478                 :             : 
     479                 :          13 :   return dtd;
     480                 :             : }
     481                 :             : 
     482                 :             : ctf_dtdef_ref
     483                 :          19 : ctf_add_decl_tag (ctf_container_ref ctfc, uint32_t flag, const char *value,
     484                 :             :                   ctf_dtdef_ref ref_dtd, uint32_t comp_idx)
     485                 :             : {
     486                 :          19 :    ctf_dtdef_ref dtd;
     487                 :             :    /* Create a DTD for the tag, but do not place it in the regular types list;
     488                 :             :       ctf format does not (yet) encode tags.  */
     489                 :          19 :   dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
     490                 :             : 
     491                 :          19 :   dtd->dtd_name = ctf_add_string (ctfc, value, &(dtd->dtd_data.ctti_name),
     492                 :             :                                   CTF_AUX_STRTAB);
     493                 :             :   /* A single DW_TAG_GNU_annotation DIE may be referenced by multiple DIEs,
     494                 :             :      e.g. when multiple distinct declarations specify the same decl tag.
     495                 :             :      We will synthesize multiple CTF DTD records in that case, so we cannot tie
     496                 :             :      them all to the same key (the DW_TAG_GNU_annotation DIE) in ctfc_types.  */
     497                 :          19 :   dtd->dtd_key = NULL;
     498                 :          19 :   dtd->ref_type = ref_dtd;
     499                 :          19 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_DECL_TAG, flag, 0);
     500                 :          19 :   dtd->dtd_u.dtu_tag.ref_var = NULL;
     501                 :          19 :   dtd->dtd_u.dtu_tag.component_idx = comp_idx;
     502                 :             : 
     503                 :             :   /* Insert tag directly into the tag list.  Type ID will be assigned later.  */
     504                 :          19 :   vec_safe_push (ctfc->ctfc_tags, dtd);
     505                 :             : 
     506                 :             :   /* Keep ctfc_aux_strlen updated.  */
     507                 :          19 :   if ((value != NULL) && strcmp (value, ""))
     508                 :          19 :     ctfc->ctfc_aux_strlen += strlen (value) + 1;
     509                 :             : 
     510                 :          19 :   return dtd;
     511                 :             : }
     512                 :             : 
     513                 :             : ctf_dtdef_ref
     514                 :          12 : ctf_add_forward (ctf_container_ref ctfc, uint32_t flag, const char * name,
     515                 :             :                  uint32_t kind, dw_die_ref die)
     516                 :             : {
     517                 :          12 :   ctf_dtdef_ref dtd;
     518                 :             : 
     519                 :          12 :   dtd = ctf_add_generic (ctfc, flag, name, die);
     520                 :             : 
     521                 :          12 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
     522                 :          12 :   dtd->dtd_data.ctti_type = kind;
     523                 :             : 
     524                 :          12 :   ctfc->ctfc_num_stypes++;
     525                 :             : 
     526                 :          12 :   return dtd;
     527                 :             : }
     528                 :             : 
     529                 :             : ctf_dtdef_ref
     530                 :          58 : ctf_add_typedef (ctf_container_ref ctfc, uint32_t flag, const char * name,
     531                 :             :                  ctf_dtdef_ref ref, dw_die_ref die)
     532                 :             : {
     533                 :          58 :   ctf_dtdef_ref dtd;
     534                 :             : 
     535                 :          58 :   gcc_assert (ref != NULL);
     536                 :             :   /* Nameless Typedefs are not expected.  */
     537                 :          58 :   gcc_assert ((name != NULL) && strcmp (name, ""));
     538                 :             : 
     539                 :          58 :   dtd = ctf_add_generic (ctfc, flag, name, die);
     540                 :          58 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
     541                 :          58 :   dtd->dtd_data.ctti_type = (uint32_t) ref->dtd_type;
     542                 :          58 :   dtd->ref_type = ref;
     543                 :             : 
     544                 :          58 :   gcc_assert (dtd->dtd_type != dtd->dtd_data.ctti_type);
     545                 :             : 
     546                 :          58 :   ctfc->ctfc_num_stypes++;
     547                 :             : 
     548                 :          58 :   return dtd;
     549                 :             : }
     550                 :             : 
     551                 :             : ctf_dtdef_ref
     552                 :          22 : ctf_add_slice (ctf_container_ref ctfc, uint32_t flag, ctf_dtdef_ref ref,
     553                 :             :                uint32_t bit_offset, uint32_t bit_size, dw_die_ref die)
     554                 :             : {
     555                 :          22 :   ctf_dtdef_ref dtd;
     556                 :          22 :   uint32_t roundup_nbytes;
     557                 :             : 
     558                 :          22 :   gcc_assert ((bit_size <= 255) && (bit_offset <= 255));
     559                 :             : 
     560                 :          22 :   gcc_assert (ref != NULL);
     561                 :             : 
     562                 :          22 :   dtd = ctf_add_generic (ctfc, flag, NULL, die);
     563                 :             : 
     564                 :          22 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
     565                 :             : 
     566                 :          22 :   roundup_nbytes = (ROUND_UP (bit_size, BITS_PER_UNIT) / BITS_PER_UNIT);
     567                 :             :   /* FIXME, stay close to what libctf does.  But by getting next power of two,
     568                 :             :      aren't we conveying less precise information, especially for bitfields.
     569                 :             :      For example, cte_bits = 33, roundup_nbytes = 5, ctti_size = 8 in the
     570                 :             :      implementation below.  */
     571                 :          33 :   dtd->dtd_data.ctti_size = roundup_nbytes ? (1 << ceil_log2 (roundup_nbytes))
     572                 :             :                                            : 0;
     573                 :             : 
     574                 :          22 :   dtd->dtd_u.dtu_slice.cts_type = ref;
     575                 :          22 :   dtd->dtd_u.dtu_slice.cts_bits = bit_size;
     576                 :          22 :   dtd->dtd_u.dtu_slice.cts_offset = bit_offset;
     577                 :             : 
     578                 :          22 :   ctfc->ctfc_num_stypes++;
     579                 :             : 
     580                 :          22 :   return dtd;
     581                 :             : }
     582                 :             : 
     583                 :             : ctf_dtdef_ref
     584                 :          34 : ctf_add_float (ctf_container_ref ctfc, uint32_t flag,
     585                 :             :                const char * name, const ctf_encoding_t * ep, dw_die_ref die)
     586                 :             : {
     587                 :          34 :   return (ctf_add_encoded (ctfc, flag, name, ep, CTF_K_FLOAT, die));
     588                 :             : }
     589                 :             : 
     590                 :             : ctf_dtdef_ref
     591                 :         633 : ctf_add_integer (ctf_container_ref ctfc, uint32_t flag,
     592                 :             :                  const char * name, const ctf_encoding_t * ep, dw_die_ref die)
     593                 :             : {
     594                 :         633 :   return (ctf_add_encoded (ctfc, flag, name, ep, CTF_K_INTEGER, die));
     595                 :             : }
     596                 :             : 
     597                 :             : ctf_dtdef_ref
     598                 :          11 : ctf_add_unknown (ctf_container_ref ctfc, uint32_t flag,
     599                 :             :                  const char * name, const ctf_encoding_t * ep, dw_die_ref die)
     600                 :             : {
     601                 :          11 :   return (ctf_add_encoded (ctfc, flag, name, ep, CTF_K_UNKNOWN, die));
     602                 :             : }
     603                 :             : 
     604                 :             : ctf_dtdef_ref
     605                 :         149 : ctf_add_pointer (ctf_container_ref ctfc, uint32_t flag, ctf_dtdef_ref ref,
     606                 :             :                  dw_die_ref die)
     607                 :             : {
     608                 :         149 :   return (ctf_add_reftype (ctfc, flag, ref, CTF_K_POINTER, die));
     609                 :             : }
     610                 :             : 
     611                 :             : ctf_dtdef_ref
     612                 :          92 : ctf_add_array (ctf_container_ref ctfc, uint32_t flag, const ctf_arinfo_t * arp,
     613                 :             :                dw_die_ref die)
     614                 :             : {
     615                 :          92 :   ctf_dtdef_ref dtd;
     616                 :             : 
     617                 :          92 :   gcc_assert (arp);
     618                 :             : 
     619                 :             :   /* Caller of this API must make sure CTF type for arp->ctr_contents and
     620                 :             :      arp->ctr_index are already added.  This will also be validated for us at
     621                 :             :      link-time.  */
     622                 :             : 
     623                 :          92 :   dtd = ctf_add_generic (ctfc, flag, NULL, die);
     624                 :             : 
     625                 :          92 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
     626                 :          92 :   dtd->dtd_data.ctti_size = 0;
     627                 :          92 :   dtd->dtd_u.dtu_arr = *arp;
     628                 :             : 
     629                 :          92 :   ctfc->ctfc_num_stypes++;
     630                 :             : 
     631                 :          92 :   return dtd;
     632                 :             : }
     633                 :             : 
     634                 :             : ctf_dtdef_ref
     635                 :          14 : ctf_add_enum (ctf_container_ref ctfc, uint32_t flag, const char * name,
     636                 :             :               HOST_WIDE_INT size, bool eunsigned, dw_die_ref die)
     637                 :             : {
     638                 :          14 :   ctf_dtdef_ref dtd;
     639                 :             : 
     640                 :             :   /* In the compiler, no need to handle the case of promoting forwards to
     641                 :             :      enums.  This comment is simply to note a divergence from libctf.  */
     642                 :             : 
     643                 :             :   /* The compiler does, however, update any previously existing forward types
     644                 :             :      to non-root.  CTF does not allow existence of two root types with the same
     645                 :             :      name.  */
     646                 :          14 :   ctf_dtdef_ref enum_fwd_type = ctf_dtd_lookup (ctfc, die);
     647                 :          14 :   if (enum_fwd_type)
     648                 :             :     {
     649                 :           0 :       enum_fwd_type->dtd_data.ctti_info
     650                 :           0 :         = CTF_TYPE_INFO (CTF_K_FORWARD, CTF_ADD_NONROOT, 0);
     651                 :             :     }
     652                 :             : 
     653                 :          14 :   dtd = ctf_add_generic (ctfc, flag, name, die);
     654                 :             : 
     655                 :          14 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
     656                 :             : 
     657                 :             :   /* Size in bytes should always fit, of course.
     658                 :             :      TBD WARN - warn instead?  */
     659                 :          14 :   gcc_assert (size <= CTF_MAX_SIZE);
     660                 :             : 
     661                 :          14 :   dtd->dtd_data.ctti_size = size;
     662                 :          14 :   dtd->dtd_enum_unsigned = eunsigned;
     663                 :             : 
     664                 :          14 :   ctfc->ctfc_num_stypes++;
     665                 :             : 
     666                 :          14 :   return dtd;
     667                 :             : }
     668                 :             : 
     669                 :             : int
     670                 :          45 : ctf_add_enumerator (ctf_container_ref ctfc, ctf_dtdef_ref enum_dtd,
     671                 :             :                     const char * name, HOST_WIDE_INT value, dw_die_ref die)
     672                 :             : {
     673                 :          45 :   ctf_dmdef_t * dmd;
     674                 :          45 :   uint32_t kind, vlen, root;
     675                 :             : 
     676                 :             :   /* The associated CTF type of kind CTF_K_ENUM must already exist.
     677                 :             :      This will also be validated for us at link-time.  */
     678                 :          45 :   ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, die);
     679                 :          45 :   gcc_assert (dtd);
     680                 :          45 :   gcc_assert (dtd == enum_dtd);
     681                 :          45 :   gcc_assert (name);
     682                 :             : 
     683                 :          45 :   kind = CTF_V2_INFO_KIND (dtd->dtd_data.ctti_info);
     684                 :          45 :   root = CTF_V2_INFO_ISROOT (dtd->dtd_data.ctti_info);
     685                 :          45 :   vlen = CTF_V2_INFO_VLEN (dtd->dtd_data.ctti_info);
     686                 :             : 
     687                 :          45 :   gcc_assert (kind == CTF_K_ENUM && vlen < CTF_MAX_VLEN);
     688                 :             : 
     689                 :             :   /* Enum value is of type HOST_WIDE_INT in the compiler, CTF enumerators
     690                 :             :      values in ctf_enum_t is limited to int32_t, BTF supports signed and
     691                 :             :      unsigned enumerators values of 32 and 64 bits, for both debug formats
     692                 :             :      we use ctf_dmdef_t.dmd_value entry of HOST_WIDE_INT type. So check
     693                 :             :      CTF bounds and skip adding this enum value if out of bounds.  */
     694                 :          45 :   if (!btf_debuginfo_p() && ((value > INT_MAX) || (value < INT_MIN)))
     695                 :             :     {
     696                 :             :       /* FIXME - Note this TBD_CTF_REPRESENTATION_LIMIT.  */
     697                 :             :       return (1);
     698                 :             :     }
     699                 :             : 
     700                 :          43 :   dmd = ggc_cleared_alloc<ctf_dmdef_t> ();
     701                 :             : 
     702                 :             :   /* Buffer the strings in the CTF string table.  */
     703                 :          43 :   dmd->dmd_name = ctf_add_string (ctfc, name, &(dmd->dmd_name_offset));
     704                 :          43 :   dmd->dmd_type = NULL;
     705                 :          43 :   dmd->dmd_offset = 0;
     706                 :             : 
     707                 :          43 :   dmd->dmd_value = value;
     708                 :             : 
     709                 :          43 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, root, vlen + 1);
     710                 :          43 :   ctf_dmd_list_append (&dtd->dtd_u.dtu_members, dmd);
     711                 :             : 
     712                 :          43 :   if ((name != NULL) && strcmp (name, ""))
     713                 :          43 :     ctfc->ctfc_strlen += strlen (name) + 1;
     714                 :             : 
     715                 :             :   return (0);
     716                 :             : }
     717                 :             : 
     718                 :             : int
     719                 :         239 : ctf_add_member_offset (ctf_container_ref ctfc, dw_die_ref sou,
     720                 :             :                        const char * name, ctf_dtdef_ref type,
     721                 :             :                        uint64_t bit_offset)
     722                 :             : {
     723                 :         239 :   ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, sou);
     724                 :         239 :   ctf_dmdef_t * dmd;
     725                 :             : 
     726                 :         239 :   uint32_t kind, vlen, root;
     727                 :             : 
     728                 :             :   /* The type of the member being added must already exist.  */
     729                 :         239 :   gcc_assert (dtd);
     730                 :             : 
     731                 :         239 :   kind = CTF_V2_INFO_KIND (dtd->dtd_data.ctti_info);
     732                 :         239 :   root = CTF_V2_INFO_ISROOT (dtd->dtd_data.ctti_info);
     733                 :         239 :   vlen = CTF_V2_INFO_VLEN (dtd->dtd_data.ctti_info);
     734                 :             : 
     735                 :         239 :   gcc_assert (kind == CTF_K_STRUCT || kind == CTF_K_UNION);
     736                 :         239 :   gcc_assert (vlen < CTF_MAX_VLEN);
     737                 :             : 
     738                 :         239 :   dmd = ggc_cleared_alloc<ctf_dmdef_t> ();
     739                 :             : 
     740                 :             :   /* Buffer the strings in the CTF string table.  */
     741                 :         239 :   dmd->dmd_name = ctf_add_string (ctfc, name, &(dmd->dmd_name_offset));
     742                 :         239 :   dmd->dmd_type = type;
     743                 :         239 :   dmd->dmd_value = -1;
     744                 :             : 
     745                 :         239 :   if (kind == CTF_K_STRUCT && vlen != 0)
     746                 :         115 :     dmd->dmd_offset = bit_offset;
     747                 :             :   else
     748                 :         124 :     dmd->dmd_offset = 0;
     749                 :             : 
     750                 :         239 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, root, vlen + 1);
     751                 :         239 :   ctf_dmd_list_append (&dtd->dtd_u.dtu_members, dmd);
     752                 :             : 
     753                 :         239 :   if ((name != NULL) && strcmp (name, ""))
     754                 :         237 :     ctfc->ctfc_strlen += strlen (name) + 1;
     755                 :             : 
     756                 :         239 :   return 0;
     757                 :             : }
     758                 :             : 
     759                 :             : ctf_dvdef_ref
     760                 :         275 : ctf_add_variable (ctf_container_ref ctfc, const char * name, ctf_dtdef_ref ref,
     761                 :             :                   dw_die_ref die, unsigned int external_vis,
     762                 :             :                   dw_die_ref die_var_decl)
     763                 :             : {
     764                 :         275 :   ctf_dvdef_ref dvd = NULL, dvd_ignore;
     765                 :             : 
     766                 :         275 :   gcc_assert (name);
     767                 :             : 
     768                 :         275 :   if (name != NULL)
     769                 :             :     {
     770                 :         275 :       dvd = ggc_cleared_alloc<ctf_dvdef_t> ();
     771                 :         275 :       dvd->dvd_key = die;
     772                 :             :       /* Buffer the strings in the CTF string table.  */
     773                 :         275 :       dvd->dvd_name = ctf_add_string (ctfc, name, &(dvd->dvd_name_offset));
     774                 :         275 :       dvd->dvd_visibility = external_vis;
     775                 :         275 :       dvd->dvd_type = ref;
     776                 :             : 
     777                 :             :       /* If DW_AT_specification attribute exists, keep track of it as this is
     778                 :             :          the non-defining declaration corresponding to the variable.  We will
     779                 :             :          skip emitting CTF variable for such incomplete, non-defining
     780                 :             :          declarations.
     781                 :             :          There could be some non-defining declarations, however, for which a
     782                 :             :          defining declaration does not show up in the same CU.  For such
     783                 :             :          cases, the compiler continues to emit CTF variable record as
     784                 :             :          usual.  */
     785                 :         275 :       if (die_var_decl)
     786                 :             :         {
     787                 :           2 :           dvd_ignore = ggc_cleared_alloc<ctf_dvdef_t> ();
     788                 :           2 :           dvd_ignore->dvd_key = die_var_decl;
     789                 :             :           /* It's alright to leave other fields as zero.  No valid CTF
     790                 :             :              variable will be added for these DW_TAG_variable DIEs.  */
     791                 :           2 :           ctf_dvd_ignore_insert (ctfc, dvd_ignore);
     792                 :             :         }
     793                 :             : 
     794                 :         275 :       ctf_dvd_insert (ctfc, dvd);
     795                 :             : 
     796                 :         275 :       if (strcmp (name, ""))
     797                 :         275 :         ctfc->ctfc_strlen += strlen (name) + 1;
     798                 :             :     }
     799                 :             : 
     800                 :         275 :   return dvd;
     801                 :             : }
     802                 :             : 
     803                 :             : int
     804                 :         144 : ctf_add_function_arg (ctf_container_ref ctfc, dw_die_ref func,
     805                 :             :                       const char * name, ctf_dtdef_ref arg_dtd)
     806                 :             : {
     807                 :         144 :   ctf_dtdef_ref func_dtd = ctf_dtd_lookup (ctfc, func);
     808                 :         144 :   ctf_func_arg_t * farg;
     809                 :         144 :   uint32_t vlen;
     810                 :             : 
     811                 :             :   /* The function to which argument is being added must already exist.  */
     812                 :         144 :   gcc_assert (func_dtd);
     813                 :             :   /* The number of args must have been non-zero.  */
     814                 :         144 :   vlen = CTF_V2_INFO_VLEN (func_dtd->dtd_data.ctti_info);
     815                 :         144 :   gcc_assert (vlen);
     816                 :             : 
     817                 :         144 :   farg = ggc_cleared_alloc<ctf_func_arg_t> ();
     818                 :             : 
     819                 :             :   /* Buffer the strings in the auxilliary string table.  CTF V3 format does not
     820                 :             :      require function argument names.  Use auxilliary string table to keep
     821                 :             :      these strings to avoid unnecessary bloat in CTF section in CTF V3.  */
     822                 :         144 :   farg->farg_name = ctf_add_string (ctfc, name, &(farg->farg_name_offset),
     823                 :             :                                     CTF_AUX_STRTAB);
     824                 :         144 :   farg->farg_type = arg_dtd;
     825                 :             : 
     826                 :         144 :   ctf_farg_list_append (&func_dtd->dtd_u.dtu_argv, farg);
     827                 :             : 
     828                 :             :   /* For aux_str, keep ctfc_aux_strlen updated for debugging.  */
     829                 :         144 :   if ((name != NULL) && strcmp (name, ""))
     830                 :         112 :     ctfc->ctfc_aux_strlen += strlen (name) + 1;
     831                 :             : 
     832                 :         144 :   return 0;
     833                 :             : }
     834                 :             : 
     835                 :             : ctf_dtdef_ref
     836                 :         450 : ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
     837                 :             :                   const ctf_funcinfo_t * ctc, dw_die_ref die,
     838                 :             :                   bool from_global_func, int linkage)
     839                 :             : {
     840                 :         450 :   ctf_dtdef_ref dtd;
     841                 :         450 :   uint32_t vlen;
     842                 :             : 
     843                 :         450 :   gcc_assert (ctc);
     844                 :             : 
     845                 :         450 :   vlen = ctc->ctc_argc;
     846                 :         450 :   gcc_assert (vlen <= CTF_MAX_VLEN);
     847                 :             : 
     848                 :         450 :   dtd = ctf_add_generic (ctfc, flag, name, die);
     849                 :             : 
     850                 :         450 :   dtd->from_global_func = from_global_func;
     851                 :         450 :   dtd->linkage = linkage;
     852                 :         450 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
     853                 :         450 :   dtd->ref_type = ctc->ctc_return;
     854                 :             :   /* Caller must make sure CTF types for ctc->ctc_return are already added.  */
     855                 :         450 :   dtd->dtd_data.ctti_type = (uint32_t) ctc->ctc_return->dtd_type;
     856                 :             :   /* Caller must make sure CTF types for function arguments are already added
     857                 :             :      via ctf_add_function_arg () API.  */
     858                 :             : 
     859                 :         450 :   ctfc->ctfc_num_stypes++;
     860                 :             : 
     861                 :         450 :   return dtd;
     862                 :             : }
     863                 :             : 
     864                 :             : ctf_dtdef_ref
     865                 :         111 : ctf_add_sou (ctf_container_ref ctfc, uint32_t flag, const char * name,
     866                 :             :              uint32_t kind, unsigned HOST_WIDE_INT size, dw_die_ref die)
     867                 :             : {
     868                 :         111 :   ctf_dtdef_ref dtd;
     869                 :             : 
     870                 :         111 :   gcc_assert ((kind == CTF_K_STRUCT) || (kind == CTF_K_UNION));
     871                 :             : 
     872                 :             :   /* In the compiler, no need to handle the case of promoting forwards to
     873                 :             :      structs.  This comment is simply to note a divergence from libctf.  */
     874                 :             : 
     875                 :             :   /* The compiler does, however, update any previously existing forward types
     876                 :             :      to non-root.  CTF does not allow existence of two root types with the same
     877                 :             :      name.  */
     878                 :         111 :   ctf_dtdef_ref sou_fwd_type = ctf_dtd_lookup (ctfc, die);
     879                 :         111 :   if (sou_fwd_type)
     880                 :             :     {
     881                 :           0 :       sou_fwd_type->dtd_data.ctti_info
     882                 :           0 :         = CTF_TYPE_INFO (CTF_K_FORWARD, CTF_ADD_NONROOT, 0);
     883                 :             :     }
     884                 :             : 
     885                 :         111 :   dtd = ctf_add_generic (ctfc, flag, name, die);
     886                 :             : 
     887                 :         111 :   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, flag, 0);
     888                 :             : 
     889                 :         111 :   if (size > CTF_MAX_SIZE)
     890                 :             :     {
     891                 :           1 :       dtd->dtd_data.ctti_size = CTF_LSIZE_SENT;
     892                 :           1 :       dtd->dtd_data.ctti_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
     893                 :           1 :       dtd->dtd_data.ctti_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
     894                 :           1 :       ctfc->ctfc_num_types++;
     895                 :             :     }
     896                 :             :   else
     897                 :             :     {
     898                 :         110 :       dtd->dtd_data.ctti_size = (uint32_t) size;
     899                 :         110 :       ctfc->ctfc_num_stypes++;
     900                 :             :     }
     901                 :             : 
     902                 :         111 :   return dtd;
     903                 :             : }
     904                 :             : 
     905                 :             : /* Given a TREE_TYPE node, return the CTF type object for that type.  */
     906                 :             : 
     907                 :             : ctf_dtdef_ref
     908                 :           0 : ctf_lookup_tree_type (ctf_container_ref ctfc, const tree type)
     909                 :             : {
     910                 :           0 :   dw_die_ref die = lookup_type_die (type);
     911                 :           0 :   if (die == NULL)
     912                 :             :     return NULL;
     913                 :             : 
     914                 :           0 :   ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, die);
     915                 :           0 :   if (dtd == NULL)
     916                 :             :     return NULL;
     917                 :             : 
     918                 :             :   return dtd;
     919                 :             : }
     920                 :             : 
     921                 :             : /* Check if CTF for TYPE has already been generated.  Mainstay for
     922                 :             :    de-duplication.  If CTF type already exists, returns TRUE and updates
     923                 :             :    the CTF type object DTD for the caller.  */
     924                 :             : 
     925                 :             : bool
     926                 :        4691 : ctf_type_exists (ctf_container_ref ctfc, dw_die_ref type,
     927                 :             :                  ctf_dtdef_ref * dtd)
     928                 :             : {
     929                 :        4691 :   bool exists = false;
     930                 :        4691 :   ctf_dtdef_ref ctf_type_seen = ctf_dtd_lookup (ctfc, type);
     931                 :             : 
     932                 :        4691 :   if (ctf_type_seen)
     933                 :             :     {
     934                 :        1486 :       exists = true;
     935                 :             :       /* CTF type for this type exists.  */
     936                 :        1486 :       *dtd = ctf_type_seen;
     937                 :             :     }
     938                 :             : 
     939                 :        4691 :   return exists;
     940                 :             : }
     941                 :             : 
     942                 :             : /* Location information for CTF Types and CTF Variables.  CTF section does not
     943                 :             :    emit location information; at this time, location information is needed for
     944                 :             :    BTF CO-RE use-cases.  */
     945                 :             : 
     946                 :             : int
     947                 :           0 : ctfc_get_dtd_srcloc (ctf_dtdef_ref dtd, ctf_srcloc_ref loc)
     948                 :             : {
     949                 :           0 :   loc->ctsloc_file = ctf_get_die_loc_file (dtd->dtd_key);
     950                 :           0 :   loc->ctsloc_line = ctf_get_die_loc_line (dtd->dtd_key);
     951                 :           0 :   loc->ctsloc_col = ctf_get_die_loc_col (dtd->dtd_key);
     952                 :             : 
     953                 :           0 :   if (loc->ctsloc_file == NULL)
     954                 :           0 :     return 1;
     955                 :             : 
     956                 :             :   return 0;
     957                 :             : }
     958                 :             : 
     959                 :             : int
     960                 :           0 : ctfc_get_dvd_srcloc (ctf_dvdef_ref dvd, ctf_srcloc_ref loc)
     961                 :             : {
     962                 :           0 :   loc->ctsloc_file = ctf_get_die_loc_file (dvd->dvd_key);
     963                 :           0 :   loc->ctsloc_line = ctf_get_die_loc_line (dvd->dvd_key);
     964                 :           0 :   loc->ctsloc_col = ctf_get_die_loc_col (dvd->dvd_key);
     965                 :             : 
     966                 :           0 :   if (loc->ctsloc_file == NULL)
     967                 :           0 :     return 1;
     968                 :             : 
     969                 :             :   return 0;
     970                 :             : }
     971                 :             : 
     972                 :             : /* CTF container setup and teardown routines.  */
     973                 :             : 
     974                 :             : /* Initialize the CTF string table.
     975                 :             :    The first entry in the CTF string table (empty string) is added.  */
     976                 :             : 
     977                 :             : void
     978                 :         861 : init_ctf_strtable (ctf_strtable_t * strtab)
     979                 :             : {
     980                 :         861 :   strtab->ctstab_head = NULL;
     981                 :         861 :   strtab->ctstab_tail = NULL;
     982                 :         861 :   strtab->ctstab_num = 0;
     983                 :         861 :   strtab->ctstab_len = 0;
     984                 :             : 
     985                 :             :   /* The first entry in the CTF string table is an empty string.  E.g., CTF
     986                 :             :      type records with no name (like CTF_K_CONST, CTF_K_VOLATILE etc) point to
     987                 :             :      this string.  */
     988                 :         861 :   uint32_t estr_offset = 0;
     989                 :         861 :   strtab->ctstab_estr = ctfc_strtable_add_str (strtab, "", &estr_offset);
     990                 :         861 : }
     991                 :             : 
     992                 :             : /* Initialize the string tables in the CTF container.  */
     993                 :             : 
     994                 :             : static void
     995                 :         428 : init_ctf_string_table (ctf_container_ref ctfc)
     996                 :             : {
     997                 :         428 :   init_ctf_strtable (&ctfc->ctfc_strtable);
     998                 :         428 :   ctfc->ctfc_strlen++;
     999                 :             : 
    1000                 :         428 :   init_ctf_strtable (&ctfc->ctfc_aux_strtable);
    1001                 :         428 :   ctfc->ctfc_aux_strlen++;
    1002                 :         428 : }
    1003                 :             : 
    1004                 :             : /* Allocate a new CTF container with the desired flags.  */
    1005                 :             : 
    1006                 :             : static inline ctf_container_ref
    1007                 :         428 : new_ctf_container (void)
    1008                 :             : {
    1009                 :         428 :   tu_ctfc = ggc_cleared_alloc<ctf_container_t> ();
    1010                 :         428 :   tu_ctfc->ctfc_types
    1011                 :         428 :     = hash_table<ctfc_dtd_hasher>::create_ggc (100);
    1012                 :         428 :   tu_ctfc->ctfc_vars
    1013                 :         428 :     = hash_table<ctfc_dvd_hasher>::create_ggc (100);
    1014                 :         428 :   tu_ctfc->ctfc_ignore_vars
    1015                 :         428 :     = hash_table<ctfc_dvd_hasher>::create_ggc (10);
    1016                 :             : 
    1017                 :         428 :   vec_alloc (tu_ctfc->ctfc_tags, 100);
    1018                 :         428 :   tu_ctfc->ctfc_type_tags_map
    1019                 :         428 :     = hash_map<ctf_dtdef_ref, ctf_dtdef_ref>::create_ggc (100);
    1020                 :             : 
    1021                 :         428 :   return tu_ctfc;
    1022                 :             : }
    1023                 :             : 
    1024                 :             : /* Initialize a CTF container per translation unit.  */
    1025                 :             : 
    1026                 :             : static void
    1027                 :         428 : init_ctf_container (void)
    1028                 :             : {
    1029                 :         428 :   tu_ctfc = new_ctf_container ();
    1030                 :             : 
    1031                 :         428 :   tu_ctfc->ctfc_magic = CTF_MAGIC;
    1032                 :         428 :   tu_ctfc->ctfc_version = CTF_VERSION;
    1033                 :         428 :   tu_ctfc->ctfc_flags = CTF_F_NEWFUNCINFO;
    1034                 :         428 :   tu_ctfc->ctfc_nextid = CTF_INIT_TYPEID;
    1035                 :             : 
    1036                 :         428 :   init_ctf_string_table (tu_ctfc);
    1037                 :         428 : }
    1038                 :             : 
    1039                 :             : void
    1040                 :         861 : ctfc_delete_strtab (ctf_strtable_t * strtab)
    1041                 :             : {
    1042                 :         861 :   ctf_string_t * str = NULL;
    1043                 :         861 :   ctf_string_t * next_str = NULL;
    1044                 :             : 
    1045                 :         861 :   str = strtab->ctstab_head;
    1046                 :         861 :   next_str = str;
    1047                 :        4134 :   while (next_str != NULL)
    1048                 :             :     {
    1049                 :        3273 :       next_str = str->cts_next;
    1050                 :        3273 :       ggc_free (str);
    1051                 :        3273 :       str = next_str;
    1052                 :             :     }
    1053                 :             : 
    1054                 :         861 :   strtab->ctstab_head = NULL;
    1055                 :         861 :   strtab->ctstab_tail = NULL;
    1056                 :         861 :   strtab->ctstab_estr = NULL;
    1057                 :         861 : }
    1058                 :             : 
    1059                 :             : /* Delete the CTF container's resources.  */
    1060                 :             : 
    1061                 :             : void
    1062                 :         428 : ctfc_delete_container (ctf_container_ref ctfc)
    1063                 :             : {
    1064                 :         428 :   if (ctfc)
    1065                 :             :     {
    1066                 :         428 :       ctfc->ctfc_types->empty ();
    1067                 :         428 :       ctfc->ctfc_types = NULL;
    1068                 :             : 
    1069                 :         428 :       ctfc->ctfc_vars->empty ();
    1070                 :         428 :       ctfc->ctfc_types = NULL;
    1071                 :             : 
    1072                 :         428 :       ctfc->ctfc_ignore_vars->empty ();
    1073                 :         428 :       ctfc->ctfc_ignore_vars = NULL;
    1074                 :             : 
    1075                 :         428 :       ctfc->ctfc_tags = NULL;
    1076                 :             : 
    1077                 :         428 :       ctfc->ctfc_type_tags_map->empty ();
    1078                 :         428 :       ctfc->ctfc_type_tags_map = NULL;
    1079                 :             : 
    1080                 :         428 :       ctfc_delete_strtab (&ctfc->ctfc_strtable);
    1081                 :         428 :       ctfc_delete_strtab (&ctfc->ctfc_aux_strtable);
    1082                 :         428 :       if (ctfc->ctfc_vars_list)
    1083                 :             :         {
    1084                 :         192 :           ggc_free (ctfc->ctfc_vars_list);
    1085                 :         192 :           ctfc->ctfc_vars_list = NULL;
    1086                 :             :         }
    1087                 :         428 :       if (ctfc->ctfc_types_list)
    1088                 :             :         {
    1089                 :         428 :           ggc_free (ctfc->ctfc_types_list);
    1090                 :         428 :           ctfc->ctfc_types_list = NULL;
    1091                 :             :         }
    1092                 :         428 :       if (ctfc->ctfc_gfuncs_list)
    1093                 :             :         {
    1094                 :         261 :           ggc_free (ctfc->ctfc_gfuncs_list);
    1095                 :         261 :           ctfc->ctfc_gfuncs_list = NULL;
    1096                 :             :         }
    1097                 :         428 :       if (ctfc->ctfc_gobjts_list)
    1098                 :             :         {
    1099                 :          82 :           ggc_free (ctfc->ctfc_gobjts_list);
    1100                 :          82 :           ctfc->ctfc_gobjts_list = NULL;
    1101                 :             :         }
    1102                 :             : 
    1103                 :         428 :       ctfc= NULL;
    1104                 :             :     }
    1105                 :         428 : }
    1106                 :             : 
    1107                 :             : /* CTF routines interfacing to the compiler.  */
    1108                 :             : 
    1109                 :             : void
    1110                 :         428 : ctf_init (void)
    1111                 :             : {
    1112                 :         428 :   init_ctf_container ();
    1113                 :         428 : }
        

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.