OSDN Git Service

2004-09-23 Frank Ch. Eigler <fche@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / read-rtl.c
1 /* RTL reader for GCC.
2    Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
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 2, or (at your option) any later
11 version.
12
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.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 #include "bconfig.h"
24
25 /* Disable rtl checking; it conflicts with the macro handling.  */
26 #undef ENABLE_RTL_CHECKING
27
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "rtl.h"
32 #include "obstack.h"
33 #include "hashtab.h"
34
35 static htab_t md_constants;
36
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;
42 };
43
44 /* Maps a macro 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 macro or attribute.  */
49   const char *name;
50
51   /* The group (modes or codes) to which the macro or attribute belongs.  */
52   struct macro_group *group;
53
54   /* Gives a unique number to the attribute or macro.  Numbers are
55      allocated consecutively, starting at 0.  */
56   int index;
57
58   /* The list of (integer, string) pairs.  */
59   struct map_value *values;
60 };
61
62 /* A structure for abstracting the common parts of code and mode macros.  */
63 struct macro_group {
64   /* Tables of "mapping" structures, one for attributes and one for macros.  */
65   htab_t attrs, macros;
66
67   /* The number of "real" modes or codes (and by extension, the first
68      number available for use as a macro placeholder).  */
69   int num_builtins;
70
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 *);
74
75   /* Return true if the given rtx uses the given mode or code.  */
76   bool (*uses_macro_p) (rtx, int);
77
78   /* Make the given rtx use the given mode or code.  */
79   void (*apply_macro) (rtx, int);
80 };
81
82 /* If CODE is the number of a code macro, return a real rtx code that
83    has the same format.  Return CODE otherwise.  */
84 #define BELLWETHER_CODE(CODE) \
85   ((CODE) < NUM_RTX_CODE ? CODE : bellwether_codes[CODE - NUM_RTX_CODE])
86
87 static void fatal_with_file_and_line (FILE *, const char *, ...)
88   ATTRIBUTE_PRINTF_2 ATTRIBUTE_NORETURN;
89 static void fatal_expected_char (FILE *, int, int) ATTRIBUTE_NORETURN;
90 static int find_mode (const char *, FILE *);
91 static bool uses_mode_macro_p (rtx, int);
92 static void apply_mode_macro (rtx, int);
93 static int find_code (const char *, FILE *);
94 static bool uses_code_macro_p (rtx, int);
95 static void apply_code_macro (rtx, int);
96 static const char *apply_macro_to_string (const char *, struct mapping *, int);
97 static rtx apply_macro_to_rtx (rtx, struct mapping *, int);
98 static bool uses_macro_p (rtx, struct mapping *);
99 static const char *add_condition_to_string (const char *, const char *);
100 static void add_condition_to_rtx (rtx, const char *);
101 static int apply_macro_traverse (void **, void *);
102 static struct mapping *add_mapping (struct macro_group *, htab_t t,
103                                     const char *, FILE *);
104 static struct map_value **add_map_value (struct map_value **,
105                                          int, const char *);
106 static void initialize_macros (void);
107 static void read_name (char *, FILE *);
108 static char *read_string (FILE *, int);
109 static char *read_quoted_string (FILE *);
110 static char *read_braced_string (FILE *);
111 static void read_escape (FILE *);
112 static hashval_t def_hash (const void *);
113 static int def_name_eq_p (const void *, const void *);
114 static void read_constants (FILE *infile, char *tmp_char);
115 static void validate_const_int (FILE *, const char *);
116 static int find_macro (struct macro_group *, const char *, FILE *);
117 static struct mapping *read_mapping (struct macro_group *, htab_t, FILE *);
118 static void check_code_macro (struct mapping *, FILE *);
119 static rtx read_rtx_1 (FILE *);
120
121 /* The mode and code macro structures.  */
122 static struct macro_group modes, codes;
123
124 /* Index I is the value of BELLWETHER_CODE (I + NUM_RTX_CODE).  */
125 static enum rtx_code *bellwether_codes;
126
127 /* Obstack used for allocating RTL strings.  */
128 static struct obstack string_obstack;
129
130 /* Subroutines of read_rtx.  */
131
132 /* The current line number for the file.  */
133 int read_rtx_lineno = 1;
134
135 /* The filename for aborting with file and line.  */
136 const char *read_rtx_filename = "<unknown>";
137
138 static void
139 fatal_with_file_and_line (FILE *infile, const char *msg, ...)
140 {
141   char context[64];
142   size_t i;
143   int c;
144   va_list ap;
145
146   va_start (ap, msg);
147
148   fprintf (stderr, "%s:%d: ", read_rtx_filename, read_rtx_lineno);
149   vfprintf (stderr, msg, ap);
150   putc ('\n', stderr);
151
152   /* Gather some following context.  */
153   for (i = 0; i < sizeof (context)-1; ++i)
154     {
155       c = getc (infile);
156       if (c == EOF)
157         break;
158       if (c == '\r' || c == '\n')
159         break;
160       context[i] = c;
161     }
162   context[i] = '\0';
163
164   fprintf (stderr, "%s:%d: following context is `%s'\n",
165            read_rtx_filename, read_rtx_lineno, context);
166
167   va_end (ap);
168   exit (1);
169 }
170
171 /* Dump code after printing a message.  Used when read_rtx finds
172    invalid data.  */
173
174 static void
175 fatal_expected_char (FILE *infile, int expected_c, int actual_c)
176 {
177   fatal_with_file_and_line (infile, "expected character `%c', found `%c'",
178                             expected_c, actual_c);
179 }
180
181 /* Implementations of the macro_group callbacks for modes.  */
182
183 static int
184 find_mode (const char *name, FILE *infile)
185 {
186   int i;
187
188   for (i = 0; i < NUM_MACHINE_MODES; i++)
189     if (strcmp (GET_MODE_NAME (i), name) == 0)
190       return i;
191
192   fatal_with_file_and_line (infile, "unknown mode `%s'", name);
193 }
194
195 static bool
196 uses_mode_macro_p (rtx x, int mode)
197 {
198   return (int) GET_MODE (x) == mode;
199 }
200
201 static void
202 apply_mode_macro (rtx x, int mode)
203 {
204   PUT_MODE (x, mode);
205 }
206
207 /* Implementations of the macro_group callbacks for codes.  */
208
209 static int
210 find_code (const char *name, FILE *infile)
211 {
212   int i;
213
214   for (i = 0; i < NUM_RTX_CODE; i++)
215     if (strcmp (GET_RTX_NAME (i), name) == 0)
216       return i;
217
218   fatal_with_file_and_line (infile, "unknown rtx code `%s'", name);
219 }
220
221 static bool
222 uses_code_macro_p (rtx x, int code)
223 {
224   return (int) GET_CODE (x) == code;
225 }
226
227 static void
228 apply_code_macro (rtx x, int code)
229 {
230   PUT_CODE (x, code);
231 }
232
233 /* Given that MACRO is being expanded as VALUE, apply the appropriate
234    string substitutions to STRING.  Return the new string if any changes
235    were needed, otherwise return STRING itself.  */
236
237 static const char *
238 apply_macro_to_string (const char *string, struct mapping *macro, int value)
239 {
240   char *base, *copy, *p, *attr, *start, *end;
241   struct mapping *m;
242   struct map_value *v;
243
244   if (string == 0)
245     return string;
246
247   base = p = copy = ASTRDUP (string);
248   while ((start = index (p, '<')) && (end = index (start, '>')))
249     {
250       p = start + 1;
251
252       /* If there's a "macro:" prefix, check whether the macro name matches.
253          Set ATTR to the start of the attribute name.  */
254       attr = index (p, ':');
255       if (attr == 0 || attr > end)
256         attr = p;
257       else
258         {
259           if (strncmp (p, macro->name, attr - p) != 0
260               || macro->name[attr - p] != 0)
261             continue;
262           attr++;
263         }
264
265       /* Find the attribute specification.  */
266       *end = 0;
267       m = (struct mapping *) htab_find (macro->group->attrs, &attr);
268       *end = '>';
269       if (m == 0)
270         continue;
271
272       /* Find the attribute value for VALUE.  */
273       for (v = m->values; v != 0; v = v->next)
274         if (v->number == value)
275           break;
276       if (v == 0)
277         continue;
278
279       /* Add everything between the last copied byte and the '<',
280          then add in the attribute value.  */
281       obstack_grow (&string_obstack, base, start - base);
282       obstack_grow (&string_obstack, v->string, strlen (v->string));
283       base = end + 1;
284     }
285   if (base != copy)
286     {
287       obstack_grow (&string_obstack, base, strlen (base) + 1);
288       return (char *) obstack_finish (&string_obstack);
289     }
290   return string;
291 }
292
293 /* Return a copy of ORIGINAL in which all uses of MACRO have been
294    replaced by VALUE.  */
295
296 static rtx
297 apply_macro_to_rtx (rtx original, struct mapping *macro, int value)
298 {
299   struct macro_group *group;
300   const char *format_ptr;
301   int i, j;
302   rtx x;
303   enum rtx_code bellwether_code;
304
305   if (original == 0)
306     return original;
307
308   /* Create a shallow copy of ORIGINAL.  */
309   bellwether_code = BELLWETHER_CODE (GET_CODE (original));
310   x = rtx_alloc (bellwether_code);
311   memcpy (x, original, RTX_SIZE (bellwether_code));
312
313   /* Change the mode or code itself.  */
314   group = macro->group;
315   if (group->uses_macro_p (x, macro->index + group->num_builtins))
316     group->apply_macro (x, value);
317
318   /* Change each string and recursively change each rtx.  */
319   format_ptr = GET_RTX_FORMAT (bellwether_code);
320   for (i = 0; format_ptr[i] != 0; i++)
321     switch (format_ptr[i])
322       {
323       case 'T':
324         XTMPL (x, i) = apply_macro_to_string (XTMPL (x, i), macro, value);
325         break;
326
327       case 'S':
328       case 's':
329         XSTR (x, i) = apply_macro_to_string (XSTR (x, i), macro, value);
330         break;
331
332       case 'e':
333         XEXP (x, i) = apply_macro_to_rtx (XEXP (x, i), macro, value);
334         break;
335
336       case 'V':
337       case 'E':
338         if (XVEC (original, i))
339           {
340             XVEC (x, i) = rtvec_alloc (XVECLEN (original, i));
341             for (j = 0; j < XVECLEN (x, i); j++)
342               XVECEXP (x, i, j) = apply_macro_to_rtx (XVECEXP (original, i, j),
343                                                       macro, value);
344           }
345         break;
346
347       default:
348         break;
349       }
350   return x;
351 }
352
353 /* Return true if X (or some subexpression of X) uses macro MACRO.  */
354
355 static bool
356 uses_macro_p (rtx x, struct mapping *macro)
357 {
358   struct macro_group *group;
359   const char *format_ptr;
360   int i, j;
361
362   if (x == 0)
363     return false;
364
365   group = macro->group;
366   if (group->uses_macro_p (x, macro->index + group->num_builtins))
367     return true;
368
369   format_ptr = GET_RTX_FORMAT (BELLWETHER_CODE (GET_CODE (x)));
370   for (i = 0; format_ptr[i] != 0; i++)
371     switch (format_ptr[i])
372       {
373       case 'e':
374         if (uses_macro_p (XEXP (x, i), macro))
375           return true;
376         break;
377
378       case 'V':
379       case 'E':
380         if (XVEC (x, i))
381           for (j = 0; j < XVECLEN (x, i); j++)
382             if (uses_macro_p (XVECEXP (x, i, j), macro))
383               return true;
384         break;
385
386       default:
387         break;
388       }
389   return false;
390 }
391
392 /* Return a condition that must satisfy both ORIGINAL and EXTRA.  If ORIGINAL
393    has the form "&& ..." (as used in define_insn_and_splits), assume that
394    EXTRA is already satisfied.  Empty strings are treated like "true".  */
395
396 static const char *
397 add_condition_to_string (const char *original, const char *extra)
398 {
399   char *result;
400
401   if (original == 0 || original[0] == 0)
402     return extra;
403
404   if ((original[0] == '&' && original[1] == '&') || extra[0] == 0)
405     return original;
406
407   asprintf (&result, "(%s) && (%s)", original, extra);
408   return result;
409 }
410
411 /* Like add_condition, but applied to all conditions in rtx X.  */
412
413 static void
414 add_condition_to_rtx (rtx x, const char *extra)
415 {
416   switch (GET_CODE (x))
417     {
418     case DEFINE_INSN:
419     case DEFINE_EXPAND:
420       XSTR (x, 2) = add_condition_to_string (XSTR (x, 2), extra);
421       break;
422
423     case DEFINE_SPLIT:
424     case DEFINE_PEEPHOLE:
425     case DEFINE_PEEPHOLE2:
426     case DEFINE_COND_EXEC:
427       XSTR (x, 1) = add_condition_to_string (XSTR (x, 1), extra);
428       break;
429
430     case DEFINE_INSN_AND_SPLIT:
431       XSTR (x, 2) = add_condition_to_string (XSTR (x, 2), extra);
432       XSTR (x, 4) = add_condition_to_string (XSTR (x, 4), extra);
433       break;
434
435     default:
436       break;
437     }
438 }
439
440 /* A htab_traverse callback.  Search the EXPR_LIST given by DATA
441    for rtxes that use the macro in *SLOT.  Replace each such rtx
442    with a list of expansions.  */
443
444 static int
445 apply_macro_traverse (void **slot, void *data)
446 {
447   struct mapping *macro;
448   struct map_value *v;
449   rtx elem, new_elem, original, x;
450
451   macro = (struct mapping *) *slot;
452   for (elem = (rtx) data; elem != 0; elem = XEXP (elem, 1))
453     if (uses_macro_p (XEXP (elem, 0), macro))
454       {
455         original = XEXP (elem, 0);
456         for (v = macro->values; v != 0; v = v->next)
457           {
458             x = apply_macro_to_rtx (original, macro, v->number);
459             add_condition_to_rtx (x, v->string);
460             if (v != macro->values)
461               {
462                 /* Insert a new EXPR_LIST node after ELEM and put the
463                    new expansion there.  */
464                 new_elem = rtx_alloc (EXPR_LIST);
465                 XEXP (new_elem, 1) = XEXP (elem, 1);
466                 XEXP (elem, 1) = new_elem;
467                 elem = new_elem;
468               }
469             XEXP (elem, 0) = x;
470           }
471     }
472   return 1;
473 }
474
475 /* Add a new "mapping" structure to hashtable TABLE.  NAME is the name
476    of the mapping, GROUP is the group to which it belongs, and INFILE
477    is the file that defined the mapping.  */
478
479 static struct mapping *
480 add_mapping (struct macro_group *group, htab_t table,
481              const char *name, FILE *infile)
482 {
483   struct mapping *m;
484   void **slot;
485
486   m = XNEW (struct mapping);
487   m->name = xstrdup (name);
488   m->group = group;
489   m->index = htab_elements (table);
490   m->values = 0;
491
492   slot = htab_find_slot (table, m, INSERT);
493   if (*slot != 0)
494     fatal_with_file_and_line (infile, "`%s' already defined", name);
495
496   *slot = m;
497   return m;
498 }
499
500 /* Add the pair (NUMBER, STRING) to a list of map_value structures.
501    END_PTR points to the current null terminator for the list; return
502    a pointer the new null terminator.  */
503
504 static struct map_value **
505 add_map_value (struct map_value **end_ptr, int number, const char *string)
506 {
507   struct map_value *value;
508
509   value = XNEW (struct map_value);
510   value->next = 0;
511   value->number = number;
512   value->string = string;
513
514   *end_ptr = value;
515   return &value->next;
516 }
517
518 /* Do one-time initialization of the mode and code attributes.  */
519
520 static void
521 initialize_macros (void)
522 {
523   struct mapping *lower, *upper;
524   struct map_value **lower_ptr, **upper_ptr;
525   char *copy, *p;
526   int i;
527
528   modes.attrs = htab_create (13, def_hash, def_name_eq_p, 0);
529   modes.macros = htab_create (13, def_hash, def_name_eq_p, 0);
530   modes.num_builtins = MAX_MACHINE_MODE;
531   modes.find_builtin = find_mode;
532   modes.uses_macro_p = uses_mode_macro_p;
533   modes.apply_macro = apply_mode_macro;
534
535   codes.attrs = htab_create (13, def_hash, def_name_eq_p, 0);
536   codes.macros = htab_create (13, def_hash, def_name_eq_p, 0);
537   codes.num_builtins = NUM_RTX_CODE;
538   codes.find_builtin = find_code;
539   codes.uses_macro_p = uses_code_macro_p;
540   codes.apply_macro = apply_code_macro;
541
542   lower = add_mapping (&modes, modes.attrs, "mode", 0);
543   upper = add_mapping (&modes, modes.attrs, "MODE", 0);
544   lower_ptr = &lower->values;
545   upper_ptr = &upper->values;
546   for (i = 0; i < MAX_MACHINE_MODE; i++)
547     {
548       copy = xstrdup (GET_MODE_NAME (i));
549       for (p = copy; *p != 0; p++)
550         *p = TOLOWER (*p);
551
552       upper_ptr = add_map_value (upper_ptr, i, GET_MODE_NAME (i));
553       lower_ptr = add_map_value (lower_ptr, i, copy);
554     }
555
556   lower = add_mapping (&codes, codes.attrs, "code", 0);
557   upper = add_mapping (&codes, codes.attrs, "CODE", 0);
558   lower_ptr = &lower->values;
559   upper_ptr = &upper->values;
560   for (i = 0; i < NUM_RTX_CODE; i++)
561     {
562       copy = xstrdup (GET_RTX_NAME (i));
563       for (p = copy; *p != 0; p++)
564         *p = TOUPPER (*p);
565
566       lower_ptr = add_map_value (lower_ptr, i, GET_RTX_NAME (i));
567       upper_ptr = add_map_value (upper_ptr, i, copy);
568     }
569 }
570
571 /* Read chars from INFILE until a non-whitespace char
572    and return that.  Comments, both Lisp style and C style,
573    are treated as whitespace.
574    Tools such as genflags use this function.  */
575
576 int
577 read_skip_spaces (FILE *infile)
578 {
579   int c;
580
581   while (1)
582     {
583       c = getc (infile);
584       switch (c)
585         {
586         case '\n':
587           read_rtx_lineno++;
588           break;
589
590         case ' ': case '\t': case '\f': case '\r':
591           break;
592
593         case ';':
594           do
595             c = getc (infile);
596           while (c != '\n' && c != EOF);
597           read_rtx_lineno++;
598           break;
599
600         case '/':
601           {
602             int prevc;
603             c = getc (infile);
604             if (c != '*')
605               fatal_expected_char (infile, '*', c);
606
607             prevc = 0;
608             while ((c = getc (infile)) && c != EOF)
609               {
610                 if (c == '\n')
611                    read_rtx_lineno++;
612                 else if (prevc == '*' && c == '/')
613                   break;
614                 prevc = c;
615               }
616           }
617           break;
618
619         default:
620           return c;
621         }
622     }
623 }
624
625 /* Read an rtx code name into the buffer STR[].
626    It is terminated by any of the punctuation chars of rtx printed syntax.  */
627
628 static void
629 read_name (char *str, FILE *infile)
630 {
631   char *p;
632   int c;
633
634   c = read_skip_spaces (infile);
635
636   p = str;
637   while (1)
638     {
639       if (c == ' ' || c == '\n' || c == '\t' || c == '\f' || c == '\r')
640         break;
641       if (c == ':' || c == ')' || c == ']' || c == '"' || c == '/'
642           || c == '(' || c == '[')
643         {
644           ungetc (c, infile);
645           break;
646         }
647       *p++ = c;
648       c = getc (infile);
649     }
650   if (p == str)
651     fatal_with_file_and_line (infile, "missing name or number");
652   if (c == '\n')
653     read_rtx_lineno++;
654
655   *p = 0;
656
657   if (md_constants)
658     {
659       /* Do constant expansion.  */
660       struct md_constant *def;
661
662       p = str;
663       do
664         {
665           struct md_constant tmp_def;
666
667           tmp_def.name = p;
668           def = (struct md_constant *) htab_find (md_constants, &tmp_def);
669           if (def)
670             p = def->value;
671         } while (def);
672       if (p != str)
673         strcpy (str, p);
674     }
675 }
676
677 /* Subroutine of the string readers.  Handles backslash escapes.
678    Caller has read the backslash, but not placed it into the obstack.  */
679 static void
680 read_escape (FILE *infile)
681 {
682   int c = getc (infile);
683
684   switch (c)
685     {
686       /* Backslash-newline is replaced by nothing, as in C.  */
687     case '\n':
688       read_rtx_lineno++;
689       return;
690
691       /* \" \' \\ are replaced by the second character.  */
692     case '\\':
693     case '"':
694     case '\'':
695       break;
696
697       /* Standard C string escapes:
698          \a \b \f \n \r \t \v
699          \[0-7] \x
700          all are passed through to the output string unmolested.
701          In normal use these wind up in a string constant processed
702          by the C compiler, which will translate them appropriately.
703          We do not bother checking that \[0-7] are followed by up to
704          two octal digits, or that \x is followed by N hex digits.
705          \? \u \U are left out because they are not in traditional C.  */
706     case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':
707     case '0': case '1': case '2': case '3': case '4': case '5': case '6':
708     case '7': case 'x':
709       obstack_1grow (&string_obstack, '\\');
710       break;
711
712       /* \; makes stuff for a C string constant containing
713          newline and tab.  */
714     case ';':
715       obstack_grow (&string_obstack, "\\n\\t", 4);
716       return;
717
718       /* pass anything else through, but issue a warning.  */
719     default:
720       fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n",
721                read_rtx_filename, read_rtx_lineno, c);
722       obstack_1grow (&string_obstack, '\\');
723       break;
724     }
725
726   obstack_1grow (&string_obstack, c);
727 }
728
729
730 /* Read a double-quoted string onto the obstack.  Caller has scanned
731    the leading quote.  */
732 static char *
733 read_quoted_string (FILE *infile)
734 {
735   int c;
736
737   while (1)
738     {
739       c = getc (infile); /* Read the string  */
740       if (c == '\n')
741         read_rtx_lineno++;
742       else if (c == '\\')
743         {
744           read_escape (infile);
745           continue;
746         }
747       else if (c == '"')
748         break;
749
750       obstack_1grow (&string_obstack, c);
751     }
752
753   obstack_1grow (&string_obstack, 0);
754   return (char *) obstack_finish (&string_obstack);
755 }
756
757 /* Read a braced string (a la Tcl) onto the string obstack.  Caller
758    has scanned the leading brace.  Note that unlike quoted strings,
759    the outermost braces _are_ included in the string constant.  */
760 static char *
761 read_braced_string (FILE *infile)
762 {
763   int c;
764   int brace_depth = 1;  /* caller-processed */
765   unsigned long starting_read_rtx_lineno = read_rtx_lineno;
766
767   obstack_1grow (&string_obstack, '{');
768   while (brace_depth)
769     {
770       c = getc (infile); /* Read the string  */
771
772       if (c == '\n')
773         read_rtx_lineno++;
774       else if (c == '{')
775         brace_depth++;
776       else if (c == '}')
777         brace_depth--;
778       else if (c == '\\')
779         {
780           read_escape (infile);
781           continue;
782         }
783       else if (c == EOF)
784         fatal_with_file_and_line
785           (infile, "missing closing } for opening brace on line %lu",
786            starting_read_rtx_lineno);
787
788       obstack_1grow (&string_obstack, c);
789     }
790
791   obstack_1grow (&string_obstack, 0);
792   return (char *) obstack_finish (&string_obstack);
793 }
794
795 /* Read some kind of string constant.  This is the high-level routine
796    used by read_rtx.  It handles surrounding parentheses, leading star,
797    and dispatch to the appropriate string constant reader.  */
798
799 static char *
800 read_string (FILE *infile, int star_if_braced)
801 {
802   char *stringbuf;
803   int saw_paren = 0;
804   int c;
805
806   c = read_skip_spaces (infile);
807   if (c == '(')
808     {
809       saw_paren = 1;
810       c = read_skip_spaces (infile);
811     }
812
813   if (c == '"')
814     stringbuf = read_quoted_string (infile);
815   else if (c == '{')
816     {
817       if (star_if_braced)
818         obstack_1grow (&string_obstack, '*');
819       stringbuf = read_braced_string (infile);
820     }
821   else
822     fatal_with_file_and_line (infile, "expected `\"' or `{', found `%c'", c);
823
824   if (saw_paren)
825     {
826       c = read_skip_spaces (infile);
827       if (c != ')')
828         fatal_expected_char (infile, ')', c);
829     }
830
831   return stringbuf;
832 }
833 \f
834 /* Provide a version of a function to read a long long if the system does
835    not provide one.  */
836 #if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_LONG && !defined(HAVE_ATOLL) && !defined(HAVE_ATOQ)
837 HOST_WIDE_INT atoll (const char *);
838
839 HOST_WIDE_INT
840 atoll (const char *p)
841 {
842   int neg = 0;
843   HOST_WIDE_INT tmp_wide;
844
845   while (ISSPACE (*p))
846     p++;
847   if (*p == '-')
848     neg = 1, p++;
849   else if (*p == '+')
850     p++;
851
852   tmp_wide = 0;
853   while (ISDIGIT (*p))
854     {
855       HOST_WIDE_INT new_wide = tmp_wide*10 + (*p - '0');
856       if (new_wide < tmp_wide)
857         {
858           /* Return INT_MAX equiv on overflow.  */
859           tmp_wide = (~(unsigned HOST_WIDE_INT) 0) >> 1;
860           break;
861         }
862       tmp_wide = new_wide;
863       p++;
864     }
865
866   if (neg)
867     tmp_wide = -tmp_wide;
868   return tmp_wide;
869 }
870 #endif
871
872 /* Given an object that starts with a char * name field, return a hash
873    code for its name.  */
874 static hashval_t
875 def_hash (const void *def)
876 {
877   unsigned result, i;
878   const char *string = *(const char *const *) def;
879
880   for (result = i = 0; *string++ != '\0'; i++)
881     result += ((unsigned char) *string << (i % CHAR_BIT));
882   return result;
883 }
884
885 /* Given two objects that start with char * name fields, return true if
886    they have the same name.  */
887 static int
888 def_name_eq_p (const void *def1, const void *def2)
889 {
890   return ! strcmp (*(const char *const *) def1,
891                    *(const char *const *) def2);
892 }
893
894 /* INFILE is a FILE pointer to read text from.  TMP_CHAR is a buffer suitable
895    to read a name or number into.  Process a define_constants directive,
896    starting with the optional space after the "define_constants".  */
897 static void
898 read_constants (FILE *infile, char *tmp_char)
899 {
900   int c;
901   htab_t defs;
902
903   c = read_skip_spaces (infile);
904   if (c != '[')
905     fatal_expected_char (infile, '[', c);
906   defs = md_constants;
907   if (! defs)
908     defs = htab_create (32, def_hash, def_name_eq_p, (htab_del) 0);
909   /* Disable constant expansion during definition processing.  */
910   md_constants = 0;
911   while ( (c = read_skip_spaces (infile)) != ']')
912     {
913       struct md_constant *def;
914       void **entry_ptr;
915
916       if (c != '(')
917         fatal_expected_char (infile, '(', c);
918       def = XNEW (struct md_constant);
919       def->name = tmp_char;
920       read_name (tmp_char, infile);
921       entry_ptr = htab_find_slot (defs, def, INSERT);
922       if (! *entry_ptr)
923         def->name = xstrdup (tmp_char);
924       c = read_skip_spaces (infile);
925       ungetc (c, infile);
926       read_name (tmp_char, infile);
927       if (! *entry_ptr)
928         {
929           def->value = xstrdup (tmp_char);
930           *entry_ptr = def;
931         }
932       else
933         {
934           def = (struct md_constant *) *entry_ptr;
935           if (strcmp (def->value, tmp_char))
936             fatal_with_file_and_line (infile,
937                                       "redefinition of %s, was %s, now %s",
938                                       def->name, def->value, tmp_char);
939         }
940       c = read_skip_spaces (infile);
941       if (c != ')')
942         fatal_expected_char (infile, ')', c);
943     }
944   md_constants = defs;
945   c = read_skip_spaces (infile);
946   if (c != ')')
947     fatal_expected_char (infile, ')', c);
948 }
949
950 /* For every constant definition, call CALLBACK with two arguments:
951    a pointer a pointer to the constant definition and INFO.
952    Stops when CALLBACK returns zero.  */
953 void
954 traverse_md_constants (htab_trav callback, void *info)
955 {
956   if (md_constants)
957     htab_traverse (md_constants, callback, info);
958 }
959
960 static void
961 validate_const_int (FILE *infile, const char *string)
962 {
963   const char *cp;
964   int valid = 1;
965
966   cp = string;
967   while (*cp && ISSPACE (*cp))
968     cp++;
969   if (*cp == '-' || *cp == '+')
970     cp++;
971   if (*cp == 0)
972     valid = 0;
973   for (; *cp; cp++)
974     if (! ISDIGIT (*cp))
975       valid = 0;
976   if (!valid)
977     fatal_with_file_and_line (infile, "invalid decimal constant \"%s\"\n", string);
978 }
979
980 /* Search GROUP for a mode or code called NAME and return its numerical
981    identifier.  INFILE is the file that contained NAME.  */
982
983 static int
984 find_macro (struct macro_group *group, const char *name, FILE *infile)
985 {
986   struct mapping *m;
987
988   m = (struct mapping *) htab_find (group->macros, &name);
989   if (m != 0)
990     return m->index + group->num_builtins;
991   return group->find_builtin (name, infile);
992 }
993
994 /* Finish reading a declaration of the form:
995
996        (define... <name> [<value1> ... <valuen>])
997
998    from INFILE, where each <valuei> is either a bare symbol name or a
999    "(<name> <string>)" pair.  The "(define..." part has already been read.
1000
1001    Represent the declaration as a "mapping" structure; add it to TABLE
1002    (which belongs to GROUP) and return it.  */
1003
1004 static struct mapping *
1005 read_mapping (struct macro_group *group, htab_t table, FILE *infile)
1006 {
1007   char tmp_char[256];
1008   struct mapping *m;
1009   struct map_value **end_ptr;
1010   const char *string;
1011   int number, c;
1012
1013   /* Read the mapping name and create a structure for it.  */
1014   read_name (tmp_char, infile);
1015   m = add_mapping (group, table, tmp_char, infile);
1016
1017   c = read_skip_spaces (infile);
1018   if (c != '[')
1019     fatal_expected_char (infile, '[', c);
1020
1021   /* Read each value.  */
1022   end_ptr = &m->values;
1023   c = read_skip_spaces (infile);
1024   do
1025     {
1026       if (c != '(')
1027         {
1028           /* A bare symbol name that is implicitly paired to an
1029              empty string.  */
1030           ungetc (c, infile);
1031           read_name (tmp_char, infile);
1032           string = "";
1033         }
1034       else
1035         {
1036           /* A "(name string)" pair.  */
1037           read_name (tmp_char, infile);
1038           string = read_string (infile, false);
1039           c = read_skip_spaces (infile);
1040           if (c != ')')
1041             fatal_expected_char (infile, ')', c);
1042         }
1043       number = group->find_builtin (tmp_char, infile);
1044       end_ptr = add_map_value (end_ptr, number, string);
1045       c = read_skip_spaces (infile);
1046     }
1047   while (c != ']');
1048
1049   c = read_skip_spaces (infile);
1050   if (c != ')')
1051     fatal_expected_char (infile, ')', c);
1052
1053   return m;
1054 }
1055
1056 /* Check newly-created code macro MACRO to see whether every code has the
1057    same format.  Initialize the macro's entry in bellwether_codes.  */
1058
1059 static void
1060 check_code_macro (struct mapping *macro, FILE *infile)
1061 {
1062   struct map_value *v;
1063   enum rtx_code bellwether;
1064
1065   bellwether = macro->values->number;
1066   for (v = macro->values->next; v != 0; v = v->next)
1067     if (strcmp (GET_RTX_FORMAT (bellwether), GET_RTX_FORMAT (v->number)) != 0)
1068       fatal_with_file_and_line (infile, "code macro `%s' combines "
1069                                 "different rtx formats", macro->name);
1070
1071   bellwether_codes = XRESIZEVEC (enum rtx_code, bellwether_codes,
1072                                  macro->index + 1);
1073   bellwether_codes[macro->index] = bellwether;
1074 }
1075
1076 /* Read an rtx in printed representation from INFILE and store its
1077    core representation in *X.  Also store the line number of the
1078    opening '(' in *LINENO.  Return true on success or false if the
1079    end of file has been reached.
1080
1081    read_rtx is not used in the compiler proper, but rather in
1082    the utilities gen*.c that construct C code from machine descriptions.  */
1083
1084 bool
1085 read_rtx (FILE *infile, rtx *x, int *lineno)
1086 {
1087   static rtx queue_head, queue_next;
1088   static int queue_lineno;
1089   int c;
1090
1091   /* Do one-time initialization.  */
1092   if (queue_head == 0)
1093     {
1094       initialize_macros ();
1095       obstack_init (&string_obstack);
1096       queue_head = rtx_alloc (EXPR_LIST);
1097     }
1098
1099   if (queue_next == 0)
1100     {
1101       c = read_skip_spaces (infile);
1102       if (c == EOF)
1103         return false;
1104       ungetc (c, infile);
1105
1106       queue_next = queue_head;
1107       queue_lineno = read_rtx_lineno;
1108       XEXP (queue_next, 0) = read_rtx_1 (infile);
1109       XEXP (queue_next, 1) = 0;
1110
1111       htab_traverse (modes.macros, apply_macro_traverse, queue_next);
1112       htab_traverse (codes.macros, apply_macro_traverse, queue_next);
1113     }
1114
1115   *x = XEXP (queue_next, 0);
1116   *lineno = queue_lineno;
1117   queue_next = XEXP (queue_next, 1);
1118
1119   return true;
1120 }
1121
1122 /* Subroutine of read_rtx that reads one construct from INFILE but
1123    doesn't apply any macros.  */
1124
1125 static rtx
1126 read_rtx_1 (FILE *infile)
1127 {
1128   int i;
1129   RTX_CODE real_code, bellwether_code;
1130   const char *format_ptr;
1131   /* tmp_char is a buffer used for reading decimal integers
1132      and names of rtx types and machine modes.
1133      Therefore, 256 must be enough.  */
1134   char tmp_char[256];
1135   rtx return_rtx;
1136   int c;
1137   int tmp_int;
1138   HOST_WIDE_INT tmp_wide;
1139
1140   /* Linked list structure for making RTXs: */
1141   struct rtx_list
1142     {
1143       struct rtx_list *next;
1144       rtx value;                /* Value of this node.  */
1145     };
1146
1147  again:
1148   c = read_skip_spaces (infile); /* Should be open paren.  */
1149   if (c != '(')
1150     fatal_expected_char (infile, '(', c);
1151
1152   read_name (tmp_char, infile);
1153   if (strcmp (tmp_char, "nil") == 0)
1154     {
1155       /* (nil) stands for an expression that isn't there.  */
1156       c = read_skip_spaces (infile);
1157       if (c != ')')
1158         fatal_expected_char (infile, ')', c);
1159       return 0;
1160     }
1161   if (strcmp (tmp_char, "define_constants") == 0)
1162     {
1163       read_constants (infile, tmp_char);
1164       goto again;
1165     }
1166   if (strcmp (tmp_char, "define_mode_attr") == 0)
1167     {
1168       read_mapping (&modes, modes.attrs, infile);
1169       goto again;
1170     }
1171   if (strcmp (tmp_char, "define_mode_macro") == 0)
1172     {
1173       read_mapping (&modes, modes.macros, infile);
1174       goto again;
1175     }
1176   if (strcmp (tmp_char, "define_code_attr") == 0)
1177     {
1178       read_mapping (&codes, codes.attrs, infile);
1179       goto again;
1180     }
1181   if (strcmp (tmp_char, "define_code_macro") == 0)
1182     {
1183       check_code_macro (read_mapping (&codes, codes.macros, infile), infile);
1184       goto again;
1185     }
1186   real_code = find_macro (&codes, tmp_char, infile);
1187   bellwether_code = BELLWETHER_CODE (real_code);
1188
1189   /* If we end up with an insn expression then we free this space below.  */
1190   return_rtx = rtx_alloc (bellwether_code);
1191   format_ptr = GET_RTX_FORMAT (bellwether_code);
1192   PUT_CODE (return_rtx, real_code);
1193
1194   /* If what follows is `: mode ', read it and
1195      store the mode in the rtx.  */
1196
1197   i = read_skip_spaces (infile);
1198   if (i == ':')
1199     {
1200       read_name (tmp_char, infile);
1201       PUT_MODE (return_rtx, find_macro (&modes, tmp_char, infile));
1202     }
1203   else
1204     ungetc (i, infile);
1205
1206   for (i = 0; format_ptr[i] != 0; i++)
1207     switch (format_ptr[i])
1208       {
1209         /* 0 means a field for internal use only.
1210            Don't expect it to be present in the input.  */
1211       case '0':
1212         break;
1213
1214       case 'e':
1215       case 'u':
1216         XEXP (return_rtx, i) = read_rtx_1 (infile);
1217         break;
1218
1219       case 'V':
1220         /* 'V' is an optional vector: if a closeparen follows,
1221            just store NULL for this element.  */
1222         c = read_skip_spaces (infile);
1223         ungetc (c, infile);
1224         if (c == ')')
1225           {
1226             XVEC (return_rtx, i) = 0;
1227             break;
1228           }
1229         /* Now process the vector.  */
1230
1231       case 'E':
1232         {
1233           /* Obstack to store scratch vector in.  */
1234           struct obstack vector_stack;
1235           int list_counter = 0;
1236           rtvec return_vec = NULL_RTVEC;
1237
1238           c = read_skip_spaces (infile);
1239           if (c != '[')
1240             fatal_expected_char (infile, '[', c);
1241
1242           /* Add expressions to a list, while keeping a count.  */
1243           obstack_init (&vector_stack);
1244           while ((c = read_skip_spaces (infile)) && c != ']')
1245             {
1246               ungetc (c, infile);
1247               list_counter++;
1248               obstack_ptr_grow (&vector_stack, read_rtx_1 (infile));
1249             }
1250           if (list_counter > 0)
1251             {
1252               return_vec = rtvec_alloc (list_counter);
1253               memcpy (&return_vec->elem[0], obstack_finish (&vector_stack),
1254                       list_counter * sizeof (rtx));
1255             }
1256           XVEC (return_rtx, i) = return_vec;
1257           obstack_free (&vector_stack, NULL);
1258           /* close bracket gotten */
1259         }
1260         break;
1261
1262       case 'S':
1263       case 'T':
1264       case 's':
1265         {
1266           char *stringbuf;
1267           int star_if_braced;
1268
1269           c = read_skip_spaces (infile);
1270           ungetc (c, infile);
1271           if (c == ')')
1272             {
1273               /* 'S' fields are optional and should be NULL if no string
1274                  was given.  Also allow normal 's' and 'T' strings to be
1275                  omitted, treating them in the same way as empty strings.  */
1276               XSTR (return_rtx, i) = (format_ptr[i] == 'S' ? NULL : "");
1277               break;
1278             }
1279
1280           /* The output template slot of a DEFINE_INSN,
1281              DEFINE_INSN_AND_SPLIT, or DEFINE_PEEPHOLE automatically
1282              gets a star inserted as its first character, if it is
1283              written with a brace block instead of a string constant.  */
1284           star_if_braced = (format_ptr[i] == 'T');
1285
1286           stringbuf = read_string (infile, star_if_braced);
1287
1288           /* For insn patterns, we want to provide a default name
1289              based on the file and line, like "*foo.md:12", if the
1290              given name is blank.  These are only for define_insn and
1291              define_insn_and_split, to aid debugging.  */
1292           if (*stringbuf == '\0'
1293               && i == 0
1294               && (GET_CODE (return_rtx) == DEFINE_INSN
1295                   || GET_CODE (return_rtx) == DEFINE_INSN_AND_SPLIT))
1296             {
1297               char line_name[20];
1298               const char *fn = (read_rtx_filename ? read_rtx_filename : "rtx");
1299               const char *slash;
1300               for (slash = fn; *slash; slash ++)
1301                 if (*slash == '/' || *slash == '\\' || *slash == ':')
1302                   fn = slash + 1;
1303               obstack_1grow (&string_obstack, '*');
1304               obstack_grow (&string_obstack, fn, strlen (fn));
1305               sprintf (line_name, ":%d", read_rtx_lineno);
1306               obstack_grow (&string_obstack, line_name, strlen (line_name)+1);
1307               stringbuf = (char *) obstack_finish (&string_obstack);
1308             }
1309
1310           if (star_if_braced)
1311             XTMPL (return_rtx, i) = stringbuf;
1312           else
1313             XSTR (return_rtx, i) = stringbuf;
1314         }
1315         break;
1316
1317       case 'w':
1318         read_name (tmp_char, infile);
1319         validate_const_int (infile, tmp_char);
1320 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
1321         tmp_wide = atoi (tmp_char);
1322 #else
1323 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
1324         tmp_wide = atol (tmp_char);
1325 #else
1326         /* Prefer atoll over atoq, since the former is in the ISO C99 standard.
1327            But prefer not to use our hand-rolled function above either.  */
1328 #if defined(HAVE_ATOLL) || !defined(HAVE_ATOQ)
1329         tmp_wide = atoll (tmp_char);
1330 #else
1331         tmp_wide = atoq (tmp_char);
1332 #endif
1333 #endif
1334 #endif
1335         XWINT (return_rtx, i) = tmp_wide;
1336         break;
1337
1338       case 'i':
1339       case 'n':
1340         read_name (tmp_char, infile);
1341         validate_const_int (infile, tmp_char);
1342         tmp_int = atoi (tmp_char);
1343         XINT (return_rtx, i) = tmp_int;
1344         break;
1345
1346       default:
1347         fprintf (stderr,
1348                  "switch format wrong in rtl.read_rtx(). format was: %c.\n",
1349                  format_ptr[i]);
1350         fprintf (stderr, "\tfile position: %ld\n", ftell (infile));
1351         abort ();
1352       }
1353
1354   c = read_skip_spaces (infile);
1355   if (c != ')')
1356     fatal_expected_char (infile, ')', c);
1357
1358   return return_rtx;
1359 }