plugin event for C/C++ declarations

Brian Hackett bhackett1024@gmail.com
Tue Apr 27 15:09:00 GMT 2010


Hi, can this patch be applied?  Also, is it possible for this change
to make it into the 4.5 branch?

Brian

http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00780.html

On Wed, Apr 14, 2010 at 6:54 AM, Brian Hackett <bhackett1024@gmail.com> wrote:
> On Mon, Apr 12, 2010 at 12:54 PM, Brian Hackett <bhackett1024@gmail.com> wrote:
>> Hi, I don't have write access.  I'll update the patch and rerun the
>> regressions for the current trunk (the patch below is a few months
>> old) and reply when that's done.
>>
>> Brian
>>
>> On Mon, Apr 12, 2010 at 12:39 PM, Diego Novillo <dnovillo@google.com> wrote:
>>> On Wed, Apr 7, 2010 at 14:30, Brian Hackett <bhackett1024@gmail.com> wrote:
>>>
>>>> http://gcc.gnu.org/ml/gcc-patches/2009-12/msg01032.html
>>>
>>> This is OK for trunk.  If you don't have write access let me know and
>>> I will help you applying the patch.
>>>
>>>
>>> Thanks.  Diego.
>
> OK, below is an updated patch against revision 158253.   I get the
> same regression results with and without this patch (modulo the new
> testcase).  Thanks,
>
> Brian
>
>
> 2010-04-14  Brian Hackett  <bhackett1024@gmail.com>
>
> gcc/ChangeLog:
>
>       * plugin.def: Add event for finish_decl.
>       * plugin.c (register_callback, invoke_plugin_callbacks): Same.
>       * c-decl.c (finish_decl): Invoke callbacks on above event.
>       * doc/plugins.texi: Document above event.
>
> gcc/cp/ChangeLog:
>
>       * decl.c (cp_finish_decl): Invoke callbacks on finish_decl event.
>
> gcc/testsuite/ChangeLog:
>
>       * g++.dg/plugin/decl_plugin.c: New test plugin.
>       * g++.dg/plugin/decl-plugin-test.C: Testcase for above plugin.
>       * g++.dg/plugin/plugin.exp: Add above testcase.
>
>
> Index: gcc/doc/plugins.texi
> ===================================================================
> --- gcc/doc/plugins.texi        (revision 158253)
> +++ gcc/doc/plugins.texi        (working copy)
> @@ -149,6 +149,7 @@ enum plugin_event
>  @{
>   PLUGIN_PASS_MANAGER_SETUP,    /* To hook into pass manager.  */
>   PLUGIN_FINISH_TYPE,           /* After finishing parsing a type.  */
> +  PLUGIN_FINISH_DECL,           /* After finishing parsing a declaration. */
>   PLUGIN_FINISH_UNIT,           /* Useful for summary processing.  */
>   PLUGIN_PRE_GENERICIZE,        /* Allows to see low level AST in C
> and C++ frontends.  */
>   PLUGIN_FINISH,                /* Called before GCC exits.  */
> Index: gcc/plugin.def
> ===================================================================
> --- gcc/plugin.def      (revision 158253)
> +++ gcc/plugin.def      (working copy)
> @@ -24,6 +24,9 @@ DEFEVENT (PLUGIN_PASS_MANAGER_SETUP)
>  /* After finishing parsing a type.  */
>  DEFEVENT (PLUGIN_FINISH_TYPE)
>
> +/* After finishing parsing a declaration. */
> +DEFEVENT (PLUGIN_FINISH_DECL)
> +
>  /* Useful for summary processing.  */
>  DEFEVENT (PLUGIN_FINISH_UNIT)
>
> Index: gcc/testsuite/g++.dg/plugin/plugin.exp
> ===================================================================
> --- gcc/testsuite/g++.dg/plugin/plugin.exp      (revision 158253)
> +++ gcc/testsuite/g++.dg/plugin/plugin.exp      (working copy)
> @@ -51,7 +51,8 @@ set plugin_test_list [list \
>     { pragma_plugin.c pragma_plugin-test-1.C } \
>     { selfassign.c self-assign-test-1.C self-assign-test-2.C
> self-assign-test-3.C } \
>     { dumb_plugin.c dumb-plugin-test-1.C } \
> -    { header_plugin.c header-plugin-test.C } ]
> +    { header_plugin.c header-plugin-test.C } \
> +    { decl_plugin.c decl-plugin-test.C } ]
>
>  foreach plugin_test $plugin_test_list {
>     # Replace each source file with its full-path name
> Index: gcc/testsuite/g++.dg/plugin/decl-plugin-test.C
> ===================================================================
> --- gcc/testsuite/g++.dg/plugin/decl-plugin-test.C      (revision 0)
> +++ gcc/testsuite/g++.dg/plugin/decl-plugin-test.C      (revision 0)
> @@ -0,0 +1,32 @@
> +
> +
> +extern int global; // { dg-warning "Decl Global global" }
> +int global_array[] = { 1, 2, 3 }; // { dg-warning "Decl Global global_array" }
> +
> +int takes_args(int arg1, int arg2)
> +{
> +  int local = arg1 + arg2 + global; // { dg-warning "Decl Local local" }
> +  return local + 1;
> +}
> +
> +int global = 12; // { dg-warning "Decl Global global" }
> +
> +struct test_str {
> +  int field; // { dg-warning "Decl Field field" }
> +};
> +
> +class test_class {
> +  int class_field1; // { dg-warning "Decl Field class_field1" }
> +  int class_field2; // { dg-warning "Decl Field class_field2" }
> +
> +  test_class() // { dg-warning "Decl Function test_class" }
> +    : class_field1(0), class_field2(0)
> +  {}
> +
> +  void swap_fields(int bias) // { dg-warning "Decl Function swap_fields" }
> +  {
> +    int temp = class_field1 + bias; // { dg-warning "Decl Local temp" }
> +    class_field1 = class_field2 - bias;
> +    class_field2 = temp;
> +  }
> +};
> Index: gcc/testsuite/g++.dg/plugin/decl_plugin.c
> ===================================================================
> --- gcc/testsuite/g++.dg/plugin/decl_plugin.c   (revision 0)
> +++ gcc/testsuite/g++.dg/plugin/decl_plugin.c   (revision 0)
> @@ -0,0 +1,51 @@
> +/* A plugin example that shows which declarations are caught by FINISH_DECL */
> +
> +#include "gcc-plugin.h"
> +#include <stdlib.h>
> +#include "config.h"
> +#include "system.h"
> +#include "coretypes.h"
> +#include "tree.h"
> +#include "tree-pass.h"
> +#include "intl.h"
> +
> +int plugin_is_GPL_compatible;
> +
> +/* Callback function to invoke after GCC finishes a declaration. */
> +
> +void plugin_finish_decl (void *event_data, void *data)
> +{
> +  tree decl = (tree) event_data;
> +
> +  const char *kind = NULL;
> +  switch (TREE_CODE(decl)) {
> +  case FUNCTION_DECL:
> +    kind = "Function"; break;
> +  case PARM_DECL:
> +    kind = "Parameter"; break;
> +  case VAR_DECL:
> +    if (DECL_CONTEXT(decl) != NULL)
> +      kind = "Local";
> +    else
> +      kind = "Global";
> +    break;
> +  case FIELD_DECL:
> +    kind = "Field"; break;
> +  default:
> +    kind = "Unknown";
> +  }
> +
> +  warning (0, G_("Decl %s %s"),
> +           kind, IDENTIFIER_POINTER (DECL_NAME (decl)));
> +}
> +
> +int
> +plugin_init (struct plugin_name_args *plugin_info,
> +             struct plugin_gcc_version *version)
> +{
> +  const char *plugin_name = plugin_info->base_name;
> +
> +  register_callback (plugin_name, PLUGIN_FINISH_DECL,
> +                     plugin_finish_decl, NULL);
> +  return 0;
> +}
> Index: gcc/cp/decl.c
> ===================================================================
> --- gcc/cp/decl.c       (revision 158253)
> +++ gcc/cp/decl.c       (working copy)
> @@ -5972,6 +5972,8 @@ cp_finish_decl (tree decl, tree init, bo
>   /* If this was marked 'used', be sure it will be output.  */
>   if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
>     mark_decl_referenced (decl);
> +
> +  invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
>  }
>
>  /* Returns a declaration for a VAR_DECL as if:
> Index: gcc/c-decl.c
> ===================================================================
> --- gcc/c-decl.c        (revision 158253)
> +++ gcc/c-decl.c        (working copy)
> @@ -4405,6 +4405,8 @@ finish_decl (tree decl, location_t init_
>       && DECL_INITIAL (decl) == NULL_TREE)
>     warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wc___compat,
>                "uninitialized const %qD is invalid in C++", decl);
> +
> +  invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
>  }
>
>  /* Given a parsed parameter declaration, decode it into a PARM_DECL.  */
> Index: gcc/plugin.c
> ===================================================================
> --- gcc/plugin.c        (revision 158253)
> +++ gcc/plugin.c        (working copy)
> @@ -425,6 +425,7 @@ register_callback (const char *plugin_na
>          }
>       /* Fall through.  */
>       case PLUGIN_FINISH_TYPE:
> +      case PLUGIN_FINISH_DECL:
>       case PLUGIN_START_UNIT:
>       case PLUGIN_FINISH_UNIT:
>       case PLUGIN_PRE_GENERICIZE:
> @@ -506,6 +507,7 @@ invoke_plugin_callbacks (int event, void
>        gcc_assert (event < event_last);
>       /* Fall through.  */
>       case PLUGIN_FINISH_TYPE:
> +      case PLUGIN_FINISH_DECL:
>       case PLUGIN_START_UNIT:
>       case PLUGIN_FINISH_UNIT:
>       case PLUGIN_PRE_GENERICIZE:
>



More information about the Gcc-patches mailing list