X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firop_t.h;h=1ac54f360d1eb390f8e45147ec1a81e536d7a384;hb=f9d25133f86594ca2b1f33fb0b41a591ecc9b914;hp=5cc368631d0918da9de9dc17e58f874438043a97;hpb=516169c8a246f3e7e65a595b691877f8d7e90650;p=libfirm diff --git a/ir/ir/irop_t.h b/ir/ir/irop_t.h index 5cc368631..1ac54f360 100644 --- a/ir/ir/irop_t.h +++ b/ir/ir/irop_t.h @@ -9,42 +9,13 @@ * Copyright: (c) 1998-2003 Universität Karlsruhe * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. */ +#ifndef _IROP_T_H_ +#define _IROP_T_H_ - -# ifndef _IROP_T_H_ -# define _IROP_T_H_ - -# include "irop.h" -# include "tv.h" -# include "irnode.h" - -/** The allowed parities */ -typedef enum { - oparity_invalid = 0, - oparity_unary, /**< an unary operator -- considering 'numeric' arguments. */ - oparity_binary, /**< an binary operator -- considering 'numeric' arguments.*/ - oparity_trinary, /**< an trinary operator -- considering 'numeric' arguments.*/ - oparity_zero, /**< no operators, as e.g. Const. */ - oparity_variable, /**< arity not fixed by opcode, but statically - known. E.g., number of arguments to call. */ - oparity_dynamic, /**< arity depends on state of firm representation. - Can change by optimizations... - We must allocate a dynamic in array for the node! */ - oparity_any, /**< other arity */ -} op_arity; - - -/** The irop flags */ -typedef enum { - irop_flag_none = 0x00000000, /**< nothing */ - irop_flag_labeled = 0x00000001, /**< if set, Output edge labels on in-edges in vcg graph */ - irop_flag_commutative = 0x00000002, /**< operation is commutative */ - irop_flag_cfopcode = 0x00000004, /**< is a control flow operation */ - irop_flag_ip_cfopcode = 0x00000008, /**< operation manipulates interprocedural control flow */ - irop_flag_fragile = 0x00000010, /**< set if the operation can change the control flow because - of an exception */ - irop_flag_forking = 0x00000020, /**< the operation is a forking control flow */ -} irop_flags; +#include "firm_config.h" +#include "irop.h" +#include "tv.h" +#include "irnode.h" /** @@ -102,6 +73,24 @@ typedef void (*copy_attr_func)(const ir_node *old_node, ir_node *new_node); */ typedef type *(*get_type_func)(ir_node *self); +/** + * The verify_node operation. + * Return non-zero if the node verification is ok, else 0. + * Depending on the node verification settings, may even assert. + * + * @see do_node_verification() + */ +typedef int (*verify_node_func)(ir_node *self, ir_graph *irg); + +/** + * The verify_node operation for Proj(X). + * Return non-zero if the node verification is ok, else 0. + * Depending on the node verification settings, may even assert. + * + * @see do_node_verification() + */ +typedef int (*verify_proj_node_func)(ir_node *self, ir_node *proj); + /** The type of an ir_op. */ struct ir_op { opcode code; /**< the unique opcode of the op */ @@ -120,25 +109,11 @@ struct ir_op { reassociate_func reassociate; /**< reassociate a tree */ copy_attr_func copy_attr; /**< copy node attributes */ get_type_func get_type; /**< return the type of a node */ + verify_node_func verify_node; /**< verify the node */ + verify_proj_node_func verify_proj_node; /**< verify the Proj node */ + op_func generic; /**< a generic function */ }; -/** - * Creates a new ir operation. - * - * @param code the opcode, one of type \c opcode - * @param name the printable name of this opcode - * @param p wheater operations of this opcode are op_pin_state_pinned or floating - * @param flags a bitmask of irop_flags describing the behavior of the ir operation - * @param opar the parity of this ir operation - * @param op_index if the parity is oparity_unary, oparity_binary or oparity_trinary the index - * of the left operand - * @param attr_size attribute size for this ir operation - * - * @return The genenerated ir operation. - */ -ir_op * new_ir_op(opcode code, const char *name, op_pin_state p, - unsigned flags, op_arity opar, int op_index, size_t attr_size); - /** * Frees a newly created ir operation. */ @@ -188,22 +163,39 @@ static INLINE int is_op_forking(const ir_op *op) { return op->flags & irop_flag_forking; } -static INLINE opcode __get_op_code(const ir_op *op) { +/* Returns non-zero if operation is a high-level op */ +static INLINE int is_op_highlevel(const ir_op *op) { + return op->flags & irop_flag_highlevel; +} + +/* Returns non-zero if operation is a const-like op */ +static INLINE int is_op_constlike(const ir_op *op) { + return op->flags & irop_flag_constlike; +} + +static INLINE opcode _get_op_code(const ir_op *op) { return op->code; } -static INLINE ident *__get_op_ident(const ir_op *op){ +static INLINE ident *_get_op_ident(const ir_op *op){ return op->name; } -static INLINE op_pin_state __get_op_pinned(const ir_op *op) { +static INLINE op_pin_state _get_op_pinned(const ir_op *op) { return op->op_pin_state_pinned; } +static INLINE void _set_generic_function_ptr(ir_op *op, op_func func) { + op->generic = func; +} + +static INLINE op_func _get_generic_function_ptr(const ir_op *op) { + return op->generic; +} -#define get_op_code(op) __get_op_code(op) -#define get_op_ident(op) __get_op_ident(op) -#define get_op_pinned(op) __get_op_pinned(op) +#define get_op_code(op) _get_op_code(op) +#define get_op_ident(op) _get_op_ident(op) +#define get_op_pinned(op) _get_op_pinned(op) #endif /* _IROP_T_H_ */