Rework API documentation
authorMatthias Braun <matze@braunis.de>
Fri, 9 Dec 2011 17:47:06 +0000 (18:47 +0100)
committerMatthias Braun <matze@braunis.de>
Fri, 9 Dec 2011 17:51:03 +0000 (18:51 +0100)
- Put things into logical groups
- Add cross references from node overview to API docu

39 files changed:
Doxyfile
include/libfirm/be.h
include/libfirm/callgraph.h
include/libfirm/cdep.h
include/libfirm/cgana.h
include/libfirm/dbginfo.h
include/libfirm/execfreq.h
include/libfirm/firm.h
include/libfirm/firm_types.h
include/libfirm/heights.h
include/libfirm/ident.h
include/libfirm/ircons.h
include/libfirm/irdom.h
include/libfirm/irdump.h
include/libfirm/iredgekinds.h
include/libfirm/iredges.h
include/libfirm/irflag.h
include/libfirm/irgopt.h
include/libfirm/irgraph.h
include/libfirm/irgwalk.h
include/libfirm/irio.h
include/libfirm/irloop.h
include/libfirm/irmemory.h
include/libfirm/irmode.h
include/libfirm/irnode.h
include/libfirm/irop.h
include/libfirm/iropt.h
include/libfirm/iroptimize.h
include/libfirm/irouts.h
include/libfirm/irprog.h
include/libfirm/irverify.h
include/libfirm/lowering.h
include/libfirm/trouts.h
include/libfirm/tv.h
include/libfirm/typerep.h
include/libfirm/vrp.h
scripts/gen_docu.py
scripts/gen_ir.py
scripts/spec_util.py

index 7a514fe..6201bb9 100644 (file)
--- a/Doxyfile
+++ b/Doxyfile
@@ -843,7 +843,7 @@ DOCSET_BUNDLE_ID       = org.doxygen.Project
 # Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
 # of the generated HTML documentation.
 
-GENERATE_HTMLHELP      = YES
+GENERATE_HTMLHELP      = NO
 
 # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
 # be used to specify the file name of the resulting .chm file. You
@@ -1225,13 +1225,13 @@ ENABLE_PREPROCESSING   = YES
 # compilation will be performed. Macro expansion can be done in a controlled
 # way by setting EXPAND_ONLY_PREDEF to YES.
 
-MACRO_EXPANSION        = NO
+MACRO_EXPANSION        = YES
 
 # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
 # then the macro expansion is limited to the macros specified with the
 # PREDEFINED and EXPAND_AS_DEFINED tags.
 
-EXPAND_ONLY_PREDEF     = NO
+EXPAND_ONLY_PREDEF     = YES
 
 # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
 # in the INCLUDE_PATH (see below) will be search if a #include is found.
@@ -1259,7 +1259,7 @@ INCLUDE_FILE_PATTERNS  =
 # undefined via #undef or recursively expanded use the := operator
 # instead of the = operator.
 
-PREDEFINED             =
+PREDEFINED             = FIRM_API
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
 # this tag can be used to specify a list of macro names that should be expanded.
@@ -1302,7 +1302,7 @@ TAGFILES               =
 # When a file name is specified after GENERATE_TAGFILE, doxygen will create
 # a tag file that is based on the input files it reads.
 
-GENERATE_TAGFILE       = YES
+GENERATE_TAGFILE       = libfirm.tag
 
 # If the ALLEXTERNALS tag is set to YES all external classes will be listed
 # in the class index. If set to NO only the inherited external classes
index 2f4c1cc..a97ec1b 100644 (file)
 #include "iroptimize.h"
 #include "begin.h"
 
+/**
+ * @defgroup be  Code Generation
+ *
+ * Code Generation (backend) produces machine-code.
+ * @{
+ */
+
 typedef enum {
        ASM_CONSTRAINT_FLAG_NONE                  = 0,
        ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER     = 1u << 0,
@@ -171,6 +178,8 @@ FIRM_API asm_constraint_flags_t be_parse_asm_constraints(const char *constraints
  */
 FIRM_API int be_is_valid_clobber(const char *clobber);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index ddfa2c2..d0ea120 100644 (file)
  * @brief       Representation and computation of the callgraph.
  * @author      Goetz Lindenmaier
  * @date        21.7.2004
- * @brief
+ * @brief       callgraph analysis
+ */
+#ifndef FIRM_ANA_CALLGRAPH_H
+#define FIRM_ANA_CALLGRAPH_H
+
+#include "firm_types.h"
+#include "begin.h"
+
+/**
+ * @ingroup irana
+ * @defgroup callgraph Callgraph
+ *
  *  This file contains the representation of the callgraph.
  *  The nodes of the call graph are ir_graphs.  The edges between
  *  the nodes are calling relations.  I.e., if method a calls method
  *  Finally this file contains an algorithm that computes backedges
  *  in the callgraph, i.e., the algorithm finds possibly recursive calls.
  *  The algorithm computes an upper bound of all recursive calls.
+ * @{
  */
-#ifndef FIRM_ANA_CALLGRAPH_H
-#define FIRM_ANA_CALLGRAPH_H
-
-#include "firm_types.h"
-#include "begin.h"
 
 /** Flag to indicate state of callgraph. */
 typedef enum {
@@ -164,6 +171,8 @@ FIRM_API void set_irp_loop_nesting_depth_state(loop_nesting_depth_state s);
 /** Marks the nesting depth state of the program representation as inconsistent. */
 FIRM_API void set_irp_loop_nesting_depth_state_inconsistent(void);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 0a2af6f..1939fcb 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
+/** @ingroup irana
+ * @defgroup ir_cdep Control Dependence
+ * @{
+ */
+
 /** Compute the control dependence graph for a graph. */
 FIRM_API void compute_cdep(ir_graph *irg);
 
@@ -73,6 +78,8 @@ FIRM_API ir_node *get_unique_cdep(const ir_node *block);
  */
 FIRM_API int has_multiple_cdep(const ir_node *block);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index e2be72d..101dce7 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
+/** @addtogroup callgraph
+ * @{
+ */
+
 /** Analyses a rough estimation of the possible call graph.
  *
  *  Determines for each Call node the set of possibly called methods.
@@ -78,6 +82,8 @@ FIRM_API void free_irp_callee_info(void);
  */
 FIRM_API void opt_call_addrs(void);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 7ab9441..6f60c6b 100644 (file)
  * @brief     Implements the Firm interface to debug information.
  * @author    Goetz Lindenmaier, Michael Beck
  * @date      2001
- * @brief
- *  Firm requires a debugging module fulfilling this interface, else no
- *  debugging information is passed to the backend.
- *  The interface requires a datatype representing the debugging
- *  information.  Firm supports administrating a reference to the debug
- *  information in every Firm node.  Further Firm optimizations call
- *  routines to propagate debug information from old nodes to new nodes
- *  if the optimization replaces the old ones by the new ones.
  */
 #ifndef FIRM_DEBUG_DBGINFO_H
 #define FIRM_DEBUG_DBGINFO_H
 #include "begin.h"
 
 /**
- * @defgroup debug    The Firm interface to debugging support.
- *
+ * @defgroup dbg_info    Source References
+ *  Firm requires a debugging module fulfilling this interface, else no
+ *  debugging information is passed to the backend.
+ *  The interface requires a datatype representing the debugging
+ *  information.  Firm supports administrating a reference to the debug
+ *  information in every Firm node.  Further Firm optimizations call
+ *  routines to propagate debug information from old nodes to new nodes
+ *  if the optimization replaces the old ones by the new ones.
  * @{
  */
 
@@ -146,8 +144,6 @@ typedef void merge_sets_func(ir_node **new_node_array, int new_num_entries, ir_n
 FIRM_API void dbg_init(merge_pair_func *dbg_info_merge_pair,
                        merge_sets_func *dbg_info_merge_sets);
 
-/** @} */
-
 /**
  * The type of the debug info retriever function.
  *  When given a dbg_info returns the name (usually the filename) of the
@@ -187,6 +183,8 @@ FIRM_API const char *ir_retrieve_dbg_info(const dbg_info *dbg, unsigned *line);
 FIRM_API void ir_retrieve_type_dbg_info(char *buffer, size_t buffer_size,
                                         const type_dbg_info *tdbgi);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 4dda2fe..1c27c78 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
-struct ir_exec_freq;
+/**
+ * @ingroup irana
+ * @defgroup execfreq Basic Block Execution Frequency
+ * @{
+ */
 
 /**
  * Create execfreq structure (to be used with set_execfreq)
@@ -54,6 +58,8 @@ FIRM_API double get_block_execfreq(const ir_exec_freq *ef,
 FIRM_API unsigned long get_block_execfreq_ulong(const ir_exec_freq *ef,
                                                 const ir_node *block);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index c9a8f1f..8455c13 100644 (file)
  * @file
  * @brief     Central firm header.
  * @author    Martin Trapp, Christian Schaefer, Goetz Lindenmaier
- * @brief
- *  Central FIRM header.
+ * @brief     Central FIRM header.
+ */
+
+/** @mainpage
  *
  *  FIRM is a full graph based intermediate representation in SSA Form
  *  with a novel concept to model side effects.  It allows fast, aggressive
@@ -52,8 +54,8 @@
  *
  *   Further this library supplies functionality to build and optimize FIRM graphs
  *   and further functionality needed in a compiler.  Finally there is more
- *   generic functionality to support implementations using firm.  (Code generation,
- *   further optimizations).
+ *   generic functionality to support implementations using firm.
+ *   (Code generation, further optimizations).
  */
 #ifndef FIRM_COMMON_FIRM_H
 #define FIRM_COMMON_FIRM_H
index 3a356af..34564a2 100644 (file)
@@ -31,26 +31,43 @@ typedef unsigned long ir_visited_t;
 typedef unsigned long ir_exc_region_t;
 typedef unsigned long ir_label_t;
 
+/** @ingroup dbg_info */
 typedef struct dbg_info             dbg_info,            *dbg_info_ptr;
+/** @ingroup dbg_info */
 typedef struct type_dbg_info        type_dbg_info,       *type_dbg_info_ptr;
+/** @ingroup ir_ident */
 typedef struct ident                ident,               *ir_ident_ptr;
+/** @ingroup ir_node */
 typedef struct ir_node              ir_node,             *ir_node_ptr;
+/** @ingroup ir_op */
 typedef struct ir_op                ir_op,               *ir_op_ptr;
+/** @ingroup ir_mode */
 typedef struct ir_mode              ir_mode,             *ir_mode_ptr;
+/** @ingroup iredges */
 typedef struct ir_edge_t            ir_edge_t,           *ir_edge_ptr;
+/** @ingroup ir_heights */
 typedef struct ir_heights_t         ir_heights_t;
+/** @ingroup ir_tarval */
 typedef struct ir_tarval            ir_tarval,           *ir_tarval_ptr;
 typedef struct ir_enum_const        ir_enum_const,       *ir_enum_const_ptr;
+/** @ingroup ir_type */
 typedef struct ir_type              ir_type,             *ir_type_ptr;
+/** @ingroup ir_graph */
 typedef struct ir_graph             ir_graph,            *ir_graph_ptr;
+/** @ingroup ir_prog */
 typedef struct ir_prog              ir_prog,             *ir_prog_ptr;
+/** @ingroup ir_loop */
 typedef struct ir_loop              ir_loop,             *ir_loop_ptr;
 typedef struct ir_region            ir_region,           *ir_region_ptr;
+/** @ingroup ir_entity */
 typedef struct ir_entity            ir_entity,           *ir_entity_ptr;
 typedef struct ir_extblk            ir_extblk,           *ir_extblk_ptr;
+/** @ingroup execfreq */
 typedef struct ir_exec_freq         ir_exec_freq,        *ir_exec_freq_ptr;
+/** @ingroup ir_cdep */
 typedef struct ir_cdep              ir_cdep,             *ir_cdep_ptr;
 typedef struct sn_entry             *seqno_t;
+/** @ingroup ir_op */
 typedef struct arch_irn_ops_t       arch_irn_ops_t;
 typedef struct ir_graph_pass_t      ir_graph_pass_t;
 typedef struct ir_prog_pass_t       ir_prog_pass_t;
@@ -58,6 +75,7 @@ typedef struct ir_prog_pass_t       ir_prog_pass_t;
 typedef struct ir_graph_pass_manager_t      ir_graph_pass_manager_t;
 typedef struct ir_prog_pass_manager_t       ir_prog_pass_manager_t;
 
+/** @ingroup ir_initializer */
 typedef union  ir_initializer_t     ir_initializer_t,    *ir_initializer_ptr;
 
 typedef void irg_walk_func(ir_node *, void *);
@@ -236,6 +254,7 @@ typedef enum symconst_kind {
 /** SymConst attribute.
  *
  *  This union contains the symbolic information represented by the node.
+ *  @ingroup SymConst
  */
 typedef union symconst_symbol {
        ir_type       *type_p;    /**< The type of a SymConst. */
@@ -243,20 +262,26 @@ typedef union symconst_symbol {
        ir_enum_const *enum_p;    /**< The enumeration constant of a SymConst. */
 } symconst_symbol;
 
-/** The allocation place. */
+/** The allocation place.
+ * @ingroup Alloc
+ */
 typedef enum ir_where_alloc {
        stack_alloc,          /**< Alloc allocates the object on the stack. */
        heap_alloc            /**< Alloc allocates the object on the heap. */
 } ir_where_alloc;
 
-/** A input/output constraint attribute. */
+/** A input/output constraint attribute.
+ * @ingroup ASM
+ */
 typedef struct ir_asm_constraint {
        unsigned       pos;           /**< The inputs/output position for this constraint. */
        ident          *constraint;   /**< The constraint for this input/output. */
        ir_mode        *mode;         /**< The mode of the constraint. */
 } ir_asm_constraint;
 
-/** Supported libFirm builtins. */
+/** Supported libFirm builtins.
+ * @ingroup Builtin
+ */
 typedef enum ir_builtin_kind {
        ir_bk_trap,                   /**< GCC __builtin_trap(): insert trap */
        ir_bk_debugbreak,             /**< MS __debugbreak(): insert debug break */
index 707597c..944f235 100644 (file)
  * @brief   Compute heights of nodes inside basic blocks
  * @author  Sebastian Hack
  * @date    19.04.2006
- *
- * The height is a measure for the longest datadependencies path from a node to
- * the end of a basic block. This is usefull for scheduling heuristics and can
- * also be used to speedup reachability queries.
  */
 #ifndef FIRM_ANA_HEIGHTS_H
 #define FIRM_ANA_HEIGHTS_H
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @ingroup irana
+ * @defgroup ir_heights  Node Heights
+ *
+ * The height is a measure for the longest datadependencies path from a node to
+ * the end of a basic block. This is usefull for scheduling heuristics and can
+ * also be used to speedup reachability queries.
+ *
+ * @{
+ */
+
 /**
  * Get the height of a node inside a basic block.
  * The height of the node is the maximal number of edges between a sink node in
@@ -76,6 +83,8 @@ FIRM_API ir_heights_t *heights_new(ir_graph *irg);
  */
 FIRM_API void heights_free(ir_heights_t *h);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index fadda00..5b97bf6 100644 (file)
@@ -21,8 +21,7 @@
  * @file
  * @brief    Data type for unique names.
  * @author   Goetz Lindenmaier
- * @brief
- *  Declarations for identifiers in the firm library
+ * @brief    Declarations for identifiers in the firm library
  */
 #ifndef FIRM_IDENT_H
 #define FIRM_IDENT_H
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @defgroup ir_ident  Identifiers
+ * @{
+ */
+
 /**
  *  Store a string and create an ident.
  *
@@ -131,6 +135,8 @@ FIRM_API ident *id_mangle3(const char *prefix, ident *middle,
 /** returns a mangled name for a Win32 function using its calling convention */
 FIRM_API ident *id_decorate_win32_c_fkt(const ir_entity *ent, ident *id);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 696ef54..59d4512 100644 (file)
  *    constructors and at the paragraph COPING WITH DATA OBJECTS at the
  *    end of this documentation.
  *
- *    The comfortable interface contains the following routines further explained
- *    below:
- *
- *    ir_node *new_immBlock (void);
- *    ir_node *new_Start    (void);
- *    ir_node *new_End      (void);
- *    ir_node *new_Jmp      (void);
- *    ir_node *new_IJmp     (ir_node *tgt);
- *    ir_node *new_Cond     (ir_node *c);
- *    ir_node *new_Return   (ir_node *store, int arity, ir_node **in);
- *    ir_node *new_Const    (ir_tarval *con);
- *    ir_node *new_SymConst (ir_mode *mode, symconst_symbol value, symconst_kind kind);
- *    ir_node *new_simpleSel (ir_node *store, ir_node *objptr, ir_entity *ent);
- *    ir_node *new_Sel    (ir_node *store, ir_node *objptr, int arity,
- *                         ir_node **in, ir_entity *ent);
- *    ir_node *new_Call   (ir_node *store, ir_node *callee, int arity,
- *                         ir_node **in, type_method *type);
- *    ir_node *new_Builtin(ir_node *store, ir_builtin_kind kind, int arity,
- *                         ir_node **in, type_method *type);
- *    ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Sub    (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Minus  (ir_node *op,  ir_mode *mode);
- *    ir_node *new_Mul    (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Mulh   (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Div    (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
- *    ir_node *new_Mod    (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state;
- *    ir_node *new_And    (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Or     (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Eor    (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Not    (ir_node *op,                ir_mode *mode);
- *    ir_node *new_Shl    (ir_node *op,  ir_node *k,   ir_mode *mode);
- *    ir_node *new_Shr    (ir_node *op,  ir_node *k,   ir_mode *mode);
- *    ir_node *new_Shrs   (ir_node *op,  ir_node *k,   ir_mode *mode);
- *    ir_node *new_Rotl   (ir_node *op,  ir_node *k,   ir_mode *mode);
- *    ir_node *new_Cmp    (ir_node *op1, ir_node *op2);
- *    ir_node *new_Conv   (ir_node *op, ir_mode *mode);
- *    ir_node *new_Cast   (ir_node *op, ir_type *to_tp);
- *    ir_node *new_Carry  (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Borrow (ir_node *op1, ir_node *op2, ir_mode *mode);
- *    ir_node *new_Load   (ir_node *store, ir_node *addr, ir_mode *mode, ir_cons_flags flags);
- *    ir_node *new_Store  (ir_node *store, ir_node *addr, ir_node *val, ir_cons_flags flags);
- *    ir_node *new_Alloc  (ir_node *store, ir_node *count, ir_type *alloc_type,
- *                         where_alloc where);
- *    ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
- *               ir_type *free_type, where_alloc where);
- *    ir_node *new_Proj   (ir_node *arg, ir_mode *mode, long proj);
- *    ir_node *new_NoMem  (void);
- *    ir_node *new_Mux    (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
- *    ir_node *new_CopyB  (ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type);
- *    ir_node *new_InstOf (ir_node *store, ir_node obj, ir_type *ent);
- *    ir_node *new_Raise  (ir_node *store, ir_node *obj);
- *    ir_node *new_Bound  (ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper);
- *    ir_node *new_Pin    (ir_node *node);
- *
- *    void add_immBlock_pred (ir_node *block, ir_node *jmp);
- *    void mature_immBlock (ir_node *block);
- *    void set_cur_block (ir_node *target);
- *    ir_node *get_value (int pos, ir_mode *mode);
- *    void set_value (int pos, ir_node *value);
- *    ir_node *get_store (void);
- *    void set_store (ir_node *store);
- *    keep_alive (ir_node ka)
- *
  *    IR_NODES AND CONSTRUCTORS FOR IR_NODES
  *    =======================================
  *
  *
  *    ------------
  *
- *    ir_node *new_immBlock (void)
- *    ----------------------------
- *
- *    Creates a new block. When a new block is created it cannot be known how
- *    many predecessors this block will have in the control flow graph.
- *    Therefore the list of inputs can not be fixed at creation.  Predecessors
- *    can be added with add_immBlock_pred (block, control flow operation).
- *    With every added predecessor the number of inputs to Phi nodes also
- *    changes.
- *
- *    The block can be completed by mature_immBlock(block) if all predecessors are
- *    known.  If several blocks are built at once, mature_immBlock can only be called
- *    after set_value has been called for all values that are life at the end
- *    of the block.  This is necessary so that Phi nodes created mature_immBlock
- *    get the right predecessors in case of cyclic dependencies.  If all set_values
- *    of this block are called after maturing it and before calling get_value
- *    in some block that is control flow dependent on this block, the construction
- *    is correct.
- *
- *    Example for faulty IR construction:  (draw the graph on a paper and you'll
- *                                          get it ;-)
- *
- *      block_before_loop = new_immBlock();
- *      set_cur_block(block_before_loop);
- *      set_value(x);
- *      mature_immBlock(block_before_loop);
- *      before2header = new_Jmp;
- *
- *      loop_header = new_immBlock ();
- *      set_cur_block(loop_header);
- *      header2body - new_Jmp();
- *
- *      loop_body = new_immBlock ();
- *      set_cur_block(loop_body);
- *      body2header = new_Jmp();
- *
- *      add_immBlock_pred(loop_header, before2header);
- *      add_immBlock_pred(loop_header, body2header);
- *      add_immBlock_pred(loop_body, header2body);
- *
- *      mature_immBlock(loop_header);
- *      mature_immBlock(loop_body);
- *
- *      get_value(loop_body, x);   //  gets the Phi in loop_header
- *      set_value(loop_header, x); //  sets the value the above get_value should
- *                                 //  have returned!!!
- *
- *    Mature_immBlock also fixes the number of inputs to the Phi nodes.  Mature_immBlock
- *    should be called as early as possible, as afterwards the generation of Phi
- *    nodes is more efficient.
- *
- *    Inputs:
- *      There is an input for each control flow predecessor of the block.
- *      The input points to an instruction producing an output of type X.
- *      Possible predecessors:  Start, Jmp, Cond, Raise or Return or any node
- *      possibly causing an exception.  (Often the real predecessors are Projs.)
- *    Output:
- *      Mode BB (R), all nodes belonging to this block should consume this output.
- *      As they are strict (except Block and Phi node) it is a necessary condition
- *      that the block node executed before any other node in this block executes.
- *    Attributes:
- *      block.matured  Indicates whether the block is mature.
- *      block.**graph_arr
- *                      This attribute contains all local values valid in this
- *                      block. This is needed to build the Phi nodes and removed
- *                      if the graph is complete.  This field is used by the
- *              internal construction algorithm and should not be accessed
- *              from outside.
- *
- *
- *    ir_node *new_Block (int arity, ir_node **in)
- *    --------------------------------------------
- *
- *    Creates a new Block with the given list of predecessors.  This block
- *    is mature.  As other constructors calls optimization and verify for the
- *    block.  If one of the predecessors is Unknown (as it has to be filled in
- *    later) optimizations are skipped.  This is necessary to
- *    construct Blocks in loops.
- *
- *
- *    CONTROL FLOW OPERATIONS
- *    -----------------------
- *
- *    In each block there must be exactly one of the control flow
- *    operations Start, End, Jmp, Cond, Return or Raise.  The output of a
- *    control flow operation points to the block to be executed next.
- *
- *    ir_node *new_Start (void)
- *    -------------------------
- *
- *    Creates a start node.  Not actually needed public.  There is only one such
- *   node in each procedure which is automatically created by new_ir_graph.
- *
- *    Inputs:
- *      No inputs except the block it belongs to.
- *    Output:
- *      A tuple of 4 (5, 6) distinct values. These are labeled by the following
- *      projection numbers (pn_Start):
- *      * pn_Start_X_initial_exec    mode X, points to the first block to be exe *                                   cuted.
- *      * pn_Start_M                 mode M, the global store
- *      * pn_Start_P_frame_base      mode P, a pointer to the base of the proce  *                                   dures stack frame.
- *      * pn_Start_P_globals         mode P, a pointer to the part of the memory *                                   containing_all_ global things.
- *      * pn_Start_T_args            mode T, a tuple containing all arguments of *                                   the procedure.
- *
- *
- *    ir_node *new_End (void)
- *    -----------------------
- *
- *    Creates an end node.  Not actually needed public.  There is only one such
- *   node in each procedure which is automatically created by new_ir_graph.
- *
- *    Inputs:
- *      No inputs except the block it belongs to.
- *    Output:
- *      No output.
- *
- *    ir_node *new_Jmp (void)
- *    -----------------------
- *
- *    Creates a Jmp node.
- *
- *    Inputs:
- *      The block the node belongs to
- *    Output:
- *      Control flow to the next block.
- *
- *    ir_node *new_IJmp (ir_node *tgt)
- *    -----------------------
- *
- *    Creates an IJmp node.
- *
- *    Inputs:
- *      The node that represents the target jump address
- *    Output:
- *      Control flow to an unknown target, must be pinned by
- *      the End node.
- *
- *    ir_node *new_Cond (ir_node *c)
- *    ------------------------------
- *
- *    Creates a Cond node.  There are two versions of this node.
- *
- *    The Boolean Cond:
- *    Input:
- *      A value of mode b.
- *    Output:
- *      A tuple of two control flows.  The first is taken if the input is
- *      false, the second if it is true.
- *
- *    The Switch Cond:
- *    Input:
- *      A value of mode I_u. (i)
- *    Output:
- *      A tuple of n control flows.  If the Cond's input is i, control
- *      flow will proceed along output i. If the input is >= n control
- *      flow proceeds along output n.
- *
- *    ir_node *new_Return (ir_node *store, int arity, ir_node **in)
- *    -------------------------------------------------------------
- *
- *    The Return node has as inputs the results of the procedure.  It
- *    passes the control flow to the end_block.
- *
- *    Inputs:
- *      The memory state.
- *      All results.
- *    Output
- *      Control flow to the end block.
- *
- *
- *    ir_node *new_Const (ir_tarval *con)
- *    -----------------------------------------------
- *
- *    Creates a constant in the constant table and adds a Const node
- *    returning this value to the start block. The mode is derived
- *    from the tarval.
- *
- *    Parameters:
- *      *con             Points to an entry in the constant table.
- *                       This pointer is added to the attributes of
- *                       the node (self->attr.con)
- *    Inputs:
- *      No inputs except the block it belogns to.
- *    Output:
- *      The constant value.
- *    Attribute:
- *      attr.con   A tarval* pointer to the proper entry in the constant
- *                 table.
- *
- *    ir_node *new_SymConst (ir_mode *mode, union symconst_symbol value, symconst_addr_ent kind)
- *    -----------------------------------------------------------------------------------------
- *
- *    There are several symbolic constants:
- *     symconst_type_size  The symbolic constant represents the size of a type.
- *     symconst_type_align The symbolic constant represents the alignment of a type.
- *     symconst_addr_ent   The symbolic constant represents the address of an entity.
- *     symconst_ofs_ent    The symbolic constant represents the offset of an
- *                         entity in its owner type.
- *     symconst_enum_const The symbolic constant is a enumeration constant of an
- *                         enumeration type.
- *
- *    Parameters
- *      mode        P for SymConsts representing addresses, Iu otherwise.
- *      value       The type, ident, entity or enum constant, depending on the
- *                  kind
- *      kind        The kind of the symbolic constant, see the list above.
- *
- *    Inputs:
- *      No inputs except the block it belongs to.
- *    Output:
- *      A symbolic constant.
- *
- *    Attributes:
- *      attr.i.num       The symconst_addr_ent, i.e. one of
- *                        -symconst_type_size
- *                        -symconst_type_align
- *                        -symconst_addr_ent
- *
- *    If the attr.i.num is symconst_type_size or symconst_type_align,
- *    the node contains an attribute:
- *
- *      attr.i.*type,    a pointer to a type_class.
- *        if it is linkage_ptr_info it contains
- *      attr.i.*ptrinfo,  an ident holding information for the linker.
- *
- *    ---------------
- *
- *    ir_node *new_simpleSel (ir_node *store, ir_node *frame, ir_entity *sel)
- *    -----------------------------------------------------------------------
- *
- *
- *    Selects an entity from a compound type. This entity can be a field or
- *    a method.
- *
- *    Parameters:
- *      *store     The memory in which the object the entity should be selected
- *                 from is allocated.
- *      *frame     The pointer to the object.
- *      *sel       The entity to select.
- *
- *    Inputs:
- *      The memory containing the object.
- *      A pointer to the object.
- *      An unsigned integer.
- *    Output:
- *      A pointer to the selected entity.
- *    Attributes:
- *      attr.sel   Pointer to the entity
- *
- *
- *    ir_node *new_Sel (ir_node *store, ir_node *frame, int arity, ir_node **in,
- *    --------------------------------------------------------------------------
- *                      ir_entity *sel)
- *                      ---------------
- *
- *    Selects a field from an array type.  The entity has as owner the array, as
- *    type the arrays element type.  The indices to access an array element are
- *    given also.
- *
- *    Parameters:
- *      *store     The memory in which the object the entity should be selected from
- *                 is allocated.
- *      *frame     The pointer to the object.
- *      *arity     number of array indices.
- *      *in        array with index inputs to the node.
- *      *sel       The entity to select.
- *
- *    Inputs:
- *      The memory containing the object.
- *      A pointer to the object.
- *      As much unsigned integer as there are array expressions.
- *    Output:
- *      A pointer to the selected entity.
- *    Attributes:
- *      attr.sel   Pointer to the entity
- *
- *    The constructors new_Sel and new_simpleSel generate the same IR nodes.
- *    simpleSel just sets the arity of the index inputs to zero.
- *
- *
- *    ARITHMETIC OPERATIONS
- *    ---------------------
- *
- *    ir_node *new_Call (ir_node *store, ir_node *callee, int arity, ir_node **in,
- *    ----------------------------------------------------------------------------
- *                       type_method *type)
- *                       ------------------
- *
- *    Creates a procedure call.
- *
- *    Parameters
- *      *store           The actual store.
- *      *callee          A pointer to the called procedure.
- *      arity            The number of procedure parameters.
- *      **in             An array with the pointers to the parameters.
- *                       The constructor copies this array.
- *      *type            Type information of the procedure called.
- *
- *    Inputs:
- *      The store, the callee and the parameters.
- *    Output:
- *      A tuple containing the eventually changed store and the procedure
- *      results.
- *    Attributes:
- *      attr.call        Contains the attributes for the procedure.
- *
- *    ir_node *new_Builtin(ir_node *store, ir_builtin_kind kind, int arity, ir_node **in,
- *    -----------------------------------------------------------------------------------
- *                       type_method *type)
- *                       ------------------
- *
- *    Creates a builtin call.
- *
- *    Parameters
- *      *store           The actual store.
- *      kind             Describes the called builtin.
- *      arity            The number of procedure parameters.
- *      **in             An array with the pointers to the parameters.
- *                       The constructor copies this array.
- *      *type            Type information of the procedure called.
- *
- *    Inputs:
- *      The store, the kind and the parameters.
- *    Output:
- *      A tuple containing the eventually changed store and the procedure
- *      results.
- *    Attributes:
- *      attr.builtin     Contains the attributes for the called builtin.
- *
- *    ir_node *new_Add (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Sub (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Minus (ir_node *op, ir_mode *mode)
- *    -----------------------------------------------
- *
- *    Unary Minus operations on integer and floating point values.
- *
- *    ir_node *new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Mulh (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Returns the high order bits of a n*n=2n multiplication.
- *
- *    ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state)
- *    ------------------------------------------------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state)
- *    ------------------------------------------------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_And (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Or (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    -----------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Eor (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Not (ir_node *op, ir_mode *mode)
- *    ---------------------------------------------
- *
- *    This node constructs a constant where all bits are set to one
- *    and a Eor of this constant and the operator.  This simulates a
- *    Not operation.
- *
- *    ir_node *new_Shl (ir_node *op, ir_node *k, ir_mode *mode)
- *    ---------------------------------------------------------
- *
- *    Trivial.
- *
- *    ir_node *new_Shr (ir_node *op, ir_node *k, ir_mode *mode)
- *    ---------------------------------------------------------
- *
- *    Logic shift right, i.e., zero extended.
- *
- *
- *    ir_node *new_Shrs (ir_node *op, ir_node *k, ir_mode *mode)
- *    ----------------------------------------------------------
- *
- *    Arithmetic shift right, i.e., sign extended.
- *
- *    ir_node *new_Rotl (ir_node *op, ir_node *k, ir_mode *mode)
- *    ---------------------------------------------------------
- *
- *    Rotates the operand to the left by k bits.
- *
- *    ir_node *new_Carry (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Calculates the Carry value for integer addition. Used only
- *    in lowering code.
- *
- *    ir_node *new_Borrow (ir_node *op1, ir_node *op2, ir_mode *mode)
- *    ------------------------------------------------------------
- *
- *    Calculates the Borrow value for integer substraction. Used only
- *    in lowering code.
- *
- *    ir_node *new_Conv (ir_node *op, ir_mode *mode)
- *    ---------------------------------------------
- *
- *    Mode conversion.  For allowed conversions see UKA Tech Report
- *    1999-14.
- *
- *    ir_node *new_Cmp (ir_node *op1, ir_node *op2)
- *    ---------------------------------------------
- *
- *    Input:
- *      The two values to be compared.
- *    Output:
- *      A 16-tuple containing the results of the 16 different comparisons.
- *      The following is a list giving the comparisons and a projection
- *      number (pn_Cmp) to use in Proj nodes to extract the proper result.
- *        pn_Cmp_False false
- *        pn_Cmp_Eq    equal
- *        pn_Cmp_Lt    less
- *        pn_Cmp_Le    less or equal
- *        pn_Cmp_Gt    greater
- *        pn_Cmp_Ge    greater of equal
- *        pn_Cmp_Lg    less or greater
- *        pn_Cmp_Leg   less, equal or greater = ordered
- *        pn_Cmp_Uo    unordered
- *        pn_Cmp_Ue    unordered or equal
- *        pn_Cmp_Ul    unordered or less
- *        pn_Cmp_Ule   unordered, less or equal
- *        pn_Cmp_Ug    unordered or greater
- *        pn_Cmp_Uge   unordered, greater or equal
- *        pn_Cmp_Ne    unordered, less or greater = not equal
- *        pn_Cmp_True  true
- *
- *
- *
- *    ------------
- *
- *    In general, Phi nodes are automaitcally inserted.  In some cases, if
- *    all predecessors of a block are known, an explicit Phi node constructor
- *    is needed.  E.g., to construct a FIRM graph for a statement as
- *      a = (b==c) ? 2 : 5;
- *
- *    ir_node *new_Phi (int arity, ir_node **in, ir_mode *mode)
- *    ---------------------------------------------------------
- *
- *    Creates a Phi node. The in's order has to correspond to the order
- *    of in's of current_block.  This is not checked by the library!
- *    If one of the predecessors is Unknown (as it has to be filled in
- *    later) optimizations are skipped.  This is necessary to
- *    construct Phi nodes in loops.
- *
- *    Parameter
- *      arity            number of predecessors
- *      **in             array with predecessors
- *      *mode            The mode of its inputs and output.
- *    Inputs:
- *      A Phi node has as many inputs as the block it belongs to.
- *      Each input points to a definition of the same value on a
- *      different path in the control flow.
- *    Output
- *      The definition valid in this block.
- *
- *    ir_node *new_Mux (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode)
- *    -----------------------------------------------------------------------------------
- *
- *    Creates a Mux node. This node implements the following semantic:
- *    If the sel node (which must be of mode_b) evaluates to true, its value is
- *    ir_true, else ir_false;
- *
- *
- *
- *    OPERATIONS TO MANAGE MEMORY EXPLICITLY
- *    --------------------------------------
- *
- *    ir_node *new_Load (ir_node *store, ir_node *addr, ir_mode *mode, ir_cons_flags flags)
- *    -------------------------------------------------------------------------------------
- *
- *    The Load operation reads a value from memory.
- *
- *    Parameters:
- *    *store        The current memory.
- *    *addr         A pointer to the variable to be read in this memory.
- *    *mode         The mode of the value to be loaded.
- *     flags        Additional flags for alignment, volatility and pin state.
- *
- *    Inputs:
- *      The memory and a pointer to a variable in this memory.
- *    Output:
- *      A tuple of the memory, a control flow to be taken in case of
- *      an exception and the loaded value.
- *
- *    ir_node *new_Store (ir_node *store, ir_node *addr, ir_node *val, ir_cons_flags flags)
- *    -------------------------------------------------------------------------------------
- *
- *    The Store operation writes a value to a variable in memory.
- *
- *    Inputs:
- *      The memory, a pointer to a variable in this memory and the value
- *      to write to this variable.
- *    Output:
- *      A tuple of the changed memory and a control flow to be taken in
- *      case of an exception.
- *
- *    ir_node *new_Alloc (ir_node *store, ir_node *count, ir_type *alloc_type,
- *    -----------------------------------------------------------------------
- *                        where_alloc where)
- *                        ------------------
- *
- *    The Alloc node allocates a new variable.  It can be specified whether the
- *    variable should be allocated to the stack or to the heap.
- *
- *    Parameters:
- *      *store       The memory which shall contain the new variable.
- *      *count       This field is for allocating arrays, it specifies how
- *                   many array elements are to be allocated.
- *      *alloc_type  The type of the allocated variable. In case of allocating
- *                   arrays this has to be the array type, not the type of the
- *                   array elements.
- *      where        Where to allocate the variable, either heap_alloc or stack_alloc.
- *
- *    Inputs:
- *      A memory and an unsigned integer.
- *    Output:
- *      A tuple of the changed memory, a control flow to be taken in
- *      case of an exception and the pointer to the new variable.
- *    Attributes:
- *      a.where          Indicates where the variable is allocated.
- *      a.*type          A pointer to the class the allocated data object
- *                       belongs to.
- *
- *    ir_node *new_Free (ir_node *store, ir_node *ptr, ir_node *size, ir_type *free_type,
- *    -----------------------------------------------------------------------------------
- *                        where_alloc where)
- *                        ------------------
- *
- *    The Free node frees memory of the given variable.
- *
- *    Parameters:
- *      *store       The memory which shall contain the new variable.
- *      *ptr         The pointer to the object to free.
- *      *size        The number of objects of type free_type to free in a sequence.
- *      *free_type   The type of the freed variable.
- *      where        Where the variable was allocated, either heap_alloc or stack_alloc.
- *
- *    Inputs:
- *      A memory, a pointer and an unsigned integer.
- *    Output:
- *      The changed memory.
- *    Attributes:
- *      f.*type          A pointer to the type information of the freed data object.
- *
- *    Not Implemented!
- *
- *    ir_node *new_Sync (int arity, ir_node **in)
- *    -------------------------------------------
- *
- *    The Sync operation unifies several partial memory blocks.  These blocks
- *    have to be pairwise disjunct or the values in common locations have to
- *    be identical.  This operation allows to specify all operations that eventually
- *    need several partial memory blocks as input with a single entrance by
- *    unifying the memories with a preceding Sync operation.
- *
- *    Parameters
- *      arity    The number of memories to synchronize.
- *      **in     An array of pointers to nodes that produce an output of
- *               type memory.
- *    Inputs
- *      Several memories.
- *    Output
- *      The unified memory.
- *
- *
- *    SPECIAL OPERATIONS
- *    ------------------
- *
- *    ir_node *new_NoMem (void)
- *    -----------------------------------------------------------------------------------
- *
- *    Returns the unique NoMem node current_ir_graph->no_mem.
- *    This node is used as input for operations that need a Memory, but do not
- *    change it like Div by const != 0, analyzed calls etc.
- *
- *    ir_node *new_Proj (ir_node *arg, ir_mode *mode, long proj)
- *    ----------------------------------------------------------
- *
- *    Selects one entry of a tuple.  This is a hidden edge with attributes.
- *
- *    Parameters
- *      *arg      A node producing a tuple.
- *      *mode     The mode of the value to project.
- *      proj      The position of the value in the tuple.
- *    Input:
- *      The tuple.
- *    Output:
- *      The value.
- *
- *    ir_node *new_Tuple (int arity, ir_node **in)
- *    --------------------------------------------
- *
- *    Builds a Tuple from single values.  This is needed to implement
- *    optimizations that remove a node that produced a tuple.  The node can be
- *    replaced by the Tuple operation so that the following Proj nodes have not to
- *    be changed.  (They are hard to find due to the implementation with pointers
- *    in only one direction.)  The Tuple node is smaller than any other
- *    node, so that a node can be changed into a Tuple by just changing its
- *    opcode and giving it a new in array.
- *
- *    Parameters
- *      arity    The number of tuple elements.
- *      **in     An array containing pointers to the nodes producing the
- *               tuple elements.
- *
- *    ir_node *new_Id (ir_node *val, ir_mode *mode)
- *    ---------------------------------------------
- *
- *    The single output of the Id operation is its input.  Also needed
- *    for optimizations.
- *
- *
- *    HIGH LEVEL OPERATIONS
- *    ---------------------
- *
- *    ir_node *new_CopyB (ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type)
- *    -----------------------------------------------------------------------------------
- *
- *    Describes a high level block copy of a compound type from address src to
- *    address dst. Must be lowered to a Call to a runtime memory copy function.
- *
- *
- *    HIGH LEVEL OPERATIONS: Exception Support
- *    ----------------------------------------
- *    See TechReport 1999-14, chapter Exceptions.
- *
- *    ir_node *new_InstOf(ir_node *store, ir_node *ptr, ir_type *type);
- *    -----------------------------------------------------------------------------------
- *
- *    Describes a high level type check. Must be lowered to a Call to a runtime check
- *    function.
- *
- *    ir_node *new_Raise (ir_node *store, ir_node *obj)
- *    -------------------------------------------------
- *
- *    Raises an exception.  Unconditional change of control flow.  Writes
- *    an explicit Except variable to memory to pass it to the exception
- *    handler.  Must be lowered to a Call to a runtime check
- *    function.
- *
- *    Inputs:
- *      The memory state.
- *      A pointer to the Except variable.
- *    Output:
- *      A tuple of control flow and the changed memory state.  The control flow
- *      points to the exception handler if it is definied in this procedure,
- *      else it points to the end_block.
- *
- *    ir_node *new_Bound  (ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper);
- *    -----------------------------------------------------------------------------------
- *
- *    Describes a high level bounds check. Must be lowered to a Call to a runtime check
- *    function.
- *
- *    ir_node *new_Pin  (ir_node *node);
- *    -----------------------------------------------------------------------------------
- *
- *    Pin the value of the node node in the current block  No users of the Pin node can
- *    float above the Block of the Pin. The node cannot float behind this block. Often
- *    used to Pin the NoMem node.
- *
- *
  *    COPING WITH DATA OBJECTS
  *    ========================
  *
  *    Requires current_block to be set correctly.
  *
  *    There are two special routines for the global store:
- *
- *    void set_store (ir_node *store)
- *    -------------------------------
- *
- *    Adds the store to the array of known values at a reserved
- *    position.
- *    Requires current_block to be set correctly.
- *
- *    ir_node *get_store (void)
- *    -------------------------
- *
- *    Returns the node defining the actual store.
- *    Requires current_block to be set correctly.
- *
- *
- *    inline void keep_alive (ir_node *ka)
- *    ------------------------------------
- *
- *    Keep this node alive because it is (might be) not in the control
- *    flow from Start to End.  Adds the node to the list in the end
- *   node.
- *
  */
 #ifndef FIRM_IR_IRCONS_H
 #define FIRM_IR_IRCONS_H
 #include "begin.h"
 #include "irnode.h"
 
-/*-------------------------------------------------------------------------*/
-/* The raw interface                                                       */
-/*-------------------------------------------------------------------------*/
+/** @addtogroup Const
+ * @{
+ */
 
 /**
  * Constructor for a Const node.
 FIRM_API ir_node *new_rd_Const_long(dbg_info *db, ir_graph *irg,
                                     ir_mode *mode, long value);
 
+/** Constructor for a Const node.
+ *
+ * Adds the node to the start block.
+ *
+ * Constructor for a Const node. The constant represents a target
+ * value.  Sets the type information to type_unknown.  (No more
+ * supported: If tv is entity derives a somehow useful type.)
+ *
+ * @param *irg   The IR graph the node  belongs to.
+ * @param *mode  The mode of the operands and the results.
+ * @param value  A value from which the tarval is made.
+ */
+FIRM_API ir_node *new_r_Const_long(ir_graph *irg, ir_mode *mode, long value);
+
+/**
+ * @see new_rd_Const_long()
+ *
+ * @param *db    A pointer for debug information.
+ * @param *mode  The mode of the operands and results.
+ * @param value  A value from which the tarval is made.
+ */
+FIRM_API ir_node *new_d_Const_long(dbg_info *db, ir_mode *mode, long value);
+
+/**
+ * Make a const from a long.
+ * This is just convenience for the usual
+ * <code>
+ * new_Const(mode, tarval_from_long(mode, ...))
+ * </code>
+ * pain.
+ * @param mode The mode for the const.
+ * @param value The value of the constant.
+ * @return A new const node.
+ */
+FIRM_API ir_node *new_Const_long(ir_mode *mode, long value);
+
+/** @} */
+
+/** addtogroup SymConst
+ * @{
+ */
+
 /** Constructor for a SymConst node.
  *
  *  This is the constructor for a symbolic constant.
@@ -1147,7 +417,8 @@ FIRM_API ir_node *new_rd_SymConst(dbg_info *db, ir_graph *irg, ir_mode *mode,
  *
  * Same as new_rd_SymConst, except that the constructor is tailored for
  * symconst_addr_ent.
- * Adds the SymConst to the start block of irg. */
+ * Adds the SymConst to the start block of irg.
+ */
 FIRM_API ir_node *new_rd_SymConst_addr_ent(dbg_info *db, ir_graph *irg,
                                            ir_mode *mode, ir_entity *symbol);
 
@@ -1164,7 +435,8 @@ FIRM_API ir_node *new_rd_SymConst_ofs_ent(dbg_info *db, ir_graph *irg,
  *
  * Same as new_rd_SymConst, except that the constructor is tailored for
  * symconst_type_size.
- * Adds the SymConst to the start block of irg. */
+ * Adds the SymConst to the start block of irg.
+ */
 FIRM_API ir_node *new_rd_SymConst_size(dbg_info *db, ir_graph *irg,
                                        ir_mode *mode, ir_type *symbol);
 
@@ -1177,84 +449,6 @@ FIRM_API ir_node *new_rd_SymConst_size(dbg_info *db, ir_graph *irg,
 FIRM_API ir_node *new_rd_SymConst_align(dbg_info *db, ir_graph *irg,
                                         ir_mode *mode, ir_type *symbol);
 
-/** Constructor for a simpleSel node.
- *
- *  This is a shortcut for the new_rd_Sel() constructor.  To be used for
- *  Sel nodes that do not select from an array, i.e., have no index
- *  inputs.  It adds the two parameters 0, NULL.
- *
- * @param   *db        A pointer for debug information.
- * @param   *block     The IR block the node belongs to.
- * @param   *store     The memory in which the object the entity should be
- *                     selected from is allocated.
- * @param   *objptr    The object from that the Sel operation selects a
- *                     single attribute out.
- * @param   *ent       The entity to select.
- */
-FIRM_API ir_node *new_rd_simpleSel(dbg_info *db, ir_node *block, ir_node *store,
-                                   ir_node *objptr, ir_entity *ent);
-
-/** Constructor for a remainderless Div node.
- *
- * @param   *db    A pointer for debug information.
- * @param   *block The IR block the node belongs to.
- * @param   *memop The store needed to model exceptions
- * @param   *op1   The first operand.
- * @param   *op2   The second operand.
- * @param   *mode  The mode of the result.
- * @param   state  The pinned state.
- */
-FIRM_API ir_node *new_rd_DivRL(dbg_info *db, ir_node *block, ir_node *memop,
-                               ir_node *op1, ir_node *op2, ir_mode *mode,
-                               op_pin_state state);
-
-/** Constructor for a strictConv node.
- *
- * @param   *db    A pointer for debug information.
- * @param   *block The IR block the node belongs to.
- * @param   *op    The operand.
- * @param   *mode  The mode of this the operand muss be converted .
- */
-FIRM_API ir_node *new_rd_strictConv(dbg_info *db, ir_node *block,
-                                    ir_node *op, ir_mode *mode);
-
-/** Constructor for an ASM pseudo node.
- *
- * @param *db         A pointer for debug information.
- * @param *block      The block the node belong to.
- * @param arity       The number of data inputs to the node.
- * @param *in         The array of length arity of data inputs.
- * @param *inputs     The array of length arity of input constraints.
- * @param n_outs      The number of data outputs to the node.
- * @param *outputs    The array of length n_outs of output constraints.
- * @param n_clobber   The number of clobbered registers.
- * @param *clobber    The array of length n_clobber of clobbered registers.
- * @param *asm_text   The assembler text.
- */
-FIRM_API ir_node *new_rd_ASM(dbg_info *db, ir_node *block,
-                            int arity, ir_node *in[], ir_asm_constraint *inputs,
-                            size_t n_outs, ir_asm_constraint *outputs,
-                            size_t n_clobber, ident *clobber[],
-                            ident *asm_text);
-
-/*-------------------------------------------------------------------------*/
-/* The raw interface without debug support                                 */
-/*-------------------------------------------------------------------------*/
-
-/** Constructor for a Const node.
- *
- * Adds the node to the start block.
- *
- * Constructor for a Const node. The constant represents a target
- * value.  Sets the type information to type_unknown.  (No more
- * supported: If tv is entity derives a somehow useful type.)
- *
- * @param *irg   The IR graph the node  belongs to.
- * @param *mode  The mode of the operands and the results.
- * @param value  A value from which the tarval is made.
- */
-FIRM_API ir_node *new_r_Const_long(ir_graph *irg, ir_mode *mode, long value);
-
 /** Constructor for a SymConst node.
  *
  *  This is the constructor for a symbolic constant.
@@ -1291,84 +485,41 @@ FIRM_API ir_node *new_r_SymConst(ir_graph *irg, ir_mode *mode,
                                  union symconst_symbol value,
                                  symconst_kind kind);
 
-/** Constructor for a simpleSel node.
- *
- *  This is a shortcut for the new_d_Sel() constructor.  To be used for
- *  Sel nodes that do not select from an array, i.e., have no index
- *  inputs.  It adds the two parameters 0, NULL.
- *
- * @param *block     The IR block the node belongs to.
- * @param *store     The memory in which the object the entity should be selected
- *                   from is allocated.
- * @param *objptr    The object from that the Sel operation selects a
- *                   single attribute out.
- * @param *ent       The entity to select.
- */
-FIRM_API ir_node *new_r_simpleSel(ir_node *block, ir_node *store,
-                                  ir_node *objptr, ir_entity *ent);
-
-/** Constructor for a remainderless Div node.
- *
- * @param *block The IR block the node belongs to.
- * @param *memop The store needed to model exceptions
- * @param *op1   The first operand.
- * @param *op2   The second operand.
- * @param *mode  The mode of the result.
- * @param state  The pinned state.
- */
-FIRM_API ir_node *new_r_DivRL(ir_node *block, ir_node *memop,
-                              ir_node *op1, ir_node *op2, ir_mode *mode,
-                              op_pin_state state);
-/** Constructor for a strict Conv node.
+/** Constructor for an SymConst node
  *
- * @param *block The IR block the node belongs to.
- * @param *op    The operand.
- * @param *mode  The mode of this the operand muss be converted .
- */
-FIRM_API ir_node *new_r_strictConv(ir_node *block, ir_node *op, ir_mode *mode);
-
-/** Constructor for an ASM pseudo node.
+ *  This is the constructor for a symbolic constant.
+ *    There are several kinds of symbolic constants:
+ *    - symconst_type_size  The symbolic constant represents the size of a type.
+ *                          The type of which the constant represents the size
+ *                          is given explicitly.
+ *    - symconst_type_align The symbolic constant represents the alignment of a
+ *                          type.  The type of which the constant represents the
+ *                          size is given explicitly.
+ *    - symconst_addr_ent   The symbolic constant represents the address of an
+ *                          entity (variable or method).  The variable is given
+ *                          explicitly by a firm entity.
+ *    - symconst_ofs_ent    The symbolic constant represents the offset of an
+ *                          entity in its owner type.
+ *    - symconst_enum_const The symbolic constant is a enumeration constant of
+ *                          an enumeration type.
  *
- * @param *block      The block the node belong to.
- * @param arity       The number of data inputs to the node.
- * @param *in         The array of length arity of data inputs.
- * @param *inputs     The array of length arity of input constraints.
- * @param n_outs      The number of data outputs to the node.
- * @param *outputs    The array of length n_outs of output constraints.
- * @param n_clobber   The number of clobbered registers.
- * @param *clobber    The array of length n_clobber of clobbered registers.
- * @param *asm_text   The assembler text.
- */
-FIRM_API ir_node *new_r_ASM(ir_node *block,
-                            int arity, ir_node *in[], ir_asm_constraint *inputs,
-                            size_t n_outs, ir_asm_constraint *outputs,
-                            size_t n_clobber, ident *clobber[],
-                            ident *asm_text);
-
-/*-----------------------------------------------------------------------*/
-/* The block oriented interface                                          */
-/*-----------------------------------------------------------------------*/
-
-/** Sets the current block in which the following constructors place the
- *  nodes they construct.
+ *    Inputs to the node:
+ *      No inputs except the block it belongs to.
+ *    Outputs of the node.
+ *      An unsigned integer (I_u) or a pointer (P).
  *
- *  @param target  The new current block.
- */
-FIRM_API void set_cur_block(ir_node *target);
-FIRM_API void set_r_cur_block(ir_graph *irg, ir_node *target);
-
-/** Returns the current block of the current graph. */
-FIRM_API ir_node *get_cur_block(void);
-FIRM_API ir_node *get_r_cur_block(ir_graph *irg);
-
-/**
- * @see new_rd_Const_long()
+ *    Mention union in declaration so that the firmjni generator recognizes that
+ *    it can not cast the argument to an int.
  *
- * @param *db    A pointer for debug information.
- * @param *mode  The mode of the operands and results.
- * @param value  A value from which the tarval is made.
+ * @param *db     A pointer for debug information.
+ * @param mode    The mode for the SymConst.
+ * @param value   A type, ident, entity or enum constant depending on the
+ *                SymConst kind.
+ * @param kind    The kind of the symbolic constant, see the list above
  */
-FIRM_API ir_node *new_d_Const_long(dbg_info *db, ir_mode *mode, long value);
+FIRM_API ir_node *new_d_SymConst(dbg_info *db, ir_mode *mode,
+                                 union symconst_symbol value,
+                                 symconst_kind kind);
 
 /** Constructor for a SymConst node.
  *
@@ -1396,15 +547,92 @@ FIRM_API ir_node *new_d_Const_long(dbg_info *db, ir_mode *mode, long value);
  *    Mention union in declaration so that the firmjni generator recognizes that
  *    it can not cast the argument to an int.
  *
- * @param *db     A pointer for debug information.
  * @param mode    The mode for the SymConst.
  * @param value   A type, ident, entity or enum constant depending on the
  *                SymConst kind.
  * @param kind    The kind of the symbolic constant, see the list above
  */
-FIRM_API ir_node *new_d_SymConst(dbg_info *db, ir_mode *mode,
-                                 union symconst_symbol value,
-                                 symconst_kind kind);
+FIRM_API ir_node *new_SymConst(ir_mode *mode, union symconst_symbol value,
+                               symconst_kind kind);
+
+/** @} */
+
+/** @addtogroup Conv
+ * @{
+ */
+
+/** Constructor for a strictConv node.
+ *
+ * @param db    A pointer for debug information.
+ * @param block The IR block the node belongs to.
+ * @param op    The operand.
+ * @param mode  The mode of this the operand muss be converted .
+ */
+FIRM_API ir_node *new_rd_strictConv(dbg_info *db, ir_node *block,
+                                    ir_node *op, ir_mode *mode);
+
+/** Constructor for a strictConv node.
+ *
+ * @param block The IR block the node belongs to.
+ * @param op    The operand.
+ * @param mode  The mode of this the operand muss be converted .
+ */
+FIRM_API ir_node *new_r_strictConv(ir_node *block, ir_node *op, ir_mode *mode);
+
+/** Constructor for a strict Conv node.
+ *
+ * @param db    A pointer for debug information.
+ * @param op    The operand.
+ * @param mode  The mode of this the operand muss be converted .
+ */
+FIRM_API ir_node *new_d_strictConv(dbg_info *db, ir_node *op, ir_mode *mode);
+
+/** Constructor for a strict Conv node.
+ *
+ * @param op    The operand.
+ * @param mode  The mode of this the operand muss be converted .
+ */
+FIRM_API ir_node *new_strictConv(ir_node *op, ir_mode *mode);
+
+/** @} */
+
+/** @addtogroup Sel
+ * @{
+ */
+
+/** Constructor for a simpleSel node.
+ *
+ *  This is a shortcut for the new_rd_Sel() constructor.  To be used for
+ *  Sel nodes that do not select from an array, i.e., have no index
+ *  inputs.  It adds the two parameters 0, NULL.
+ *
+ * @param   *db        A pointer for debug information.
+ * @param   *block     The IR block the node belongs to.
+ * @param   *store     The memory in which the object the entity should be
+ *                     selected from is allocated.
+ * @param   *objptr    The object from that the Sel operation selects a
+ *                     single attribute out.
+ * @param   *ent       The entity to select.
+ */
+FIRM_API ir_node *new_rd_simpleSel(dbg_info *db, ir_node *block, ir_node *store,
+                                   ir_node *objptr, ir_entity *ent);
+
+/** Constructor for a simpleSel node.
+ *
+ *  This is a shortcut for the new_d_Sel() constructor.  To be used for
+ *  Sel nodes that do not select from an array, i.e., have no index
+ *  inputs.  It adds the two parameters 0, NULL.
+ *
+ * @param *block     The IR block the node belongs to.
+ * @param *store     The memory in which the object the entity should be selected
+ *                   from is allocated.
+ * @param *objptr    The object from that the Sel operation selects a
+ *                   single attribute out.
+ * @param *ent       The entity to select.
+ * @ingroup Sel
+ */
+FIRM_API ir_node *new_r_simpleSel(ir_node *block, ir_node *store,
+                                  ir_node *objptr, ir_entity *ent);
 
 /** Constructor for a simpleSel node.
  *
@@ -1421,6 +649,53 @@ FIRM_API ir_node *new_d_SymConst(dbg_info *db, ir_mode *mode,
  */
 FIRM_API ir_node *new_d_simpleSel(dbg_info *db, ir_node *store, ir_node *objptr,
                                   ir_entity *ent);
+
+/** Constructor for a simpelSel node.
+ *
+ *  This is a shortcut for the new_Sel() constructor.  To be used for
+ *  Sel nodes that do not select from an array, i.e., have no index
+ *  inputs.  It adds the two parameters 0, NULL.
+ *
+ * @param   *store     The memory in which the object the entity should be selected from is allocated.
+ * @param   *objptr    The object from that the Sel operation selects a single attribute out.
+ * @param   *ent       The entity to select.
+ */
+FIRM_API ir_node *new_simpleSel(ir_node *store, ir_node *objptr,
+                                ir_entity *ent);
+
+/** @} */
+
+/** @addtogroup Div
+ * @{
+ */
+
+/** Constructor for a remainderless Div node.
+ *
+ * @param   *db    A pointer for debug information.
+ * @param   *block The IR block the node belongs to.
+ * @param   *memop The store needed to model exceptions
+ * @param   *op1   The first operand.
+ * @param   *op2   The second operand.
+ * @param   *mode  The mode of the result.
+ * @param   state  The pinned state.
+ */
+FIRM_API ir_node *new_rd_DivRL(dbg_info *db, ir_node *block, ir_node *memop,
+                               ir_node *op1, ir_node *op2, ir_mode *mode,
+                               op_pin_state state);
+
+/** Constructor for a remainderless Div node.
+ *
+ * @param *block The IR block the node belongs to.
+ * @param *memop The store needed to model exceptions
+ * @param *op1   The first operand.
+ * @param *op2   The second operand.
+ * @param *mode  The mode of the result.
+ * @param state  The pinned state.
+ */
+FIRM_API ir_node *new_r_DivRL(ir_node *block, ir_node *memop,
+                              ir_node *op1, ir_node *op2, ir_mode *mode,
+                              op_pin_state state);
+
 /** Constructor for a remainderless Div node.
  *
  * Adds the node to the block in current_ir_block.
@@ -1435,19 +710,30 @@ FIRM_API ir_node *new_d_simpleSel(dbg_info *db, ir_node *store, ir_node *objptr,
 FIRM_API ir_node *new_d_DivRL(dbg_info *db, ir_node *memop,
                               ir_node *op1, ir_node *op2, ir_mode *mode,
                               op_pin_state state);
-/** Constructor for a strict Conv node.
+
+/** Constructor for a remainderless Div node.
  *
  * Adds the node to the block in current_ir_block.
  *
- * @param   *db    A pointer for debug information.
- * @param   *op    The operand.
- * @param   *mode  The mode of this the operand muss be converted .
+ * @param   *memop The store needed to model exceptions
+ * @param   *op1   The first operand.
+ * @param   *op2   The second operand.
+ * @param   *mode  The mode of the result.
+ * @param   state  The pinned state.
+ */
+FIRM_API ir_node *new_DivRL(ir_node *memop, ir_node *op1, ir_node *op2,
+                            ir_mode *mode, op_pin_state state);
+
+/** @} */
+
+/** @addtogroup ASM
+ * @{
  */
-FIRM_API ir_node *new_d_strictConv(dbg_info *db, ir_node *op, ir_mode *mode);
 
 /** Constructor for an ASM pseudo node.
  *
  * @param *db         A pointer for debug information.
+ * @param *block      The block the node belong to.
  * @param arity       The number of data inputs to the node.
  * @param *in         The array of length arity of data inputs.
  * @param *inputs     The array of length arity of input constraints.
@@ -1457,97 +743,48 @@ FIRM_API ir_node *new_d_strictConv(dbg_info *db, ir_node *op, ir_mode *mode);
  * @param *clobber    The array of length n_clobber of clobbered registers.
  * @param *asm_text   The assembler text.
  */
-FIRM_API ir_node *new_d_ASM(dbg_info *db, int arity, ir_node *in[],
-                            ir_asm_constraint *inputs,
+FIRM_API ir_node *new_rd_ASM(dbg_info *db, ir_node *block,
+                            int arity, ir_node *in[], ir_asm_constraint *inputs,
                             size_t n_outs, ir_asm_constraint *outputs,
                             size_t n_clobber, ident *clobber[],
                             ident *asm_text);
 
-/*-----------------------------------------------------------------------*/
-/* The block oriented interface without debug support                    */
-/*-----------------------------------------------------------------------*/
-
-/**
- * Make a const from a long.
- * This is just convenience for the usual
- * <code>
- * new_Const(mode, tarval_from_long(mode, ...))
- * </code>
- * pain.
- * @param mode The mode for the const.
- * @param value The value of the constant.
- * @return A new const node.
- */
-FIRM_API ir_node *new_Const_long(ir_mode *mode, long value);
-
-/** Constructor for a SymConst node.
- *
- *  This is the constructor for a symbolic constant.
- *    There are several kinds of symbolic constants:
- *    - symconst_type_size  The symbolic constant represents the size of a type.
- *                          The type of which the constant represents the size
- *                          is given explicitly.
- *    - symconst_type_align The symbolic constant represents the alignment of a
- *                          type.  The type of which the constant represents the
- *                          size is given explicitly.
- *    - symconst_addr_ent   The symbolic constant represents the address of an
- *                          entity (variable or method).  The variable is given
- *                          explicitly by a firm entity.
- *    - symconst_ofs_ent    The symbolic constant represents the offset of an
- *                          entity in its owner type.
- *    - symconst_enum_const The symbolic constant is a enumeration constant of
- *                          an enumeration type.
- *
- *    Inputs to the node:
- *      No inputs except the block it belongs to.
- *    Outputs of the node.
- *      An unsigned integer (I_u) or a pointer (P).
- *
- *    Mention union in declaration so that the firmjni generator recognizes that
- *    it can not cast the argument to an int.
- *
- * @param mode    The mode for the SymConst.
- * @param value   A type, ident, entity or enum constant depending on the
- *                SymConst kind.
- * @param kind    The kind of the symbolic constant, see the list above
- */
-FIRM_API ir_node *new_SymConst(ir_mode *mode, union symconst_symbol value,
-                               symconst_kind kind);
-
-/** Constructor for a simpelSel node.
- *
- *  This is a shortcut for the new_Sel() constructor.  To be used for
- *  Sel nodes that do not select from an array, i.e., have no index
- *  inputs.  It adds the two parameters 0, NULL.
- *
- * @param   *store     The memory in which the object the entity should be selected from is allocated.
- * @param   *objptr    The object from that the Sel operation selects a single attribute out.
- * @param   *ent       The entity to select.
- */
-FIRM_API ir_node *new_simpleSel(ir_node *store, ir_node *objptr,
-                                ir_entity *ent);
-
-/** Constructor for a remainderless Div node.
- *
- * Adds the node to the block in current_ir_block.
+/** Constructor for an ASM pseudo node.
  *
- * @param   *memop The store needed to model exceptions
- * @param   *op1   The first operand.
- * @param   *op2   The second operand.
- * @param   *mode  The mode of the result.
- * @param   state  The pinned state.
+ * @param *block      The block the node belong to.
+ * @param arity       The number of data inputs to the node.
+ * @param *in         The array of length arity of data inputs.
+ * @param *inputs     The array of length arity of input constraints.
+ * @param n_outs      The number of data outputs to the node.
+ * @param *outputs    The array of length n_outs of output constraints.
+ * @param n_clobber   The number of clobbered registers.
+ * @param *clobber    The array of length n_clobber of clobbered registers.
+ * @param *asm_text   The assembler text.
  */
-FIRM_API ir_node *new_DivRL(ir_node *memop, ir_node *op1, ir_node *op2,
-                            ir_mode *mode, op_pin_state state);
+FIRM_API ir_node *new_r_ASM(ir_node *block,
+                            int arity, ir_node *in[], ir_asm_constraint *inputs,
+                            size_t n_outs, ir_asm_constraint *outputs,
+                            size_t n_clobber, ident *clobber[],
+                            ident *asm_text);
 
-/** Constructor for a strict Conv node.
- *
- * Adds the node to the block in current_ir_block.
+/** Constructor for an ASM pseudo node.
  *
- * @param   *op          The operand.
- * @param   *mode        The mode of this the operand muss be converted.
+ * @param *db         A pointer for debug information.
+ * @param arity       The number of data inputs to the node.
+ * @param *in         The array of length arity of data inputs.
+ * @param *inputs     The array of length arity of input constraints.
+ * @param n_outs      The number of data outputs to the node.
+ * @param *outputs    The array of length n_outs of output constraints.
+ * @param n_clobber   The number of clobbered registers.
+ * @param *clobber    The array of length n_clobber of clobbered registers.
+ * @param *asm_text   The assembler text.
+ * @ingroup ASM
  */
-FIRM_API ir_node *new_strictConv(ir_node *op, ir_mode *mode);
+FIRM_API ir_node *new_d_ASM(dbg_info *db, int arity, ir_node *in[],
+                            ir_asm_constraint *inputs,
+                            size_t n_outs, ir_asm_constraint *outputs,
+                            size_t n_clobber, ident *clobber[],
+                            ident *asm_text);
 
 /** Constructor for an ASM pseudo node.
  *
@@ -1559,17 +796,17 @@ FIRM_API ir_node *new_strictConv(ir_node *op, ir_mode *mode);
  * @param n_clobber   The number of clobbered registers.
  * @param *clobber    The array of length n_clobber of clobbered registers.
  * @param *asm_text   The assembler text.
+ * @ingroup ASM
  */
 FIRM_API ir_node *new_ASM(int arity, ir_node *in[], ir_asm_constraint *inputs,
                           size_t n_outs, ir_asm_constraint *outputs,
                           size_t n_clobber, ident *clobber[], ident *asm_text);
 
-/*---------------------------------------------------------------------*/
-/* The comfortable interface.                                          */
-/* Supports automatic Phi node construction.                           */
-/* All routines of the block oriented interface except new_Block are   */
-/* needed also.                                                        */
-/*---------------------------------------------------------------------*/
+/** @} */
+
+/** @defgroup ir_cons Graph Construction Support
+ * @{
+ */
 
 /** Create an immature Block.
  *
@@ -1592,6 +829,18 @@ FIRM_API void add_immBlock_pred(ir_node *immblock, ir_node *jmp);
 /** Finalize a Block node, when all control flows are known. */
 FIRM_API void mature_immBlock(ir_node *block);
 
+/** Sets the current block in which the following constructors place the
+ *  nodes they construct.
+ *
+ *  @param target  The new current block.
+ */
+FIRM_API void set_cur_block(ir_node *target);
+FIRM_API void set_r_cur_block(ir_graph *irg, ir_node *target);
+
+/** Returns the current block of the current graph. */
+FIRM_API ir_node *get_cur_block(void);
+FIRM_API ir_node *get_r_cur_block(ir_graph *irg);
+
 /** Get the current value of a local variable.
  *
  * Use this function to obtain the last definition of the local variable
@@ -1678,6 +927,8 @@ FIRM_API void irp_finalize_cons(void);
 FIRM_API void ir_set_uninitialized_local_variable_func(
                uninitialized_local_variable_func_t *func);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 150a792..ead693d 100644 (file)
  * @brief     Construct and access dominator tree.
  * @author    Goetz Lindenmaier
  * @date      2.2002
- * @brief
- *   This file contains routines to construct and access dominator information.
+ * @brief     This file contains routines to construct and access dominator information.
+ */
+#ifndef FIRM_ANA_IRDOM_H
+#define FIRM_ANA_IRDOM_H
+
+#include "firm_types.h"
+#include "begin.h"
+
+/** @defgroup irana Analyses */
+
+/**
+ * @ingroup irana
+ * @defgroup irdom Dominance Information
  *
  *   The dominator information is stored in three fields of block nodes:
  *     - idom: a reference to the block that is the immediate dominator of
  *
  * We generally presume (like Tarjan) that endless loops do not exist. The
  * implementation assumes a control dependency from End to loop header.
+ *
+ * @{
  */
-#ifndef FIRM_ANA_IRDOM_H
-#define FIRM_ANA_IRDOM_H
-
-#include "firm_types.h"
-#include "begin.h"
 
 /** Accessing the dominator data structure.
  *
@@ -292,6 +300,8 @@ FIRM_API void free_dom(ir_graph *irg);
  */
 FIRM_API void free_postdom(ir_graph *irg);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 2298a9e..933ad3a 100644 (file)
  * @file
  * @brief   Write vcg representation of firm to file.
  * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Hubert Schmidt
- * @brief
- *  Dump routines for the ir graph and all type information.
- *
- *  The dump format of most functions is vcg.  This is a text based graph
- *  representation. Some use the original format,
- *  but most generate an extended format that is only read by some special
- *  versions of xvcg or by the comercialized version now calles aiSee.
- *  A test version of aiSee is available at
- *   http://www.absint.de/aisee/download/index.htm.
+ * @brief   Dump routines for the ir graph and all type information.
  *
- *  We have developed an own advanced viewer called ycomp:
- *    http://www.info.uni-karlsruhe.de/software/ycomp/
  */
 #ifndef FIRM_IR_IRDUMP_H
 #define FIRM_IR_IRDUMP_H
 #include "firm_types.h"
 #include "begin.h"
 
-/** @defgroup convenience_dumper   Convenience interface for dumpers */
-/*@{*/
+/** @defgroup ir_dump Visualisation
+ *
+ * Dumps information so it can be visualised. The dump format of most functions
+ * is vcg.  This is a text based graph representation. Some use the original
+ * format, but most generate an extended format that is only read by some
+ * special versions of xvcg or by the commercialized version now calles aiSee.
+ *
+ * A test version of aiSee is available at
+ *   http://www.absint.de/aisee/download/index.htm.
+ *
+ * We have developed an own advanced viewer called ycomp:
+ *   http://www.info.uni-karlsruhe.de/software/ycomp/
+ *@{
+ */
+
+/** @defgroup convenience Convenience Interface
+ * @{
+ */
 
 /**
  * Convenience interface for dumping a graph as vcg file.
@@ -134,15 +140,6 @@ FIRM_API ir_prog_pass_t *dump_all_ir_graph_pass(const char *name,
 
 /*@}*/
 
-/**
- * @defgroup dumper     Dump information to file
- * This is the low-level interface for dumping information as text files
- * and xvcg graphs.
- * Normally you should use the convenience interface @ref convenience_dumper
- * instead of the functions in this group.
- */
-/*@{*/
-
 /**
  * Dumps all Firm nodes of a single graph for a single procedure in
  * standard xvcg format.
index 710f5ba..d32294f 100644 (file)
@@ -28,7 +28,9 @@
 
 #include "begin.h"
 
-/** Supported Edge kinds. */
+/** Supported Edge kinds.
+ * @ingroup iredges
+ */
 typedef enum ir_edge_kind_t {
        EDGE_KIND_FIRST,
        EDGE_KIND_NORMAL = EDGE_KIND_FIRST,  /**< Normal data flow edges. */
index d25b3c9..2bb93cc 100644 (file)
 #include "iredgekinds.h"
 #include "begin.h"
 
+/**
+ * @ingroup irana
+ * @defgroup iredges Dynamic Reverse Edges
+ * @{
+ */
+
 /**
  * Get the first edge pointing to some node.
  * @note There is no order on out edges. First in this context only
@@ -268,6 +274,8 @@ FIRM_API void irg_walk_edges(ir_node *start, irg_walk_func *pre,
 FIRM_API void edges_reset_private_data(ir_graph *irg, int offset,
                                        unsigned size);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 557d42c..0f64b76 100644 (file)
  * @file
  * @brief   Flags to control optimizations.
  * @author  Christian Schaefer, Goetz Lindenmaier, Michael Beck
- * @brief
+ */
+#ifndef FIRM_IR_IRFLAG_H
+#define FIRM_IR_IRFLAG_H
+
+#include "firm_types.h"
+#include "begin.h"
+
+/**
+ * @ingroup iroptimize
+ * @defgroup Optimization Flags
  * Flags to customize the behavior of libfirm.
  *
  * There are the following groups of flags:
  * 3. Verbosity flags.
  *    a) Flags to steer the level of the information.
  *    b) Flags to steer in which phase information should be dumped.
- * 4. Verification flag
- *    This one controls the behavior of node and type verifications
+ *@{
  */
-#ifndef FIRM_IR_IRFLAG_H
-#define FIRM_IR_IRFLAG_H
-
-#include "firm_types.h"
-#include "begin.h"
 
 /**
  * A container type to load/restore all optimizations
@@ -156,6 +159,14 @@ FIRM_API void restore_optimization_state(const optimization_state_t *state);
  */
 FIRM_API void all_optimizations_off(void);
 
+/** @} */
+
+/** @ingroup irverify
+ * @defgroup Flags
+ * Enable/Disable automatic correctness tests
+ * @{
+ */
+
 /**
  * Possible verification modes.
  */
@@ -175,6 +186,8 @@ typedef enum firm_verification_t {
  */
 FIRM_API void do_node_verification(firm_verification_t mode);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 39670f7..6df1c2f 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @ingroup iroptimize
+ * @defgroup irgopt  Graph Transformations
+ * @{
+ */
+
 /** Applies local optimizations (see iropt.h) to all nodes reachable from node
  * @p n.
  *
@@ -118,6 +124,8 @@ FIRM_API void remove_critical_cf_edges(ir_graph *irg);
 FIRM_API void remove_critical_cf_edges_ex(ir_graph *irg,
                                           int ignore_exception_edges);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 3cd1869..2c6fb5b 100644 (file)
@@ -31,7 +31,7 @@
 #include "begin.h"
 
 /**
- * @page ir_graph   The struct ir_graph
+ * @defgroup ir_graph  Procedure Graph
  *
  * This struct contains all information about a procedure.
  * It's allocated directly to memory.
  * - visited         A int used as flag to traverse the ir_graph.
  *
  * - block_visited    A int used as a flag to traverse block nodes in the graph.
+ *
+ * @{
  */
 
 /** Global variable holding the current ir graph.
@@ -523,6 +525,8 @@ FIRM_API void set_irg_fp_model(ir_graph *irg, unsigned model);
  */
 FIRM_API size_t register_additional_graph_data(size_t size);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 0bc8d00..b0ab2f3 100644 (file)
  * @file
  * @brief    Traverse an ir graph
  * @author   Boris Boesler, Goetz Lindenmaier
- * @brief
- *  Traverse an ir graph:
- *  - execute the pre function before recursion
- *  - execute the post function after recursion
- *
- *  Uses current_ir_graph (from irgraph.h)!!! Set it to the proper
- *  graph before starting the walker.
  */
 #ifndef FIRM_IR_IRGWALK_H
 #define FIRM_IR_IRGWALK_H
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @ingroup ir_graph
+ * @defgroup irgwalk Traversing
+ *
+ *  Traverse graphs:
+ *  - execute the pre function before recursion
+ *  - execute the post function after recursion
+ * @{
+ */
+
 /**
  * Walks over the ir graph.
  *
@@ -251,6 +254,8 @@ FIRM_API void irg_walk_anchors(ir_graph *irg, irg_walk_func *pre,
 unsigned irg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post,
                     void *env);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index a188072..1e38ad9 100644 (file)
 
 /**
  * @file
- * @brief   Import/export textual representation of firm.
+ * @brief   Input/Output textual representation of firm.
  * @author  Moritz Kroll
- *
- * Note: The file format is not considered stable yet. So expect
- * incompatibilities between file formats of different libfirm versions.
  */
 #ifndef FIRM_IR_IRIO_H
 #define FIRM_IR_IRIO_H
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @defgroup irio Input and Output
+ * @note The file format is not considered stable yet. So expect
+ *       incompatibilities between file formats of different libfirm versions.
+ * @{
+ */
+
 /**
  * Exports the whole irp to the given file in a textual form.
  * Exports all types, all ir graphs, and the constant graph.
@@ -62,6 +66,8 @@ FIRM_API int ir_import(const char *filename);
  */
 FIRM_API int ir_import_file(FILE *input, const char *inputname);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index e6aee53..1b4b5ce 100644 (file)
 #include "firm_common.h"
 #include "begin.h"
 
+/** @ingroup irana
+ * @defgroup ir_loop Loops
+ * @{
+ */
+
 /** Returns non-zero if the predecessor pos is a backedge. */
 FIRM_API int is_backedge(const ir_node *n, int pos);
 /** Marks edge pos as a backedge. */
@@ -150,6 +155,8 @@ FIRM_API void free_all_loop_information (void);
  * belongs to or in inner loops of this block. */
 FIRM_API int is_loop_invariant(const ir_node *n, const ir_node *block);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 15212f0..7ed3fbf 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
+/** @ingroup irana
+ * @defgroup ir_memory  Memory Disambiguator
+ *
+ * A memory disambiguator checks wether 2 given SSA values representing
+ * addresses alias.
+ *
+ * @{
+ */
+
 /** The alias relation of two memory addresses. */
 typedef enum ir_alias_relation {
        ir_no_alias,       /**< No alias. */
@@ -244,6 +253,8 @@ FIRM_API void mark_private_methods(void);
  */
 FIRM_API ir_prog_pass_t *mark_private_methods_pass(const char *name);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index cb26aca..6e31f84 100644 (file)
  * @brief   Data modes of operations.
  * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Mathias Heil,
  *          Michael Beck
- * @brief
+ */
+#ifndef FIRM_IR_IRMODE_H
+#define FIRM_IR_IRMODE_H
+
+#include "firm_types.h"
+#include "begin.h"
+
+/**
+ * @defgroup ir_mode Value Modes
  *  This module specifies the modes that type the firm nodes.  It defines
  *  a datasturcture that describes a mode and implements constructors and
  *  access routines to this datastructure. Further it defines a set of
  *
  *  SEE ALSO:
  *    UKA tech report 1999-44 for more information about modes.
+ * @{
  */
-#ifndef FIRM_IR_IRMODE_H
-#define FIRM_IR_IRMODE_H
-
-#include "firm_types.h"
-#include "begin.h"
 
 /**
  * These values represent the different arithmetic operations possible with a
@@ -424,6 +428,8 @@ FIRM_API int is_reinterpret_cast(const ir_mode *src, const ir_mode *dst);
  */
 FIRM_API ir_type *get_type_for_mode(const ir_mode *mode);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index dcb6e4e..d165792 100644 (file)
 #include "nodeops.h"
 
 /**
- * @defgroup ir_node Declarations of an ir node.
- *
- * The type definition of ir_node is also in irgraph.h to resolve
- *  recursion between irnode.h and irgraph.h
+ * @ingroup ir_graph
+ * @defgroup ir_node Graph Nodes
  *
  * ir_node - a datatype representing a Firm node
  *
@@ -227,6 +225,11 @@ FIRM_API ir_node *new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block,
                               ir_op *op, ir_mode *mode,
                               int arity, ir_node *const *in);
 
+/**
+ * @addtogroup Block
+ * @{
+ */
+
 /**
  * Return the block the node belongs to.  This is only
  * possible for pinned nodes or if the graph is in pinned state.
@@ -243,12 +246,6 @@ FIRM_API ir_node *get_nodes_block(const ir_node *node);
 /** Sets the Block of a node. */
 FIRM_API void set_nodes_block(ir_node *node, ir_node *block);
 
-/** Test whether arbitrary node is frame pointer.
- *
- * Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
- * from Start.  If so returns frame type, else Null. */
-FIRM_API ir_type *is_frame_pointer(const ir_node *n);
-
 /** Return the number of control flow predecessors of a block. */
 FIRM_API int get_Block_n_cfgpreds(const ir_node *block);
 /** Return the control flow predecessor of a block at a given position. */
@@ -319,6 +316,18 @@ FIRM_API unsigned get_Block_mark(const ir_node *block);
 /** Set the Block mark (single bit). */
 FIRM_API void set_Block_mark(ir_node *block, unsigned mark);
 
+/** @} */
+
+/** Test whether arbitrary node is frame pointer.
+ *
+ * Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
+ * from Start.  If so returns frame type, else Null. */
+FIRM_API ir_type *is_frame_pointer(const ir_node *n);
+
+/** @addtogroup End
+ * @{
+ */
+
 /** Return the number of Keep alive node. */
 FIRM_API int get_End_n_keepalives(const ir_node *end);
 /** Return the Keep alive node a position pos. */
@@ -346,11 +355,23 @@ FIRM_API void remove_End_Bads_and_doublets(ir_node *end);
    free_End() frees these data structures. */
 FIRM_API void free_End(ir_node *end);
 
+/** @} */
+
+/** @addtogroup Return
+ * @{
+ */
+
 FIRM_API ir_node **get_Return_res_arr(ir_node *node);
 FIRM_API size_t    get_Return_n_ress(const ir_node *node);
 FIRM_API ir_node  *get_Return_res(const ir_node *node, int pos);
 FIRM_API void      set_Return_res(ir_node *node, int pos, ir_node *res);
 
+/** @} */
+
+/** @addtogroup Const
+ * @{
+ */
+
 /** Return non-zero if the given Const node represents the 0 constant. */
 FIRM_API int is_Const_null(const ir_node *node);
 
@@ -360,10 +381,22 @@ FIRM_API int is_Const_one(const ir_node *node);
 /** Return non-zero if the given Const node represents the constant with all bits set. */
 FIRM_API int is_Const_all_one(const ir_node *node);
 
-/** Returns true if a node is a Conv node with strict attribute set. */
+/** @} */
+
+/**
+ * @ingroup Conv
+ * Returns true if a node is a Conv node with strict attribute set.
+ */
 FIRM_API int is_strictConv(const ir_node *node);
 
-/** Returns true if node is a SymConst node with kind symconst_addr_ent. */
+/**
+ * @addtogroup SymConst
+ * @{
+ */
+
+/**
+ * Returns true if node is a SymConst node with kind symconst_addr_ent.
+ */
 FIRM_API int is_SymConst_addr_ent(const ir_node *node);
 
 /** Returns non-zero if s symconst kind has a type attribute */
@@ -396,11 +429,23 @@ FIRM_API union symconst_symbol get_SymConst_symbol(const ir_node *node);
 FIRM_API void                  set_SymConst_symbol(ir_node *node,
                                                    union symconst_symbol sym);
 
+/** @} */
+
+/** @addtogroup Sel
+ * @{
+ */
+
 FIRM_API ir_node   **get_Sel_index_arr(ir_node *node);
 FIRM_API int        get_Sel_n_indexs(const ir_node *node);
 FIRM_API ir_node   *get_Sel_index(const ir_node *node, int pos);
 FIRM_API void       set_Sel_index(ir_node *node, int pos, ir_node *index);
 
+/** @} */
+
+/** @addtogroup Call
+ * @{
+ */
+
 FIRM_API ir_node **get_Call_param_arr(ir_node *node);
 /** Gets the number of parameters of a call. */
 FIRM_API size_t   get_Call_n_params(const ir_node *node);
@@ -436,6 +481,12 @@ FIRM_API ir_entity *get_Call_callee(const ir_node *node, size_t pos);
 FIRM_API void set_Call_callee_arr(ir_node *node, size_t n, ir_entity **arr);
 FIRM_API void remove_Call_callee_arr(ir_node *node);
 
+/** @} */
+
+/** @addtogroup Builtin
+ * @{
+ */
+
 FIRM_API ir_node         **get_Builtin_param_arr(ir_node *node);
 /** Gets the number of parameters of a Builtin. */
 FIRM_API int             get_Builtin_n_params(const ir_node *node);
@@ -443,6 +494,9 @@ FIRM_API int             get_Builtin_n_params(const ir_node *node);
 FIRM_API ir_node         *get_Builtin_param(const ir_node *node, int pos);
 /** Sets the Builtin parameter at position pos. */
 FIRM_API void            set_Builtin_param(ir_node *node, int pos, ir_node *param);
+
+/** @} */
+
 /** Returns a human readable string for the ir_builtin_kind. */
 FIRM_API const char *get_builtin_kind_name(ir_builtin_kind kind);
 
@@ -485,6 +539,11 @@ FIRM_API ir_relation get_negated_relation(ir_relation relation);
 /** Calculates the inversed (R^-1) relation, i.e., "<" --> ">" */
 FIRM_API ir_relation get_inversed_relation(ir_relation relation);
 
+/**
+ * @addtogroup Cast
+ * @{
+ */
+
 /** Checks for upcast.
  *
  * Returns true if the Cast node casts a class type to a super type.
@@ -503,6 +562,13 @@ FIRM_API int is_Cast_upcast(ir_node *node);
  */
 FIRM_API int is_Cast_downcast(ir_node *node);
 
+/** @} */
+
+/**
+ * @addtogroup Phi
+ * @{
+ */
+
 /** Returns true if irg in phase phase_building and the Phi has zero
    predecessors. It's a Phi0 then. */
 FIRM_API int       is_Phi0(const ir_node *n);
@@ -519,6 +585,8 @@ FIRM_API ir_node  *get_Phi_next(const ir_node *phi);
  */
 FIRM_API void      set_Phi_next(ir_node *phi, ir_node *next);
 
+/** @} */
+
 /** Return true if @p node is a memory operation.
  *
  *  A memory operation is an operation that changes the
@@ -542,11 +610,21 @@ FIRM_API void      add_Sync_pred(ir_node *node, ir_node *pred);
  */
 FIRM_API int is_arg_Proj(const ir_node *node);
 
+/** @addtogroup Tuple
+ * @{
+ */
+
 FIRM_API ir_node **get_Tuple_preds_arr(ir_node *node);
 FIRM_API int       get_Tuple_n_preds(const ir_node *node);
 FIRM_API ir_node  *get_Tuple_pred(const ir_node *node, int pos);
 FIRM_API void      set_Tuple_pred(ir_node *node, int pos, ir_node *pred);
 
+/** @} */
+
+/** @addtogroup ASM
+ * @{
+ */
+
 /** Return the number of input constraints for an ASM node. */
 FIRM_API size_t get_ASM_n_input_constraints(const ir_node *node);
 /** Return the number of output constraints for an ASM node.  */
@@ -554,6 +632,8 @@ FIRM_API size_t get_ASM_n_output_constraints(const ir_node *node);
 /** Return the number of clobbered registers for an ASM node.  */
 FIRM_API size_t get_ASM_n_clobbers(const ir_node *node);
 
+/** @} */
+
 /** Returns operand of node if node is a Proj. */
 FIRM_API ir_node *skip_Proj(ir_node *node);
 /** Returns operand of node if node is a Proj. */
index 538d3df..249fcbf 100644 (file)
  * @file
  * @brief   Representation of opcode of intermediate operation.
  * @author  Christian Schaefer, Goetz Lindenmaier, Michael Beck
- * @brief
- *  Operators of firm nodes.
- *
- *  This module specifies the opcodes possible for ir nodes.  Their
- *  definition is close to the operations specified in UKA Tech-Report
- *  1999-14
+ * @brief   Operators of firm nodes.
  */
 #ifndef FIRM_IR_IROP_H
 #define FIRM_IR_IROP_H
 #include "begin.h"
 #include "opcodes.h"
 
+/**
+ * @ingroup ir_node
+ * @defgroup ir_op  Node Opcodes
+ *
+ * This module specifies the opcodes possible for ir nodes.  Their
+ * definition is close to the operations specified in UKA Tech-Report
+ * 1999-14
+ *
+ * @{
+ */
+
 /** The allowed arities. */
 typedef enum {
        oparity_invalid = 0,
@@ -292,6 +298,8 @@ FIRM_API void ir_op_set_fragile_indices(ir_op *op, int pn_x_regular,
 /** Returns the ir_op_ops of an ir_op. */
 FIRM_API const ir_op_ops *get_op_ops(const ir_op *op);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index b507cf0..a211cda 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @ingroup iroptimize
+ * @defgroup iropt  Local Optimizations
+ * @{
+ */
+
 /**
  * The Floating point model.
  *
@@ -102,6 +108,8 @@ FIRM_API int ir_is_negated_value(const ir_node *a, const ir_node *b);
 FIRM_API ir_relation ir_get_possible_cmp_relations(const ir_node *left,
                                                    const ir_node *right);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index d3472ea..1aeadfc 100644 (file)
 #include "nodeops.h"
 #include "begin.h"
 
+/**
+ * @defgroup iroptimize  Transformations and Optimisations
+ * @{
+ */
+
 /**
  * Control flow optimization.
  *
@@ -1104,6 +1109,8 @@ FIRM_API compilerlib_entity_creator_t get_compilerlib_entity_creator(void);
  */
 FIRM_API ir_entity *create_compilerlib_entity(ident *id, ir_type *mt);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 9220ce5..7082292 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @ingroup irana
+ * @defgroup irout Reverse Edges
+ * Out-Edges are the reverse of the edges in a firm graph (also called def-use
+ * edges)
+ * @{
+ */
+
 /** returns the number of successors of the node: */
 FIRM_API int get_irn_n_outs(const ir_node *node);
 
@@ -99,6 +107,8 @@ FIRM_API void assure_irg_outs(ir_graph *irg);
 FIRM_API void free_irg_outs(ir_graph *irg);
 FIRM_API void free_irp_outs(void);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index fc69d73..79a42f0 100644 (file)
  * @brief
  *  Intermediate Representation (IR) of a program.
  *
- *  This file defines a construct that keeps all information about a
- *  program:
+ */
+#ifndef FIRM_IR_IRPROG_H
+#define FIRM_IR_IRPROG_H
+
+#include <stddef.h>
+#include "firm_types.h"
+#include "irgraph.h"
+#include "begin.h"
+
+/**
+ * @defgroup ir_prog Program
+ *
+ *  ir_prog keeps information about a program:
  *   - A reference point to the method to be executed on program start.
  *   - A list of all procedures.
  *   - A list of all types.
  *     all classes in a class hierarchy (as, e.g., "object" in java).
  *   - A degenerated graph that contains constant expressions.
  *   - the output file name
+ *
+ * @{
  */
-#ifndef FIRM_IR_IRPROG_H
-#define FIRM_IR_IRPROG_H
-
-#include <stddef.h>
-#include "firm_types.h"
-#include "irgraph.h"
-#include "begin.h"
 
 typedef enum ir_segment_t {
        IR_SEGMENT_FIRST,
@@ -286,6 +292,8 @@ FIRM_API int get_irp_optimization_dumps(void);
 /** Enable vcg dumping of optimization */
 FIRM_API void enable_irp_optimization_dumps(void);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index b8be066..39450de 100644 (file)
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @defgroup irverify  Correctness Tests
+ * @{
+ */
+
 /**
  * Tests the modes of checknode and its predecessors.
  * checknode must be in current_ir_graph.
@@ -108,6 +113,8 @@ FIRM_API int irg_verify_bads(ir_graph *irg, int flags);
  */
 FIRM_API void verify_enable_entity_tests(int enable);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 3ce7e7d..8fb7cd6 100644 (file)
 
 #include "begin.h"
 
+/**
+ * @defgroup ir_lowering  Lowering
+ *
+ * Lowering is the process of transforming a highlevel representation
+ * (a representation closer to the sourcecode) into a lower-level representation
+ * (something closer to the target machine).
+ *
+ * @{
+ */
+
 /**
  * Lower small CopyB nodes to Load/Store nodes, preserve medium-sized CopyB
  * nodes and replace large CopyBs by a call to memcpy, depending on the given
@@ -483,6 +493,8 @@ typedef struct runtime_rt {
  */
 FIRM_API int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 608bd6b..a6965e0 100644 (file)
  * @brief    Reverse edges that reference types/entities.
  * @author   Goetz Lindenmaier
  * @date     29.10.2004
- * @brief
- *  Trouts list all uses of types and entities.
- *  Each type gets a list of all Alloc nodes allocating it.
- *  Each entity gets two lists:
- *    - one containing all accesses (Load, (Call), Store),
- *    - and one containing all uses to get a reference (Sel, SymConst).
  */
 #ifndef FIRM_ANA_TROUTS_H
 #define FIRM_ANA_TROUTS_H
 
 #include "begin.h"
 
+/**
+ * @ingroup ir_type
+ * @defgroup trouts Reverse Type Edges
+ * Trouts list all uses of types and entities.
+ * Each type gets a list of all Alloc nodes allocating it.
+ * Each entity gets two lists:
+ *   - one containing all accesses (Load, (Call), Store),
+ *   - and one containing all uses to get a reference (Sel, SymConst).
+ * @{
+ */
+
 /** Number of Load/Store nodes that possibly access this entity. */
 FIRM_API size_t get_entity_n_accesses(const ir_entity *ent);
 /** Load/Store node that possibly access this entity. */
@@ -99,6 +104,8 @@ FIRM_API void compute_trouts(void);
 /** Free trout data. */
 FIRM_API void free_trouts(void);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 91401ee..9ddebdd 100644 (file)
  *           values.
  * @date     2003
  * @author   Mathias Heil
- * @brief
- *   Tarvals represent target machine values.  They are typed by modes.
- *   Tarvals only represent values of mode_sort:
+ * @brief    target machine values.
+ */
+#ifndef FIRM_TV_TV_H
+#define FIRM_TV_TV_H
+
+#include <stddef.h>
+#include "firm_types.h"
+
+#include "begin.h"
+
+/** @defgroup ir_tarval  Target Machine Values
+ *
+ * Tarvals only represent values of mode_sort:
  *    - int_number,
  *    - float_number,
  *    - boolean,
  *    - character
  *
  *   In case of references the module accepts an entity to represent the
- *   value.
- *   Furthermore, computations and conversions of these values can
+ *   value. Furthermore, computations and conversions of these values can
  *   be performed.
  *
- * HISTORY
- *    The original tv module originated in the fiasco compiler written ...
- *    This is the new version, described in the tech report 1999-14 by ...
- *
  * @sa
  *    Techreport 1999-14
  *    irmode.h for the modes definitions
+ *
+ * @{
  */
-#ifndef FIRM_TV_TV_H
-#define FIRM_TV_TV_H
-
-#include <stddef.h>
-#include "firm_types.h"
-
-#include "begin.h"
 
 /**
  * Constructor function for new tarvals.
@@ -827,6 +827,8 @@ FIRM_API int tarval_is_finite(ir_tarval *tv);
  */
 FIRM_API int is_tarval(const void *thing);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 52adb49..2023409 100644 (file)
@@ -30,7 +30,7 @@
 #include "begin.h"
 
 /**
- * @page entity       Entity representation
+ * @defgroup ir_entity Entities
  *
  * An entity is the representation of program known objects in Firm.
  * The primary concept of entities is to represent members of complex
@@ -83,7 +83,7 @@
  * Overwrittenby is the inverse of overwrites.  Both add routines add
  * both relations, they only differ in the order of arguments.
  *
- * @see  ir_type, ir_entity
+ * @{
  */
 
 /**
@@ -223,6 +223,16 @@ FIRM_API ir_entity *new_parameter_entity(ir_type *owner, size_t pos,
 FIRM_API ir_entity *new_d_parameter_entity(ir_type *owner, size_t pos,
                                            ir_type *type, dbg_info *dbgi);
 
+/**
+ * Check an entity. Currently, we check only if initialized constants
+ * are build on the const irg graph.
+ *
+ * @return
+ *  0   if no error encountered
+ *  != 0    a trverify_error_codes code
+ */
+FIRM_API int check_entity(ir_entity *ent);
+
 /**
  * Copies the entity if the new_owner is different from the
  * owner of the old entity,  else returns the old entity.
@@ -464,6 +474,10 @@ FIRM_API ir_node *copy_const_value(dbg_info *dbg, ir_node *n, ir_node *to_block)
 FIRM_API ir_node *get_atomic_ent_value(ir_entity *ent);
 FIRM_API void set_atomic_ent_value(ir_entity *ent, ir_node *val);
 
+/** @defgroup ir_initializer  Entity Initializers
+ * @{
+ */
+
 /** the kind (type) of an initializer */
 typedef enum ir_initializer_kind_t {
        /** initializer containing an ir_node from the const-code irg */
@@ -517,6 +531,8 @@ FIRM_API void set_initializer_compound_value(ir_initializer_t *initializer,
 FIRM_API ir_initializer_t *get_initializer_compound_value(
                const ir_initializer_t *initializer, size_t index);
 
+/** @} */
+
 /** Sets the new style initializers of an entity. */
 FIRM_API void set_entity_initializer(ir_entity *entity, ir_initializer_t *initializer);
 
@@ -642,6 +658,41 @@ FIRM_API ir_entity *unknown_entity;
 /** Returns the @link unknown_entity unknown entity @endlink. */
 FIRM_API ir_entity *get_unknown_entity(void);
 
+/** @deprecated */
+typedef enum {
+       allocation_automatic,
+       allocation_parameter,
+       allocation_dynamic,
+       allocation_static
+} ir_allocation;
+/** @deprecated */
+FIRM_API ir_allocation get_entity_allocation(const ir_entity *ent);
+/** @deprecated */
+FIRM_API void set_entity_allocation(ir_entity *ent, ir_allocation al);
+
+/** @deprecated */
+typedef enum {
+       peculiarity_existent,
+       peculiarity_description,
+       peculiarity_inherited
+} ir_peculiarity;
+/** @deprecated */
+FIRM_API ir_peculiarity get_entity_peculiarity(const ir_entity *ent);
+/** @deprecated */
+FIRM_API void set_entity_peculiarity(ir_entity *ent, ir_peculiarity pec);
+
+/** @deprecated */
+FIRM_API int is_entity_final(const ir_entity *ent);
+/** @deprecated */
+FIRM_API void set_entity_final(ir_entity *ent, int final);
+
+/** @deprecated */
+FIRM_API ir_peculiarity get_class_peculiarity(const ir_type *clss);
+/** @deprecated */
+FIRM_API void set_class_peculiarity(ir_type *clss, ir_peculiarity pec);
+
+/** @} */
+
 /** Encodes how a pointer parameter is accessed. */
 typedef enum ptr_access_kind {
        ptr_access_none  = 0,                                 /**< no access */
@@ -658,13 +709,38 @@ ENUM_BITSET(ptr_access_kind)
 #define IS_STORED(a)   ((a) & ptr_access_store)
 
 /**
- * @page tyop  type operations
+ * @defgroup ir_type Type System
+ *
+ *  Datastructure to hold type information.
+ *
+ *  This module supplies a datastructure to represent all types
+ *  known in the compiled program.  This includes types specified
+ *  in the program as well as types defined by the language.  In the
+ *  view of the intermediate representation there is no difference
+ *  between these types.  Finally it specifies some auxiliary types.
+ *
+ *  There exist several kinds of types, arranged by the structure of
+ *  the type.  A type is described by a set of attributes.  Some of
+ *  these attributes are common to all types, others depend on the
+ *  kind of the type.
+ *
+ *  Types are different from the modes defined in irmode:  Types are
+ *  on the level of the programming language, modes at the level of
+ *  the target processor.
+ *
+ * @{
+ */
+
+/**
+ * @defgroup tp_op  Type Opcodes
  *  This module specifies the kinds of types available in firm.
  *
  *  They are called type opcodes. These include classes, structs, methods, unions,
  *  arrays, enumerations, pointers and primitive types.
  *  Special types with own opcodes are the id type, a type representing an unknown
  *  type and a type used to specify that something has no type.
+ *
+ * @{
  */
 
 /**
@@ -714,121 +790,7 @@ FIRM_API const char *get_tpop_name(const tp_op *op);
  */
 FIRM_API tp_opcode get_tpop_code(const tp_op *op);
 
-/**
- * This type opcode marks that the corresponding type is a class type.
- *
- * Consequently the type refers to supertypes, subtypes and entities.
- * Entities can be any fields, but also methods.
- * @@@ value class or not???
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_class;
-FIRM_API const tp_op *get_tpop_class(void);
-
-/**
- * This type opcode marks that the corresponding type is a compound type
- * as a struct in C.
- *
- * Consequently the type refers to a list of entities
- * which may not be methods (but pointers to methods).
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_struct;
-FIRM_API const tp_op *get_tpop_struct(void);
-
-/**
- * This type opcode marks that the corresponding type is a method type.
- *
- * Consequently it refers to a list of arguments and results.
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_method;
-FIRM_API const tp_op *get_tpop_method(void);
-
-/**
- * This type opcode marks that the corresponding type is a union type.
- *
- * Consequently it refers to a list of unioned types.
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_union;
-FIRM_API const tp_op *get_tpop_union(void);
-
-/**
- * This type opcode marks that the corresponding type is an array type.
- *
- * Consequently it contains a list of dimensions (lower and upper bounds)
- * and an element type.
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_array;
-FIRM_API const tp_op *get_tpop_array(void);
-
-/**
- * This type opcode marks that the corresponding type is an enumeration type.
- *
- * Consequently it contains a list of idents for the enumeration identifiers
- * and a list of target values that are the constants used to implement
- * the enumerators.
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_enumeration;
-FIRM_API const tp_op *get_tpop_enumeration(void);
-
-/**
- * This type opcode marks that the corresponding type is a pointer type.
- *
- * It contains a reference to the type the pointer points to.
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_pointer;
-FIRM_API const tp_op *get_tpop_pointer(void);
-
-/**
- * This type opcode marks that the corresponding type is a primitive type.
- *
- * Primitive types are types that are directly mapped to target machine
- * modes.
- * This struct is dynamically allocated but constant for the lifetime
- * of the library.
- */
-FIRM_API const tp_op *type_primitive;
-FIRM_API const tp_op *get_tpop_primitive(void);
-
-/**
- * The code type is used to mark pieces of code (basic blocks)
- */
-FIRM_API const tp_op *tpop_code;
-FIRM_API const tp_op *get_tpop_code_type(void);
-
-/**
- * This type opcode is an auxiliary opcode dedicated to support type analyses.
- *
- * Types with this opcode represents that there is no type.
- * The type can be used to initialize fields of the type* that actually can not
- * contain a type or that are initialized for an analysis. There exists exactly
- * one type with this opcode.
- */
-FIRM_API const tp_op *tpop_none;
-FIRM_API const tp_op *get_tpop_none(void);
-
-/**
- * This type opcode is an auxiliary opcode dedicated to support type analyses.
- *
- * Types with this opcode represents that there could be a type, but it is not
- * known.  This type can be used to initialize fields before an analysis (not known
- * yet) or to represent the top of a lattice (could not be determined).  There exists
- * exactly one type with this opcode.
- */
-FIRM_API const tp_op *tpop_unknown;
-FIRM_API const tp_op *get_tpop_unknown(void);
+/** @} */
 
 /** Returns true if low is subclass of high.
  *
@@ -1037,16 +999,6 @@ enum trverify_error_codes {
  */
 FIRM_API int check_type(ir_type *tp);
 
-/**
- * Check an entity. Currently, we check only if initialized constants
- * are build on the const irg graph.
- *
- * @return
- *  0   if no error encountered
- *  != 0    a trverify_error_codes code
- */
-FIRM_API int check_entity(ir_entity *ent);
-
 /**
  * Walks the type information and performs a set of sanity checks.
  *
@@ -1061,27 +1013,6 @@ FIRM_API int check_entity(ir_entity *ent);
  */
 FIRM_API int tr_verify(void);
 
-/**
- * @page type   representation of types
- *
- *  Datastructure to hold type information.
- *
- *  This module supplies a datastructure to represent all types
- *  known in the compiled program.  This includes types specified
- *  in the program as well as types defined by the language.  In the
- *  view of the intermediate representation there is no difference
- *  between these types.  Finally it specifies some auxiliary types.
- *
- *  There exist several kinds of types, arranged by the structure of
- *  the type.  A type is described by a set of attributes.  Some of
- *  these attributes are common to all types, others depend on the
- *  kind of the type.
- *
- *  Types are different from the modes defined in irmode:  Types are
- *  on the level of the programming language, modes at the level of
- *  the target processor.
- */
-
 /** Frees all entities associated with a type.
  *  Does not free the array entity.
  *  Warning: ensure these entities are not referenced anywhere else.
@@ -1095,7 +1026,8 @@ FIRM_API void free_type_entities(ir_type *tp);
  * not free if tp is "none" or "unknown".  Frees entities in value
  * param subtypes of method types!!! Make sure these are not
  * referenced any more.  Further make sure there is no pointer type
- * that refers to this type.                           */
+ * that refers to this type.
+ */
 FIRM_API void free_type(ir_type *tp);
 
 FIRM_API const tp_op *get_type_tpop(const ir_type *tp);
@@ -1237,6 +1169,13 @@ FIRM_API type_dbg_info *get_type_dbg_info(const ir_type *tp);
  */
 FIRM_API int is_type(const void *thing);
 
+/**
+ *  Outputs a unique number for this type if libfirm is compiled for
+ *  debugging, (configure with --enable-debug) else returns the address
+ *  of the type cast to long.
+ */
+FIRM_API long get_type_nr(const ir_type *tp);
+
 /**
  *   Checks whether two types are structurally equal.
  *
@@ -1312,7 +1251,8 @@ FIRM_API int equal_type(ir_type *typ1, ir_type *typ2);
 FIRM_API int smaller_type(ir_type *st, ir_type *lt);
 
 /**
- *  @page class_type    Representation of a class type
+ * @ingroup compound_type
+ * @defgroup class_type Class
  *
  *  If the type opcode is set to type_class the type represents class
  *  types.  A list of fields and methods is associated with a class.
@@ -1355,6 +1295,7 @@ FIRM_API int smaller_type(ir_type *st, ir_type *lt);
  *                 between interfaces, abstract classes and other classes that all may
  *                 have the peculiarity peculiarity_description.  Depending on this flag
  *                 the lowering might do different actions.  Default:  false
+ * @{
  */
 
 /** Creates a new class type. */
@@ -1487,7 +1428,20 @@ FIRM_API void set_class_abstract(ir_type *clss, int flag);
 FIRM_API int is_Class_type(const ir_type *clss);
 
 /**
- *  @page struct_type   Representation of a struct type
+ * This type opcode marks that the corresponding type is a class type.
+ *
+ * Consequently the type refers to supertypes, subtypes and entities.
+ * Entities can be any fields, but also methods.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+FIRM_API const tp_op *type_class;
+FIRM_API const tp_op *get_tpop_class(void);
+
+/** @} */
+
+/** @ingroup compound_type
+ * @defgroup struct_type Struct
  *
  *  A struct type represents aggregate types that consist of a list
  *  of fields.
@@ -1501,7 +1455,9 @@ FIRM_API int is_Class_type(const ir_type *clss);
  *             but not shrinked.
  *             This is a dynamic list that can be grown with an "add_" function,
  *             but not shrinked.
+ * @{
  */
+
 /** Creates a new type struct */
 FIRM_API ir_type *new_type_struct(ident *name);
 /** Creates a new type struct with debug information. */
@@ -1526,7 +1482,72 @@ FIRM_API size_t get_struct_member_index(const ir_type *strct, ir_entity *member)
 FIRM_API int is_Struct_type(const ir_type *strct);
 
 /**
- * @page method_type    Representation of a method type
+ * This type opcode marks that the corresponding type is a compound type
+ * as a struct in C.
+ *
+ * Consequently the type refers to a list of entities
+ * which may not be methods (but pointers to methods).
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+FIRM_API const tp_op *type_struct;
+FIRM_API const tp_op *get_tpop_struct(void);
+
+/** @} */
+
+/**
+ * @ingroup compound_type
+ * @defgroup union_type  Union
+ *
+ *   The union type represents union types.  Note that this representation
+ *   resembles the C union type.  For tagged variant types like in Pascal or
+ *   Modula a combination of a struct and a union type must be used.
+ *
+ *   - n_types:     Number of unioned types.
+ *   - members:     Entities for unioned types.  Fixed length array.
+ *                  This is a dynamic list that can be grown with an "add_"
+ *                  function, but not shrinked.
+ * @{
+ */
+/** Creates a new type union. */
+FIRM_API ir_type *new_type_union(ident *name);
+
+/** Creates a new type union with debug information. */
+FIRM_API ir_type *new_d_type_union(ident *name, type_dbg_info* db);
+
+
+/** return union identifier */
+FIRM_API ident *get_union_ident(const ir_type *uni);
+
+/** return union identifier as c-string */
+FIRM_API const char *get_union_name(const ir_type *uni);
+
+/** Returns the number of unioned types of this union */
+FIRM_API size_t get_union_n_members(const ir_type *uni);
+
+/** Returns the entity at position pos of a union */
+FIRM_API ir_entity *get_union_member(const ir_type *uni, size_t pos);
+
+/** Returns index of member in uni, -1 if not contained. */
+FIRM_API size_t get_union_member_index(const ir_type *uni, ir_entity *member);
+
+/** Returns true if a type is a union type. */
+FIRM_API int is_Union_type(const ir_type *uni);
+
+/**
+ * This type opcode marks that the corresponding type is a union type.
+ *
+ * Consequently it refers to a list of unioned types.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+FIRM_API const tp_op *type_union;
+FIRM_API const tp_op *get_tpop_union(void);
+
+/** @} */
+
+/**
+ * @defgroup method_type    Method
  *
  * A method type represents a method, function or procedure type.
  * It contains a list of the parameter and result types, as these
@@ -1553,6 +1574,7 @@ FIRM_API int is_Struct_type(const ir_type *strct);
  * - res_type:   A list with the types of parameters.  This list is ordered.
  *               The nth type in this list corresponds to the nth input to
  *               Return nodes.  (See ircons.h for more information.)
+ * @{
  */
 
 /** Create a new method type.
@@ -1699,44 +1721,19 @@ FIRM_API void set_method_n_regparams(ir_type *method, unsigned n_regs);
 FIRM_API int is_Method_type(const ir_type *method);
 
 /**
- *   @page union_type   Representation of a union (variant) type.
- *
- *   The union type represents union types.  Note that this representation
- *   resembles the C union type.  For tagged variant types like in Pascal or Modula
- *   a combination of a struct and a union type must be used.
+ * This type opcode marks that the corresponding type is a method type.
  *
- *   - n_types:     Number of unioned types.
- *   - members:     Entities for unioned types.  Fixed length array.
- *                  This is a dynamic list that can be grown with an "add_" function,
- *                  but not shrinked.
+ * Consequently it refers to a list of arguments and results.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
  */
-/** Creates a new type union. */
-FIRM_API ir_type *new_type_union(ident *name);
-
-/** Creates a new type union with debug information. */
-FIRM_API ir_type *new_d_type_union(ident *name, type_dbg_info* db);
-
-
-/** return union identifier */
-FIRM_API ident *get_union_ident(const ir_type *uni);
-
-/** return union identifier as c-string */
-FIRM_API const char *get_union_name(const ir_type *uni);
-
-/** Returns the number of unioned types of this union */
-FIRM_API size_t get_union_n_members(const ir_type *uni);
-
-/** Returns the entity at position pos of a union */
-FIRM_API ir_entity *get_union_member(const ir_type *uni, size_t pos);
-
-/** Returns index of member in uni, -1 if not contained. */
-FIRM_API size_t get_union_member_index(const ir_type *uni, ir_entity *member);
+FIRM_API const tp_op *type_method;
+FIRM_API const tp_op *get_tpop_method(void);
 
-/** Returns true if a type is a union type. */
-FIRM_API int is_Union_type(const ir_type *uni);
+/** @} */
 
 /**
- * @page array_type Representation of an array type
+ * @defgroup array_type  Array
  *
  * The array type represents rectangular multi dimensional arrays.
  * The constants representing the bounds must be allocated to
@@ -1748,6 +1745,7 @@ FIRM_API int is_Union_type(const ir_type *uni);
  * - *element_type:   The type of the array elements.
  * - *element_ent:    An entity for the array elements to be used for
  *                      element selection with Sel.
+ * @{
  */
 
 /** Create a new type array.
@@ -1842,7 +1840,20 @@ FIRM_API ir_entity *get_array_element_entity(const ir_type *array);
 FIRM_API int is_Array_type(const ir_type *array);
 
 /**
- * @page enumeration_type   Representation of an enumeration type
+ * This type opcode marks that the corresponding type is an array type.
+ *
+ * Consequently it contains a list of dimensions (lower and upper bounds)
+ * and an element type.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+FIRM_API const tp_op *type_array;
+FIRM_API const tp_op *get_tpop_array(void);
+
+/** @} */
+
+/**
+ * @defgroup enumeration_type   Enumeration
  *
  * Enumeration types need not necessarily be represented explicitly
  * by Firm types, as the frontend can lower them to integer constants as
@@ -1852,6 +1863,7 @@ FIRM_API int is_Array_type(const ir_type *array);
  *
  * - *const:        The target values representing the constants used to
  *                  represent individual enumerations.
+ * @{
  */
 
 /** Create a new type enumeration -- set the enumerators independently. */
@@ -1901,10 +1913,25 @@ FIRM_API const char *get_enumeration_const_name(const ir_enum_const *enum_cnst);
 FIRM_API int is_Enumeration_type(const ir_type *enumeration);
 
 /**
- * @page pointer_type   Representation of a pointer type
+ * This type opcode marks that the corresponding type is an enumeration type.
+ *
+ * Consequently it contains a list of idents for the enumeration identifiers
+ * and a list of target values that are the constants used to implement
+ * the enumerators.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+FIRM_API const tp_op *type_enumeration;
+FIRM_API const tp_op *get_tpop_enumeration(void);
+
+/** @} */
+
+/**
+ * @defgroup pointer_type   Pointer
  *
  * Pointer types:
  * - points_to:      The type this pointer points to.
+ * @{
  */
 
 /** Creates a new type pointer. */
@@ -1929,11 +1956,24 @@ FIRM_API int is_Pointer_type(const ir_type *pointer);
 FIRM_API ir_type *find_pointer_type_to_type(ir_type *tp);
 
 /**
- * @page primitive_type Representation of a primitive type
+ * This type opcode marks that the corresponding type is a pointer type.
+ *
+ * It contains a reference to the type the pointer points to.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+FIRM_API const tp_op *type_pointer;
+FIRM_API const tp_op *get_tpop_pointer(void);
+
+/** @} */
+
+/**
+ * @defgroup primitive_type Primitive
  *
  * Primitive types are types that represent atomic data values that
  * map directly to modes.  They don't have private attributes.  The
  * important information they carry is held in the common mode field.
+ * @{
  */
 /** Creates a new primitive type. */
 FIRM_API ir_type *new_type_primitive(ir_mode *mode);
@@ -1951,7 +1991,20 @@ FIRM_API ir_type *get_primitive_base_type(const ir_type *tp);
 FIRM_API void set_primitive_base_type(ir_type *tp, ir_type *base_tp);
 
 /**
- * @page none_type The None type
+ * This type opcode marks that the corresponding type is a primitive type.
+ *
+ * Primitive types are types that are directly mapped to target machine
+ * modes.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+FIRM_API const tp_op *type_primitive;
+FIRM_API const tp_op *get_tpop_primitive(void);
+
+/** @} */
+
+/**
+ * @defgroup none_type None
  *
  *  This type is an auxiliary type dedicated to support type analyses.
  *
@@ -1966,20 +2019,44 @@ FIRM_API void set_primitive_base_type(ir_type *tp, ir_type *base_tp);
  *    - name:  "type_none"
  *    - state: layout_fixed
  *    - size:  0
+ * @{
  */
 /** A variable that contains the only none type. */
 FIRM_API ir_type *firm_none_type;
+/** Returns the none type. */
+FIRM_API ir_type *get_none_type(void);
+/**
+ * This type opcode is an auxiliary opcode dedicated to support type analyses.
+ *
+ * Types with this opcode represents that there is no type.
+ * The type can be used to initialize fields of the type* that actually can not
+ * contain a type or that are initialized for an analysis. There exists exactly
+ * one type with this opcode.
+ */
+FIRM_API const tp_op *tpop_none;
+FIRM_API const tp_op *get_tpop_none(void);
+/** @} */
 
+/** @defgroup code_type Code
+ * @{
+ */
 /** A variable that contains the only code type. */
 FIRM_API ir_type *firm_code_type;
-
-/** Returns the none type. */
-FIRM_API ir_type *get_none_type(void);
 /** Returns the code type. */
 FIRM_API ir_type *get_code_type(void);
+/**
+ * Checks whether a type is a code type.
+ */
+FIRM_API int is_code_type(const ir_type *tp);
+/**
+ * The code type is used to mark pieces of code (basic blocks)
+ */
+FIRM_API const tp_op *tpop_code;
+FIRM_API const tp_op *get_tpop_code_type(void);
+/** @} */
 
 /**
- * @page unknown_type  The Unknown type
+ * @defgroup unknown_type  Unknown
  *
  *  This type is an auxiliary type dedicated to support type analyses.
  *
@@ -1994,13 +2071,23 @@ FIRM_API ir_type *get_code_type(void);
  *    - name:  "type_unknown"
  *    - state: layout_fixed
  *    - size:  0
+ * @{
  */
 /** A variable that contains the only unknown type. */
 FIRM_API ir_type *firm_unknown_type;
-
 /** Returns the unknown type. */
 FIRM_API ir_type *get_unknown_type(void);
-
+/**
+ * This type opcode is an auxiliary opcode dedicated to support type analyses.
+ *
+ * Types with this opcode represents that there could be a type, but it is not
+ * known.  This type can be used to initialize fields before an analysis (not known
+ * yet) or to represent the top of a lattice (could not be determined).  There exists
+ * exactly one type with this opcode.
+ */
+FIRM_API const tp_op *tpop_unknown;
+FIRM_API const tp_op *get_tpop_unknown(void);
+/** @} */
 
 /**
  *  Checks whether a type is atomic.
@@ -2009,6 +2096,11 @@ FIRM_API ir_type *get_unknown_type(void);
  */
 FIRM_API int is_atomic_type(const ir_type *tp);
 
+/**
+ * @defgroup compound_type Compound
+ *
+ * @{
+ */
 
 /**
  * Gets the identifier of a compound type
@@ -2061,15 +2153,11 @@ FIRM_API void default_layout_compound_type(ir_type *tp);
  */
 FIRM_API int is_compound_type(const ir_type *tp);
 
-/**
- * Checks whether a type is a code type.
- */
-FIRM_API int is_code_type(const ir_type *tp);
+/** @} */
 
-/**
- * Checks, whether a type is a frame type.
+/** @defgroup frame_type  Frame
+ * @{
  */
-FIRM_API int is_frame_type(const ir_type *tp);
 
 /**
  * Makes a new frame type. Frame types are class types,
@@ -2078,6 +2166,11 @@ FIRM_API int is_frame_type(const ir_type *tp);
  */
 FIRM_API ir_type *new_type_frame(void);
 
+/**
+ * Checks, whether a type is a frame type.
+ */
+FIRM_API int is_frame_type(const ir_type *tp);
+
 /**
  * Makes a clone of a frame type.
  * Sets entity links from old frame entities to new onces and
@@ -2100,12 +2193,12 @@ FIRM_API ir_type *clone_frame_type(ir_type *type);
 FIRM_API ir_entity *frame_alloc_area(ir_type *frame_type, int size,
                                      unsigned alignment, int at_start);
 
+/** @} */
+
 /**
- *  Outputs a unique number for this type if libfirm is compiled for
- *  debugging, (configure with --enable-debug) else returns the address
- *  of the type cast to long.
+ * @defgroup trwalk Traversing
+ * @{
  */
-FIRM_API long get_type_nr(const ir_type *tp);
 
 /**  Type for a function that compares two types.
  *
@@ -2215,38 +2308,9 @@ FIRM_API ir_visibility get_type_visibility(const ir_type *tp);
 /** @deprecated */
 FIRM_API void          set_type_visibility(ir_type *tp, ir_visibility v);
 
-/** @deprecated */
-typedef enum {
-       allocation_automatic,
-       allocation_parameter,
-       allocation_dynamic,
-       allocation_static
-} ir_allocation;
-/** @deprecated */
-FIRM_API ir_allocation get_entity_allocation(const ir_entity *ent);
-/** @deprecated */
-FIRM_API void set_entity_allocation(ir_entity *ent, ir_allocation al);
-
-/** @deprecated */
-typedef enum {
-       peculiarity_existent,
-       peculiarity_description,
-       peculiarity_inherited
-} ir_peculiarity;
-/** @deprecated */
-FIRM_API ir_peculiarity get_entity_peculiarity(const ir_entity *ent);
-/** @deprecated */
-FIRM_API void set_entity_peculiarity(ir_entity *ent, ir_peculiarity pec);
-
-/** @deprecated */
-FIRM_API int is_entity_final(const ir_entity *ent);
-/** @deprecated */
-FIRM_API void set_entity_final(ir_entity *ent, int final);
+/** @} */
 
-/** @deprecated */
-FIRM_API ir_peculiarity get_class_peculiarity(const ir_type *clss);
-/** @deprecated */
-FIRM_API void set_class_peculiarity(ir_type *clss, ir_peculiarity pec);
+/** @} */
 
 #include "end.h"
 
index 09c828b..aa2866d 100644 (file)
@@ -21,7 +21,6 @@
  * @file
  * @brief   Analyse the graph with value range propagation
  * @author  Jonas Fietz
- *
  */
 #ifndef VRP_H
 #define VRP_H
 #include "firm_types.h"
 #include "begin.h"
 
+/**
+ * @ingroup irana
+ * @defgroup vrp  Value Information
+ * Information about SSA-values (ranges, known bits, ...)
+ * @{
+ */
+
 enum range_types {
        VRP_UNDEFINED, /**< No information could be derived so far */
        VRP_RANGE,     /**< bottom and top form a range, including both values */
@@ -79,6 +85,8 @@ FIRM_API ir_relation vrp_cmp(const ir_node *left, const ir_node *right);
  */
 FIRM_API vrp_attr *vrp_get_info(const ir_node *n);
 
+/** @} */
+
 #include "end.h"
 
 #endif
index 4415954..b5f3153 100755 (executable)
@@ -6,33 +6,44 @@ import docutils.writers.html4css1
 from datetime import datetime
 from jinja2 import Environment, Template
 from jinja2.filters import do_dictsort
-from spec_util import is_dynamic_pinned, verify_node, isAbstract, setdefault
+from spec_util import is_dynamic_pinned, verify_node, isAbstract, setdefault, trim_docstring
 from ir_spec import nodes
 
-def trim(docstring):
-    if not docstring:
-        return ''
-    # Convert tabs to spaces (following the normal Python rules)
-    # and split into a list of lines:
-    lines = docstring.expandtabs().splitlines()
-    # Determine minimum indentation (first line doesn't count):
-    indent = sys.maxint
-    for line in lines[1:]:
-        stripped = line.lstrip()
-        if stripped:
-            indent = min(indent, len(line) - len(stripped))
-    # Remove indentation (first line is special):
-    trimmed = [lines[0].strip()]
-    if indent < sys.maxint:
-        for line in lines[1:]:
-            trimmed.append(line[indent:].rstrip())
-    # Strip off trailing and leading blank lines:
-    while trimmed and not trimmed[-1]:
-        trimmed.pop()
-    while trimmed and not trimmed[0]:
-        trimmed.pop(0)
-    # Return a single string:
-    return '\n'.join(trimmed)
+tags = None
+linkbase = None
+
+def format_doxygrouplink(string, link=None):
+       global tags
+       if link == None:
+               link = string
+       if tags == None:
+               return string
+       e = tags.xpath("//compound[name/text()='%s']" % link)
+       if len(e) == 0:
+               return string
+       e = e[0]
+       anchorfile = e.xpath("filename/text()")
+       if len(anchorfile) == 0:
+               return string
+       global linkbase
+       return "<a href=\"%s/%s\">%s</a>" % (linkbase, anchorfile[0], string)
+
+def format_doxylink(string, link=None):
+       global tags
+       if link == None:
+               link = string
+       if tags == None:
+               return string
+       e = tags.xpath("//member[name/text()='%s']" % link)
+       if len(e) == 0:
+               return string
+       e = e[0]
+       anchorfile = e.xpath("anchorfile/text()")
+       anchor = e.xpath("anchor/text()")
+       if len(anchorfile) == 0 or len(anchor) == 0:
+               return string
+       global linkbase
+       return "<a href=\"%s/%s#%s\">%s</a>" % (linkbase, anchorfile[0], anchor[0], string)
 
 def format_docutils(string):
        writer = docutils.writers.html4css1.Writer()
@@ -41,6 +52,8 @@ def format_docutils(string):
 
 env = Environment()
 env.filters['docutils'] = format_docutils
+env.filters['doxylink'] = format_doxylink
+env.filters['doxygrouplink'] = format_doxygrouplink
 
 docu_template = env.from_string(
 '''<html>
@@ -87,8 +100,9 @@ docu_template = env.from_string(
                                        {% set comma = joiner(", ") %}
                                        <h5>Flags</h5>
                                        {% for flag in node.flags -%}
-                                               {{comma()}}{{flag}}
+                                               {{comma()}}{{flag|doxylink("irop_flag_" + flag)}}
                                        {%- endfor %}
+                                       <h5>{{"API"|doxygrouplink(node.name)}}</h5>
                                        <hr/>
                                </div>
                                {% endfor %}
@@ -118,7 +132,7 @@ docu_template = env.from_string(
 #############################
 
 def preprocess_node(node):
-       node.doc = trim(node.__doc__)
+       node.doc = trim_docstring(node.__doc__)
 
 def prepare_nodes():
        real_nodes = []
@@ -131,13 +145,23 @@ def prepare_nodes():
        return real_nodes
 
 def main(argv):
+       global tags
        output = sys.stdout
        if len(argv) > 1:
-               output = open(argv[1], "w")
+               output = open(argv[-1], "w")
+       if len(argv) > 3:
+               tagfile = open(argv[-3], "r")
+               global linkbase
+               linkbase = argv[-2]
+               try:
+                       from lxml import etree
+                       tags = etree.parse(tagfile)
+               except:
+                       tags = None
 
        real_nodes = prepare_nodes()
        time = datetime.now().replace(microsecond=0).isoformat(' ')
-       output.write(docu_template.render(nodes = real_nodes, time=time))
+       output.write(docu_template.render(nodes=real_nodes, time=time))
        if output != sys.stdout:
                output.close()
 
index 6a80642..6510768 100755 (executable)
@@ -3,7 +3,7 @@ import sys
 import re
 from jinja2 import Environment, Template
 from jinja2.filters import do_dictsort
-from spec_util import is_dynamic_pinned, verify_node, isAbstract, setdefault
+from spec_util import is_dynamic_pinned, verify_node, isAbstract, setdefault, trim_docstring
 from ir_spec import nodes
 
 def format_parameterlist(parameterlist):
@@ -217,6 +217,7 @@ def prepare_attr(attr):
 
 def preprocess_node(node):
        verify_node(node)
+       node.doc = trim_docstring(node.__doc__)
 
        setdefault(node, "attrs_name", node.name.lower())
        setdefault(node, "block", "block")
@@ -516,6 +517,13 @@ nodeops_h_template = env.from_string(
  */
 
 {% for node in nodes -%}
+
+/**
+ * @defgroup {{node.name}} {{node.name}} node
+ *
+ * {{node.doc}}
+ * @{
+ */
 {% if node.ins %}
 /**
  * Input numbers for {{node.name}} node
@@ -539,9 +547,6 @@ typedef enum {
        pn_{{node.name}}_max = pn_{{node.name}}_{{node.outs[-1][0]}}
 } pn_{{node.name}};
 {% endif %}
-{%- endfor %}
-
-{% for node in nodes %}
 {%- if not node.noconstructor %}
 /**
  * Construct {{node.name|a_an}} node.
@@ -591,14 +596,9 @@ FIRM_API ir_node *new_{{node.name}}(
                {{node|nodeparameters}}
        {% endfilter %});
 {%- endif %}
-{% endfor %}
-
-{% for node in nodes %}
 /** Return true if the node is a {{node.name}} node. */
 FIRM_API int is_{{node.name}}(const ir_node *node);
-{%- endfor %}
 
-{% for node in nodes %}
 {% for input in node.ins -%}
 FIRM_API ir_node *get_{{node.name}}_{{input[0]}}(const ir_node *node);
 FIRM_API void set_{{node.name}}_{{input[0]}}(ir_node *node, ir_node *{{input[0]|escape_keywords}});
@@ -607,6 +607,8 @@ FIRM_API void set_{{node.name}}_{{input[0]}}(ir_node *node, ir_node *{{input[0]|
 FIRM_API {{attr.type}} get_{{node.name}}_{{attr.name}}(const ir_node *node);
 FIRM_API void set_{{node.name}}_{{attr.name}}(ir_node *node, {{attr.type}} {{attr.name}});
 {% endfor -%}
+/** @} */
+
 {% endfor -%}
 
 /** @} */
@@ -622,7 +624,9 @@ opcodes_h_template = env.from_string(
 #ifndef FIRM_IR_OPCODES_H
 #define FIRM_IR_OPCODES_H
 
-/** The opcodes of the libFirm predefined operations. */
+/** The opcodes of the libFirm predefined operations.
+ * @ingroup ir_op
+ */
 typedef enum ir_opcode {
 {%- for node in nodes %}
        iro_{{node.name}},
@@ -652,10 +656,12 @@ typedef enum ir_opcode {
 } ir_opcode;
 
 {% for node in nodes %}
+/** @ingroup {{node.name}} */
 FIRM_API ir_op *op_{{node.name}};
 {%- endfor %}
 
 {% for node in nodes %}
+/** @ingroup {{node.name}} */
 FIRM_API ir_op *get_op_{{node.name}}(void);
 {%- endfor %}
 
index 2c71bcd..9706385 100644 (file)
@@ -1,3 +1,5 @@
+import sys
+
 abstracts = set()
 def abstract(cls):
        abstracts.add(cls)
@@ -68,3 +70,28 @@ def setnodedefaults(node):
        setdefault(node, "customSerializer", False)
        if hasattr(node, "outs"):
                node.mode = "mode_T"
+
+def trim_docstring(docstring):
+    if not docstring:
+        return ''
+    # Convert tabs to spaces (following the normal Python rules)
+    # and split into a list of lines:
+    lines = docstring.expandtabs().splitlines()
+    # Determine minimum indentation (first line doesn't count):
+    indent = sys.maxint
+    for line in lines[1:]:
+        stripped = line.lstrip()
+        if stripped:
+            indent = min(indent, len(line) - len(stripped))
+    # Remove indentation (first line is special):
+    trimmed = [lines[0].strip()]
+    if indent < sys.maxint:
+        for line in lines[1:]:
+            trimmed.append(line[indent:].rstrip())
+    # Strip off trailing and leading blank lines:
+    while trimmed and not trimmed[-1]:
+        trimmed.pop()
+    while trimmed and not trimmed[0]:
+        trimmed.pop(0)
+    # Return a single string:
+    return '\n'.join(trimmed)