summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/plugin/pragma_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/plugin/pragma_plugin.c')
-rw-r--r--gcc/testsuite/g++.dg/plugin/pragma_plugin.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/plugin/pragma_plugin.c b/gcc/testsuite/g++.dg/plugin/pragma_plugin.c
new file mode 100644
index 000000000..940c302df
--- /dev/null
+++ b/gcc/testsuite/g++.dg/plugin/pragma_plugin.c
@@ -0,0 +1,62 @@
+/* Demonstrates how to add custom pragmas */
+
+#include "gcc-plugin.h"
+#include <stdlib.h>
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "rtl.h"
+#include "tree.h"
+#include "function.h"
+#include "c-family/c-pragma.h"
+#include "cpplib.h"
+#include "tree-pass.h"
+#include "intl.h"
+#include "toplev.h"
+#include "diagnostic.h"
+
+int plugin_is_GPL_compatible;
+
+
+/* handler of #pragma GCCPLUGIN sayhello "message" is quite similar to
+ handler of #pragma GCC message...*/
+
+static void
+handle_pragma_sayhello (cpp_reader *dummy)
+{
+ tree message = 0;
+ if (pragma_lex (&message) != CPP_STRING)
+ {
+ warning (OPT_Wpragmas, "%<#pragma GCCPLUGIN sayhello%> is not a string");
+ return;
+ }
+ if (TREE_STRING_LENGTH (message) > 1)
+ if (cfun)
+ warning (OPT_Wpragmas,
+ "%<pragma GCCPLUGIN sayhello%> from function %qE: %s",
+ cfun->decl, TREE_STRING_POINTER (message));
+ else
+ warning (OPT_Wpragmas,
+ "%<pragma GCCPLUGIN sayhello%> outside of function: %s",
+ TREE_STRING_POINTER (message));
+}
+
+/* Plugin callback called during pragma registration */
+
+static void
+register_my_pragma (void *event_data, void *data)
+{
+ warning (0, G_("Callback to register pragmas"));
+ c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello);
+}
+
+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_PRAGMAS, register_my_pragma, NULL);
+ return 0;
+}