On Thu, 2016-12-01 at 13:40 +0100, Bernd Schmidt wrote: > On 11/30/2016 09:24 PM, David Malcolm wrote: > > > gcc/ChangeLog: > > * read-md.c (have_error): New global, copied from errors.c. > > (fatal): New function, copied from errors.c. > > I would have expected the function to go into diagnostic.c, but > actually > there are already various functions of this sort in read-md.
In a way, there are three diagnostic systems in the codebase: - the functions in errors.h/errors.c (warning, error, fatal, etc) - the functions in read-md.c (error_at, fatal_at) which share the "have_error" global with errors.c. - the "real" diagnostics subsystem (diagnostics.c etc) It turns out that the only thing using "fatal" within read-md.c is md_reader::read_md_files. The interface this provides is overly complicated for the RTL FE's purposes, so the following patch avoids using it in favor of a simpler, new method: md_reader::read_file. With that, the only thing needed in read-md.c from errors.c on the host is just the "have_error" global; the patch verifies that by conditionalizing the include of errors.h on #ifdef GENERATOR_FILE (and similarly conditionalizing md_reader::read_md_files, since "fatal" isn't implemented on the host). > I'd request > you place it near fatal_at, and maybe add this to errors.h: > > inline bool seen_error () > { > return have_error; > } > > and replace explicit uses of have_error with that to unify things a > bit. > > > Bernd seen_error is already implemented in the "real" diagnostic subsystem, and would be a clash: we want a way to determine if read-md.c's implementation of error_at was called. Hence it seems simplest to conditionally add a copy of the "have_error" global to read-md.c. Thoughts? gcc/ChangeLog: * read-md.c: Wrap include of errors.h with #ifdef GENERATOR_FILE. (have_error): New global, copied from errors.c. (md_reader::read_md_files): Wrap with #ifdef GENERATOR_FILE. (md_reader::read_file): New method. * read-md.h (md_reader::read_file): New method. * read-rtl-function.c (read_rtl_function_body): Reimplement in terms of md_reader::read_file. --- gcc/read-md.c | 31 +++++++++++++++++++++++++++++++ gcc/read-md.h | 1 + gcc/read-rtl-function.c | 6 +----- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/gcc/read-md.c b/gcc/read-md.c index 25bc3c4..e581326 100644 --- a/gcc/read-md.c +++ b/gcc/read-md.c @@ -26,11 +26,23 @@ along with GCC; see the file COPYING3. If not see #endif #include "system.h" #include "coretypes.h" +#ifdef GENERATOR_FILE #include "errors.h" +#endif /* #ifdef GENERATOR_FILE */ #include "statistics.h" #include "vec.h" #include "read-md.h" +#ifndef GENERATOR_FILE + +/* Minimal reimplementation of errors.c for use by RTL frontend + within cc1. */ + +int have_error = 0; + +#endif /* #ifndef GENERATOR_FILE */ + + /* Associates PTR (which can be a string, etc.) with the file location specified by FILENAME and LINENO. */ struct ptr_loc { @@ -1190,6 +1202,8 @@ md_reader::add_include_path (const char *arg) m_last_dir_md_include_ptr = &dirtmp->next; } +#ifdef GENERATOR_FILE + /* The main routine for reading .md files. Try to process all the .md files specified on the command line and return true if no error occurred. @@ -1296,6 +1310,23 @@ md_reader::read_md_files (int argc, const char **argv, return !have_error; } +#endif /* #ifdef GENERATOR_FILE */ + +/* Read FILENAME. */ + +bool +md_reader::read_file (const char *filename) +{ + m_read_md_filename = filename; + m_read_md_file = fopen (m_read_md_filename, "r"); + if (m_read_md_file == 0) + { + perror (m_read_md_filename); + return false; + } + handle_toplevel_file (); + return !have_error; +} /* Read FILENAME, filtering to just the given lines. */ diff --git a/gcc/read-md.h b/gcc/read-md.h index 6a73b00..5fc7605 100644 --- a/gcc/read-md.h +++ b/gcc/read-md.h @@ -110,6 +110,7 @@ class md_reader virtual ~md_reader (); bool read_md_files (int, const char **, bool (*) (const char *)); + bool read_file (const char *filename); bool read_file_fragment (const char *filename, int first_line, int last_line); diff --git a/gcc/read-rtl-function.c b/gcc/read-rtl-function.c index ddea836..5188b86 100644 --- a/gcc/read-rtl-function.c +++ b/gcc/read-rtl-function.c @@ -1590,12 +1590,8 @@ read_rtl_function_body (const char *path) init_emit (); init_varasm_status (); - auto_vec<const char *> argv (2); - argv.safe_push (progname); - argv.safe_push (path); - function_reader reader; - if (!reader.read_md_files (argv.length (), argv.address (), NULL)) + if (!reader.read_file (path)) return false; return true; -- 1.8.5.3