This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.

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.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]