2 * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Opcode of types -- private header.
23 * @author Goetz Lindenmaier, Michael Beck
25 #ifndef FIRM_TR_TPOP_T_H
26 #define FIRM_TR_TPOP_T_H
30 #include "firm_types.h"
34 #define get_tpop_code(op) _get_tpop_code(op)
35 #define get_tpop_ident(op) _get_tpop_ident(op)
37 /** A function called to free attributes of a type. */
38 typedef void (*free_attrs_func)(ir_type *tp);
40 /** A function called to free owned entities of a type. */
41 typedef void (*free_entities_func)(ir_type *tp);
43 /** A function called to free all automatic allocated entities of a type. */
44 typedef void (*free_auto_entities_func)(ir_type *tp);
46 /** A function called to set the mode of a type. */
47 typedef void (*set_type_mode_func)(ir_type *tp, ir_mode *m);
49 /** A function called to set the size of a type in bytes. */
50 typedef void (*set_type_size_func)(ir_type *tp, unsigned size);
52 /** A function called to get the number of compound members */
53 typedef size_t (*get_n_members_func)(const ir_type *tp);
55 /** A function called to get the pos'th compound member */
56 typedef ir_entity *(*get_member_func)(const ir_type *tp, size_t pos);
58 typedef size_t (*get_member_index_func)(const ir_type *tp, ir_entity *member);
60 /** A function called to insert an entity into the type */
61 typedef void (*insert_entity_func)(ir_type *tp, ir_entity *member);
66 typedef struct tp_op_ops {
67 free_attrs_func free_attrs; /**< Called to free the attributes of a type. */
68 free_entities_func free_entities; /**< Called to free the owned entities of a type. */
69 free_auto_entities_func free_auto_entities; /**< Called to free the automatic allocated entities of a type. */
70 set_type_mode_func set_type_mode; /**< Called to set a ir_mode of a type. */
71 set_type_size_func set_type_size; /**< Called to set the byte size of a type. */
72 get_n_members_func get_n_members; /**< Called to return the number of compound members. */
73 get_member_func get_member; /**< Called to get the pos'th compound member. */
74 get_member_index_func get_member_index; /**< Called to get the index of a compound member. */
77 /** possible flags for a type opcode */
79 TP_OP_FLAG_COMPOUND = 1 /**< is a compound type */
82 /** The type opcode. */
84 tp_opcode code; /**< The tpop code. */
85 ident *name; /**< The name of the type opcode. */
86 size_t attr_size; /**< The attribute size for a type of this opcode. */
87 unsigned flags; /**< Flags for this opcode. */
88 tp_op_ops ops; /**< tp_op operations. */
92 * Returns a new type opcode.
94 * Allocates a new tp_op struct and initializes its fields with
95 * the passed values. This function is only to be used during
96 * initialization of the library.
98 * @param code the enum for this type opcode.
99 * @param name an ident for the name of the type opcode.
100 * @param flags additional flags
101 * @param attr_size the size of the attributes necessary for a type with
103 * @param ops the tp_op operations for this type
104 * @return A new type opcode.
106 const tp_op *new_tpop (tp_opcode code, ident *name, unsigned flags, size_t attr_size, const tp_op_ops *ops);
109 * Free a tpop data structure.
111 void free_tpop(const tp_op *tpop);
114 * Initialize the tpop module.
116 * Must be called during the initialization of the library. Allocates
117 * opcodes and sets the globals that are external visible as specified
119 * Allocates opcodes for classes, struct, method, union, array,
120 * enumeration, pointer and primitive and sets the according values.
122 void init_tpop(void);
125 * Finalize the tpop module.
127 * Frees all type opcodes.
129 void finish_tpop(void);
132 * Returns the size of the attribute to this kind
137 * @param op The type opcode to get the size for.
138 * @return The size of the attribute of types with this opcode.
140 static inline size_t get_tpop_attr_size(const tp_op *op)
142 return op->attr_size;
145 /* ---------------- *
147 * -----------------*/
149 static inline tp_opcode _get_tpop_code(const tp_op *op)
154 static inline ident *_get_tpop_ident(const tp_op *op)
159 #endif /* FIRM_TR_TPOP_T_H */