1 /* Generate code from to output assembler insns as recognized from rtl.
2 Copyright (C) 1987, 88, 92, 94-95, 97-98, 1999 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 /* This program reads the machine description for the compiler target machine
23 and produces a file containing these things:
25 1. An array of strings `insn_template' which is indexed by insn code number
26 and contains the template for output of that insn,
28 2. An array of functions `insn_outfun' which, indexed by the insn code
29 number, gives the function that returns a template to use for output of
30 that insn. This is used only in the cases where the template is not
31 constant. These cases are specified by a * or @ at the beginning of the
32 template string in the machine description. They are identified for the
33 sake of other parts of the compiler by a zero element in `insn_template'.
35 3. An array of functions `insn_gen_function' which, indexed
36 by insn code number, gives the function to generate a body
37 for that pattern, given operands as arguments.
39 4. An array of strings `insn_name' which, indexed by insn code number,
40 gives the name for that pattern. Nameless patterns are given a name.
42 5. An array of ints `insn_n_operands' which is indexed by insn code number
43 and contains the number of distinct operands in the pattern for that insn,
45 6. An array of ints `insn_n_dups' which is indexed by insn code number
46 and contains the number of match_dup's that appear in the insn's pattern.
47 This says how many elements of `recog_dup_loc' are significant
48 after an insn has been recognized.
50 7. An array of arrays of operand constraint strings,
51 `insn_operand_constraint',
52 indexed first by insn code number and second by operand number,
53 containing the constraint for that operand.
55 This array is generated only if register constraints appear in
58 8. An array of arrays of chars which indicate which operands of
59 which insn patterns appear within ADDRESS rtx's. This array is
60 called `insn_operand_address_p' and is generated only if there
61 are *no* register constraints in the match_operand rtx's.
63 9. An array of arrays of machine modes, `insn_operand_mode',
64 indexed first by insn code number and second by operand number,
65 containing the machine mode that that operand is supposed to have.
66 Also `insn_operand_strict_low', which is nonzero for operands
67 contained in a STRICT_LOW_PART.
69 10. An array of arrays of int-valued functions, `insn_operand_predicate',
70 indexed first by insn code number and second by operand number,
71 containing the match_operand predicate for this operand.
73 11. An array of ints, `insn_n_alternatives', that gives the number
74 of alternatives in the constraints of each pattern.
76 The code number of an insn is simply its position in the machine description;
77 code numbers are assigned sequentially to entries in the description,
78 starting with code number 0.
80 Thus, the following entry in the machine description
83 [(set (match_operand:DF 0 "general_operand" "")
88 assuming it is the 25th entry present, would cause
89 insn_template[24] to be "clrd %0", and insn_n_operands[24] to be 1.
90 It would not make an case in output_insn_hairy because the template
91 given in the entry is a constant (it does not start with `*'). */
98 /* No instruction can have more operands than this.
99 Sorry for this arbitrary limit, but what machine will
100 have an instruction with this many operands? */
102 #define MAX_MAX_OPERANDS 40
104 static struct obstack obstack;
105 struct obstack *rtl_obstack = &obstack;
107 #define obstack_chunk_alloc xmalloc
108 #define obstack_chunk_free free
110 void fatal PVPROTO ((const char *, ...))
111 ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
112 void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
113 static void error PVPROTO ((const char *, ...)) ATTRIBUTE_PRINTF_1;
114 static int n_occurrences PROTO((int, char *));
116 /* Define this so we can link with print-rtl.o to get debug_rtx function. */
117 char **insn_name_ptr = 0;
119 /* insns in the machine description are assigned sequential code numbers
120 that are used by insn-recog.c (produced by genrecog) to communicate
121 to insn-output.c (produced by this program). */
123 static int next_code_number;
125 /* This counts all definitions in the md file,
126 for the sake of error messages. */
128 static int next_index_number;
130 /* Record in this chain all information that we will output,
131 associated with the code number of the insn. */
138 char *template; /* string such as "movl %1,%0" */
139 int n_operands; /* Number of operands this insn recognizes */
140 int n_dups; /* Number times match_dup appears in pattern */
141 int n_alternatives; /* Number of alternatives in each constraint */
143 char *constraints[MAX_MAX_OPERANDS];
144 /* Number of alternatives in constraints of operand N. */
145 int op_n_alternatives[MAX_MAX_OPERANDS];
146 char *predicates[MAX_MAX_OPERANDS];
147 char address_p[MAX_MAX_OPERANDS];
148 enum machine_mode modes[MAX_MAX_OPERANDS];
149 char strict_low[MAX_MAX_OPERANDS];
150 char outfun; /* Nonzero means this has an output function */
153 /* This variable points to the first link in the chain. */
155 struct data *insn_data;
157 /* Pointer to the last link in the chain, so new elements
158 can be added at the end. */
160 struct data *end_of_insn_data;
162 /* Nonzero if any match_operand has a constraint string;
163 implies that REGISTER_CONSTRAINTS will be defined
164 for this machine description. */
166 int have_constraints;
168 /* Nonzero if some error has occurred. We will make all errors fatal, but
169 might as well continue until we see all of them. */
171 static int have_error;
173 static char * name_for_index PROTO((int));
174 static void output_prologue PROTO((void));
175 static void output_epilogue PROTO((void));
176 static void scan_operands PROTO((rtx, int, int));
177 static void process_template PROTO((struct data *, char *));
178 static void validate_insn_alternatives PROTO((struct data *));
179 static void gen_insn PROTO((rtx));
180 static void gen_peephole PROTO((rtx));
181 static void gen_expand PROTO((rtx));
182 static void gen_split PROTO((rtx));
183 static int n_occurrences PROTO((int, char *));
186 name_for_index (index)
189 static char buf[100];
191 struct data *i, *last_named = NULL;
192 for (i = insn_data; i ; i = i->next)
194 if (i->index_number == index)
201 sprintf(buf, "%s+%d", last_named->name, index - last_named->index_number);
203 sprintf(buf, "insn %d", index);
211 printf ("/* Generated automatically by the program `genoutput'\n\
212 from the machine description file `md'. */\n\n");
214 printf ("#include \"config.h\"\n");
215 printf ("#include \"system.h\"\n");
216 printf ("#include \"flags.h\"\n");
217 printf ("#include \"rtl.h\"\n");
218 printf ("#include \"function.h\"\n");
219 printf ("#include \"regs.h\"\n");
220 printf ("#include \"hard-reg-set.h\"\n");
221 printf ("#include \"real.h\"\n");
222 printf ("#include \"insn-config.h\"\n\n");
223 printf ("#include \"conditions.h\"\n");
224 printf ("#include \"insn-flags.h\"\n");
225 printf ("#include \"insn-attr.h\"\n\n");
226 printf ("#include \"insn-codes.h\"\n\n");
227 printf ("#include \"recog.h\"\n\n");
229 printf ("#include \"output.h\"\n");
235 register struct data *d;
237 printf ("\nconst char * const insn_template[] =\n {\n");
238 for (d = insn_data; d; d = d->next)
241 printf (" \"%s\",\n", d->template);
247 printf ("\nconst char *(*const insn_outfun[]) PROTO((rtx *, rtx)) =\n {\n");
248 for (d = insn_data; d; d = d->next)
251 printf (" output_%d,\n", d->code_number);
257 printf ("\nrtx (*const insn_gen_function[]) () =\n {\n");
258 for (d = insn_data; d; d = d->next)
260 if (d->name && d->name[0] != '*')
261 printf (" gen_%s,\n", d->name);
267 printf ("\nconst char *insn_name[] =\n {\n");
271 char * last_name = 0;
272 char * next_name = 0;
273 register struct data *n;
275 for (n = insn_data, next = 1; n; n = n->next, next++)
282 for (d = insn_data; d; d = d->next)
286 printf (" \"%s\",\n", d->name);
290 for (n = d->next, next = 1; n; n = n->next, next++)
300 if (next_name && (last_name == 0 || offset > next / 2))
301 printf (" \"%s-%d\",\n", next_name, next - offset);
303 printf (" \"%s+%d\",\n", last_name, offset);
308 printf ("const char **insn_name_ptr = insn_name;\n");
310 printf ("\nconst int insn_n_operands[] =\n {\n");
311 for (d = insn_data; d; d = d->next)
312 printf (" %d,\n", d->n_operands);
315 printf ("\nconst int insn_n_dups[] =\n {\n");
316 for (d = insn_data; d; d = d->next)
317 printf (" %d,\n", d->n_dups);
320 if (have_constraints)
322 printf ("\nconst char *const insn_operand_constraint[][MAX_RECOG_OPERANDS] =\n {\n");
323 for (d = insn_data; d; d = d->next)
327 for (i = 0; i < d->n_operands; i++)
329 if (d->constraints[i] == 0)
332 printf (" \"%s\",", d->constraints[i]);
334 if (d->n_operands == 0)
342 printf ("\nconst char insn_operand_address_p[][MAX_RECOG_OPERANDS] =\n {\n");
343 for (d = insn_data; d; d = d->next)
347 for (i = 0; i < d->n_operands; i++)
348 printf (" %d,", d->address_p[i]);
349 if (d->n_operands == 0)
356 printf ("\nconst enum machine_mode insn_operand_mode[][MAX_RECOG_OPERANDS] =\n {\n");
357 for (d = insn_data; d; d = d->next)
361 for (i = 0; i < d->n_operands; i++)
362 printf (" %smode,", GET_MODE_NAME (d->modes[i]));
363 if (d->n_operands == 0)
364 printf (" VOIDmode");
369 printf ("\nconst char insn_operand_strict_low[][MAX_RECOG_OPERANDS] =\n {\n");
370 for (d = insn_data; d; d = d->next)
374 for (i = 0; i < d->n_operands; i++)
375 printf (" %d,", d->strict_low[i]);
376 if (d->n_operands == 0)
383 /* We need to define all predicates used. Keep a list of those we
384 have defined so far. There normally aren't very many predicates used,
385 so a linked list should be fast enough. */
386 struct predicate { char *name; struct predicate *next; } *predicates = 0;
391 for (d = insn_data; d; d = d->next)
392 for (i = 0; i < d->n_operands; i++)
393 if (d->predicates[i] && d->predicates[i][0])
395 for (p = predicates; p; p = p->next)
396 if (! strcmp (p->name, d->predicates[i]))
401 printf ("extern int %s PROTO ((rtx, enum machine_mode));\n",
403 p = (struct predicate *) alloca (sizeof (struct predicate));
404 p->name = d->predicates[i];
405 p->next = predicates;
410 printf ("\nint (*const insn_operand_predicate[][MAX_RECOG_OPERANDS]) PROTO ((rtx, enum machine_mode)) =\n {\n");
411 for (d = insn_data; d; d = d->next)
414 for (i = 0; i < d->n_operands; i++)
415 printf (" %s,", ((d->predicates[i] && d->predicates[i][0])
416 ? d->predicates[i] : "0"));
417 if (d->n_operands == 0)
424 printf ("\nconst int insn_n_alternatives[] =\n {\n");
425 for (d = insn_data; d; d = d->next)
426 printf (" %d,\n", d->n_alternatives);
430 /* scan_operands (X) stores in max_opno the largest operand
431 number present in X, if that is larger than the previous
432 value of max_opno. It stores all the constraints in `constraints'
433 and all the machine modes in `modes'.
435 THIS_ADDRESS_P is nonzero if the containing rtx was an ADDRESS.
436 THIS_STRICT_LOW is nonzero if the containing rtx was a STRICT_LOW_PART. */
440 static char *constraints[MAX_MAX_OPERANDS];
441 static int op_n_alternatives[MAX_MAX_OPERANDS];
442 static const char *predicates[MAX_MAX_OPERANDS];
443 static char address_p[MAX_MAX_OPERANDS];
444 static enum machine_mode modes[MAX_MAX_OPERANDS];
445 static char strict_low[MAX_MAX_OPERANDS];
446 static char seen[MAX_MAX_OPERANDS];
449 scan_operands (part, this_address_p, this_strict_low)
455 register const char *format_ptr;
461 switch (GET_CODE (part))
464 opno = XINT (part, 0);
467 if (max_opno >= MAX_MAX_OPERANDS)
469 error ("Too many operands (%d) in definition %s.\n",
470 max_opno + 1, name_for_index (next_index_number));
474 error ("Definition %s specified operand number %d more than once.\n",
475 name_for_index (next_index_number), opno);
477 modes[opno] = GET_MODE (part);
478 strict_low[opno] = this_strict_low;
479 predicates[opno] = XSTR (part, 1);
480 constraints[opno] = XSTR (part, 2);
481 if (XSTR (part, 2) != 0 && *XSTR (part, 2) != 0)
483 op_n_alternatives[opno] = n_occurrences (',', XSTR (part, 2)) + 1;
484 have_constraints = 1;
486 address_p[opno] = this_address_p;
490 opno = XINT (part, 0);
493 if (max_opno >= MAX_MAX_OPERANDS)
495 error ("Too many operands (%d) in definition %s.\n",
496 max_opno + 1, name_for_index (next_index_number));
500 error ("Definition %s specified operand number %d more than once.\n",
501 name_for_index (next_index_number), opno);
503 modes[opno] = GET_MODE (part);
504 strict_low[opno] = 0;
505 predicates[opno] = "scratch_operand";
506 constraints[opno] = XSTR (part, 1);
507 if (XSTR (part, 1) != 0 && *XSTR (part, 1) != 0)
509 op_n_alternatives[opno] = n_occurrences (',', XSTR (part, 1)) + 1;
510 have_constraints = 1;
517 opno = XINT (part, 0);
520 if (max_opno >= MAX_MAX_OPERANDS)
522 error ("Too many operands (%d) in definition %s.\n",
523 max_opno + 1, name_for_index (next_index_number));
527 error ("Definition %s specified operand number %d more than once.\n",
528 name_for_index (next_index_number), opno);
530 modes[opno] = GET_MODE (part);
531 strict_low[opno] = 0;
532 predicates[opno] = XSTR (part, 1);
533 constraints[opno] = 0;
535 for (i = 0; i < XVECLEN (part, 2); i++)
536 scan_operands (XVECEXP (part, 2, i), 0, 0);
546 scan_operands (XEXP (part, 0), 1, 0);
549 case STRICT_LOW_PART:
550 scan_operands (XEXP (part, 0), 0, 1);
557 format_ptr = GET_RTX_FORMAT (GET_CODE (part));
559 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++)
560 switch (*format_ptr++)
564 scan_operands (XEXP (part, i), 0, 0);
567 if (XVEC (part, i) != NULL)
568 for (j = 0; j < XVECLEN (part, i); j++)
569 scan_operands (XVECEXP (part, i, j), 0, 0);
574 /* Process an assembler template from a define_insn or a define_peephole.
575 It is either the assembler code template, a list of assembler code
576 templates, or C code to generate the assembler code template. */
579 process_template (d, template)
586 /* We need to consider only the instructions whose assembler code template
587 starts with a * or @. These are the ones where C code is run to decide
588 on a template to use. So for all others just return now. */
590 if (template[0] != '*' && template[0] != '@')
592 d->template = template;
600 printf ("\nstatic const char *output_%d PROTO ((rtx *, rtx));\n",
602 printf ("\nstatic const char *\n");
603 printf ("output_%d (operands, insn)\n", d->code_number);
604 printf (" rtx *operands ATTRIBUTE_UNUSED;\n");
605 printf (" rtx insn ATTRIBUTE_UNUSED;\n");
608 /* If the assembler code template starts with a @ it is a newline-separated
609 list of assembler code templates, one for each alternative. So produce
610 a routine to select the correct one. */
612 if (template[0] == '@')
615 printf (" static const char *const strings_%d[] = {\n",
618 for (i = 0, cp = &template[1]; *cp; )
620 while (*cp == '\n' || *cp == ' ' || *cp== '\t')
624 while (*cp != '\n' && *cp != '\0')
635 printf (" return strings_%d[which_alternative];\n", d->code_number);
637 if (i != d->n_alternatives)
638 fatal ("Insn pattern %d has %d alternatives but %d assembler choices",
639 d->index_number, d->n_alternatives, i);
644 /* The following is done in a funny way to get around problems in
645 VAX-11 "C" on VMS. It is the equivalent of:
646 printf ("%s\n", &template[1])); */
659 /* Check insn D for consistency in number of constraint alternatives. */
662 validate_insn_alternatives (d)
665 register int n = 0, start;
666 /* Make sure all the operands have the same number of
667 alternatives in their constraints.
668 Let N be that number. */
669 for (start = 0; start < d->n_operands; start++)
670 if (d->op_n_alternatives[start] > 0)
673 n = d->op_n_alternatives[start];
674 else if (n != d->op_n_alternatives[start])
675 error ("wrong number of alternatives in operand %d of insn %s",
676 start, name_for_index (d->index_number));
678 /* Record the insn's overall number of alternatives. */
679 d->n_alternatives = n;
682 /* Look at a define_insn just read. Assign its code number.
683 Record on insn_data the template and the number of arguments.
684 If the insn has a hairy output action, output a function for now. */
690 register struct data *d = (struct data *) xmalloc (sizeof (struct data));
693 d->code_number = next_code_number++;
694 d->index_number = next_index_number;
695 if (XSTR (insn, 0)[0])
696 d->name = XSTR (insn, 0);
700 /* Build up the list in the same order as the insns are seen
701 in the machine description. */
703 if (end_of_insn_data)
704 end_of_insn_data->next = d;
708 end_of_insn_data = d;
713 memset (constraints, 0, sizeof constraints);
714 memset (op_n_alternatives, 0, sizeof op_n_alternatives);
715 memset (predicates, 0, sizeof predicates);
716 memset (address_p, 0, sizeof address_p);
717 memset (modes, 0, sizeof modes);
718 memset (strict_low, 0, sizeof strict_low);
719 memset (seen, 0, sizeof seen);
721 for (i = 0; i < XVECLEN (insn, 1); i++)
722 scan_operands (XVECEXP (insn, 1, i), 0, 0);
724 d->n_operands = max_opno + 1;
725 d->n_dups = num_dups;
727 memcpy (d->constraints, constraints, sizeof constraints);
728 memcpy (d->op_n_alternatives, op_n_alternatives, sizeof op_n_alternatives);
729 memcpy (d->predicates, predicates, sizeof predicates);
730 memcpy (d->address_p, address_p, sizeof address_p);
731 memcpy (d->modes, modes, sizeof modes);
732 memcpy (d->strict_low, strict_low, sizeof strict_low);
734 validate_insn_alternatives (d);
735 process_template (d, XSTR (insn, 3));
738 /* Look at a define_peephole just read. Assign its code number.
739 Record on insn_data the template and the number of arguments.
740 If the insn has a hairy output action, output it now. */
746 register struct data *d = (struct data *) xmalloc (sizeof (struct data));
749 d->code_number = next_code_number++;
750 d->index_number = next_index_number;
753 /* Build up the list in the same order as the insns are seen
754 in the machine description. */
756 if (end_of_insn_data)
757 end_of_insn_data->next = d;
761 end_of_insn_data = d;
764 memset (constraints, 0, sizeof constraints);
765 memset (op_n_alternatives, 0, sizeof op_n_alternatives);
766 memset (predicates, 0, sizeof predicates);
767 memset (address_p, 0, sizeof address_p);
768 memset (modes, 0, sizeof modes);
769 memset (strict_low, 0, sizeof strict_low);
770 memset (seen, 0, sizeof seen);
772 /* Get the number of operands by scanning all the
773 patterns of the peephole optimizer.
774 But ignore all the rest of the information thus obtained. */
775 for (i = 0; i < XVECLEN (peep, 0); i++)
776 scan_operands (XVECEXP (peep, 0, i), 0, 0);
778 d->n_operands = max_opno + 1;
781 memcpy (d->constraints, constraints, sizeof constraints);
782 memcpy (d->op_n_alternatives, op_n_alternatives, sizeof op_n_alternatives);
783 memset (d->predicates, 0, sizeof predicates);
784 memset (d->address_p, 0, sizeof address_p);
785 memset (d->modes, 0, sizeof modes);
786 memset (d->strict_low, 0, sizeof strict_low);
788 validate_insn_alternatives (d);
789 process_template (d, XSTR (peep, 2));
792 /* Process a define_expand just read. Assign its code number,
793 only for the purposes of `insn_gen_function'. */
799 register struct data *d = (struct data *) xmalloc (sizeof (struct data));
802 d->code_number = next_code_number++;
803 d->index_number = next_index_number;
804 if (XSTR (insn, 0)[0])
805 d->name = XSTR (insn, 0);
809 /* Build up the list in the same order as the insns are seen
810 in the machine description. */
812 if (end_of_insn_data)
813 end_of_insn_data->next = d;
817 end_of_insn_data = d;
822 /* Scan the operands to get the specified predicates and modes,
823 since expand_binop needs to know them. */
825 memset (constraints, 0, sizeof constraints);
826 memset (op_n_alternatives, 0, sizeof op_n_alternatives);
827 memset (predicates, 0, sizeof predicates);
828 memset (address_p, 0, sizeof address_p);
829 memset (modes, 0, sizeof modes);
830 memset (strict_low, 0, sizeof strict_low);
831 memset (seen, 0, sizeof seen);
834 for (i = 0; i < XVECLEN (insn, 1); i++)
835 scan_operands (XVECEXP (insn, 1, i), 0, 0);
837 d->n_operands = max_opno + 1;
838 d->n_dups = num_dups;
840 memcpy (d->constraints, constraints, sizeof constraints);
841 memcpy (d->op_n_alternatives, op_n_alternatives, sizeof op_n_alternatives);
842 memcpy (d->predicates, predicates, sizeof predicates);
843 memcpy (d->address_p, address_p, sizeof address_p);
844 memcpy (d->modes, modes, sizeof modes);
845 memcpy (d->strict_low, strict_low, sizeof strict_low);
849 validate_insn_alternatives (d);
852 /* Process a define_split just read. Assign its code number,
853 only for reasons of consistency and to simplify genrecog. */
860 register struct data *d = (struct data *) xmalloc (sizeof (struct data));
863 d->code_number = next_code_number++;
864 d->index_number = next_index_number;
867 /* Build up the list in the same order as the insns are seen
868 in the machine description. */
870 if (end_of_insn_data)
871 end_of_insn_data->next = d;
875 end_of_insn_data = d;
880 memset (constraints, 0, sizeof constraints);
881 memset (op_n_alternatives, 0, sizeof op_n_alternatives);
882 memset (predicates, 0, sizeof predicates);
883 memset (address_p, 0, sizeof address_p);
884 memset (modes, 0, sizeof modes);
885 memset (strict_low, 0, sizeof strict_low);
886 memset (seen, 0, sizeof seen);
888 /* Get the number of operands by scanning all the
889 patterns of the split patterns.
890 But ignore all the rest of the information thus obtained. */
891 for (i = 0; i < XVECLEN (split, 0); i++)
892 scan_operands (XVECEXP (split, 0, i), 0, 0);
894 d->n_operands = max_opno + 1;
896 memset (d->constraints, 0, sizeof constraints);
897 memset (d->op_n_alternatives, 0, sizeof op_n_alternatives);
898 memset (d->predicates, 0, sizeof predicates);
899 memset (d->address_p, 0, sizeof address_p);
900 memset (d->modes, 0, sizeof modes);
901 memset (d->strict_low, 0, sizeof strict_low);
904 d->n_alternatives = 0;
913 register PTR val = (PTR) malloc (size);
916 fatal ("virtual memory exhausted");
927 ptr = (PTR) realloc (old, size);
929 ptr = (PTR) malloc (size);
931 fatal ("virtual memory exhausted");
936 fatal VPROTO ((const char *format, ...))
938 #ifndef ANSI_PROTOTYPES
943 VA_START (ap, format);
945 #ifndef ANSI_PROTOTYPES
946 format = va_arg (ap, const char *);
949 fprintf (stderr, "genoutput: ");
950 vfprintf (stderr, format, ap);
952 fprintf (stderr, "\n");
953 exit (FATAL_EXIT_CODE);
956 /* More 'friendly' abort that prints the line and file.
957 config.h can #define abort fancy_abort if you like that sort of thing. */
962 fatal ("Internal gcc abort.");
966 error VPROTO ((const char *format, ...))
968 #ifndef ANSI_PROTOTYPES
973 VA_START (ap, format);
975 #ifndef ANSI_PROTOTYPES
976 format = va_arg (ap, const char *);
979 fprintf (stderr, "genoutput: ");
980 vfprintf (stderr, format, ap);
982 fprintf (stderr, "\n");
996 obstack_init (rtl_obstack);
999 fatal ("No input file name.");
1001 infile = fopen (argv[1], "r");
1005 exit (FATAL_EXIT_CODE);
1011 next_code_number = 0;
1012 next_index_number = 0;
1013 have_constraints = 0;
1015 /* Read the machine description. */
1019 c = read_skip_spaces (infile);
1024 desc = read_rtx (infile);
1025 if (GET_CODE (desc) == DEFINE_INSN)
1027 if (GET_CODE (desc) == DEFINE_PEEPHOLE)
1028 gen_peephole (desc);
1029 if (GET_CODE (desc) == DEFINE_EXPAND)
1031 if (GET_CODE (desc) == DEFINE_SPLIT)
1033 next_index_number++;
1039 exit (ferror (stdout) != 0 || have_error
1040 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
1047 n_occurrences (c, s)