00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "varray.h"
00028 #include "gtype-desc.h"
00029
00030
00031
00032
00033 #ifdef SGI_MONGOOSE
00034
00035
00036
00037 extern int ggc_p;
00038 #endif
00039
00040
00041 extern const char empty_string[];
00042 extern const char digit_vector[];
00043 #define digit_string(d) (digit_vector + ((d) * 2))
00044
00045
00046
00047 extern void ggc_add_root PARAMS ((void *base, int nelt,
00048 int size, void (*)(void *)));
00049
00050
00051
00052 struct ggc_root_tab {
00053 void *base;
00054 size_t nelt;
00055 size_t stride;
00056 void (*cb) PARAMS ((void *));
00057 };
00058 #define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL }
00059
00060 extern const struct ggc_root_tab * const gt_ggc_rtab[];
00061 extern const struct ggc_root_tab * const gt_ggc_deletable_rtab[];
00062
00063
00064 struct htab;
00065 struct ggc_cache_tab {
00066 struct htab * *base;
00067 size_t nelt;
00068 size_t stride;
00069 void (*cb) PARAMS ((void *));
00070 int (*marked_p) PARAMS ((const void *));
00071 };
00072 #define LAST_GGC_CACHE_TAB { NULL, 0, 0, NULL, NULL }
00073
00074 extern const struct ggc_cache_tab * const gt_ggc_cache_rtab[];
00075
00076 extern void ggc_mark_roots PARAMS ((void));
00077
00078
00079
00080 #define ggc_test_and_set_mark(EXPR) \
00081 ((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR))
00082
00083 #define ggc_mark_rtx gt_ggc_m_7rtx_def
00084 #define ggc_mark_tree gt_ggc_m_9tree_node
00085
00086 #define ggc_mark(EXPR) \
00087 do { \
00088 const void *const a__ = (EXPR); \
00089 if (a__ != NULL && a__ != (void *) 1) \
00090 ggc_set_mark (a__); \
00091 } while (0)
00092
00093
00094
00095
00096 extern void init_ggc PARAMS ((void));
00097 extern void init_stringpool PARAMS ((void));
00098
00099
00100
00101 extern void ggc_push_context PARAMS ((void));
00102
00103
00104
00105 extern void ggc_pop_context PARAMS ((void));
00106
00107
00108
00109
00110 extern void *ggc_alloc PARAMS ((size_t));
00111
00112 extern void *ggc_alloc_cleared PARAMS ((size_t));
00113
00114 extern void *ggc_realloc PARAMS ((void *, size_t));
00115
00116 extern void *ggc_calloc PARAMS ((size_t, size_t));
00117
00118 #define ggc_alloc_rtx(NSLOTS) \
00119 ((struct rtx_def *) ggc_alloc (sizeof (struct rtx_def) \
00120 + ((NSLOTS) - 1) * sizeof (rtunion)))
00121
00122 #define ggc_alloc_rtvec(NELT) \
00123 ((struct rtvec_def *) ggc_alloc (sizeof (struct rtvec_def) \
00124 + ((NELT) - 1) * sizeof (rtx)))
00125
00126 #define ggc_alloc_tree(LENGTH) ((union tree_node *) ggc_alloc (LENGTH))
00127
00128 #define htab_create_ggc(SIZE, HASH, EQ, DEL) \
00129 htab_create_alloc (SIZE, HASH, EQ, DEL, ggc_calloc, NULL)
00130
00131
00132
00133
00134 extern const char *ggc_alloc_string PARAMS ((const char *contents,
00135 int length));
00136
00137
00138 #define ggc_strdup(S) ggc_alloc_string((S), -1)
00139
00140
00141
00142 extern void ggc_collect PARAMS ((void));
00143
00144
00145
00146
00147
00148
00149 extern int ggc_set_mark PARAMS ((const void *));
00150
00151
00152
00153
00154 extern int ggc_marked_p PARAMS ((const void *));
00155
00156
00157
00158
00159
00160 typedef struct ggc_statistics
00161 {
00162
00163 unsigned num_trees[256];
00164
00165
00166 size_t size_trees[256];
00167
00168 unsigned num_rtxs[256];
00169
00170
00171 size_t size_rtxs[256];
00172
00173 size_t total_size_trees;
00174
00175 size_t total_size_rtxs;
00176
00177 unsigned total_num_trees;
00178
00179 unsigned total_num_rtxs;
00180 } ggc_statistics;
00181
00182
00183 extern size_t ggc_get_size PARAMS ((const void *));
00184
00185
00186
00187 extern void ggc_print_common_statistics PARAMS ((FILE *, ggc_statistics *));
00188
00189
00190 extern void ggc_print_statistics PARAMS ((void));
00191 extern void stringpool_statistics PARAMS ((void));
00192
00193
00194 extern int ggc_min_expand_heuristic PARAMS ((void));
00195 extern int ggc_min_heapsize_heuristic PARAMS ((void));
00196 extern void init_ggc_heuristics PARAMS ((void));