111
|
1 /* Demonstrates how to add custom pragmas */
|
|
2
|
|
3 #include "gcc-plugin.h"
|
|
4 #include <stdlib.h>
|
|
5 #include "config.h"
|
|
6 #include "system.h"
|
|
7 #include "coretypes.h"
|
|
8 #include "tm.h"
|
|
9 #include "rtl.h"
|
|
10 #include "tree.h"
|
|
11 #include "function.h"
|
|
12 #include "c-family/c-pragma.h"
|
|
13 #include "cpplib.h"
|
|
14 #include "tree-pass.h"
|
|
15 #include "intl.h"
|
|
16 #include "toplev.h"
|
|
17 #include "diagnostic.h"
|
|
18
|
|
19 int plugin_is_GPL_compatible;
|
|
20
|
|
21
|
|
22 /* handler of #pragma GCCPLUGIN sayhello "message" is quite similar to
|
|
23 handler of #pragma GCC message...*/
|
|
24
|
|
25 static void
|
|
26 handle_pragma_sayhello (cpp_reader *dummy)
|
|
27 {
|
|
28 tree message = 0;
|
|
29 if (pragma_lex (&message) != CPP_STRING)
|
|
30 {
|
|
31 warning (OPT_Wpragmas, "%<#pragma GCCPLUGIN sayhello%> is not a string");
|
|
32 return;
|
|
33 }
|
|
34 if (TREE_STRING_LENGTH (message) > 1)
|
|
35 {
|
131
|
36 location_t loc = expansion_point_location (input_location);
|
111
|
37 if (cfun)
|
131
|
38 warning_at (loc, OPT_Wpragmas,
|
|
39 "%<pragma GCCPLUGIN sayhello%> from function %qE: %s",
|
|
40 cfun->decl, TREE_STRING_POINTER (message));
|
111
|
41 else
|
131
|
42 warning_at (loc, OPT_Wpragmas,
|
|
43 "%<pragma GCCPLUGIN sayhello%> outside of function: %s",
|
|
44 TREE_STRING_POINTER (message));
|
111
|
45 }
|
|
46 }
|
|
47
|
|
48 /* Plugin callback called during pragma registration */
|
|
49
|
|
50 static void
|
|
51 register_my_pragma (void *event_data, void *data)
|
|
52 {
|
|
53 warning (0, G_("Callback to register pragmas"));
|
|
54 c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello);
|
|
55 }
|
|
56
|
|
57 int
|
|
58 plugin_init (struct plugin_name_args *plugin_info,
|
|
59 struct plugin_gcc_version *version)
|
|
60 {
|
|
61 const char *plugin_name = plugin_info->base_name;
|
|
62
|
|
63 register_callback (plugin_name, PLUGIN_PRAGMAS, register_my_pragma, NULL);
|
|
64 return 0;
|
|
65 }
|