I updated the page http://gcc.gnu.org/wiki/GCC_PluginAPI.

I cleaned up the formatting and added syntax coloring where appropriate. I also changed the API to reflect the comments so far, making it easier to register many callbacks at once while preserving the ability to register callbacks dynamically as needed.

I volunteer to maintain this page. (That isn't to say no-one should edit it, just that I'll keep it neat and make threads if there are problems with the API.)

Sean

On Feb 2, 2009, at 2:15 PM, Benjamin Smedberg wrote:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 1/31/09 10:06 PM, Sean Callanan wrote:

(1) register_callback is an unnecessary API. It's already possible to use dlsym() to get a pointer to a symbol in a plug-in. A plug-in could export a function symbol corresponding to each hook it is interested in;
that way a plug-in would simply have things like

void HOOK_PASS_MANAGER_SETUP(...)

Mozilla currently uses only dlsym, and it's limiting. We have several
unrelated analysis scripts loaded throught the same binary plugin. The
binary plugin doesn't know in advance which passes the plugin wants to see. To implement this properly, we'd have to have which want to use the same
callback.

It's possible for the plugin to implement every possible dlsym entry point and then farm the calls out to each individual script pass internally, but since GCC is already going to have to maintain a list of callbacks, it seems
better to piggyback on the list GCC already maintains.

I agree that the current callback proposal seems overly generic. Perhaps registering specific hooks into the pass manager and other plugin targets
makes more sense?

typedef (void pluginpasshook)(tree t, void *data);

/* implemented in the pass manager */
register_plugin_event_after_pass(enum tree_pass, pluginpasshook fn, void* data)

Then, plugins would implement only a single entry point. GCC would inform the plugin of the arguments passed to it, and the plugin would register
callbacks to perform its actual work.

/* implemented in the plugin */
void gcc_plugin(const char *arguments);

instead of needing to register that callback.  Equivalently, a global
data structure in the plug-in could map hook UIDs to function pointers, giving the same effect. This latter approach would provide very elegant
hook versioning.

What kind of verisioning? I don't think that having a single compiled plugin
work with multiple versions of GCC should be a goal.

(3) The -fplugin-arg argument is one way to do arguments. We do it as

 -ftree-plugin=/path/to/plugin.so:arg=value:arg=value:...

We also have a magic argument called FILE that lets you load arguments
from a file.

I like this better than the current solution: with the current proposal it's
hard to tell which -fplugin-arg is supposed to go with which -fplugin.

I'm a little worried about the colon separator. Windows file paths may
legally have colons. Is there some separator character (semicolon?) which is not part of a path on any platform? Perhaps we shouldn't worry about it
since -rdynamic doesn't work on Windows anyway.

- --BDS
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iD8DBQFJh0ZOSSwGp5sTYNkRAkn6AJ9e4zMwlZIrpdX7XUPDCfR0+56EYACfQW9f
vMxuuIrJyP6O4hjo9b+fVwo=
=OxHa
-----END PGP SIGNATURE-----

Reply via email to