]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/lists.c
* config/darwin.c (machopic_function_base_name):
[thirdparty/gcc.git] / gcc / lists.c
CommitLineData
bccafa26 1/* List management for the GCC expander.
2f791da8 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1a97be37 3 1999, 2003 Free Software Foundation, Inc.
6284c5cd 4
f12b58b3 5This file is part of GCC.
6284c5cd 6
f12b58b3 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.
6284c5cd 11
f12b58b3 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.
6284c5cd 16
17You should have received a copy of the GNU General Public License
f12b58b3 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. */
6284c5cd 21
22#include "config.h"
23#include "system.h"
805e22b2 24#include "coretypes.h"
25#include "tm.h"
6284c5cd 26#include "toplev.h"
27#include "rtl.h"
d8fcbd1d 28#include "ggc.h"
6284c5cd 29
1a97be37 30static void free_list (rtx *, rtx *);
29fd0b7a 31
6284c5cd 32/* Functions for maintaining cache-able lists of EXPR_LIST and INSN_LISTs. */
33
34/* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */
1f3233d1 35static GTY ((deletable (""))) rtx unused_insn_list;
6284c5cd 36
37/* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */
1f3233d1 38static GTY ((deletable (""))) rtx unused_expr_list;
6284c5cd 39
40
41/* This function will free an entire list of either EXPR_LIST or INSN_LIST
548ec30f 42 nodes. This is to be used only on lists that consist exclusively of
6284c5cd 43 nodes of one type only. This is only called by free_EXPR_LIST_list
44 and free_INSN_LIST_list. */
45static void
1a97be37 46free_list (rtx *listp, rtx *unused_listp)
6284c5cd 47{
19cb6b50 48 rtx link, prev_link;
6284c5cd 49
50 prev_link = *listp;
51 link = XEXP (prev_link, 1);
52
53 while (link)
54 {
55 prev_link = link;
56 link = XEXP (link, 1);
57 }
58
59 XEXP (prev_link, 1) = *unused_listp;
60 *unused_listp = *listp;
61 *listp = 0;
62}
63
64/* This call is used in place of a gen_rtx_INSN_LIST. If there is a cached
8851e806 65 node available, we'll use it, otherwise a call to gen_rtx_INSN_LIST
6284c5cd 66 is made. */
67rtx
1a97be37 68alloc_INSN_LIST (rtx val, rtx next)
6284c5cd 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
8851e806 87 node available, we'll use it, otherwise a call to gen_rtx_EXPR_LIST
6284c5cd 88 is made. */
89rtx
1a97be37 90alloc_EXPR_LIST (int kind, rtx val, rtx next)
6284c5cd 91{
92 rtx r;
93
94 if (unused_expr_list)
95 {
96 r = unused_expr_list;
97 unused_expr_list = XEXP (r, 1);
98 XEXP (r, 0) = val;
99 XEXP (r, 1) = next;
100 PUT_REG_NOTE_KIND (r, kind);
101 }
102 else
103 r = gen_rtx_EXPR_LIST (kind, val, next);
104
105 return r;
106}
107
6284c5cd 108/* This function will free up an entire list of EXPR_LIST nodes. */
8851e806 109void
1a97be37 110free_EXPR_LIST_list (rtx *listp)
6284c5cd 111{
112 if (*listp == 0)
113 return;
114 free_list (listp, &unused_expr_list);
115}
116
117/* This function will free up an entire list of INSN_LIST nodes. */
8851e806 118void
1a97be37 119free_INSN_LIST_list (rtx *listp)
6284c5cd 120{
121 if (*listp == 0)
122 return;
123 free_list (listp, &unused_insn_list);
124}
125
126/* This function will free up an individual EXPR_LIST node. */
8851e806 127void
1a97be37 128free_EXPR_LIST_node (rtx ptr)
6284c5cd 129{
130 XEXP (ptr, 1) = unused_expr_list;
131 unused_expr_list = ptr;
132}
133
134/* This function will free up an individual INSN_LIST node. */
8851e806 135void
1a97be37 136free_INSN_LIST_node (rtx ptr)
6284c5cd 137{
138 XEXP (ptr, 1) = unused_insn_list;
139 unused_insn_list = ptr;
140}
1f3233d1 141
142#include "gt-lists.h"