(root)/
gcc-13.2.0/
gcc/
ggc.h
       1  /* Garbage collection for the GNU compiler.
       2  
       3     Copyright (C) 1998-2023 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 zero if the object was not previously marked; nonzero 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 int ggc_set_mark	(const void *);
      97  
      98  /* Return 1 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 int 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       ATTRIBUTE_MALLOC;
     132  
     133  inline void *
     134  ggc_internal_alloc (size_t s CXX_MEM_STAT_INFO)
     135  {
     136    return ggc_internal_alloc (s, NULL, 0, 1 PASS_MEM_STAT);
     137  }
     138  
     139  extern size_t ggc_round_alloc_size (size_t requested_size);
     140  
     141  /* Allocates cleared memory.  */
     142  extern void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
     143  					 size_t, size_t
     144  					 CXX_MEM_STAT_INFO) ATTRIBUTE_MALLOC;
     145  
     146  inline void *
     147  ggc_internal_cleared_alloc (size_t s CXX_MEM_STAT_INFO)
     148  {
     149    return ggc_internal_cleared_alloc (s, NULL, 0, 1 PASS_MEM_STAT);
     150  }
     151  
     152  /* Resize a block.  */
     153  extern void *ggc_realloc (void *, size_t CXX_MEM_STAT_INFO);
     154  
     155  /* Free a block.  To be used when known for certain it's not reachable.  */
     156  extern void ggc_free (void *);
     157  
     158  extern void dump_ggc_loc_statistics ();
     159  
     160  /* Reallocator.  */
     161  #define GGC_RESIZEVEC(T, P, N) \
     162      ((T *) ggc_realloc ((P), (N) * sizeof (T) MEM_STAT_INFO))
     163  
     164  template<typename T>
     165  void
     166  finalize (void *p)
     167  {
     168    static_cast<T *> (p)->~T ();
     169  }
     170  
     171  template<typename T>
     172  inline bool
     173  need_finalization_p ()
     174  {
     175  #if GCC_VERSION >= 4003
     176    return !__has_trivial_destructor (T);
     177  #else
     178    return true;
     179  #endif
     180  }
     181  
     182  template<typename T>
     183  inline T *
     184  ggc_alloc (ALONE_CXX_MEM_STAT_INFO)
     185  {
     186    if (need_finalization_p<T> ())
     187      return static_cast<T *> (ggc_internal_alloc (sizeof (T), finalize<T>, 0, 1
     188  						 PASS_MEM_STAT));
     189    else
     190      return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1
     191  						 PASS_MEM_STAT));
     192  }
     193  
     194  /* GGC allocation function that does not call finalizer for type
     195     that have need_finalization_p equal to true.  User is responsible
     196     for calling of the destructor.  */
     197  
     198  template<typename T>
     199  inline T *
     200  ggc_alloc_no_dtor (ALONE_CXX_MEM_STAT_INFO)
     201  {
     202    return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1
     203  					       PASS_MEM_STAT));
     204  }
     205  
     206  template<typename T>
     207  inline T *
     208  ggc_cleared_alloc (ALONE_CXX_MEM_STAT_INFO)
     209  {
     210    if (need_finalization_p<T> ())
     211      return static_cast<T *> (ggc_internal_cleared_alloc (sizeof (T),
     212  							 finalize<T>, 0, 1
     213  							 PASS_MEM_STAT));
     214    else
     215      return static_cast<T *> (ggc_internal_cleared_alloc (sizeof (T), NULL, 0, 1
     216  							 PASS_MEM_STAT));
     217  }
     218  
     219  template<typename T>
     220  inline T *
     221  ggc_vec_alloc (size_t c CXX_MEM_STAT_INFO)
     222  {
     223    if (need_finalization_p<T> ())
     224      return static_cast<T *> (ggc_internal_alloc (c * sizeof (T), finalize<T>,
     225  						 sizeof (T), c PASS_MEM_STAT));
     226    else
     227      return static_cast<T *> (ggc_internal_alloc (c * sizeof (T), NULL, 0, 0
     228  						 PASS_MEM_STAT));
     229  }
     230  
     231  template<typename T>
     232  inline T *
     233  ggc_cleared_vec_alloc (size_t c CXX_MEM_STAT_INFO)
     234  {
     235    if (need_finalization_p<T> ())
     236      return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T),
     237  							 finalize<T>,
     238  							 sizeof (T), c
     239  							 PASS_MEM_STAT));
     240    else
     241      return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T), NULL,
     242  							 0, 0 PASS_MEM_STAT));
     243  }
     244  
     245  inline void *
     246  ggc_alloc_atomic (size_t s CXX_MEM_STAT_INFO)
     247  {
     248      return ggc_internal_alloc (s PASS_MEM_STAT);
     249  }
     250  
     251  /* Call destructor and free the garbage collected memory.  */
     252  
     253  template <typename T>
     254  inline void
     255  ggc_delete (T *ptr)
     256  {
     257    ptr->~T ();
     258    ggc_free (ptr);
     259  }
     260  
     261  /* Allocate a gc-able string, and fill it with LENGTH bytes from CONTENTS.
     262     If LENGTH is -1, then CONTENTS is assumed to be a
     263     null-terminated string and the memory sized accordingly.  */
     264  extern const char *ggc_alloc_string (const char *contents, int length
     265                                       CXX_MEM_STAT_INFO);
     266  
     267  /* Make a copy of S, in GC-able memory.  */
     268  #define ggc_strdup(S) ggc_alloc_string ((S), -1 MEM_STAT_INFO)
     269  
     270  /* Invoke the collector.  Garbage collection occurs only when this
     271     function is called, not during allocations.  */
     272  enum ggc_collect {
     273    GGC_COLLECT_HEURISTIC,
     274    GGC_COLLECT_FORCE
     275  };
     276  extern void ggc_collect (enum ggc_collect mode = GGC_COLLECT_HEURISTIC);
     277  
     278  /* Return unused memory pages to the system.  */
     279  extern void ggc_trim (void);
     280  
     281  /* Assume that all GGC memory is reachable and grow the limits for next collection. */
     282  extern void ggc_grow (void);
     283  
     284  /* Register an additional root table.  This can be useful for some
     285     plugins.  Does nothing if the passed pointer is NULL. */
     286  extern void ggc_register_root_tab (const struct ggc_root_tab *);
     287  
     288  /* Read objects previously saved with gt_pch_save from F.  */
     289  extern void gt_pch_restore (FILE *f);
     290  
     291  /* Statistics.  */
     292  
     293  /* Print allocation statistics.  */
     294  extern void ggc_print_statistics (void);
     295  
     296  extern void stringpool_statistics (void);
     297  
     298  /* Heuristics.  */
     299  extern void init_ggc_heuristics (void);
     300  
     301  /* Report current heap memory use to stderr.  */
     302  extern void report_heap_memory_use (void);
     303  
     304  #define ggc_alloc_rtvec_sized(NELT)				\
     305    (rtvec_def *) ggc_internal_alloc (sizeof (struct rtvec_def)		\
     306  		       + ((NELT) - 1) * sizeof (rtx))		\
     307  
     308  /* Memory statistics passing versions of some allocators.  Too few of them to
     309     make gengtype produce them, so just define the needed ones here.  */
     310  inline struct rtx_def *
     311  ggc_alloc_rtx_def_stat (size_t s CXX_MEM_STAT_INFO)
     312  {
     313    return (struct rtx_def *) ggc_internal_alloc (s PASS_MEM_STAT);
     314  }
     315  
     316  inline union tree_node *
     317  ggc_alloc_tree_node_stat (size_t s CXX_MEM_STAT_INFO)
     318  {
     319    return (union tree_node *) ggc_internal_alloc (s PASS_MEM_STAT);
     320  }
     321  
     322  inline union tree_node *
     323  ggc_alloc_cleared_tree_node_stat (size_t s CXX_MEM_STAT_INFO)
     324  {
     325    return (union tree_node *) ggc_internal_cleared_alloc (s PASS_MEM_STAT);
     326  }
     327  
     328  inline gimple *
     329  ggc_alloc_cleared_gimple_statement_stat (size_t s CXX_MEM_STAT_INFO)
     330  {
     331    return (gimple *) ggc_internal_cleared_alloc (s PASS_MEM_STAT);
     332  }
     333  
     334  inline void
     335  gt_ggc_mx (const char *s)
     336  {
     337    ggc_test_and_set_mark (const_cast<char *> (s));
     338  }
     339  
     340  inline void
     341  gt_pch_nx (const char *)
     342  {
     343  }
     344  
     345  inline void gt_pch_nx (bool) { }
     346  inline void gt_pch_nx (char) { }
     347  inline void gt_pch_nx (signed char) { }
     348  inline void gt_pch_nx (unsigned char) { }
     349  inline void gt_pch_nx (short) { }
     350  inline void gt_pch_nx (unsigned short) { }
     351  inline void gt_pch_nx (int) { }
     352  inline void gt_pch_nx (unsigned int) { }
     353  inline void gt_pch_nx (long int) { }
     354  inline void gt_pch_nx (unsigned long int) { }
     355  inline void gt_pch_nx (long long int) { }
     356  inline void gt_pch_nx (unsigned long long int) { }
     357  
     358  inline void gt_ggc_mx (bool) { }
     359  inline void gt_ggc_mx (char) { }
     360  inline void gt_ggc_mx (signed char) { }
     361  inline void gt_ggc_mx (unsigned char) { }
     362  inline void gt_ggc_mx (short) { }
     363  inline void gt_ggc_mx (unsigned short) { }
     364  inline void gt_ggc_mx (int) { }
     365  inline void gt_ggc_mx (unsigned int) { }
     366  inline void gt_ggc_mx (long int) { }
     367  inline void gt_ggc_mx (unsigned long int) { }
     368  inline void gt_ggc_mx (long long int) { }
     369  inline void gt_ggc_mx (unsigned long long int) { }
     370  
     371  #endif