benode_t.h 15.4 KB
Newer Older
Sebastian Hack's avatar
Sebastian Hack committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * @file   benode_t.h
 * @date   17.05.2005
 * @author Sebastian Hack
 *
 * Backend node support.
 *
 * Copyright (C) 2005 Universitaet Karlsruhe
 * Released under the GPL
 */

#ifndef _BENODE_T_H
#define _BENODE_T_H

Sebastian Hack's avatar
Sebastian Hack committed
15
#include "firm_config.h"
16

17
18
#include <limits.h>

Sebastian Hack's avatar
Sebastian Hack committed
19
20
#include "irmode.h"
#include "irnode.h"
21
#include "entity_t.h"
Sebastian Hack's avatar
Sebastian Hack committed
22

23
#include "be_t.h"
24
#include "bearch_t.h"
Sebastian Hack's avatar
Sebastian Hack committed
25

26
27
#define BE_OUT_POS(p) (-((p) + 1))

28
29
30
31
32
33
/**
 * The benode op's.  Must be available to register emitter function.
 */
extern ir_op *op_be_Spill;
extern ir_op *op_be_Reload;
extern ir_op *op_be_Perm;
Matthias Braun's avatar
Matthias Braun committed
34
extern ir_op *op_be_MemPerm;
35
36
extern ir_op *op_be_Copy;
extern ir_op *op_be_Keep;
Michael Beck's avatar
Michael Beck committed
37
extern ir_op *op_be_CopyKeep;
38
39
40
extern ir_op *op_be_Call;
extern ir_op *op_be_Return;
extern ir_op *op_be_IncSP;
Sebastian Hack's avatar
Sebastian Hack committed
41
extern ir_op *op_be_AddSP;
Michael Beck's avatar
Michael Beck committed
42
extern ir_op *op_be_SubSP;
43
44
45
46
47
48
extern ir_op *op_be_SetSP;
extern ir_op *op_be_RegParams;
extern ir_op *op_be_StackParam;
extern ir_op *op_be_FrameAddr;
extern ir_op *op_be_FrameLoad;
extern ir_op *op_be_FrameStore;
49
extern ir_op *op_be_Barrier;
50

Sebastian Hack's avatar
Sebastian Hack committed
51
52
53
54
55
typedef enum {
	beo_NoBeOp = 0,
	beo_Spill,
	beo_Reload,
	beo_Perm,
Matthias Braun's avatar
Matthias Braun committed
56
	beo_MemPerm,
Sebastian Hack's avatar
Sebastian Hack committed
57
58
	beo_Copy,
	beo_Keep,
Sebastian Hack's avatar
Sebastian Hack committed
59
	beo_CopyKeep,
Sebastian Hack's avatar
Sebastian Hack committed
60
	beo_Call,
Sebastian Hack's avatar
Sebastian Hack committed
61
	beo_Return,
Sebastian Hack's avatar
Sebastian Hack committed
62
	beo_AddSP,
Michael Beck's avatar
Michael Beck committed
63
	beo_SubSP,
Sebastian Hack's avatar
Sebastian Hack committed
64
	beo_IncSP,
Sebastian Hack's avatar
Sebastian Hack committed
65
	beo_SetSP,
Sebastian Hack's avatar
Sebastian Hack committed
66
	beo_RegParams,
Sebastian Hack's avatar
Sebastian Hack committed
67
	beo_StackParam,
68
69
70
	beo_FrameLoad,
	beo_FrameStore,
	beo_FrameAddr,
71
	beo_Barrier,
Sebastian Hack's avatar
Sebastian Hack committed
72
73
	beo_Last
} be_opcode_t;
74

Sebastian Hack's avatar
Sebastian Hack committed
75
/** Not used yet. */
76
77
78
79
80
81
typedef enum {
	be_frame_flag_spill = 1,
	be_frame_flag_local = 2,
	be_frame_flag_arg   = 4
} be_frame_flag_t;

Sebastian Hack's avatar
Sebastian Hack committed
82
83
84
85
/**
 * A "symbolic constant" for the size of the stack frame to use with IncSP nodes.
 * It gets back-patched to the real size as soon it is known.
 */
86
87
#define BE_STACK_FRAME_SIZE_EXPAND INT_MAX
#define BE_STACK_FRAME_SIZE_SHRINK INT_MIN
Sebastian Hack's avatar
Sebastian Hack committed
88

89
90
91
92
93
/**
 * Determines if irn is a be_node.
 */
int is_be_node(const ir_node *irn);

94
95
96
/**
 * Create all BE specific opcodes.
 */
Sebastian Hack's avatar
Sebastian Hack committed
97
void be_node_init(void);
98

99
100
101
/**
 * Position numbers for the be_Spill inputs.
 */
102
enum {
103
104
	be_pos_Spill_frame = 0,
	be_pos_Spill_val   = 1
105
};
106
107
108
109

/**
 * Make a new Spill node.
 */
110
111
ir_node *be_new_Spill(const arch_register_class_t *cls, const arch_register_class_t *cls_frame,
	ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *to_spill);
112

113
114
115
/**
 * Position numbers for the be_Reload inputs.
 */
116
enum {
117
118
	be_pos_Reload_frame = 0,
	be_pos_Reload_mem   = 1
119
};
120
121
122
123

/**
 * Make a new Reload node.
 */
124
125
ir_node *be_new_Reload(const arch_register_class_t *cls, const arch_register_class_t *cls_frame,
	ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *mem, ir_mode *mode);
126

127
128
129
/**
 * Position numbers for the be_Copy inputs.
 */
130
enum {
131
	be_pos_Copy_op = 0
132
};
133
134
135
136

/**
 * Make a new Copy node.
 */
Sebastian Hack's avatar
Sebastian Hack committed
137
ir_node *be_new_Copy(const arch_register_class_t *cls, ir_graph *irg, ir_node *block, ir_node *in);
138
/** Returns the Copy Argument. */
139
ir_node *be_get_Copy_op(const ir_node *cpy);
140
141
/** Sets the Copy Argument. */
void be_set_Copy_op(ir_node *cpy, ir_node *op);
142

143
144
145
/**
 * Make a new Perm node.
 */
Sebastian Hack's avatar
Sebastian Hack committed
146
ir_node *be_new_Perm(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int arity, ir_node *in[]);
147
148
149
/**
 * Create a new MemPerm node.
 */
Matthias Braun's avatar
Matthias Braun committed
150
ir_node *be_new_MemPerm(const arch_env_t *arch_env, ir_graph *irg, ir_node *bl, int n, ir_node *in[]);
Sebastian Hack's avatar
Sebastian Hack committed
151
ir_node *be_new_Keep(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int arity, ir_node *in[]);
Sebastian Hack's avatar
Sebastian Hack committed
152

153
154
void be_Keep_add_node(ir_node *keep, const arch_register_class_t *cls, ir_node *node);

155
ir_node *be_new_FrameLoad(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data,
156
						  ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_entity *ent);
157
ir_node *be_new_FrameStore(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data,
158
159
						   ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_node *data, ir_entity *ent);
ir_node *be_new_FrameAddr(const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, ir_entity *ent);
160

161
162
163
/**
 * Position numbers for the be_AddSP inputs
 */
Sebastian Hack's avatar
Sebastian Hack committed
164
165
166
167
168
169
enum {
	be_pos_AddSP_old_sp = 0,
	be_pos_AddSP_size   = 1,
	be_pos_AddSP_last   = 2
};

Sebastian Hack's avatar
Sebastian Hack committed
170
171
172
173
174
175
enum {
	pn_be_AddSP_res  = 0,
	pn_be_AddSP_M    = 1,
	pn_be_AddSP_last = 2
};

Sebastian Hack's avatar
Sebastian Hack committed
176
177
178
179
180
181
182
183
184
185
186
187
188
/**
 * Make a new AddSP node.
 * An AddSP node expresses an increase of the stack pointer in the direction the stack
 * grows. In contrast to IncSP, the amount of bytes the stack pointer is grown, is not
 * given by a constant but an ordinary Firm node.
 * @param sp     The stack pointer register.
 * @param irg    The graph.
 * @param bl     The block.
 * @param old_sp The node representing the old stack pointer value.
 * @param sz     The node expressing the size by which the stack pointer shall be grown.
 * @return       A new AddSP node.
 */
ir_node *be_new_AddSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *sz);
Sebastian Hack's avatar
Sebastian Hack committed
189

Michael Beck's avatar
Michael Beck committed
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/**
 * Position numbers for the be_SubSP inputs
 */
enum {
	be_pos_SubSP_old_sp = 0,
	be_pos_SubSP_size   = 1,
	be_pos_SubSP_last   = 2
};

enum {
	pn_be_SubSP_res  = 0,
	pn_be_SubSP_M    = 1,
	pn_be_SubSP_last = 2
};

/**
 * Make a new SubSP node.
 * A SubSP node expresses a decrease of the stack pointer in the direction the stack
 * grows. In contrast to IncSP, the amount of bytes the stack pointer is grown, is not
 * given by a constant but an ordinary Firm node.
 * @param sp     The stack pointer register.
 * @param irg    The graph.
 * @param bl     The block.
 * @param old_sp The node representing the old stack pointer value.
 * @param sz     The node expressing the size by which the stack pointer shall be grown.
 * @return       A new DecSP node.
 */
ir_node *be_new_SubSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *sz);

Sebastian Hack's avatar
Sebastian Hack committed
219
220
ir_node *be_new_SetSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *operand, ir_node *mem);

Sebastian Hack's avatar
Sebastian Hack committed
221
222
/**
 * Make a stack pointer increase/decrease node.
Sebastian Hack's avatar
Sebastian Hack committed
223
 * @param sp     The stack pointer register.
Sebastian Hack's avatar
Sebastian Hack committed
224
225
226
 * @param irg    The graph to insert the node to.
 * @param bl     The block to insert the node into.
 * @param old_sp The node defining the former stack pointer.
227
 * @param amount The mount of bytes the stack shall be expanded/shrinked (see set_IncSP_offset)
Sebastian Hack's avatar
Sebastian Hack committed
228
229
230
231
232
 * @param dir    The direction in which the stack pointer shall be modified:
 *               Along the stack's growing direction or against.
 * @return       A new stack pointer increment/decrement node.
 * @note         This node sets a register constraint to the @p sp register on its output.
 */
Sebastian Hack's avatar
Sebastian Hack committed
233
ir_node *be_new_IncSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, int offset);
Sebastian Hack's avatar
Sebastian Hack committed
234

Michael Beck's avatar
BugFix:    
Michael Beck committed
235
236
/** Returns the previous node that computes the stack pointer. */
ir_node *be_get_IncSP_pred(ir_node *incsp);
Sebastian Hack's avatar
Sebastian Hack committed
237

238
/** Sets the previous node that computes the stack pointer. */
239
void     be_set_IncSP_pred(ir_node *incsp, ir_node *pred);
240

241
242
243
244
245
246
247
/**
 * Sets a new offset to a IncSP node.
 * A positive offset means expanding the stack, a negative offset shrinking
 * an offset is == BE_STACK_FRAME_SIZE will be replaced by the real size of the
 * stackframe in the fix_stack_offsets phase.
 */
void     be_set_IncSP_offset(ir_node *irn, int offset);
Michael Beck's avatar
BugFix:    
Michael Beck committed
248
249

/** Gets the offset from a IncSP node. */
250
int be_get_IncSP_offset(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
251

252
/** Gets the call entity or NULL if this is no static call. */
253
ir_entity  *be_Call_get_entity(const ir_node *call);
254
/** Sets the call entity. */
255
void     be_Call_set_entity(ir_node *call, ir_entity *ent);
256
257
258
259
/** Gets the call type. */
ir_type *be_Call_get_type(ir_node *call);
/** Sets the call type. */
void     be_Call_set_type(ir_node *call, ir_type *call_tp);
260

261
262
263
/**
 * Position numbers for the be_Call inputs.
 */
264
enum {
265
266
267
268
	be_pos_Call_mem       = 0,  /**< memory input of a be_Call node */
	be_pos_Call_sp        = 1,  /**< stack pointer input of a be_Call node */
	be_pos_Call_ptr       = 2,  /**< call pointer input of a be_Call node */
	be_pos_Call_first_arg = 3   /**< first argument input of a be_Call node */
269
270
};

271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
/**
 * Projection numbers for result of be_Call node: use for Proj nodes!
 */
typedef enum {
	pn_be_Call_M_regular = pn_Call_M_regular,  /**< The memory result of a be_Call. */
	pn_be_Call_first_res = pn_Call_max         /**< The first result proj number of a be_Call. */
} pn_be_Call;

/**
 * Construct a new be_Call
 */
ir_node *be_new_Call(dbg_info *dbg, ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *sp, ir_node *ptr,
                     int n_outs, int n, ir_node *in[], ir_type *call_tp);

/**
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
 * Position numbers for the be_Return inputs.
 */
enum {
	be_pos_Return_mem  = 0,     /**< memory input of a be_Return node */
	be_pos_Return_sp   = 1,     /**< stack pointer input of a be_Return node */
	be_pos_Return_val  = 2,     /**< first "real" return value if any */
};

/**
 * Construct a new be_Return.
 * @param irg    the graph where the new node will be placed
 * @param bl     the block where the new node will be placed
 * @param n_res  number of "real" results
 * @param n      number of inputs
 * @param in     input array
 */
ir_node *be_new_Return(dbg_info *dbg, ir_graph *irg, ir_node *bl, int n_res, int n, ir_node *in[]);

/** Returns the number of real returns values */
int be_Return_get_n_rets(ir_node *ret);

307
308
309
/** appends a node to the return node, returns the position of the node */
int be_Return_append_node(ir_node *ret, ir_node *node);

310
311
/**
 * Construct a new Stack Parameter node.
312
 */
313
ir_node *be_new_StackParam(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_mode *mode, ir_node *frame_pointer, ir_entity *ent);
Sebastian Hack's avatar
Sebastian Hack committed
314
ir_node *be_new_RegParams(ir_graph *irg, ir_node *bl, int n_out);
Sebastian Hack's avatar
Sebastian Hack committed
315

316
ir_node *be_new_Barrier(ir_graph *irg, ir_node *bl, int n, ir_node *in[]);
Sebastian Hack's avatar
Sebastian Hack committed
317

318
319
320
321
322
323
324
325
326
327
/**
 * Appends a node to a barrier, returns the result proj of the node
 */
ir_node *be_Barrier_append_node(ir_node *barrier, ir_node *node);

/**
 * Appends a register out requirement to a RegParams node
 *
 * @returns the proj node for the new register
 */
328
329
ir_node *be_RegParams_append_out_reg(ir_node *regparams,
                                     const arch_env_t *arch_env,
330
331
                                     const arch_register_t *reg);

Sebastian Hack's avatar
Sebastian Hack committed
332
/**
333
 * Make a spill node.
Sebastian Hack's avatar
Sebastian Hack committed
334
335
336
337
338
339
 *
 * @param arch_env  The architecture environment.
 * @param irn       The node to be spilled.
 * @param spill_ctx The context in which the spill is introduced (This is mostly == irn up to the case of Phis).
 * @return          The new spill node.
 */
Matthias Braun's avatar
Matthias Braun committed
340
ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
341
342
343
344
345
346
347
348
349
350
351
352

/**
 * Make a reload and insert it into the schedule.
 *
 * @param arch_env The architecture environment.
 * @param cls      The register class of the reloaded value.
 * @param insert   The node in the schedule in front of which the reload is inserted.
 * @param mode     The mode of the original (spilled) value.
 * @param spill    The spill node corresponding to this reload.
 * @return         A freshly made reload.
 */
ir_node *be_reload(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *insert, ir_mode *mode, ir_node *spill);
Sebastian Hack's avatar
Sebastian Hack committed
353

Sebastian Hack's avatar
Sebastian Hack committed
354
355
356
enum {
	be_pos_CopyKeep_op = 0
};
Sebastian Hack's avatar
Sebastian Hack committed
357
358
ir_node *be_new_CopyKeep(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *src, int n, ir_node *in_keep[], ir_mode *mode);
ir_node *be_new_CopyKeep_single(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *src, ir_node *keep, ir_mode *mode);
359
360
ir_node *be_get_CopyKeep_op(const ir_node *cpy);
void be_set_CopyKeep_op(ir_node *cpy, ir_node *op);
Sebastian Hack's avatar
Sebastian Hack committed
361

Sebastian Hack's avatar
Sebastian Hack committed
362
363
364
365
366
/**
 * Get the backend opcode of a backend node.
 * @param irn The node.
 * @return The backend opcode.
 */
Sebastian Hack's avatar
Sebastian Hack committed
367
368
be_opcode_t be_get_irn_opcode(const ir_node *irn);

369
370
371
372
int be_is_Spill(const ir_node *irn);
int be_is_Reload(const ir_node *irn);
int be_is_Copy(const ir_node *irn);
int be_is_Perm(const ir_node *irn);
Matthias Braun's avatar
Matthias Braun committed
373
int be_is_MemPerm(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
374
int be_is_Keep(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
375
int be_is_CopyKeep(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
376
int be_is_Call(const ir_node *irn);
377
int be_is_Return(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
378
int be_is_IncSP(const ir_node *irn);
379
int be_is_SetSP(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
380
int be_is_AddSP(const ir_node *irn);
381
int be_is_SubSP(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
382
383
int be_is_RegParams(const ir_node *irn);
int be_is_StackParam(const ir_node *irn);
Christian Würdig's avatar
Christian Würdig committed
384
385
386
int be_is_FrameAddr(const ir_node *irn);
int be_is_FrameLoad(const ir_node *irn);
int be_is_FrameStore(const ir_node *irn);
387
int be_is_Barrier(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
388

389
/**
390
 * Try to avoid this function and better call arch_get_frame_entity!
391
 *
392
 * Returns the frame entity used by the be node
393
 */
394
395
396
397
398
399
ir_entity *be_get_frame_entity(const ir_node *irn);

/**
 * Returns the frame offset of this node.
 */
int be_get_frame_offset(const ir_node *irn);
400
401

ir_node* be_get_Reload_mem(const ir_node *irn);
402
ir_node *be_get_Reload_frame(const ir_node *irn);
403
ir_node* be_get_Spill_val(const ir_node *irn);
404
ir_node *be_get_Spill_frame(const ir_node *irn);
405

406
407
void be_set_MemPerm_in_entity(const ir_node *irn, int n, ir_entity* ent);
ir_entity *be_get_MemPerm_in_entity(const ir_node *irn, int n);
Matthias Braun's avatar
Matthias Braun committed
408

409
410
void be_set_MemPerm_out_entity(const ir_node *irn, int n, ir_entity* ent);
ir_entity *be_get_MemPerm_out_entity(const ir_node *irn, int n);
411

412
413
int be_get_MemPerm_entity_arity(const ir_node *irn);

Sebastian Hack's avatar
Sebastian Hack committed
414
415
416
417
418
419
420
/**
 * Impose a register constraint on a backend node.
 * @param irn The node.
 * @param pos The position of the argument/result. Results range from -1..-m and arguments form 0..n
 * @param reg The register which is admissible for that node, argument/result and position.
 */
void be_set_constr_single_reg(ir_node *irn, int pos, const arch_register_t *reg);
421

422
/**
423
424
425
426
427
428
 * Impose register constraints on a backend node.
 * The register subsets given by the limited function in @p req are copied to the backend node.
 * This requires that the constraint type of the @p req is arch_register_req_type_limited.
 * @param irn The backend node.
 * @param pos The position (@see be_set_constr_single_reg()).
 * @param req The register requirements which shall be transferred.
429
 */
430
void be_set_constr_limited(ir_node *irn, int pos, const arch_register_req_t *req);
431

Sebastian Hack's avatar
Sebastian Hack committed
432
433
434
435
436
437
/**
 * Set the flags of a node.
 * @param irn The node itself.
 * @param pos The position (0..n) for arguments, (-1..-m) for results.
 * @param flags The flags to set for that node and position.
 */
Sebastian Hack's avatar
Sebastian Hack committed
438
439
void be_node_set_flags(ir_node *irn, int pos, arch_irn_flags_t flags);

Sebastian Hack's avatar
Sebastian Hack committed
440
441
442
443
444
445
/**
 * Set the register class of a node.
 * @param irn The node itself.
 * @param pos The position (0..n) for arguments, (-1..-m) for results.
 * @param flags The register class to set for that node and position.
 */
Sebastian Hack's avatar
Sebastian Hack committed
446
447
void be_node_set_reg_class(ir_node *irn, int pos, const arch_register_class_t *cls);

Christian Würdig's avatar
Christian Würdig committed
448
449
450
451
452
453
454
455
/**
 * Set the register requirement type of a node.
 * @param irn The node itself.
 * @param pos The position (0..n) for arguments, (-1..-m) for results.
 * @param flags The register requirement type to set for that node and position.
 */
void be_node_set_req_type(ir_node *irn, int pos, arch_register_req_type_t type);

456
/**
Sebastian Hack's avatar
Sebastian Hack committed
457
458
459
 * Make a new phi handler.
 * @param env The architecture environment.
 * @return A new phi handler.
460
 */
Sebastian Hack's avatar
Sebastian Hack committed
461
arch_irn_handler_t *be_phi_handler_new(const arch_env_t *arch_env);
Sebastian Hack's avatar
Sebastian Hack committed
462

Sebastian Hack's avatar
Sebastian Hack committed
463
464
465
466
467
468
469
470
471
472
473
474
/**
 * Free a phi handler.
 * @param handler The handler to free.
 */
void be_phi_handler_free(arch_irn_handler_t *handler);

/**
 * Reset the register data in the phi handler.
 * This should be called on each new graph and deletes the register information of the current graph.
 */
void be_phi_handler_reset(arch_irn_handler_t *handler);

475
476
477
478
479
480
/**
 * Set the register requirements for a phi node.
 */
void be_set_phi_reg_req(const arch_env_t *arch_env, ir_node *phi,
                        const arch_register_req_t *req);

481
482
483
484
485
486
/*
 * Set flags for a phi node
 */
void be_set_phi_flags(const arch_env_t *arch_env, ir_node *phi,
                      arch_irn_flags_t flags);

Sebastian Hack's avatar
Sebastian Hack committed
487
488
489
490
/**
 * irn handler for common be nodes.
 */
extern const arch_irn_handler_t be_node_irn_handler;
Sebastian Hack's avatar
Sebastian Hack committed
491

Sebastian Hack's avatar
Sebastian Hack committed
492
#endif /* _BENODE_T_H */