diff options
author | David Malcolm <dmalcolm@redhat.com> | 2016-09-21 20:55:06 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2016-09-21 20:55:06 +0000 |
commit | 812b1403a88cea3257e120f3234576f236c0921d (patch) | |
tree | 2e57869b3abfc8194d9331d7999474e37d891fa7 /gcc/read-md.h | |
parent | 0d7154371d710268285a0a474286da4f5eb7c936 (diff) | |
download | gcc-812b1403a88cea3257e120f3234576f236c0921d.zip gcc-812b1403a88cea3257e120f3234576f236c0921d.tar.gz gcc-812b1403a88cea3257e120f3234576f236c0921d.tar.bz2 |
Introduce class rtx_reader
Bundle up various global variables within gensupport.c into a
class rtx_reader, with a view towards making it easier to run the
code more than once in-process.
gcc/ChangeLog:
* genconstants.c (main): Introduce noop_reader and convert call
to read_md_files to a method call.
* genenums.c (main): Likewise.
* genmddeps.c (main): Likewise.
* genpreds.c (write_tm_constrs_h): Replace use of "in_fname" with
rtx_reader_ptr->get_top_level_filename ().
(write_tm_preds_h): Likewise.
(write_insn_preds_c): Likewise.
* gensupport.c (class gen_reader): New subclass of rtx_reader.
(rtx_handle_directive): Convert to...
(gen_reader::handle_unknown_directive): ...this.
(init_rtx_reader_args_cb): Convert return type from bool to
rtx_reader *. Create a gen_reader instance, using it for the
call to read_md_files. Return it if no errors occur.
(init_rtx_reader_args): Convert return type from bool to
rtx_reader *.
* gensupport.h (init_rtx_reader_args_cb): Likewise.
(init_rtx_reader_args_cb): Likewise.
* read-md.c (struct file_name_list): Move to class rtx_reader.
(read_md_file): Delete in favor of rtx_reader::m_read_md_file.
(read_md_filename): Delete in favor of
rtx_reader::m_read_md_filename.
(read_md_lineno): Delete in favor of rtx_reader::m_read_md_lineno.
(in_fname): Delete in favor of rtx_reader::m_toplevel_fname.
(base_dir): Delete in favor of rtx_reader::m_base_dir.
(first_dir_md_include): Delete in favor of
rtx_reader::m_first_dir_md_include.
(last_dir_md_include_ptr): Delete in favor of
rtx_reader::m_last_dir_md_include_ptr.
(max_include_len): Delete.
(rtx_reader_ptr): New.
(fatal_with_file_and_line): Use get_filename and get_lineno
accessors of rtx_reader_ptr.
(require_char_ws): Likewise.
(rtx_reader::read_char): New method, based on ::read_char.
(rtx_reader::unread_char): New method, based on ::unread_char.
(read_escape): Use get_filename and get_lineno accessors of
rtx_reader_ptr.
(read_braced_string): Use get_lineno accessor of rtx_reader_ptr.
(read_string): Use get_filename and get_lineno accessors of
rtx_reader_ptr.
(rtx_reader::rtx_reader): New ctor.
(rtx_reader::~rtx_reader): New dtor.
(handle_include): Convert from a function to...
(rtx_reader::handle_include): ...this method, converting
handle_directive from a callback to a virtual function.
(handle_file): Likewise, converting to...
(rtx_reader::handle_file): ...this method.
(handle_toplevel_file): Likewise, converting to...
(rtx_reader::handle_toplevel_file): ...this method.
(rtx_reader::get_current_location): New method.
(parse_include): Convert from a function to...
(rtx_reader::add_include_path): ...this method, dropping redundant
update to unused max_include_len.
(read_md_files): Convert from a function to...
(rtx_reader::read_md_files): ...this method, converting
handle_directive from a callback to a virtual function.
(noop_reader::handle_unknown_directive): New method.
* read-md.h (directive_handler_t): Delete this typedef.
(in_fname): Delete.
(read_md_file): Delete.
(read_md_lineno): Delete.
(read_md_filename): Delete.
(class rtx_reader): New class.
(rtx_reader_ptr): New decl.
(class noop_reader): New subclass of rtx_reader.
(read_char): Reimplement in terms of rtx_reader::read_char.
(unread_char): Reimplement in terms of rtx_reader::unread_char.
(read_md_files): Delete.
* read-rtl.c (read_rtx_code): Update for deletion of globals
read_md_filename and read_md_lineno.
From-SVN: r240333
Diffstat (limited to 'gcc/read-md.h')
-rw-r--r-- | gcc/read-md.h | 98 |
1 files changed, 77 insertions, 21 deletions
diff --git a/gcc/read-md.h b/gcc/read-md.h index fa25951..82a628b 100644 --- a/gcc/read-md.h +++ b/gcc/read-md.h @@ -90,16 +90,81 @@ struct enum_type { unsigned int num_values; }; -/* A callback that handles a single .md-file directive, up to but not - including the closing ')'. It takes two arguments: the file position - at which the directive started, and the name of the directive. The next - unread character is the optional space after the directive name. */ -typedef void (*directive_handler_t) (file_location, const char *); - -extern const char *in_fname; -extern FILE *read_md_file; -extern int read_md_lineno; -extern const char *read_md_filename; +class rtx_reader +{ + public: + rtx_reader (); + virtual ~rtx_reader (); + + bool read_md_files (int, const char **, bool (*) (const char *)); + + /* A hook that handles a single .md-file directive, up to but not + including the closing ')'. It takes two arguments: the file position + at which the directive started, and the name of the directive. The next + unread character is the optional space after the directive name. */ + virtual void handle_unknown_directive (file_location, const char *) = 0; + + file_location get_current_location () const; + + int read_char (void); + void unread_char (int ch); + + const char *get_top_level_filename () const { return m_toplevel_fname; } + const char *get_filename () const { return m_read_md_filename; } + int get_lineno () const { return m_read_md_lineno; } + + private: + /* A singly-linked list of filenames. */ + struct file_name_list { + struct file_name_list *next; + const char *fname; + }; + + private: + void handle_file (); + void handle_toplevel_file (); + void handle_include (file_location loc); + void add_include_path (const char *arg); + + private: + /* The name of the toplevel file that indirectly included + m_read_md_file. */ + const char *m_toplevel_fname; + + /* The directory part of m_toplevel_fname + NULL if m_toplevel_fname is a bare filename. */ + char *m_base_dir; + + /* The file we are reading. */ + FILE *m_read_md_file; + + /* The filename of m_read_md_file. */ + const char *m_read_md_filename; + + /* The current line number in m_read_md_file. */ + int m_read_md_lineno; + + /* The first directory to search. */ + file_name_list *m_first_dir_md_include; + + /* A pointer to the null terminator of the md include chain. */ + file_name_list **m_last_dir_md_include_ptr; +}; + +/* Global singleton. */ +extern rtx_reader *rtx_reader_ptr; + +/* An rtx_reader subclass which skips unknown directives. */ + +class noop_reader : public rtx_reader +{ + public: + noop_reader () : rtx_reader () {} + + /* A dummy implementation which skips unknown directives. */ + void handle_unknown_directive (file_location, const char *); +}; + extern struct obstack string_obstack; extern void (*include_callback) (const char *); @@ -108,12 +173,7 @@ extern void (*include_callback) (const char *); static inline int read_char (void) { - int ch; - - ch = getc (read_md_file); - if (ch == '\n') - read_md_lineno++; - return ch; + return rtx_reader_ptr->read_char (); } /* Put back CH, which was the last character read from the MD file. */ @@ -121,9 +181,7 @@ read_char (void) static inline void unread_char (int ch) { - if (ch == '\n') - read_md_lineno--; - ungetc (ch, read_md_file); + rtx_reader_ptr->unread_char (ch); } extern hashval_t leading_string_hash (const void *); @@ -151,7 +209,5 @@ extern void upcase_string (char *); extern void traverse_md_constants (htab_trav, void *); extern void traverse_enum_types (htab_trav, void *); extern struct enum_type *lookup_enum_type (const char *); -extern bool read_md_files (int, const char **, bool (*) (const char *), - directive_handler_t); #endif /* GCC_READ_MD_H */ |