Hello All, I was thinking of adding a new plugin hook for builtins.
The intuition is that some plugins could be pleased if they could add their own plugins (much like today's plugins can add their own pragmas or attributes). I imagine several use cases for such a feature, for example * a builtin which generate at compile time a random number, e.g. for hashing purpose. [this could also be delt by preprocessor magic, for instance giving the ability for plugins to extend the behavior of libcpp by adding new plugin-specific predefined macros like __COUNTER__, so we could have a __RANDOM__ macro which would expand, at cpp expansion time, to a random number. From what I understood adding new predefined macros from plugins seems harder than adding num builtins] * a builtin which calls a foreign function in some language implementation (e.g. SBCL Common Lisp or native Ocaml) which have incompatible calling conventions w.r.t. of those of GCC * a builtin which simplifies a call to some complex external function into something simpler. __builtin_printf seems already to do that, and I could imagine many other cases. * a builtin to help a precise garbage collector by flushing every live variable (which might have been declared with a special attribute) out of registers. * etc... My intuition, by first looking into the gcc/builtins.c file, is that it is mostly a matter of providing a way for the plugin to register its plugin specific builtins into some hashtable, and then having the expand_builtin of gcc/builtins.c end with some code similar to case BUILT_IN_FREE: maybe_emit_free_warning (exp); break; default: { /* the pointer to an expander provided by a plugin. */ rtx (*plugin_builtin_expanderfun) (int, tree, rtx, rtx); plugin_builtin_expanderfun = find_plugin_expander_for (fcode); if (plugin_builtin_expanderfun) { target = plugin_builtin_expanderfun (fcode, exp, target, subtarget); if (target) return target; } /* just do library call, if unknown builtin */ break; } /* The switch statement above can drop through to cause the function to be called normally. */ return expand_call (exp, target, ignore); } I actually intend to code something more flexible, by having plugin able to register a builtin expanding function with some client data. But is the overall idea enough, or did I misunderstood builtins? Could such a small patch be accepted before end of stage 1? Cheers -- Basile STARYNKEVITCH http://starynkevitch.net/Basile/ email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359 8, rue de la Faiencerie, 92340 Bourg La Reine, France *** opinions {are only mines, sont seulement les miennes} ***