00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "coretypes.h"
00025 #include "tm.h"
00026 #include "toplev.h"
00027 #include "rtl.h"
00028 #include "ggc.h"
00029
00030 static void free_list (rtx *, rtx *);
00031 static void free_DEPS_LIST_node (rtx);
00032
00033
00034
00035
00036 static GTY ((deletable)) rtx unused_insn_list;
00037
00038
00039 static GTY ((deletable)) rtx unused_expr_list;
00040
00041
00042 static GTY ((deletable)) rtx unused_deps_list;
00043
00044
00045
00046
00047
00048
00049 static void
00050 free_list (rtx *listp, rtx *unused_listp)
00051 {
00052 rtx link, prev_link;
00053
00054 prev_link = *listp;
00055 link = XEXP (prev_link, 1);
00056
00057 gcc_assert ((unused_listp != &unused_insn_list
00058 || GET_CODE (prev_link) == INSN_LIST)
00059 && (unused_listp != &unused_deps_list
00060 || GET_CODE (prev_link) == DEPS_LIST));
00061
00062 while (link)
00063 {
00064 gcc_assert ((unused_listp != &unused_insn_list
00065 || GET_CODE (prev_link) == INSN_LIST)
00066 && (unused_listp != &unused_deps_list
00067 || GET_CODE (prev_link) == DEPS_LIST));
00068
00069 prev_link = link;
00070 link = XEXP (link, 1);
00071 }
00072
00073 XEXP (prev_link, 1) = *unused_listp;
00074 *unused_listp = *listp;
00075 *listp = 0;
00076 }
00077
00078
00079
00080 static rtx *
00081 find_list_elem (rtx elem, rtx *listp)
00082 {
00083 while (XEXP (*listp, 0) != elem)
00084 listp = &XEXP (*listp, 1);
00085 return listp;
00086 }
00087
00088
00089 static void
00090 remove_list_node (rtx *listp)
00091 {
00092 rtx node;
00093
00094 node = *listp;
00095 *listp = XEXP (node, 1);
00096 XEXP (node, 1) = 0;
00097 }
00098
00099
00100
00101 rtx
00102 remove_list_elem (rtx elem, rtx *listp)
00103 {
00104 rtx node;
00105
00106 listp = find_list_elem (elem, listp);
00107 node = *listp;
00108 remove_list_node (listp);
00109 return node;
00110 }
00111
00112
00113
00114
00115 rtx
00116 alloc_INSN_LIST (rtx val, rtx next)
00117 {
00118 rtx r;
00119
00120 if (unused_insn_list)
00121 {
00122 r = unused_insn_list;
00123 unused_insn_list = XEXP (r, 1);
00124 XEXP (r, 0) = val;
00125 XEXP (r, 1) = next;
00126 PUT_REG_NOTE_KIND (r, VOIDmode);
00127
00128 gcc_assert (GET_CODE (r) == INSN_LIST);
00129 }
00130 else
00131 r = gen_rtx_INSN_LIST (VOIDmode, val, next);
00132
00133 return r;
00134 }
00135
00136
00137
00138
00139 rtx
00140 alloc_EXPR_LIST (int kind, rtx val, rtx next)
00141 {
00142 rtx r;
00143
00144 if (unused_expr_list)
00145 {
00146 r = unused_expr_list;
00147 unused_expr_list = XEXP (r, 1);
00148 XEXP (r, 0) = val;
00149 XEXP (r, 1) = next;
00150 PUT_REG_NOTE_KIND (r, kind);
00151 }
00152 else
00153 r = gen_rtx_EXPR_LIST (kind, val, next);
00154
00155 return r;
00156 }
00157
00158
00159
00160
00161 rtx
00162 alloc_DEPS_LIST (rtx val, rtx next, int ds)
00163 {
00164 rtx r;
00165
00166 if (unused_deps_list)
00167 {
00168 r = unused_deps_list;
00169 unused_deps_list = XEXP (r, 1);
00170 XEXP (r, 0) = val;
00171 XEXP (r, 1) = next;
00172 XINT (r, 2) = ds;
00173 PUT_REG_NOTE_KIND (r, VOIDmode);
00174
00175 gcc_assert (GET_CODE (r) == DEPS_LIST);
00176 }
00177 else
00178 r = gen_rtx_DEPS_LIST (VOIDmode, val, next, ds);
00179
00180 return r;
00181 }
00182
00183
00184 void
00185 free_EXPR_LIST_list (rtx *listp)
00186 {
00187 if (*listp == 0)
00188 return;
00189 free_list (listp, &unused_expr_list);
00190 }
00191
00192
00193 void
00194 free_INSN_LIST_list (rtx *listp)
00195 {
00196 if (*listp == 0)
00197 return;
00198 free_list (listp, &unused_insn_list);
00199 }
00200
00201
00202 void
00203 free_DEPS_LIST_list (rtx *listp)
00204 {
00205 if (*listp == 0)
00206 return;
00207 free_list (listp, &unused_deps_list);
00208 }
00209
00210
00211 void
00212 free_EXPR_LIST_node (rtx ptr)
00213 {
00214 XEXP (ptr, 1) = unused_expr_list;
00215 unused_expr_list = ptr;
00216 }
00217
00218
00219 void
00220 free_INSN_LIST_node (rtx ptr)
00221 {
00222 gcc_assert (GET_CODE (ptr) == INSN_LIST);
00223 XEXP (ptr, 1) = unused_insn_list;
00224 unused_insn_list = ptr;
00225 }
00226
00227
00228 static void
00229 free_DEPS_LIST_node (rtx ptr)
00230 {
00231 gcc_assert (GET_CODE (ptr) == DEPS_LIST);
00232 XEXP (ptr, 1) = unused_deps_list;
00233 unused_deps_list = ptr;
00234 }
00235
00236
00237
00238 void
00239 remove_free_DEPS_LIST_elem (rtx elem, rtx *listp)
00240 {
00241 free_DEPS_LIST_node (remove_list_elem (elem, listp));
00242 }
00243
00244
00245
00246 void
00247 remove_free_INSN_LIST_elem (rtx elem, rtx *listp)
00248 {
00249 free_INSN_LIST_node (remove_list_elem (elem, listp));
00250 }
00251
00252
00253 rtx
00254 copy_DEPS_LIST_list (rtx list)
00255 {
00256 rtx res = NULL_RTX, *resp = &res;
00257
00258 while (list)
00259 {
00260 *resp = alloc_DEPS_LIST (XEXP (list, 0), 0, XINT (list, 2));
00261 PUT_REG_NOTE_KIND (*resp, REG_NOTE_KIND (list));
00262 resp = &XEXP (*resp, 1);
00263 list = XEXP (list, 1);
00264 }
00265 return res;
00266 }
00267
00268 #include "gt-lists.h"