*
* @author Martin Trapp, Christian Schaefer
*/
+#ifndef _IRGRAPH_H_
+#define _IRGRAPH_H_
#include <stddef.h>
+#include "firm_types.h"
#include "irop.h"
#include "irextbb.h"
-
-# ifndef _IRGRAPH_H_
-# define _IRGRAPH_H_
-# include "entity.h"
-
-/* to resolve recursion between irnode.h and irgraph.h */
-#ifndef _IR_NODE_TYPEDEF_
-#define _IR_NODE_TYPEDEF_
-typedef struct ir_node ir_node;
-#endif
-
-/* to resolve recursion between entity.h and irgraph.h */
-#ifndef _IR_GRAPH_TYPEDEF_
-#define _IR_GRAPH_TYPEDEF_
-typedef struct ir_graph ir_graph;
-#endif
+#include "type.h"
/**
* @page ir_graph The struct ir_graph
entity *get_irg_entity (const ir_graph *irg);
void set_irg_entity (ir_graph *irg, entity *ent);
-type *get_irg_frame_type (ir_graph *irg);
-void set_irg_frame_type (ir_graph *irg, type *ftp);
+ir_type *get_irg_frame_type (ir_graph *irg);
+void set_irg_frame_type (ir_graph *irg, ir_type *ftp);
ir_node *get_irg_start_block (const ir_graph *irg);
void set_irg_start_block (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);
-
-/* @@@ oblivious, no more supported. */
-ir_node *get_irg_cstore (const ir_graph *irg);
-void set_irg_cstore (ir_graph *irg, ir_node *node);
-/* end oblivious */
-
/** Returns the node that represents the frame pointer. */
ir_node *get_irg_frame (const ir_graph *irg);
/** Sets the node that represents the frame pointer. */
/** The states of an ir graph.
*
- * state phase values: phase_building, phase_high, phase_low.
+ * state phase values: phase_building, phase_high, phase_low, phase_backend.
*
* The graph is in phase_building during construction of the irgraph.
* The construction is finished by a call to finalize_cons().
*
- * Finalize_cons() sets the state to phase_high. All Firm nodes are
+ * Finalize_cons() sets the state to phase_high. All stadard Firm nodes are
* allowed.
*
* To get the irgraph into phase_low all Sel nodes must be removed and
* type tag nodes must be removed (@@@ really?). Initialization of
* memory allocated by Alloc must be explicit. @@@ More conditions?
*
+ * phase_backend is set if architecture specific machine nodes are inserted
+ * (and probally most standard Firm are removed).
*/
typedef enum {
phase_building,
phase_high,
- phase_low
+ phase_low,
+ phase_backend
} irg_phase_state;
/** returns the phase_state of an IR graph. */
irg_phase_state get_irg_phase_state (const ir_graph *irg);
/** sets the phase state of an IR graph. */
-void set_irg_phase_low(ir_graph *irg);
+void set_irg_phase_state(ir_graph *irg, irg_phase_state state);
+
+#define set_irg_phase_low(irg) set_irg_phase_state(irg, phase_low)
/** state: op_pin_state_pinned
The graph is "op_pin_state_pinned" if all nodes are associated with a basic block.
irg_outs_state get_irg_outs_state(const ir_graph *irg);
void set_irg_outs_inconsistent(ir_graph *irg);
+/** state: extended basic block state. */
+typedef enum {
+ extblk_none = 0, /**< No extended basic block information is constructed. Default. */
+ 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);
+
/** state: dom_state
- * Signals the state of the dominator information.
+ * Signals the state of the dominator / post dominator information.
*/
typedef enum {
dom_none, /**< dominator are not computed, no memory is allocated */
dom_inconsistent /**< dominator information is computed but the graph has been changed since */
} irg_dom_state;
-/** returns the dom_state of an IR graph. */
+/** returns the dominator state of an IR graph. */
irg_dom_state get_irg_dom_state(const ir_graph *irg);
-/** sets the dom_state of an IR graph. */
-void set_irg_dom_inconsistent(ir_graph *irg);
+/** returns the post dominator state of an IR graph. */
+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);
/** state: loopinfo_state
* Loop information describes the loops within the control and
/** Sets the inline property of a graph. */
void set_irg_inline_property(ir_graph *irg, irg_inline_property s);
-/** additional graph flags:
- * Tell about special properties of a graph. Some
- * of these may be discovered by analyses.
+/**
+ * Returns the mask of the additional graph properties.
+ * The properties are automatically inherited from the method type
+ * if they were not set using set_irg_additional_properties() or
+ * set_irg_additional_property().
*/
-typedef enum {
- irg_const_function = 0x00000001, /**< This graph did not access memory and calculates
- its return values solely from its parameters.
- GCC: __attribute__((const)). */
- irg_pure_function = 0x00000002, /**< This graph did NOT write to memory and calculates
- its return values solely form its parameters and
- the memory they points to (or global vars).
- GCC: __attribute__((pure)). */
- irg_noreturn_function = 0x00000004, /**< This graph did not return due to an aborting system
- call.
- GCC: __attribute__((noreturn)). */
- irg_nothrow_function = 0x00000008, /**< This graph cannot throw an exception.
- GCC: __attribute__((nothrow)). */
- irg_naked_function = 0x00000010, /**< This graph is naked.
- GCC: __attribute__((naked)). */
- irg_malloc_function = 0x00000020 /**< This graph returns newly allocate memory.
- GCC: __attribute__((malloc)). */
-} irg_additional_property;
-
-/** Returns the mask of the additional graph properties. */
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);
/** Sets one additional graph property. */
-void set_irg_additional_property(ir_graph *irg, irg_additional_property flag);
-
-/**
- * calling conventions
- */
-typedef enum {
- irg_cc_reg_param = 0x00000001, /**< Transmit parameters in registers, else the stack is used.
- This flag may be set as default on some architectures. */
- irg_cc_last_on_top = 0x00000002, /**< The last non-register parameter is transmitted on top of
- the stack. This is equivalent to the stdcall or pascal
- calling convention. If this flag is not set, the first
- non-register parameter is used (cdecl calling convention) */
- irg_cc_callee_clear_stk = 0x00000004, /**< The callee clears the stack. This forbids variadic
- function calls (stdcall). */
- irg_cc_this_call = 0x00000008 /**< The first parameter is a this pointer and is transmitted
- in a special way. */
-} irg_calling_convention;
-
-/** Returns the calling convention of a graph. */
-unsigned get_irg_calling_convention(const ir_graph *irg);
-
-/** Sets the calling convention of a graph. */
-void set_irg_calling_convention(ir_graph *irg, unsigned cc_mask);
-
-/** Gets the default calling convention for new constructed graphs. */
-unsigned get_firm_default_calling_convention(void);
-
-/** Sets the default calling convention for new constructed graphs. */
-void set_firm_default_calling_convention(unsigned cc_mask);
+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);
/** get the description for local value n */
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);
+
+/** Returns the last irn index for this graph. */
+unsigned get_irg_last_idx(const ir_graph *irg);
+
/**
* Access custom graph data.
* The data must have been registered with