* PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h
@ 2014-11-12 13:07 Basile Starynkevitch
2014-11-12 13:14 ` Jakub Jelinek
0 siblings, 1 reply; 8+ messages in thread
From: Basile Starynkevitch @ 2014-11-12 13:07 UTC (permalink / raw)
To: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 1495 bytes --]
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 <basile@starynkevitch.net>
* 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
[-- Attachment #2: gcc5-r217404-gccpluginversion-skip.diff --]
[-- Type: text/x-diff, Size: 1984 bytes --]
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:
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h
2014-11-12 13:07 PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h Basile Starynkevitch
@ 2014-11-12 13:14 ` Jakub Jelinek
2014-11-12 13:20 ` PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h Basile Starynkevitch
2014-11-12 14:37 ` PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h Richard Biener
0 siblings, 2 replies; 8+ messages in thread
From: Jakub Jelinek @ 2014-11-12 13:14 UTC (permalink / raw)
To: Basile Starynkevitch; +Cc: gcc-patches
On Wed, Nov 12, 2014 at 01:55:12PM +0100, Basile Starynkevitch wrote:
> 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*/
Can't you just remember that version in configure of your plugin?
Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h
2014-11-12 13:14 ` Jakub Jelinek
@ 2014-11-12 13:20 ` Basile Starynkevitch
2014-11-12 13:29 ` Jakub Jelinek
2014-11-12 14:37 ` PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h Richard Biener
1 sibling, 1 reply; 8+ messages in thread
From: Basile Starynkevitch @ 2014-11-12 13:20 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Basile Starynkevitch, gcc-patches
On Wed, Nov 12, 2014 at 02:12:07PM +0100, Jakub Jelinek wrote:
> On Wed, Nov 12, 2014 at 01:55:12PM +0100, Basile Starynkevitch wrote:
> > 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*/
>
> Can't you just remember that version in configure of your plugin?
Most plugin don't need any configure, because they are installed in
a version specific directory (like /usr/lib/gcc/x86_64-linux-gnu/4.9/plugin
for example). I don't think it is wise to require plugin to be
autoconf-configurable. Their Makefile simply uses
$(shell gcc -print-file-name=plugin), there is no need to complex
autoconf machinery.
And even a plugin for a particular version of GCC is usually made
of several files, all of them with #include "plugin-version.h";
there is no need to define several times gcc_version.
(another possibility might be to make gcc_version an external symbol
with public visibility inside the cc1 or cc1plus executable)
Thanks for your comment.
Cheers.
--
Basile Starynkevitch http://starynkevitch.net/Basile/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h
2014-11-12 13:20 ` PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h Basile Starynkevitch
@ 2014-11-12 13:29 ` Jakub Jelinek
2014-11-12 13:38 ` Basile Starynkevitch
0 siblings, 1 reply; 8+ messages in thread
From: Jakub Jelinek @ 2014-11-12 13:29 UTC (permalink / raw)
To: Basile Starynkevitch; +Cc: gcc-patches
On Wed, Nov 12, 2014 at 02:20:22PM +0100, Basile Starynkevitch wrote:
> Most plugin don't need any configure, because they are installed in
> a version specific directory (like /usr/lib/gcc/x86_64-linux-gnu/4.9/plugin
> for example). I don't think it is wise to require plugin to be
> autoconf-configurable. Their Makefile simply uses
> $(shell gcc -print-file-name=plugin), there is no need to complex
> autoconf machinery.
If you use $(shell gcc -print-file-name=plugin), there is no point
to include plugin-version.h, just use __GNUC__/__GNUC_MINOR__ ?
Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h
2014-11-12 13:29 ` Jakub Jelinek
@ 2014-11-12 13:38 ` Basile Starynkevitch
2014-11-13 6:53 ` Basile Starynkevitch
0 siblings, 1 reply; 8+ messages in thread
From: Basile Starynkevitch @ 2014-11-12 13:38 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Basile Starynkevitch, gcc-patches
On Wed, Nov 12, 2014 at 02:29:13PM +0100, Jakub Jelinek wrote:
> On Wed, Nov 12, 2014 at 02:20:22PM +0100, Basile Starynkevitch wrote:
> > Most plugin don't need any configure, because they are installed in
> > a version specific directory (like /usr/lib/gcc/x86_64-linux-gnu/4.9/plugin
> > for example). I don't think it is wise to require plugin to be
> > autoconf-configurable. Their Makefile simply uses
> > $(shell gcc -print-file-name=plugin), there is no need to complex
> > autoconf machinery.
>
> If you use $(shell gcc -print-file-name=plugin), there is no point
> to include plugin-version.h, just use __GNUC__/__GNUC_MINOR__ ?
I could compile a plugin (notably for a GCC cross-compiler) with a GCC version
different of the GCC targetting the plugin. I could also compile a
plugin with Clang or some other non-GCC compiler. In both cases
plugin-version.h is needed with its GCCPLUGIN_VERSION.
Cheers.
--
Basile Starynkevitch http://starynkevitch.net/Basile/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h
2014-11-12 13:14 ` Jakub Jelinek
2014-11-12 13:20 ` PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h Basile Starynkevitch
@ 2014-11-12 14:37 ` Richard Biener
2014-11-12 14:38 ` Richard Biener
1 sibling, 1 reply; 8+ messages in thread
From: Richard Biener @ 2014-11-12 14:37 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Basile Starynkevitch, GCC Patches
On Wed, Nov 12, 2014 at 2:12 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Wed, Nov 12, 2014 at 01:55:12PM +0100, Basile Starynkevitch wrote:
>> 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*/
>
> Can't you just remember that version in configure of your plugin?
Or fix it properly by also generating a plugin-version.c file with
the definitions and just provide declarations in plugin-version.h.
Richard.
> Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h
2014-11-12 14:37 ` PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h Richard Biener
@ 2014-11-12 14:38 ` Richard Biener
0 siblings, 0 replies; 8+ messages in thread
From: Richard Biener @ 2014-11-12 14:38 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Basile Starynkevitch, GCC Patches
On Wed, Nov 12, 2014 at 3:35 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Wed, Nov 12, 2014 at 2:12 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>> On Wed, Nov 12, 2014 at 01:55:12PM +0100, Basile Starynkevitch wrote:
>>> 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*/
>>
>> Can't you just remember that version in configure of your plugin?
>
> Or fix it properly by also generating a plugin-version.c file with
> the definitions and just provide declarations in plugin-version.h.
And of course not export the too unspecific symbols 'basever'
'datestamp' 'devphase' and 'revision'. Only export gcc_version.
Which is already available from 'version_string' in version.[ch](!?). So what's
the point of the extra stuff in plugin-version.h??
Richard.
> Richard.
>
>> Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h
2014-11-12 13:38 ` Basile Starynkevitch
@ 2014-11-13 6:53 ` Basile Starynkevitch
0 siblings, 0 replies; 8+ messages in thread
From: Basile Starynkevitch @ 2014-11-13 6:53 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 1488 bytes --]
On Wed, 2014-11-12 at 14:36 +0100, Basile Starynkevitch wrote:
> On Wed, Nov 12, 2014 at 02:29:13PM +0100, Jakub Jelinek wrote:
> > On Wed, Nov 12, 2014 at 02:20:22PM +0100, Basile Starynkevitch wrote:
> > > Most plugin don't need any configure, because they are installed in
> > > a version specific directory (like /usr/lib/gcc/x86_64-linux-gnu/4.9/plugin
> > > for example). I don't think it is wise to require plugin to be
> > > autoconf-configurable. Their Makefile simply uses
> > > $(shell gcc -print-file-name=plugin), there is no need to complex
> > > autoconf machinery.
> >
> > If you use $(shell gcc -print-file-name=plugin), there is no point
> > to include plugin-version.h, just use __GNUC__/__GNUC_MINOR__ ?
>
>
> I could compile a plugin (notably for a GCC cross-compiler) with a GCC version
> different of the GCC targetting the plugin. I could also compile a
> plugin with Clang or some other non-GCC compiler. In both cases
> plugin-version.h is needed with its GCCPLUGIN_VERSION.
I'm trying to patch GCC to get a plugin-version.c file generated, but I
can't get that work. Here is attached a buggy patch against trunk svn
r217460 which does not work. Could any one help me to catch my mistake
please?
Regards.
--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mine, sont seulement les miennes} ***
[-- Attachment #2: badpatch-gcc-version.diff --]
[-- Type: text/x-patch, Size: 2799 bytes --]
Index: fixincludes/fixincl.x
===================================================================
--- fixincludes/fixincl.x (revision 217460)
+++ fixincludes/fixincl.x (working copy)
@@ -1,12 +1,12 @@
/* -*- buffer-read-only: t -*- vi: set ro:
- *
+ *
* DO NOT EDIT THIS FILE (fixincl.x)
- *
- * It has been AutoGen-ed October 21, 2014 at 10:18:16 AM by AutoGen 5.16.2
+ *
+ * It has been AutoGen-ed
* From the definitions inclhack.def
* and the template file fixincl
*/
-/* DO NOT SVN-MERGE THIS FILE, EITHER Tue Oct 21 10:18:17 CEST 2014
+/* DO NOT SVN-MERGE THIS FILE, EITHER Thu Nov 13 07:50:38 MET 2014
*
* You must regenerate it. Use the ./genfixes script.
*
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in (revision 217460)
+++ gcc/Makefile.in (working copy)
@@ -1324,6 +1324,7 @@
opts-global.o \
passes.o \
plugin.o \
+ plugin-version.o \
postreload-gcse.o \
postreload.o \
predict.o \
Index: gcc/configure.ac
===================================================================
--- gcc/configure.ac (revision 217460)
+++ gcc/configure.ac (working copy)
@@ -1656,7 +1656,25 @@
else
gcc_REVISION=""
fi
+
+cat > plugin-version.c <<EOF
+/* generated file plugin-version.c for GCC */
+#include "plugin-version.h"
+static const char basever[] = "$gcc_BASEVER";
+static const char datestamp[] = "$gcc_DATESTAMP";
+static const char devphase[] = "$gcc_DEVPHASE";
+static const char revision[] = "$gcc_REVISION";
+
+/* FIXME plugins: We should make the version information more precise.
+ One way to do is to add a checksum. */
+
+const struct plugin_gcc_version gcc_version = {basever, datestamp,
+ devphase, revision,
+ configuration_arguments};
+EOF
+
cat > plugin-version.h <<EOF
+/* generated header plugin-version.h for GCC */
#include "configargs.h"
#define GCCPLUGIN_VERSION_MAJOR `echo $gcc_BASEVER | sed -e 's/^\([0-9]*\).*$/\1/'`
@@ -1664,18 +1682,9 @@
#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)
-static char basever[] = "$gcc_BASEVER";
-static char datestamp[] = "$gcc_DATESTAMP";
-static char devphase[] = "$gcc_DEVPHASE";
-static char revision[] = "$gcc_REVISION";
+extern const struct plugin_gcc_version gcc_version;
+EOF
-/* FIXME plugins: We should make the version information more precise.
- One way to do is to add a checksum. */
-
-static struct plugin_gcc_version gcc_version = {basever, datestamp,
- devphase, revision,
- configuration_arguments};
-EOF
changequote([,])dnl
# Internationalization
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-11-13 6:52 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-12 13:07 PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h Basile Starynkevitch
2014-11-12 13:14 ` Jakub Jelinek
2014-11-12 13:20 ` PATCH GCC5.0: conditionally skip gcc_version in plugin-version.h Basile Starynkevitch
2014-11-12 13:29 ` Jakub Jelinek
2014-11-12 13:38 ` Basile Starynkevitch
2014-11-13 6:53 ` Basile Starynkevitch
2014-11-12 14:37 ` PATCH GCC5.0: conditionally skip gcc_version in gcc-plugin.h Richard Biener
2014-11-12 14:38 ` Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).