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.
>> 
>> Bootstrapped&regrtested 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>

Reply via email to