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