OSDN Git Service

2009-05-06 Le-Chun Wu <lcwu@google.com>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.dg / plugin / dumb_plugin.c
1 /* A trivial (dumb) plugin example that shows how to use the GCC plugin
2    mechanism.  */
3
4 #include <stdlib.h>
5 #include "config.h"
6 #include "system.h"
7 #include "coretypes.h"
8 #include "tree.h"
9 #include "tree-pass.h"
10 #include "intl.h"
11 #include "gcc-plugin.h"
12
13
14 /* Callback function to invoke after GCC finishes parsing a struct.  */
15
16 void
17 handle_struct (void *event_data, void *data)
18 {
19   tree type = (tree) event_data;
20   warning (0, G_("Process struct %s"),
21            IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
22 }
23
24 /* Callback function to invoke before the program is genericized.  */ 
25
26 void
27 handle_pre_generic (void *event_data, void *data)
28 {
29   tree fndecl = (tree) event_data;
30   warning (0, G_("Before genericizing function %s"),
31            IDENTIFIER_POINTER (DECL_NAME (fndecl)));
32 }
33
34 /* Callback function to invoke after GCC finishes the compilation unit.  */
35
36 void
37 handle_end_of_compilation_unit (void *event_data, void *data)
38 {
39   warning (0, G_("End of compilation unit"));
40 }
41
42
43 static unsigned int
44 execute_dumb_plugin_example (void)
45 {
46   warning (0, G_("Analyze function %s"),
47            IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
48   return 0;
49 }
50
51 static bool
52 gate_dumb_plugin_example (void)
53 {
54   return true;
55 }
56
57 static struct gimple_opt_pass pass_dumb_plugin_example =
58 {
59   {
60     GIMPLE_PASS,
61     "dumb_plugin_example",                /* name */
62     gate_dumb_plugin_example,             /* gate */
63     execute_dumb_plugin_example,          /* execute */
64     NULL,                                 /* sub */
65     NULL,                                 /* next */
66     0,                                    /* static_pass_number */
67     0,                                    /* tv_id */
68     PROP_cfg,                             /* properties_required */
69     0,                                    /* properties_provided */
70     0,                                    /* properties_destroyed */
71     0,                                    /* todo_flags_start */
72     TODO_dump_func                        /* todo_flags_finish */
73   }
74 };
75
76 /* Initialization function that GCC calls. This plugin takes an argument
77    that specifies the name of the reference pass and an instance number,
78    both of which determine where the plugin pass should be inserted.  */
79
80 int
81 plugin_init (const char *plugin_name,
82              struct plugin_gcc_version *version __attribute__((unused)),
83              int argc, struct plugin_argument *argv)
84 {
85   struct plugin_pass pass_info;
86   char *ref_pass_name = NULL;
87   int ref_instance_number = 0;
88   int i;
89
90   /* Process the plugin arguments. This plugin takes the following arguments:
91      ref-pass-name=<PASS_NAME> and ref-pass-instance-num=<NUM>.  */
92   for (i = 0; i < argc; ++i)
93     {
94       if (!strcmp (argv[i].key, "ref-pass-name"))
95         {
96           if (argv[i].value)
97             ref_pass_name = argv[i].value;
98           else
99             warning (0, G_("option '-fplugin-arg-%s-ref-pass-name'"
100                            " requires a pass name"), plugin_name);
101         }
102       else if (!strcmp (argv[i].key, "ref-pass-instance-num"))
103         {
104           if (argv[i].value)
105             ref_instance_number = strtol (argv[i].value, NULL, 0);
106           else
107             warning (0, G_("option '-fplugin-arg-%s-ref-pass-instance-num'"
108                            " requires an integer value"), plugin_name);
109         }
110       else
111         warning (0, G_("plugin %qs: unrecognized argument %qs ignored"),
112                  plugin_name, argv[i].key);
113     }
114
115   if (!ref_pass_name)
116     {
117       error (G_("plugin %qs requires a reference pass name"), plugin_name);
118       return 1;
119     }
120
121   pass_info.pass = &pass_dumb_plugin_example.pass;
122   pass_info.reference_pass_name = ref_pass_name;
123   pass_info.ref_pass_instance_number = ref_instance_number;
124   pass_info.pos_op = PASS_POS_INSERT_AFTER;
125
126   register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
127
128   register_callback (plugin_name, PLUGIN_FINISH_TYPE, handle_struct, NULL);
129
130   register_callback (plugin_name, PLUGIN_CXX_CP_PRE_GENERICIZE,
131                      handle_pre_generic, NULL);
132
133   register_callback (plugin_name, PLUGIN_FINISH_UNIT,
134                      handle_end_of_compilation_unit, NULL);
135   return 0;
136 }