From patchwork Tue Aug 6 16:06:24 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Malcolm X-Patchwork-Id: 265096 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 026CE2C0BF7 for ; Wed, 7 Aug 2013 02:06:43 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:subject:from:to:cc:date:in-reply-to:references :content-type:mime-version; q=dns; s=default; b=D7p5gqJ40SBwHaiL +savOehUYd59vQ3vCRAyLjbK4ODLdzPQyy6S8FQ2hDugPc0rih7Gk6/TWKAqu0vm FGHwOYxkx6Tsz4x4801fm8Hh8fBNrA2hVEA7XPDzWdj07M/Vp3N4RFOyDJYJ3yj+ 7PTNF1y1/U6RWqjJ8UmzSASh/U8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:subject:from:to:cc:date:in-reply-to:references :content-type:mime-version; s=default; bh=VV+tYhEBYbQJxEN3Z5l8JS c3+tA=; b=sNGOHYdwkexs720UJO+yJ9c+EbUT6gqpBKZ8YqyCqf+l4lStYCMz7p 4P860urrBUEHsSaVuhMqWPj3SHxNtVXkJhrANuMKVGhmn671aUqm7MsIrQ8w9/nu QKqMWhnImRKDREaqnf/HCtUBZ6pLhTzIiZPH/lqad00F0ub3dEpH8= Received: (qmail 24369 invoked by alias); 6 Aug 2013 16:06:35 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 24340 invoked by uid 89); 6 Aug 2013 16:06:34 -0000 X-Spam-SWARE-Status: No, score=-5.4 required=5.0 tests=AWL, BAYES_00, KHOP_THREADED, RCVD_IN_HOSTKARMA_W, RCVD_IN_HOSTKARMA_WL, RDNS_NONE, SPF_HELO_PASS, SPF_PASS autolearn=no version=3.3.1 Received: from Unknown (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Tue, 06 Aug 2013 16:06:33 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r76G6QYn016308 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 Aug 2013 12:06:26 -0400 Received: from [10.18.25.132] ([10.18.25.132]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r76G6Prw031749; Tue, 6 Aug 2013 12:06:25 -0400 Message-ID: <1375805184.1954.15.camel@surprise> Subject: Re: [buildbot] r201508: Build failures after pass C++ conversion From: David Malcolm To: Jan-Benedict Glaw Cc: gcc-patches@gcc.gnu.org Date: Tue, 06 Aug 2013 12:06:24 -0400 In-Reply-To: <20130806111256.GA16320@lug-owl.de> References: <20130805201605.1748.qmail@sourceware.org> <20130806111256.GA16320@lug-owl.de> Mime-Version: 1.0 X-Virus-Found: No On Tue, 2013-08-06 at 13:12 +0200, Jan-Benedict Glaw wrote: > On Mon, 2013-08-05 20:16:05 -0000, dmalcolm@gcc.gnu.org wrote: > > New Revision: 201508 > > > > URL: http://gcc.gnu.org/viewcvs?rev=201508&root=gcc&view=rev > > Log: > > Automated conversion of passes to C++ classes > > > > gcc/ > > > > Patch autogenerated by refactor_passes.py from > > https://github.com/davidmalcolm/gcc-refactoring-scripts > > revision 03fe39476a4c4ea450b49e087cfa817b5f92021e > > I see quite some fall-out from this on epiphany-elf: > > g++ -c -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common -DHAVE_CONFIG_H -DGENERATOR_FILE -I. -Ibuild -I../../../../gcc/gcc -I../../../../gcc/gcc/build -I../../../../gcc/gcc/../include -I../../../../gcc/gcc/../libcpp/include -I../../../../gcc/gcc/../libdecnumber -I../../../../gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../../../../gcc/gcc/../libbacktrace \ > -o build/genflags.o ../../../../gcc/gcc/genflags.c > In file included from ./tm.h:21:0, > from ../../../../gcc/gcc/genflags.c:26: > ../../../../gcc/gcc/config/epiphany/epiphany.h:932:8: error: ‘rtl_opt_pass’ does not name a type > extern rtl_opt_pass *make_pass_mode_switch_use (gcc::context *ctxt); > ^ > ../../../../gcc/gcc/config/epiphany/epiphany.h:933:8: error: ‘rtl_opt_pass’ does not name a type > extern rtl_opt_pass *make_pass_resolve_sw_modes (gcc::context *ctxt); > ^ Sorry about this, clearly I failed to test the target-specific passes. epiphany_init does some interesting manipulation of passes. I don't have epiphany hardware, but I've reproduced the build failure on my x86_64 box using --configure target=epiphany-elf, and the attached patch ports it to the new API. With this patch, stage 1 was able to build, and cc1 seems to generate assembler on a trivial test. I was able to step through epiphany_init's pass manipulation, and it appears to be doing the right thing. This does add two new headers to epiphany.c; I'm not seeing where to add the deps (gcc/config/epiphany/t-epiphany doesn't list epiphany.o). I'm kicking off a bootstrap of this (on x86_64) to further verify that the non-epiphany changes are good. What other testing can I do to verify this? gcc/ * config/epiphany/epiphany.c (pass_mode_switch_use): New. (epiphany_init): Port to new C++ pass API. (epiphany_optimize_mode_switching): Likewise. * config/epiphany/epiphany.h: 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. Sorry again about this. Index: gcc/mode-switching.c =================================================================== --- gcc/mode-switching.c (revision 201526) +++ gcc/mode-switching.c (working copy) @@ -809,6 +809,9 @@ {} /* 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 (); } Index: gcc/config/epiphany/epiphany.c =================================================================== --- gcc/config/epiphany/epiphany.c (revision 201526) +++ gcc/config/epiphany/epiphany.c (working copy) @@ -45,6 +45,8 @@ #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 @@ /* 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 @@ 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 @@ (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 @@ 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 (); } 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); Index: gcc/pass_manager.h =================================================================== --- gcc/pass_manager.h (revision 201526) +++ gcc/pass_manager.h (working copy) @@ -66,6 +66,15 @@ 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; Index: gcc/recog.c =================================================================== --- gcc/recog.c (revision 201526) +++ gcc/recog.c (working copy) @@ -3803,6 +3803,9 @@ {} /* 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 @@ {} /* 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