On 06/09/2015 03:56 AM, Richard Biener wrote:
On Mon, Jun 8, 2015 at 7:52 PM, Andrew MacLeod <amacl...@redhat.com> wrote:
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.
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 didn't actually realize that.. at least its serving its true purpose
now :-)
So hows this. Bootstrapping and testruns proceeding now, but it should
have the same results as the other patch.
Assuming no regressions, OK?
Andrew
* gcc-plugin.h: Move decls to plugin.h and include it.
* plugin.h: Relocate decls from gcc-plugin.h
* ggc-page.c: Include required header files.
* passes.c: Likewise.
* cgraphunit.c: Likewise.
Index: gcc-plugin.h
===================================================================
*** gcc-plugin.h (revision 224250)
--- 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 "hard-reg-set.h"
#include "input.h"
--- 27,32 ----
*************** along with GCC; see the file COPYING3.
*** 49,186 ****
#include "tree-core.h"
#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 */
--- 48,53 ----
#include "tree-core.h"
#include "fold-const.h"
#include "tree-check.h"
! #include "plugin.h"
#endif /* GCC_PLUGIN_H */
Index: plugin.h
===================================================================
*** plugin.h (revision 224250)
--- 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,160 ----
#ifndef PLUGIN_H
#define PLUGIN_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
!
struct attribute_spec;
struct scoped_attributes;
Index: ggc-page.c
===================================================================
*** ggc-page.c (revision 224250)
--- ggc-page.c (working copy)
*************** along with GCC; see the file COPYING3.
*** 41,46 ****
--- 41,47 ----
#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 224250)
--- passes.c (working copy)
*************** along with GCC; see the file COPYING3.
*** 94,99 ****
--- 94,102 ----
#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 224250)
--- cgraphunit.c (working copy)
*************** along with GCC; see the file COPYING3.
*** 176,181 ****
--- 176,184 ----
#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"