LCOV - code coverage report
Current view: top level - gcc - ggc.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 97.4 % 38 37
Test Date: 2026-02-28 14:20:25 Functions: 47.2 % 890 420
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Garbage collection for the GNU compiler.
       2              : 
       3              :    Copyright (C) 1998-2026 Free Software Foundation, Inc.
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it under
       8              : the terms of the GNU General Public License as published by the Free
       9              : Software Foundation; either version 3, or (at your option) any later
      10              : version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15              : for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #ifndef GCC_GGC_H
      22              : #define GCC_GGC_H
      23              : 
      24              : /* Symbols are marked with `ggc' for `gcc gc' so as not to interfere with
      25              :    an external gc library that might be linked in.  */
      26              : 
      27              : /* Internal functions and data structures used by the GTY
      28              :    machinery, including the generated gt*.[hc] files.  */
      29              : 
      30              : #include "gtype-desc.h"
      31              : 
      32              : /* One of these applies its third parameter (with cookie in the fourth
      33              :    parameter) to each pointer in the object pointed to by the first
      34              :    parameter, using the second parameter.  */
      35              : typedef void (*gt_note_pointers) (void *, void *, gt_pointer_operator,
      36              :                                   void *);
      37              : 
      38              : /* One of these is called before objects are re-ordered in memory.
      39              :    The first parameter is the original object, the second is the
      40              :    subobject that has had its pointers reordered, the third parameter
      41              :    can compute the new values of a pointer when given the cookie in
      42              :    the fourth parameter.  */
      43              : typedef void (*gt_handle_reorder) (void *, void *, gt_pointer_operator,
      44              :                                    void *);
      45              : 
      46              : /* Used by the gt_pch_n_* routines.  Register an object in the hash table.  */
      47              : extern int gt_pch_note_object (void *, void *, gt_note_pointers,
      48              :                                size_t length_override = (size_t)-1);
      49              : 
      50              : /* Used by the gt_pch_p_* routines.  Register address of a callback
      51              :    pointer.  */
      52              : extern void gt_pch_note_callback (void *, void *);
      53              : 
      54              : /* Used by the gt_pch_n_* routines.  Register that an object has a reorder
      55              :    function.  */
      56              : extern void gt_pch_note_reorder (void *, void *, gt_handle_reorder);
      57              : 
      58              : /* generated function to clear caches in gc memory.  */
      59              : extern void gt_clear_caches ();
      60              : 
      61              : /* Mark the object in the first parameter and anything it points to.  */
      62              : typedef void (*gt_pointer_walker) (void *);
      63              : 
      64              : /* Structures for the easy way to mark roots.
      65              :    In an array, terminated by having base == NULL.  */
      66              : struct ggc_root_tab {
      67              :   void *base;
      68              :   size_t nelt;
      69              :   size_t stride;
      70              :   gt_pointer_walker cb;
      71              :   gt_pointer_walker pchw;
      72              : };
      73              : #define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL, NULL }
      74              : /* Pointers to arrays of ggc_root_tab, terminated by NULL.  */
      75              : extern const struct ggc_root_tab * const gt_ggc_rtab[];
      76              : extern const struct ggc_root_tab * const gt_ggc_deletable_rtab[];
      77              : extern const struct ggc_root_tab * const gt_pch_scalar_rtab[];
      78              : 
      79              : /* If EXPR is not NULL and previously unmarked, mark it and evaluate
      80              :    to true.  Otherwise evaluate to false.  */
      81              : #define ggc_test_and_set_mark(EXPR) \
      82              :   ((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR))
      83              : 
      84              : #define ggc_mark(EXPR)                          \
      85              :   do {                                          \
      86              :     const void *const a__ = (EXPR);             \
      87              :     if (a__ != NULL && a__ != (void *) 1)       \
      88              :       ggc_set_mark (a__);                       \
      89              :   } while (0)
      90              : 
      91              : /* Actually set the mark on a particular region of memory, but don't
      92              :    follow pointers.  This function is called by ggc_mark_*.  It
      93              :    returns false if the object was not previously marked; true if
      94              :    the object was already marked, or if, for any other reason,
      95              :    pointers in this data structure should not be traversed.  */
      96              : extern bool ggc_set_mark (const void *);
      97              : 
      98              : /* Return true if P has been marked, zero otherwise.
      99              :    P must have been allocated by the GC allocator; it mustn't point to
     100              :    static objects, stack variables, or memory allocated with malloc.  */
     101              : extern bool ggc_marked_p (const void *);
     102              : 
     103              : /* PCH and GGC handling for strings, mostly trivial.  */
     104              : extern void gt_pch_n_S (const void *);
     105              : extern void gt_pch_n_S2 (const void *, size_t);
     106              : extern void gt_ggc_m_S (const void *);
     107              : 
     108              : /* End of GTY machinery API.  */
     109              : 
     110              : /* Initialize the string pool.  */
     111              : extern void init_stringpool (void);
     112              : 
     113              : /* Initialize the garbage collector.  */
     114              : extern void init_ggc (void);
     115              : 
     116              : /* When true, identifier nodes are considered as GC roots.  When
     117              :    false, identifier nodes are treated like any other GC-allocated
     118              :    object, and the identifier hash table is treated as a weak
     119              :    hash.  */
     120              : extern bool ggc_protect_identifiers;
     121              : 
     122              : /* Write out all GCed objects to F.  */
     123              : extern void gt_pch_save (FILE *f);
     124              : 
     125              : 
     126              : /* Allocation.  */
     127              : 
     128              : /* The internal primitive.  */
     129              : extern void *ggc_internal_alloc (size_t, void (*)(void *), size_t,
     130              :                                  size_t CXX_MEM_STAT_INFO);
     131              : /* If the second argument is non-NULL, it can't be marked ATTRIBUTE_MALLOC,
     132              :    because ggc_free performs finalization.  Add an alias or wrapper used just
     133              :    for the NULL finalizer which can be marked with ATTRIBUTE_MALLOC.  */
     134              : extern void *ggc_internal_alloc_no_dtor (size_t, void (*)(void *), size_t,
     135              :                                          size_t CXX_MEM_STAT_INFO)
     136              :      ATTRIBUTE_MALLOC;
     137              : 
     138              : inline void *
     139  25286720703 : ggc_internal_alloc (size_t s CXX_MEM_STAT_INFO)
     140              : {
     141   7213631873 :   return ggc_internal_alloc_no_dtor (s, NULL, 0, 1 PASS_MEM_STAT);
     142              : }
     143              : 
     144              : extern size_t ggc_round_alloc_size (size_t requested_size);
     145              : 
     146              : /* Allocates cleared memory.  */
     147              : extern void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
     148              :                                          size_t, size_t
     149              :                                          CXX_MEM_STAT_INFO);
     150              : extern void *ggc_internal_cleared_alloc_no_dtor (size_t, void (*)(void *),
     151              :                                                  size_t, size_t
     152              :                                                  CXX_MEM_STAT_INFO)
     153              :      ATTRIBUTE_MALLOC;
     154              : 
     155              : inline void *
     156  21277938780 : ggc_internal_cleared_alloc (size_t s CXX_MEM_STAT_INFO)
     157              : {
     158  21277938780 :   return ggc_internal_cleared_alloc_no_dtor (s, NULL, 0, 1 PASS_MEM_STAT);
     159              : }
     160              : 
     161              : /* Resize a block.  */
     162              : extern void *ggc_realloc (void *, size_t CXX_MEM_STAT_INFO);
     163              : 
     164              : /* Free a block.  To be used when known for certain it's not reachable.  */
     165              : extern void ggc_free (void *);
     166              : 
     167              : extern void dump_ggc_loc_statistics ();
     168              : 
     169              : /* Reallocator.  */
     170              : #define GGC_RESIZEVEC(T, P, N) \
     171              :     ((T *) ggc_realloc ((P), (N) * sizeof (T) MEM_STAT_INFO))
     172              : 
     173              : template<typename T>
     174              : void
     175     25163976 : finalize (void *p)
     176              : {
     177     25163976 :   static_cast<T *> (p)->~T ();
     178     25163976 : }
     179              : 
     180              : template<typename T>
     181              : inline bool
     182      4384493 : need_finalization_p ()
     183              : {
     184              : #if GCC_VERSION >= 4003
     185              :   return !__has_trivial_destructor (T);
     186              : #else
     187              :   return true;
     188              : #endif
     189              : }
     190              : 
     191              : template<typename T>
     192              : inline T *
     193   4337223209 : ggc_alloc (ALONE_CXX_MEM_STAT_INFO)
     194              : {
     195              :   if (need_finalization_p<T> ())
     196     71047700 :     return static_cast<T *> (ggc_internal_alloc (sizeof (T), finalize<T>, 0, 1
     197              :                                                  PASS_MEM_STAT));
     198              :   else
     199   4266175509 :     return static_cast<T *> (ggc_internal_alloc_no_dtor (sizeof (T), NULL,
     200              :                                                          0, 1 PASS_MEM_STAT));
     201              : }
     202              : 
     203              : /* GGC allocation function that does not call finalizer for type
     204              :    that have need_finalization_p equal to true.  User is responsible
     205              :    for calling of the destructor.  */
     206              : 
     207              : template<typename T>
     208              : inline T *
     209     17648262 : ggc_alloc_no_dtor (ALONE_CXX_MEM_STAT_INFO)
     210              : {
     211     17648262 :   return static_cast<T *> (ggc_internal_alloc_no_dtor (sizeof (T), NULL, 0, 1
     212     17648262 :                                                        PASS_MEM_STAT));
     213              : }
     214              : 
     215              : template<typename T>
     216              : inline T *
     217   2925641713 : ggc_cleared_alloc (ALONE_CXX_MEM_STAT_INFO)
     218              : {
     219              :   if (need_finalization_p<T> ())
     220       497980 :     return static_cast<T *> (ggc_internal_cleared_alloc (sizeof (T),
     221              :                                                          finalize<T>, 0, 1
     222              :                                                          PASS_MEM_STAT));
     223              :   else
     224   2925143733 :     return static_cast<T *> (ggc_internal_cleared_alloc_no_dtor (sizeof (T),
     225              :                                                                  NULL, 0, 1
     226              :                                                                  PASS_MEM_STAT));
     227              : }
     228              : 
     229              : template<typename T>
     230              : inline T *
     231      5071355 : ggc_vec_alloc (size_t c CXX_MEM_STAT_INFO)
     232              : {
     233              :   if (need_finalization_p<T> ())
     234              :     return static_cast<T *> (ggc_internal_alloc (c * sizeof (T), finalize<T>,
     235              :                                                  sizeof (T), c PASS_MEM_STAT));
     236              :   else
     237      5071355 :     return static_cast<T *> (ggc_internal_alloc_no_dtor (c * sizeof (T),
     238              :                                                          NULL, 0, 0
     239              :                                                          PASS_MEM_STAT));
     240              : }
     241              : 
     242              : template<typename T>
     243              : inline T *
     244    122500538 : ggc_cleared_vec_alloc (size_t c CXX_MEM_STAT_INFO)
     245              : {
     246              :   if (need_finalization_p<T> ())
     247            0 :     return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T),
     248              :                                                          finalize<T>,
     249              :                                                          sizeof (T), c
     250              :                                                          PASS_MEM_STAT));
     251              :   else
     252    122500538 :     return static_cast<T *> (ggc_internal_cleared_alloc_no_dtor (c
     253              :                                                                  * sizeof (T),
     254              :                                                                  NULL, 0, 0
     255              :                                                                  PASS_MEM_STAT));
     256              : }
     257              : 
     258              : inline void *
     259   2434054065 : ggc_alloc_atomic (size_t s CXX_MEM_STAT_INFO)
     260              : {
     261   2434054065 :     return ggc_internal_alloc (s PASS_MEM_STAT);
     262              : }
     263              : 
     264              : /* Call destructor and free the garbage collected memory.  */
     265              : 
     266              : template <typename T>
     267              : inline void
     268     40097214 : ggc_delete (T *ptr)
     269              : {
     270     37170258 :   ptr->~T ();
     271     49274635 :   ggc_free (ptr);
     272     48685631 : }
     273              : 
     274              : /* Allocate a gc-able string, and fill it with LENGTH bytes from CONTENTS.
     275              :    If LENGTH is -1, then CONTENTS is assumed to be a
     276              :    null-terminated string and the memory sized accordingly.  */
     277              : extern const char *ggc_alloc_string (const char *contents, int length
     278              :                                      CXX_MEM_STAT_INFO);
     279              : 
     280              : /* Make a copy of S, in GC-able memory.  */
     281              : #define ggc_strdup(S) ggc_alloc_string ((S), -1 MEM_STAT_INFO)
     282              : 
     283              : /* Invoke the collector.  Garbage collection occurs only when this
     284              :    function is called, not during allocations.  */
     285              : enum ggc_collect {
     286              :   GGC_COLLECT_HEURISTIC,
     287              :   GGC_COLLECT_FORCE
     288              : };
     289              : extern void ggc_collect (enum ggc_collect mode = GGC_COLLECT_HEURISTIC);
     290              : 
     291              : /* Return unused memory pages to the system.  */
     292              : extern void ggc_trim (void);
     293              : 
     294              : /* Assume that all GGC memory is reachable and grow the limits for next collection. */
     295              : extern void ggc_grow (void);
     296              : 
     297              : /* Register an additional root table.  This can be useful for some
     298              :    plugins.  Does nothing if the passed pointer is NULL. */
     299              : extern void ggc_register_root_tab (const struct ggc_root_tab *);
     300              : 
     301              : /* Read objects previously saved with gt_pch_save from F.  */
     302              : extern void gt_pch_restore (FILE *f);
     303              : 
     304              : /* Statistics.  */
     305              : 
     306              : /* Print allocation statistics.  */
     307              : extern void ggc_print_statistics (void);
     308              : 
     309              : extern void stringpool_statistics (void);
     310              : 
     311              : /* Heuristics.  */
     312              : extern void init_ggc_heuristics (void);
     313              : 
     314              : /* Report current heap memory use to stderr.  */
     315              : extern void report_heap_memory_use (void);
     316              : 
     317              : #define ggc_alloc_rtvec_sized(NELT)                             \
     318              :   (rtvec_def *) ggc_internal_alloc (sizeof (struct rtvec_def)           \
     319              :                        + ((NELT) - 1) * sizeof (rtx))           \
     320              : 
     321              : /* Memory statistics passing versions of some allocators.  Too few of them to
     322              :    make gengtype produce them, so just define the needed ones here.  */
     323              : inline struct rtx_def *
     324   3147493908 : ggc_alloc_rtx_def_stat (size_t s CXX_MEM_STAT_INFO)
     325              : {
     326   3147493908 :   return (struct rtx_def *) ggc_internal_alloc (s PASS_MEM_STAT);
     327              : }
     328              : 
     329              : inline union tree_node *
     330  14925594922 : ggc_alloc_tree_node_stat (size_t s CXX_MEM_STAT_INFO)
     331              : {
     332  14925594922 :   return (union tree_node *) ggc_internal_alloc (s PASS_MEM_STAT);
     333              : }
     334              : 
     335              : inline union tree_node *
     336  19756372727 : ggc_alloc_cleared_tree_node_stat (size_t s CXX_MEM_STAT_INFO)
     337              : {
     338  19756372727 :   return (union tree_node *) ggc_internal_cleared_alloc (s PASS_MEM_STAT);
     339              : }
     340              : 
     341              : inline gimple *
     342    311083579 : ggc_alloc_cleared_gimple_statement_stat (size_t s CXX_MEM_STAT_INFO)
     343              : {
     344    311083579 :   return (gimple *) ggc_internal_cleared_alloc (s PASS_MEM_STAT);
     345              : }
     346              : 
     347              : inline void
     348       308134 : gt_ggc_mx (const char *s)
     349              : {
     350       308134 :   ggc_test_and_set_mark (const_cast<char *> (s));
     351              : }
     352              : 
     353              : inline void
     354              : gt_pch_nx (const char *)
     355              : {
     356              : }
     357              : 
     358              : inline void gt_pch_nx (bool) { }
     359              : inline void gt_pch_nx (char) { }
     360              : inline void gt_pch_nx (signed char) { }
     361              : inline void gt_pch_nx (unsigned char) { }
     362              : inline void gt_pch_nx (short) { }
     363              : inline void gt_pch_nx (unsigned short) { }
     364              : inline void gt_pch_nx (int) { }
     365              : inline void gt_pch_nx (unsigned int) { }
     366              : inline void gt_pch_nx (long int) { }
     367              : inline void gt_pch_nx (unsigned long int) { }
     368              : inline void gt_pch_nx (long long int) { }
     369              : inline void gt_pch_nx (unsigned long long int) { }
     370              : 
     371              : inline void gt_ggc_mx (bool) { }
     372              : inline void gt_ggc_mx (char) { }
     373              : inline void gt_ggc_mx (signed char) { }
     374              : inline void gt_ggc_mx (unsigned char) { }
     375              : inline void gt_ggc_mx (short) { }
     376              : inline void gt_ggc_mx (unsigned short) { }
     377              : inline void gt_ggc_mx (int) { }
     378              : inline void gt_ggc_mx (unsigned int) { }
     379              : inline void gt_ggc_mx (long int) { }
     380              : inline void gt_ggc_mx (unsigned long int) { }
     381              : inline void gt_ggc_mx (long long int) { }
     382              : inline void gt_ggc_mx (unsigned long long int) { }
     383              : 
     384              : extern void ggc_common_finalize ();
     385              : 
     386              : #endif
        

Generated by: LCOV version 2.4-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.