X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firloop_t.h;h=594308a746961c19006e70986be1fc0095db1ddc;hb=49a8d9599795158966f9b2bd57e86283c6c4f962;hp=36132164dd6c804a6da121edc9c8dd38efc97fe2;hpb=b1800d6a3a46d3cde851461f4d32397f66948aff;p=libfirm diff --git a/ir/ana/irloop_t.h b/ir/ana/irloop_t.h index 36132164d..594308a74 100644 --- a/ir/ana/irloop_t.h +++ b/ir/ana/irloop_t.h @@ -1,29 +1,37 @@ /* - * Project: libFIRM - * File name: ir/ana/irloop_t.h - * Purpose: Loop datastructure and access functions -- private stuff. - * Author: Goetz Lindenmaier - * Modified by: - * Created: 7.2002 - * CVS-ID: $Id$ - * Copyright: (c) 2002-2003 Universität Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. */ /** - * @file irloop_t.h - * Loop datastructure and access functions -- private stuff. - * - * @author Goetz Lindenmaier + * @file + * @brief Loop datastructure and access functions -- private stuff. + * @author Goetz Lindenmaier + * @date 7.2002 + * @version $Id$ */ +#ifndef FIRM_ANA_IRLOOP_T_H +#define FIRM_ANA_IRLOOP_T_H #include "firm_common.h" #include "irgraph_t.h" +#include "irnode_t.h" #include "irloop.h" -#ifndef _IRLOOP_T_H_ -#define _IRLOOP_T_H_ - /** * Possible loop flags, can be or'ed. */ @@ -38,7 +46,22 @@ typedef enum loop_flags { once = 0x00000080, /**< this is a do loop, with a false condition.It itarate once */ } loop_flags_t; -/** The loops datastructure. */ +/** + * The loops data structure. + * + * The loops data structure represents circles in the intermediate + * representation. It does not represent loops in the terms of a + * source program. + * Each ir_graph can contain one outermost loop data structure. + * loop is the entry point to the nested loops. + * The loop data structure contains a field indicating the depth of + * the loop within the nesting. Further it contains a list of the + * loops with nesting depth -1. Finally it contains a list of all + * nodes in the loop. + * + * @todo We could add a field pointing from a node to the containing loop, + * this would cost a lot of memory, though. + */ struct ir_loop { firm_kind kind; /**< A type tag, set to k_ir_loop. */ @@ -96,8 +119,36 @@ _get_irg_loop(ir_graph *irg) { return irg->loop; } +static INLINE ir_loop * +_get_loop_outer_loop(const ir_loop *loop) { + assert(_is_ir_loop(loop)); + return loop->outer_loop; +} + +static INLINE int +_get_loop_depth(const ir_loop *loop) { + assert(_is_ir_loop(loop)); + return loop->depth; +} + +static INLINE int +_get_loop_n_sons(const ir_loop *loop) { + assert(_is_ir_loop(loop)); + return loop->n_sons; +} + +/* Uses temporary information to get the loop */ +static INLINE ir_loop * +_get_irn_loop(const ir_node *n) { + return n->loop; +} + #define is_ir_loop(thing) _is_ir_loop(thing) #define set_irg_loop(irg, loop) _set_irg_loop(irg, loop) #define get_irg_loop(irg) _get_irg_loop(irg) +#define get_loop_outer_loop(loop) _get_loop_outer_loop(loop) +#define get_loop_depth(loop) _get_loop_depth(loop) +#define get_loop_n_sons(loop) _get_loop_n_sons(loop) +#define get_irn_loop(n) _get_irn_loop(n) -#endif /* _IRLOOP_T_H_ */ +#endif