2007-10-02 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / read-rtl.c
blobfbb67b47785a35212aa45253416975dc756c9eb3
1 /* RTL reader for GCC.
2 Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2007
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "bconfig.h"
24 /* Disable rtl checking; it conflicts with the iterator handling. */
25 #undef ENABLE_RTL_CHECKING
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "rtl.h"
31 #include "obstack.h"
32 #include "hashtab.h"
33 #include "gensupport.h"
35 static htab_t md_constants;
37 /* One element in a singly-linked list of (integer, string) pairs. */
38 struct map_value {
39 struct map_value *next;
40 int number;
41 const char *string;
44 /* Maps an iterator or attribute name to a list of (integer, string) pairs.
45 The integers are mode or code values; the strings are either C conditions
46 or attribute values. */
47 struct mapping {
48 /* The name of the iterator or attribute. */
49 const char *name;
51 /* The group (modes or codes) to which the iterator or attribute belongs. */
52 struct iterator_group *group;
54 /* Gives a unique number to the attribute or iterator. Numbers are
55 allocated consecutively, starting at 0. */
56 int index;
58 /* The list of (integer, string) pairs. */
59 struct map_value *values;
62 /* A structure for abstracting the common parts of code and mode iterators. */
63 struct iterator_group {
64 /* Tables of "mapping" structures, one for attributes and one for iterators. */
65 htab_t attrs, iterators;
67 /* The number of "real" modes or codes (and by extension, the first
68 number available for use as an iterator placeholder). */
69 int num_builtins;
71 /* Treat the given string as the name of a standard mode or code and
72 return its integer value. Use the given file for error reporting. */
73 int (*find_builtin) (const char *, FILE *);
75 /* Return true if the given rtx uses the given mode or code. */
76 bool (*uses_iterator_p) (rtx, int);
78 /* Make the given rtx use the given mode or code. */
79 void (*apply_iterator) (rtx, int);
82 /* Associates PTR (which can be a string, etc.) with the file location
83 specified by FILENAME and LINENO. */
84 struct ptr_loc {
85 const void *ptr;
86 const char *filename;
87 int lineno;
90 /* A structure used to pass data from read_rtx to apply_iterator_traverse
91 via htab_traverse. */
92 struct iterator_traverse_data {
93 /* Instruction queue. */
94 rtx queue;
95 /* Attributes seen for modes. */
96 struct map_value *mode_maps;
97 /* Input file. */
98 FILE *infile;
99 /* The last unknown attribute used as a mode. */
100 const char *unknown_mode_attr;
103 /* If CODE is the number of a code iterator, return a real rtx code that
104 has the same format. Return CODE otherwise. */
105 #define BELLWETHER_CODE(CODE) \
106 ((CODE) < NUM_RTX_CODE ? CODE : bellwether_codes[CODE - NUM_RTX_CODE])
108 static void fatal_with_file_and_line (FILE *, const char *, ...)
109 ATTRIBUTE_PRINTF_2 ATTRIBUTE_NORETURN;
110 static void fatal_expected_char (FILE *, int, int) ATTRIBUTE_NORETURN;
111 static int find_mode (const char *, FILE *);
112 static bool uses_mode_iterator_p (rtx, int);
113 static void apply_mode_iterator (rtx, int);
114 static int find_code (const char *, FILE *);
115 static bool uses_code_iterator_p (rtx, int);
116 static void apply_code_iterator (rtx, int);
117 static const char *apply_iterator_to_string (const char *, struct mapping *, int);
118 static rtx apply_iterator_to_rtx (rtx, struct mapping *, int,
119 struct map_value *, FILE *, const char **);
120 static bool uses_iterator_p (rtx, struct mapping *);
121 static const char *add_condition_to_string (const char *, const char *);
122 static void add_condition_to_rtx (rtx, const char *);
123 static int apply_iterator_traverse (void **, void *);
124 static struct mapping *add_mapping (struct iterator_group *, htab_t t,
125 const char *, FILE *);
126 static struct map_value **add_map_value (struct map_value **,
127 int, const char *);
128 static void initialize_iterators (void);
129 static void read_name (char *, FILE *);
130 static hashval_t leading_ptr_hash (const void *);
131 static int leading_ptr_eq_p (const void *, const void *);
132 static void set_rtx_ptr_loc (const void *, const char *, int);
133 static const struct ptr_loc *get_rtx_ptr_loc (const void *);
134 static char *read_string (FILE *, int);
135 static char *read_quoted_string (FILE *);
136 static char *read_braced_string (FILE *);
137 static void read_escape (FILE *);
138 static hashval_t def_hash (const void *);
139 static int def_name_eq_p (const void *, const void *);
140 static void read_constants (FILE *infile, char *tmp_char);
141 static void read_conditions (FILE *infile, char *tmp_char);
142 static void validate_const_int (FILE *, const char *);
143 static int find_iterator (struct iterator_group *, const char *, FILE *);
144 static struct mapping *read_mapping (struct iterator_group *, htab_t, FILE *);
145 static void check_code_iterator (struct mapping *, FILE *);
146 static rtx read_rtx_1 (FILE *, struct map_value **);
147 static rtx read_rtx_variadic (FILE *, struct map_value **, rtx);
149 /* The mode and code iterator structures. */
150 static struct iterator_group modes, codes;
152 /* Index I is the value of BELLWETHER_CODE (I + NUM_RTX_CODE). */
153 static enum rtx_code *bellwether_codes;
155 /* Obstack used for allocating RTL strings. */
156 static struct obstack string_obstack;
158 /* A table of ptr_locs, hashed on the PTR field. */
159 static htab_t ptr_locs;
161 /* An obstack for the above. Plain xmalloc is a bit heavyweight for a
162 small structure like ptr_loc. */
163 static struct obstack ptr_loc_obstack;
165 /* A hash table of triples (A, B, C), where each of A, B and C is a condition
166 and A is equivalent to "B && C". This is used to keep track of the source
167 of conditions that are made up of separate rtx strings (such as the split
168 condition of a define_insn_and_split). */
169 static htab_t joined_conditions;
171 /* An obstack for allocating joined_conditions entries. */
172 static struct obstack joined_conditions_obstack;
174 /* Subroutines of read_rtx. */
176 /* The current line number for the file. */
177 int read_rtx_lineno = 1;
179 /* The filename for error reporting. */
180 const char *read_rtx_filename = "<unknown>";
182 static void
183 fatal_with_file_and_line (FILE *infile, const char *msg, ...)
185 char context[64];
186 size_t i;
187 int c;
188 va_list ap;
190 va_start (ap, msg);
192 fprintf (stderr, "%s:%d: ", read_rtx_filename, read_rtx_lineno);
193 vfprintf (stderr, msg, ap);
194 putc ('\n', stderr);
196 /* Gather some following context. */
197 for (i = 0; i < sizeof (context)-1; ++i)
199 c = getc (infile);
200 if (c == EOF)
201 break;
202 if (c == '\r' || c == '\n')
203 break;
204 context[i] = c;
206 context[i] = '\0';
208 fprintf (stderr, "%s:%d: following context is `%s'\n",
209 read_rtx_filename, read_rtx_lineno, context);
211 va_end (ap);
212 exit (1);
215 /* Dump code after printing a message. Used when read_rtx finds
216 invalid data. */
218 static void
219 fatal_expected_char (FILE *infile, int expected_c, int actual_c)
221 fatal_with_file_and_line (infile, "expected character `%c', found `%c'",
222 expected_c, actual_c);
225 /* Implementations of the iterator_group callbacks for modes. */
227 static int
228 find_mode (const char *name, FILE *infile)
230 int i;
232 for (i = 0; i < NUM_MACHINE_MODES; i++)
233 if (strcmp (GET_MODE_NAME (i), name) == 0)
234 return i;
236 fatal_with_file_and_line (infile, "unknown mode `%s'", name);
239 static bool
240 uses_mode_iterator_p (rtx x, int mode)
242 return (int) GET_MODE (x) == mode;
245 static void
246 apply_mode_iterator (rtx x, int mode)
248 PUT_MODE (x, (enum machine_mode) mode);
251 /* Implementations of the iterator_group callbacks for codes. */
253 static int
254 find_code (const char *name, FILE *infile)
256 int i;
258 for (i = 0; i < NUM_RTX_CODE; i++)
259 if (strcmp (GET_RTX_NAME (i), name) == 0)
260 return i;
262 fatal_with_file_and_line (infile, "unknown rtx code `%s'", name);
265 static bool
266 uses_code_iterator_p (rtx x, int code)
268 return (int) GET_CODE (x) == code;
271 static void
272 apply_code_iterator (rtx x, int code)
274 PUT_CODE (x, (enum rtx_code) code);
277 /* Map a code or mode attribute string P to the underlying string for
278 ITERATOR and VALUE. */
280 static struct map_value *
281 map_attr_string (const char *p, struct mapping *iterator, int value)
283 const char *attr;
284 struct mapping *m;
285 struct map_value *v;
287 /* If there's a "iterator:" prefix, check whether the iterator name matches.
288 Set ATTR to the start of the attribute name. */
289 attr = strchr (p, ':');
290 if (attr == 0)
291 attr = p;
292 else
294 if (strncmp (p, iterator->name, attr - p) != 0
295 || iterator->name[attr - p] != 0)
296 return 0;
297 attr++;
300 /* Find the attribute specification. */
301 m = (struct mapping *) htab_find (iterator->group->attrs, &attr);
302 if (m == 0)
303 return 0;
305 /* Find the attribute value for VALUE. */
306 for (v = m->values; v != 0; v = v->next)
307 if (v->number == value)
308 break;
310 return v;
313 /* Given an attribute string used as a machine mode, return an index
314 to store in the machine mode to be translated by
315 apply_iterator_to_rtx. */
317 static unsigned int
318 mode_attr_index (struct map_value **mode_maps, const char *string)
320 char *p;
321 struct map_value *mv;
323 /* Copy the attribute string into permanent storage, without the
324 angle brackets around it. */
325 obstack_grow0 (&string_obstack, string + 1, strlen (string) - 2);
326 p = XOBFINISH (&string_obstack, char *);
328 mv = XNEW (struct map_value);
329 mv->number = *mode_maps == 0 ? 0 : (*mode_maps)->number + 1;
330 mv->string = p;
331 mv->next = *mode_maps;
332 *mode_maps = mv;
334 /* We return a code which we can map back into this string: the
335 number of machine modes + the number of mode iterators + the index
336 we just used. */
337 return MAX_MACHINE_MODE + htab_elements (modes.iterators) + mv->number;
340 /* Apply MODE_MAPS to the top level of X, expanding cases where an
341 attribute is used for a mode. ITERATOR is the current iterator we are
342 expanding, and VALUE is the value to which we are expanding it.
343 INFILE is used for error messages. This sets *UNKNOWN to true if
344 we find a mode attribute which has not yet been defined, and does
345 not change it otherwise. */
347 static void
348 apply_mode_maps (rtx x, struct map_value *mode_maps, struct mapping *iterator,
349 int value, FILE *infile, const char **unknown)
351 unsigned int offset;
352 int indx;
353 struct map_value *pm;
355 offset = MAX_MACHINE_MODE + htab_elements (modes.iterators);
356 if (GET_MODE (x) < offset)
357 return;
359 indx = GET_MODE (x) - offset;
360 for (pm = mode_maps; pm; pm = pm->next)
362 if (pm->number == indx)
364 struct map_value *v;
366 v = map_attr_string (pm->string, iterator, value);
367 if (v)
368 PUT_MODE (x, (enum machine_mode) find_mode (v->string, infile));
369 else
370 *unknown = pm->string;
371 return;
376 /* Given that ITERATOR is being expanded as VALUE, apply the appropriate
377 string substitutions to STRING. Return the new string if any changes
378 were needed, otherwise return STRING itself. */
380 static const char *
381 apply_iterator_to_string (const char *string, struct mapping *iterator, int value)
383 char *base, *copy, *p, *start, *end;
384 struct map_value *v;
386 if (string == 0)
387 return string;
389 base = p = copy = ASTRDUP (string);
390 while ((start = strchr (p, '<')) && (end = strchr (start, '>')))
392 p = start + 1;
394 *end = 0;
395 v = map_attr_string (p, iterator, value);
396 *end = '>';
397 if (v == 0)
398 continue;
400 /* Add everything between the last copied byte and the '<',
401 then add in the attribute value. */
402 obstack_grow (&string_obstack, base, start - base);
403 obstack_grow (&string_obstack, v->string, strlen (v->string));
404 base = end + 1;
406 if (base != copy)
408 obstack_grow (&string_obstack, base, strlen (base) + 1);
409 copy = XOBFINISH (&string_obstack, char *);
410 copy_rtx_ptr_loc (copy, string);
411 return copy;
413 return string;
416 /* Return a copy of ORIGINAL in which all uses of ITERATOR have been
417 replaced by VALUE. MODE_MAPS holds information about attribute
418 strings used for modes. INFILE is used for error messages. This
419 sets *UNKNOWN_MODE_ATTR to the value of an unknown mode attribute,
420 and does not change it otherwise. */
422 static rtx
423 apply_iterator_to_rtx (rtx original, struct mapping *iterator, int value,
424 struct map_value *mode_maps, FILE *infile,
425 const char **unknown_mode_attr)
427 struct iterator_group *group;
428 const char *format_ptr;
429 int i, j;
430 rtx x;
431 enum rtx_code bellwether_code;
433 if (original == 0)
434 return original;
436 /* Create a shallow copy of ORIGINAL. */
437 bellwether_code = BELLWETHER_CODE (GET_CODE (original));
438 x = rtx_alloc (bellwether_code);
439 memcpy (x, original, RTX_CODE_SIZE (bellwether_code));
441 /* Change the mode or code itself. */
442 group = iterator->group;
443 if (group->uses_iterator_p (x, iterator->index + group->num_builtins))
444 group->apply_iterator (x, value);
446 if (mode_maps)
447 apply_mode_maps (x, mode_maps, iterator, value, infile, unknown_mode_attr);
449 /* Change each string and recursively change each rtx. */
450 format_ptr = GET_RTX_FORMAT (bellwether_code);
451 for (i = 0; format_ptr[i] != 0; i++)
452 switch (format_ptr[i])
454 case 'T':
455 XTMPL (x, i) = apply_iterator_to_string (XTMPL (x, i), iterator, value);
456 break;
458 case 'S':
459 case 's':
460 XSTR (x, i) = apply_iterator_to_string (XSTR (x, i), iterator, value);
461 break;
463 case 'e':
464 XEXP (x, i) = apply_iterator_to_rtx (XEXP (x, i), iterator, value,
465 mode_maps, infile,
466 unknown_mode_attr);
467 break;
469 case 'V':
470 case 'E':
471 if (XVEC (original, i))
473 XVEC (x, i) = rtvec_alloc (XVECLEN (original, i));
474 for (j = 0; j < XVECLEN (x, i); j++)
475 XVECEXP (x, i, j) = apply_iterator_to_rtx (XVECEXP (original, i, j),
476 iterator, value, mode_maps,
477 infile,
478 unknown_mode_attr);
480 break;
482 default:
483 break;
485 return x;
488 /* Return true if X (or some subexpression of X) uses iterator ITERATOR. */
490 static bool
491 uses_iterator_p (rtx x, struct mapping *iterator)
493 struct iterator_group *group;
494 const char *format_ptr;
495 int i, j;
497 if (x == 0)
498 return false;
500 group = iterator->group;
501 if (group->uses_iterator_p (x, iterator->index + group->num_builtins))
502 return true;
504 format_ptr = GET_RTX_FORMAT (BELLWETHER_CODE (GET_CODE (x)));
505 for (i = 0; format_ptr[i] != 0; i++)
506 switch (format_ptr[i])
508 case 'e':
509 if (uses_iterator_p (XEXP (x, i), iterator))
510 return true;
511 break;
513 case 'V':
514 case 'E':
515 if (XVEC (x, i))
516 for (j = 0; j < XVECLEN (x, i); j++)
517 if (uses_iterator_p (XVECEXP (x, i, j), iterator))
518 return true;
519 break;
521 default:
522 break;
524 return false;
527 /* Return a condition that must satisfy both ORIGINAL and EXTRA. If ORIGINAL
528 has the form "&& ..." (as used in define_insn_and_splits), assume that
529 EXTRA is already satisfied. Empty strings are treated like "true". */
531 static const char *
532 add_condition_to_string (const char *original, const char *extra)
534 if (original != 0 && original[0] == '&' && original[1] == '&')
535 return original;
536 return join_c_conditions (original, extra);
539 /* Like add_condition, but applied to all conditions in rtx X. */
541 static void
542 add_condition_to_rtx (rtx x, const char *extra)
544 switch (GET_CODE (x))
546 case DEFINE_INSN:
547 case DEFINE_EXPAND:
548 XSTR (x, 2) = add_condition_to_string (XSTR (x, 2), extra);
549 break;
551 case DEFINE_SPLIT:
552 case DEFINE_PEEPHOLE:
553 case DEFINE_PEEPHOLE2:
554 case DEFINE_COND_EXEC:
555 XSTR (x, 1) = add_condition_to_string (XSTR (x, 1), extra);
556 break;
558 case DEFINE_INSN_AND_SPLIT:
559 XSTR (x, 2) = add_condition_to_string (XSTR (x, 2), extra);
560 XSTR (x, 4) = add_condition_to_string (XSTR (x, 4), extra);
561 break;
563 default:
564 break;
568 /* A htab_traverse callback. Search the EXPR_LIST given by DATA
569 for rtxes that use the iterator in *SLOT. Replace each such rtx
570 with a list of expansions. */
572 static int
573 apply_iterator_traverse (void **slot, void *data)
575 struct iterator_traverse_data *mtd = (struct iterator_traverse_data *) data;
576 struct mapping *iterator;
577 struct map_value *v;
578 rtx elem, new_elem, original, x;
580 iterator = (struct mapping *) *slot;
581 for (elem = mtd->queue; elem != 0; elem = XEXP (elem, 1))
582 if (uses_iterator_p (XEXP (elem, 0), iterator))
584 /* For each iterator we expand, we set UNKNOWN_MODE_ATTR to NULL.
585 If apply_iterator_rtx finds an unknown attribute for a mode,
586 it will set it to the attribute. We want to know whether
587 the attribute is unknown after we have expanded all
588 possible iterators, so setting it to NULL here gives us the
589 right result when the hash table traversal is complete. */
590 mtd->unknown_mode_attr = NULL;
592 original = XEXP (elem, 0);
593 for (v = iterator->values; v != 0; v = v->next)
595 x = apply_iterator_to_rtx (original, iterator, v->number,
596 mtd->mode_maps, mtd->infile,
597 &mtd->unknown_mode_attr);
598 add_condition_to_rtx (x, v->string);
599 if (v != iterator->values)
601 /* Insert a new EXPR_LIST node after ELEM and put the
602 new expansion there. */
603 new_elem = rtx_alloc (EXPR_LIST);
604 XEXP (new_elem, 1) = XEXP (elem, 1);
605 XEXP (elem, 1) = new_elem;
606 elem = new_elem;
608 XEXP (elem, 0) = x;
611 return 1;
614 /* Add a new "mapping" structure to hashtable TABLE. NAME is the name
615 of the mapping, GROUP is the group to which it belongs, and INFILE
616 is the file that defined the mapping. */
618 static struct mapping *
619 add_mapping (struct iterator_group *group, htab_t table,
620 const char *name, FILE *infile)
622 struct mapping *m;
623 void **slot;
625 m = XNEW (struct mapping);
626 m->name = xstrdup (name);
627 m->group = group;
628 m->index = htab_elements (table);
629 m->values = 0;
631 slot = htab_find_slot (table, m, INSERT);
632 if (*slot != 0)
633 fatal_with_file_and_line (infile, "`%s' already defined", name);
635 *slot = m;
636 return m;
639 /* Add the pair (NUMBER, STRING) to a list of map_value structures.
640 END_PTR points to the current null terminator for the list; return
641 a pointer the new null terminator. */
643 static struct map_value **
644 add_map_value (struct map_value **end_ptr, int number, const char *string)
646 struct map_value *value;
648 value = XNEW (struct map_value);
649 value->next = 0;
650 value->number = number;
651 value->string = string;
653 *end_ptr = value;
654 return &value->next;
657 /* Do one-time initialization of the mode and code attributes. */
659 static void
660 initialize_iterators (void)
662 struct mapping *lower, *upper;
663 struct map_value **lower_ptr, **upper_ptr;
664 char *copy, *p;
665 int i;
667 modes.attrs = htab_create (13, def_hash, def_name_eq_p, 0);
668 modes.iterators = htab_create (13, def_hash, def_name_eq_p, 0);
669 modes.num_builtins = MAX_MACHINE_MODE;
670 modes.find_builtin = find_mode;
671 modes.uses_iterator_p = uses_mode_iterator_p;
672 modes.apply_iterator = apply_mode_iterator;
674 codes.attrs = htab_create (13, def_hash, def_name_eq_p, 0);
675 codes.iterators = htab_create (13, def_hash, def_name_eq_p, 0);
676 codes.num_builtins = NUM_RTX_CODE;
677 codes.find_builtin = find_code;
678 codes.uses_iterator_p = uses_code_iterator_p;
679 codes.apply_iterator = apply_code_iterator;
681 lower = add_mapping (&modes, modes.attrs, "mode", 0);
682 upper = add_mapping (&modes, modes.attrs, "MODE", 0);
683 lower_ptr = &lower->values;
684 upper_ptr = &upper->values;
685 for (i = 0; i < MAX_MACHINE_MODE; i++)
687 copy = xstrdup (GET_MODE_NAME (i));
688 for (p = copy; *p != 0; p++)
689 *p = TOLOWER (*p);
691 upper_ptr = add_map_value (upper_ptr, i, GET_MODE_NAME (i));
692 lower_ptr = add_map_value (lower_ptr, i, copy);
695 lower = add_mapping (&codes, codes.attrs, "code", 0);
696 upper = add_mapping (&codes, codes.attrs, "CODE", 0);
697 lower_ptr = &lower->values;
698 upper_ptr = &upper->values;
699 for (i = 0; i < NUM_RTX_CODE; i++)
701 copy = xstrdup (GET_RTX_NAME (i));
702 for (p = copy; *p != 0; p++)
703 *p = TOUPPER (*p);
705 lower_ptr = add_map_value (lower_ptr, i, GET_RTX_NAME (i));
706 upper_ptr = add_map_value (upper_ptr, i, copy);
710 /* Return a hash value for the pointer pointed to by DEF. */
712 static hashval_t
713 leading_ptr_hash (const void *def)
715 return htab_hash_pointer (*(const void *const *) def);
718 /* Return true if DEF1 and DEF2 are pointers to the same pointer. */
720 static int
721 leading_ptr_eq_p (const void *def1, const void *def2)
723 return *(const void *const *) def1 == *(const void *const *) def2;
726 /* Associate PTR with the file position given by FILENAME and LINENO. */
728 static void
729 set_rtx_ptr_loc (const void *ptr, const char *filename, int lineno)
731 struct ptr_loc *loc;
733 loc = (struct ptr_loc *) obstack_alloc (&ptr_loc_obstack,
734 sizeof (struct ptr_loc));
735 loc->ptr = ptr;
736 loc->filename = filename;
737 loc->lineno = lineno;
738 *htab_find_slot (ptr_locs, loc, INSERT) = loc;
741 /* Return the position associated with pointer PTR. Return null if no
742 position was set. */
744 static const struct ptr_loc *
745 get_rtx_ptr_loc (const void *ptr)
747 return (const struct ptr_loc *) htab_find (ptr_locs, &ptr);
750 /* Associate NEW_PTR with the same file position as OLD_PTR. */
752 void
753 copy_rtx_ptr_loc (const void *new_ptr, const void *old_ptr)
755 const struct ptr_loc *loc = get_rtx_ptr_loc (old_ptr);
756 if (loc != 0)
757 set_rtx_ptr_loc (new_ptr, loc->filename, loc->lineno);
760 /* If PTR is associated with a known file position, print a #line
761 directive for it. */
763 void
764 print_rtx_ptr_loc (const void *ptr)
766 const struct ptr_loc *loc = get_rtx_ptr_loc (ptr);
767 if (loc != 0)
768 printf ("#line %d \"%s\"\n", loc->lineno, loc->filename);
771 /* Return a condition that satisfies both COND1 and COND2. Either string
772 may be null or empty. */
774 const char *
775 join_c_conditions (const char *cond1, const char *cond2)
777 char *result;
778 const void **entry;
780 if (cond1 == 0 || cond1[0] == 0)
781 return cond2;
783 if (cond2 == 0 || cond2[0] == 0)
784 return cond1;
786 result = concat ("(", cond1, ") && (", cond2, ")", NULL);
787 obstack_ptr_grow (&joined_conditions_obstack, result);
788 obstack_ptr_grow (&joined_conditions_obstack, cond1);
789 obstack_ptr_grow (&joined_conditions_obstack, cond2);
790 entry = XOBFINISH (&joined_conditions_obstack, const void **);
791 *htab_find_slot (joined_conditions, entry, INSERT) = entry;
792 return result;
795 /* Print condition COND, wrapped in brackets. If COND was created by
796 join_c_conditions, recursively invoke this function for the original
797 conditions and join the result with "&&". Otherwise print a #line
798 directive for COND if its original file position is known. */
800 void
801 print_c_condition (const char *cond)
803 const char **halves = (const char **) htab_find (joined_conditions, &cond);
804 if (halves != 0)
806 printf ("(");
807 print_c_condition (halves[1]);
808 printf (" && ");
809 print_c_condition (halves[2]);
810 printf (")");
812 else
814 putc ('\n', stdout);
815 print_rtx_ptr_loc (cond);
816 printf ("(%s)", cond);
820 /* Read chars from INFILE until a non-whitespace char
821 and return that. Comments, both Lisp style and C style,
822 are treated as whitespace.
823 Tools such as genflags use this function. */
826 read_skip_spaces (FILE *infile)
828 int c;
830 while (1)
832 c = getc (infile);
833 switch (c)
835 case '\n':
836 read_rtx_lineno++;
837 break;
839 case ' ': case '\t': case '\f': case '\r':
840 break;
842 case ';':
844 c = getc (infile);
845 while (c != '\n' && c != EOF);
846 read_rtx_lineno++;
847 break;
849 case '/':
851 int prevc;
852 c = getc (infile);
853 if (c != '*')
854 fatal_expected_char (infile, '*', c);
856 prevc = 0;
857 while ((c = getc (infile)) && c != EOF)
859 if (c == '\n')
860 read_rtx_lineno++;
861 else if (prevc == '*' && c == '/')
862 break;
863 prevc = c;
866 break;
868 default:
869 return c;
874 /* Read an rtx code name into the buffer STR[].
875 It is terminated by any of the punctuation chars of rtx printed syntax. */
877 static void
878 read_name (char *str, FILE *infile)
880 char *p;
881 int c;
883 c = read_skip_spaces (infile);
885 p = str;
886 while (1)
888 if (c == ' ' || c == '\n' || c == '\t' || c == '\f' || c == '\r' || c == EOF)
889 break;
890 if (c == ':' || c == ')' || c == ']' || c == '"' || c == '/'
891 || c == '(' || c == '[')
893 ungetc (c, infile);
894 break;
896 *p++ = c;
897 c = getc (infile);
899 if (p == str)
900 fatal_with_file_and_line (infile, "missing name or number");
901 if (c == '\n')
902 read_rtx_lineno++;
904 *p = 0;
906 if (md_constants)
908 /* Do constant expansion. */
909 struct md_constant *def;
911 p = str;
914 struct md_constant tmp_def;
916 tmp_def.name = p;
917 def = (struct md_constant *) htab_find (md_constants, &tmp_def);
918 if (def)
919 p = def->value;
920 } while (def);
921 if (p != str)
922 strcpy (str, p);
926 /* Subroutine of the string readers. Handles backslash escapes.
927 Caller has read the backslash, but not placed it into the obstack. */
928 static void
929 read_escape (FILE *infile)
931 int c = getc (infile);
933 switch (c)
935 /* Backslash-newline is replaced by nothing, as in C. */
936 case '\n':
937 read_rtx_lineno++;
938 return;
940 /* \" \' \\ are replaced by the second character. */
941 case '\\':
942 case '"':
943 case '\'':
944 break;
946 /* Standard C string escapes:
947 \a \b \f \n \r \t \v
948 \[0-7] \x
949 all are passed through to the output string unmolested.
950 In normal use these wind up in a string constant processed
951 by the C compiler, which will translate them appropriately.
952 We do not bother checking that \[0-7] are followed by up to
953 two octal digits, or that \x is followed by N hex digits.
954 \? \u \U are left out because they are not in traditional C. */
955 case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':
956 case '0': case '1': case '2': case '3': case '4': case '5': case '6':
957 case '7': case 'x':
958 obstack_1grow (&string_obstack, '\\');
959 break;
961 /* \; makes stuff for a C string constant containing
962 newline and tab. */
963 case ';':
964 obstack_grow (&string_obstack, "\\n\\t", 4);
965 return;
967 /* pass anything else through, but issue a warning. */
968 default:
969 fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n",
970 read_rtx_filename, read_rtx_lineno, c);
971 obstack_1grow (&string_obstack, '\\');
972 break;
975 obstack_1grow (&string_obstack, c);
979 /* Read a double-quoted string onto the obstack. Caller has scanned
980 the leading quote. */
981 static char *
982 read_quoted_string (FILE *infile)
984 int c;
986 while (1)
988 c = getc (infile); /* Read the string */
989 if (c == '\n')
990 read_rtx_lineno++;
991 else if (c == '\\')
993 read_escape (infile);
994 continue;
996 else if (c == '"' || c == EOF)
997 break;
999 obstack_1grow (&string_obstack, c);
1002 obstack_1grow (&string_obstack, 0);
1003 return XOBFINISH (&string_obstack, char *);
1006 /* Read a braced string (a la Tcl) onto the string obstack. Caller
1007 has scanned the leading brace. Note that unlike quoted strings,
1008 the outermost braces _are_ included in the string constant. */
1009 static char *
1010 read_braced_string (FILE *infile)
1012 int c;
1013 int brace_depth = 1; /* caller-processed */
1014 unsigned long starting_read_rtx_lineno = read_rtx_lineno;
1016 obstack_1grow (&string_obstack, '{');
1017 while (brace_depth)
1019 c = getc (infile); /* Read the string */
1021 if (c == '\n')
1022 read_rtx_lineno++;
1023 else if (c == '{')
1024 brace_depth++;
1025 else if (c == '}')
1026 brace_depth--;
1027 else if (c == '\\')
1029 read_escape (infile);
1030 continue;
1032 else if (c == EOF)
1033 fatal_with_file_and_line
1034 (infile, "missing closing } for opening brace on line %lu",
1035 starting_read_rtx_lineno);
1037 obstack_1grow (&string_obstack, c);
1040 obstack_1grow (&string_obstack, 0);
1041 return XOBFINISH (&string_obstack, char *);
1044 /* Read some kind of string constant. This is the high-level routine
1045 used by read_rtx. It handles surrounding parentheses, leading star,
1046 and dispatch to the appropriate string constant reader. */
1048 static char *
1049 read_string (FILE *infile, int star_if_braced)
1051 char *stringbuf;
1052 int saw_paren = 0;
1053 int c, old_lineno;
1055 c = read_skip_spaces (infile);
1056 if (c == '(')
1058 saw_paren = 1;
1059 c = read_skip_spaces (infile);
1062 old_lineno = read_rtx_lineno;
1063 if (c == '"')
1064 stringbuf = read_quoted_string (infile);
1065 else if (c == '{')
1067 if (star_if_braced)
1068 obstack_1grow (&string_obstack, '*');
1069 stringbuf = read_braced_string (infile);
1071 else
1072 fatal_with_file_and_line (infile, "expected `\"' or `{', found `%c'", c);
1074 if (saw_paren)
1076 c = read_skip_spaces (infile);
1077 if (c != ')')
1078 fatal_expected_char (infile, ')', c);
1081 set_rtx_ptr_loc (stringbuf, read_rtx_filename, old_lineno);
1082 return stringbuf;
1085 /* Provide a version of a function to read a long long if the system does
1086 not provide one. */
1087 #if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_LONG && !defined(HAVE_ATOLL) && !defined(HAVE_ATOQ)
1088 HOST_WIDE_INT atoll (const char *);
1090 HOST_WIDE_INT
1091 atoll (const char *p)
1093 int neg = 0;
1094 HOST_WIDE_INT tmp_wide;
1096 while (ISSPACE (*p))
1097 p++;
1098 if (*p == '-')
1099 neg = 1, p++;
1100 else if (*p == '+')
1101 p++;
1103 tmp_wide = 0;
1104 while (ISDIGIT (*p))
1106 HOST_WIDE_INT new_wide = tmp_wide*10 + (*p - '0');
1107 if (new_wide < tmp_wide)
1109 /* Return INT_MAX equiv on overflow. */
1110 tmp_wide = (~(unsigned HOST_WIDE_INT) 0) >> 1;
1111 break;
1113 tmp_wide = new_wide;
1114 p++;
1117 if (neg)
1118 tmp_wide = -tmp_wide;
1119 return tmp_wide;
1121 #endif
1123 /* Given an object that starts with a char * name field, return a hash
1124 code for its name. */
1125 static hashval_t
1126 def_hash (const void *def)
1128 unsigned result, i;
1129 const char *string = *(const char *const *) def;
1131 for (result = i = 0; *string++ != '\0'; i++)
1132 result += ((unsigned char) *string << (i % CHAR_BIT));
1133 return result;
1136 /* Given two objects that start with char * name fields, return true if
1137 they have the same name. */
1138 static int
1139 def_name_eq_p (const void *def1, const void *def2)
1141 return ! strcmp (*(const char *const *) def1,
1142 *(const char *const *) def2);
1145 /* INFILE is a FILE pointer to read text from. TMP_CHAR is a buffer suitable
1146 to read a name or number into. Process a define_constants directive,
1147 starting with the optional space after the "define_constants". */
1148 static void
1149 read_constants (FILE *infile, char *tmp_char)
1151 int c;
1152 htab_t defs;
1154 c = read_skip_spaces (infile);
1155 if (c != '[')
1156 fatal_expected_char (infile, '[', c);
1157 defs = md_constants;
1158 if (! defs)
1159 defs = htab_create (32, def_hash, def_name_eq_p, (htab_del) 0);
1160 /* Disable constant expansion during definition processing. */
1161 md_constants = 0;
1162 while ( (c = read_skip_spaces (infile)) != ']')
1164 struct md_constant *def;
1165 void **entry_ptr;
1167 if (c != '(')
1168 fatal_expected_char (infile, '(', c);
1169 def = XNEW (struct md_constant);
1170 def->name = tmp_char;
1171 read_name (tmp_char, infile);
1172 entry_ptr = htab_find_slot (defs, def, INSERT);
1173 if (! *entry_ptr)
1174 def->name = xstrdup (tmp_char);
1175 c = read_skip_spaces (infile);
1176 ungetc (c, infile);
1177 read_name (tmp_char, infile);
1178 if (! *entry_ptr)
1180 def->value = xstrdup (tmp_char);
1181 *entry_ptr = def;
1183 else
1185 def = (struct md_constant *) *entry_ptr;
1186 if (strcmp (def->value, tmp_char))
1187 fatal_with_file_and_line (infile,
1188 "redefinition of %s, was %s, now %s",
1189 def->name, def->value, tmp_char);
1191 c = read_skip_spaces (infile);
1192 if (c != ')')
1193 fatal_expected_char (infile, ')', c);
1195 md_constants = defs;
1196 c = read_skip_spaces (infile);
1197 if (c != ')')
1198 fatal_expected_char (infile, ')', c);
1201 /* For every constant definition, call CALLBACK with two arguments:
1202 a pointer a pointer to the constant definition and INFO.
1203 Stops when CALLBACK returns zero. */
1204 void
1205 traverse_md_constants (htab_trav callback, void *info)
1207 if (md_constants)
1208 htab_traverse (md_constants, callback, info);
1211 /* INFILE is a FILE pointer to read text from. TMP_CHAR is a buffer
1212 suitable to read a name or number into. Process a
1213 define_conditions directive, starting with the optional space after
1214 the "define_conditions". The directive looks like this:
1216 (define_conditions [
1217 (number "string")
1218 (number "string")
1222 It's not intended to appear in machine descriptions. It is
1223 generated by (the program generated by) genconditions.c, and
1224 slipped in at the beginning of the sequence of MD files read by
1225 most of the other generators. */
1226 static void
1227 read_conditions (FILE *infile, char *tmp_char)
1229 int c;
1231 c = read_skip_spaces (infile);
1232 if (c != '[')
1233 fatal_expected_char (infile, '[', c);
1235 while ( (c = read_skip_spaces (infile)) != ']')
1237 char *expr;
1238 int value;
1240 if (c != '(')
1241 fatal_expected_char (infile, '(', c);
1243 read_name (tmp_char, infile);
1244 validate_const_int (infile, tmp_char);
1245 value = atoi (tmp_char);
1247 c = read_skip_spaces (infile);
1248 if (c != '"')
1249 fatal_expected_char (infile, '"', c);
1250 expr = read_quoted_string (infile);
1252 c = read_skip_spaces (infile);
1253 if (c != ')')
1254 fatal_expected_char (infile, ')', c);
1256 add_c_test (expr, value);
1258 c = read_skip_spaces (infile);
1259 if (c != ')')
1260 fatal_expected_char (infile, ')', c);
1263 static void
1264 validate_const_int (FILE *infile, const char *string)
1266 const char *cp;
1267 int valid = 1;
1269 cp = string;
1270 while (*cp && ISSPACE (*cp))
1271 cp++;
1272 if (*cp == '-' || *cp == '+')
1273 cp++;
1274 if (*cp == 0)
1275 valid = 0;
1276 for (; *cp; cp++)
1277 if (! ISDIGIT (*cp))
1278 valid = 0;
1279 if (!valid)
1280 fatal_with_file_and_line (infile, "invalid decimal constant \"%s\"\n", string);
1283 /* Search GROUP for a mode or code called NAME and return its numerical
1284 identifier. INFILE is the file that contained NAME. */
1286 static int
1287 find_iterator (struct iterator_group *group, const char *name, FILE *infile)
1289 struct mapping *m;
1291 m = (struct mapping *) htab_find (group->iterators, &name);
1292 if (m != 0)
1293 return m->index + group->num_builtins;
1294 return group->find_builtin (name, infile);
1297 /* Finish reading a declaration of the form:
1299 (define... <name> [<value1> ... <valuen>])
1301 from INFILE, where each <valuei> is either a bare symbol name or a
1302 "(<name> <string>)" pair. The "(define..." part has already been read.
1304 Represent the declaration as a "mapping" structure; add it to TABLE
1305 (which belongs to GROUP) and return it. */
1307 static struct mapping *
1308 read_mapping (struct iterator_group *group, htab_t table, FILE *infile)
1310 char tmp_char[256];
1311 struct mapping *m;
1312 struct map_value **end_ptr;
1313 const char *string;
1314 int number, c;
1316 /* Read the mapping name and create a structure for it. */
1317 read_name (tmp_char, infile);
1318 m = add_mapping (group, table, tmp_char, infile);
1320 c = read_skip_spaces (infile);
1321 if (c != '[')
1322 fatal_expected_char (infile, '[', c);
1324 /* Read each value. */
1325 end_ptr = &m->values;
1326 c = read_skip_spaces (infile);
1329 if (c != '(')
1331 /* A bare symbol name that is implicitly paired to an
1332 empty string. */
1333 ungetc (c, infile);
1334 read_name (tmp_char, infile);
1335 string = "";
1337 else
1339 /* A "(name string)" pair. */
1340 read_name (tmp_char, infile);
1341 string = read_string (infile, false);
1342 c = read_skip_spaces (infile);
1343 if (c != ')')
1344 fatal_expected_char (infile, ')', c);
1346 number = group->find_builtin (tmp_char, infile);
1347 end_ptr = add_map_value (end_ptr, number, string);
1348 c = read_skip_spaces (infile);
1350 while (c != ']');
1352 c = read_skip_spaces (infile);
1353 if (c != ')')
1354 fatal_expected_char (infile, ')', c);
1356 return m;
1359 /* Check newly-created code iterator ITERATOR to see whether every code has the
1360 same format. Initialize the iterator's entry in bellwether_codes. */
1362 static void
1363 check_code_iterator (struct mapping *iterator, FILE *infile)
1365 struct map_value *v;
1366 enum rtx_code bellwether;
1368 bellwether = (enum rtx_code) iterator->values->number;
1369 for (v = iterator->values->next; v != 0; v = v->next)
1370 if (strcmp (GET_RTX_FORMAT (bellwether), GET_RTX_FORMAT (v->number)) != 0)
1371 fatal_with_file_and_line (infile, "code iterator `%s' combines "
1372 "different rtx formats", iterator->name);
1374 bellwether_codes = XRESIZEVEC (enum rtx_code, bellwether_codes,
1375 iterator->index + 1);
1376 bellwether_codes[iterator->index] = bellwether;
1379 /* Read an rtx in printed representation from INFILE and store its
1380 core representation in *X. Also store the line number of the
1381 opening '(' in *LINENO. Return true on success or false if the
1382 end of file has been reached.
1384 read_rtx is not used in the compiler proper, but rather in
1385 the utilities gen*.c that construct C code from machine descriptions. */
1387 bool
1388 read_rtx (FILE *infile, rtx *x, int *lineno)
1390 static rtx queue_head, queue_next;
1391 static int queue_lineno;
1392 int c;
1394 /* Do one-time initialization. */
1395 if (queue_head == 0)
1397 initialize_iterators ();
1398 obstack_init (&string_obstack);
1399 queue_head = rtx_alloc (EXPR_LIST);
1400 ptr_locs = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0);
1401 obstack_init (&ptr_loc_obstack);
1402 joined_conditions = htab_create (161, leading_ptr_hash,
1403 leading_ptr_eq_p, 0);
1404 obstack_init (&joined_conditions_obstack);
1407 if (queue_next == 0)
1409 struct map_value *mode_maps;
1410 struct iterator_traverse_data mtd;
1411 rtx from_file;
1413 c = read_skip_spaces (infile);
1414 if (c == EOF)
1415 return false;
1416 ungetc (c, infile);
1418 queue_lineno = read_rtx_lineno;
1419 mode_maps = 0;
1420 from_file = read_rtx_1 (infile, &mode_maps);
1421 if (from_file == 0)
1422 return false; /* This confuses a top level (nil) with end of
1423 file, but a top level (nil) would have
1424 crashed our caller anyway. */
1426 queue_next = queue_head;
1427 XEXP (queue_next, 0) = from_file;
1428 XEXP (queue_next, 1) = 0;
1430 mtd.queue = queue_next;
1431 mtd.mode_maps = mode_maps;
1432 mtd.infile = infile;
1433 mtd.unknown_mode_attr = mode_maps ? mode_maps->string : NULL;
1434 htab_traverse (modes.iterators, apply_iterator_traverse, &mtd);
1435 htab_traverse (codes.iterators, apply_iterator_traverse, &mtd);
1436 if (mtd.unknown_mode_attr)
1437 fatal_with_file_and_line (infile,
1438 "undefined attribute '%s' used for mode",
1439 mtd.unknown_mode_attr);
1442 *x = XEXP (queue_next, 0);
1443 *lineno = queue_lineno;
1444 queue_next = XEXP (queue_next, 1);
1446 return true;
1449 /* Subroutine of read_rtx that reads one construct from INFILE but
1450 doesn't apply any iterators. */
1452 static rtx
1453 read_rtx_1 (FILE *infile, struct map_value **mode_maps)
1455 int i;
1456 RTX_CODE real_code, bellwether_code;
1457 const char *format_ptr;
1458 /* tmp_char is a buffer used for reading decimal integers
1459 and names of rtx types and machine modes.
1460 Therefore, 256 must be enough. */
1461 char tmp_char[256];
1462 rtx return_rtx;
1463 int c;
1464 int tmp_int;
1465 HOST_WIDE_INT tmp_wide;
1467 /* Linked list structure for making RTXs: */
1468 struct rtx_list
1470 struct rtx_list *next;
1471 rtx value; /* Value of this node. */
1474 again:
1475 c = read_skip_spaces (infile); /* Should be open paren. */
1477 if (c == EOF)
1478 return 0;
1480 if (c != '(')
1481 fatal_expected_char (infile, '(', c);
1483 read_name (tmp_char, infile);
1484 if (strcmp (tmp_char, "nil") == 0)
1486 /* (nil) stands for an expression that isn't there. */
1487 c = read_skip_spaces (infile);
1488 if (c != ')')
1489 fatal_expected_char (infile, ')', c);
1490 return 0;
1492 if (strcmp (tmp_char, "define_constants") == 0)
1494 read_constants (infile, tmp_char);
1495 goto again;
1497 if (strcmp (tmp_char, "define_conditions") == 0)
1499 read_conditions (infile, tmp_char);
1500 goto again;
1502 if (strcmp (tmp_char, "define_mode_attr") == 0)
1504 read_mapping (&modes, modes.attrs, infile);
1505 goto again;
1507 if (strcmp (tmp_char, "define_mode_iterator") == 0)
1509 read_mapping (&modes, modes.iterators, infile);
1510 goto again;
1512 if (strcmp (tmp_char, "define_code_attr") == 0)
1514 read_mapping (&codes, codes.attrs, infile);
1515 goto again;
1517 if (strcmp (tmp_char, "define_code_iterator") == 0)
1519 check_code_iterator (read_mapping (&codes, codes.iterators, infile),
1520 infile);
1521 goto again;
1523 real_code = (enum rtx_code) find_iterator (&codes, tmp_char, infile);
1524 bellwether_code = BELLWETHER_CODE (real_code);
1526 /* If we end up with an insn expression then we free this space below. */
1527 return_rtx = rtx_alloc (bellwether_code);
1528 format_ptr = GET_RTX_FORMAT (bellwether_code);
1529 PUT_CODE (return_rtx, real_code);
1531 /* If what follows is `: mode ', read it and
1532 store the mode in the rtx. */
1534 i = read_skip_spaces (infile);
1535 if (i == ':')
1537 unsigned int mode;
1539 read_name (tmp_char, infile);
1540 if (tmp_char[0] != '<' || tmp_char[strlen (tmp_char) - 1] != '>')
1541 mode = find_iterator (&modes, tmp_char, infile);
1542 else
1543 mode = mode_attr_index (mode_maps, tmp_char);
1544 PUT_MODE (return_rtx, (enum machine_mode) mode);
1545 if (GET_MODE (return_rtx) != mode)
1546 fatal_with_file_and_line (infile, "mode too large");
1548 else
1549 ungetc (i, infile);
1551 for (i = 0; format_ptr[i] != 0; i++)
1552 switch (format_ptr[i])
1554 /* 0 means a field for internal use only.
1555 Don't expect it to be present in the input. */
1556 case '0':
1557 break;
1559 case 'e':
1560 case 'u':
1561 XEXP (return_rtx, i) = read_rtx_1 (infile, mode_maps);
1562 break;
1564 case 'V':
1565 /* 'V' is an optional vector: if a closeparen follows,
1566 just store NULL for this element. */
1567 c = read_skip_spaces (infile);
1568 ungetc (c, infile);
1569 if (c == ')')
1571 XVEC (return_rtx, i) = 0;
1572 break;
1574 /* Now process the vector. */
1576 case 'E':
1578 /* Obstack to store scratch vector in. */
1579 struct obstack vector_stack;
1580 int list_counter = 0;
1581 rtvec return_vec = NULL_RTVEC;
1583 c = read_skip_spaces (infile);
1584 if (c != '[')
1585 fatal_expected_char (infile, '[', c);
1587 /* Add expressions to a list, while keeping a count. */
1588 obstack_init (&vector_stack);
1589 while ((c = read_skip_spaces (infile)) && c != ']')
1591 ungetc (c, infile);
1592 list_counter++;
1593 obstack_ptr_grow (&vector_stack, read_rtx_1 (infile, mode_maps));
1595 if (list_counter > 0)
1597 return_vec = rtvec_alloc (list_counter);
1598 memcpy (&return_vec->elem[0], obstack_finish (&vector_stack),
1599 list_counter * sizeof (rtx));
1601 else if (format_ptr[i] == 'E')
1602 fatal_with_file_and_line (infile,
1603 "vector must have at least one element");
1604 XVEC (return_rtx, i) = return_vec;
1605 obstack_free (&vector_stack, NULL);
1606 /* close bracket gotten */
1608 break;
1610 case 'S':
1611 case 'T':
1612 case 's':
1614 char *stringbuf;
1615 int star_if_braced;
1617 c = read_skip_spaces (infile);
1618 ungetc (c, infile);
1619 if (c == ')')
1621 /* 'S' fields are optional and should be NULL if no string
1622 was given. Also allow normal 's' and 'T' strings to be
1623 omitted, treating them in the same way as empty strings. */
1624 XSTR (return_rtx, i) = (format_ptr[i] == 'S' ? NULL : "");
1625 break;
1628 /* The output template slot of a DEFINE_INSN,
1629 DEFINE_INSN_AND_SPLIT, or DEFINE_PEEPHOLE automatically
1630 gets a star inserted as its first character, if it is
1631 written with a brace block instead of a string constant. */
1632 star_if_braced = (format_ptr[i] == 'T');
1634 stringbuf = read_string (infile, star_if_braced);
1636 /* For insn patterns, we want to provide a default name
1637 based on the file and line, like "*foo.md:12", if the
1638 given name is blank. These are only for define_insn and
1639 define_insn_and_split, to aid debugging. */
1640 if (*stringbuf == '\0'
1641 && i == 0
1642 && (GET_CODE (return_rtx) == DEFINE_INSN
1643 || GET_CODE (return_rtx) == DEFINE_INSN_AND_SPLIT))
1645 char line_name[20];
1646 const char *fn = (read_rtx_filename ? read_rtx_filename : "rtx");
1647 const char *slash;
1648 for (slash = fn; *slash; slash ++)
1649 if (*slash == '/' || *slash == '\\' || *slash == ':')
1650 fn = slash + 1;
1651 obstack_1grow (&string_obstack, '*');
1652 obstack_grow (&string_obstack, fn, strlen (fn));
1653 sprintf (line_name, ":%d", read_rtx_lineno);
1654 obstack_grow (&string_obstack, line_name, strlen (line_name)+1);
1655 stringbuf = XOBFINISH (&string_obstack, char *);
1658 if (star_if_braced)
1659 XTMPL (return_rtx, i) = stringbuf;
1660 else
1661 XSTR (return_rtx, i) = stringbuf;
1663 break;
1665 case 'w':
1666 read_name (tmp_char, infile);
1667 validate_const_int (infile, tmp_char);
1668 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
1669 tmp_wide = atoi (tmp_char);
1670 #else
1671 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
1672 tmp_wide = atol (tmp_char);
1673 #else
1674 /* Prefer atoll over atoq, since the former is in the ISO C99 standard.
1675 But prefer not to use our hand-rolled function above either. */
1676 #if defined(HAVE_ATOLL) || !defined(HAVE_ATOQ)
1677 tmp_wide = atoll (tmp_char);
1678 #else
1679 tmp_wide = atoq (tmp_char);
1680 #endif
1681 #endif
1682 #endif
1683 XWINT (return_rtx, i) = tmp_wide;
1684 break;
1686 case 'i':
1687 case 'n':
1688 read_name (tmp_char, infile);
1689 validate_const_int (infile, tmp_char);
1690 tmp_int = atoi (tmp_char);
1691 XINT (return_rtx, i) = tmp_int;
1692 break;
1694 default:
1695 gcc_unreachable ();
1698 c = read_skip_spaces (infile);
1699 if (c != ')')
1701 /* Syntactic sugar for AND and IOR, allowing Lisp-like
1702 arbitrary number of arguments for them. */
1703 if (c == '(' && (GET_CODE (return_rtx) == AND
1704 || GET_CODE (return_rtx) == IOR))
1705 return read_rtx_variadic (infile, mode_maps, return_rtx);
1706 else
1707 fatal_expected_char (infile, ')', c);
1710 return return_rtx;
1713 /* Mutually recursive subroutine of read_rtx which reads
1714 (thing x1 x2 x3 ...) and produces RTL as if
1715 (thing x1 (thing x2 (thing x3 ...))) had been written.
1716 When called, FORM is (thing x1 x2), and the file position
1717 is just past the leading parenthesis of x3. Only works
1718 for THINGs which are dyadic expressions, e.g. AND, IOR. */
1719 static rtx
1720 read_rtx_variadic (FILE *infile, struct map_value **mode_maps, rtx form)
1722 char c = '(';
1723 rtx p = form, q;
1727 ungetc (c, infile);
1729 q = rtx_alloc (GET_CODE (p));
1730 PUT_MODE (q, GET_MODE (p));
1732 XEXP (q, 0) = XEXP (p, 1);
1733 XEXP (q, 1) = read_rtx_1 (infile, mode_maps);
1735 XEXP (p, 1) = q;
1736 p = q;
1737 c = read_skip_spaces (infile);
1739 while (c == '(');
1741 if (c != ')')
1742 fatal_expected_char (infile, ')', c);
1744 return form;