]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/genflags.c
1 /* Generate from machine description:
2 - some flags HAVE_... saying which simple standard instructions are
3 available for this machine.
4 Copyright (C) 1987, 91, 95, 98, 99, 2000 Free Software Foundation, Inc.
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 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
36 /* Obstacks to remember normal, and call insns. */
37 static struct obstack call_obstack
, normal_obstack
;
39 /* Max size of names encountered. */
40 static int max_id_len
;
42 /* Max operand encountered in a scan over some insn. */
45 static void max_operand_1
PARAMS ((rtx
));
46 static int num_operands
PARAMS ((rtx
));
47 static void gen_proto
PARAMS ((rtx
));
48 static void gen_nonproto
PARAMS ((rtx
));
49 static void gen_insn
PARAMS ((rtx
));
51 /* Count the number of match_operand's found. */
57 register RTX_CODE code
;
60 register const char *fmt
;
67 if (code
== MATCH_OPERAND
|| code
== MATCH_OPERATOR
68 || code
== MATCH_PARALLEL
)
69 max_opno
= MAX (max_opno
, XINT (x
, 0));
71 fmt
= GET_RTX_FORMAT (code
);
72 len
= GET_RTX_LENGTH (code
);
73 for (i
= 0; i
< len
; i
++)
75 if (fmt
[i
] == 'e' || fmt
[i
] == 'u')
76 max_operand_1 (XEXP (x
, i
));
77 else if (fmt
[i
] == 'E')
80 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
81 max_operand_1 (XVECEXP (x
, i
, j
));
90 register int len
= XVECLEN (insn
, 1);
95 for (i
= 0; i
< len
; i
++)
96 max_operand_1 (XVECEXP (insn
, 1, i
));
101 /* Print out prototype information for a function. */
107 int num
= num_operands (insn
);
108 printf ("extern rtx gen_%-*s PARAMS ((", max_id_len
, XSTR (insn
, 0));
123 /* Print out a function declaration without a prototype. */
129 printf ("extern rtx gen_%s ();\n", XSTR (insn
, 0));
136 char *name
= XSTR (insn
, 0);
138 struct obstack
*obstack_ptr
;
141 /* Don't mention instructions whose names are the null string
142 or begin with '*'. They are in the machine description just
144 if (name
[0] == 0 || name
[0] == '*')
149 if (len
> max_id_len
)
152 printf ("#define HAVE_%s ", name
);
153 if (strlen (XSTR (insn
, 2)) == 0)
157 /* Write the macro definition, putting \'s at the end of each line,
160 for (p
= XSTR (insn
, 2); *p
; p
++)
170 /* Save the current insn, so that we can later put out appropriate
171 prototypes. At present, most md files have the wrong number of
172 arguments for the call insns (call, call_value, call_pop,
173 call_value_pop) ignoring the extra arguments that are passed for
174 some machines, so by default, turn off the prototype. */
176 obstack_ptr
= (name
[0] == 'c'
177 && (!strcmp (name
, "call")
178 || !strcmp (name
, "call_value")
179 || !strcmp (name
, "call_pop")
180 || !strcmp (name
, "call_value_pop")))
181 ? &call_obstack
: &normal_obstack
;
183 obstack_grow (obstack_ptr
, &insn
, sizeof (rtx
));
190 register PTR val
= (PTR
) malloc (size
);
193 fatal ("virtual memory exhausted");
205 ptr
= (PTR
) realloc (old
, size
);
207 ptr
= (PTR
) malloc (size
);
209 fatal ("virtual memory exhausted");
213 extern int main
PARAMS ((int, char **));
228 progname
= "genflags";
229 obstack_init (rtl_obstack
);
230 obstack_init (&call_obstack
);
231 obstack_init (&normal_obstack
);
234 fatal ("No input file name.");
236 infile
= fopen (argv
[1], "r");
240 return (FATAL_EXIT_CODE
);
242 read_rtx_filename
= argv
[1];
244 printf ("/* Generated automatically by the program `genflags'\n\
245 from the machine description file `md'. */\n\n");
247 /* Read the machine description. */
251 c
= read_skip_spaces (infile
);
256 desc
= read_rtx (infile
);
257 if (GET_CODE (desc
) == DEFINE_INSN
|| GET_CODE (desc
) == DEFINE_EXPAND
)
261 /* Print out the prototypes now. */
263 obstack_grow (&call_obstack
, &dummy
, sizeof (rtx
));
264 call_insns
= (rtx
*) obstack_finish (&call_obstack
);
266 obstack_grow (&normal_obstack
, &dummy
, sizeof (rtx
));
267 normal_insns
= (rtx
*) obstack_finish (&normal_obstack
);
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");
283 return (ferror (stdout
) != 0 ? FATAL_EXIT_CODE
: SUCCESS_EXIT_CODE
);
286 /* Define this so we can link with print-rtl.o to get debug_rtx function. */
289 int code ATTRIBUTE_UNUSED
;