2 Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2010
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 #include "coretypes.h"
28 /* Associates PTR (which can be a string, etc.) with the file location
29 specified by FILENAME and LINENO. */
36 /* Obstack used for allocating MD strings. */
37 struct obstack string_obstack;
39 /* A table of ptr_locs, hashed on the PTR field. */
40 static htab_t ptr_locs;
42 /* An obstack for the above. Plain xmalloc is a bit heavyweight for a
43 small structure like ptr_loc. */
44 static struct obstack ptr_loc_obstack;
46 /* A hash table of triples (A, B, C), where each of A, B and C is a condition
47 and A is equivalent to "B && C". This is used to keep track of the source
48 of conditions that are made up of separate MD strings (such as the split
49 condition of a define_insn_and_split). */
50 static htab_t joined_conditions;
52 /* An obstack for allocating joined_conditions entries. */
53 static struct obstack joined_conditions_obstack;
55 /* The file we are reading. */
58 /* The filename of READ_MD_FILE. */
59 const char *read_md_filename;
61 /* The current line number in READ_MD_FILE. */
64 /* Return a hash value for the pointer pointed to by DEF. */
67 leading_ptr_hash (const void *def)
69 return htab_hash_pointer (*(const void *const *) def);
72 /* Return true if DEF1 and DEF2 are pointers to the same pointer. */
75 leading_ptr_eq_p (const void *def1, const void *def2)
77 return *(const void *const *) def1 == *(const void *const *) def2;
80 /* Associate PTR with the file position given by FILENAME and LINENO. */
83 set_md_ptr_loc (const void *ptr, const char *filename, int lineno)
87 loc = (struct ptr_loc *) obstack_alloc (&ptr_loc_obstack,
88 sizeof (struct ptr_loc));
90 loc->filename = filename;
92 *htab_find_slot (ptr_locs, loc, INSERT) = loc;
95 /* Return the position associated with pointer PTR. Return null if no
98 static const struct ptr_loc *
99 get_md_ptr_loc (const void *ptr)
101 return (const struct ptr_loc *) htab_find (ptr_locs, &ptr);
104 /* Associate NEW_PTR with the same file position as OLD_PTR. */
107 copy_md_ptr_loc (const void *new_ptr, const void *old_ptr)
109 const struct ptr_loc *loc = get_md_ptr_loc (old_ptr);
111 set_md_ptr_loc (new_ptr, loc->filename, loc->lineno);
114 /* If PTR is associated with a known file position, print a #line
118 print_md_ptr_loc (const void *ptr)
120 const struct ptr_loc *loc = get_md_ptr_loc (ptr);
122 printf ("#line %d \"%s\"\n", loc->lineno, loc->filename);
125 /* Return a condition that satisfies both COND1 and COND2. Either string
126 may be null or empty. */
129 join_c_conditions (const char *cond1, const char *cond2)
134 if (cond1 == 0 || cond1[0] == 0)
137 if (cond2 == 0 || cond2[0] == 0)
140 if (strcmp (cond1, cond2) == 0)
143 result = concat ("(", cond1, ") && (", cond2, ")", NULL);
144 obstack_ptr_grow (&joined_conditions_obstack, result);
145 obstack_ptr_grow (&joined_conditions_obstack, cond1);
146 obstack_ptr_grow (&joined_conditions_obstack, cond2);
147 entry = XOBFINISH (&joined_conditions_obstack, const void **);
148 *htab_find_slot (joined_conditions, entry, INSERT) = entry;
152 /* Print condition COND, wrapped in brackets. If COND was created by
153 join_c_conditions, recursively invoke this function for the original
154 conditions and join the result with "&&". Otherwise print a #line
155 directive for COND if its original file position is known. */
158 print_c_condition (const char *cond)
160 const char **halves = (const char **) htab_find (joined_conditions, &cond);
164 print_c_condition (halves[1]);
166 print_c_condition (halves[2]);
172 print_md_ptr_loc (cond);
173 printf ("(%s)", cond);
177 /* A printf-like function for reporting an error against line LINENO
178 in the current MD file. */
181 message_with_line (int lineno, const char *msg, ...)
187 fprintf (stderr, "%s:%d: ", read_md_filename, lineno);
188 vfprintf (stderr, msg, ap);
189 fputc ('\n', stderr);
194 /* A printf-like function for reporting an error against the current
195 position in the MD file. */
198 fatal_with_file_and_line (const char *msg, ...)
207 fprintf (stderr, "%s:%d: ", read_md_filename, read_md_lineno);
208 vfprintf (stderr, msg, ap);
211 /* Gather some following context. */
212 for (i = 0; i < sizeof (context)-1; ++i)
217 if (c == '\r' || c == '\n')
223 fprintf (stderr, "%s:%d: following context is `%s'\n",
224 read_md_filename, read_md_lineno, context);
230 /* Report that we found character ACTUAL when we expected to find
231 character EXPECTED. */
234 fatal_expected_char (int expected, int actual)
237 fatal_with_file_and_line ("expected character `%c', found EOF",
240 fatal_with_file_and_line ("expected character `%c', found `%c'",
244 /* Read chars from the MD file until a non-whitespace char and return that.
245 Comments, both Lisp style and C style, are treated as whitespace. */
248 read_skip_spaces (void)
261 case ' ': case '\t': case '\f': case '\r':
267 while (c != '\n' && c != EOF);
276 fatal_expected_char ('*', c);
279 while ((c = read_char ()) && c != EOF)
283 else if (prevc == '*' && c == '/')
296 /* Subroutine of the string readers. Handles backslash escapes.
297 Caller has read the backslash, but not placed it into the obstack. */
302 int c = read_char ();
306 /* Backslash-newline is replaced by nothing, as in C. */
311 /* \" \' \\ are replaced by the second character. */
317 /* Standard C string escapes:
320 all are passed through to the output string unmolested.
321 In normal use these wind up in a string constant processed
322 by the C compiler, which will translate them appropriately.
323 We do not bother checking that \[0-7] are followed by up to
324 two octal digits, or that \x is followed by N hex digits.
325 \? \u \U are left out because they are not in traditional C. */
326 case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':
327 case '0': case '1': case '2': case '3': case '4': case '5': case '6':
329 obstack_1grow (&string_obstack, '\\');
332 /* \; makes stuff for a C string constant containing
335 obstack_grow (&string_obstack, "\\n\\t", 4);
338 /* pass anything else through, but issue a warning. */
340 fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n",
341 read_md_filename, read_md_lineno, c);
342 obstack_1grow (&string_obstack, '\\');
346 obstack_1grow (&string_obstack, c);
349 /* Read a double-quoted string onto the obstack. Caller has scanned
350 the leading quote. */
353 read_quoted_string (void)
359 c = read_char (); /* Read the string */
367 else if (c == '"' || c == EOF)
370 obstack_1grow (&string_obstack, c);
373 obstack_1grow (&string_obstack, 0);
374 return XOBFINISH (&string_obstack, char *);
377 /* Read a braced string (a la Tcl) onto the string obstack. Caller
378 has scanned the leading brace. Note that unlike quoted strings,
379 the outermost braces _are_ included in the string constant. */
382 read_braced_string (void)
385 int brace_depth = 1; /* caller-processed */
386 unsigned long starting_read_md_lineno = read_md_lineno;
388 obstack_1grow (&string_obstack, '{');
391 c = read_char (); /* Read the string */
405 fatal_with_file_and_line
406 ("missing closing } for opening brace on line %lu",
407 starting_read_md_lineno);
409 obstack_1grow (&string_obstack, c);
412 obstack_1grow (&string_obstack, 0);
413 return XOBFINISH (&string_obstack, char *);
416 /* Read some kind of string constant. This is the high-level routine
417 used by read_rtx. It handles surrounding parentheses, leading star,
418 and dispatch to the appropriate string constant reader. */
421 read_string (int star_if_braced)
427 c = read_skip_spaces ();
431 c = read_skip_spaces ();
434 old_lineno = read_md_lineno;
436 stringbuf = read_quoted_string ();
440 obstack_1grow (&string_obstack, '*');
441 stringbuf = read_braced_string ();
444 fatal_with_file_and_line ("expected `\"' or `{', found `%c'", c);
448 c = read_skip_spaces ();
450 fatal_expected_char (')', c);
453 set_md_ptr_loc (stringbuf, read_md_filename, old_lineno);
457 /* Given a string, return the number of comma-separated elements in it.
458 Return 0 for the null string. */
461 n_comma_elts (const char *s)
475 /* Given a pointer to a (char *), return a pointer to the beginning of the
476 next comma-separated element in the string. Advance the pointer given
477 to the end of that element. Return NULL if at end of string. Caller
478 is responsible for copying the string if necessary. White space between
479 a comma and an element is ignored. */
482 scan_comma_elt (const char **pstr)
485 const char *p = *pstr;
497 while (*p != ',' && *p != '\0')
504 /* Initialize this file's static data. */
507 init_md_reader (void)
509 obstack_init (&string_obstack);
510 ptr_locs = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0);
511 obstack_init (&ptr_loc_obstack);
512 joined_conditions = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0);
513 obstack_init (&joined_conditions_obstack);