Re: [PATCH] Fix build on darwin (was Re: [PATCH] gcc.c: Split up the driver's main into smaller functions)

2014-10-03 Thread Iain Sandoe
Hi David,

On 3 Oct 2014, at 20:15, David Malcolm wrote:

 On Fri, 2014-10-03 at 11:02 -0400, David Malcolm wrote:
 The main function for the driver in gcc.c has grown from ~200 lines
 in its original form (way back in r262) to ~1000 lines today, with a
 dozen locals (if we include the params).
 
 The following patch splits it up into 15 smaller functions, moving the
 various locals into the places where they're needed, so we can easily
 see e.g where argc/argv get read vs written.
 
 The functions are private methods of a new driver class to give an
 extra level of encapsualation beyond just being static in gcc.c, and so
 that we can hide some state as member data inside the driver instance.
 
 Turning them into named functions/methods also makes it easier to talk
 about the different phases of main, and put breakpoints on them.
 
 Bootstrappedregrtested on x86_64-unknown-linux-gnu (Fedora 20).
 
 OK for trunk?
 
 gcc/ChangeLog:
  * gcc.c (class driver): New class.
  (main): Reimplement in terms of driver::main, moving most of the
  locals to be locals within individual methods of class driver.
  The remaining locals explicit_link_files, decoded_options and
  decoded_options_count are used by multiple driver:: methods, and
  so become member data.  Doing so isolates the argc/argv reads and
  writes.  Replace goto out with a special exit code from
  new method driver::prepare_infiles.  Split out the old
  implementation of main into the following...
  (driver::main): New function, corresponding to the old main
  implementation.
  (driver::set_progname): New function, taken from the old
  main implementation.
  (driver::expand_at_files): Likewise.
  (driver::decode_argv): Likewise.
  (driver::global_initializations): Likewise.
  (driver::build_multilib_strings): Likewise.
  (driver::set_up_specs): Likewise.
  (driver::putenv_COLLECT_GCC): Likewise.
  (driver::maybe_putenv_COLLECT_LTO_WRAPPER): Likewise.
  (driver::handle_unrecognized_options): Likewise.
  (driver::maybe_print_and_exit): Likewise.
  (driver::prepare_infiles): Likewise.
  (driver::do_spec_on_infiles): Likewise.
  (driver::maybe_run_linker): Likewise.
  (driver::final_actions): Likewise.
  (driver::get_exit_code): Likewise.
 
 I committed this as r215861 after the approval, but it turns out to
 break the build of trunk's gcc.c on darwin, due to the const on
 driver::global_initializations preventing GCC_DRIVER_HOST_INITIALIZATION
 from modifying decoded_options_count and decoded_options:
 
 In file included from ./tm.h:16:0,
 from ../../src/gcc/gcc.c:34:
 ../../src/gcc/gcc.c: In member function ‘void 
 driver::global_initializations() const’:
 ../../src/gcc/config/darwin.h:911:63: error: invalid conversion from ‘const 
 unsigned int*’ to ‘unsigned int*’ [-fpermissive]
   darwin_driver_init (decoded_options_count, decoded_options)
   ^
 ../../src/gcc/gcc.c:6862:3: note: in expansion of macro 
 ‘GCC_DRIVER_HOST_INITIALIZATION’
   GCC_DRIVER_HOST_INITIALIZATION;
   ^
 ../../src/gcc/config/darwin.h:911:63: error: invalid conversion from 
 ‘cl_decoded_option* const*’ to ‘cl_decoded_option**’ [-fpermissive]
   darwin_driver_init (decoded_options_count, decoded_options)
   ^
 ../../src/gcc/gcc.c:6862:3: note: in expansion of macro 
 ‘GCC_DRIVER_HOST_INITIALIZATION’
   GCC_DRIVER_HOST_INITIALIZATION;
   ^
 
 The attached patch appears to fix it; with it, gcc.c compiles (in a
 simple smoketest of make gcc.o in stage1 with
 --target=powerpc64-darwin).
 
 Am bootstrapping it on x86_64, fwiw; iains [CCed] said on IRC that he's
 attempting a bootstrap with it.

Works for me (and seems, as you said on irc, retrospectively obvious)
thanks!
Iain

 
 Sorry about the breakage.
 
 gcc/ChangeLog:
   * gcc.c (driver::global_initializations): Remove const so
   that GCC_DRIVER_HOST_INITIALIZATION can modify decoded_options
   and decoded_options_count.
 
 fix-darwin.patch



Re: [PATCH] Fix build on darwin (was Re: [PATCH] gcc.c: Split up the driver's main into smaller functions)

2014-10-03 Thread Jeff Law

On 10/03/14 13:15, David Malcolm wrote:

On Fri, 2014-10-03 at 11:02 -0400, David Malcolm wrote:

The main function for the driver in gcc.c has grown from ~200 lines
in its original form (way back in r262) to ~1000 lines today, with a
dozen locals (if we include the params).

The following patch splits it up into 15 smaller functions, moving the
various locals into the places where they're needed, so we can easily
see e.g where argc/argv get read vs written.

The functions are private methods of a new driver class to give an
extra level of encapsualation beyond just being static in gcc.c, and so
that we can hide some state as member data inside the driver instance.

Turning them into named functions/methods also makes it easier to talk
about the different phases of main, and put breakpoints on them.

Bootstrappedregrtested on x86_64-unknown-linux-gnu (Fedora 20).

OK for trunk?

gcc/ChangeLog:
* gcc.c (class driver): New class.
(main): Reimplement in terms of driver::main, moving most of the
locals to be locals within individual methods of class driver.
The remaining locals explicit_link_files, decoded_options and
decoded_options_count are used by multiple driver:: methods, and
so become member data.  Doing so isolates the argc/argv reads and
writes.  Replace goto out with a special exit code from
new method driver::prepare_infiles.  Split out the old
implementation of main into the following...
(driver::main): New function, corresponding to the old main
implementation.
(driver::set_progname): New function, taken from the old
main implementation.
(driver::expand_at_files): Likewise.
(driver::decode_argv): Likewise.
(driver::global_initializations): Likewise.
(driver::build_multilib_strings): Likewise.
(driver::set_up_specs): Likewise.
(driver::putenv_COLLECT_GCC): Likewise.
(driver::maybe_putenv_COLLECT_LTO_WRAPPER): Likewise.
(driver::handle_unrecognized_options): Likewise.
(driver::maybe_print_and_exit): Likewise.
(driver::prepare_infiles): Likewise.
(driver::do_spec_on_infiles): Likewise.
(driver::maybe_run_linker): Likewise.
(driver::final_actions): Likewise.
(driver::get_exit_code): Likewise.


I committed this as r215861 after the approval, but it turns out to
break the build of trunk's gcc.c on darwin, due to the const on
driver::global_initializations preventing GCC_DRIVER_HOST_INITIALIZATION
from modifying decoded_options_count and decoded_options:

In file included from ./tm.h:16:0,
  from ../../src/gcc/gcc.c:34:
../../src/gcc/gcc.c: In member function ‘void driver::global_initializations() 
const’:
../../src/gcc/config/darwin.h:911:63: error: invalid conversion from ‘const 
unsigned int*’ to ‘unsigned int*’ [-fpermissive]
darwin_driver_init (decoded_options_count, decoded_options)
^
../../src/gcc/gcc.c:6862:3: note: in expansion of macro 
‘GCC_DRIVER_HOST_INITIALIZATION’
GCC_DRIVER_HOST_INITIALIZATION;
^
../../src/gcc/config/darwin.h:911:63: error: invalid conversion from 
‘cl_decoded_option* const*’ to ‘cl_decoded_option**’ [-fpermissive]
darwin_driver_init (decoded_options_count, decoded_options)
^
../../src/gcc/gcc.c:6862:3: note: in expansion of macro 
‘GCC_DRIVER_HOST_INITIALIZATION’
GCC_DRIVER_HOST_INITIALIZATION;
^

The attached patch appears to fix it; with it, gcc.c compiles (in a
simple smoketest of make gcc.o in stage1 with
--target=powerpc64-darwin).

Am bootstrapping it on x86_64, fwiw; iains [CCed] said on IRC that he's
attempting a bootstrap with it.

Sorry about the breakage.

gcc/ChangeLog:
* gcc.c (driver::global_initializations): Remove const so
that GCC_DRIVER_HOST_INITIALIZATION can modify decoded_options
and decoded_options_count.

OK.
jeff