This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: plugin event for C/C++ declarations


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:
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]