GCC Middle and Back End API Reference
read-md.h
Go to the documentation of this file.
1/* MD reader definitions.
2 Copyright (C) 1987-2024 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#ifndef GCC_READ_MD_H
21#define GCC_READ_MD_H
22
23#include "obstack.h"
24
25/* Records a position in the file. */
27public:
29 file_location (const char *, int, int);
30
31 const char *filename;
32 int lineno;
33 int colno;
34};
35
36inline file_location::file_location (const char *filename_in, int lineno_in, int colno_in)
37: filename (filename_in), lineno (lineno_in), colno (colno_in) {}
38
39/* Holds one symbol or number in the .md file. */
40struct md_name {
41 /* The name as it appeared in the .md file. Names are syntactically
42 limited to the length of this buffer. */
43 char buffer[256];
44
45 /* The name that should actually be used by the generator programs.
46 This is an expansion of NAME, after things like constant substitution. */
47 char *string;
48};
49
50/* This structure represents a constant defined by define_constant,
51 define_enum, or such-like. */
53 /* The name of the constant. */
54 char *name;
55
56 /* The string to which the constants expands. */
57 char *value;
58
59 /* If the constant is associated with a enumeration, this field
60 points to that enumeration, otherwise it is null. */
62};
63
64/* This structure represents one value in an enum_type. */
65struct enum_value {
66 /* The next value in the enum, or null if this is the last. */
68
69 /* The name of the value as it appears in the .md file. */
70 char *name;
71
72 /* The definition of the related C value. */
74};
75
76/* This structure represents an enum defined by define_enum or the like. */
77struct enum_type {
78 /* The C name of the enumeration. */
79 char *name;
80
81 /* True if this is an md-style enum (DEFINE_ENUM) rather than
82 a C-style enum (DEFINE_C_ENUM). */
83 bool md_p;
84
85 /* The values of the enumeration. There is always at least one. */
87
88 /* A pointer to the null terminator in VALUES. */
90
91 /* The number of enumeration values. */
92 unsigned int num_values;
93};
94
95/* Describes one instance of an overloaded_name. */
97 /* The next instance in the chain, or null if none. */
99
100 /* The values that the overloaded_name arguments should have for this
101 instance to be chosen. Each value is a C token. */
103
104 /* The full (non-overloaded) name of the pattern. */
105 const char *name;
106
107 /* The corresponding define_expand or define_insn. */
109};
110
111/* Describes a define_expand or define_insn whose name was preceded by '@'.
112 Overloads are uniquely determined by their name and the types of their
113 arguments; it's possible to have overloads with the same name but
114 different argument types. */
116 /* The next overloaded name in the chain. */
118
119 /* The overloaded name (i.e. the name with "@" character and
120 "<...>" placeholders removed). */
121 const char *name;
122
123 /* The C types of the iterators that determine the underlying pattern,
124 in the same order as in the pattern name. E.g. "<mode>" in the
125 pattern name would give a "machine_mode" argument here. */
127
128 /* The first instance associated with this overloaded_name. */
130
131 /* Where to chain new overloaded_instances. */
133};
134
135struct mapping;
136
137/* A class for reading .md files and RTL dump files.
138
139 Implemented in read-md.cc.
140
141 This class has responsibility for reading chars from input files, and
142 for certain common top-level directives including the "include"
143 directive.
144
145 It does not handle parsing the hierarchically-nested expressions of
146 rtl.def; for that see the rtx_reader subclass below (implemented in
147 read-rtl.cc). */
148
150{
151 public:
152 /* Associates PTR (which can be a string, etc.) with the file location
153 specified by LOC. */
154 struct ptr_loc {
155 const void *ptr;
157 };
158
159 md_reader (bool compact);
160 virtual ~md_reader ();
161
162 bool read_md_files (int, const char **, bool (*) (const char *));
163 bool read_file (const char *filename);
164 bool read_file_fragment (const char *filename,
165 int first_line,
166 int last_line);
167
168 /* A hook that handles a single .md-file directive, up to but not
169 including the closing ')'. It takes two arguments: the file position
170 at which the directive started, and the name of the directive. The next
171 unread character is the optional space after the directive name. */
172 virtual void handle_unknown_directive (file_location, const char *) = 0;
173
175
176 bool is_compact () const { return m_compact; }
177
178 /* Defined in read-md.cc. */
179 int read_char (void);
180 void unread_char (int ch);
181 file_location read_name (struct md_name *name);
183 void read_escape ();
184 char *read_quoted_string ();
185 char *read_braced_string ();
186 char *read_string (int star_if_braced);
187 void read_skip_construct (int depth, file_location loc);
188 void require_char (char expected);
189 void require_char_ws (char expected);
190 void require_word_ws (const char *expected);
191 int peek_char (void);
192
193 void set_md_ptr_loc (const void *ptr, file_location);
194 const struct ptr_loc *get_md_ptr_loc (const void *ptr);
195 void copy_md_ptr_loc (const void *new_ptr, const void *old_ptr);
196 void fprint_md_ptr_loc (FILE *outf, const void *ptr);
197 void print_md_ptr_loc (const void *ptr, FILE * = stdout);
198
199 struct enum_type *lookup_enum_type (const char *name);
200 void traverse_enum_types (htab_trav callback, void *info);
201
202 void handle_constants ();
203 void traverse_md_constants (htab_trav callback, void *info);
204 void handle_enum (file_location loc, bool md_p);
205
206 const char *join_c_conditions (const char *cond1, const char *cond2);
207 void fprint_c_condition (FILE *outf, const char *cond);
208 void print_c_condition (FILE *outf, const char *cond);
209
210 /* Defined in read-rtl.cc. */
211 const char *apply_iterator_to_string (const char *string);
212 rtx copy_rtx_for_iterators (rtx original);
215 file_location loc, rtx x,
216 unsigned int index, const char *name);
217 struct mapping *read_mapping (struct iterator_group *group, htab_t table);
219
220 const char *get_top_level_filename () const { return m_toplevel_fname; }
221 const char *get_filename () const { return m_read_md_filename; }
222 int get_lineno () const { return m_read_md_lineno; }
223 int get_colno () const { return m_read_md_colno; }
224
226 htab_t get_md_constants () { return m_md_constants; }
227
229
230 private:
231 /* A singly-linked list of filenames. */
234 const char *fname;
235 };
236
237 private:
238 void handle_file ();
239 void handle_toplevel_file ();
240 void handle_include (file_location loc);
241 void add_include_path (const char *arg);
242
243 bool read_name_1 (struct md_name *name, file_location *out_loc);
244
245 private:
246 /* Are we reading a compact dump? */
248
249 /* The name of the toplevel file that indirectly included
250 m_read_md_file. */
251 const char *m_toplevel_fname;
252
253 /* The directory part of m_toplevel_fname
254 NULL if m_toplevel_fname is a bare filename. */
256
257 /* The file we are reading. */
259
260 /* The filename of m_read_md_file. */
262
263 /* The current line number in m_read_md_file. */
265
266 /* The current column number in m_read_md_file. */
268
269 /* The column number before the last newline, so that
270 we can handle unread_char ('\n') at least once whilst
271 retaining column information. */
273
274 /* The first directory to search. */
276
277 /* A pointer to the null terminator of the md include chain. */
279
280 /* Obstack used for allocating MD strings. */
282
283 /* A table of ptr_locs, hashed on the PTR field. */
285
286 /* An obstack for the above. Plain xmalloc is a bit heavyweight for a
287 small structure like ptr_loc. */
289
290 /* A hash table of triples (A, B, C), where each of A, B and C is a condition
291 and A is equivalent to "B && C". This is used to keep track of the source
292 of conditions that are made up of separate MD strings (such as the split
293 condition of a define_insn_and_split). */
295
296 /* An obstack for allocating joined_conditions entries. */
298
299 /* A table of md_constant structures, hashed by name. Null if no
300 constant expansion should occur. */
302
303 /* A table of enum_type structures, hashed by name. */
305
306 /* If non-zero, filter the input to just this subset of lines. */
309
310 /* The first overloaded_name. */
312
313 /* Where to chain further overloaded_names, */
315
316 /* A hash table of overloaded_names, keyed off their name and the types of
317 their arguments. */
319};
320
321/* Global singleton; constrast with rtx_reader_ptr below. */
323
324/* An md_reader subclass which skips unknown directives, for
325 the gen* tools that purely use read-md.o. */
326
327class noop_reader : public md_reader
328{
329 public:
331
332 /* A dummy implementation which skips unknown directives. */
333 void handle_unknown_directive (file_location, const char *) override;
334};
335
336/* An md_reader subclass that actually handles full hierarchical
337 rtx expressions.
338
339 Implemented in read-rtl.cc. */
340
341class rtx_reader : public md_reader
342{
343 public:
344 rtx_reader (bool compact);
345 ~rtx_reader ();
346
347 bool read_rtx (const char *rtx_name, vec<rtx> *rtxen);
348 rtx rtx_alloc_for_name (const char *);
349 rtx read_rtx_code (const char *code_name);
350 virtual rtx read_rtx_operand (rtx return_rtx, int idx);
353 char *read_until (const char *terminator_chars, bool consume_terminator);
354
356 virtual rtx postprocess (rtx x) { return x; }
357
358 /* Hook to allow function_reader subclass to put STRINGBUF into gc-managed
359 memory, rather than within an obstack.
360 This base class implementation is a no-op. */
361 virtual const char *finalize_string (char *stringbuf) { return stringbuf; }
362
363 protected:
364 /* Analogous to rtx_writer's m_in_call_function_usage. */
366
367#ifndef GENERATOR_FILE
368 /* Support for "reuse_rtx" directives. */
370#endif
371};
372
373/* Global singleton; constrast with md_reader_ptr above. */
375
376extern void (*include_callback) (const char *);
377
378/* Read the next character from the MD file. */
379
380inline int
382{
383 return md_reader_ptr->read_char ();
384}
385
386/* Put back CH, which was the last character read from the MD file. */
387
388inline void
390{
392}
393
394extern hashval_t leading_string_hash (const void *);
395extern int leading_string_eq_p (const void *, const void *);
396extern const char *join_c_conditions (const char *, const char *);
397extern void message_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2;
398extern void error_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2;
399extern void fatal_at (file_location, const char *, ...) ATTRIBUTE_PRINTF_2;
400extern void fatal_with_file_and_line (const char *, ...)
401 ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
402extern void fatal_expected_char (int, int) ATTRIBUTE_NORETURN;
403extern int read_skip_spaces (void);
404extern int n_comma_elts (const char *);
405extern const char *scan_comma_elt (const char **);
406extern void upcase_string (char *);
407extern void traverse_enum_types (htab_trav, void *);
408extern struct enum_type *lookup_enum_type (const char *);
409
410#endif /* GCC_READ_MD_H */
form
Definition auto-inc-dec.cc:131
Definition vec.h:1656
Definition read-md.h:26
int lineno
Definition read-md.h:32
const char * filename
Definition read-md.h:31
file_location()
Definition read-md.h:28
int colno
Definition read-md.h:33
Definition read-md.h:150
file_location read_name(struct md_name *name)
Definition read-md.cc:517
char * m_base_dir
Definition read-md.h:255
void read_escape()
Definition read-md.cc:545
file_name_list ** m_last_dir_md_include_ptr
Definition read-md.h:278
md_reader(bool compact)
Definition read-md.cc:999
void fprint_c_condition(FILE *outf, const char *cond)
Definition read-md.cc:173
virtual void handle_unknown_directive(file_location, const char *)=0
overloaded_name ** m_next_overload_ptr
Definition read-md.h:314
char * read_string(int star_if_braced)
Definition read-md.cc:662
htab_t m_joined_conditions
Definition read-md.h:294
int read_char(void)
Definition read-md.cc:391
void handle_include(file_location loc)
Definition read-md.cc:1064
void traverse_enum_types(htab_trav callback, void *info)
Definition read-md.cc:991
const char * get_filename() const
Definition read-md.h:221
const char * join_c_conditions(const char *cond1, const char *cond2)
Definition read-md.cc:144
void read_skip_construct(int depth, file_location loc)
Definition read-md.cc:706
void fprint_md_ptr_loc(FILE *outf, const void *ptr)
Definition read-md.cc:126
htab_t m_ptr_locs
Definition read-md.h:284
void read_conditions()
int m_read_md_lineno
Definition read-md.h:264
void record_potential_iterator_use(struct iterator_group *group, file_location loc, rtx x, unsigned int index, const char *name)
Definition read-rtl.cc:1225
int m_last_line
Definition read-md.h:308
int m_first_line
Definition read-md.h:307
file_name_list * m_first_dir_md_include
Definition read-md.h:275
overloaded_name * handle_overloaded_name(rtx, vec< mapping * > *)
htab_t m_overloads_htab
Definition read-md.h:318
void traverse_md_constants(htab_trav callback, void *info)
Definition read-md.cc:879
void set_md_ptr_loc(const void *ptr, file_location)
Definition read-md.cc:92
int peek_char(void)
Definition read-md.cc:436
void copy_md_ptr_loc(const void *new_ptr, const void *old_ptr)
Definition read-md.cc:115
struct enum_type * lookup_enum_type(const char *name)
Definition read-md.cc:981
bool read_md_files(int, const char **, bool(*)(const char *))
const char * apply_iterator_to_string(const char *string)
Definition read-rtl.cc:544
int get_lineno() const
Definition read-md.h:222
virtual ~md_reader()
Definition read-md.cc:1038
struct obstack m_string_obstack
Definition read-md.h:281
const char * get_top_level_filename() const
Definition read-md.h:220
void require_char_ws(char expected)
Definition read-md.cc:369
void handle_constants()
Definition read-md.cc:848
bool read_file_fragment(const char *filename, int first_line, int last_line)
Definition read-md.cc:1339
struct obstack * get_string_obstack()
Definition read-md.h:225
struct obstack m_ptr_loc_obstack
Definition read-md.h:288
char * read_quoted_string()
Definition read-md.cc:598
const struct ptr_loc * get_md_ptr_loc(const void *ptr)
Definition read-md.cc:107
rtx copy_rtx_for_iterators(rtx original)
Definition read-rtl.cc:584
void add_include_path(const char *arg)
Definition read-md.cc:1199
int get_colno() const
Definition read-md.h:223
int m_last_line_colno
Definition read-md.h:272
const char * m_read_md_filename
Definition read-md.h:261
void handle_toplevel_file()
Definition read-md.cc:1176
htab_t m_md_constants
Definition read-md.h:301
bool m_compact
Definition read-md.h:247
bool is_compact() const
Definition read-md.h:176
overloaded_name * m_first_overload
Definition read-md.h:311
bool read_name_1(struct md_name *name, file_location *out_loc)
Definition read-md.cc:447
overloaded_name * get_overloads() const
Definition read-md.h:228
struct obstack m_joined_conditions_obstack
Definition read-md.h:297
char * read_braced_string()
Definition read-md.cc:625
bool read_file(const char *filename)
Definition read-md.cc:1323
void require_word_ws(const char *expected)
Definition read-md.cc:380
htab_t get_md_constants()
Definition read-md.h:226
int m_read_md_colno
Definition read-md.h:267
file_location get_current_location() const
Definition read-md.cc:1191
file_location read_name_or_nil(struct md_name *)
Definition read-md.cc:526
void print_md_ptr_loc(const void *ptr, FILE *=stdout)
Definition read-md.cc:135
void unread_char(int ch)
Definition read-md.cc:421
FILE * m_read_md_file
Definition read-md.h:258
void require_char(char expected)
Definition read-md.cc:358
struct mapping * read_mapping(struct iterator_group *group, htab_t table)
void print_c_condition(FILE *outf, const char *cond)
Definition read-md.cc:195
void handle_enum(file_location loc, bool md_p)
Definition read-md.cc:902
void handle_file()
Definition read-md.cc:1142
const char * m_toplevel_fname
Definition read-md.h:251
htab_t m_enum_types
Definition read-md.h:304
Definition read-md.h:328
noop_reader()
Definition read-md.h:330
void handle_unknown_directive(file_location, const char *) override
Definition read-md.cc:1360
Definition read-md.h:342
rtx read_nested_rtx()
Definition read-rtl.cc:2085
virtual rtx postprocess(rtx x)
Definition read-md.h:356
bool m_in_call_function_usage
Definition read-md.h:365
bool read_rtx(const char *rtx_name, vec< rtx > *rtxen)
rtx read_rtx_variadic(rtx form)
Definition read-rtl.cc:2117
rtx_reader(bool compact)
Definition read-rtl.cc:2143
auto_vec< rtx > m_reuse_rtx_by_id
Definition read-md.h:369
virtual const char * finalize_string(char *stringbuf)
Definition read-md.h:361
rtx rtx_alloc_for_name(const char *)
Definition read-rtl.cc:1615
char * read_until(const char *terminator_chars, bool consume_terminator)
Definition read-rtl.cc:1534
rtx read_rtx_code(const char *code_name)
Definition read-rtl.cc:1671
virtual rtx read_rtx_operand(rtx return_rtx, int idx)
Definition read-rtl.cc:1858
~rtx_reader()
Definition read-rtl.cc:2155
virtual void handle_any_trailing_information(rtx)
Definition read-md.h:355
static struct table_elt * table[HASH_SIZE]
Definition cse.cc:470
void ATTRIBUTE_NORETURN
Definition diagnostic-core.h:105
static struct obstack obstack
Definition gcc.cc:360
hashval_t leading_string_hash(const void *)
Definition read-md.cc:58
void message_at(file_location, const char *,...) ATTRIBUTE_PRINTF_2
Definition read-md.cc:214
void fatal_expected_char(int, int) ATTRIBUTE_NORETURN
Definition read-md.cc:296
int n_comma_elts(const char *)
Definition read-md.cc:755
void fatal_with_file_and_line(const char *,...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN
Definition read-md.cc:253
void(* include_callback)(const char *)
Definition read-md.cc:48
const char * join_c_conditions(const char *, const char *)
md_reader * md_reader_ptr
Definition read-md.cc:52
int leading_string_eq_p(const void *, const void *)
Definition read-md.cc:67
rtx_reader * rtx_reader_ptr
Definition read-rtl.cc:141
struct enum_type * lookup_enum_type(const char *)
void traverse_enum_types(htab_trav, void *)
const char * scan_comma_elt(const char **)
Definition read-md.cc:776
int read_skip_spaces(void)
Definition read-md.cc:310
void upcase_string(char *)
Definition read-md.cc:801
int read_char(void)
Definition read-md.h:381
void unread_char(int ch)
Definition read-md.h:389
void error_at(file_location, const char *,...) ATTRIBUTE_PRINTF_2
Definition read-md.cc:226
void fatal_at(file_location, const char *,...) ATTRIBUTE_PRINTF_2
Definition read-md.cc:239
const char *const rtx_name[NUM_RTX_CODE]
Definition rtl.cc:55
Definition read-md.h:77
struct enum_value ** tail_ptr
Definition read-md.h:89
char * name
Definition read-md.h:79
unsigned int num_values
Definition read-md.h:92
bool md_p
Definition read-md.h:83
struct enum_value * values
Definition read-md.h:86
Definition read-md.h:65
struct enum_value * next
Definition read-md.h:67
struct md_constant * def
Definition read-md.h:73
char * name
Definition read-md.h:70
Definition read-rtl.cc:64
Definition read-rtl.cc:49
Definition read-md.h:52
char * value
Definition read-md.h:57
char * name
Definition read-md.h:54
struct enum_type * parent_enum
Definition read-md.h:61
Definition read-md.h:40
char * string
Definition read-md.h:47
char buffer[256]
Definition read-md.h:43
Definition read-md.h:232
const char * fname
Definition read-md.h:234
struct file_name_list * next
Definition read-md.h:233
Definition read-md.h:154
file_location loc
Definition read-md.h:156
const void * ptr
Definition read-md.h:155
Definition gengtype.h:377
Definition read-md.h:96
vec< const char * > arg_values
Definition read-md.h:102
rtx insn
Definition read-md.h:108
const char * name
Definition read-md.h:105
overloaded_instance * next
Definition read-md.h:98
Definition read-md.h:115
vec< const char * > arg_types
Definition read-md.h:126
const char * name
Definition read-md.h:121
overloaded_instance * first_instance
Definition read-md.h:129
overloaded_instance ** next_instance_ptr
Definition read-md.h:132
overloaded_name * next
Definition read-md.h:117
Definition rtl.h:312
Definition vec.h:450
#define false
Definition system.h:888