fix lower_mode_b relying on current_ir_graph being equal to the passed irg; make...
[libfirm] / include / libfirm / irgraph.h
index 82ef807..91eafb3 100644 (file)
 
 #include <stddef.h>
 
-#include "firm_config.h"
 #include "firm_types.h"
-#include "irop.h"
-#include "iropt.h"
-#include "irextbb.h"
-#include "typerep.h"
+#include "begin.h"
 
 /**
  * @page ir_graph   The struct ir_graph
  *  interface in ircons and by the optimizations.
  *  Further it is set by all walker functions.
  */
-extern ir_graph *current_ir_graph;
+FIRM_API ir_graph *current_ir_graph;
 
-ir_graph *get_current_ir_graph(void);
-void      set_current_ir_graph(ir_graph *graph);
-
-#ifdef INTERPROCEDURAL_VIEW
-/** This flag indicate the current view. The behavior of some methods
- * (get_irn_*, set_irn_*) is influenced by this flag. */
-int get_interprocedural_view(void);
-void set_interprocedural_view(int state);
-#else
-#define get_interprocedural_view()  0
-#endif
+FIRM_API ir_graph *get_current_ir_graph(void);
+FIRM_API void set_current_ir_graph(ir_graph *graph);
 
 /**
  * Create a new ir graph to build ir for a procedure.
@@ -173,7 +160,7 @@ void set_interprocedural_view(int state);
  *
  * @see new_pseudo_ir_graph()
  */
-ir_graph *new_ir_graph(ir_entity *ent, int n_loc);
+FIRM_API ir_graph *new_ir_graph(ir_entity *ent, int n_loc);
 
 /** Frees the passed irgraph.
  * Deallocates all nodes in this graph and the ir_graph structure.
@@ -183,7 +170,7 @@ ir_graph *new_ir_graph(ir_entity *ent, int n_loc);
  * Does not free types, entities or modes that are used only by this
  * graph, nor the entity standing for this graph.
  */
-void free_ir_graph(ir_graph *irg);
+FIRM_API void free_ir_graph(ir_graph *irg);
 
 /* --- access routines for all ir_graph attributes --- */
 
@@ -195,108 +182,107 @@ void free_ir_graph(ir_graph *irg);
  *   @return
  *       true if the thing is a IR graph, else false
  */
-int      is_ir_graph(const void *thing);
+FIRM_API int is_ir_graph(const void *thing);
 
 /** Returns the entity of an IR graph. */
-ir_entity *get_irg_entity(const ir_graph *irg);
+FIRM_API ir_entity *get_irg_entity(const ir_graph *irg);
 /** Sets the entity of an IR graph. */
-void       set_irg_entity(ir_graph *irg, ir_entity *ent);
+FIRM_API void set_irg_entity(ir_graph *irg, ir_entity *ent);
 
 /** Returns the frame type of an IR graph. */
-ir_type *get_irg_frame_type(ir_graph *irg);
+FIRM_API ir_type *get_irg_frame_type(ir_graph *irg);
 /** Sets the frame type of an IR graph. */
-void     set_irg_frame_type(ir_graph *irg, ir_type *ftp);
+FIRM_API void set_irg_frame_type(ir_graph *irg, ir_type *ftp);
+
+/** Returns the value parameter type of an IR graph. */
+FIRM_API ir_type *get_irg_value_param_type(ir_graph *irg);
 
 /** Returns the start block of an IR graph. */
-ir_node *get_irg_start_block(const ir_graph *irg);
+FIRM_API ir_node *get_irg_start_block(const ir_graph *irg);
 /** Sets the start block of an IR graph. */
-void     set_irg_start_block(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_start_block(ir_graph *irg, ir_node *node);
 
 /** Returns the Start node of an IR graph. */
-ir_node *get_irg_start(const ir_graph *irg);
+FIRM_API ir_node *get_irg_start(const ir_graph *irg);
 /** Sets the Start node of an IR graph. */
-void     set_irg_start(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_start(ir_graph *irg, ir_node *node);
 
 /** Returns the end block of an IR graph. */
-ir_node *get_irg_end_block(const ir_graph *irg);
+FIRM_API ir_node *get_irg_end_block(const ir_graph *irg);
 /** Sets the end block of an IR graph. */
-void     set_irg_end_block(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_end_block(ir_graph *irg, ir_node *node);
 
 /** Returns the End node of an IR graph. */
-ir_node *get_irg_end(const ir_graph *irg);
+FIRM_API ir_node *get_irg_end(const ir_graph *irg);
 /** Sets the End node of an IR graph. */
-void     set_irg_end(ir_graph *irg, ir_node *node);
-
-/* The fields end_reg and end_except contain the end nodes of the
-   interprocedural view.  If the view is not constructed they contain
-   the normal end node. */
-ir_node *get_irg_end_reg(const ir_graph *irg);
-void     set_irg_end_reg(ir_graph *irg, ir_node *node);
-
-ir_node *get_irg_end_except(const ir_graph *irg);
-void     set_irg_end_except(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_end(ir_graph *irg, ir_node *node);
 
-/** Returns the node that represents the initial control flow of the given IR graph. */
-ir_node *get_irg_initial_exec(const ir_graph *irg);
+/** Returns the node that represents the initial control flow of the given
+ * IR graph. */
+FIRM_API ir_node *get_irg_initial_exec(const ir_graph *irg);
 /** Sets the node that represents the initial control of the given IR graph. */
-void     set_irg_initial_exec(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_initial_exec(ir_graph *irg, ir_node *node);
 
 /** Returns the node that represents the frame pointer of the given IR graph. */
-ir_node *get_irg_frame(const ir_graph *irg);
+FIRM_API ir_node *get_irg_frame(const ir_graph *irg);
 /** Sets the node that represents the frame pointer of the given IR graph. */
-void     set_irg_frame(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_frame(ir_graph *irg, ir_node *node);
 
 /** Returns the node that represents the tls pointer of the given IR graph. */
-ir_node *get_irg_tls(const ir_graph *irg);
+FIRM_API ir_node *get_irg_tls(const ir_graph *irg);
 /** Sets the node that represents the tls pointer of the given IR graph. */
-void     set_irg_tls(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_tls(ir_graph *irg, ir_node *node);
 
 /** Returns the node that represents the initial memory of the given IR graph. */
-ir_node *get_irg_initial_mem(const ir_graph *irg);
+FIRM_API ir_node *get_irg_initial_mem(const ir_graph *irg);
 /** Sets the node that represents the initial memory of the given IR graph. */
-void     set_irg_initial_mem(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_initial_mem(ir_graph *irg, ir_node *node);
 
 /** Returns the node that represents the argument pointer of the given IR graph. */
-ir_node *get_irg_args(const ir_graph *irg);
+FIRM_API ir_node *get_irg_args(const ir_graph *irg);
 /** Sets the node that represents the argument pointer of the given IR graph. */
-void     set_irg_args(ir_graph *irg, ir_node *node);
-
-/** Returns the node that represents the value parameter base pointer of the given IR graph. */
-ir_node *get_irg_value_param_base(const ir_graph *irg);
-/** Sets the node that represents the value parameter base pointer of the given IR graph. */
-void     set_irg_value_param_base(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_args(ir_graph *irg, ir_node *node);
 
 /** Returns the current block of an IR graph. */
-ir_node *get_irg_current_block(const ir_graph *irg);
+FIRM_API ir_node *get_irg_current_block(const ir_graph *irg);
 /** Sets the current block of an IR graph. */
-void     set_irg_current_block(ir_graph *irg, ir_node *node);
+FIRM_API void set_irg_current_block(ir_graph *irg, ir_node *node);
 
 /** Returns the Bad node of the given IR graph.  Use new_Bad() instead!! */
-ir_node *get_irg_bad(const ir_graph *irg);
-void     set_irg_bad(ir_graph *irg, ir_node *node);
+FIRM_API ir_node *get_irg_bad(const ir_graph *irg);
+FIRM_API void set_irg_bad(ir_graph *irg, ir_node *node);
 
 /** Returns the NoMem node of the given IR graph.  Use new_NoMem() instead!! */
-ir_node *get_irg_no_mem(const ir_graph *irg);
-void     set_irg_no_mem(ir_graph *irg, ir_node *node);
+FIRM_API ir_node *get_irg_no_mem(const ir_graph *irg);
+FIRM_API void set_irg_no_mem(ir_graph *irg, ir_node *node);
 
 /** Returns the number of value numbers of an IR graph. */
-int      get_irg_n_locs(ir_graph *irg);
+FIRM_API int get_irg_n_locs(ir_graph *irg);
 
-#ifdef DEBUG_libfirm
 /** Returns the graph number. */
-long     get_irg_graph_nr(const ir_graph *irg);
-#endif
+FIRM_API long get_irg_graph_nr(const ir_graph *irg);
 
 /**
  * Returns the graph number. This is a unique number for the graph and is
  * smaller than get_irp_last_idx()
  * Note: you cannot use this number for get_irp_irg()
  */
-int get_irg_idx(const ir_graph *irg);
+FIRM_API int get_irg_idx(const ir_graph *irg);
+
+/**
+ * Get the node for an index.
+ * @param irg The graph.
+ * @param idx The index you want the node for.
+ * @return    The node with that index or NULL, if there is no node with that
+ *            index.
+ * @note      The node you got might be dead.
+ */
+FIRM_API ir_node *get_idx_irn(ir_graph *irg, unsigned idx);
 
-/********************************************************************************/
-/* States of an ir_graph.                                                       */
-/********************************************************************************/
+
+/******************************************************************************/
+/* States of an ir_graph.                                                     */
+/******************************************************************************/
 
 /*
    information associated with the graph.  Optimizations invalidate these
@@ -328,13 +314,10 @@ typedef enum {
 } irg_phase_state;
 
 /** Returns the phase_state of an IR graph. */
-irg_phase_state get_irg_phase_state(const ir_graph *irg);
+FIRM_API irg_phase_state get_irg_phase_state(const ir_graph *irg);
 
 /** Sets the phase state of an IR graph. */
-void set_irg_phase_state(ir_graph *irg, irg_phase_state state);
-
-/** Sets the phase of the given IR graph to low. */
-#define set_irg_phase_low(irg) set_irg_phase_state(irg, phase_low)
+FIRM_API void set_irg_phase_state(ir_graph *irg, irg_phase_state state);
 
 /** state: op_pin_state_pinned
    The graph is "op_pin_state_pinned" if all nodes are associated with a basic block.
@@ -343,7 +326,7 @@ void set_irg_phase_state(ir_graph *irg, irg_phase_state state);
    invalid block, i.e., the block is not a dominator of all the uses of
    the node.
    The enum op_pin_state is defined in irop.h. */
-op_pin_state get_irg_pinned(const ir_graph *irg);
+FIRM_API op_pin_state get_irg_pinned(const ir_graph *irg);
 
 /** state: outs_state
  *  Outs are the back edges or def-use edges of ir nodes.
@@ -354,8 +337,8 @@ typedef enum {
        outs_inconsistent  /**< Outs have been computed, memory is still allocated,
                                but the graph has been changed since. */
 } irg_outs_state;
-irg_outs_state get_irg_outs_state(const ir_graph *irg);
-void           set_irg_outs_inconsistent(ir_graph *irg);
+FIRM_API irg_outs_state get_irg_outs_state(const ir_graph *irg);
+FIRM_API void set_irg_outs_inconsistent(ir_graph *irg);
 
 /** state:  extended basic block state. */
 typedef enum {
@@ -363,8 +346,8 @@ typedef enum {
        extblk_valid   = 1,  /**< Extended basic block information is valid. */
        extblk_invalid = 2   /**< Extended basic block information is constructed but invalid. */
 } irg_extblk_state;
-irg_extblk_state get_irg_extblk_state(const ir_graph *irg);
-void             set_irg_extblk_inconsistent(ir_graph *irg);
+FIRM_API irg_extblk_state get_irg_extblk_state(const ir_graph *irg);
+FIRM_API void set_irg_extblk_inconsistent(ir_graph *irg);
 
 /** state: dom_state
  * Signals the state of the dominator / post dominator information.
@@ -376,13 +359,13 @@ typedef enum {
 } irg_dom_state;
 
 /** returns the dominator state of an IR graph. */
-irg_dom_state get_irg_dom_state(const ir_graph *irg);
+FIRM_API irg_dom_state get_irg_dom_state(const ir_graph *irg);
 
 /** returns the post dominator state of an IR graph. */
-irg_dom_state get_irg_postdom_state(const ir_graph *irg);
+FIRM_API irg_dom_state get_irg_postdom_state(const ir_graph *irg);
 
 /** sets the dominator and post dominator state of an IR graph to inconsistent. */
-void set_irg_doms_inconsistent(ir_graph *irg);
+FIRM_API void set_irg_doms_inconsistent(ir_graph *irg);
 
 /** state: loopinfo_state
  *  Loop information describes the loops within the control and
@@ -395,13 +378,10 @@ typedef enum {
        loopinfo_cf               = 4,       /**< Loop information constructed for control flow only. */
        loopinfo_inter            = 8,       /**< Loop information for interprocedural view. */
 
-       loopinfo_for_firmjni      = 16,      /**< A hack for firmjni:  all enums must differ as they
-                                                 are used in a switch. */
-
        /** IntRAprocedural loop information constructed and valid. */
-       loopinfo_consistent         = loopinfo_constructed | loopinfo_for_firmjni | loopinfo_valid,
+       loopinfo_consistent         = loopinfo_constructed | loopinfo_valid,
        /** IntRAprocedural loop information constructed and invalid. */
-       loopinfo_inconsistent       = loopinfo_constructed | loopinfo_for_firmjni,
+       loopinfo_inconsistent       = loopinfo_constructed,
 
        /** IntERprocedural loop information constructed and valid. */
        loopinfo_ip_consistent      = loopinfo_constructed | loopinfo_inter | loopinfo_valid,
@@ -420,18 +400,18 @@ typedef enum {
 } irg_loopinfo_state;
 
 /** Return the current loop information state. */
-irg_loopinfo_state get_irg_loopinfo_state(const ir_graph *irg);
+FIRM_API irg_loopinfo_state get_irg_loopinfo_state(const ir_graph *irg);
 
 /** Sets the current loop information state. */
-void set_irg_loopinfo_state(ir_graph *irg, irg_loopinfo_state s);
+FIRM_API void set_irg_loopinfo_state(ir_graph *irg, irg_loopinfo_state s);
 
 /** Sets the loop information state to the appropriate inconsistent state.
  *  If state is 'none' does not change. */
-void set_irg_loopinfo_inconsistent(ir_graph *irg);
+FIRM_API void set_irg_loopinfo_inconsistent(ir_graph *irg);
 /** Sets the loop information state to the appropriate inconsistent state.
  *  If state is 'none' does not change.
  *  Does this for all irgs. */
-void set_irp_loopinfo_inconsistent(void);
+FIRM_API void set_irp_loopinfo_inconsistent(void);
 
 /** state: callee_information_state
  *  Call nodes contain a list of possible callees.  This list must be
@@ -447,10 +427,10 @@ typedef enum {
 } irg_callee_info_state;
 
 /** Returns the callee_info_state of an IR graph. */
-irg_callee_info_state get_irg_callee_info_state(const ir_graph *irg);
+FIRM_API irg_callee_info_state get_irg_callee_info_state(const ir_graph *irg);
 
 /** Sets the callee_info_state of an IR graph. */
-void                  set_irg_callee_info_state(ir_graph *irg, irg_callee_info_state s);
+FIRM_API void set_irg_callee_info_state(ir_graph *irg, irg_callee_info_state s);
 
 /** property:
  *  Tells how to handle an ir graph in inlining.
@@ -465,9 +445,9 @@ typedef enum {
 } irg_inline_property;
 
 /** Returns the inline property of a graph. */
-irg_inline_property get_irg_inline_property(const ir_graph *irg);
+FIRM_API irg_inline_property get_irg_inline_property(const ir_graph *irg);
 /** Sets the inline property of a graph. */
-void set_irg_inline_property(ir_graph *irg, irg_inline_property s);
+FIRM_API void set_irg_inline_property(ir_graph *irg, irg_inline_property s);
 
 /**
  * Returns the mask of the additional graph properties.
@@ -477,34 +457,36 @@ void set_irg_inline_property(ir_graph *irg, irg_inline_property s);
  *
  * @return a bitset of mtp_additional_property values
  */
-unsigned get_irg_additional_properties(const ir_graph *irg);
+FIRM_API unsigned get_irg_additional_properties(const ir_graph *irg);
 
 /** Sets the mask of the additional graph properties. */
-void set_irg_additional_properties(ir_graph *irg, unsigned property_mask);
+FIRM_API void set_irg_additional_properties(ir_graph *irg,
+                                            unsigned property_mask);
 
 /** Sets one additional graph property. */
-void set_irg_additional_property(ir_graph *irg, mtp_additional_property flag);
+FIRM_API void set_irg_additional_property(ir_graph *irg,
+                                          mtp_additional_property flag);
 
 /** A void * field to link arbitrary information to the node. */
-void  set_irg_link (ir_graph *irg, void *thing);
-void *get_irg_link (const ir_graph *irg);
+FIRM_API void set_irg_link(ir_graph *irg, void *thing);
+FIRM_API void *get_irg_link(const ir_graph *irg);
 
 /** Increments visited flag by one.
  *  @see also: get_irn_visited() get_irg_block_visited(). */
-void         inc_irg_visited(ir_graph *irg);
-ir_visited_t get_irg_visited(const ir_graph *irg);
-void         set_irg_visited(ir_graph *irg, ir_visited_t i);
+FIRM_API void inc_irg_visited(ir_graph *irg);
+FIRM_API ir_visited_t get_irg_visited(const ir_graph *irg);
+FIRM_API void set_irg_visited(ir_graph *irg, ir_visited_t i);
 /** An interprocedural flag valid for all irgs.
  *  @see also: get_irn_visited() get_irg_block_visited(). */
-ir_visited_t get_max_irg_visited(void);
-void         set_max_irg_visited(int val);
-ir_visited_t inc_max_irg_visited(void);
+FIRM_API ir_visited_t get_max_irg_visited(void);
+FIRM_API void set_max_irg_visited(int val);
+FIRM_API ir_visited_t inc_max_irg_visited(void);
 
 /** Increments block_visited by one.
  *  @see also: get_irn_visited() get_irg_block_visited(). */
-void         inc_irg_block_visited(ir_graph *irg);
-ir_visited_t get_irg_block_visited(const ir_graph *irg);
-void         set_irg_block_visited(ir_graph *irg, ir_visited_t i);
+FIRM_API void inc_irg_block_visited(ir_graph *irg);
+FIRM_API ir_visited_t get_irg_block_visited(const ir_graph *irg);
+FIRM_API void set_irg_block_visited(ir_graph *irg, ir_visited_t i);
 
 /**
  * Debug helpers: You can indicate whether you are currently using visited or
@@ -512,46 +494,73 @@ void         set_irg_block_visited(ir_graph *irg, ir_visited_t i);
  * if 2 parties try to use the flags.
  */
 enum ir_resources_enum_t {
+       /* local (irg) resources */
        IR_RESOURCE_BLOCK_VISITED = 1 << 0,  /**< Block visited flags are used. */
        IR_RESOURCE_BLOCK_MARK    = 1 << 1,  /**< Block mark bits are used. */
        IR_RESOURCE_IRN_VISITED   = 1 << 2,  /**< IR-node visited flags are used. */
        IR_RESOURCE_IRN_LINK      = 1 << 3,  /**< IR-node link fields are used. */
        IR_RESOURCE_LOOP_LINK     = 1 << 4,  /**< IR-loop link fields are used. */
+       IR_RESOURCE_PHI_LIST      = 1 << 5,  /**< Block Phi lists are used. */
+       IR_RESOURCE_IRG_LINK      = 1 << 6,  /**< IR-graph link fields used. */
+
+       /* global (irp) resources */
+       IR_RESOURCE_ENTITY_LINK   = 1 << 8,  /**< IR-entity link fields are used. */
+       IR_RESOURCE_TYPE_VISITED  = 1 << 9,  /**< type visited flags */
+
+       /* masks */
+       IR_RESOURCE_LOCAL_MASK    = 0x00FF,  /**< Mask for all local resources. */
+       IR_RESOURCE_GLOBAL_MASK   = 0xFF00   /**< Mask for all global resources. */
 };
 typedef unsigned ir_resources_t;
 
 #ifndef NDEBUG
-void ir_reserve_resources(ir_graph *irg, ir_resources_t resources);
-void ir_free_resources(ir_graph *irg, ir_resources_t resources);
-ir_resources_t ir_resources_reserved(const ir_graph *irg);
+FIRM_API void ir_reserve_resources(ir_graph *irg, ir_resources_t resources);
+FIRM_API void ir_free_resources(ir_graph *irg, ir_resources_t resources);
+FIRM_API ir_resources_t ir_resources_reserved(const ir_graph *irg);
 #else
-#define ir_reserve_resources(irg,resources)
-#define ir_free_resources(irg,resources)
+#define ir_reserve_resources(irg,resources)  (void)0
+#define ir_free_resources(irg,resources)     (void)0
 #define ir_resources_reserved(irg)           0
 #endif
 
+/**
+ * Graph State
+ */
+typedef enum {
+       IR_GRAPH_STATE_KEEP_MUX      = 1U << 0,  /**< should perform no further optimisations on Mux nodes */
+       IR_GRAPH_STATE_ARCH_DEP      = 1U << 1,  /**< should not construct more nodes which irarch potentially breaks down */
+       IR_GRAPH_STATE_BCONV_ALLOWED = 1U << 2,  /**< Conv(mode_b) to Iu is allowed as set command */
+} ir_graph_state_t;
+
+/** set some state flags on the graph (this does not clear the other flags) */
+FIRM_API void set_irg_state(ir_graph *irg, ir_graph_state_t state);
+/** clear some state flags of the graph */
+FIRM_API void clear_irg_state(ir_graph *irg, ir_graph_state_t state);
+/** query wether a set of graph state flags are activated */
+FIRM_API int is_irg_state(const ir_graph *irg, ir_graph_state_t state);
+
 /** Normalization: Move Proj nodes into the same block as its predecessors */
-void normalize_proj_nodes(ir_graph *irg);
+FIRM_API void normalize_proj_nodes(ir_graph *irg);
 
 /** Set a description for local value n. */
-void set_irg_loc_description(ir_graph *irg, int n, void *description);
+FIRM_API void set_irg_loc_description(ir_graph *irg, int n, void *description);
 
 /** Get the description for local value n. */
-void *get_irg_loc_description(ir_graph *irg, int n);
+FIRM_API void *get_irg_loc_description(ir_graph *irg, int n);
 
 /** Returns a estimated node count of the irg. This count is updated
  * after every irg_walk_graph().
  */
-unsigned get_irg_estimated_node_cnt(const ir_graph *irg);
+FIRM_API unsigned get_irg_estimated_node_cnt(const ir_graph *irg);
 
 /** Returns the last irn index for this graph. */
-unsigned get_irg_last_idx(const ir_graph *irg);
+FIRM_API unsigned get_irg_last_idx(const ir_graph *irg);
 
 /** Returns the floating point model of this graph. */
-unsigned get_irg_fp_model(const ir_graph *irg);
+FIRM_API unsigned get_irg_fp_model(const ir_graph *irg);
 
 /** Sets a floating point model for this graph. */
-void set_irg_fp_model(ir_graph *irg, unsigned model);
+FIRM_API void set_irg_fp_model(ir_graph *irg, unsigned model);
 
 /**
  * Access custom graph data.
@@ -581,6 +590,8 @@ void set_irg_fp_model(ir_graph *irg, unsigned model);
  * must be passed to the access macro get_irg_data(), 0 if the
  * registration failed.
  */
-size_t register_additional_graph_data(size_t size);
+FIRM_API size_t register_additional_graph_data(size_t size);
+
+#include "end.h"
 
 #endif