Hello All,
Some plugins (including MELT, see http://gcc-melt.org/ for more)
are made of several C++ source files which all include "plugin-version.h"
because they have some C++ code which depends upon the particular version
of GCC.
So they typically code
#if GCCPLUGIN_VERSION >= 4009
/* code for GCC 4.9 or newer. */
#else
/* code for GCC 4.8 */
#endif /*GCCPLUGIN_VERSION*/
after including "plugin-version.h"; however that file also defines static
data, notably `gcc_version`. That data symbol may be useless in most of
the plugin files -except the one initializing the plugin. Having several
useless data symbols may disturb the debugger (since the static symbol
`gcc_version` is no longer unique) and may consume some tiny useless data
(at least when the plugin is compiled with -O0).
The attached small patch (for trunk svn rev. 217404) disables the definition
of `gcc_version` when the preprocessor symbol GCCPLUGIN_SKIP_VERSION_DATA
is defined as 1 before #include "plugin-version.h"
### gcc/ChangeLog entry:
2014-11-12 Basile Starynkevitch <[email protected]>
* configure.ac (plugin-version.h): Don't define version data
when GCCPLUGIN_SKIP_VERSION_DATA was #define-d as 1.
* doc/plugins.texi: (Plugins building): Document
GCCPLUGIN_SKIP_VERSION_DATA. Put it with GCCPLUGIN_VERSION* names
in the function index.
###################
Ok for trunk? Comments are welcome.
Regards
--
Basile Starynkevitch http://starynkevitch.net/Basile
Index: gcc/configure.ac
===================================================================
--- gcc/configure.ac (revision 217404)
+++ gcc/configure.ac (working copy)
@@ -1664,6 +1664,10 @@
#define GCCPLUGIN_VERSION_PATCHLEVEL `echo $gcc_BASEVER | sed -e 's/^[0-9]*\.[0-9]*\.\([0-9]*\)$/\1/'`
#define GCCPLUGIN_VERSION (GCCPLUGIN_VERSION_MAJOR*1000 + GCCPLUGIN_VERSION_MINOR)
+/* Some plugins might not want the data below, they would define
+ GCCPLUGIN_SKIP_VERSION_DATA as 1 before including this. */
+
+#if !GCCPLUGIN_SKIP_VERSION_DATA
static char basever[] = "$gcc_BASEVER";
static char datestamp[] = "$gcc_DATESTAMP";
static char devphase[] = "$gcc_DEVPHASE";
@@ -1675,6 +1679,7 @@
static struct plugin_gcc_version gcc_version = {basever, datestamp,
devphase, revision,
configuration_arguments};
+#endif /* GCCPLUGIN_SKIP_VERSION_DATA */
EOF
changequote([,])dnl
Index: gcc/doc/plugins.texi
===================================================================
--- gcc/doc/plugins.texi (revision 217404)
+++ gcc/doc/plugins.texi (working copy)
@@ -157,6 +157,16 @@
but you can also check the individual fields if you want a less strict check.
+A plugin might want to include in some of its source files the
+@file{plugin-version.h} header for preprocessor constants
+@code{GCCPLUGIN_VERSION} without defining the static symbol
+@code{gcc_version}. In that case it should define the preprocessor
+symbol @code{GCCPLUGIN_SKIP_VERSION_DATA} to @code{1} before including
+that header.
+@findex GCCPLUGIN_VERSION
+@findex GCCPLUGIN_SKIP_VERSION_DATA
+@findex gcc_version
+
@subsection Plugin callbacks
Callback functions have the following prototype:
@@ -488,6 +498,10 @@
#error this GCC plugin is for GCC 4.7
#endif
@end smallexample
+@findex GCCPLUGIN_VERSION_MAJOR
+@findex GCCPLUGIN_VERSION_MINOR
+@findex GCCPLUGIN_VERSION_PATCHLEVEL
+@findex GCCPLUGIN_VERSION
The following GNU Makefile excerpt shows how to build a simple plugin: