+2016-12-07 David Malcolm <dmalcolm@redhat.com>
+
+ * genpreds.c (write_tm_constrs_h): Update for renaming of
+ rtx_reader_ptr to md_reader_ptr.
+ (write_tm_preds_h): Likewise.
+ (write_insn_preds_c): Likewise.
+ * read-md.c (rtx_reader_ptr): Rename to...
+ (md_reader_ptr): ...this, and convert from an
+ rtx_reader * to a md_reader *.
+ (rtx_reader::set_md_ptr_loc): Rename to...
+ (md_reader::set_md_ptr_loc): ...this.
+ (rtx_reader::get_md_ptr_loc): Rename to...
+ (md_reader::get_md_ptr_loc): ...this.
+ (rtx_reader::copy_md_ptr_loc): Rename to...
+ (md_reader::copy_md_ptr_loc): ...this.
+ (rtx_reader::fprint_md_ptr_loc): Rename to...
+ (md_reader::fprint_md_ptr_loc): ...this.
+ (rtx_reader::print_md_ptr_loc): Rename to...
+ (md_reader::print_md_ptr_loc): ...this.
+ (rtx_reader::join_c_conditions): Rename to...
+ (md_reader::join_c_conditions): ...this.
+ (rtx_reader::fprint_c_condition): ...this.
+ (rtx_reader::print_c_condition): Rename to...
+ (md_reader::print_c_condition): ...this.
+ (fatal_with_file_and_line): Update for renaming of
+ rtx_reader_ptr to md_reader_ptr.
+ (rtx_reader::require_char): Rename to...
+ (md_reader::require_char): ...this.
+ (rtx_reader::require_char_ws): Rename to...
+ (md_reader::require_char_ws): ...this.
+ (rtx_reader::require_word_ws): Rename to...
+ (md_reader::require_word_ws): ...this.
+ (rtx_reader::read_char): Rename to...
+ (md_reader::read_char): ...this.
+ (rtx_reader::unread_char): Rename to...
+ (md_reader::unread_char): ...this.
+ (rtx_reader::peek_char): Rename to...
+ (md_reader::peek_char): ...this.
+ (rtx_reader::read_name): Rename to...
+ (md_reader::read_name): ...this.
+ (rtx_reader::read_escape): Rename to...
+ (md_reader::read_escape): ...this.
+ (rtx_reader::read_quoted_string): Rename to...
+ (md_reader::read_quoted_string): ...this.
+ (rtx_reader::read_braced_string): Rename to...
+ (md_reader::read_braced_string): ...this.
+ (rtx_reader::read_string): Rename to...
+ (md_reader::read_string): ...this.
+ (rtx_reader::read_skip_construct): Rename to...
+ (md_reader::read_skip_construct): ...this.
+ (rtx_reader::handle_constants): Rename to...
+ (md_reader::handle_constants): ...this.
+ (rtx_reader::traverse_md_constants): Rename to...
+ (md_reader::traverse_md_constants): ...this.
+ (rtx_reader::handle_enum): Rename to...
+ (md_reader::handle_enum): ...this.
+ (rtx_reader::lookup_enum_type): Rename to...
+ (md_reader::lookup_enum_type): ...this.
+ (rtx_reader::traverse_enum_types): Rename to...
+ (md_reader::traverse_enum_types): ...this.
+ (rtx_reader::rtx_reader): Rename to...
+ (md_reader::md_reader): ...this, and update for renaming of
+ rtx_reader_ptr to md_reader_ptr.
+ (rtx_reader::~rtx_reader): Rename to...
+ (md_reader::~md_reader): ...this, and update for renaming of
+ rtx_reader_ptr to md_reader_ptr.
+ (rtx_reader::handle_include): Rename to...
+ (md_reader::handle_include): ...this.
+ (rtx_reader::handle_file): Rename to...
+ (md_reader::handle_file): ...this.
+ (rtx_reader::handle_toplevel_file): Rename to...
+ (md_reader::handle_toplevel_file): ...this.
+ (rtx_reader::get_current_location): Rename to...
+ (md_reader::get_current_location): ...this.
+ (rtx_reader::add_include_path): Rename to...
+ (md_reader::add_include_path): ...this.
+ (rtx_reader::read_md_files): Rename to...
+ (md_reader::read_md_files): ...this.
+ * read-md.h (class rtx_reader): Split into...
+ (class md_reader): ...new class.
+ (rtx_reader_ptr): Rename to...
+ (md_reader_ptr): ...this, and convert to a md_reader *.
+ (class noop_reader): Update base class to be md_reader.
+ (class rtx_reader): Reintroduce as a subclass of md_reader.
+ (rtx_reader_ptr): Reintroduce as a rtx_reader *.
+ (read_char): Update for renaming of rtx_reader_ptr to
+ md_reader_ptr.
+ (unread_char): Likewise.
+ * read-rtl.c (rtx_reader_ptr): New global.
+ (rtx_reader::apply_iterator_to_string): Rename to...
+ (md_reader::apply_iterator_to_string): ...this.
+ (rtx_reader::copy_rtx_for_iterators): Rename to...
+ (md_reader::copy_rtx_for_iterators): ...this.
+ (rtx_reader::read_conditions): Rename to...
+ (md_reader::read_conditions): ...this.
+ (rtx_reader::record_potential_iterator_use): Rename to...
+ (md_reader::record_potential_iterator_use): ...this.
+ (rtx_reader::read_mapping): Rename to...
+ (md_reader::read_mapping): ...this.
+ (rtx_reader::read_rtx): Use rtx_reader_ptr when calling
+ read_rtx_code.
+ (rtx_reader::read_rtx_operand): Use get_string_obstack rather
+ than directly accessing m_string_obstack.
+ (rtx_reader::rtx_reader): New ctor.
+ (rtx_reader::~rtx_reader): New dtor.
+
2016-12-07 Martin Sebor <msebor@redhat.com>
PR middle-end/77784
printf ("\
/* Generated automatically by the program '%s'\n\
from the machine description file '%s'. */\n\n", progname,
- rtx_reader_ptr->get_top_level_filename ());
+ md_reader_ptr->get_top_level_filename ());
puts ("\
#ifndef GCC_TM_CONSTRS_H\n\
printf ("\
/* Generated automatically by the program '%s'\n\
from the machine description file '%s'. */\n\n", progname,
- rtx_reader_ptr->get_top_level_filename ());
+ md_reader_ptr->get_top_level_filename ());
puts ("\
#ifndef GCC_TM_PREDS_H\n\
printf ("\
/* Generated automatically by the program '%s'\n\
from the machine description file '%s'. */\n\n", progname,
- rtx_reader_ptr->get_top_level_filename ());
+ md_reader_ptr->get_top_level_filename ());
puts ("\
#include \"config.h\"\n\
/* Global singleton. */
-rtx_reader *rtx_reader_ptr;
+md_reader *md_reader_ptr;
/* Given an object that starts with a char * name field, return a hash
code for its name. */
/* Associate PTR with the file position given by FILENAME and LINENO. */
void
-rtx_reader::set_md_ptr_loc (const void *ptr, const char *filename, int lineno)
+md_reader::set_md_ptr_loc (const void *ptr, const char *filename, int lineno)
{
struct ptr_loc *loc;
position was set. */
const struct ptr_loc *
-rtx_reader::get_md_ptr_loc (const void *ptr)
+md_reader::get_md_ptr_loc (const void *ptr)
{
return (const struct ptr_loc *) htab_find (m_ptr_locs, &ptr);
}
/* Associate NEW_PTR with the same file position as OLD_PTR. */
void
-rtx_reader::copy_md_ptr_loc (const void *new_ptr, const void *old_ptr)
+md_reader::copy_md_ptr_loc (const void *new_ptr, const void *old_ptr)
{
const struct ptr_loc *loc = get_md_ptr_loc (old_ptr);
if (loc != 0)
directive for it to OUTF. */
void
-rtx_reader::fprint_md_ptr_loc (FILE *outf, const void *ptr)
+md_reader::fprint_md_ptr_loc (FILE *outf, const void *ptr)
{
const struct ptr_loc *loc = get_md_ptr_loc (ptr);
if (loc != 0)
/* Special fprint_md_ptr_loc for writing to STDOUT. */
void
-rtx_reader::print_md_ptr_loc (const void *ptr)
+md_reader::print_md_ptr_loc (const void *ptr)
{
fprint_md_ptr_loc (stdout, ptr);
}
may be null or empty. */
const char *
-rtx_reader::join_c_conditions (const char *cond1, const char *cond2)
+md_reader::join_c_conditions (const char *cond1, const char *cond2)
{
char *result;
const void **entry;
directive for COND if its original file position is known. */
void
-rtx_reader::fprint_c_condition (FILE *outf, const char *cond)
+md_reader::fprint_c_condition (FILE *outf, const char *cond)
{
const char **halves = (const char **) htab_find (m_joined_conditions, &cond);
if (halves != 0)
/* Special fprint_c_condition for writing to STDOUT. */
void
-rtx_reader::print_c_condition (const char *cond)
+md_reader::print_c_condition (const char *cond)
{
fprint_c_condition (stdout, cond);
}
va_start (ap, msg);
- fprintf (stderr, "%s:%d:%d: error: ", rtx_reader_ptr->get_filename (),
- rtx_reader_ptr->get_lineno (), rtx_reader_ptr->get_colno ());
+ fprintf (stderr, "%s:%d:%d: error: ", md_reader_ptr->get_filename (),
+ md_reader_ptr->get_lineno (),
+ md_reader_ptr->get_colno ());
vfprintf (stderr, msg, ap);
putc ('\n', stderr);
context[i] = '\0';
fprintf (stderr, "%s:%d:%d: note: following context is `%s'\n",
- rtx_reader_ptr->get_filename (), rtx_reader_ptr->get_lineno (),
- rtx_reader_ptr->get_colno (), context);
+ md_reader_ptr->get_filename (),
+ md_reader_ptr->get_lineno (),
+ md_reader_ptr->get_colno (), context);
va_end (ap);
exit (1);
EXPECTED. */
void
-rtx_reader::require_char (char expected)
+md_reader::require_char (char expected)
{
int ch = read_char ();
if (ch != expected)
character, issuing a fatal error if it is not EXPECTED. */
void
-rtx_reader::require_char_ws (char expected)
+md_reader::require_char_ws (char expected)
{
int ch = read_skip_spaces ();
if (ch != expected)
issuing a fatal error if it is not EXPECTED. */
void
-rtx_reader::require_word_ws (const char *expected)
+md_reader::require_word_ws (const char *expected)
{
struct md_name name;
read_name (&name);
/* Read the next character from the file. */
int
-rtx_reader::read_char (void)
+md_reader::read_char (void)
{
int ch;
/* Put back CH, which was the last character read from the file. */
void
-rtx_reader::unread_char (int ch)
+md_reader::unread_char (int ch)
{
if (ch == '\n')
{
/* Peek at the next character from the file without consuming it. */
int
-rtx_reader::peek_char (void)
+md_reader::peek_char (void)
{
int ch = read_char ();
unread_char (ch);
punctuation chars of rtx printed syntax. */
void
-rtx_reader::read_name (struct md_name *name)
+md_reader::read_name (struct md_name *name)
{
int c;
size_t i;
Caller has read the backslash, but not placed it into the obstack. */
void
-rtx_reader::read_escape ()
+md_reader::read_escape ()
{
int c = read_char ();
the leading quote. */
char *
-rtx_reader::read_quoted_string ()
+md_reader::read_quoted_string ()
{
int c;
the outermost braces _are_ included in the string constant. */
char *
-rtx_reader::read_braced_string ()
+md_reader::read_braced_string ()
{
int c;
int brace_depth = 1; /* caller-processed */
and dispatch to the appropriate string constant reader. */
char *
-rtx_reader::read_string (int star_if_braced)
+md_reader::read_string (int star_if_braced)
{
char *stringbuf;
int saw_paren = 0;
is currently nested by DEPTH levels of parentheses. */
void
-rtx_reader::read_skip_construct (int depth, file_location loc)
+md_reader::read_skip_construct (int depth, file_location loc)
{
struct md_name name;
int c;
after the "define_constants". */
void
-rtx_reader::handle_constants ()
+md_reader::handle_constants ()
{
int c;
htab_t defs;
Stop when CALLBACK returns zero. */
void
-rtx_reader::traverse_md_constants (htab_trav callback, void *info)
+md_reader::traverse_md_constants (htab_trav callback, void *info)
{
htab_traverse (get_md_constants (), callback, info);
}
directive is a define_enum rather than a define_c_enum. */
void
-rtx_reader::handle_enum (file_location loc, bool md_p)
+md_reader::handle_enum (file_location loc, bool md_p)
{
char *enum_name, *value_name;
struct md_name name;
/* Try to find the definition of the given enum. Return null on failure. */
struct enum_type *
-rtx_reader::lookup_enum_type (const char *name)
+md_reader::lookup_enum_type (const char *name)
{
return (struct enum_type *) htab_find (m_enum_types, &name);
}
returns zero. */
void
-rtx_reader::traverse_enum_types (htab_trav callback, void *info)
+md_reader::traverse_enum_types (htab_trav callback, void *info)
{
htab_traverse (m_enum_types, callback, info);
}
-/* Constructor for rtx_reader. */
+/* Constructor for md_reader. */
-rtx_reader::rtx_reader ()
+md_reader::md_reader ()
: m_toplevel_fname (NULL),
m_base_dir (NULL),
m_read_md_file (NULL),
m_last_dir_md_include_ptr (&m_first_dir_md_include)
{
/* Set the global singleton pointer. */
- rtx_reader_ptr = this;
+ md_reader_ptr = this;
obstack_init (&m_string_obstack);
unlock_std_streams ();
}
-/* rtx_reader's destructor. */
+/* md_reader's destructor. */
-rtx_reader::~rtx_reader ()
+md_reader::~md_reader ()
{
free (m_base_dir);
obstack_free (&m_string_obstack, NULL);
/* Clear the global singleton pointer. */
- rtx_reader_ptr = NULL;
+ md_reader_ptr = NULL;
}
/* Process an "include" directive, starting with the optional space
which the "include" occurred. */
void
-rtx_reader::handle_include (file_location loc)
+md_reader::handle_include (file_location loc)
{
const char *filename;
const char *old_filename;
unknown directives. */
void
-rtx_reader::handle_file ()
+md_reader::handle_file ()
{
struct md_name directive;
int c;
and m_base_dir accordingly. */
void
-rtx_reader::handle_toplevel_file ()
+md_reader::handle_toplevel_file ()
{
const char *base;
}
file_location
-rtx_reader::get_current_location () const
+md_reader::get_current_location () const
{
return file_location (m_read_md_filename, m_read_md_lineno, m_read_md_colno);
}
/* Parse a -I option with argument ARG. */
void
-rtx_reader::add_include_path (const char *arg)
+md_reader::add_include_path (const char *arg)
{
struct file_name_list *dirtmp;
generic error should be reported. */
bool
-rtx_reader::read_md_files (int argc, const char **argv,
- bool (*parse_opt) (const char *))
+md_reader::read_md_files (int argc, const char **argv,
+ bool (*parse_opt) (const char *))
{
int i;
bool no_more_options;
return !have_error;
}
-/* class noop_reader : public rtx_reader */
+/* class noop_reader : public md_reader */
/* A dummy implementation which skips unknown directives. */
void
unsigned int num_values;
};
-class rtx_reader
+/* A class for reading .md files and RTL dump files.
+
+ Implemented in read-md.c.
+
+ This class has responsibility for reading chars from input files, and
+ for certain common top-level directives including the "include"
+ directive.
+
+ It does not handle parsing the hierarchically-nested expressions of
+ rtl.def; for that see the rtx_reader subclass below (implemented in
+ read-rtl.c). */
+
+class md_reader
{
public:
- rtx_reader ();
- virtual ~rtx_reader ();
+ md_reader ();
+ virtual ~md_reader ();
bool read_md_files (int, const char **, bool (*) (const char *));
void record_potential_iterator_use (struct iterator_group *group,
void *ptr, const char *name);
struct mapping *read_mapping (struct iterator_group *group, htab_t table);
- bool read_rtx (const char *rtx_name, vec<rtx> *rtxen);
- rtx read_rtx_code (const char *code_name);
- void read_rtx_operand (rtx return_rtx, int idx);
- rtx read_nested_rtx ();
- rtx read_rtx_variadic (rtx form);
const char *get_top_level_filename () const { return m_toplevel_fname; }
const char *get_filename () const { return m_read_md_filename; }
htab_t m_enum_types;
};
-/* Global singleton. */
-extern rtx_reader *rtx_reader_ptr;
+/* Global singleton; constrast with rtx_reader_ptr below. */
+extern md_reader *md_reader_ptr;
-/* An rtx_reader subclass which skips unknown directives. */
+/* An md_reader subclass which skips unknown directives, for
+ the gen* tools that purely use read-md.o. */
-class noop_reader : public rtx_reader
+class noop_reader : public md_reader
{
public:
- noop_reader () : rtx_reader () {}
+ noop_reader () : md_reader () {}
/* A dummy implementation which skips unknown directives. */
void handle_unknown_directive (file_location, const char *);
};
+/* An md_reader subclass that actually handles full hierarchical
+ rtx expressions.
+
+ Implemented in read-rtl.c. */
+
+class rtx_reader : public md_reader
+{
+ public:
+ rtx_reader ();
+ ~rtx_reader ();
+
+ bool read_rtx (const char *rtx_name, vec<rtx> *rtxen);
+ rtx read_rtx_code (const char *code_name);
+ void read_rtx_operand (rtx return_rtx, int idx);
+ rtx read_nested_rtx ();
+ rtx read_rtx_variadic (rtx form);
+};
+
+/* Global singleton; constrast with md_reader_ptr above. */
+extern rtx_reader *rtx_reader_ptr;
+
extern void (*include_callback) (const char *);
/* Read the next character from the MD file. */
static inline int
read_char (void)
{
- return rtx_reader_ptr->read_char ();
+ return md_reader_ptr->read_char ();
}
/* Put back CH, which was the last character read from the MD file. */
static inline void
unread_char (int ch)
{
- rtx_reader_ptr->unread_char (ch);
+ md_reader_ptr->unread_char (ch);
}
extern hashval_t leading_string_hash (const void *);
static void validate_const_int (const char *);
+/* Global singleton. */
+rtx_reader *rtx_reader_ptr = NULL;
+
/* The mode and code iterator structures. */
static struct iterator_group modes, codes, ints, substs;
if any changes were needed, otherwise return STRING itself. */
const char *
-rtx_reader::apply_iterator_to_string (const char *string)
+md_reader::apply_iterator_to_string (const char *string)
{
char *base, *copy, *p, *start, *end;
struct map_value *v;
values into any strings. */
rtx
-rtx_reader::copy_rtx_for_iterators (rtx original)
+md_reader::copy_rtx_for_iterators (rtx original)
{
const char *format_ptr, *p;
int i, j;
slipped in at the beginning of the sequence of MD files read by
most of the other generators. */
void
-rtx_reader::read_conditions ()
+md_reader::read_conditions ()
{
int c;
callback. */
void
-rtx_reader::record_potential_iterator_use (struct iterator_group *group,
- void *ptr, const char *name)
+md_reader::record_potential_iterator_use (struct iterator_group *group,
+ void *ptr, const char *name)
{
struct mapping *m;
size_t len;
(which belongs to GROUP) and return it. */
struct mapping *
-rtx_reader::read_mapping (struct iterator_group *group, htab_t table)
+md_reader::read_mapping (struct iterator_group *group, htab_t table)
{
struct md_name name;
struct mapping *m;
return true;
}
- apply_iterators (read_rtx_code (rtx_name), rtxen);
+ apply_iterators (rtx_reader_ptr->read_rtx_code (rtx_name), rtxen);
iterator_uses.truncate (0);
attribute_uses.truncate (0);
{
char *stringbuf;
int star_if_braced;
+ struct obstack *string_obstack = get_string_obstack ();
c = read_skip_spaces ();
unread_char (c);
for (slash = fn; *slash; slash ++)
if (*slash == '/' || *slash == '\\' || *slash == ':')
fn = slash + 1;
- obstack_1grow (&m_string_obstack, '*');
- obstack_grow (&m_string_obstack, fn, strlen (fn));
+ obstack_1grow (string_obstack, '*');
+ obstack_grow (string_obstack, fn, strlen (fn));
sprintf (line_name, ":%d", get_lineno ());
- obstack_grow (&m_string_obstack, line_name, strlen (line_name)+1);
- stringbuf = XOBFINISH (&m_string_obstack, char *);
+ obstack_grow (string_obstack, line_name, strlen (line_name)+1);
+ stringbuf = XOBFINISH (string_obstack, char *);
}
/* Find attr-names in the string. */
unread_char (c);
return form;
}
+
+/* Constructor for class rtx_reader. */
+
+rtx_reader::rtx_reader ()
+: md_reader ()
+{
+ /* Set the global singleton pointer. */
+ rtx_reader_ptr = this;
+}
+
+/* Destructor for class rtx_reader. */
+
+rtx_reader::~rtx_reader ()
+{
+ /* Clear the global singleton pointer. */
+ rtx_reader_ptr = NULL;
+}