Hello All

See also my message http://gcc.gnu.org/ml/gcc/2010-09/msg00270.html
about plugin hooks for plugin-provided builtins?

I was thinking of adding a new plugin hook for plugin-provided
additional macros.

The intuition is that some plugins would be delighted if they could
add their own predefined macros, like __COUNTER__.

I imagine several use cases for such a feature, such as:

  * we could have a plugin providing a __RANDOM__ macro wich would be
    expanded at cpp expansion time into a random number.

  * we could have a plugin provided __COMPILE_SYSTEM__ macro which
    would expand to a string (e.g. like the one given by the uname -a
    command) detailing the system on which GCC is running.

  * we could even have a __RANDOM_UPTO__(N) unary macro [with one
    argument] which would be expanded to a random number up to N
    (which should be a preprocessor constant). So a call to
    __RANDOM_UPTO__(64) would generate a random number between 0 and
    63 included, and a call to __RANDOM_UPTO__(100) would generate a
    ranom number between 0 & 99


  * we could have a __PRIME_NUMBERS_UPTO__(N) macro which would be
    expanded by all the prime numbers up to the constant N, with
    commas. So the user would just code

   int my_table_of_primes[] = { __PRIME_NUMBERS_UPTO__(10000) };


  * this is definitely extreme and I won't do that, but we could even
    imagine -just for the example- our gengtype being implemented by
    a complex plugin. Then GTY would be an attribute handled by that
    plugin, and #include "gt-foo.h" would be perhaps replaced by a
    __INCLUDE_GENGTYPE_CODE__ here macro which would include all the
    code gengtype currently is generating.

We could even imagine that some plugins would extend the existing CPP
directives. For instance, in
http://gcc.gnu.org/ml/gcc-patches/2010-09/msg01050.html I suggested a
#pragma GCC startsamelines but we could have it a #samelines directive
provided by a plugin. And we could imagine a plugin running popen
instead of fopen for #pinclude; I do know that open a lot of security
risks, but I also have many useful usage cases for that; for example
  #pinclude "echo const char mysystem[] = \"`uname -a`\";"

My current thinking is that 

  1. we should provide before end of stage 1 for 4.6 hooks for simple
  predefined macros without arguments like __RANDOM__ or
  __COMPILE_SYSTEM__. Maybe we should restrict these to some common
  prefix, like __GCCPLUGIN__RANDOM__ or
  __GCCPLUGIN__COMPILE_SYSTEM__. I would imagine it is not very
  difficult: After having provided registration facilities to plugins,
  I was thinking of extending _cpp_builtin_macro_text from
  libcpp/macro.c and providing hooks in cpp_init_special_builtins etc.

  2. I have no clear idea about plugin specific predefined macros with
  arguments, like __RANDOM_UPTO__(N) unary macro above. What are the
  issues in implementing that?

  3. Plugins should probably not be able to add CPP directives like
  #pinclude etc.. but we should make sure that the same is achievable
  using plugin provided #pragma-s. Is it really the case?  Are
  #pragma-s handled by libcpp somehow? Can the current trunk achieve
  the goals of #pinclude thru a pragma provided by a plugin?


Regards.
-- 
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} ***

Reply via email to