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"
29 /* Associates PTR (which can be a string, etc.) with the file location
30 specified by FILENAME and LINENO. */
37 /* Obstack used for allocating MD strings. */
38 struct obstack string_obstack
;
40 /* A table of ptr_locs, hashed on the PTR field. */
41 static htab_t ptr_locs
;
43 /* An obstack for the above. Plain xmalloc is a bit heavyweight for a
44 small structure like ptr_loc. */
45 static struct obstack ptr_loc_obstack
;
47 /* A hash table of triples (A, B, C), where each of A, B and C is a condition
48 and A is equivalent to "B && C". This is used to keep track of the source
49 of conditions that are made up of separate MD strings (such as the split
50 condition of a define_insn_and_split). */
51 static htab_t joined_conditions
;
53 /* An obstack for allocating joined_conditions entries. */
54 static struct obstack joined_conditions_obstack
;
56 /* The file we are reading. */
59 /* The filename of READ_MD_FILE. */
60 const char *read_md_filename
;
62 /* The current line number in READ_MD_FILE. */
65 /* Return a hash value for the pointer pointed to by DEF. */
68 leading_ptr_hash (const void *def
)
70 return htab_hash_pointer (*(const void *const *) def
);
73 /* Return true if DEF1 and DEF2 are pointers to the same pointer. */
76 leading_ptr_eq_p (const void *def1
, const void *def2
)
78 return *(const void *const *) def1
== *(const void *const *) def2
;
81 /* Associate PTR with the file position given by FILENAME and LINENO. */
84 set_md_ptr_loc (const void *ptr
, const char *filename
, int lineno
)
88 loc
= (struct ptr_loc
*) obstack_alloc (&ptr_loc_obstack
,
89 sizeof (struct ptr_loc
));
91 loc
->filename
= filename
;
93 *htab_find_slot (ptr_locs
, loc
, INSERT
) = loc
;
96 /* Return the position associated with pointer PTR. Return null if no
99 static const struct ptr_loc
*
100 get_md_ptr_loc (const void *ptr
)
102 return (const struct ptr_loc
*) htab_find (ptr_locs
, &ptr
);
105 /* Associate NEW_PTR with the same file position as OLD_PTR. */
108 copy_md_ptr_loc (const void *new_ptr
, const void *old_ptr
)
110 const struct ptr_loc
*loc
= get_md_ptr_loc (old_ptr
);
112 set_md_ptr_loc (new_ptr
, loc
->filename
, loc
->lineno
);
115 /* If PTR is associated with a known file position, print a #line
119 print_md_ptr_loc (const void *ptr
)
121 const struct ptr_loc
*loc
= get_md_ptr_loc (ptr
);
123 printf ("#line %d \"%s\"\n", loc
->lineno
, loc
->filename
);
126 /* Return a condition that satisfies both COND1 and COND2. Either string
127 may be null or empty. */
130 join_c_conditions (const char *cond1
, const char *cond2
)
135 if (cond1
== 0 || cond1
[0] == 0)
138 if (cond2
== 0 || cond2
[0] == 0)
141 if (strcmp (cond1
, cond2
) == 0)
144 result
= concat ("(", cond1
, ") && (", cond2
, ")", NULL
);
145 obstack_ptr_grow (&joined_conditions_obstack
, result
);
146 obstack_ptr_grow (&joined_conditions_obstack
, cond1
);
147 obstack_ptr_grow (&joined_conditions_obstack
, cond2
);
148 entry
= XOBFINISH (&joined_conditions_obstack
, const void **);
149 *htab_find_slot (joined_conditions
, entry
, INSERT
) = entry
;
153 /* Print condition COND, wrapped in brackets. If COND was created by
154 join_c_conditions, recursively invoke this function for the original
155 conditions and join the result with "&&". Otherwise print a #line
156 directive for COND if its original file position is known. */
159 print_c_condition (const char *cond
)
161 const char **halves
= (const char **) htab_find (joined_conditions
, &cond
);
165 print_c_condition (halves
[1]);
167 print_c_condition (halves
[2]);
173 print_md_ptr_loc (cond
);
174 printf ("(%s)", cond
);
178 /* A vfprintf-like function for reporting an error against line LINENO
179 of the current MD file. */
181 static void ATTRIBUTE_PRINTF(2,0)
182 message_with_line_1 (int lineno
, const char *msg
, va_list ap
)
184 fprintf (stderr
, "%s:%d: ", read_md_filename
, lineno
);
185 vfprintf (stderr
, msg
, ap
);
186 fputc ('\n', stderr
);
189 /* A printf-like function for reporting an error against line LINENO
190 in the current MD file. */
193 message_with_line (int lineno
, const char *msg
, ...)
198 message_with_line_1 (lineno
, msg
, ap
);
202 /* Like message_with_line, but treat the condition as an error. */
205 error_with_line (int lineno
, const char *msg
, ...)
210 message_with_line_1 (lineno
, msg
, ap
);
215 /* A printf-like function for reporting an error against the current
216 position in the MD file. */
219 fatal_with_file_and_line (const char *msg
, ...)
228 fprintf (stderr
, "%s:%d: ", read_md_filename
, read_md_lineno
);
229 vfprintf (stderr
, msg
, ap
);
232 /* Gather some following context. */
233 for (i
= 0; i
< sizeof (context
)-1; ++i
)
238 if (c
== '\r' || c
== '\n')
244 fprintf (stderr
, "%s:%d: following context is `%s'\n",
245 read_md_filename
, read_md_lineno
, context
);
251 /* Report that we found character ACTUAL when we expected to find
252 character EXPECTED. */
255 fatal_expected_char (int expected
, int actual
)
258 fatal_with_file_and_line ("expected character `%c', found EOF",
261 fatal_with_file_and_line ("expected character `%c', found `%c'",
265 /* Read chars from the MD file until a non-whitespace char and return that.
266 Comments, both Lisp style and C style, are treated as whitespace. */
269 read_skip_spaces (void)
282 case ' ': case '\t': case '\f': case '\r':
288 while (c
!= '\n' && c
!= EOF
);
297 fatal_expected_char ('*', c
);
300 while ((c
= read_char ()) && c
!= EOF
)
304 else if (prevc
== '*' && c
== '/')
317 /* Subroutine of the string readers. Handles backslash escapes.
318 Caller has read the backslash, but not placed it into the obstack. */
323 int c
= read_char ();
327 /* Backslash-newline is replaced by nothing, as in C. */
332 /* \" \' \\ are replaced by the second character. */
338 /* Standard C string escapes:
341 all are passed through to the output string unmolested.
342 In normal use these wind up in a string constant processed
343 by the C compiler, which will translate them appropriately.
344 We do not bother checking that \[0-7] are followed by up to
345 two octal digits, or that \x is followed by N hex digits.
346 \? \u \U are left out because they are not in traditional C. */
347 case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':
348 case '0': case '1': case '2': case '3': case '4': case '5': case '6':
350 obstack_1grow (&string_obstack
, '\\');
353 /* \; makes stuff for a C string constant containing
356 obstack_grow (&string_obstack
, "\\n\\t", 4);
359 /* pass anything else through, but issue a warning. */
361 fprintf (stderr
, "%s:%d: warning: unrecognized escape \\%c\n",
362 read_md_filename
, read_md_lineno
, c
);
363 obstack_1grow (&string_obstack
, '\\');
367 obstack_1grow (&string_obstack
, c
);
370 /* Read a double-quoted string onto the obstack. Caller has scanned
371 the leading quote. */
374 read_quoted_string (void)
380 c
= read_char (); /* Read the string */
388 else if (c
== '"' || c
== EOF
)
391 obstack_1grow (&string_obstack
, c
);
394 obstack_1grow (&string_obstack
, 0);
395 return XOBFINISH (&string_obstack
, char *);
398 /* Read a braced string (a la Tcl) onto the string obstack. Caller
399 has scanned the leading brace. Note that unlike quoted strings,
400 the outermost braces _are_ included in the string constant. */
403 read_braced_string (void)
406 int brace_depth
= 1; /* caller-processed */
407 unsigned long starting_read_md_lineno
= read_md_lineno
;
409 obstack_1grow (&string_obstack
, '{');
412 c
= read_char (); /* Read the string */
426 fatal_with_file_and_line
427 ("missing closing } for opening brace on line %lu",
428 starting_read_md_lineno
);
430 obstack_1grow (&string_obstack
, c
);
433 obstack_1grow (&string_obstack
, 0);
434 return XOBFINISH (&string_obstack
, char *);
437 /* Read some kind of string constant. This is the high-level routine
438 used by read_rtx. It handles surrounding parentheses, leading star,
439 and dispatch to the appropriate string constant reader. */
442 read_string (int star_if_braced
)
448 c
= read_skip_spaces ();
452 c
= read_skip_spaces ();
455 old_lineno
= read_md_lineno
;
457 stringbuf
= read_quoted_string ();
461 obstack_1grow (&string_obstack
, '*');
462 stringbuf
= read_braced_string ();
465 fatal_with_file_and_line ("expected `\"' or `{', found `%c'", c
);
469 c
= read_skip_spaces ();
471 fatal_expected_char (')', c
);
474 set_md_ptr_loc (stringbuf
, read_md_filename
, old_lineno
);
478 /* Given a string, return the number of comma-separated elements in it.
479 Return 0 for the null string. */
482 n_comma_elts (const char *s
)
496 /* Given a pointer to a (char *), return a pointer to the beginning of the
497 next comma-separated element in the string. Advance the pointer given
498 to the end of that element. Return NULL if at end of string. Caller
499 is responsible for copying the string if necessary. White space between
500 a comma and an element is ignored. */
503 scan_comma_elt (const char **pstr
)
506 const char *p
= *pstr
;
518 while (*p
!= ',' && *p
!= '\0')
525 /* Initialize this file's static data. */
528 init_md_reader (void)
530 obstack_init (&string_obstack
);
531 ptr_locs
= htab_create (161, leading_ptr_hash
, leading_ptr_eq_p
, 0);
532 obstack_init (&ptr_loc_obstack
);
533 joined_conditions
= htab_create (161, leading_ptr_hash
, leading_ptr_eq_p
, 0);
534 obstack_init (&joined_conditions_obstack
);