xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/genoutput.c (revision e6c7e151de239c49d2e38720a061ed9d1fa99309)
1 /* Generate code from to output assembler insns as recognized from rtl.
2    Copyright (C) 1987-2017 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 
21 /* This program reads the machine description for the compiler target machine
22    and produces a file containing these things:
23 
24    1. An array of `struct insn_data_d', which is indexed by insn code number,
25    which contains:
26 
27      a. `name' is the name for that pattern.  Nameless patterns are
28      given a name.
29 
30      b. `output' hold either the output template, an array of output
31      templates, or an output function.
32 
33      c. `genfun' is the function to generate a body for that pattern,
34      given operands as arguments.
35 
36      d. `n_operands' is the number of distinct operands in the pattern
37      for that insn,
38 
39      e. `n_dups' is the number of match_dup's that appear in the insn's
40      pattern.  This says how many elements of `recog_data.dup_loc' are
41      significant after an insn has been recognized.
42 
43      f. `n_alternatives' is the number of alternatives in the constraints
44      of each pattern.
45 
46      g. `output_format' tells what type of thing `output' is.
47 
48      h. `operand' is the base of an array of operand data for the insn.
49 
50    2. An array of `struct insn_operand data', used by `operand' above.
51 
52      a. `predicate', an int-valued function, is the match_operand predicate
53      for this operand.
54 
55      b. `constraint' is the constraint for this operand.
56 
57      c. `address_p' indicates that the operand appears within ADDRESS
58      rtx's.
59 
60      d. `mode' is the machine mode that that operand is supposed to have.
61 
62      e. `strict_low', is nonzero for operands contained in a STRICT_LOW_PART.
63 
64      f. `eliminable', is nonzero for operands that are matched normally by
65      MATCH_OPERAND; it is zero for operands that should not be changed during
66      register elimination such as MATCH_OPERATORs.
67 
68      g. `allows_mem', is true for operands that accept MEM rtxes.
69 
70   The code number of an insn is simply its position in the machine
71   description; code numbers are assigned sequentially to entries in
72   the description, starting with code number 0.
73 
74   Thus, the following entry in the machine description
75 
76     (define_insn "clrdf"
77       [(set (match_operand:DF 0 "general_operand" "")
78 	    (const_int 0))]
79       ""
80       "clrd %0")
81 
82   assuming it is the 25th entry present, would cause
83   insn_data[24].template to be "clrd %0", and
84   insn_data[24].n_operands to be 1.  */
85 
86 #include "bconfig.h"
87 #include "system.h"
88 #include "coretypes.h"
89 #include "tm.h"
90 #include "rtl.h"
91 #include "errors.h"
92 #include "read-md.h"
93 #include "gensupport.h"
94 
95 /* No instruction can have more operands than this.  Sorry for this
96    arbitrary limit, but what machine will have an instruction with
97    this many operands?  */
98 
99 #define MAX_MAX_OPERANDS 40
100 
101 static char general_mem[] = { TARGET_MEM_CONSTRAINT, 0 };
102 
103 static int n_occurrences		(int, const char *);
104 static const char *strip_whitespace	(const char *);
105 
106 /* This counts all operands used in the md file.  The first is null.  */
107 
108 static int next_operand_number = 1;
109 
110 /* Record in this chain all information about the operands we will output.  */
111 
112 struct operand_data
113 {
114   struct operand_data *next;
115   int index;
116   const char *predicate;
117   const char *constraint;
118   machine_mode mode;
119   unsigned char n_alternatives;
120   char address_p;
121   char strict_low;
122   char eliminable;
123   char seen;
124 };
125 
126 /* Begin with a null operand at index 0.  */
127 
128 static struct operand_data null_operand =
129 {
130   0, 0, "", "", VOIDmode, 0, 0, 0, 0, 0
131 };
132 
133 static struct operand_data *odata = &null_operand;
134 static struct operand_data **odata_end = &null_operand.next;
135 
136 /* Must match the constants in recog.h.  */
137 
138 #define INSN_OUTPUT_FORMAT_NONE         0       /* abort */
139 #define INSN_OUTPUT_FORMAT_SINGLE       1       /* const char * */
140 #define INSN_OUTPUT_FORMAT_MULTI        2       /* const char * const * */
141 #define INSN_OUTPUT_FORMAT_FUNCTION     3       /* const char * (*)(...) */
142 
143 /* Record in this chain all information that we will output,
144    associated with the code number of the insn.  */
145 
146 struct data
147 {
148   struct data *next;
149   const char *name;
150   const char *template_code;
151   file_location loc;
152   int code_number;
153   int n_generator_args;		/* Number of arguments passed to generator */
154   int n_operands;		/* Number of operands this insn recognizes */
155   int n_dups;			/* Number times match_dup appears in pattern */
156   int n_alternatives;		/* Number of alternatives in each constraint */
157   int operand_number;		/* Operand index in the big array.  */
158   int output_format;		/* INSN_OUTPUT_FORMAT_*.  */
159   struct operand_data operand[MAX_MAX_OPERANDS];
160 };
161 
162 /* This variable points to the first link in the insn chain.  */
163 static struct data *idata;
164 
165 /* This variable points to the end of the insn chain.  This is where
166    everything relevant from the machien description is appended to.  */
167 static struct data **idata_end;
168 
169 
170 static void output_prologue (void);
171 static void output_operand_data (void);
172 static void output_insn_data (void);
173 static void output_get_insn_name (void);
174 static void scan_operands (struct data *, rtx, int, int);
175 static int compare_operands (struct operand_data *,
176 			     struct operand_data *);
177 static void place_operands (struct data *);
178 static void process_template (struct data *, const char *);
179 static void validate_insn_alternatives (struct data *);
180 static void validate_insn_operands (struct data *);
181 
182 struct constraint_data
183 {
184   struct constraint_data *next_this_letter;
185   file_location loc;
186   unsigned int namelen;
187   char name[1];
188 };
189 
190 /* All machine-independent constraint characters (except digits) that
191    are handled outside the define*_constraint mechanism.  */
192 static const char indep_constraints[] = ",=+%*?!^$#&g";
193 
194 static struct constraint_data *
195 constraints_by_letter_table[1 << CHAR_BIT];
196 
197 static int mdep_constraint_len (const char *, file_location, int);
198 static void note_constraint (md_rtx_info *);
199 
200 static void
201 output_prologue (void)
202 {
203   printf ("/* Generated automatically by the program `genoutput'\n\
204    from the machine description file `md'.  */\n\n");
205 
206   printf ("#include \"config.h\"\n");
207   printf ("#include \"system.h\"\n");
208   printf ("#include \"coretypes.h\"\n");
209   printf ("#include \"backend.h\"\n");
210   printf ("#include \"predict.h\"\n");
211   printf ("#include \"tree.h\"\n");
212   printf ("#include \"rtl.h\"\n");
213   printf ("#include \"flags.h\"\n");
214   printf ("#include \"alias.h\"\n");
215   printf ("#include \"varasm.h\"\n");
216   printf ("#include \"stor-layout.h\"\n");
217   printf ("#include \"calls.h\"\n");
218   printf ("#include \"insn-config.h\"\n");
219   printf ("#include \"expmed.h\"\n");
220   printf ("#include \"dojump.h\"\n");
221   printf ("#include \"explow.h\"\n");
222   printf ("#include \"memmodel.h\"\n");
223   printf ("#include \"emit-rtl.h\"\n");
224   printf ("#include \"stmt.h\"\n");
225   printf ("#include \"expr.h\"\n");
226   printf ("#include \"insn-codes.h\"\n");
227   printf ("#include \"tm_p.h\"\n");
228   printf ("#include \"regs.h\"\n");
229   printf ("#include \"conditions.h\"\n");
230   printf ("#include \"insn-attr.h\"\n\n");
231   printf ("#include \"recog.h\"\n\n");
232   printf ("#include \"diagnostic-core.h\"\n");
233   printf ("#include \"output.h\"\n");
234   printf ("#include \"target.h\"\n");
235   printf ("#include \"tm-constrs.h\"\n");
236 }
237 
238 static void
239 output_operand_data (void)
240 {
241   struct operand_data *d;
242 
243   printf ("\nstatic const struct insn_operand_data operand_data[] = \n{\n");
244 
245   for (d = odata; d; d = d->next)
246     {
247       struct pred_data *pred;
248 
249       printf ("  {\n");
250 
251       printf ("    %s,\n",
252 	      d->predicate && d->predicate[0] ? d->predicate : "0");
253 
254       printf ("    \"%s\",\n", d->constraint ? d->constraint : "");
255 
256       printf ("    %smode,\n", GET_MODE_NAME (d->mode));
257 
258       printf ("    %d,\n", d->strict_low);
259 
260       printf ("    %d,\n", d->constraint == NULL ? 1 : 0);
261 
262       printf ("    %d,\n", d->eliminable);
263 
264       pred = NULL;
265       if (d->predicate)
266 	pred = lookup_predicate (d->predicate);
267       printf ("    %d\n", pred && pred->codes[MEM]);
268 
269       printf ("  },\n");
270     }
271   printf ("};\n\n\n");
272 }
273 
274 static void
275 output_insn_data (void)
276 {
277   struct data *d;
278   int name_offset = 0;
279   int next_name_offset;
280   const char * last_name = 0;
281   const char * next_name = 0;
282   struct data *n;
283 
284   for (n = idata, next_name_offset = 1; n; n = n->next, next_name_offset++)
285     if (n->name)
286       {
287 	next_name = n->name;
288 	break;
289       }
290 
291   printf ("#if GCC_VERSION >= 2007\n__extension__\n#endif\n");
292   printf ("\nconst struct insn_data_d insn_data[] = \n{\n");
293 
294   for (d = idata; d; d = d->next)
295     {
296       printf ("  /* %s:%d */\n", d->loc.filename, d->loc.lineno);
297       printf ("  {\n");
298 
299       if (d->name)
300 	{
301 	  printf ("    \"%s\",\n", d->name);
302 	  name_offset = 0;
303 	  last_name = d->name;
304 	  next_name = 0;
305 	  for (n = d->next, next_name_offset = 1; n;
306 	       n = n->next, next_name_offset++)
307 	    {
308 	      if (n->name)
309 		{
310 		  next_name = n->name;
311 		  break;
312 		}
313 	    }
314 	}
315       else
316 	{
317 	  name_offset++;
318 	  if (next_name && (last_name == 0
319 			    || name_offset > next_name_offset / 2))
320 	    printf ("    \"%s-%d\",\n", next_name,
321 		    next_name_offset - name_offset);
322 	  else
323 	    printf ("    \"%s+%d\",\n", last_name, name_offset);
324 	}
325 
326       switch (d->output_format)
327 	{
328 	case INSN_OUTPUT_FORMAT_NONE:
329 	  printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n");
330 	  printf ("    { 0 },\n");
331 	  printf ("#else\n");
332 	  printf ("    { 0, 0, 0 },\n");
333 	  printf ("#endif\n");
334 	  break;
335 	case INSN_OUTPUT_FORMAT_SINGLE:
336 	  {
337 	    const char *p = d->template_code;
338 	    char prev = 0;
339 
340 	    printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n");
341 	    printf ("    { .single =\n");
342 	    printf ("#else\n");
343 	    printf ("    {\n");
344 	    printf ("#endif\n");
345 	    printf ("    \"");
346 	    while (*p)
347 	      {
348 		if (IS_VSPACE (*p) && prev != '\\')
349 		  {
350 		    /* Preserve two consecutive \n's or \r's, but treat \r\n
351 		       as a single newline.  */
352 		    if (*p == '\n' && prev != '\r')
353 		      printf ("\\n\\\n");
354 		  }
355 		else
356 		  putchar (*p);
357 		prev = *p;
358 		++p;
359 	      }
360 	    printf ("\",\n");
361 	    printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n");
362 	    printf ("    },\n");
363 	    printf ("#else\n");
364 	    printf ("    0, 0 },\n");
365 	    printf ("#endif\n");
366 	  }
367 	  break;
368 	case INSN_OUTPUT_FORMAT_MULTI:
369 	  printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n");
370 	  printf ("    { .multi = output_%d },\n", d->code_number);
371 	  printf ("#else\n");
372 	  printf ("    { 0, output_%d, 0 },\n", d->code_number);
373 	  printf ("#endif\n");
374 	  break;
375 	case INSN_OUTPUT_FORMAT_FUNCTION:
376 	  printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n");
377 	  printf ("    { .function = output_%d },\n", d->code_number);
378 	  printf ("#else\n");
379 	  printf ("    { 0, 0, output_%d },\n", d->code_number);
380 	  printf ("#endif\n");
381 	  break;
382 	default:
383 	  gcc_unreachable ();
384 	}
385 
386       if (d->name && d->name[0] != '*')
387 	printf ("    { (insn_gen_fn::stored_funcptr) gen_%s },\n", d->name);
388       else
389 	printf ("    { 0 },\n");
390 
391       printf ("    &operand_data[%d],\n", d->operand_number);
392       printf ("    %d,\n", d->n_generator_args);
393       printf ("    %d,\n", d->n_operands);
394       printf ("    %d,\n", d->n_dups);
395       printf ("    %d,\n", d->n_alternatives);
396       printf ("    %d\n", d->output_format);
397 
398       printf ("  },\n");
399     }
400   printf ("};\n\n\n");
401 }
402 
403 static void
404 output_get_insn_name (void)
405 {
406   printf ("const char *\n");
407   printf ("get_insn_name (int code)\n");
408   printf ("{\n");
409   printf ("  if (code == NOOP_MOVE_INSN_CODE)\n");
410   printf ("    return \"NOOP_MOVE\";\n");
411   printf ("  else\n");
412   printf ("    return insn_data[code].name;\n");
413   printf ("}\n");
414 }
415 
416 
417 /* Stores the operand data into `d->operand[i]'.
418 
419    THIS_ADDRESS_P is nonzero if the containing rtx was an ADDRESS.
420    THIS_STRICT_LOW is nonzero if the containing rtx was a STRICT_LOW_PART.  */
421 
422 static void
423 scan_operands (struct data *d, rtx part, int this_address_p,
424 	       int this_strict_low)
425 {
426   int i, j;
427   const char *format_ptr;
428   int opno;
429 
430   if (part == 0)
431     return;
432 
433   switch (GET_CODE (part))
434     {
435     case MATCH_OPERAND:
436       opno = XINT (part, 0);
437       if (opno >= MAX_MAX_OPERANDS)
438 	{
439 	  error_at (d->loc, "maximum number of operands exceeded");
440 	  return;
441 	}
442       if (d->operand[opno].seen)
443 	error_at (d->loc, "repeated operand number %d\n", opno);
444 
445       d->operand[opno].seen = 1;
446       d->operand[opno].mode = GET_MODE (part);
447       d->operand[opno].strict_low = this_strict_low;
448       d->operand[opno].predicate = XSTR (part, 1);
449       d->operand[opno].constraint = strip_whitespace (XSTR (part, 2));
450       d->operand[opno].n_alternatives
451 	= n_occurrences (',', d->operand[opno].constraint) + 1;
452       d->operand[opno].address_p = this_address_p;
453       d->operand[opno].eliminable = 1;
454       return;
455 
456     case MATCH_SCRATCH:
457       opno = XINT (part, 0);
458       if (opno >= MAX_MAX_OPERANDS)
459 	{
460 	  error_at (d->loc, "maximum number of operands exceeded");
461 	  return;
462 	}
463       if (d->operand[opno].seen)
464 	error_at (d->loc, "repeated operand number %d\n", opno);
465 
466       d->operand[opno].seen = 1;
467       d->operand[opno].mode = GET_MODE (part);
468       d->operand[opno].strict_low = 0;
469       d->operand[opno].predicate = "scratch_operand";
470       d->operand[opno].constraint = strip_whitespace (XSTR (part, 1));
471       d->operand[opno].n_alternatives
472 	= n_occurrences (',', d->operand[opno].constraint) + 1;
473       d->operand[opno].address_p = 0;
474       d->operand[opno].eliminable = 0;
475       return;
476 
477     case MATCH_OPERATOR:
478     case MATCH_PARALLEL:
479       opno = XINT (part, 0);
480       if (opno >= MAX_MAX_OPERANDS)
481 	{
482 	  error_at (d->loc, "maximum number of operands exceeded");
483 	  return;
484 	}
485       if (d->operand[opno].seen)
486 	error_at (d->loc, "repeated operand number %d\n", opno);
487 
488       d->operand[opno].seen = 1;
489       d->operand[opno].mode = GET_MODE (part);
490       d->operand[opno].strict_low = 0;
491       d->operand[opno].predicate = XSTR (part, 1);
492       d->operand[opno].constraint = 0;
493       d->operand[opno].address_p = 0;
494       d->operand[opno].eliminable = 0;
495       for (i = 0; i < XVECLEN (part, 2); i++)
496 	scan_operands (d, XVECEXP (part, 2, i), 0, 0);
497       return;
498 
499     case STRICT_LOW_PART:
500       scan_operands (d, XEXP (part, 0), 0, 1);
501       return;
502 
503     default:
504       break;
505     }
506 
507   format_ptr = GET_RTX_FORMAT (GET_CODE (part));
508 
509   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++)
510     switch (*format_ptr++)
511       {
512       case 'e':
513       case 'u':
514 	scan_operands (d, XEXP (part, i), 0, 0);
515 	break;
516       case 'E':
517 	if (XVEC (part, i) != NULL)
518 	  for (j = 0; j < XVECLEN (part, i); j++)
519 	    scan_operands (d, XVECEXP (part, i, j), 0, 0);
520 	break;
521       }
522 }
523 
524 /* Compare two operands for content equality.  */
525 
526 static int
527 compare_operands (struct operand_data *d0, struct operand_data *d1)
528 {
529   const char *p0, *p1;
530 
531   p0 = d0->predicate;
532   if (!p0)
533     p0 = "";
534   p1 = d1->predicate;
535   if (!p1)
536     p1 = "";
537   if (strcmp (p0, p1) != 0)
538     return 0;
539 
540   p0 = d0->constraint;
541   if (!p0)
542     p0 = "";
543   p1 = d1->constraint;
544   if (!p1)
545     p1 = "";
546   if (strcmp (p0, p1) != 0)
547     return 0;
548 
549   if (d0->mode != d1->mode)
550     return 0;
551 
552   if (d0->strict_low != d1->strict_low)
553     return 0;
554 
555   if (d0->eliminable != d1->eliminable)
556     return 0;
557 
558   return 1;
559 }
560 
561 /* Scan the list of operands we've already committed to output and either
562    find a subsequence that is the same, or allocate a new one at the end.  */
563 
564 static void
565 place_operands (struct data *d)
566 {
567   struct operand_data *od, *od2;
568   int i;
569 
570   if (d->n_operands == 0)
571     {
572       d->operand_number = 0;
573       return;
574     }
575 
576   /* Brute force substring search.  */
577   for (od = odata, i = 0; od; od = od->next, i = 0)
578     if (compare_operands (od, &d->operand[0]))
579       {
580 	od2 = od->next;
581 	i = 1;
582 	while (1)
583 	  {
584 	    if (i == d->n_operands)
585 	      goto full_match;
586 	    if (od2 == NULL)
587 	      goto partial_match;
588 	    if (! compare_operands (od2, &d->operand[i]))
589 	      break;
590 	    ++i, od2 = od2->next;
591 	  }
592       }
593 
594   /* Either partial match at the end of the list, or no match.  In either
595      case, we tack on what operands are remaining to the end of the list.  */
596  partial_match:
597   d->operand_number = next_operand_number - i;
598   for (; i < d->n_operands; ++i)
599     {
600       od2 = &d->operand[i];
601       *odata_end = od2;
602       odata_end = &od2->next;
603       od2->index = next_operand_number++;
604     }
605   *odata_end = NULL;
606   return;
607 
608  full_match:
609   d->operand_number = od->index;
610   return;
611 }
612 
613 
614 /* Process an assembler template from a define_insn or a define_peephole.
615    It is either the assembler code template, a list of assembler code
616    templates, or C code to generate the assembler code template.  */
617 
618 static void
619 process_template (struct data *d, const char *template_code)
620 {
621   const char *cp;
622   int i;
623 
624   /* Templates starting with * contain straight code to be run.  */
625   if (template_code[0] == '*')
626     {
627       d->template_code = 0;
628       d->output_format = INSN_OUTPUT_FORMAT_FUNCTION;
629 
630       puts ("\nstatic const char *");
631       printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED)\n",
632 	      d->code_number);
633       puts ("{");
634       rtx_reader_ptr->print_md_ptr_loc (template_code);
635       puts (template_code + 1);
636       puts ("}");
637     }
638 
639   /* If the assembler code template starts with a @ it is a newline-separated
640      list of assembler code templates, one for each alternative.  */
641   else if (template_code[0] == '@')
642     {
643       int found_star = 0;
644 
645       for (cp = &template_code[1]; *cp; )
646 	{
647 	  while (ISSPACE (*cp))
648 	    cp++;
649 	  if (*cp == '*')
650 	    found_star = 1;
651 	  while (!IS_VSPACE (*cp) && *cp != '\0')
652 	    ++cp;
653 	}
654       d->template_code = 0;
655       if (found_star)
656 	{
657 	  d->output_format = INSN_OUTPUT_FORMAT_FUNCTION;
658 	  puts ("\nstatic const char *");
659 	  printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, "
660 		  "rtx_insn *insn ATTRIBUTE_UNUSED)\n", d->code_number);
661 	  puts ("{");
662 	  puts ("  switch (which_alternative)\n    {");
663 	}
664       else
665 	{
666 	  d->output_format = INSN_OUTPUT_FORMAT_MULTI;
667 	  printf ("\nstatic const char * const output_%d[] = {\n",
668 		  d->code_number);
669 	}
670 
671       for (i = 0, cp = &template_code[1]; *cp; )
672 	{
673 	  const char *ep, *sp, *bp;
674 
675 	  while (ISSPACE (*cp))
676 	    cp++;
677 
678 	  bp = cp;
679 	  if (found_star)
680 	    {
681 	      printf ("    case %d:", i);
682 	      if (*cp == '*')
683 		{
684 		  printf ("\n      ");
685 		  cp++;
686 		}
687 	      else
688 		printf (" return \"");
689 	    }
690 	  else
691 	    printf ("  \"");
692 
693 	  for (ep = sp = cp; !IS_VSPACE (*ep) && *ep != '\0'; ++ep)
694 	    if (!ISSPACE (*ep))
695 	      sp = ep + 1;
696 
697 	  if (sp != ep)
698 	    message_at (d->loc, "trailing whitespace in output template");
699 
700 	  while (cp < sp)
701 	    {
702 	      putchar (*cp);
703 	      cp++;
704 	    }
705 
706 	  if (!found_star)
707 	    puts ("\",");
708 	  else if (*bp != '*')
709 	    puts ("\";");
710 	  else
711 	    {
712 	      /* The usual action will end with a return.
713 		 If there is neither break or return at the end, this is
714 		 assumed to be intentional; this allows to have multiple
715 		 consecutive alternatives share some code.  */
716 	      puts ("");
717 	    }
718 	  i++;
719 	}
720       if (i == 1)
721 	message_at (d->loc, "'@' is redundant for output template with"
722 		    " single alternative");
723       if (i != d->n_alternatives)
724 	error_at (d->loc, "wrong number of alternatives in the output"
725 		  " template");
726 
727       if (found_star)
728 	puts ("      default: gcc_unreachable ();\n    }\n}");
729       else
730 	printf ("};\n");
731     }
732   else
733     {
734       d->template_code = template_code;
735       d->output_format = INSN_OUTPUT_FORMAT_SINGLE;
736     }
737 }
738 
739 /* Check insn D for consistency in number of constraint alternatives.  */
740 
741 static void
742 validate_insn_alternatives (struct data *d)
743 {
744   int n = 0, start;
745 
746   /* Make sure all the operands have the same number of alternatives
747      in their constraints.  Let N be that number.  */
748   for (start = 0; start < d->n_operands; start++)
749     if (d->operand[start].n_alternatives > 0)
750       {
751 	int len, i;
752 	const char *p;
753 	char c;
754 	int which_alternative = 0;
755 	int alternative_count_unsure = 0;
756 	bool seen_write = false;
757 
758 	for (p = d->operand[start].constraint; (c = *p); p += len)
759 	  {
760 	    if ((c == '%' || c == '=' || c == '+')
761 		&& p != d->operand[start].constraint)
762 	      error_at (d->loc, "character '%c' can only be used at the"
763 			" beginning of a constraint string", c);
764 
765 	    if (c == '=' || c == '+')
766 	      seen_write = true;
767 
768 	    /* Earlyclobber operands must always be marked write-only
769 	       or read/write.  */
770 	    if (!seen_write && c == '&')
771 	      error_at (d->loc, "earlyclobber operands may not be"
772 			" read-only in alternative %d", which_alternative);
773 
774 	    if (ISSPACE (c) || strchr (indep_constraints, c))
775 	      len = 1;
776 	    else if (ISDIGIT (c))
777 	      {
778 		const char *q = p;
779 		do
780 		  q++;
781 		while (ISDIGIT (*q));
782 		len = q - p;
783 	      }
784 	    else
785 	      len = mdep_constraint_len (p, d->loc, start);
786 
787 	    if (c == ',')
788 	      {
789 	        which_alternative++;
790 		continue;
791 	      }
792 
793 	    for (i = 1; i < len; i++)
794 	      if (p[i] == '\0')
795 		{
796 		  error_at (d->loc, "NUL in alternative %d of operand %d",
797 			    which_alternative, start);
798 		  alternative_count_unsure = 1;
799 		  break;
800 		}
801 	      else if (strchr (",#*", p[i]))
802 		{
803 		  error_at (d->loc, "'%c' in alternative %d of operand %d",
804 			    p[i], which_alternative, start);
805 		  alternative_count_unsure = 1;
806 		}
807 	  }
808 	if (!alternative_count_unsure)
809 	  {
810 	    if (n == 0)
811 	      n = d->operand[start].n_alternatives;
812 	    else if (n != d->operand[start].n_alternatives)
813 	      error_at (d->loc, "wrong number of alternatives in operand %d",
814 			start);
815 	  }
816       }
817 
818   /* Record the insn's overall number of alternatives.  */
819   d->n_alternatives = n;
820 }
821 
822 /* Verify that there are no gaps in operand numbers for INSNs.  */
823 
824 static void
825 validate_insn_operands (struct data *d)
826 {
827   int i;
828 
829   for (i = 0; i < d->n_operands; ++i)
830     if (d->operand[i].seen == 0)
831       error_at (d->loc, "missing operand %d", i);
832 }
833 
834 static void
835 validate_optab_operands (struct data *d)
836 {
837   if (!d->name || d->name[0] == '\0' || d->name[0] == '*')
838     return;
839 
840   /* Miscellaneous tests.  */
841   if (strncmp (d->name, "cstore", 6) == 0
842       && d->name[strlen (d->name) - 1] == '4'
843       && d->operand[0].mode == VOIDmode)
844     {
845       message_at (d->loc, "missing mode for operand 0 of cstore");
846       have_error = 1;
847     }
848 }
849 
850 /* Look at a define_insn just read.  Assign its code number.  Record
851    on idata the template and the number of arguments.  If the insn has
852    a hairy output action, output a function for now.  */
853 
854 static void
855 gen_insn (md_rtx_info *info)
856 {
857   struct pattern_stats stats;
858   rtx insn = info->def;
859   data *d = new data;
860   int i;
861 
862   d->code_number = info->index;
863   d->loc = info->loc;
864   if (XSTR (insn, 0)[0])
865     d->name = XSTR (insn, 0);
866   else
867     d->name = 0;
868 
869   /* Build up the list in the same order as the insns are seen
870      in the machine description.  */
871   d->next = 0;
872   *idata_end = d;
873   idata_end = &d->next;
874 
875   memset (d->operand, 0, sizeof (d->operand));
876 
877   for (i = 0; i < XVECLEN (insn, 1); i++)
878     scan_operands (d, XVECEXP (insn, 1, i), 0, 0);
879 
880   get_pattern_stats (&stats, XVEC (insn, 1));
881   d->n_generator_args = stats.num_generator_args;
882   d->n_operands = stats.num_insn_operands;
883   d->n_dups = stats.num_dups;
884 
885   validate_insn_operands (d);
886   validate_insn_alternatives (d);
887   validate_optab_operands (d);
888   place_operands (d);
889   process_template (d, XTMPL (insn, 3));
890 }
891 
892 /* Look at a define_peephole just read.  Assign its code number.
893    Record on idata the template and the number of arguments.
894    If the insn has a hairy output action, output it now.  */
895 
896 static void
897 gen_peephole (md_rtx_info *info)
898 {
899   struct pattern_stats stats;
900   data *d = new data;
901   int i;
902 
903   d->code_number = info->index;
904   d->loc = info->loc;
905   d->name = 0;
906 
907   /* Build up the list in the same order as the insns are seen
908      in the machine description.  */
909   d->next = 0;
910   *idata_end = d;
911   idata_end = &d->next;
912 
913   memset (d->operand, 0, sizeof (d->operand));
914 
915   /* Get the number of operands by scanning all the patterns of the
916      peephole optimizer.  But ignore all the rest of the information
917      thus obtained.  */
918   rtx peep = info->def;
919   for (i = 0; i < XVECLEN (peep, 0); i++)
920     scan_operands (d, XVECEXP (peep, 0, i), 0, 0);
921 
922   get_pattern_stats (&stats, XVEC (peep, 0));
923   d->n_generator_args = 0;
924   d->n_operands = stats.num_insn_operands;
925   d->n_dups = 0;
926 
927   validate_insn_alternatives (d);
928   place_operands (d);
929   process_template (d, XTMPL (peep, 2));
930 }
931 
932 /* Process a define_expand just read.  Assign its code number,
933    only for the purposes of `insn_gen_function'.  */
934 
935 static void
936 gen_expand (md_rtx_info *info)
937 {
938   struct pattern_stats stats;
939   rtx insn = info->def;
940   data *d = new data;
941   int i;
942 
943   d->code_number = info->index;
944   d->loc = info->loc;
945   if (XSTR (insn, 0)[0])
946     d->name = XSTR (insn, 0);
947   else
948     d->name = 0;
949 
950   /* Build up the list in the same order as the insns are seen
951      in the machine description.  */
952   d->next = 0;
953   *idata_end = d;
954   idata_end = &d->next;
955 
956   memset (d->operand, 0, sizeof (d->operand));
957 
958   /* Scan the operands to get the specified predicates and modes,
959      since expand_binop needs to know them.  */
960 
961   if (XVEC (insn, 1))
962     for (i = 0; i < XVECLEN (insn, 1); i++)
963       scan_operands (d, XVECEXP (insn, 1, i), 0, 0);
964 
965   get_pattern_stats (&stats, XVEC (insn, 1));
966   d->n_generator_args = stats.num_generator_args;
967   d->n_operands = stats.num_insn_operands;
968   d->n_dups = stats.num_dups;
969   d->template_code = 0;
970   d->output_format = INSN_OUTPUT_FORMAT_NONE;
971 
972   validate_insn_alternatives (d);
973   validate_optab_operands (d);
974   place_operands (d);
975 }
976 
977 static void
978 init_insn_for_nothing (void)
979 {
980   idata = XCNEW (struct data);
981   new (idata) data ();
982   idata->name = "*placeholder_for_nothing";
983   idata->loc = file_location ("<internal>", 0, 0);
984   idata_end = &idata->next;
985 }
986 
987 extern int main (int, const char **);
988 
989 int
990 main (int argc, const char **argv)
991 {
992   progname = "genoutput";
993 
994   init_insn_for_nothing ();
995 
996   if (!init_rtx_reader_args (argc, argv))
997     return (FATAL_EXIT_CODE);
998 
999   output_prologue ();
1000 
1001   /* Read the machine description.  */
1002 
1003   md_rtx_info info;
1004   while (read_md_rtx (&info))
1005     switch (GET_CODE (info.def))
1006       {
1007       case DEFINE_INSN:
1008 	gen_insn (&info);
1009 	break;
1010 
1011       case DEFINE_PEEPHOLE:
1012 	gen_peephole (&info);
1013 	break;
1014 
1015       case DEFINE_EXPAND:
1016 	gen_expand (&info);
1017 	break;
1018 
1019       case DEFINE_CONSTRAINT:
1020       case DEFINE_REGISTER_CONSTRAINT:
1021       case DEFINE_ADDRESS_CONSTRAINT:
1022       case DEFINE_MEMORY_CONSTRAINT:
1023       case DEFINE_SPECIAL_MEMORY_CONSTRAINT:
1024 	note_constraint (&info);
1025 	break;
1026 
1027       default:
1028 	break;
1029       }
1030 
1031   printf ("\n\n");
1032   output_operand_data ();
1033   output_insn_data ();
1034   output_get_insn_name ();
1035 
1036   fflush (stdout);
1037   return (ferror (stdout) != 0 || have_error
1038 	? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
1039 }
1040 
1041 /* Return the number of occurrences of character C in string S or
1042    -1 if S is the null string.  */
1043 
1044 static int
1045 n_occurrences (int c, const char *s)
1046 {
1047   int n = 0;
1048 
1049   if (s == 0 || *s == '\0')
1050     return -1;
1051 
1052   while (*s)
1053     n += (*s++ == c);
1054 
1055   return n;
1056 }
1057 
1058 /* Remove whitespace in `s' by moving up characters until the end.
1059    Return a new string.  */
1060 
1061 static const char *
1062 strip_whitespace (const char *s)
1063 {
1064   char *p, *q;
1065   char ch;
1066 
1067   if (s == 0)
1068     return 0;
1069 
1070   p = q = XNEWVEC (char, strlen (s) + 1);
1071   while ((ch = *s++) != '\0')
1072     if (! ISSPACE (ch))
1073       *p++ = ch;
1074 
1075   *p = '\0';
1076   return q;
1077 }
1078 
1079 /* Record just enough information about the constraint in *INFO to allow
1080    checking of operand constraint strings above, in validate_insn_alternatives.
1081    Does not validate most properties of the constraint itself; does enforce
1082    no duplicate names, no overlap with MI constraints, and no prefixes.  */
1083 static void
1084 note_constraint (md_rtx_info *info)
1085 {
1086   rtx exp = info->def;
1087   const char *name = XSTR (exp, 0);
1088   struct constraint_data **iter, **slot, *new_cdata;
1089 
1090   if (strcmp (name, "TARGET_MEM_CONSTRAINT") == 0)
1091     name = general_mem;
1092   unsigned int namelen = strlen (name);
1093 
1094   if (strchr (indep_constraints, name[0]))
1095     {
1096       if (name[1] == '\0')
1097 	error_at (info->loc, "constraint letter '%s' cannot be "
1098 		  "redefined by the machine description", name);
1099       else
1100 	error_at (info->loc, "constraint name '%s' cannot be defined by "
1101 		  "the machine description, as it begins with '%c'",
1102 		  name, name[0]);
1103       return;
1104     }
1105 
1106   slot = &constraints_by_letter_table[(unsigned int)name[0]];
1107   for (iter = slot; *iter; iter = &(*iter)->next_this_letter)
1108     {
1109       /* This causes slot to end up pointing to the
1110 	 next_this_letter field of the last constraint with a name
1111 	 of equal or greater length than the new constraint; hence
1112 	 the new constraint will be inserted after all previous
1113 	 constraints with names of the same length.  */
1114       if ((*iter)->namelen >= namelen)
1115 	slot = iter;
1116 
1117       if (!strcmp ((*iter)->name, name))
1118 	{
1119 	  error_at (info->loc, "redefinition of constraint '%s'", name);
1120 	  message_at ((*iter)->loc, "previous definition is here");
1121 	  return;
1122 	}
1123       else if (!strncmp ((*iter)->name, name, (*iter)->namelen))
1124 	{
1125 	  error_at (info->loc, "defining constraint '%s' here", name);
1126 	  message_at ((*iter)->loc, "renders constraint '%s' "
1127 		      "(defined here) a prefix", (*iter)->name);
1128 	  return;
1129 	}
1130       else if (!strncmp ((*iter)->name, name, namelen))
1131 	{
1132 	  error_at (info->loc, "constraint '%s' is a prefix", name);
1133 	  message_at ((*iter)->loc, "of constraint '%s' "
1134 		      "(defined here)", (*iter)->name);
1135 	  return;
1136 	}
1137     }
1138   new_cdata = XNEWVAR (struct constraint_data,
1139 		       sizeof (struct constraint_data) + namelen);
1140   new (new_cdata) constraint_data ();
1141   strcpy (CONST_CAST (char *, new_cdata->name), name);
1142   new_cdata->namelen = namelen;
1143   new_cdata->loc = info->loc;
1144   new_cdata->next_this_letter = *slot;
1145   *slot = new_cdata;
1146 }
1147 
1148 /* Return the length of the constraint name beginning at position S
1149    of an operand constraint string, or issue an error message if there
1150    is no such constraint.  Does not expect to be called for generic
1151    constraints.  */
1152 static int
1153 mdep_constraint_len (const char *s, file_location loc, int opno)
1154 {
1155   struct constraint_data *p;
1156 
1157   p = constraints_by_letter_table[(unsigned int)s[0]];
1158 
1159   if (p)
1160     for (; p; p = p->next_this_letter)
1161       if (!strncmp (s, p->name, p->namelen))
1162 	return p->namelen;
1163 
1164   error_at (loc, "error: undefined machine-specific constraint "
1165 	    "at this point: \"%s\"", s);
1166   message_at (loc, "note:  in operand %d", opno);
1167   return 1; /* safe */
1168 }
1169