diff --git a/Makefile b/Makefile index 0f1d2941db42d9efeb11bde65bd9dd2ffcbb9118..41faad1dee945ca30eb82d285228a7014eab4fb3 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 9d8c9eee2f4d8087afe9f6b6077bd49fdc94fc71..2f4392f8f038e9023237426dda7658065d4f0596 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 0000000000000000000000000000000000000000..be5dde3ebf6dc2cd691a17cac7230c05d9abe487 --- /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 3ee2fbb41aaa94503e5e62e12ea50ec9203949c4..51c5b7954de89e5ff5d50a76fc01746c8db1c91a 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 0000000000000000000000000000000000000000..49e26b8f7d886444c967a060fbe21baae07d06b3 --- /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 0000000000000000000000000000000000000000..083e1e5d04a2fa1ca8b404ad17df8185efd7437e --- /dev/null +++ b/src/test/test_pragma2.c @@ -0,0 +1,6 @@ + + +#pragma ProjetCA mpicoll_check main +int main(){ + return 0; +}