Plugins pass (GNU Compiler Collection (GCC) Internals) (original) (raw)
23.3 Interacting with the pass manager ¶
There needs to be a way to add/reorder/remove passes dynamically. This is useful for both analysis plugins (plugging in after a certain pass such as CFG or an IPA pass) and optimization plugins.
Basic support for inserting new passes or replacing existing passes is provided. A plugin registers a new pass with GCC by callingregister_callback
with the PLUGIN_PASS_MANAGER_SETUP
event and a pointer to a struct register_pass_info
object defined as follows
enum pass_positioning_ops { PASS_POS_INSERT_AFTER, // Insert after the reference pass. PASS_POS_INSERT_BEFORE, // Insert before the reference pass. PASS_POS_REPLACE // Replace the reference pass. };
struct register_pass_info { struct opt_pass pass; / New pass provided by the plugin. */ const char reference_pass_name; / Name of the reference pass for hooking up the new pass. / int ref_pass_instance_number; / Insert the pass at the specified instance number of the reference pass. / / Do it for every instance if it is 0. / enum pass_positioning_ops pos_op; / how to insert the new pass. */ };
/* Sample plugin code that registers a new pass. */ int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { struct register_pass_info pass_info;
...
/* Code to fill in the pass_info object with new pass information. */
...
/* Register the new pass. */ register_callback (plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
... }