2 Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
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
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
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/>. */
24 /* Disable rtl checking; it conflicts with the iterator handling. */
25 #undef ENABLE_RTL_CHECKING
28 #include "coretypes.h"
33 #include "gensupport.h"
35 static htab_t md_constants
;
37 /* One element in a singly-linked list of (integer, string) pairs. */
39 struct map_value
*next
;
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. */
48 /* The name of the iterator or attribute. */
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. */
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). */
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. */
90 /* A structure used to pass data from read_rtx to apply_iterator_traverse
92 struct iterator_traverse_data
{
93 /* Instruction queue. */
95 /* Attributes seen for modes. */
96 struct map_value
*mode_maps
;
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
**,
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>";
183 fatal_with_file_and_line (FILE *infile
, const char *msg
, ...)
192 fprintf (stderr
, "%s:%d: ", read_rtx_filename
, read_rtx_lineno
);
193 vfprintf (stderr
, msg
, ap
);
196 /* Gather some following context. */
197 for (i
= 0; i
< sizeof (context
)-1; ++i
)
202 if (c
== '\r' || c
== '\n')
208 fprintf (stderr
, "%s:%d: following context is `%s'\n",
209 read_rtx_filename
, read_rtx_lineno
, context
);
215 /* Dump code after printing a message. Used when read_rtx finds
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. */
228 find_mode (const char *name
, FILE *infile
)
232 for (i
= 0; i
< NUM_MACHINE_MODES
; i
++)
233 if (strcmp (GET_MODE_NAME (i
), name
) == 0)
236 fatal_with_file_and_line (infile
, "unknown mode `%s'", name
);
240 uses_mode_iterator_p (rtx x
, int mode
)
242 return (int) GET_MODE (x
) == mode
;
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. */
254 find_code (const char *name
, FILE *infile
)
258 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
259 if (strcmp (GET_RTX_NAME (i
), name
) == 0)
262 fatal_with_file_and_line (infile
, "unknown rtx code `%s'", name
);
266 uses_code_iterator_p (rtx x
, int code
)
268 return (int) GET_CODE (x
) == code
;
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
)
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
, ':');
294 if (strncmp (p
, iterator
->name
, attr
- p
) != 0
295 || iterator
->name
[attr
- p
] != 0)
300 /* Find the attribute specification. */
301 m
= (struct mapping
*) htab_find (iterator
->group
->attrs
, &attr
);
305 /* Find the attribute value for VALUE. */
306 for (v
= m
->values
; v
!= 0; v
= v
->next
)
307 if (v
->number
== value
)
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. */
318 mode_attr_index (struct map_value
**mode_maps
, const char *string
)
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;
331 mv
->next
= *mode_maps
;
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
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. */
348 apply_mode_maps (rtx x
, struct map_value
*mode_maps
, struct mapping
*iterator
,
349 int value
, FILE *infile
, const char **unknown
)
353 struct map_value
*pm
;
355 offset
= MAX_MACHINE_MODE
+ htab_elements (modes
.iterators
);
356 if (GET_MODE (x
) < offset
)
359 indx
= GET_MODE (x
) - offset
;
360 for (pm
= mode_maps
; pm
; pm
= pm
->next
)
362 if (pm
->number
== indx
)
366 v
= map_attr_string (pm
->string
, iterator
, value
);
368 PUT_MODE (x
, (enum machine_mode
) find_mode (v
->string
, infile
));
370 *unknown
= pm
->string
;
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. */
381 apply_iterator_to_string (const char *string
, struct mapping
*iterator
, int value
)
383 char *base
, *copy
, *p
, *start
, *end
;
389 base
= p
= copy
= ASTRDUP (string
);
390 while ((start
= strchr (p
, '<')) && (end
= strchr (start
, '>')))
395 v
= map_attr_string (p
, iterator
, value
);
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
));
408 obstack_grow (&string_obstack
, base
, strlen (base
) + 1);
409 copy
= XOBFINISH (&string_obstack
, char *);
410 copy_rtx_ptr_loc (copy
, 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. */
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
;
431 enum rtx_code bellwether_code
;
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
);
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
])
455 XTMPL (x
, i
) = apply_iterator_to_string (XTMPL (x
, i
), iterator
, value
);
460 XSTR (x
, i
) = apply_iterator_to_string (XSTR (x
, i
), iterator
, value
);
464 XEXP (x
, i
) = apply_iterator_to_rtx (XEXP (x
, i
), iterator
, value
,
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
,
488 /* Return true if X (or some subexpression of X) uses iterator ITERATOR. */
491 uses_iterator_p (rtx x
, struct mapping
*iterator
)
493 struct iterator_group
*group
;
494 const char *format_ptr
;
500 group
= iterator
->group
;
501 if (group
->uses_iterator_p (x
, iterator
->index
+ group
->num_builtins
))
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
])
509 if (uses_iterator_p (XEXP (x
, i
), iterator
))
516 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
517 if (uses_iterator_p (XVECEXP (x
, i
, j
), iterator
))
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". */
532 add_condition_to_string (const char *original
, const char *extra
)
534 if (original
!= 0 && original
[0] == '&' && original
[1] == '&')
536 return join_c_conditions (original
, extra
);
539 /* Like add_condition, but applied to all conditions in rtx X. */
542 add_condition_to_rtx (rtx x
, const char *extra
)
544 switch (GET_CODE (x
))
548 XSTR (x
, 2) = add_condition_to_string (XSTR (x
, 2), extra
);
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
);
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
);
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. */
573 apply_iterator_traverse (void **slot
, void *data
)
575 struct iterator_traverse_data
*mtd
= (struct iterator_traverse_data
*) data
;
576 struct mapping
*iterator
;
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
;
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
)
625 m
= XNEW (struct mapping
);
626 m
->name
= xstrdup (name
);
628 m
->index
= htab_elements (table
);
631 slot
= htab_find_slot (table
, m
, INSERT
);
633 fatal_with_file_and_line (infile
, "`%s' already defined", name
);
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
);
650 value
->number
= number
;
651 value
->string
= string
;
657 /* Do one-time initialization of the mode and code attributes. */
660 initialize_iterators (void)
662 struct mapping
*lower
, *upper
;
663 struct map_value
**lower_ptr
, **upper_ptr
;
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
++)
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
++)
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. */
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. */
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. */
729 set_rtx_ptr_loc (const void *ptr
, const char *filename
, int lineno
)
733 loc
= (struct ptr_loc
*) obstack_alloc (&ptr_loc_obstack
,
734 sizeof (struct ptr_loc
));
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
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. */
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
);
757 set_rtx_ptr_loc (new_ptr
, loc
->filename
, loc
->lineno
);
760 /* If PTR is associated with a known file position, print a #line
764 print_rtx_ptr_loc (const void *ptr
)
766 const struct ptr_loc
*loc
= get_rtx_ptr_loc (ptr
);
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. */
775 join_c_conditions (const char *cond1
, const char *cond2
)
780 if (cond1
== 0 || cond1
[0] == 0)
783 if (cond2
== 0 || cond2
[0] == 0)
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
;
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. */
801 print_c_condition (const char *cond
)
803 const char **halves
= (const char **) htab_find (joined_conditions
, &cond
);
807 print_c_condition (halves
[1]);
809 print_c_condition (halves
[2]);
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
)
839 case ' ': case '\t': case '\f': case '\r':
845 while (c
!= '\n' && c
!= EOF
);
854 fatal_expected_char (infile
, '*', c
);
857 while ((c
= getc (infile
)) && c
!= EOF
)
861 else if (prevc
== '*' && 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. */
878 read_name (char *str
, FILE *infile
)
883 c
= read_skip_spaces (infile
);
888 if (c
== ' ' || c
== '\n' || c
== '\t' || c
== '\f' || c
== '\r' || c
== EOF
)
890 if (c
== ':' || c
== ')' || c
== ']' || c
== '"' || c
== '/'
891 || c
== '(' || c
== '[')
900 fatal_with_file_and_line (infile
, "missing name or number");
908 /* Do constant expansion. */
909 struct md_constant
*def
;
914 struct md_constant tmp_def
;
917 def
= (struct md_constant
*) htab_find (md_constants
, &tmp_def
);
926 /* Subroutine of the string readers. Handles backslash escapes.
927 Caller has read the backslash, but not placed it into the obstack. */
929 read_escape (FILE *infile
)
931 int c
= getc (infile
);
935 /* Backslash-newline is replaced by nothing, as in C. */
940 /* \" \' \\ are replaced by the second character. */
946 /* Standard C string escapes:
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':
958 obstack_1grow (&string_obstack
, '\\');
961 /* \; makes stuff for a C string constant containing
964 obstack_grow (&string_obstack
, "\\n\\t", 4);
967 /* pass anything else through, but issue a warning. */
969 fprintf (stderr
, "%s:%d: warning: unrecognized escape \\%c\n",
970 read_rtx_filename
, read_rtx_lineno
, c
);
971 obstack_1grow (&string_obstack
, '\\');
975 obstack_1grow (&string_obstack
, c
);
979 /* Read a double-quoted string onto the obstack. Caller has scanned
980 the leading quote. */
982 read_quoted_string (FILE *infile
)
988 c
= getc (infile
); /* Read the string */
993 read_escape (infile
);
996 else if (c
== '"' || c
== EOF
)
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. */
1010 read_braced_string (FILE *infile
)
1013 int brace_depth
= 1; /* caller-processed */
1014 unsigned long starting_read_rtx_lineno
= read_rtx_lineno
;
1016 obstack_1grow (&string_obstack
, '{');
1019 c
= getc (infile
); /* Read the string */
1029 read_escape (infile
);
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. */
1049 read_string (FILE *infile
, int star_if_braced
)
1055 c
= read_skip_spaces (infile
);
1059 c
= read_skip_spaces (infile
);
1062 old_lineno
= read_rtx_lineno
;
1064 stringbuf
= read_quoted_string (infile
);
1068 obstack_1grow (&string_obstack
, '*');
1069 stringbuf
= read_braced_string (infile
);
1072 fatal_with_file_and_line (infile
, "expected `\"' or `{', found `%c'", c
);
1076 c
= read_skip_spaces (infile
);
1078 fatal_expected_char (infile
, ')', c
);
1081 set_rtx_ptr_loc (stringbuf
, read_rtx_filename
, old_lineno
);
1085 /* Provide a version of a function to read a long long if the system does
1087 #if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_LONG && !defined(HAVE_ATOLL) && !defined(HAVE_ATOQ)
1088 HOST_WIDE_INT
atoll (const char *);
1091 atoll (const char *p
)
1094 HOST_WIDE_INT tmp_wide
;
1096 while (ISSPACE (*p
))
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;
1113 tmp_wide
= new_wide
;
1118 tmp_wide
= -tmp_wide
;
1123 /* Given an object that starts with a char * name field, return a hash
1124 code for its name. */
1126 def_hash (const void *def
)
1129 const char *string
= *(const char *const *) def
;
1131 for (result
= i
= 0; *string
++ != '\0'; i
++)
1132 result
+= ((unsigned char) *string
<< (i
% CHAR_BIT
));
1136 /* Given two objects that start with char * name fields, return true if
1137 they have the same name. */
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". */
1149 read_constants (FILE *infile
, char *tmp_char
)
1154 c
= read_skip_spaces (infile
);
1156 fatal_expected_char (infile
, '[', c
);
1157 defs
= md_constants
;
1159 defs
= htab_create (32, def_hash
, def_name_eq_p
, (htab_del
) 0);
1160 /* Disable constant expansion during definition processing. */
1162 while ( (c
= read_skip_spaces (infile
)) != ']')
1164 struct md_constant
*def
;
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
);
1174 def
->name
= xstrdup (tmp_char
);
1175 c
= read_skip_spaces (infile
);
1177 read_name (tmp_char
, infile
);
1180 def
->value
= xstrdup (tmp_char
);
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
);
1193 fatal_expected_char (infile
, ')', c
);
1195 md_constants
= defs
;
1196 c
= read_skip_spaces (infile
);
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. */
1205 traverse_md_constants (htab_trav callback
, void *info
)
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 [
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. */
1227 read_conditions (FILE *infile
, char *tmp_char
)
1231 c
= read_skip_spaces (infile
);
1233 fatal_expected_char (infile
, '[', c
);
1235 while ( (c
= read_skip_spaces (infile
)) != ']')
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
);
1249 fatal_expected_char (infile
, '"', c
);
1250 expr
= read_quoted_string (infile
);
1252 c
= read_skip_spaces (infile
);
1254 fatal_expected_char (infile
, ')', c
);
1256 add_c_test (expr
, value
);
1258 c
= read_skip_spaces (infile
);
1260 fatal_expected_char (infile
, ')', c
);
1264 validate_const_int (FILE *infile
, const char *string
)
1270 while (*cp
&& ISSPACE (*cp
))
1272 if (*cp
== '-' || *cp
== '+')
1277 if (! ISDIGIT (*cp
))
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. */
1287 find_iterator (struct iterator_group
*group
, const char *name
, FILE *infile
)
1291 m
= (struct mapping
*) htab_find (group
->iterators
, &name
);
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
)
1312 struct map_value
**end_ptr
;
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
);
1322 fatal_expected_char (infile
, '[', c
);
1324 /* Read each value. */
1325 end_ptr
= &m
->values
;
1326 c
= read_skip_spaces (infile
);
1331 /* A bare symbol name that is implicitly paired to an
1334 read_name (tmp_char
, infile
);
1339 /* A "(name string)" pair. */
1340 read_name (tmp_char
, infile
);
1341 string
= read_string (infile
, false);
1342 c
= read_skip_spaces (infile
);
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
);
1352 c
= read_skip_spaces (infile
);
1354 fatal_expected_char (infile
, ')', c
);
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. */
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. */
1388 read_rtx (FILE *infile
, rtx
*x
, int *lineno
)
1390 static rtx queue_head
, queue_next
;
1391 static int queue_lineno
;
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
;
1413 c
= read_skip_spaces (infile
);
1418 queue_lineno
= read_rtx_lineno
;
1420 from_file
= read_rtx_1 (infile
, &mode_maps
);
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);
1449 /* Subroutine of read_rtx that reads one construct from INFILE but
1450 doesn't apply any iterators. */
1453 read_rtx_1 (FILE *infile
, struct map_value
**mode_maps
)
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. */
1465 HOST_WIDE_INT tmp_wide
;
1467 /* Linked list structure for making RTXs: */
1470 struct rtx_list
*next
;
1471 rtx value
; /* Value of this node. */
1475 c
= read_skip_spaces (infile
); /* Should be open paren. */
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
);
1489 fatal_expected_char (infile
, ')', c
);
1492 if (strcmp (tmp_char
, "define_constants") == 0)
1494 read_constants (infile
, tmp_char
);
1497 if (strcmp (tmp_char
, "define_conditions") == 0)
1499 read_conditions (infile
, tmp_char
);
1502 if (strcmp (tmp_char
, "define_mode_attr") == 0)
1504 read_mapping (&modes
, modes
.attrs
, infile
);
1507 if (strcmp (tmp_char
, "define_mode_iterator") == 0)
1509 read_mapping (&modes
, modes
.iterators
, infile
);
1512 if (strcmp (tmp_char
, "define_code_attr") == 0)
1514 read_mapping (&codes
, codes
.attrs
, infile
);
1517 if (strcmp (tmp_char
, "define_code_iterator") == 0)
1519 check_code_iterator (read_mapping (&codes
, codes
.iterators
, infile
),
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
);
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
);
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");
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. */
1561 XEXP (return_rtx
, i
) = read_rtx_1 (infile
, mode_maps
);
1565 /* 'V' is an optional vector: if a closeparen follows,
1566 just store NULL for this element. */
1567 c
= read_skip_spaces (infile
);
1571 XVEC (return_rtx
, i
) = 0;
1574 /* Now process the vector. */
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
);
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
!= ']')
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 */
1617 c
= read_skip_spaces (infile
);
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
: "");
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'
1642 && (GET_CODE (return_rtx
) == DEFINE_INSN
1643 || GET_CODE (return_rtx
) == DEFINE_INSN_AND_SPLIT
))
1646 const char *fn
= (read_rtx_filename
? read_rtx_filename
: "rtx");
1648 for (slash
= fn
; *slash
; slash
++)
1649 if (*slash
== '/' || *slash
== '\\' || *slash
== ':')
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 *);
1659 XTMPL (return_rtx
, i
) = stringbuf
;
1661 XSTR (return_rtx
, i
) = stringbuf
;
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
);
1671 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
1672 tmp_wide
= atol (tmp_char
);
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
);
1679 tmp_wide
= atoq (tmp_char
);
1683 XWINT (return_rtx
, i
) = tmp_wide
;
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
;
1698 c
= read_skip_spaces (infile
);
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
);
1707 fatal_expected_char (infile
, ')', c
);
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. */
1720 read_rtx_variadic (FILE *infile
, struct map_value
**mode_maps
, rtx form
)
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
);
1737 c
= read_skip_spaces (infile
);
1742 fatal_expected_char (infile
, ')', c
);