From 812b1403a88cea3257e120f3234576f236c0921d Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 21 Sep 2016 20:55:06 +0000 Subject: 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 --- gcc/gensupport.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'gcc/gensupport.c') diff --git a/gcc/gensupport.c b/gcc/gensupport.c index 4645ead..1648c9c 100644 --- a/gcc/gensupport.c +++ b/gcc/gensupport.c @@ -2225,10 +2225,18 @@ process_define_subst (void) } } -/* A read_md_files callback for reading an rtx. */ +/* A subclass of rtx_reader which reads .md files and calls process_rtx on + the top-level elements. */ -static void -rtx_handle_directive (file_location loc, const char *rtx_name) +class gen_reader : public rtx_reader +{ + public: + gen_reader () : rtx_reader () {} + void handle_unknown_directive (file_location, const char *); +}; + +void +gen_reader::handle_unknown_directive (file_location loc, const char *rtx_name) { auto_vec subrtxs; if (!read_rtx (rtx_name, &subrtxs)) @@ -2499,7 +2507,7 @@ check_define_attr_duplicates () /* The entry point for initializing the reader. */ -bool +rtx_reader * init_rtx_reader_args_cb (int argc, const char **argv, bool (*parse_opt) (const char *)) { @@ -2515,7 +2523,8 @@ init_rtx_reader_args_cb (int argc, const char **argv, split_sequence_num = 1; peephole2_sequence_num = 1; - read_md_files (argc, argv, parse_opt, rtx_handle_directive); + gen_reader *reader = new gen_reader (); + reader->read_md_files (argc, argv, parse_opt); if (define_attr_queue != NULL) check_define_attr_duplicates (); @@ -2531,12 +2540,18 @@ init_rtx_reader_args_cb (int argc, const char **argv, if (define_attr_queue != NULL) gen_mnemonic_attr (); - return !have_error; + if (have_error) + { + delete reader; + return NULL; + } + + return reader; } /* Programs that don't have their own options can use this entry point instead. */ -bool +rtx_reader * init_rtx_reader_args (int argc, const char **argv) { return init_rtx_reader_args_cb (argc, argv, 0); -- cgit v1.1