1 | /* Header file for internal GCC plugin mechanism. |
2 | Copyright (C) 2009-2023 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 PLUGIN_H |
21 | #define PLUGIN_H |
22 | |
23 | #include "highlev-plugin-common.h" |
24 | |
25 | /* Event names. */ |
26 | enum plugin_event |
27 | { |
28 | # define DEFEVENT(NAME) NAME, |
29 | # include "plugin.def" |
30 | # undef DEFEVENT |
31 | PLUGIN_EVENT_FIRST_DYNAMIC |
32 | }; |
33 | |
34 | /* All globals declared here have C linkage to reduce link compatibility |
35 | issues with implementation language choice and mangling. */ |
36 | #ifdef __cplusplus |
37 | extern "C" { |
38 | #endif |
39 | |
40 | extern const char **plugin_event_name; |
41 | |
42 | struct plugin_argument |
43 | { |
44 | char *key; /* key of the argument. */ |
45 | char *value; /* value is optional and can be NULL. */ |
46 | }; |
47 | |
48 | /* Additional information about the plugin. Used by --help and --version. */ |
49 | |
50 | struct plugin_info |
51 | { |
52 | const char *version; |
53 | const char *help; |
54 | }; |
55 | |
56 | /* Represents the gcc version. Used to avoid using an incompatible plugin. */ |
57 | |
58 | struct plugin_gcc_version |
59 | { |
60 | const char *basever; |
61 | const char *datestamp; |
62 | const char *devphase; |
63 | const char *revision; |
64 | const char *configuration_arguments; |
65 | }; |
66 | |
67 | /* Object that keeps track of the plugin name and its arguments. */ |
68 | struct plugin_name_args |
69 | { |
70 | char *base_name; /* Short name of the plugin (filename without |
71 | .so suffix). */ |
72 | const char *full_name; /* Path to the plugin as specified with |
73 | -fplugin=. */ |
74 | int argc; /* Number of arguments specified with |
75 | -fplugin-arg-... */ |
76 | struct plugin_argument *argv; /* Array of ARGC key-value pairs. */ |
77 | const char *version; /* Version string provided by plugin. */ |
78 | const char *help; /* Help string provided by plugin. */ |
79 | }; |
80 | |
81 | /* The default version check. Compares every field in VERSION. */ |
82 | |
83 | extern bool plugin_default_version_check (struct plugin_gcc_version *, |
84 | struct plugin_gcc_version *); |
85 | |
86 | /* Function type for the plugin initialization routine. Each plugin module |
87 | should define this as an externally-visible function with name |
88 | "plugin_init." |
89 | |
90 | PLUGIN_INFO - plugin invocation information. |
91 | VERSION - the plugin_gcc_version symbol of GCC. |
92 | |
93 | Returns 0 if initialization finishes successfully. */ |
94 | |
95 | typedef int (*plugin_init_func) (struct plugin_name_args *plugin_info, |
96 | struct plugin_gcc_version *version); |
97 | |
98 | /* Declaration for "plugin_init" function so that it doesn't need to be |
99 | duplicated in every plugin. */ |
100 | extern int plugin_init (struct plugin_name_args *plugin_info, |
101 | struct plugin_gcc_version *version); |
102 | |
103 | /* Function type for a plugin callback routine. |
104 | |
105 | GCC_DATA - event-specific data provided by GCC |
106 | USER_DATA - plugin-specific data provided by the plugin */ |
107 | |
108 | typedef void (*plugin_callback_func) (void *gcc_data, void *user_data); |
109 | |
110 | /* Called from the plugin's initialization code. Register a single callback. |
111 | This function can be called multiple times. |
112 | |
113 | PLUGIN_NAME - display name for this plugin |
114 | EVENT - which event the callback is for |
115 | CALLBACK - the callback to be called at the event |
116 | USER_DATA - plugin-provided data. |
117 | */ |
118 | |
119 | /* Number of event ids / names registered so far. */ |
120 | |
121 | extern int get_event_last (void); |
122 | |
123 | int get_named_event_id (const char *name, enum insert_option insert); |
124 | |
125 | /* This is also called without a callback routine for the |
126 | PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO and PLUGIN_REGISTER_GGC_ROOTS |
127 | pseudo-events, with a specific user_data. |
128 | */ |
129 | |
130 | extern void register_callback (const char *plugin_name, |
131 | int event, |
132 | plugin_callback_func callback, |
133 | void *user_data); |
134 | |
135 | extern int unregister_callback (const char *plugin_name, int event); |
136 | |
137 | |
138 | /* Retrieve the plugin directory name, as returned by the |
139 | -fprint-file-name=plugin argument to the gcc program, which is the |
140 | -iplugindir program argument to cc1. */ |
141 | extern const char* default_plugin_dir_name (void); |
142 | |
143 | #ifdef __cplusplus |
144 | } |
145 | #endif |
146 | |
147 | /* In case the C++ compiler does name mangling for globals, declare |
148 | plugin_is_GPL_compatible extern "C" so that a later definition |
149 | in a plugin file will have this linkage. */ |
150 | #ifdef __cplusplus |
151 | extern "C" { |
152 | #endif |
153 | extern int plugin_is_GPL_compatible; |
154 | #ifdef __cplusplus |
155 | } |
156 | #endif |
157 | |
158 | |
159 | struct attribute_spec; |
160 | struct scoped_attributes; |
161 | |
162 | extern void add_new_plugin (const char *); |
163 | extern void parse_plugin_arg_opt (const char *); |
164 | extern int invoke_plugin_callbacks_full (int, void *); |
165 | extern void initialize_plugins (void); |
166 | extern bool plugins_active_p (void); |
167 | extern void dump_active_plugins (FILE *); |
168 | extern void debug_active_plugins (void); |
169 | extern void warn_if_plugins (void); |
170 | extern void print_plugins_versions (FILE *file, const char *indent); |
171 | extern void print_plugins_help (FILE *file, const char *indent); |
172 | extern void finalize_plugins (void); |
173 | extern void for_each_plugin (void (*cb) (const plugin_name_args *, |
174 | void *user_data), |
175 | void *user_data); |
176 | |
177 | extern bool flag_plugin_added; |
178 | |
179 | /* Called from inside GCC. Invoke all plugin callbacks registered with |
180 | the specified event. |
181 | Return PLUGEVT_SUCCESS if at least one callback was called, |
182 | PLUGEVT_NO_CALLBACK if there was no callback. |
183 | |
184 | EVENT - the event identifier |
185 | GCC_DATA - event-specific data provided by the compiler */ |
186 | |
187 | inline int |
188 | invoke_plugin_callbacks (int event ATTRIBUTE_UNUSED, |
189 | void *gcc_data ATTRIBUTE_UNUSED) |
190 | { |
191 | #ifdef ENABLE_PLUGIN |
192 | /* True iff at least one plugin has been added. */ |
193 | if (flag_plugin_added) |
194 | return invoke_plugin_callbacks_full (event, gcc_data); |
195 | #endif |
196 | |
197 | return PLUGEVT_NO_CALLBACK; |
198 | } |
199 | |
200 | /* In attribs.cc. */ |
201 | |
202 | extern void register_attribute (const struct attribute_spec *attr); |
203 | /* The default argument for the third parameter is given in attribs.h. */ |
204 | extern struct scoped_attributes* register_scoped_attributes (const struct attribute_spec *, |
205 | const char *, |
206 | bool); |
207 | |
208 | #endif /* PLUGIN_H */ |
209 | |