]>
gcc.gnu.org Git - gcc.git/blob - gcc/genflags.c
1 /* Generate from machine description:
3 - some flags HAVE_... saying which simple standard instructions are
4 available for this machine.
5 Copyright (C) 1987, 1991, 1995 Free Software Foundation, Inc.
7 This file is part of GNU CC.
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 GNU CC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
30 static struct obstack obstack
;
31 struct obstack
*rtl_obstack
= &obstack
;
33 #define obstack_chunk_alloc xmalloc
34 #define obstack_chunk_free free
37 extern rtx
read_rtx ();
43 /* Names for patterns. Need to allow linking with print-rtl. */
46 /* Obstacks to remember normal, and call insns. */
47 static struct obstack call_obstack
, normal_obstack
;
49 /* Max size of names encountered. */
50 static int max_id_len
;
52 /* Count the number of match_operand's found. */
59 enum rtx_code code
= GET_CODE (x
);
60 char *format_ptr
= GET_RTX_FORMAT (code
);
62 if (code
== MATCH_OPERAND
)
65 if (code
== MATCH_OPERATOR
|| code
== MATCH_PARALLEL
)
68 for (i
= 0; i
< GET_RTX_LENGTH (code
); i
++)
70 switch (*format_ptr
++)
74 count
+= num_operands (XEXP (x
, i
));
78 if (XVEC (x
, i
) != NULL
)
79 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
80 count
+= num_operands (XVECEXP (x
, i
, j
));
89 /* Print out prototype information for a function. */
94 int num
= num_operands (insn
);
95 printf ("extern rtx gen_%-*s PROTO((", max_id_len
, XSTR (insn
, 0));
110 /* Print out a function declaration without a prototype. */
115 printf ("extern rtx gen_%s ();\n", XSTR (insn
, 0));
122 char *name
= XSTR (insn
, 0);
124 struct obstack
*obstack_ptr
;
127 /* Don't mention instructions whose names are the null string
128 or begin with '*'. They are in the machine description just
130 if (name
[0] == 0 || name
[0] == '*')
135 if (len
> max_id_len
)
138 printf ("#define HAVE_%s ", name
);
139 if (strlen (XSTR (insn
, 2)) == 0)
143 /* Write the macro definition, putting \'s at the end of each line,
146 for (p
= XSTR (insn
, 2); *p
; p
++)
156 /* Save the current insn, so that we can later put out appropriate
157 prototypes. At present, most md files have the wrong number of
158 arguments for the call insns (call, call_value, call_pop,
159 call_value_pop) ignoring the extra arguments that are passed for
160 some machines, so by default, turn off the prototype. */
162 obstack_ptr
= (name
[0] == 'c'
163 && (!strcmp (name
, "call")
164 || !strcmp (name
, "call_value")
165 || !strcmp (name
, "call_pop")
166 || !strcmp (name
, "call_value_pop")))
167 ? &call_obstack
: &normal_obstack
;
169 obstack_grow (obstack_ptr
, &insn
, sizeof (rtx
));
176 register char *val
= (char *) malloc (size
);
179 fatal ("virtual memory exhausted");
189 char *result
= (char *) realloc (ptr
, size
);
191 fatal ("virtual memory exhausted");
199 fprintf (stderr
, "genflags: ");
200 fprintf (stderr
, s
, a1
, a2
);
201 fprintf (stderr
, "\n");
202 exit (FATAL_EXIT_CODE
);
205 /* More 'friendly' abort that prints the line and file.
206 config.h can #define abort fancy_abort if you like that sort of thing. */
211 fatal ("Internal gcc abort.");
227 obstack_init (rtl_obstack
);
228 obstack_init (&call_obstack
);
229 obstack_init (&normal_obstack
);
232 fatal ("No input file name.");
234 infile
= fopen (argv
[1], "r");
238 exit (FATAL_EXIT_CODE
);
243 printf ("/* Generated automatically by the program `genflags'\n\
244 from the machine description file `md'. */\n\n");
246 /* Read the machine description. */
250 c
= read_skip_spaces (infile
);
255 desc
= read_rtx (infile
);
256 if (GET_CODE (desc
) == DEFINE_INSN
|| GET_CODE (desc
) == DEFINE_EXPAND
)
260 /* Print out the prototypes now. */
262 obstack_grow (&call_obstack
, &dummy
, sizeof (rtx
));
263 call_insns
= (rtx
*) obstack_finish (&call_obstack
);
265 obstack_grow (&normal_obstack
, &dummy
, sizeof (rtx
));
266 normal_insns
= (rtx
*) obstack_finish (&normal_obstack
);
268 printf ("\n#ifndef NO_MD_PROTOTYPES\n");
269 for (insn_ptr
= normal_insns
; *insn_ptr
; insn_ptr
++)
270 gen_proto (*insn_ptr
);
272 printf ("\n#ifdef MD_CALL_PROTOTYPES\n");
273 for (insn_ptr
= call_insns
; *insn_ptr
; insn_ptr
++)
274 gen_proto (*insn_ptr
);
276 printf ("\n#else /* !MD_CALL_PROTOTYPES */\n");
277 for (insn_ptr
= call_insns
; *insn_ptr
; insn_ptr
++)
278 gen_nonproto (*insn_ptr
);
280 printf ("#endif /* !MD_CALL_PROTOTYPES */\n");
281 printf ("\n#else /* NO_MD_PROTOTYPES */\n");
282 for (insn_ptr
= normal_insns
; *insn_ptr
; insn_ptr
++)
283 gen_nonproto (*insn_ptr
);
285 for (insn_ptr
= call_insns
; *insn_ptr
; insn_ptr
++)
286 gen_nonproto (*insn_ptr
);
288 printf ("#endif /* NO_MD_PROTOTYPES */\n");
291 exit (ferror (stdout
) != 0 ? FATAL_EXIT_CODE
: SUCCESS_EXIT_CODE
);
This page took 0.045664 seconds and 5 git commands to generate.