From e61888df4f2a61b499292f40ab70715d43ca81e6 Mon Sep 17 00:00:00 2001
From: "nicolas.marie" <nicolas.marie@ensiie.eu>
Date: Thu, 26 Oct 2023 17:35:45 +0200
Subject: [PATCH] start work on pragma, add pragma handler and plugin finish
 handler for pragma function verification

---
 Makefile                      |  2 ++
 include/mpi_collective.hpp    | 12 +++++++++
 src/mpi_collective_pragma.cpp | 46 +++++++++++++++++++++++++++++++++++
 src/plugin.cpp                | 10 ++++++++
 src/test/test_pragma1.c       |  7 ++++++
 src/test/test_pragma2.c       |  6 +++++
 6 files changed, 83 insertions(+)
 create mode 100644 src/mpi_collective_pragma.cpp
 create mode 100644 src/test/test_pragma1.c
 create mode 100644 src/test/test_pragma2.c

diff --git a/Makefile b/Makefile
index 0f1d294..41faad1 100644
--- a/Makefile
+++ b/Makefile
@@ -57,6 +57,8 @@ test:
 	$(MAKE) $(TESTD)/test2
 	$(MAKE) $(TESTD)/test3
 	$(MAKE) $(TESTD)/test4
+	$(MAKE) $(TESTD)/test_pragma1
+	$(MAKE) $(TESTD)/test_pragma2
 
 .PHONY: dots
 dots:
diff --git a/include/mpi_collective.hpp b/include/mpi_collective.hpp
index 9d8c9ee..2f4392f 100644
--- a/include/mpi_collective.hpp
+++ b/include/mpi_collective.hpp
@@ -1,3 +1,6 @@
+#ifndef __MPI_COLLECTIVE_HPP_
+#define __MPI_COLLECTIVE_HPP_
+
 // dependance de tree-pass.H
 #include <gcc-plugin.h>
 // declare opt_pass
@@ -136,3 +139,12 @@ public:
 
 };
 
+//
+// mpi collective pragma
+//
+
+void register_mpicoll_check_pragma(void *event_data, void *data);
+void mpicoll_check_pragma(cpp_reader *);
+void verify_mpicoll_list(void *event_data, void *data);
+
+#endif
diff --git a/src/mpi_collective_pragma.cpp b/src/mpi_collective_pragma.cpp
new file mode 100644
index 0000000..be5dde3
--- /dev/null
+++ b/src/mpi_collective_pragma.cpp
@@ -0,0 +1,46 @@
+#include <cstdio>
+
+// dependance de c-pragma.h
+#include <gcc-plugin.h>
+// c_register_pragma
+#include <c-family/c-pragma.h>
+// IDENTIFIER_POINTER
+#include <tree.h>
+
+#include "mpi_collective.hpp"
+
+void register_mpicoll_check_pragma(void *event_data, void *data)
+{
+	(void) event_data;
+	(void) data;
+	printf("registering pragma: \"ProjectCA\"\n");
+	c_register_pragma("ProjetCA", "mpicoll_check", mpicoll_check_pragma);
+}
+
+void mpicoll_check_pragma(cpp_reader *)
+{
+	location_t loc;
+	cpp_ttype token;
+	tree x;
+
+	// on a pas acces a la fonction courante sans passer par cfun
+	if (cfun)
+	{
+		printf("#pragma ProjectCA mpicoll_check is not allowed inside functions");
+		return;
+	}
+
+	token = pragma_lex(&x, &loc);
+	if (token == CPP_NAME)
+	{
+		printf("adding %s to function to parse.\n", IDENTIFIER_POINTER(x));
+	}
+
+}
+
+void verify_mpicoll_list(void *event_data, void *data)
+{
+	(void) event_data;
+	(void) data;
+	printf("In verify mpicoll list\n");
+}
diff --git a/src/plugin.cpp b/src/plugin.cpp
index 3ee2fbb..51c5b79 100644
--- a/src/plugin.cpp
+++ b/src/plugin.cpp
@@ -60,5 +60,15 @@ plugin_init(struct plugin_name_args *plugin_info,
 	                  NULL,
 	                  &pass_info);
 
+	register_callback(plugin_info->base_name,
+	                  PLUGIN_PRAGMAS,
+	                  register_mpicoll_check_pragma,
+	                  NULL);
+
+	register_callback(plugin_info->base_name,
+	                  PLUGIN_FINISH_UNIT,
+	                  verify_mpicoll_list,
+	                  NULL);
+
 	return 0;
 }
diff --git a/src/test/test_pragma1.c b/src/test/test_pragma1.c
new file mode 100644
index 0000000..49e26b8
--- /dev/null
+++ b/src/test/test_pragma1.c
@@ -0,0 +1,7 @@
+
+int main(){
+
+	#pragma ProjetCA mpicoll_check main
+
+	return 0;
+}
diff --git a/src/test/test_pragma2.c b/src/test/test_pragma2.c
new file mode 100644
index 0000000..083e1e5
--- /dev/null
+++ b/src/test/test_pragma2.c
@@ -0,0 +1,6 @@
+
+
+#pragma ProjetCA mpicoll_check main
+int main(){
+	return 0;
+}
-- 
GitLab