aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcc.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2015-02-03 17:19:58 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2015-02-03 17:19:58 +0000
commit2cb844ce9cf37fdd75438e27b515371ad1f71405 (patch)
tree8dfc1a700bed24b907d6f4da60e4d204beb6bd55 /gcc/gcc.c
parentebc8f0bb3a8ac745dd710c7ce5cc918d998560c6 (diff)
downloadgcc-2cb844ce9cf37fdd75438e27b515371ad1f71405.zip
gcc-2cb844ce9cf37fdd75438e27b515371ad1f71405.tar.gz
gcc-2cb844ce9cf37fdd75438e27b515371ad1f71405.tar.bz2
PR jit/64810: driver, arm, jit: configure-time default options
gcc/ChangeLog: PR jit/64810 * Makefile.in (GCC_OBJS): Add gcc-main.o. * gcc-main.c: New file, containing "main" taken from gcc.c. * gcc.c (do_self_spec): Free decoded_options. (class driver): Move declaration to gcc.h. (main): Move declaration and implementation to new file gcc-main.c. (driver_get_configure_time_options): New function. * gcc.h (class driver): Move this declaration here, from gcc.c. (driver_get_configure_time_options): New declaration. gcc/jit/ChangeLog: PR jit/64810 * Make-lang.in (jit_OBJS): Add jit/jit-spec.o and gcc.o. (LIBGCCJIT_FILENAME): Add EXTRA_GCC_OBJS. * jit-playback.c: Include gcc.h. (gcc::jit::playback::context::compile): Move mutex acquisition to before the call to make_fake_args. (append_arg_from_driver): New function. (gcc::jit::playback::context::make_fake_args): On the first call, call into driver_get_configure_time_options to get configure-time default options and cache them. Add them to the args for toplev::main. * jit-spec.c: New source file. * docs/internals/test-hello-world.exe.log.txt: Update to reflect above changes. From-SVN: r220373
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r--gcc/gcc.c84
1 files changed, 38 insertions, 46 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 186f0ae..8a163a1 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -4696,6 +4696,8 @@ do_self_spec (const char *spec)
}
}
+ free (decoded_options);
+
alloc_switch ();
switches[n_switches].part1 = 0;
}
@@ -6880,52 +6882,6 @@ compare_files (char *cmpfile[])
return ret;
}
-/* The top-level "main" within the driver would be ~1000 lines long.
- This class breaks it up into smaller functions and contains some
- state shared by them. */
-
-class driver
-{
- public:
- int main (int argc, char **argv);
-
- private:
- void set_progname (const char *argv0) const;
- void expand_at_files (int *argc, char ***argv) const;
- void decode_argv (int argc, const char **argv);
- void global_initializations ();
- void build_multilib_strings () const;
- void set_up_specs () const;
- void putenv_COLLECT_GCC (const char *argv0) const;
- void maybe_putenv_COLLECT_LTO_WRAPPER () const;
- void maybe_putenv_OFFLOAD_TARGETS () const;
- void handle_unrecognized_options () const;
- int maybe_print_and_exit () const;
- bool prepare_infiles ();
- void do_spec_on_infiles () const;
- void maybe_run_linker (const char *argv0) const;
- void final_actions () const;
- int get_exit_code () const;
-
- private:
- char *explicit_link_files;
- struct cl_decoded_option *decoded_options;
- unsigned int decoded_options_count;
-};
-
-/* Implement the top-level "main" within the driver in terms of
- driver::main. */
-
-extern int main (int, char **);
-
-int
-main (int argc, char **argv)
-{
- driver d;
-
- return d.main (argc, argv);
-}
-
/* driver::main is implemented as a series of driver:: method calls. */
int
@@ -9463,3 +9419,39 @@ convert_white_space (char *orig)
else
return orig;
}
+
+/* PR jit/64810.
+ Targets can provide configure-time default options in
+ OPTION_DEFAULT_SPECS. The jit needs to access these, but
+ they are expressed in the spec language.
+
+ Run just enough of the driver to be able to expand these
+ specs, and then call the callback CB on each
+ such option. The options strings are *without* a leading
+ '-' character e.g. ("march=x86-64"). Finally, clean up. */
+
+void
+driver_get_configure_time_options (void (*cb) (const char *option,
+ void *user_data),
+ void *user_data)
+{
+ size_t i;
+
+ obstack_init (&obstack);
+ gcc_obstack_init (&opts_obstack);
+ n_switches = 0;
+
+ for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
+ do_option_spec (option_default_specs[i].name,
+ option_default_specs[i].spec);
+
+ for (i = 0; (int) i < n_switches; i++)
+ {
+ gcc_assert (switches[i].part1);
+ (*cb) (switches[i].part1, user_data);
+ }
+
+ obstack_free (&opts_obstack, NULL);
+ obstack_free (&obstack, NULL);
+ n_switches = 0;
+}