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

Reply via email to