Patchwork [buildbot] r201508: Build failures after pass C++ conversion

login
register
mail settings
Submitter David Malcolm
Date Aug. 6, 2013, 9:23 p.m.
Message ID <1375824206.5818.24.camel@surprise>
Download mbox | patch
Permalink /patch/265245/
State New
Headers show

Comments

David Malcolm - Aug. 6, 2013, 9:23 p.m.
On Tue, 2013-08-06 at 10:34 -1000, Richard Henderson wrote:
> On 08/06/2013 06:06 AM, David Malcolm wrote:
> > Index: gcc/config/epiphany/epiphany.h
> > ===================================================================
> > --- gcc/config/epiphany/epiphany.h	(revision 201526)
> > +++ gcc/config/epiphany/epiphany.h	(working copy)
> > @@ -929,6 +929,9 @@
> >  };
> >  
> >  extern int epiphany_normal_fp_rounding;
> > +
> > +class rtl_opt_pass;
> > +namespace gcc { class context; }
> >  extern rtl_opt_pass *make_pass_mode_switch_use (gcc::context *ctxt);
> >  extern rtl_opt_pass *make_pass_resolve_sw_modes (gcc::context *ctxt);
> 
> Looks like these definitions ought to go into coretypes.h.

Something like the attached, putting them in the
   #ifndef USED_FOR_TARGET
part?   (this passes the same light testing as on the first patch;
bootstrap of the first patch succeeded on x86_64; am now bootstrapping
the attached patch on x86_64).
Richard Henderson - Aug. 6, 2013, 10:49 p.m.
On 08/06/2013 11:23 AM, David Malcolm wrote:
>     gcc/
>     	* coretypes.h (rtl_opt_pass): Add.
>     	(gcc::context): Add.
>     	* config/epiphany/epiphany.c (pass_mode_switch_use): New.
>     	(epiphany_init): Port to new C++ pass API.
>     	(epiphany_optimize_mode_switching): Likewise.
>     	* pass_manager.h (pass_manager::get_pass_split_all_insns): New.
>     	(pass_manager::get_pass_mode_switching): New.
>     	(pass_manager::get_pass_peephole2): New.
>     	* mode-switching.c (pass_mode_switching): Add clone method.
>     	* recog.c (pass_peephole2): Add clone method.
>     	(pass_split_all_insns): Add clone method.

Ok.


r~
David Malcolm - Aug. 7, 2013, 1:17 a.m.
On Tue, 2013-08-06 at 12:49 -1000, Richard Henderson wrote:
> On 08/06/2013 11:23 AM, David Malcolm wrote:
> >     gcc/
> >     	* coretypes.h (rtl_opt_pass): Add.
> >     	(gcc::context): Add.
> >     	* config/epiphany/epiphany.c (pass_mode_switch_use): New.
> >     	(epiphany_init): Port to new C++ pass API.
> >     	(epiphany_optimize_mode_switching): Likewise.
> >     	* pass_manager.h (pass_manager::get_pass_split_all_insns): New.
> >     	(pass_manager::get_pass_mode_switching): New.
> >     	(pass_manager::get_pass_peephole2): New.
> >     	* mode-switching.c (pass_mode_switching): Add clone method.
> >     	* recog.c (pass_peephole2): Add clone method.
> >     	(pass_split_all_insns): Add clone method.
> 
> Ok.
Thanks.

Committed to trunk as r201549 (I saw some missing spaces between parens
after a successful boostrap/test on x86_64, which I fixed, and then
verified a clean build with --target=epiphany-elf before committing).
Andreas Schwab - Aug. 7, 2013, 7:01 a.m.
David Malcolm <dmalcolm@redhat.com> writes:

> diff --git a/gcc/coretypes.h b/gcc/coretypes.h
> index edb9c8c..54bfe7f 100644
> --- a/gcc/coretypes.h
> +++ b/gcc/coretypes.h
> @@ -169,6 +169,12 @@ typedef const struct basic_block_def *const_basic_block;
>     in target.h.  */
>  typedef int reg_class_t;
>  
> +class rtl_opt_pass;
> +
> +namespace gcc {
> +  class context;
> +}
> +

This break Ada.

../../xgcc -B../../ -c -DIN_GCC  -DUSE_LIBUNWIND_EXCEPTIONS -O2 -g -W -Wall  \
		-iquote /usr/local/gcc/gcc-20130807/gcc \
		 -iquote . -iquote .. -iquote ../.. -iquote /usr/local/gcc/gcc-20130807/gcc/ada -iquote /usr/local/gcc/gcc-20130807/gcc -I/usr/local/gcc/gcc-20130807/gcc/../include -I/usr/local/gcc/gcc-20130807/Build/./gmp -I/usr/local/gcc/gcc-20130807/gmp -I/usr/local/gcc/gcc-20130807/Build/./mpfr -I/usr/local/gcc/gcc-20130807/mpfr -I/usr/local/gcc/gcc-20130807/mpc/src  \
		../rts/targext.c -o targext.o
In file included from ../rts/targext.c:45:0:
/usr/local/gcc/gcc-20130807/gcc/coretypes.h:172:1: error: unknown type name 'class'
 class rtl_opt_pass;
 ^
/usr/local/gcc/gcc-20130807/gcc/coretypes.h:174:1: error: unknown type name 'namespace'
 namespace gcc {
 ^
/usr/local/gcc/gcc-20130807/gcc/coretypes.h:174:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 namespace gcc {
               ^
make[3]: *** [targext.o] Error 1

Andreas.

Patch

commit f5d8960c711540d28be2fd923d65838cb88b34f5
Author: David Malcolm <dmalcolm@redhat.com>
Date:   Tue Aug 6 12:41:31 2013 -0400

    gcc/
    	* coretypes.h (rtl_opt_pass): Add.
    	(gcc::context): Add.
    	* config/epiphany/epiphany.c (pass_mode_switch_use): New.
    	(epiphany_init): Port to new C++ pass API.
    	(epiphany_optimize_mode_switching): Likewise.
    	* pass_manager.h (pass_manager::get_pass_split_all_insns): New.
    	(pass_manager::get_pass_mode_switching): New.
    	(pass_manager::get_pass_peephole2): New.
    	* mode-switching.c (pass_mode_switching): Add clone method.
    	* recog.c (pass_peephole2): Add clone method.
    	(pass_split_all_insns): Add clone method.

diff --git a/gcc/config/epiphany/epiphany.c b/gcc/config/epiphany/epiphany.c
index 1dcdc4b..5d020bb 100644
--- a/gcc/config/epiphany/epiphany.c
+++ b/gcc/config/epiphany/epiphany.c
@@ -45,6 +45,8 @@  along with GCC; see the file COPYING3.  If not see
 #include "ggc.h"
 #include "tm-constrs.h"
 #include "tree-pass.h"	/* for current_pass */
+#include "context.h"
+#include "pass_manager.h"
 
 /* Which cpu we're compiling for.  */
 int epiphany_cpu_type;
@@ -59,6 +61,9 @@  char epiphany_punct_chars[256];
 /* The rounding mode that we generally use for floating point.  */
 int epiphany_normal_fp_rounding;
 
+/* The pass instance, for use in epiphany_optimize_mode_switching. */
+static opt_pass *pass_mode_switch_use;
+
 static void epiphany_init_reg_tables (void);
 static int get_epiphany_condition_code (rtx);
 static tree epiphany_handle_interrupt_attribute (tree *, tree, tree, int, bool *);
@@ -165,20 +170,24 @@  epiphany_init (void)
      pass because of the side offect of epiphany_mode_needed on
      MACHINE_FUNCTION(cfun)->unknown_mode_uses.  But it must run before
      pass_resolve_sw_modes.  */
-  static struct register_pass_info insert_use_info
-    = { &pass_mode_switch_use.pass, "mode_sw",
+  pass_mode_switch_use = make_pass_mode_switch_use (g);
+  struct register_pass_info insert_use_info
+    = { pass_mode_switch_use, "mode_sw",
 	1, PASS_POS_INSERT_AFTER
       };
-  static struct register_pass_info mode_sw2_info
-    = { &pass_mode_switching.pass, "mode_sw",
+  opt_pass *mode_sw2 = g->get_passes()->get_pass_mode_switching()->clone ();
+  struct register_pass_info mode_sw2_info
+    = { mode_sw2, "mode_sw",
 	1, PASS_POS_INSERT_AFTER
       };
-  static struct register_pass_info mode_sw3_info
-    = { &pass_resolve_sw_modes.pass, "mode_sw",
+  opt_pass *mode_sw3 = make_pass_resolve_sw_modes (g);
+  struct register_pass_info mode_sw3_info
+    = { mode_sw3, "mode_sw",
 	1, PASS_POS_INSERT_AFTER
       };
-  static struct register_pass_info mode_sw4_info
-    = { &pass_split_all_insns.pass, "mode_sw",
+  opt_pass *mode_sw4 = g->get_passes()->get_pass_split_all_insns()->clone ();
+  struct register_pass_info mode_sw4_info
+    = { mode_sw4, "mode_sw",
 	1, PASS_POS_INSERT_AFTER
       };
   static const int num_modes[] = NUM_MODES_FOR_MODE_SWITCHING;
@@ -205,8 +214,10 @@  epiphany_init (void)
          (see http://gcc.gnu.org/ml/gcc-patches/2011-10/msg02819.html,)
          we need a second peephole2 pass to get reasonable code.  */
   {
-    static struct register_pass_info peep2_2_info
-      = { &pass_peephole2.pass, "peephole2",
+    opt_pass *extra_peephole2
+      = g->get_passes ()->get_pass_peephole2()->clone ();
+    struct register_pass_info peep2_2_info
+      = { extra_peephole2, "peephole2",
 	  1, PASS_POS_INSERT_AFTER
 	};
 
@@ -2256,7 +2267,7 @@  epiphany_optimize_mode_switching (int entity)
       return (MACHINE_FUNCTION (cfun)->sw_entities_processed
 	      & (1 << EPIPHANY_MSW_ENTITY_ROUND_UNKNOWN)) != 0;
     case EPIPHANY_MSW_ENTITY_FPU_OMNIBUS:
-      return optimize == 0 || current_pass == &pass_mode_switch_use.pass;
+      return optimize == 0 || current_pass == pass_mode_switch_use;
     }
   gcc_unreachable ();
 }
diff --git a/gcc/coretypes.h b/gcc/coretypes.h
index edb9c8c..54bfe7f 100644
--- a/gcc/coretypes.h
+++ b/gcc/coretypes.h
@@ -169,6 +169,12 @@  typedef const struct basic_block_def *const_basic_block;
    in target.h.  */
 typedef int reg_class_t;
 
+class rtl_opt_pass;
+
+namespace gcc {
+  class context;
+}
+
 #else
 
 struct _dont_use_rtx_here_;
diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c
index c941eb1..56c4d0f 100644
--- a/gcc/mode-switching.c
+++ b/gcc/mode-switching.c
@@ -809,6 +809,9 @@  public:
   {}
 
   /* opt_pass methods: */
+  /* The epiphany backend creates a second instance of this pass, so we need
+     a clone method.  */
+  opt_pass * clone () { return new pass_mode_switching (ctxt_); }
   bool gate () { return gate_mode_switching (); }
   unsigned int execute () { return rest_of_handle_mode_switching (); }
 
diff --git a/gcc/pass_manager.h b/gcc/pass_manager.h
index 00f0b1c..41d2c76 100644
--- a/gcc/pass_manager.h
+++ b/gcc/pass_manager.h
@@ -66,6 +66,15 @@  public:
   void execute_early_local_passes ();
   unsigned int execute_pass_mode_switching ();
 
+  /* Various passes are manually cloned by epiphany. */
+  opt_pass *get_pass_split_all_insns () const {
+    return pass_split_all_insns_1;
+  }
+  opt_pass *get_pass_mode_switching () const {
+    return pass_mode_switching_1;
+  }
+  opt_pass *get_pass_peephole2 () const { return pass_peephole2_1; }
+
 public:
   /* The root of the compilation pass tree, once constructed.  */
   opt_pass *all_passes;
diff --git a/gcc/recog.c b/gcc/recog.c
index 352fbac..2d44416 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -3803,6 +3803,9 @@  public:
   {}
 
   /* opt_pass methods: */
+  /* The epiphany backend creates a second instance of this pass, so we need
+     a clone method.  */
+  opt_pass * clone () { return new pass_peephole2 (ctxt_); }
   bool gate () { return gate_handle_peephole2 (); }
   unsigned int execute () { return rest_of_handle_peephole2 (); }
 
@@ -3848,6 +3851,9 @@  public:
   {}
 
   /* opt_pass methods: */
+  /* The epiphany backend creates a second instance of this pass, so
+     we need a clone method.  */
+  opt_pass * clone () { return new pass_split_all_insns (ctxt_); }
   unsigned int execute () { return rest_of_handle_split_all_insns (); }
 
 }; // class pass_split_all_insns