get_irn_n_edges: out_count still broken, switched back to recalculation
[libfirm] / ir / ir / irhooks.c
index 0341f7d..6349aa0 100644 (file)
@@ -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,8 +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 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;
+}