plugin.def: Add event for finish_decl.
2011-08-11 Romain Geissler <romain.geissler@gmail.com> 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. * g++.dg/plugin/decl-plugin-test.C: New. * g++.dg/plugin/plugin.exp: Add above testcase. Co-Authored-By: Brian Hackett <bhackett1024@gmail.com> From-SVN: r177674
This commit is contained in:
parent
25aa059e63
commit
4309e92c98
@ -1,3 +1,11 @@
|
||||
2011-08-11 Romain Geissler <romain.geissler@gmail.com>
|
||||
Brian Hackett <bhackett1024@gmail.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2011-08-11 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid redundant
|
||||
|
@ -4466,6 +4466,8 @@ finish_decl (tree decl, location_t init_loc, tree init,
|
||||
&& C_TYPE_FIELDS_READONLY (type))
|
||||
diagnose_uninitialized_cst_member (decl, type);
|
||||
}
|
||||
|
||||
invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
|
||||
}
|
||||
|
||||
/* Given a parsed parameter declaration, decode it into a PARM_DECL.
|
||||
|
@ -1,3 +1,8 @@
|
||||
2011-08-11 Romain Geissler <romain.geissler@gmail.com>
|
||||
Brian Hackett <bhackett1024@gmail.com>
|
||||
|
||||
* decl.c (cp_finish_decl): Invoke callbacks on finish_decl event.
|
||||
|
||||
2011-08-10 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* call.c (build_over_call): Call memcpy unconditionally.
|
||||
|
@ -6311,6 +6311,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
|
||||
|
||||
if (was_readonly)
|
||||
TREE_READONLY (decl) = 1;
|
||||
|
||||
invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
|
||||
}
|
||||
|
||||
/* Returns a declaration for a VAR_DECL as if:
|
||||
|
@ -151,6 +151,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. */
|
||||
|
@ -420,6 +420,7 @@ register_callback (const char *plugin_name,
|
||||
}
|
||||
/* Fall through. */
|
||||
case PLUGIN_FINISH_TYPE:
|
||||
case PLUGIN_FINISH_DECL:
|
||||
case PLUGIN_START_UNIT:
|
||||
case PLUGIN_FINISH_UNIT:
|
||||
case PLUGIN_PRE_GENERICIZE:
|
||||
@ -496,6 +497,7 @@ invoke_plugin_callbacks_full (int event, void *gcc_data)
|
||||
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:
|
||||
|
@ -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)
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
2011-08-11 Romain Geissler <romain.geissler@gmail.com>
|
||||
Brian Hackett <bhackett1024@gmail.com>
|
||||
|
||||
* g++.dg/plugin/decl_plugin.c: New.
|
||||
* g++.dg/plugin/decl-plugin-test.C: New.
|
||||
* g++.dg/plugin/plugin.exp: Add above testcase.
|
||||
|
||||
2011-08-11 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* g++.dg/tree-ssa/pr41186.C: Un-XFAIL.
|
||||
|
30
gcc/testsuite/g++.dg/plugin/decl-plugin-test.C
Normal file
30
gcc/testsuite/g++.dg/plugin/decl-plugin-test.C
Normal file
@ -0,0 +1,30 @@
|
||||
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;
|
||||
}
|
||||
};
|
51
gcc/testsuite/g++.dg/plugin/decl_plugin.c
Normal file
51
gcc/testsuite/g++.dg/plugin/decl_plugin.c
Normal file
@ -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_FILE_SCOPE_P(decl))
|
||||
kind = "Global";
|
||||
else
|
||||
kind = "Local";
|
||||
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;
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user