1/* List management for the GNU C-Compiler expander. 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 3 1999 Free Software Foundation, Inc. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING. If not, write to the Free 19Software Foundation, 59 Temple Place - Suite 330, Boston, MA 2002111-1307, USA. */ 21 22#include "config.h" 23#include "system.h" 24#include "toplev.h" 25#include "rtl.h" 26#include "ggc.h" 27 28static void free_list PARAMS ((rtx *, rtx *)); 29 30/* Functions for maintaining cache-able lists of EXPR_LIST and INSN_LISTs. */ 31 32/* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */ 33static GTY ((deletable (""))) rtx unused_insn_list; 34 35/* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */ 36static GTY ((deletable (""))) rtx unused_expr_list; 37 38 39/* This function will free an entire list of either EXPR_LIST or INSN_LIST 40 nodes. This is to be used only on lists that consist exclusively of 41 nodes of one type only. This is only called by free_EXPR_LIST_list 42 and free_INSN_LIST_list. */ 43static void 44free_list (listp, unused_listp) 45 rtx *listp, *unused_listp; 46{ 47 rtx link, prev_link; 48 49 prev_link = *listp; 50 link = XEXP (prev_link, 1); 51 52 while (link) 53 { 54 prev_link = link; 55 link = XEXP (link, 1); 56 } 57 58 XEXP (prev_link, 1) = *unused_listp; 59 *unused_listp = *listp; 60 *listp = 0; 61} 62 63/* This call is used in place of a gen_rtx_INSN_LIST. If there is a cached 64 node available, we'll use it, otherwise a call to gen_rtx_INSN_LIST 65 is made. */ 66rtx 67alloc_INSN_LIST (val, next) 68 rtx val, next; 69{ 70 rtx r; 71 72 if (unused_insn_list) 73 { 74 r = unused_insn_list; 75 unused_insn_list = XEXP (r, 1); 76 XEXP (r, 0) = val; 77 XEXP (r, 1) = next; 78 PUT_REG_NOTE_KIND (r, VOIDmode); 79 } 80 else 81 r = gen_rtx_INSN_LIST (VOIDmode, val, next); 82 83 return r; 84} 85 86/* This call is used in place of a gen_rtx_EXPR_LIST. If there is a cached 87 node available, we'll use it, otherwise a call to gen_rtx_EXPR_LIST 88 is made. */ 89rtx 90alloc_EXPR_LIST (kind, val, next) 91 int kind; 92 rtx val, next; 93{ 94 rtx r; 95 96 if (unused_expr_list) 97 { 98 r = unused_expr_list; 99 unused_expr_list = XEXP (r, 1); 100 XEXP (r, 0) = val; 101 XEXP (r, 1) = next; 102 PUT_REG_NOTE_KIND (r, kind); 103 } 104 else 105 r = gen_rtx_EXPR_LIST (kind, val, next); 106 107 return r; 108} 109 110/* This function will free up an entire list of EXPR_LIST nodes. */ 111void 112free_EXPR_LIST_list (listp) 113 rtx *listp; 114{ 115 if (*listp == 0) 116 return; 117 free_list (listp, &unused_expr_list); 118} 119 120/* This function will free up an entire list of INSN_LIST nodes. */ 121void 122free_INSN_LIST_list (listp) 123 rtx *listp; 124{ 125 if (*listp == 0) 126 return; 127 free_list (listp, &unused_insn_list); 128} 129 130/* This function will free up an individual EXPR_LIST node. */ 131void 132free_EXPR_LIST_node (ptr) 133 rtx ptr; 134{ 135 XEXP (ptr, 1) = unused_expr_list; 136 unused_expr_list = ptr; 137} 138 139/* This function will free up an individual INSN_LIST node. */ 140void 141free_INSN_LIST_node (ptr) 142 rtx ptr; 143{ 144 XEXP (ptr, 1) = unused_insn_list; 145 unused_insn_list = ptr; 146} 147 148#include "gt-lists.h" 149