move all inline #defines to the begin of their headers
[libfirm] / ir / tr / tpop_t.h
1 /*
2  * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
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.
10  *
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.
14  *
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
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   Opcode of types -- private header.
23  * @author  Goetz Lindenmaier, Michael Beck
24  */
25 #ifndef FIRM_TR_TPOP_T_H
26 #define FIRM_TR_TPOP_T_H
27
28 #include <stdlib.h>
29
30 #include "firm_types.h"
31 #include "typerep.h"
32 #include "irmode.h"
33
34 #define get_tpop_code(op)      _get_tpop_code(op)
35 #define get_tpop_ident(op)     _get_tpop_ident(op)
36
37 /** A function called to free attributes of a type. */
38 typedef void (*free_attrs_func)(ir_type *tp);
39
40 /** A function called to free owned entities of a type. */
41 typedef void (*free_entities_func)(ir_type *tp);
42
43 /** A function called to free all automatic allocated entities of a type. */
44 typedef void (*free_auto_entities_func)(ir_type *tp);
45
46 /** A function called to set the mode of a type. */
47 typedef void (*set_type_mode_func)(ir_type *tp, ir_mode *m);
48
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);
51
52 /** A function called to get the number of compound members */
53 typedef size_t (*get_n_members_func)(const ir_type *tp);
54
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);
57
58 typedef size_t (*get_member_index_func)(const ir_type *tp, ir_entity *member);
59
60 /** A function called to insert an entity into the type */
61 typedef void (*insert_entity_func)(ir_type *tp, ir_entity *member);
62
63 /**
64  * tp_op operations.
65  */
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. */
75 } tp_op_ops;
76
77 /** possible flags for a type opcode */
78 enum tp_op_flags_t {
79         TP_OP_FLAG_COMPOUND = 1   /**< is a compound type */
80 };
81
82 /** The type opcode. */
83 struct tp_op {
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. */
89 };
90
91 /**
92  * Returns a new type opcode.
93  *
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.
97  *
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
102  *                    this opcode
103  * @param ops         the tp_op operations for this type
104  * @return A new type opcode.
105  */
106 const tp_op *new_tpop (tp_opcode code, ident *name, unsigned flags, size_t attr_size, const tp_op_ops *ops);
107
108 /**
109  * Free a tpop data structure.
110  */
111 void free_tpop(const tp_op *tpop);
112
113 /**
114  * Initialize the tpop module.
115  *
116  * Must be called during the initialization of the library. Allocates
117  * opcodes and sets the globals that are external visible as specified
118  * in tpop.h.
119  * Allocates opcodes for classes, struct, method, union, array,
120  * enumeration, pointer and primitive and sets the according values.
121  */
122 void init_tpop(void);
123
124 /**
125  * Finalize the tpop module.
126  *
127  * Frees all type opcodes.
128  */
129 void finish_tpop(void);
130
131 /**
132  * Returns the size of the attribute to this kind
133  * of type.
134  *
135  * Internal feature.
136  *
137  * @param op  The type opcode to get the size for.
138  * @return The size of the attribute of types with this opcode.
139  */
140 static inline size_t get_tpop_attr_size(const tp_op *op)
141 {
142         return op->attr_size;
143 }
144
145 /* ---------------- *
146  * inline functions *
147  * -----------------*/
148
149 static inline tp_opcode _get_tpop_code(const tp_op *op)
150 {
151         return op->code;
152 }
153
154 static inline ident *_get_tpop_ident(const tp_op *op)
155 {
156         return op->name;
157 }
158
159 #endif /* FIRM_TR_TPOP_T_H */