lower_dw: huge refactoring, allow custom lowering funcs, fix endianess problems
[libfirm] / include / libfirm / irhooks.h
index 0f9c840..9df478d 100644 (file)
@@ -29,6 +29,7 @@
 #include "irop.h"
 #include "irnode.h"
 #include "irgraph.h"
+#include "begin.h"
 
 /**
  * options for the hook_merge_nodes hook
@@ -59,12 +60,13 @@ typedef enum {
        HOOK_OPT_CONFIRM_C,   /**< a value was substituted by a const due to a Confirm */
        HOOK_OPT_CONFIRM_E,   /**< a value was evaluated due to a Confirm */
        HOOK_OPT_EXC_REM,     /**< a exception edge was removed due to a Confirmation prove */
+       HOOK_OPT_NORMALIZE,   /**< a commutative node was normalized */
        HOOK_LOWERED,         /**< lowered */
        HOOK_BACKEND,         /**< a backend transformation */
        HOOK_OPT_LAST
 } hook_opt_kind;
 
-typedef enum _if_result_t {
+typedef enum if_result_t {
        IF_RESULT_SUCCESS         = 0,  /**< if conversion could be done */
        IF_RESULT_SIDE_EFFECT     = 1,  /**< if conversion failed because of side effect */
        IF_RESULT_SIDE_EFFECT_PHI = 2,  /**< if conversion failed because of Phi node found */
@@ -104,6 +106,9 @@ typedef struct hook_entry {
                /** This hook is called, before a node is changed into an Id node. */
                void (*_hook_turn_into_id)(void *context, ir_node *node);
 
+               /** This hook is called, after a commutative node was normalized. */
+               void (*_hook_normalize)(void *context, ir_node *node);
+
                /** This hook is called, after a new graph was created and before the first block
                *  on this graph is build. */
                void (*_hook_new_graph)(void *context, ir_graph *irg, ir_entity *ent);
@@ -154,7 +159,7 @@ typedef struct hook_entry {
                /** This hook is called after a Mul was replaced by a series of Shift and Add/Sub operations. */
                void (*_hook_arch_dep_replace_mul_with_shifts)(void *context, ir_node *irn);
 
-               /** This hook is called after a Div/Mod/DivMod by a constant value was replaced. */
+               /** This hook is called after a Div/Mod by a constant value was replaced. */
                void (*_hook_arch_dep_replace_division_by_const)(void *context, ir_node *irn);
 
                /** This hook is called after a new mode was registered. */
@@ -187,6 +192,7 @@ typedef enum {
        hook_set_irn_n,
        hook_replace,
        hook_turn_into_id,
+       hook_normalize,
        hook_new_graph,
        hook_free_graph,
        hook_irg_walk,
@@ -217,7 +223,7 @@ typedef enum {
  * @param hook   the hook type
  * @param entry  the hook entry
  */
-void register_hook(hook_type_t hook, hook_entry_t *entry);
+FIRM_API void register_hook(hook_type_t hook, hook_entry_t *entry);
 
 /**
  * unregister a hook entry.
@@ -225,9 +231,9 @@ void register_hook(hook_type_t hook, hook_entry_t *entry);
  * @param hook   the hook type
  * @param entry  the hook entry
  */
-void unregister_hook(hook_type_t hook, hook_entry_t *entry);
+FIRM_API void unregister_hook(hook_type_t hook, hook_entry_t *entry);
 
-extern hook_entry_t *hooks[hook_last];
+FIRM_API hook_entry_t *hooks[hook_last];
 
 /**
  * execute the hook what with the args args
@@ -248,6 +254,7 @@ extern hook_entry_t *hooks[hook_last];
   hook_exec(hook_set_irn_n, (ctx, src, pos, tgt, old_tgt))
 #define hook_replace(old, nw)             hook_exec(hook_replace, (ctx, old, nw))
 #define hook_turn_into_id(node)           hook_exec(hook_turn_into_id, (ctx, node))
+#define hook_normalize(node)              hook_exec(hook_normalize, (ctx, node))
 #define hook_new_graph(irg, ent)          hook_exec(hook_new_graph, (ctx, irg, ent))
 #define hook_free_graph(irg)              hook_exec(hook_free_graph, (ctx, irg))
 #define hook_irg_walk(irg, pre, post)     hook_exec(hook_irg_walk, (ctx, irg, pre, post))
@@ -279,7 +286,6 @@ extern hook_entry_t *hooks[hook_last];
 #define hook_new_type(tp)                 hook_exec(hook_new_type, (ctx, tp))
 #define hook_node_info(F, node)           hook_exec(hook_node_info, (ctx, F, node))
 
-/* the initializer, move to hooks_t.h some day */
-int firm_init_hooks(void);
+#include "end.h"
 
 #endif