diff mbox

Adjust gcc-plugin.h

Message ID 55758574.7070104@redhat.com
State New
Headers show

Commit Message

Andrew MacLeod June 8, 2015, 12:07 p.m. UTC
During the original flattening process I decided to use gcc-plugin.h as 
the kitchen sink for all includes that plugins might need.  I think this 
has worked well for plugins, drastically reducing their dependency on 
gcc internal header file structure.

What I didn't realize was that gcc's internal header (plugin.h) also 
includes gcc-plugin.h. This means that every file which may need to do 
something for plugins ends up indirectly including the gcc world again :-P

Easy fix. (ha). This patch leaves all the #includes in gcc-plugin.h 
making the change transparent to plugins.  All the remaining 
declarations and such are moved into a new file gcc-plugin-common.h.  
Both gcc-plugin.h and gcc's internal header plugin.h now include this 
common file.

The effect is that gcc's source files no longer get anything but the 
required plugin info.  Great.. Except there were a few files which were 
apparently picking up some required headers from gcc-plugins.h :-P    
This patch also adds the required headers to those source files.

Compiles on x86_64-unknown-linux-gnu with no new regressions. Also 
compiles across all targets in config-list.mk.   OK for trunk?

Andrew

Comments

Richard Biener June 8, 2015, 1:32 p.m. UTC | #1
On Mon, Jun 8, 2015 at 2:07 PM, Andrew MacLeod <amacleod@redhat.com> wrote:
> During the original flattening process I decided to use gcc-plugin.h as the
> kitchen sink for all includes that plugins might need.  I think this has
> worked well for plugins, drastically reducing their dependency on gcc
> internal header file structure.
>
> What I didn't realize was that gcc's internal header (plugin.h) also
> includes gcc-plugin.h. This means that every file which may need to do
> something for plugins ends up indirectly including the gcc world again :-P
>
> Easy fix. (ha). This patch leaves all the #includes in gcc-plugin.h making
> the change transparent to plugins.  All the remaining declarations and such
> are moved into a new file gcc-plugin-common.h.  Both gcc-plugin.h and gcc's
> internal header plugin.h now include this common file.
>
> The effect is that gcc's source files no longer get anything but the
> required plugin info.  Great.. Except there were a few files which were
> apparently picking up some required headers from gcc-plugins.h :-P    This
> patch also adds the required headers to those source files.
>
> Compiles on x86_64-unknown-linux-gnu with no new regressions. Also compiles
> across all targets in config-list.mk.   OK for trunk?

Err - why not simply remove the gcc-plugin.h include from plugin.h and instead
include plugin.h from gcc-plugin.h?

Richard.

> Andrew
>
Andrew MacLeod June 8, 2015, 5:52 p.m. UTC | #2
On 06/08/2015 09:32 AM, Richard Biener wrote:
> On Mon, Jun 8, 2015 at 2:07 PM, Andrew MacLeod <amacleod@redhat.com> wrote:
>> During the original flattening process I decided to use gcc-plugin.h as the
>> kitchen sink for all includes that plugins might need.  I think this has
>> worked well for plugins, drastically reducing their dependency on gcc
>> internal header file structure.
>>
>> What I didn't realize was that gcc's internal header (plugin.h) also
>> includes gcc-plugin.h. This means that every file which may need to do
>> something for plugins ends up indirectly including the gcc world again :-P
>>
>> Easy fix. (ha). This patch leaves all the #includes in gcc-plugin.h making
>> the change transparent to plugins.  All the remaining declarations and such
>> are moved into a new file gcc-plugin-common.h.  Both gcc-plugin.h and gcc's
>> internal header plugin.h now include this common file.
>>
>> The effect is that gcc's source files no longer get anything but the
>> required plugin info.  Great.. Except there were a few files which were
>> apparently picking up some required headers from gcc-plugins.h :-P    This
>> patch also adds the required headers to those source files.
>>
>> Compiles on x86_64-unknown-linux-gnu with no new regressions. Also compiles
>> across all targets in config-list.mk.   OK for trunk?
> Err - why not simply remove the gcc-plugin.h include from plugin.h and instead
> include plugin.h from gcc-plugin.h?
>
>

the gcc source files need to see the internal bits in plugin.h, as well 
as the common decls in gcc-plugin.h.  So we could change the includes as 
you suggest, but we'd have to copy all the decls from gcc-inlcude.h to 
plugin.h so the gcc functions can see them.  And then the plugins would 
be exposed to all the internal APIs and decls present in plugins.h

Adding the 3rd file which contains all the common decls between both 
sides is the only way to isolate both.     If you were OK with exposing 
the internal parts of plugin.h to plugin clients I could do that.  Im 
presuming we didnt want to do that and thats why there were 2 files to 
start with. I hijacked the external interface in gcc-plugin.h file to 
provide all the includes when instead the right thing would have been to 
probably create a new in the first place.

Andrew
Richard Biener June 9, 2015, 7:56 a.m. UTC | #3
On Mon, Jun 8, 2015 at 7:52 PM, Andrew MacLeod <amacleod@redhat.com> wrote:
> On 06/08/2015 09:32 AM, Richard Biener wrote:
>>
>> On Mon, Jun 8, 2015 at 2:07 PM, Andrew MacLeod <amacleod@redhat.com>
>> wrote:
>>>
>>> During the original flattening process I decided to use gcc-plugin.h as
>>> the
>>> kitchen sink for all includes that plugins might need.  I think this has
>>> worked well for plugins, drastically reducing their dependency on gcc
>>> internal header file structure.
>>>
>>> What I didn't realize was that gcc's internal header (plugin.h) also
>>> includes gcc-plugin.h. This means that every file which may need to do
>>> something for plugins ends up indirectly including the gcc world again
>>> :-P
>>>
>>> Easy fix. (ha). This patch leaves all the #includes in gcc-plugin.h
>>> making
>>> the change transparent to plugins.  All the remaining declarations and
>>> such
>>> are moved into a new file gcc-plugin-common.h.  Both gcc-plugin.h and
>>> gcc's
>>> internal header plugin.h now include this common file.
>>>
>>> The effect is that gcc's source files no longer get anything but the
>>> required plugin info.  Great.. Except there were a few files which were
>>> apparently picking up some required headers from gcc-plugins.h :-P
>>> This
>>> patch also adds the required headers to those source files.
>>>
>>> Compiles on x86_64-unknown-linux-gnu with no new regressions. Also
>>> compiles
>>> across all targets in config-list.mk.   OK for trunk?
>>
>> Err - why not simply remove the gcc-plugin.h include from plugin.h and
>> instead
>> include plugin.h from gcc-plugin.h?
>>
>>
>
> the gcc source files need to see the internal bits in plugin.h, as well as
> the common decls in gcc-plugin.h.  So we could change the includes as you
> suggest, but we'd have to copy all the decls from gcc-inlcude.h to plugin.h
> so the gcc functions can see them.  And then the plugins would be exposed to
> all the internal APIs and decls present in plugins.h

plugins are exposed to all internals of GCC anyway.  gcc-plugin.h should really
just be a #include kitchen-sink.

> Adding the 3rd file which contains all the common decls between both sides
> is the only way to isolate both.     If you were OK with exposing the
> internal parts of plugin.h to plugin clients I could do that.

Yes.

>  Im presuming
> we didnt want to do that and thats why there were 2 files to start with.

No, gcc-plugin.h was introduced to make the set of includes required
for plugins "stable".

Richard.

> I
> hijacked the external interface in gcc-plugin.h file to provide all the
> includes when instead the right thing would have been to probably create a
> new in the first place.
>
> Andrew
>
>
>
diff mbox

Patch


	* gcc-plugin-common.h: New.  Relocate edecls from gcc-plugin.h. 
	* gcc-plugin.h: Move decls to gcc-plugin-common.h.
	* plugin.h: Include gcc-plugin-common.h rather than gcc-plugin.h.
	* ggc-page.c: Include required header files.
	* passes.c: Likewise.
	* cgraphunit.c: Likewise.

Index: gcc-plugin-common.h
===================================================================
*** gcc-plugin-common.h	(revision 0)
--- gcc-plugin-common.h	(working copy)
***************
*** 0 ****
--- 1,158 ----
+ /* Header file containing common declarations for gcc internal use and plugins.
+    Copyright (C) 2009-2015 Free Software Foundation, Inc.
+ 
+ This file is part of GCC.
+ 
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+ 
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #ifndef GCC_PLUGIN_COMMON_H
+ #define GCC_PLUGIN_COMMON_H
+ 
+ #include "highlev-plugin-common.h"
+ 
+ /* Event names.  */
+ enum plugin_event
+ {
+ # define DEFEVENT(NAME) NAME,
+ # include "plugin.def"
+ # undef DEFEVENT
+   PLUGIN_EVENT_FIRST_DYNAMIC
+ };
+ 
+ /* All globals declared here have C linkage to reduce link compatibility
+    issues with implementation language choice and mangling.  */
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ 
+ extern const char **plugin_event_name;
+ 
+ struct plugin_argument
+ {
+   char *key;    /* key of the argument.  */
+   char *value;  /* value is optional and can be NULL.  */
+ };
+ 
+ /* Additional information about the plugin. Used by --help and --version. */
+ 
+ struct plugin_info
+ {
+   const char *version;
+   const char *help;
+ };
+ 
+ /* Represents the gcc version. Used to avoid using an incompatible plugin. */
+ 
+ struct plugin_gcc_version
+ {
+   const char *basever;
+   const char *datestamp;
+   const char *devphase;
+   const char *revision;
+   const char *configuration_arguments;
+ };
+ 
+ /* Object that keeps track of the plugin name and its arguments. */
+ struct plugin_name_args
+ {
+   char *base_name;              /* Short name of the plugin (filename without
+                                    .so suffix). */
+   const char *full_name;        /* Path to the plugin as specified with
+                                    -fplugin=. */
+   int argc;                     /* Number of arguments specified with
+                                    -fplugin-arg-... */
+   struct plugin_argument *argv; /* Array of ARGC key-value pairs. */
+   const char *version;          /* Version string provided by plugin. */
+   const char *help;             /* Help string provided by plugin. */
+ };
+ 
+ /* The default version check. Compares every field in VERSION. */
+ 
+ extern bool plugin_default_version_check (struct plugin_gcc_version *,
+ 					  struct plugin_gcc_version *);
+ 
+ /* Function type for the plugin initialization routine. Each plugin module
+    should define this as an externally-visible function with name
+    "plugin_init."
+ 
+    PLUGIN_INFO - plugin invocation information.
+    VERSION     - the plugin_gcc_version symbol of GCC.
+ 
+    Returns 0 if initialization finishes successfully.  */
+ 
+ typedef int (*plugin_init_func) (struct plugin_name_args *plugin_info,
+                                  struct plugin_gcc_version *version);
+ 
+ /* Declaration for "plugin_init" function so that it doesn't need to be
+    duplicated in every plugin.  */
+ extern int plugin_init (struct plugin_name_args *plugin_info,
+                         struct plugin_gcc_version *version);
+ 
+ /* Function type for a plugin callback routine.
+ 
+    GCC_DATA  - event-specific data provided by GCC
+    USER_DATA - plugin-specific data provided by the plugin  */
+ 
+ typedef void (*plugin_callback_func) (void *gcc_data, void *user_data);
+ 
+ /* Called from the plugin's initialization code. Register a single callback.
+    This function can be called multiple times.
+ 
+    PLUGIN_NAME - display name for this plugin
+    EVENT       - which event the callback is for
+    CALLBACK    - the callback to be called at the event
+    USER_DATA   - plugin-provided data.
+ */
+ 
+ /* Number of event ids / names registered so far.  */
+ 
+ extern int get_event_last (void);
+ 
+ int get_named_event_id (const char *name, enum insert_option insert);
+ 
+ /* This is also called without a callback routine for the
+    PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO and PLUGIN_REGISTER_GGC_ROOTS
+    pseudo-events, with a specific user_data.
+   */
+ 
+ extern void register_callback (const char *plugin_name,
+ 			       int event,
+                                plugin_callback_func callback,
+                                void *user_data);
+ 
+ extern int unregister_callback (const char *plugin_name, int event);
+ 
+ 
+ /* Retrieve the plugin directory name, as returned by the
+    -fprint-file-name=plugin argument to the gcc program, which is the
+    -iplugindir program argument to cc1.  */
+ extern const char* default_plugin_dir_name (void);
+ 
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+ /* In case the C++ compiler does name mangling for globals, declare
+    plugin_is_GPL_compatible extern "C" so that a later definition
+    in a plugin file will have this linkage.  */
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ extern int plugin_is_GPL_compatible;
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+ #endif /* GCC_PLUGIN_COMMON_H */
Index: gcc-plugin.h
===================================================================
*** gcc-plugin.h	(revision 224156)
--- gcc-plugin.h	(working copy)
*************** along with GCC; see the file COPYING3.
*** 27,33 ****
  #include "config.h"
  #include "system.h"
  #include "coretypes.h"
- #include "highlev-plugin-common.h"
  #include "tm.h"
  #include "hashtab.h"
  #include "hash-set.h"
--- 27,32 ----
*************** along with GCC; see the file COPYING3.
*** 57,193 ****
  #include "fold-const.h"
  #include "tree-check.h"
  
! /* Event names.  */
! enum plugin_event
! {
! # define DEFEVENT(NAME) NAME,
! # include "plugin.def"
! # undef DEFEVENT
!   PLUGIN_EVENT_FIRST_DYNAMIC
! };
! 
! /* All globals declared here have C linkage to reduce link compatibility
!    issues with implementation language choice and mangling.  */
! #ifdef __cplusplus
! extern "C" {
! #endif
! 
! extern const char **plugin_event_name;
! 
! struct plugin_argument
! {
!   char *key;    /* key of the argument.  */
!   char *value;  /* value is optional and can be NULL.  */
! };
! 
! /* Additional information about the plugin. Used by --help and --version. */
! 
! struct plugin_info
! {
!   const char *version;
!   const char *help;
! };
! 
! /* Represents the gcc version. Used to avoid using an incompatible plugin. */
! 
! struct plugin_gcc_version
! {
!   const char *basever;
!   const char *datestamp;
!   const char *devphase;
!   const char *revision;
!   const char *configuration_arguments;
! };
! 
! /* Object that keeps track of the plugin name and its arguments. */
! struct plugin_name_args
! {
!   char *base_name;              /* Short name of the plugin (filename without
!                                    .so suffix). */
!   const char *full_name;        /* Path to the plugin as specified with
!                                    -fplugin=. */
!   int argc;                     /* Number of arguments specified with
!                                    -fplugin-arg-... */
!   struct plugin_argument *argv; /* Array of ARGC key-value pairs. */
!   const char *version;          /* Version string provided by plugin. */
!   const char *help;             /* Help string provided by plugin. */
! };
! 
! /* The default version check. Compares every field in VERSION. */
! 
! extern bool plugin_default_version_check (struct plugin_gcc_version *,
! 					  struct plugin_gcc_version *);
! 
! /* Function type for the plugin initialization routine. Each plugin module
!    should define this as an externally-visible function with name
!    "plugin_init."
! 
!    PLUGIN_INFO - plugin invocation information.
!    VERSION     - the plugin_gcc_version symbol of GCC.
! 
!    Returns 0 if initialization finishes successfully.  */
! 
! typedef int (*plugin_init_func) (struct plugin_name_args *plugin_info,
!                                  struct plugin_gcc_version *version);
! 
! /* Declaration for "plugin_init" function so that it doesn't need to be
!    duplicated in every plugin.  */
! extern int plugin_init (struct plugin_name_args *plugin_info,
!                         struct plugin_gcc_version *version);
! 
! /* Function type for a plugin callback routine.
! 
!    GCC_DATA  - event-specific data provided by GCC
!    USER_DATA - plugin-specific data provided by the plugin  */
! 
! typedef void (*plugin_callback_func) (void *gcc_data, void *user_data);
! 
! /* Called from the plugin's initialization code. Register a single callback.
!    This function can be called multiple times.
! 
!    PLUGIN_NAME - display name for this plugin
!    EVENT       - which event the callback is for
!    CALLBACK    - the callback to be called at the event
!    USER_DATA   - plugin-provided data.
! */
! 
! /* Number of event ids / names registered so far.  */
! 
! extern int get_event_last (void);
! 
! int get_named_event_id (const char *name, enum insert_option insert);
! 
! /* This is also called without a callback routine for the
!    PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO and PLUGIN_REGISTER_GGC_ROOTS
!    pseudo-events, with a specific user_data.
!   */
! 
! extern void register_callback (const char *plugin_name,
! 			       int event,
!                                plugin_callback_func callback,
!                                void *user_data);
! 
! extern int unregister_callback (const char *plugin_name, int event);
! 
! 
! /* Retrieve the plugin directory name, as returned by the
!    -fprint-file-name=plugin argument to the gcc program, which is the
!    -iplugindir program argument to cc1.  */
! extern const char* default_plugin_dir_name (void);
! 
! #ifdef __cplusplus
! }
! #endif
! 
! /* In case the C++ compiler does name mangling for globals, declare
!    plugin_is_GPL_compatible extern "C" so that a later definition
!    in a plugin file will have this linkage.  */
! #ifdef __cplusplus
! extern "C" {
! #endif
! extern int plugin_is_GPL_compatible;
! #ifdef __cplusplus
! }
! #endif
  
  #endif /* GCC_PLUGIN_H */
--- 56,61 ----
  #include "fold-const.h"
  #include "tree-check.h"
  
! #include "gcc-plugin-common.h"
  
  #endif /* GCC_PLUGIN_H */
Index: plugin.h
===================================================================
*** plugin.h	(revision 224156)
--- plugin.h	(working copy)
*************** along with GCC; see the file COPYING3.
*** 20,26 ****
  #ifndef PLUGIN_H
  #define PLUGIN_H
  
! #include "gcc-plugin.h"
  
  struct attribute_spec;
  struct scoped_attributes;
--- 20,26 ----
  #ifndef PLUGIN_H
  #define PLUGIN_H
  
! #include "gcc-plugin-common.h"
  
  struct attribute_spec;
  struct scoped_attributes;
Index: ggc-page.c
===================================================================
*** ggc-page.c	(revision 224156)
--- ggc-page.c	(working copy)
*************** along with GCC; see the file COPYING3.
*** 49,54 ****
--- 49,55 ----
  #include "cgraph.h"
  #include "cfgloop.h"
  #include "plugin.h"
+ #include "predict.h"
  #include "basic-block.h"
  
  /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
Index: passes.c
===================================================================
*** passes.c	(revision 224156)
--- passes.c	(working copy)
*************** along with GCC; see the file COPYING3.
*** 100,105 ****
--- 100,108 ----
  #include "tree-pretty-print.h" /* for dump_function_header */
  #include "context.h"
  #include "pass_manager.h"
+ #include "dominance.h"
+ #include "cfg.h"
+ #include "cfgrtl.h"
  #include "tree-ssa-live.h"  /* For remove_unused_locals.  */
  #include "tree-cfgcleanup.h"
  
Index: cgraphunit.c
===================================================================
*** cgraphunit.c	(revision 224156)
--- cgraphunit.c	(working copy)
*************** along with GCC; see the file COPYING3.
*** 179,184 ****
--- 179,187 ----
  #include "input.h"
  #include "function.h"
  #include "basic-block.h"
+ #include "dominance.h"
+ #include "cfgcleanup.h"
+ #include "cfg.h"
  #include "tree-ssa-alias.h"
  #include "internal-fn.h"
  #include "gimple-fold.h"