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