Mercurial > hg > CbC > CbC_gcc
comparison gcc/read-md.h @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | 561a7518be6b |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* MD reader definitions. | 1 /* MD reader definitions. |
2 Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | 2 Copyright (C) 1987-2017 Free Software Foundation, Inc. |
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 | |
4 Free Software Foundation, Inc. | |
5 | 3 |
6 This file is part of GCC. | 4 This file is part of GCC. |
7 | 5 |
8 GCC is free software; you can redistribute it and/or modify it under | 6 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 | 7 the terms of the GNU General Public License as published by the Free |
17 | 15 |
18 You should have received a copy of the GNU General Public License | 16 You should have received a copy of the GNU General Public License |
19 along with GCC; see the file COPYING3. If not see | 17 along with GCC; see the file COPYING3. If not see |
20 <http://www.gnu.org/licenses/>. */ | 18 <http://www.gnu.org/licenses/>. */ |
21 | 19 |
20 #ifndef GCC_READ_MD_H | |
21 #define GCC_READ_MD_H | |
22 | |
22 #include "obstack.h" | 23 #include "obstack.h" |
23 #include "hashtab.h" | 24 |
25 /* Records a position in the file. */ | |
26 struct file_location { | |
27 file_location () {} | |
28 file_location (const char *, int, int); | |
29 | |
30 const char *filename; | |
31 int lineno; | |
32 int colno; | |
33 }; | |
34 | |
35 inline file_location::file_location (const char *filename_in, int lineno_in, int colno_in) | |
36 : filename (filename_in), lineno (lineno_in), colno (colno_in) {} | |
24 | 37 |
25 /* Holds one symbol or number in the .md file. */ | 38 /* Holds one symbol or number in the .md file. */ |
26 struct md_name { | 39 struct md_name { |
27 /* The name as it appeared in the .md file. Names are syntactically | 40 /* The name as it appeared in the .md file. Names are syntactically |
28 limited to the length of this buffer. */ | 41 limited to the length of this buffer. */ |
76 | 89 |
77 /* The number of enumeration values. */ | 90 /* The number of enumeration values. */ |
78 unsigned int num_values; | 91 unsigned int num_values; |
79 }; | 92 }; |
80 | 93 |
81 /* A callback that handles a single .md-file directive, up to but not | 94 /* A class for reading .md files and RTL dump files. |
82 including the closing ')'. It takes two arguments: the line number on | 95 |
83 which the directive started, and the name of the directive. The next | 96 Implemented in read-md.c. |
84 unread character is the optional space after the directive name. */ | 97 |
85 typedef void (*directive_handler_t) (int, const char *); | 98 This class has responsibility for reading chars from input files, and |
86 | 99 for certain common top-level directives including the "include" |
87 extern const char *in_fname; | 100 directive. |
88 extern FILE *read_md_file; | 101 |
89 extern int read_md_lineno; | 102 It does not handle parsing the hierarchically-nested expressions of |
90 extern const char *read_md_filename; | 103 rtl.def; for that see the rtx_reader subclass below (implemented in |
91 extern struct obstack string_obstack; | 104 read-rtl.c). */ |
105 | |
106 class md_reader | |
107 { | |
108 public: | |
109 md_reader (bool compact); | |
110 virtual ~md_reader (); | |
111 | |
112 bool read_md_files (int, const char **, bool (*) (const char *)); | |
113 bool read_file (const char *filename); | |
114 bool read_file_fragment (const char *filename, | |
115 int first_line, | |
116 int last_line); | |
117 | |
118 /* A hook that handles a single .md-file directive, up to but not | |
119 including the closing ')'. It takes two arguments: the file position | |
120 at which the directive started, and the name of the directive. The next | |
121 unread character is the optional space after the directive name. */ | |
122 virtual void handle_unknown_directive (file_location, const char *) = 0; | |
123 | |
124 file_location get_current_location () const; | |
125 | |
126 bool is_compact () const { return m_compact; } | |
127 | |
128 /* Defined in read-md.c. */ | |
129 int read_char (void); | |
130 void unread_char (int ch); | |
131 file_location read_name (struct md_name *name); | |
132 file_location read_name_or_nil (struct md_name *); | |
133 void read_escape (); | |
134 char *read_quoted_string (); | |
135 char *read_braced_string (); | |
136 char *read_string (int star_if_braced); | |
137 void read_skip_construct (int depth, file_location loc); | |
138 void require_char (char expected); | |
139 void require_char_ws (char expected); | |
140 void require_word_ws (const char *expected); | |
141 int peek_char (void); | |
142 | |
143 void set_md_ptr_loc (const void *ptr, const char *filename, int lineno); | |
144 const struct ptr_loc *get_md_ptr_loc (const void *ptr); | |
145 void copy_md_ptr_loc (const void *new_ptr, const void *old_ptr); | |
146 void fprint_md_ptr_loc (FILE *outf, const void *ptr); | |
147 void print_md_ptr_loc (const void *ptr); | |
148 | |
149 struct enum_type *lookup_enum_type (const char *name); | |
150 void traverse_enum_types (htab_trav callback, void *info); | |
151 | |
152 void handle_constants (); | |
153 void traverse_md_constants (htab_trav callback, void *info); | |
154 void handle_enum (file_location loc, bool md_p); | |
155 | |
156 const char *join_c_conditions (const char *cond1, const char *cond2); | |
157 void fprint_c_condition (FILE *outf, const char *cond); | |
158 void print_c_condition (const char *cond); | |
159 | |
160 /* Defined in read-rtl.c. */ | |
161 const char *apply_iterator_to_string (const char *string); | |
162 rtx copy_rtx_for_iterators (rtx original); | |
163 void read_conditions (); | |
164 void record_potential_iterator_use (struct iterator_group *group, | |
165 rtx x, unsigned int index, | |
166 const char *name); | |
167 struct mapping *read_mapping (struct iterator_group *group, htab_t table); | |
168 | |
169 const char *get_top_level_filename () const { return m_toplevel_fname; } | |
170 const char *get_filename () const { return m_read_md_filename; } | |
171 int get_lineno () const { return m_read_md_lineno; } | |
172 int get_colno () const { return m_read_md_colno; } | |
173 | |
174 struct obstack *get_string_obstack () { return &m_string_obstack; } | |
175 htab_t get_md_constants () { return m_md_constants; } | |
176 | |
177 private: | |
178 /* A singly-linked list of filenames. */ | |
179 struct file_name_list { | |
180 struct file_name_list *next; | |
181 const char *fname; | |
182 }; | |
183 | |
184 private: | |
185 void handle_file (); | |
186 void handle_toplevel_file (); | |
187 void handle_include (file_location loc); | |
188 void add_include_path (const char *arg); | |
189 | |
190 bool read_name_1 (struct md_name *name, file_location *out_loc); | |
191 | |
192 private: | |
193 /* Are we reading a compact dump? */ | |
194 bool m_compact; | |
195 | |
196 /* The name of the toplevel file that indirectly included | |
197 m_read_md_file. */ | |
198 const char *m_toplevel_fname; | |
199 | |
200 /* The directory part of m_toplevel_fname | |
201 NULL if m_toplevel_fname is a bare filename. */ | |
202 char *m_base_dir; | |
203 | |
204 /* The file we are reading. */ | |
205 FILE *m_read_md_file; | |
206 | |
207 /* The filename of m_read_md_file. */ | |
208 const char *m_read_md_filename; | |
209 | |
210 /* The current line number in m_read_md_file. */ | |
211 int m_read_md_lineno; | |
212 | |
213 /* The current column number in m_read_md_file. */ | |
214 int m_read_md_colno; | |
215 | |
216 /* The column number before the last newline, so that | |
217 we can handle unread_char ('\n') at least once whilst | |
218 retaining column information. */ | |
219 int m_last_line_colno; | |
220 | |
221 /* The first directory to search. */ | |
222 file_name_list *m_first_dir_md_include; | |
223 | |
224 /* A pointer to the null terminator of the md include chain. */ | |
225 file_name_list **m_last_dir_md_include_ptr; | |
226 | |
227 /* Obstack used for allocating MD strings. */ | |
228 struct obstack m_string_obstack; | |
229 | |
230 /* A table of ptr_locs, hashed on the PTR field. */ | |
231 htab_t m_ptr_locs; | |
232 | |
233 /* An obstack for the above. Plain xmalloc is a bit heavyweight for a | |
234 small structure like ptr_loc. */ | |
235 struct obstack m_ptr_loc_obstack; | |
236 | |
237 /* A hash table of triples (A, B, C), where each of A, B and C is a condition | |
238 and A is equivalent to "B && C". This is used to keep track of the source | |
239 of conditions that are made up of separate MD strings (such as the split | |
240 condition of a define_insn_and_split). */ | |
241 htab_t m_joined_conditions; | |
242 | |
243 /* An obstack for allocating joined_conditions entries. */ | |
244 struct obstack m_joined_conditions_obstack; | |
245 | |
246 /* A table of md_constant structures, hashed by name. Null if no | |
247 constant expansion should occur. */ | |
248 htab_t m_md_constants; | |
249 | |
250 /* A table of enum_type structures, hashed by name. */ | |
251 htab_t m_enum_types; | |
252 | |
253 /* If non-zero, filter the input to just this subset of lines. */ | |
254 int m_first_line; | |
255 int m_last_line; | |
256 }; | |
257 | |
258 /* Global singleton; constrast with rtx_reader_ptr below. */ | |
259 extern md_reader *md_reader_ptr; | |
260 | |
261 /* An md_reader subclass which skips unknown directives, for | |
262 the gen* tools that purely use read-md.o. */ | |
263 | |
264 class noop_reader : public md_reader | |
265 { | |
266 public: | |
267 noop_reader () : md_reader (false) {} | |
268 | |
269 /* A dummy implementation which skips unknown directives. */ | |
270 void handle_unknown_directive (file_location, const char *); | |
271 }; | |
272 | |
273 /* An md_reader subclass that actually handles full hierarchical | |
274 rtx expressions. | |
275 | |
276 Implemented in read-rtl.c. */ | |
277 | |
278 class rtx_reader : public md_reader | |
279 { | |
280 public: | |
281 rtx_reader (bool compact); | |
282 ~rtx_reader (); | |
283 | |
284 bool read_rtx (const char *rtx_name, vec<rtx> *rtxen); | |
285 rtx read_rtx_code (const char *code_name); | |
286 virtual rtx read_rtx_operand (rtx return_rtx, int idx); | |
287 rtx read_nested_rtx (); | |
288 rtx read_rtx_variadic (rtx form); | |
289 char *read_until (const char *terminator_chars, bool consume_terminator); | |
290 | |
291 virtual void handle_any_trailing_information (rtx) {} | |
292 virtual rtx postprocess (rtx x) { return x; } | |
293 | |
294 /* Hook to allow function_reader subclass to put STRINGBUF into gc-managed | |
295 memory, rather than within an obstack. | |
296 This base class implementation is a no-op. */ | |
297 virtual const char *finalize_string (char *stringbuf) { return stringbuf; } | |
298 | |
299 protected: | |
300 /* Analogous to rtx_writer's m_in_call_function_usage. */ | |
301 bool m_in_call_function_usage; | |
302 | |
303 /* Support for "reuse_rtx" directives. */ | |
304 auto_vec<rtx> m_reuse_rtx_by_id; | |
305 }; | |
306 | |
307 /* Global singleton; constrast with md_reader_ptr above. */ | |
308 extern rtx_reader *rtx_reader_ptr; | |
309 | |
92 extern void (*include_callback) (const char *); | 310 extern void (*include_callback) (const char *); |
93 | 311 |
94 /* Read the next character from the MD file. */ | 312 /* Read the next character from the MD file. */ |
95 | 313 |
96 static inline int | 314 static inline int |
97 read_char (void) | 315 read_char (void) |
98 { | 316 { |
99 int ch; | 317 return md_reader_ptr->read_char (); |
100 | |
101 ch = getc (read_md_file); | |
102 if (ch == '\n') | |
103 read_md_lineno++; | |
104 return ch; | |
105 } | 318 } |
106 | 319 |
107 /* Put back CH, which was the last character read from the MD file. */ | 320 /* Put back CH, which was the last character read from the MD file. */ |
108 | 321 |
109 static inline void | 322 static inline void |
110 unread_char (int ch) | 323 unread_char (int ch) |
111 { | 324 { |
112 if (ch == '\n') | 325 md_reader_ptr->unread_char (ch); |
113 read_md_lineno--; | |
114 ungetc (ch, read_md_file); | |
115 } | 326 } |
116 | 327 |
117 extern hashval_t leading_string_hash (const void *); | 328 extern hashval_t leading_string_hash (const void *); |
118 extern int leading_string_eq_p (const void *, const void *); | 329 extern int leading_string_eq_p (const void *, const void *); |
119 extern void copy_md_ptr_loc (const void *, const void *); | |
120 extern void print_md_ptr_loc (const void *); | |
121 extern const char *join_c_conditions (const char *, const char *); | 330 extern const char *join_c_conditions (const char *, const char *); |
122 extern void print_c_condition (const char *); | 331 extern void message_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; |
123 extern void message_with_line (int, const char *, ...) ATTRIBUTE_PRINTF_2; | 332 extern void error_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; |
124 extern void error_with_line (int, const char *, ...) ATTRIBUTE_PRINTF_2; | 333 extern void fatal_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2; |
125 extern void fatal_with_file_and_line (const char *, ...) | 334 extern void fatal_with_file_and_line (const char *, ...) |
126 ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; | 335 ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; |
127 extern void fatal_expected_char (int, int) ATTRIBUTE_NORETURN; | 336 extern void fatal_expected_char (int, int) ATTRIBUTE_NORETURN; |
128 extern int read_skip_spaces (void); | 337 extern int read_skip_spaces (void); |
129 extern void read_name (struct md_name *); | |
130 extern char *read_quoted_string (void); | |
131 extern char *read_string (int); | |
132 extern void read_skip_construct (int, int); | |
133 extern int n_comma_elts (const char *); | 338 extern int n_comma_elts (const char *); |
134 extern const char *scan_comma_elt (const char **); | 339 extern const char *scan_comma_elt (const char **); |
135 extern void upcase_string (char *); | 340 extern void upcase_string (char *); |
136 extern void traverse_md_constants (htab_trav, void *); | |
137 extern void traverse_enum_types (htab_trav, void *); | 341 extern void traverse_enum_types (htab_trav, void *); |
138 extern struct enum_type *lookup_enum_type (const char *); | 342 extern struct enum_type *lookup_enum_type (const char *); |
139 extern bool read_md_files (int, char **, bool (*) (const char *), | 343 |
140 directive_handler_t); | 344 #endif /* GCC_READ_MD_H */ |