projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
get_irn_n_edges: out_count still broken, switched back to recalculation
[libfirm]
/
ir
/
ir
/
irhooks.c
diff --git
a/ir/ir/irhooks.c
b/ir/ir/irhooks.c
index
3854f00
..
6349aa0
100644
(file)
--- 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) {
/* 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;
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;
}
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) {}
#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 */
#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;
}
}