X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgraph.h;h=4282b3bfe7311bd7636afe841c2ffd1c7175320e;hb=19975388facbb3943fbc2aa2f5f9422350bb5cb3;hp=e3162489c864ae0a01bca349e9a13892965e55b4;hpb=677f67f9b487e35b983148f48b933d54ee383db6;p=libfirm diff --git a/ir/ir/irgraph.h b/ir/ir/irgraph.h index e3162489c..4282b3bfe 100644 --- a/ir/ir/irgraph.h +++ b/ir/ir/irgraph.h @@ -1,12 +1,23 @@ -/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe -** All rights reserved. -** -** Authors: Martin Trapp, Christian Schaefer -** -** irgraph.h: ir graph construction -*/ +/* + * Project: libFIRM + * File name: ir/ir/irgraph.c + * Purpose: Entry point to the representation of procedure code. + * Author: Martin Trapp, Christian Schaefer + * Modified by: Goetz Lindenmaier + * Created: + * CVS-ID: $Id$ + * Copyright: (c) 1998-2003 Universität Karlsruhe + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ + +/** + * @file irgraph.h + * + * ir graph construction. + * + * @author Martin Trapp, Christian Schaefer + */ -/* $Id$ */ #include "irop.h" @@ -26,12 +37,11 @@ typedef struct ir_node ir_node; typedef struct ir_graph ir_graph; #endif -/***** irgraph/irgraph +/** * * NAME Datastructure that holds central information about a procedure * - * NOTE - ** ir_graph *new_ir_graph (entity *ent, int params); + * ir_graph *new_ir_graph (entity *ent, int params); * ------------------------------------------------- * * This constructor generates the basic infrastructure needed to @@ -60,36 +70,36 @@ typedef struct ir_graph ir_graph; * datastructure is used to build the Phi nodes and removed after * completion of the graph. There is no path from end to start in the * graph after calling ir_graph. - * FIELDS * pinned set to "pinned" if no global cse was performed on the graph. * set to "floats" if global cse was performed (and during construction: * did actually change something). Code placement is necessary. - * SOURCE */ /* Global variable holding the current_ir_graph. This global variable is used by the ir construction interface in ircons and by the optimizations. */ extern ir_graph *current_ir_graph; -ir_graph *get_current_ir_graph(); +ir_graph *get_current_ir_graph(void); void set_current_ir_graph(ir_graph *graph); -/* This flag indicate the current view. The behaviour of some methods +/** This flag indicate the current view. The behaviour of some methods * (get_irn_*, set_irn_*) is influenced by this flag. */ extern bool interprocedural_view; -bool get_interprocedural_view(); +bool get_interprocedural_view(void); void set_interprocedural_view(bool state); -/* Create a new ir graph to built ir for a procedure. - ent is the entity representing this procedure, i.e., the type of the - entity must be of a method type. The constructor automatically sets the - field irg of the entity as well as current_ir_graph to the new ir graph. - n_loc is the number of local variables in this procedure including - the procedure parameters. - The state of the ir graph is: phase_building, pinned, no_outs. */ +/** Create a new ir graph to built ir for a procedure. + * + * ent is the entity representing this procedure, i.e., the type of the + * entity must be of a method type. The constructor automatically sets the + * field irg of the entity as well as current_ir_graph to the new ir graph. + * n_loc is the number of local variables in this procedure including + * the procedure parameters. + * The constructor adds the new irgraph to the list in ir_prog. + * The state of the ir graph is: phase_building, pinned, no_outs. */ ir_graph *new_ir_graph (entity *ent, int n_loc); -/* Frees the passed irgraph. +/** Frees the passed irgraph. Deallocates all nodes in this graph and the ir_graph structure. Sets the field irgraph in the corresponding entity to NULL. Does not remove the irgraph from the list in irprog (requires @@ -98,14 +108,28 @@ ir_graph *new_ir_graph (entity *ent, int n_loc); graph, nor the entity standing for this graph. */ void free_ir_graph (ir_graph *irg); -/** access routines for all ir_graph attributes **/ +/* --- access routines for all ir_graph attributes --- */ + +/** + * Checks whether a pointer points to a ir graph. + * + * @param thing an arbitrary pointer + * + * @return + * true if the thing is a ir graph, else false + */ +int +is_ir_graph(void *thing); + +#define get_irg_entity get_irg_ent +#define set_irg_entity set_irg_ent entity *get_irg_ent (ir_graph *irg); void set_irg_ent (ir_graph *irg, entity *ent); type *get_irg_frame_type (ir_graph *irg); void set_irg_frame_type (ir_graph *irg, type *ftp); -/* To test for a frame type */ -int is_frame_type(type *ftp); +/* To test for a frame type. O(#irgs) if ftp is class type. */ +int is_frame_type (type *ftp); ir_node *get_irg_start_block (ir_graph *irg); void set_irg_start_block (ir_graph *irg, ir_node *node); @@ -119,14 +143,26 @@ void set_irg_end_block (ir_graph *irg, ir_node *node); ir_node *get_irg_end (ir_graph *irg); void set_irg_end (ir_graph *irg, ir_node *node); +/* The fields end_reg and end_except contain the end nodes of the + interprocedural view. If the view is not constructed they contain + the nomal end node. */ +ir_node *get_irg_end_reg (ir_graph *irg); +void set_irg_end_reg (ir_graph *irg, ir_node *node); + +ir_node *get_irg_end_except (ir_graph *irg); +void set_irg_end_except (ir_graph *irg, ir_node *node); + + /* @@@ oblivious, no more supported. */ ir_node *get_irg_cstore (ir_graph *irg); void set_irg_cstore (ir_graph *irg, ir_node *node); /* end oblivious */ +/* node that represents frame pointer */ ir_node *get_irg_frame (ir_graph *irg); void set_irg_frame (ir_graph *irg, ir_node *node); +/* node that represents global pointer */ ir_node *get_irg_globals (ir_graph *irg); void set_irg_globals (ir_graph *irg, ir_node *node); @@ -141,20 +177,24 @@ ir_node *get_irg_bad (ir_graph *irg); void set_irg_bad (ir_graph *irg, ir_node *node); /* Use new_Unknown() instead!! */ +/* GL removed: we need unknown with mode for analyses. ir_node *get_irg_unknown (ir_graph *irg); void set_irg_unknown (ir_graph *irg, ir_node *node); +*/ int get_irg_n_locs (ir_graph *irg); +long get_irg_graph_nr(ir_graph *irg); + /********************************************************************************/ /* States of an ir_graph. */ /********************************************************************************/ -/** An ir_graph can have different states. These states represent the analysis +/* information associated with the graph. Optimizations invalidate these - states. **/ + states. */ -/* state: phase values: phase_building, phase_high, phase_low. +/** state: phase values: phase_building, phase_high, phase_low. The irg is in phase_building during construction of the irgraph. It is in phase_high after construction. All nodes are allowed. To get the irgraph into phase_low all Sel nodes must be removed and replaced by explicit @@ -179,7 +219,7 @@ void set_irg_phase_low(ir_graph *irg); The enum op_pinned is defined in irop.h. */ op_pinned get_irg_pinned (ir_graph *irg); -/* state: outs_state +/** state: outs_state Outs are the back edges or def-use edges. Values: no_outs, outs_consistent, outs_inconsistent no_outs: outs are not computed, no memory is allocated. @@ -194,7 +234,7 @@ typedef enum { irg_outs_state get_irg_outs_state(ir_graph *irg); void set_irg_outs_inconsistent(ir_graph *irg); -/* state: dom_state +/** state: dom_state Signals the state of the dominator infomation. Values: no_dom, dom_consistent, dom_inconsistent no_dom: doms are not computed, no memory is allocated. The access routines @@ -213,32 +253,63 @@ void set_irg_dom_inconsistent(ir_graph *irg); /* state: loopinfo_state Loop information describes the loops within the control and - data flow of the procedure. -tpedef enum { @@@ make unrecognizable for jni script!!! - no_loopinfo, - loopinfo_consistent, - loopinfo_inconsistent + data flow of the procedure. */ +typedef enum { + loopinfo_none, /**< No loop information is constructed. Default. */ + loopinfo_consistent, /**< IntRAprocedural loop information constructed and valid. */ + loopinfo_inconsistent, /**< IntRAprocedural loop information constructed and invalid. */ + loopinfo_ip_consistent, /**< IntERprocedural loop information constructed and valid. */ + loopinfo_ip_inconsistent, /**< IntERprocedural loop information constructed and invalid. */ + loopinfo_cf_consistent, /**< IntRAprocedural control loop information constructed and valid. */ + loopinfo_cf_inconsistent, /**< IntRAprocedural control loop information constructed and invalid. */ + loopinfo_cf_ip_consistent, /**< IntERprocedural control loop information constructed and valid. */ + loopinfo_cf_ip_inconsistent /**< IntERprocedural control loop information constructed and invalid. */ } irg_loopinfo_state; irg_loopinfo_state get_irg_loopinfo_state(ir_graph *irg); +void set_irg_loopinfo_state(ir_graph *irg, irg_loopinfo_state s); +/* Sets the loopinformation state to the appropriate inconsistent state. + If state is 'none' does not change. */ void set_irg_loopinfo_inconsistent(ir_graph *irg); +/** state: callee_information_state + * Call nodes contain a list of possible callees. This list must be + * computed by an anlyses. */ +typedef enum { + irg_callee_info_none, + irg_callee_info_consistent, + irg_callee_info_inconsistent +} irg_callee_info_state; +irg_callee_info_state get_irg_callee_info_state(ir_graph *irg); +void set_irg_callee_info_state(ir_graph *irg, irg_callee_info_state s); + +/** property: + * Tells how to handle an ir graph in inlineing. + */ +typedef enum { + irg_inline_any, /**< No restriction on inlineing. Default. */ + irg_inline_forbidden, /**< The graph may not be inlined. */ + irg_inline_recomended, /**< The graph should be inlined. */ + irg_inline_forced /**< The graph must be inlined. */ +} irg_inline_property; +irg_inline_property get_irg_inline_property(ir_graph *irg); +void set_irg_inline_property(ir_graph *irg, irg_inline_property s); + /* A void * field to link arbritary information to the node. */ -void set_irg_link (ir_graph *irg, void *thing); +void set_irg_link (ir_graph *irg, void *thing); void *get_irg_link (ir_graph *irg); /* increments visited by one */ -void inc_irg_visited(ir_graph *irg); +void inc_irg_visited (ir_graph *irg); unsigned long get_irg_visited (ir_graph *irg); -void set_irg_visited(ir_graph *irg, unsigned long i); -unsigned long get_max_irg_visited(void); -void set_max_irg_visited(int val); -unsigned long inc_max_irg_visited(void); +void set_irg_visited (ir_graph *irg, unsigned long i); +unsigned long get_max_irg_visited (void); +void set_max_irg_visited (int val); +unsigned long inc_max_irg_visited (void); /* increments block_visited by one */ -void inc_irg_block_visited(ir_graph *irg); +void inc_irg_block_visited (ir_graph *irg); unsigned long get_irg_block_visited (ir_graph *irg); -void set_irg_block_visited(ir_graph *irg, unsigned long i); -/*****/ +void set_irg_block_visited (ir_graph *irg, unsigned long i); # endif /* _IRGRAPH_H_ */