1 /* Public header file for plugins to include. 2 Copyright (C) 2009-2015 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GCC is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GCC; see the file COPYING3. If not see 18 <http://www.gnu.org/licenses/>. */ 19 20 #ifndef GCC_PLUGIN_H 21 #define GCC_PLUGIN_H 22 23 #ifndef IN_GCC 24 #define IN_GCC 25 #endif 26 27 #include "config.h" 28 #include "system.h" 29 #include "coretypes.h" 30 #include "highlev-plugin-common.h" 31 #include "tm.h" 32 #include "hashtab.h" 33 #include "hash-set.h" 34 #include "vec.h" 35 #include "machmode.h" 36 #include "hard-reg-set.h" 37 #include "input.h" 38 #include "function.h" 39 #include "predict.h" 40 #include "dominance.h" 41 #include "cfg.h" 42 #include "cfgrtl.h" 43 #include "cfganal.h" 44 #include "lcm.h" 45 #include "cfgbuild.h" 46 #include "cfgcleanup.h" 47 #include "hash-map.h" 48 #include "is-a.h" 49 #include "plugin-api.h" 50 #include "ipa-ref.h" 51 #include "statistics.h" 52 #include "double-int.h" 53 #include "real.h" 54 #include "fixed-value.h" 55 #include "alias.h" 56 #include "flags.h" 57 #include "symtab.h" 58 #include "tree-core.h" 59 #include "hash-set.h" 60 #include "wide-int.h" 61 #include "inchash.h" 62 #include "fold-const.h" 63 #include "tree-check.h" 64 65 /* Event names. */ 66 enum plugin_event 67 { 68 # define DEFEVENT(NAME) NAME, 69 # include "plugin.def" 70 # undef DEFEVENT 71 PLUGIN_EVENT_FIRST_DYNAMIC 72 }; 73 74 /* All globals declared here have C linkage to reduce link compatibility 75 issues with implementation language choice and mangling. */ 76 #ifdef __cplusplus 77 extern "C" { 78 #endif 79 80 extern const char **plugin_event_name; 81 82 struct plugin_argument 83 { 84 char *key; /* key of the argument. */ 85 char *value; /* value is optional and can be NULL. */ 86 }; 87 88 /* Additional information about the plugin. Used by --help and --version. */ 89 90 struct plugin_info 91 { 92 const char *version; 93 const char *help; 94 }; 95 96 /* Represents the gcc version. Used to avoid using an incompatible plugin. */ 97 98 struct plugin_gcc_version 99 { 100 const char *basever; 101 const char *datestamp; 102 const char *devphase; 103 const char *revision; 104 const char *configuration_arguments; 105 }; 106 107 /* Object that keeps track of the plugin name and its arguments. */ 108 struct plugin_name_args 109 { 110 char *base_name; /* Short name of the plugin (filename without 111 .so suffix). */ 112 const char *full_name; /* Path to the plugin as specified with 113 -fplugin=. */ 114 int argc; /* Number of arguments specified with 115 -fplugin-arg-... */ 116 struct plugin_argument *argv; /* Array of ARGC key-value pairs. */ 117 const char *version; /* Version string provided by plugin. */ 118 const char *help; /* Help string provided by plugin. */ 119 }; 120 121 /* The default version check. Compares every field in VERSION. */ 122 123 extern bool plugin_default_version_check (struct plugin_gcc_version *, 124 struct plugin_gcc_version *); 125 126 /* Function type for the plugin initialization routine. Each plugin module 127 should define this as an externally-visible function with name 128 "plugin_init." 129 130 PLUGIN_INFO - plugin invocation information. 131 VERSION - the plugin_gcc_version symbol of GCC. 132 133 Returns 0 if initialization finishes successfully. */ 134 135 typedef int (*plugin_init_func) (struct plugin_name_args *plugin_info, 136 struct plugin_gcc_version *version); 137 138 /* Declaration for "plugin_init" function so that it doesn't need to be 139 duplicated in every plugin. */ 140 extern int plugin_init (struct plugin_name_args *plugin_info, 141 struct plugin_gcc_version *version); 142 143 /* Function type for a plugin callback routine. 144 145 GCC_DATA - event-specific data provided by GCC 146 USER_DATA - plugin-specific data provided by the plugin */ 147 148 typedef void (*plugin_callback_func) (void *gcc_data, void *user_data); 149 150 /* Called from the plugin's initialization code. Register a single callback. 151 This function can be called multiple times. 152 153 PLUGIN_NAME - display name for this plugin 154 EVENT - which event the callback is for 155 CALLBACK - the callback to be called at the event 156 USER_DATA - plugin-provided data. 157 */ 158 159 /* Number of event ids / names registered so far. */ 160 161 extern int get_event_last (void); 162 163 int get_named_event_id (const char *name, enum insert_option insert); 164 165 /* This is also called without a callback routine for the 166 PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO and PLUGIN_REGISTER_GGC_ROOTS 167 pseudo-events, with a specific user_data. 168 */ 169 170 extern void register_callback (const char *plugin_name, 171 int event, 172 plugin_callback_func callback, 173 void *user_data); 174 175 extern int unregister_callback (const char *plugin_name, int event); 176 177 178 /* Retrieve the plugin directory name, as returned by the 179 -fprint-file-name=plugin argument to the gcc program, which is the 180 -iplugindir program argument to cc1. */ 181 extern const char* default_plugin_dir_name (void); 182 183 #ifdef __cplusplus 184 } 185 #endif 186 187 /* In case the C++ compiler does name mangling for globals, declare 188 plugin_is_GPL_compatible extern "C" so that a later definition 189 in a plugin file will have this linkage. */ 190 #ifdef __cplusplus 191 extern "C" { 192 #endif 193 extern int plugin_is_GPL_compatible; 194 #ifdef __cplusplus 195 } 196 #endif 197 198 #endif /* GCC_PLUGIN_H */ 199