diff --git a/Makefile b/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..27d00b35f6751f4f0495f1df8e230cfd364840e7 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +all: plugin + +FILE=main.c prog_test.c + +CXX=g++_810 +CC=gcc_810 + +MPICC=mpicc + +PLUGIN_FLAGS=-I`$(CC) -print-file-name=plugin`/include -g -Wall -fno-rtti -shared -fPIC + +CFLAGS=-g -O3 + + +libplugin.so: plugin.cpp + $(CXX) $(PLUGIN_FLAGS) -o $@ $< + +plugin: libplugin.so prog_test.c + $(MPICC) prog_test.c $(CFLAGS) -o $@ -fplugin=./$< + +%.pdf: %.dot + dot -Tpdf $< -o $@ + +clean: + rm -rf *.pgr *.pdf plugin + +clean_all: clean + rm -rf libplugin.so *.dot plugin diff --git a/libplugin.so b/libplugin.so new file mode 100755 index 0000000000000000000000000000000000000000..97d39a670503e60fa206df47ea639a11afce5881 Binary files /dev/null and b/libplugin.so differ diff --git a/main.c b/main.c new file mode 100755 index 0000000000000000000000000000000000000000..3512d1bbc078171b7885608ec52b4142c1f9170c --- /dev/null +++ b/main.c @@ -0,0 +1,15 @@ +/** + * \file main.c + * \brief Main du programme de test pour notre plugin +*/ +#include <stdio.h> +#include "prog_test.h" + +int main (int argc, char **argv) { + + printf("begining main\n"); + mock1(); + printf("ending main\n"); + + return 0; +} diff --git a/plugin b/plugin new file mode 100755 index 0000000000000000000000000000000000000000..62ebe8f26368633ec22acc9f138a7074fd8bdb65 Binary files /dev/null and b/plugin differ diff --git a/plugin.cpp b/plugin.cpp new file mode 100755 index 0000000000000000000000000000000000000000..e1fa0228992337eb1377ba239178403638ed2c86 --- /dev/null +++ b/plugin.cpp @@ -0,0 +1,110 @@ +#include <gcc-plugin.h> +#include <plugin-version.h> +#include <tree.h> +#include <basic-block.h> +#include <gimple.h> +#include <tree-pass.h> +#include <context.h> +#include <function.h> +#include <gimple-iterator.h> +#include <c-family/c-pragma.h> +#include "system.h" +#include "vec.h" +#include <string.h> + +int plugin_is_GPL_compatible; + +const pass_data my_pass_data = +{ + GIMPLE_PASS, /* type */ + "NEW_PASS", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_OPTIMIZE, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + + + +static void my_pragma_action(cpp_reader *ARG_UNUSED(dummy)) +{ + printf("****** Pragam detected: ******\n"); + printf("\n\n"); +} + + +static void register_my_pragma(void *event_data, void *data) +{ + c_register_pragma ("instrumente", "function", my_pragma_action); +} + + +class my_pass : public gimple_opt_pass +{ + public: + my_pass (gcc::context *ctxt) + : gimple_opt_pass (my_pass_data, ctxt) + {} + + /* opt_pass methods: */ + my_pass *clone () + { + return new my_pass(g); + } + + + + /* Gate function (shall we apply this pass?) */ + bool gate (function * fun) + { + printf("plugin: gate... \n"); + return true; + } + + + + /* Execute function */ + unsigned int execute (function *fun) + { + printf("plugin: execute...\n"); + return 0; + } +}; + + +int plugin_init(struct plugin_name_args * plugin_info, struct plugin_gcc_version * version) +{ + + fprintf(stderr, "\n*********************************\n"); + fprintf(stderr, "init - plugin dilasser/donnenfeld\n"); + fprintf(stderr, "*********************************\n\n\n"); + + if(!plugin_default_version_check(version, &gcc_version)) return 1; + + struct register_pass_info my_pass_info; + + my_pass p(g); + + my_pass_info.pass = &p; + my_pass_info.reference_pass_name = "cfg"; + my_pass_info.ref_pass_instance_number = 0; + my_pass_info.pos_op = PASS_POS_INSERT_AFTER; + + + + //REGISTER PASS + register_callback(plugin_info->base_name, + PLUGIN_PASS_MANAGER_SETUP, + NULL, + &my_pass_info); + + // REGISTER PRAGMA + register_callback("plugin_name", PLUGIN_PRAGMAS, register_my_pragma, NULL ); + + + return 0; +} + diff --git a/prog_test.c b/prog_test.c new file mode 100755 index 0000000000000000000000000000000000000000..8e5bbfa74e3b0a090c23c1538716912e1a9845ec --- /dev/null +++ b/prog_test.c @@ -0,0 +1,36 @@ +/** + * \file main.c + * \brief TEST PLUGIN +*/ +#include <stdio.h> +#include "prog_test.h" + +#pragma instrumente function mock1 +#pragma instrumente function mock2 +#pragma instrumente function mock3,mock5 +#pragma instrumente function (mock4,mock6) +#pragma instrumente function CANARD +#pragma instrumente function mock1 +#pragma instrumente function (coincoin + +void mock1() { + printf("mock1\n"); + #pragma instrumente function MOCK1 +} + +void mock2() { + printf("mock2\n"); +} + +void mock3() { + printf("mock3\n"); +} + +void mock4() { + printf("mock4\n"); +} + +int main(int argc, char *argv[]) +{ + return 0; +} diff --git a/prog_test.h b/prog_test.h new file mode 100755 index 0000000000000000000000000000000000000000..68401f4f4a7c94e4de83446ae6c0bc2041935897 --- /dev/null +++ b/prog_test.h @@ -0,0 +1,9 @@ +#ifndef __TEST__H +#define __TEST__H + +void mock1(); +void mock2(); +void mock3(); +void mock4(); + +#endif