]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/genflags.c
Fix copyrights.
[thirdparty/gcc.git] / gcc / genflags.c
CommitLineData
41299f41 1/* Generate from machine description:
41299f41
TW
2 - some flags HAVE_... saying which simple standard instructions are
3 available for this machine.
d050d723
JL
4 Copyright (C) 1987, 1991, 1995, 1998,
5 1999, 2000 Free Software Foundation, Inc.
41299f41
TW
6
7This file is part of GNU CC.
8
9GNU CC is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2, or (at your option)
12any later version.
13
14GNU CC is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with GNU CC; see the file COPYING. If not, write to
a35311b0
RK
21the Free Software Foundation, 59 Temple Place - Suite 330,
22Boston, MA 02111-1307, USA. */
41299f41
TW
23
24
20f92396 25#include "hconfig.h"
0b93b64e 26#include "system.h"
41299f41
TW
27#include "rtl.h"
28#include "obstack.h"
f8b6598e 29#include "errors.h"
41299f41
TW
30
31static struct obstack obstack;
32struct obstack *rtl_obstack = &obstack;
33
34#define obstack_chunk_alloc xmalloc
35#define obstack_chunk_free free
36
f837a861
MM
37/* Obstacks to remember normal, and call insns. */
38static struct obstack call_obstack, normal_obstack;
39
40/* Max size of names encountered. */
41static int max_id_len;
42
706b0f60
ZW
43/* Max operand encountered in a scan over some insn. */
44static int max_opno;
56c0e996 45
706b0f60
ZW
46static void max_operand_1 PARAMS ((rtx));
47static int num_operands PARAMS ((rtx));
48static void gen_proto PARAMS ((rtx));
49static void gen_nonproto PARAMS ((rtx));
50static void gen_insn PARAMS ((rtx));
56c0e996 51
f837a861 52/* Count the number of match_operand's found. */
0f41302f 53
706b0f60
ZW
54static void
55max_operand_1 (x)
f837a861
MM
56 rtx x;
57{
706b0f60
ZW
58 register RTX_CODE code;
59 register int i;
60 register int len;
61 register const char *fmt;
f837a861 62
706b0f60
ZW
63 if (x == 0)
64 return;
f837a861 65
706b0f60 66 code = GET_CODE (x);
f837a861 67
706b0f60
ZW
68 if (code == MATCH_OPERAND || code == MATCH_OPERATOR
69 || code == MATCH_PARALLEL)
70 max_opno = MAX (max_opno, XINT (x, 0));
71
72 fmt = GET_RTX_FORMAT (code);
73 len = GET_RTX_LENGTH (code);
74 for (i = 0; i < len; i++)
f837a861 75 {
706b0f60
ZW
76 if (fmt[i] == 'e' || fmt[i] == 'u')
77 max_operand_1 (XEXP (x, i));
78 else if (fmt[i] == 'E')
f837a861 79 {
706b0f60
ZW
80 int j;
81 for (j = 0; j < XVECLEN (x, i); j++)
82 max_operand_1 (XVECEXP (x, i, j));
f837a861
MM
83 }
84 }
706b0f60 85}
f837a861 86
706b0f60
ZW
87static int
88num_operands (insn)
89 rtx insn;
90{
91 register int len = XVECLEN (insn, 1);
92 register int i;
93
94 max_opno = -1;
95
96 for (i = 0; i < len; i++)
97 max_operand_1 (XVECEXP (insn, 1, i));
98
99 return max_opno + 1;
f837a861
MM
100}
101
102/* Print out prototype information for a function. */
0f41302f 103
f837a861
MM
104static void
105gen_proto (insn)
106 rtx insn;
107{
108 int num = num_operands (insn);
a94ae8f5 109 printf ("extern rtx gen_%-*s PARAMS ((", max_id_len, XSTR (insn, 0));
f837a861
MM
110
111 if (num == 0)
112 printf ("void");
113 else
114 {
115 while (num-- > 1)
116 printf ("rtx, ");
117
118 printf ("rtx");
119 }
120
121 printf ("));\n");
122}
123
124/* Print out a function declaration without a prototype. */
0f41302f 125
f837a861
MM
126static void
127gen_nonproto (insn)
128 rtx insn;
129{
130 printf ("extern rtx gen_%s ();\n", XSTR (insn, 0));
131}
132
41299f41
TW
133static void
134gen_insn (insn)
135 rtx insn;
136{
f837a861 137 char *name = XSTR (insn, 0);
41299f41 138 char *p;
f837a861
MM
139 struct obstack *obstack_ptr;
140 int len;
41299f41 141
6b6ca844
RK
142 /* Don't mention instructions whose names are the null string
143 or begin with '*'. They are in the machine description just
144 to be recognized. */
145 if (name[0] == 0 || name[0] == '*')
41299f41
TW
146 return;
147
6b6ca844
RK
148 len = strlen (name);
149
f837a861
MM
150 if (len > max_id_len)
151 max_id_len = len;
152
153 printf ("#define HAVE_%s ", name);
41299f41
TW
154 if (strlen (XSTR (insn, 2)) == 0)
155 printf ("1\n");
156 else
157 {
158 /* Write the macro definition, putting \'s at the end of each line,
159 if more than one. */
160 printf ("(");
161 for (p = XSTR (insn, 2); *p; p++)
162 {
163 if (*p == '\n')
164 printf (" \\\n");
165 else
166 printf ("%c", *p);
167 }
168 printf (")\n");
169 }
6610a1b0 170
f837a861
MM
171 /* Save the current insn, so that we can later put out appropriate
172 prototypes. At present, most md files have the wrong number of
6610a1b0
MM
173 arguments for the call insns (call, call_value, call_pop,
174 call_value_pop) ignoring the extra arguments that are passed for
175 some machines, so by default, turn off the prototype. */
176
177 obstack_ptr = (name[0] == 'c'
178 && (!strcmp (name, "call")
179 || !strcmp (name, "call_value")
180 || !strcmp (name, "call_pop")
181 || !strcmp (name, "call_value_pop")))
f837a861
MM
182 ? &call_obstack : &normal_obstack;
183
184 obstack_grow (obstack_ptr, &insn, sizeof (rtx));
41299f41
TW
185}
186\f
2778b98d 187PTR
41299f41 188xmalloc (size)
2778b98d 189 size_t size;
41299f41 190{
2778b98d 191 register PTR val = (PTR) malloc (size);
41299f41
TW
192
193 if (val == 0)
194 fatal ("virtual memory exhausted");
195
196 return val;
197}
198
2778b98d 199PTR
470b68c0
RH
200xrealloc (old, size)
201 PTR old;
2778b98d 202 size_t size;
41299f41 203{
470b68c0 204 register PTR ptr;
09d83d25 205 if (old)
470b68c0
RH
206 ptr = (PTR) realloc (old, size);
207 else
208 ptr = (PTR) malloc (size);
209 if (!ptr)
41299f41 210 fatal ("virtual memory exhausted");
470b68c0 211 return ptr;
41299f41
TW
212}
213
a94ae8f5 214extern int main PARAMS ((int, char **));
c1b59dce 215
41299f41
TW
216int
217main (argc, argv)
218 int argc;
219 char **argv;
220{
221 rtx desc;
f837a861
MM
222 rtx dummy;
223 rtx *call_insns;
224 rtx *normal_insns;
225 rtx *insn_ptr;
41299f41 226 FILE *infile;
41299f41
TW
227 register int c;
228
f8b6598e 229 progname = "genflags";
41299f41 230 obstack_init (rtl_obstack);
f837a861
MM
231 obstack_init (&call_obstack);
232 obstack_init (&normal_obstack);
41299f41
TW
233
234 if (argc <= 1)
235 fatal ("No input file name.");
236
237 infile = fopen (argv[1], "r");
238 if (infile == 0)
239 {
240 perror (argv[1]);
c1b59dce 241 return (FATAL_EXIT_CODE);
41299f41 242 }
bcdaba58 243 read_rtx_filename = argv[1];
41299f41 244
41299f41
TW
245 printf ("/* Generated automatically by the program `genflags'\n\
246from the machine description file `md'. */\n\n");
247
248 /* Read the machine description. */
249
250 while (1)
251 {
252 c = read_skip_spaces (infile);
253 if (c == EOF)
254 break;
255 ungetc (c, infile);
256
257 desc = read_rtx (infile);
258 if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
259 gen_insn (desc);
260 }
261
f837a861 262 /* Print out the prototypes now. */
0f41302f 263 dummy = (rtx) 0;
f837a861
MM
264 obstack_grow (&call_obstack, &dummy, sizeof (rtx));
265 call_insns = (rtx *) obstack_finish (&call_obstack);
266
267 obstack_grow (&normal_obstack, &dummy, sizeof (rtx));
268 normal_insns = (rtx *) obstack_finish (&normal_obstack);
269
f837a861
MM
270 for (insn_ptr = normal_insns; *insn_ptr; insn_ptr++)
271 gen_proto (*insn_ptr);
272
273 printf ("\n#ifdef MD_CALL_PROTOTYPES\n");
274 for (insn_ptr = call_insns; *insn_ptr; insn_ptr++)
275 gen_proto (*insn_ptr);
276
277 printf ("\n#else /* !MD_CALL_PROTOTYPES */\n");
278 for (insn_ptr = call_insns; *insn_ptr; insn_ptr++)
279 gen_nonproto (*insn_ptr);
280
281 printf ("#endif /* !MD_CALL_PROTOTYPES */\n");
f837a861 282
41299f41 283 fflush (stdout);
c1b59dce 284 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
41299f41 285}
a995e389
RH
286
287/* Define this so we can link with print-rtl.o to get debug_rtx function. */
288const char *
289get_insn_name (code)
c1b59dce 290 int code ATTRIBUTE_UNUSED;
a995e389
RH
291{
292 return NULL;
293}