diff -ru gcc-4.9-20150204/gcc/config.in gcc/gcc/config.in --- gcc-4.9-20150204/gcc/config.in 2015-02-05 00:32:56.000000000 +0200 +++ gcc/gcc/config.in 2015-02-08 19:58:45.215372260 +0200 @@ -137,6 +137,10 @@ #undef ENABLE_PLUGIN #endif +/* Define to enable static plugin support. */ +#ifndef USED_FOR_TARGET +#undef ENABLE_STATIC_PLUGIN +#endif /* Define if you want all operations on RTL (the basic data structure of the optimizer and back end) to be checked for dynamic type safety at runtime. diff -ru gcc-4.9-20150204/gcc/configure.ac gcc/gcc/configure.ac --- gcc-4.9-20150204/gcc/configure.ac 2014-12-04 20:25:37.000000000 +0200 +++ gcc/gcc/configure.ac 2015-02-08 19:58:45.219372260 +0200 @@ -5519,6 +5519,14 @@ fi fi +AC_ARG_ENABLE(static-plugin, +[ --enable-static-plugin enable static plugin support], +enable_static_plugin=$enableval, +enable_static_plugin==no) + +if test x"$enable_static_plugin" = x"yes"; then + AC_DEFINE(ENABLE_STATIC_PLUGIN, 1, [Define to enable static plugin support.]) +fi # Check for plugin support AC_ARG_ENABLE(plugin, diff -ru gcc-4.9-20150204/gcc/cp/Make-lang.in gcc/gcc/cp/Make-lang.in --- gcc-4.9-20150204/gcc/cp/Make-lang.in 2014-04-15 10:04:17.000000000 +0200 +++ gcc/gcc/cp/Make-lang.in 2015-02-08 20:01:21.479374174 +0200 @@ -90,14 +90,14 @@ # compute checksum over all object files and the options cc1plus-checksum.c : build/genchecksum$(build_exeext) checksum-options \ - $(CXX_OBJS) $(BACKEND) $(LIBDEPS) + $(CXX_OBJS) $(BACKEND) $(LIBDEPS) build/genchecksum$(build_exeext) $(CXX_OBJS) $(BACKEND) $(LIBDEPS) \ checksum-options > cc1plus-checksum.c.tmp && \ $(srcdir)/../move-if-change cc1plus-checksum.c.tmp cc1plus-checksum.c cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ - $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) + $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(STATIC_PLUGIN_LIBS) $(LIBS) $(BACKENDLIBS) ifeq ($(ENABLE_MAINTAINER_RULES), true) # Special build rule. This is a maintainer rule, that is only diff -ru gcc-4.9-20150204/gcc/opts-global.c gcc/gcc/opts-global.c --- gcc-4.9-20150204/gcc/opts-global.c 2014-01-03 00:23:26.000000000 +0200 +++ gcc/gcc/opts-global.c 2015-02-08 19:58:45.223372260 +0200 @@ -381,7 +381,7 @@ break; case OPT_fplugin_: -#ifdef ENABLE_PLUGIN +#if defined(ENABLE_PLUGIN) || defined(ENABLE_STATIC_PLUGIN) add_new_plugin (opt->arg); #else error ("plugin support is disabled; configure with --enable-plugin"); @@ -389,7 +389,7 @@ break; case OPT_fplugin_arg_: -#ifdef ENABLE_PLUGIN +#if defined(ENABLE_PLUGIN) || defined(ENABLE_STATIC_PLUGIN) parse_plugin_arg_opt (opt->arg); #else error ("plugin support is disabled; configure with --enable-plugin"); diff -ru gcc-4.9-20150204/gcc/plugin.c gcc/gcc/plugin.c --- gcc-4.9-20150204/gcc/plugin.c 2014-01-03 00:23:26.000000000 +0200 +++ gcc/gcc/plugin.c 2015-02-09 12:40:04.956108359 +0200 @@ -31,7 +31,7 @@ #include "plugin.h" #include "ggc.h" -#ifdef ENABLE_PLUGIN +#if defined(ENABLE_PLUGIN) || defined(ENABLE_STATIC_PLUGIN) #include "plugin-version.h" #endif @@ -159,6 +159,7 @@ flag_plugin_added = true; +#ifdef ENABLE_PLUGIN /* Replace short names by their full path when relevant. */ name_is_short = !IS_ABSOLUTE_PATH (plugin_name); for (pc = plugin_name; name_is_short && *pc; pc++) @@ -180,6 +181,7 @@ plugin_name, base_name); } else +#endif base_name = get_plugin_base_name (plugin_name); /* If this is the first -fplugin= option we encounter, create @@ -634,6 +636,26 @@ return 1; } +#elif defined(ENABLE_STATIC_PLUGIN) + +extern "C" int +plugin_init (struct plugin_name_args*, struct plugin_gcc_version*); + +static int +init_one_plugin (void **slot, void * ARG_UNUSED (info)) +{ + struct plugin_name_args *plugin = (struct plugin_name_args *) *slot; + + /* Call the plugin-provided initialization routine with the arguments. */ + if (plugin_init (plugin, &gcc_version)) + { + error ("Fail to initialize plugin %s", plugin->full_name); + htab_remove_elt (plugin_name_args_tab, plugin->base_name); + XDELETE (plugin); + } + return 1; +} + #endif /* ENABLE_PLUGIN */ /* Main plugin initialization function. Called from compile_file() in @@ -648,7 +670,7 @@ timevar_push (TV_PLUGIN_INIT); -#ifdef ENABLE_PLUGIN +#if defined(ENABLE_PLUGIN) || defined(ENABLE_STATIC_PLUGIN) /* Traverse and initialize each plugin specified in the command-line. */ htab_traverse_noresize (plugin_name_args_tab, init_one_plugin, NULL); #endif diff -ru gcc-4.9-20150204/gcc/plugin.h gcc/gcc/plugin.h --- gcc-4.9-20150204/gcc/plugin.h 2014-01-03 00:23:26.000000000 +0200 +++ gcc/gcc/plugin.h 2015-02-08 19:58:45.227372260 +0200 @@ -53,7 +53,7 @@ invoke_plugin_callbacks (int event ATTRIBUTE_UNUSED, void *gcc_data ATTRIBUTE_UNUSED) { -#ifdef ENABLE_PLUGIN +#if defined(ENABLE_PLUGIN) || defined(ENABLE_STATIC_PLUGIN) /* True iff at least one plugin has been added. */ if (flag_plugin_added) return invoke_plugin_callbacks_full (event, gcc_data);