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 current line number for the file. */
56 int read_md_lineno = 1;
58 /* The filename for error reporting. */
59 const char *read_md_filename = "<unknown>";
61 /* Return a hash value for the pointer pointed to by DEF. */
64 leading_ptr_hash (const void *def)
66 return htab_hash_pointer (*(const void *const *) def);
69 /* Return true if DEF1 and DEF2 are pointers to the same pointer. */
72 leading_ptr_eq_p (const void *def1, const void *def2)
74 return *(const void *const *) def1 == *(const void *const *) def2;
77 /* Associate PTR with the file position given by FILENAME and LINENO. */
80 set_md_ptr_loc (const void *ptr, const char *filename, int lineno)
84 loc = (struct ptr_loc *) obstack_alloc (&ptr_loc_obstack,
85 sizeof (struct ptr_loc));
87 loc->filename = filename;
89 *htab_find_slot (ptr_locs, loc, INSERT) = loc;
92 /* Return the position associated with pointer PTR. Return null if no
95 static const struct ptr_loc *
96 get_md_ptr_loc (const void *ptr)
98 return (const struct ptr_loc *) htab_find (ptr_locs, &ptr);
101 /* Associate NEW_PTR with the same file position as OLD_PTR. */
104 copy_md_ptr_loc (const void *new_ptr, const void *old_ptr)
106 const struct ptr_loc *loc = get_md_ptr_loc (old_ptr);
108 set_md_ptr_loc (new_ptr, loc->filename, loc->lineno);
111 /* If PTR is associated with a known file position, print a #line
115 print_md_ptr_loc (const void *ptr)
117 const struct ptr_loc *loc = get_md_ptr_loc (ptr);
119 printf ("#line %d \"%s\"\n", loc->lineno, loc->filename);
122 /* Return a condition that satisfies both COND1 and COND2. Either string
123 may be null or empty. */
126 join_c_conditions (const char *cond1, const char *cond2)
131 if (cond1 == 0 || cond1[0] == 0)
134 if (cond2 == 0 || cond2[0] == 0)
137 if (strcmp (cond1, cond2) == 0)
140 result = concat ("(", cond1, ") && (", cond2, ")", NULL);
141 obstack_ptr_grow (&joined_conditions_obstack, result);
142 obstack_ptr_grow (&joined_conditions_obstack, cond1);
143 obstack_ptr_grow (&joined_conditions_obstack, cond2);
144 entry = XOBFINISH (&joined_conditions_obstack, const void **);
145 *htab_find_slot (joined_conditions, entry, INSERT) = entry;
149 /* Print condition COND, wrapped in brackets. If COND was created by
150 join_c_conditions, recursively invoke this function for the original
151 conditions and join the result with "&&". Otherwise print a #line
152 directive for COND if its original file position is known. */
155 print_c_condition (const char *cond)
157 const char **halves = (const char **) htab_find (joined_conditions, &cond);
161 print_c_condition (halves[1]);
163 print_c_condition (halves[2]);
169 print_md_ptr_loc (cond);
170 printf ("(%s)", cond);
174 /* A printf-like function for reporting an error against line LINENO
175 in the current MD file. */
178 message_with_line (int lineno, const char *msg, ...)
184 fprintf (stderr, "%s:%d: ", read_md_filename, lineno);
185 vfprintf (stderr, msg, ap);
186 fputc ('\n', stderr);
191 /* A printf-like function for reporting an error against the current
192 position in the MD file, which is associated with INFILE. */
195 fatal_with_file_and_line (FILE *infile, const char *msg, ...)
204 fprintf (stderr, "%s:%d: ", read_md_filename, read_md_lineno);
205 vfprintf (stderr, msg, ap);
208 /* Gather some following context. */
209 for (i = 0; i < sizeof (context)-1; ++i)
214 if (c == '\r' || c == '\n')
220 fprintf (stderr, "%s:%d: following context is `%s'\n",
221 read_md_filename, read_md_lineno, context);
227 /* Report that we found character ACTUAL when we expected to find
228 character EXPECTED. INFILE is the file handle associated
229 with the current file. */
232 fatal_expected_char (FILE *infile, int expected, int actual)
235 fatal_with_file_and_line (infile, "expected character `%c', found EOF",
238 fatal_with_file_and_line (infile, "expected character `%c', found `%c'",
242 /* Read chars from INFILE until a non-whitespace char and return that.
243 Comments, both Lisp style and C style, are treated as whitespace. */
246 read_skip_spaces (FILE *infile)
259 case ' ': case '\t': case '\f': case '\r':
265 while (c != '\n' && c != EOF);
274 fatal_expected_char (infile, '*', c);
277 while ((c = getc (infile)) && c != EOF)
281 else if (prevc == '*' && c == '/')
294 /* Subroutine of the string readers. Handles backslash escapes.
295 Caller has read the backslash, but not placed it into the obstack. */
298 read_escape (FILE *infile)
300 int c = getc (infile);
304 /* Backslash-newline is replaced by nothing, as in C. */
309 /* \" \' \\ are replaced by the second character. */
315 /* Standard C string escapes:
318 all are passed through to the output string unmolested.
319 In normal use these wind up in a string constant processed
320 by the C compiler, which will translate them appropriately.
321 We do not bother checking that \[0-7] are followed by up to
322 two octal digits, or that \x is followed by N hex digits.
323 \? \u \U are left out because they are not in traditional C. */
324 case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':
325 case '0': case '1': case '2': case '3': case '4': case '5': case '6':
327 obstack_1grow (&string_obstack, '\\');
330 /* \; makes stuff for a C string constant containing
333 obstack_grow (&string_obstack, "\\n\\t", 4);
336 /* pass anything else through, but issue a warning. */
338 fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n",
339 read_md_filename, read_md_lineno, c);
340 obstack_1grow (&string_obstack, '\\');
344 obstack_1grow (&string_obstack, c);
347 /* Read a double-quoted string onto the obstack. Caller has scanned
348 the leading quote. */
351 read_quoted_string (FILE *infile)
357 c = getc (infile); /* Read the string */
362 read_escape (infile);
365 else if (c == '"' || c == EOF)
368 obstack_1grow (&string_obstack, c);
371 obstack_1grow (&string_obstack, 0);
372 return XOBFINISH (&string_obstack, char *);
375 /* Read a braced string (a la Tcl) onto the string obstack. Caller
376 has scanned the leading brace. Note that unlike quoted strings,
377 the outermost braces _are_ included in the string constant. */
380 read_braced_string (FILE *infile)
383 int brace_depth = 1; /* caller-processed */
384 unsigned long starting_read_md_lineno = read_md_lineno;
386 obstack_1grow (&string_obstack, '{');
389 c = getc (infile); /* Read the string */
399 read_escape (infile);
403 fatal_with_file_and_line
404 (infile, "missing closing } for opening brace on line %lu",
405 starting_read_md_lineno);
407 obstack_1grow (&string_obstack, c);
410 obstack_1grow (&string_obstack, 0);
411 return XOBFINISH (&string_obstack, char *);
414 /* Read some kind of string constant. This is the high-level routine
415 used by read_rtx. It handles surrounding parentheses, leading star,
416 and dispatch to the appropriate string constant reader. */
419 read_string (FILE *infile, int star_if_braced)
425 c = read_skip_spaces (infile);
429 c = read_skip_spaces (infile);
432 old_lineno = read_md_lineno;
434 stringbuf = read_quoted_string (infile);
438 obstack_1grow (&string_obstack, '*');
439 stringbuf = read_braced_string (infile);
442 fatal_with_file_and_line (infile, "expected `\"' or `{', found `%c'", c);
446 c = read_skip_spaces (infile);
448 fatal_expected_char (infile, ')', c);
451 set_md_ptr_loc (stringbuf, read_md_filename, old_lineno);
455 /* Given a string, return the number of comma-separated elements in it.
456 Return 0 for the null string. */
459 n_comma_elts (const char *s)
473 /* Given a pointer to a (char *), return a pointer to the beginning of the
474 next comma-separated element in the string. Advance the pointer given
475 to the end of that element. Return NULL if at end of string. Caller
476 is responsible for copying the string if necessary. White space between
477 a comma and an element is ignored. */
480 scan_comma_elt (const char **pstr)
483 const char *p = *pstr;
495 while (*p != ',' && *p != '\0')
502 /* Initialize this file's static data. */
505 init_md_reader (void)
507 obstack_init (&string_obstack);
508 ptr_locs = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0);
509 obstack_init (&ptr_loc_obstack);
510 joined_conditions = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0);
511 obstack_init (&joined_conditions_obstack);