From f8aa9ed5e3f95c627602db07734578358b30cd95 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm@redhat.com>
Date: Tue, 4 Oct 2016 12:51:50 -0400
Subject: [PATCH 13/18] FIXME: Split class rtx_reader into md_reader vs
 rtx_reader

FIXME: ChangeLog needs updating

This moves read_rtx and friends into rtx_reader, and splits
rtx_reader into two classes:

class md_reader: has responsibility for reading chars, managing
include files, top-level directives etc.  It is the read-md.o part.

class rtx_reader, a subclass, has the code for reading hierarchical
rtx expressions using the format codes.   It is the read-rtl.o part.

This split is needed by a followup patch, which converts
read_rtx_operand to a virtual function of rtx_reader.  To do this,
instances of rtx_reader (or its subclasses) need a vtable, which
needs to include a ptr to the code in read-rtl.o.  Splitting it up
allows the gen* tools that currently purely use read-md.o to continue
to do so.

gcc/ChangeLog:
	* 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 *.
	(fatal_with_file_and_line): Update for renaming of
	rtx_reader_ptr to md_reader_ptr.
	(rtx_reader::read_char): Rename to...
	(md_reader::read_char):... this.
	(rtx_reader::unread_char): Rename to...
	(md_reader::unread_char):... this.
	(read_escape): Update for renaming of rtx_reader_ptr to
	md_reader_ptr.
	(read_braced_string): Likewise.
	(read_string): Likewise.
	(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 (struct enum_type {): Likewise.
	(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.
	(read_rtx): Use rtx_reader_ptr when calling read_rtx_code.
	(read_rtx_code): Convert to...
	(rtx_reader::read_rtx_code): ...this method.
	(read_rtx_operand): Convert to...
	(rtx_reader::read_rtx_operand): ...this method, eliminating use of
	rtx_reader_ptr singleton.  Convert return type from void to rtx,
	and return input.
	(read_nested_rtx): Convert to...
	(rtx_reader::read_nested_rtx): ...this method.
	(read_rtx_variadic): Convert to...
	(rtx_reader::read_rtx_variadic): ...this method.
	(rtx_reader::rtx_reader): New ctor.
	(rtx_reader::~rtx_reader): New dtor.
---
 gcc/genpreds.c |  6 ++--
 gcc/read-md.c  | 92 ++++++++++++++++++++++++++++++----------------------------
 gcc/read-md.h  | 59 +++++++++++++++++++++++++++----------
 gcc/read-rtl.c | 43 ++++++++++++++++++++-------
 4 files changed, 126 insertions(+), 74 deletions(-)

diff --git a/gcc/genpreds.c b/gcc/genpreds.c
index c5d597c..58e9238 100644
--- a/gcc/genpreds.c
+++ b/gcc/genpreds.c
@@ -1205,7 +1205,7 @@ write_tm_constrs_h (void)
   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\
@@ -1405,7 +1405,7 @@ write_tm_preds_h (void)
   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\
@@ -1555,7 +1555,7 @@ write_insn_preds_c (void)
   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\
diff --git a/gcc/read-md.c b/gcc/read-md.c
index e5f352e..824b772 100644
--- a/gcc/read-md.c
+++ b/gcc/read-md.c
@@ -39,7 +39,7 @@ void (*include_callback) (const char *);
 
 /* 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.  */
@@ -79,7 +79,7 @@ leading_ptr_eq_p (const void *def1, const void *def2)
 /* 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;
 
@@ -95,7 +95,7 @@ rtx_reader::set_md_ptr_loc (const void *ptr, const char *filename, int lineno)
    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);
 }
@@ -103,7 +103,7 @@ rtx_reader::get_md_ptr_loc (const void *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)
@@ -114,7 +114,7 @@ rtx_reader::copy_md_ptr_loc (const void *new_ptr, const void *old_ptr)
    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)
@@ -123,7 +123,7 @@ rtx_reader::fprint_md_ptr_loc (FILE *outf, const void *ptr)
 
 /* 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);
 }
@@ -132,7 +132,7 @@ rtx_reader::print_md_ptr_loc (const void *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;
@@ -161,7 +161,7 @@ rtx_reader::join_c_conditions (const char *cond1, const char *cond2)
    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)
@@ -183,7 +183,7 @@ rtx_reader::fprint_c_condition (FILE *outf, const char *cond)
 /* 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);
 }
@@ -250,8 +250,9 @@ fatal_with_file_and_line (const char *msg, ...)
 
   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);
 
@@ -271,8 +272,9 @@ fatal_with_file_and_line (const char *msg, ...)
   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);
@@ -344,7 +346,7 @@ read_skip_spaces (void)
    EXPECTED.  */
 
 void
-rtx_reader::require_char (char expected)
+md_reader::require_char (char expected)
 {
   int ch = read_char ();
   if (ch != expected)
@@ -355,7 +357,7 @@ rtx_reader::require_char (char 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)
@@ -366,10 +368,10 @@ rtx_reader::require_char_ws (char 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;
-  rtx_reader_ptr->read_name (&name);
+  md_reader_ptr->read_name (&name);
   if (strcmp (name.string, expected))
     fatal_with_file_and_line ("missing '%s'", expected);
 }
@@ -377,7 +379,7 @@ rtx_reader::require_word_ws (const char *expected)
 /* Read the next character from the file.  */
 
 int
-rtx_reader::read_char (void)
+md_reader::read_char (void)
 {
   int ch;
 
@@ -397,7 +399,7 @@ rtx_reader::read_char (void)
 /* 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')
     {
@@ -412,7 +414,7 @@ rtx_reader::unread_char (int ch)
 /* 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);
@@ -423,7 +425,7 @@ rtx_reader::peek_char (void)
    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;
@@ -489,7 +491,7 @@ rtx_reader::read_name (struct md_name *name)
    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 ();
 
@@ -542,7 +544,7 @@ rtx_reader::read_escape ()
    the leading quote.  */
 
 char *
-rtx_reader::read_quoted_string ()
+md_reader::read_quoted_string ()
 {
   int c;
 
@@ -569,7 +571,7 @@ rtx_reader::read_quoted_string ()
    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 */
@@ -606,7 +608,7 @@ rtx_reader::read_braced_string ()
    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;
@@ -642,7 +644,7 @@ rtx_reader::read_string (int star_if_braced)
    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;
@@ -784,7 +786,7 @@ add_constant (htab_t defs, char *name, char *value,
    after the "define_constants".  */
 
 void
-rtx_reader::handle_constants ()
+md_reader::handle_constants ()
 {
   int c;
   htab_t defs;
@@ -815,7 +817,7 @@ rtx_reader::handle_constants ()
    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);
 }
@@ -838,7 +840,7 @@ md_decimal_string (int number)
    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;
@@ -904,7 +906,7 @@ rtx_reader::handle_enum (file_location loc, bool md_p)
 /* 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);
 }
@@ -914,15 +916,15 @@ rtx_reader::lookup_enum_type (const char *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),
@@ -933,7 +935,7 @@ rtx_reader::rtx_reader ()
   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);
 
@@ -953,9 +955,9 @@ rtx_reader::rtx_reader ()
   unlock_std_streams ();
 }
 
-/* rtx_reader's destructor.  */
+/* md_reader's destructor.  */
 
-rtx_reader::~rtx_reader ()
+md_reader::~md_reader ()
 {
   free (m_base_dir);
 
@@ -972,7 +974,7 @@ rtx_reader::~rtx_reader ()
   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
@@ -981,7 +983,7 @@ rtx_reader::~rtx_reader ()
    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;
@@ -1059,7 +1061,7 @@ rtx_reader::handle_include (file_location loc)
    unknown directives.  */
 
 void
-rtx_reader::handle_file ()
+md_reader::handle_file ()
 {
   struct md_name directive;
   int c;
@@ -1093,7 +1095,7 @@ rtx_reader::handle_file ()
    and m_base_dir accordingly.  */
 
 void
-rtx_reader::handle_toplevel_file ()
+md_reader::handle_toplevel_file ()
 {
   const char *base;
 
@@ -1108,7 +1110,7 @@ rtx_reader::handle_toplevel_file ()
 }
 
 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);
 }
@@ -1116,7 +1118,7 @@ rtx_reader::get_current_location () const
 /* 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;
 
@@ -1137,8 +1139,8 @@ rtx_reader::add_include_path (const char *arg)
    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;
@@ -1233,7 +1235,7 @@ rtx_reader::read_md_files (int argc, const char **argv,
   return !have_error;
 }
 
-/* class noop_reader : public rtx_reader */
+/* class noop_reader : public md_reader */
 
 /* A dummy implementation which skips unknown directives.  */
 void
diff --git a/gcc/read-md.h b/gcc/read-md.h
index 06b89b4..27fc9c2 100644
--- a/gcc/read-md.h
+++ b/gcc/read-md.h
@@ -91,11 +91,23 @@ struct enum_type {
   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 *));
 
@@ -145,11 +157,6 @@ class rtx_reader
   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; }
@@ -231,20 +238,42 @@ class rtx_reader
   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.  */
@@ -252,7 +281,7 @@ extern void (*include_callback) (const char *);
 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.  */
@@ -260,7 +289,7 @@ read_char (void)
 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 *);
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c
index 7a2021a..f74c875 100644
--- a/gcc/read-rtl.c
+++ b/gcc/read-rtl.c
@@ -107,6 +107,9 @@ const char *current_iterator_name;
 
 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;
 
@@ -326,7 +329,7 @@ map_attr_string (const char *p)
    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;
@@ -365,7 +368,7 @@ rtx_reader::apply_iterator_to_string (const char *string)
    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;
@@ -735,7 +738,7 @@ atoll (const char *p)
    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;
 
@@ -834,8 +837,8 @@ record_attribute_use (struct iterator_group *group, void *ptr,
    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;
@@ -869,7 +872,7 @@ rtx_reader::record_potential_iterator_use (struct iterator_group *group,
    (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;
@@ -1072,7 +1075,7 @@ rtx_reader::read_rtx (const char *rtx_name, vec<rtx> *rtxen)
       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);
 
@@ -1270,6 +1273,7 @@ rtx_reader::read_rtx_operand (rtx return_rtx, int idx)
       {
 	char *stringbuf;
 	int star_if_braced;
+	struct obstack *string_obstack = get_string_obstack ();
 
 	c = read_skip_spaces ();
 	unread_char (c);
@@ -1306,11 +1310,11 @@ rtx_reader::read_rtx_operand (rtx return_rtx, int idx)
 	    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.  */
@@ -1447,3 +1451,20 @@ rtx_reader::read_rtx_variadic (rtx form)
   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;
+}
-- 
1.8.5.3

