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