X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firhooks.c;h=6349aa051b4e63a88857317f794b618d0870addb;hb=430d301ab1b86461fa1f1f6a2f60b3a2bc1468ef;hp=3854f0049c7404a596b36d123e2dbe5c0d5f226c;hpb=dcdbf8578b5fd33fa78352486685ecad0fe1b552;p=libfirm diff --git a/ir/ir/irhooks.c b/ir/ir/irhooks.c index 3854f0049..6349aa051 100644 --- a/ir/ir/irhooks.c +++ b/ir/ir/irhooks.c @@ -29,6 +29,7 @@ hook_entry_t *hooks[hook_last]; /* register a hook */ void register_hook(hook_type_t hook, hook_entry_t *entry) { + /* check if a hook function is specified. It's a union, so no matter which one */ if (! entry->hook._hook_turn_into_id) return; @@ -36,13 +37,35 @@ void register_hook(hook_type_t hook, hook_entry_t *entry) { hooks[hook] = entry; } +/* unregister a hook */ +void unregister_hook(hook_type_t hook, hook_entry_t *entry) { + hook_entry_t *p; + + if (hooks[hook] == entry) { + hooks[hook] = entry->next; + entry->next = NULL; + return; + } + + for (p = hooks[hook]; p && p->next != entry; p = p->next); + + if (p) { + p->next = entry->next; + entry->next = NULL; + } +} + + #else void register_hook(hook_type_t hook, hook_entry_t *entry) {} +void unregister_hook(hook_type_t hook, hook_entry_t *entry) {} #endif /* FIRM_ENABLE_HOOKS */ -int init_hooks(void) -{ - return (int)register_hook; +int firm_init_hooks(void) { + /* this strange code assures that both functions are available + in a shared library even if none of them is called. + Meanwhile not needed anymore but ... */ + return (int)register_hook + (int)unregister_hook; }