diff --git a/haxcc.h b/haxcc.h index c83f326..5ca5c5e 100644 --- a/haxcc.h +++ b/haxcc.h @@ -1,17 +1,20 @@ #ifndef HAXCC_H #define HAXCC_H -#define HAX_MOD(name) \ - static const struct mod name __attribute__((used, section("__haxmod"))) typedef int (*init_fn)(void); typedef int (*done_fn)(void); typedef struct mod { + char const* name; + int priority; init_fn init; done_fn done; } mod; +#define HAX_MOD(name) \ + static const struct mod name __attribute__((used, section("__haxmod"), aligned(__alignof__(struct mod)))) + mod* mod_begin(void); mod* mod_end(void); diff --git a/hello.cpp b/hello.cpp index b23bb70..f973182 100644 --- a/hello.cpp +++ b/hello.cpp @@ -9,7 +9,9 @@ auto main() -> int { std::printf("begin: %p, end: %p, len: %lu\n", (void*)mod_begin(), (void*)mod_end(), ((long)mod_end() - (long)mod_begin()) / sizeof(mod)); std::printf("\n"); - for (auto* it = mod_begin(); it != mod_end(); ++it) { + for (auto* it = mod_begin(); it < mod_end(); ++it) { + // std::printf("%lu: %lu\n", sizeof(mod), (long)it - (long)mod_begin()); + std::printf("%s [%d]: ", it->name, it->priority); it->init(); } @@ -18,6 +20,7 @@ auto main() -> int { std::printf("\n"); for (auto* it = mod_begin(); it != mod_end(); ++it) { + std::printf("%s [%d]: ", it->name, it->priority); it->done(); } return 0; diff --git a/meson.build b/meson.build index 5ed82ed..5f9c761 100644 --- a/meson.build +++ b/meson.build @@ -17,6 +17,7 @@ executable( 'haxcc.c', 'mods/mod_a.c', 'mods/mod_b.c', + 'mods/mod_c.c', ], link_args: ['-Wl,-T', meson.source_root() / ldscript, '-no-pie' ], install : false diff --git a/mods/mod_a.c b/mods/mod_a.c index 4d7de65..011ea58 100644 --- a/mods/mod_a.c +++ b/mods/mod_a.c @@ -2,17 +2,19 @@ #include -int mod_a_init(void) { +static int init(void) { printf("module a init\n"); return 0; } -int mod_a_done(void) { +static int done(void) { printf("module a done\n"); return 0; } HAX_MOD(mod_a) = { - .init = mod_a_init, - .done = mod_a_done + .name = "a", + .priority = 0, + .init = init, + .done = done }; diff --git a/mods/mod_b.c b/mods/mod_b.c index 16b3493..58410fc 100644 --- a/mods/mod_b.c +++ b/mods/mod_b.c @@ -2,17 +2,19 @@ #include -static int mod_b_init(void) { +static int init(void) { printf("top kek MODB!\n"); return 0; } -static int mod_b_done(void) { +static int done(void) { printf("MODB do be done!\n"); return 0; } HAX_MOD(mod_b) = { - .init = mod_b_init, - .done = mod_b_done + .name = "b", + .priority = 3, + .init = init, + .done = done }; diff --git a/mods/mod_c.c b/mods/mod_c.c new file mode 100644 index 0000000..5f86536 --- /dev/null +++ b/mods/mod_c.c @@ -0,0 +1,20 @@ +#include "haxcc.h" + +#include + +static int init(void) { + printf("top kek!\n"); + return 0; +} + +static int done(void) { + printf("meow !\n"); + return 0; +} + +HAX_MOD(mod_c) = { + .name = "c", + .priority = 2, + .init = init, + .done = done +};