X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeutil.h;h=72a81fa054fb06bf4ad9037c85594d0a5498d52d;hb=29189ce06a4930207bac3adda67d7d663dbb77f7;hp=3d37044451493e0e58d066bcc879b1cfa003a95f;hpb=d26125ca5720072a4975d37c0a17f7ad6c18de2d;p=libfirm diff --git a/ir/be/beutil.h b/ir/be/beutil.h index 3d3704445..72a81fa05 100644 --- a/ir/be/beutil.h +++ b/ir/be/beutil.h @@ -1,14 +1,79 @@ +/* + * Copyright (C) 1995-2008 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. + */ -#ifndef _BEUTIL_H -#define _BEUTIL_H +/** + * @file + * @brief Contains some useful function for the backend. + * @author Sebastian Hack + * @version $Id$ + */ +#ifndef FIRM_BE_BEUTIL_H +#define FIRM_BE_BEUTIL_H #include -#include "irnode.h" -#include "config.h" +#include "firm_types.h" +#include "pset.h" + +#include "bearch.h" + +#ifdef _MSC_VER +typedef __int64 long64; +typedef unsigned __int64 ulong64; + +#define LL_FMT "i64" +#define ULL_FMT "ui64" -/** Undefine this to disable debugging mode. */ -#define BE_DEBUG 1 +#else +typedef long long long64; +typedef unsigned long long ulong64; + +#define LL_FMT "ll" +#define ULL_FMT "llu" + +#endif /* _MSC_VER */ + +/* iterate over a list of ir_nodes linked by link field */ +#define foreach_linked_irns(head, iter) for ((iter) = (head); (iter); (iter) = get_irn_link((iter))) + +/** + * Get an empty set. + * This function always returns the same set. + */ +pset *be_empty_set(void); + +/** + * Convenient block getter. + * Works also, if the given node is a block. + * @param irn The node. + * @return The block of the node, or the node itself, if the node is a + * block. + */ +static inline ir_node *get_block(ir_node *irn) +{ + return is_Block(irn) ? irn : get_nodes_block(irn); +} + +static inline const ir_node *get_block_const(const ir_node *irn) +{ + return is_Block(irn) ? irn : get_nodes_block(irn); +} /** * Check, if a node produces or consumes a data value. @@ -18,18 +83,18 @@ * @param irn The node to check for. * @return 1, if the node is a data node, 0 if not. */ -static INLINE int is_data_node(const ir_node *irn) +static inline int is_data_node(const ir_node *irn) { int i, n; /* If the node produces a data value, return immediately. */ - if(mode_is_datab(get_irn_mode(irn))) + if (mode_is_data(get_irn_mode(irn))) return 1; /* else check, if it takes a data value, if that is so, return */ for(i = 0, n = get_irn_arity(irn); i < n; ++i) { ir_node *op = get_irn_n(irn, i); - if(mode_is_datab(get_irn_mode(op))) + if (mode_is_data(get_irn_mode(op))) return 1; } @@ -37,6 +102,56 @@ static INLINE int is_data_node(const ir_node *irn) return 0; } +/** + * Clears the link fields of all nodes of the given graph. + * @param irg The graph. + */ +void be_clear_links(ir_graph *irg); + +/** + * Dump a graph with schedule edges. + * @param irg The graph. + * @param suffix A suffix to its file name. + */ +void dump_ir_block_graph_sched(ir_graph *irg, const char *suffix); +/** + * Dump a extended block graph with schedule edges. + * @param irg The graph. + * @param suffix A suffix to its file name. + */ +void dump_ir_extblock_graph_sched(ir_graph *irg, const char *suffix); + +/** + * Dumps a graph and numbers all dumps. + * @param irg The graph + * @param suffix A suffix to its file name. + * @param dumper The dump function + */ +void be_dump(ir_graph *irg, const char *suffix, void (*dumper)(ir_graph *, const char *)); + +/** + * Returns the number of reachable nodes in an irg. + * @param irg The irg. + * @return The number of reachable nodes. + */ +unsigned get_num_reachable_nodes(ir_graph *irg); + +/** + * Gets the Proj with number pn from irn. + */ +ir_node *be_get_Proj_for_pn(const ir_node *irn, long pn); + +/** + * Returns an array (an ARR_F) of the programs blocks in reverse postorder + * (note: caller has to free the memory with DEL_ARR_F after use; + * of course you can use ARR_LEN on the array too.) + */ +ir_node **be_get_cfgpostorder(ir_graph *irg); + +/** + * Opens a file named base.ext with the mode mode. + */ +FILE *be_ffopen(const char *base, const char *ext, const char *mode); -#endif +#endif /* FIRM_BE_BEUTIL_H */