- ir_node *nn;
- ir_mode *m;
-
- /* @@@ GL I think we should implement this using the routines from irgopt for
- dead node elimination/inlineing. */
-
- m = get_irn_mode(n);
- switch (get_irn_opcode(n)) {
- case iro_Const:
- nn = new_d_Const_type(dbg, m, get_Const_tarval(n), get_Const_type(n));
- break;
- case iro_SymConst:
- nn = new_d_SymConst_type(dbg, get_SymConst_symbol(n), get_SymConst_kind(n),
- get_SymConst_value_type(n));
- break;
- case iro_Add:
- nn = new_d_Add(dbg, copy_const_value(dbg, get_Add_left(n)),
- copy_const_value(dbg, get_Add_right(n)), m); break;
- case iro_Sub:
- nn = new_d_Sub(dbg, copy_const_value(dbg, get_Sub_left(n)),
- copy_const_value(dbg, get_Sub_right(n)), m); break;
- case iro_Mul:
- nn = new_d_Mul(dbg, copy_const_value(dbg, get_Mul_left(n)),
- copy_const_value(dbg, get_Mul_right(n)), m); break;
- case iro_And:
- nn = new_d_And(dbg, copy_const_value(dbg, get_And_left(n)),
- copy_const_value(dbg, get_And_right(n)), m); break;
- case iro_Or:
- nn = new_d_Or(dbg, copy_const_value(dbg, get_Or_left(n)),
- copy_const_value(dbg, get_Or_right(n)), m); break;
- case iro_Eor:
- nn = new_d_Eor(dbg, copy_const_value(dbg, get_Eor_left(n)),
- copy_const_value(dbg, get_Eor_right(n)), m); break;
- case iro_Cast:
- nn = new_d_Cast(dbg, copy_const_value(dbg, get_Cast_op(n)), get_Cast_type(n)); break;
- case iro_Conv:
- nn = new_d_Conv(dbg, copy_const_value(dbg, get_Conv_op(n)), m); break;
- case iro_Unknown:
- nn = new_d_Unknown(m); break;
- default:
- DDMN(n);
- assert(0 && "opcode invalid or not implemented");
- nn = NULL;
- break;
- }
- return nn;
+ ir_node *nn;
+ ir_mode *m;
+
+ /* @@@ GL I think we should implement this using the routines from irgopt for
+ dead node elimination/inlineing. */
+
+ m = get_irn_mode(n);
+ switch (get_irn_opcode(n)) {
+ case iro_Const:
+ nn = new_d_Const_type(dbg, m, get_Const_tarval(n), get_Const_type(n));
+ break;
+ case iro_SymConst:
+ nn = new_d_SymConst_type(dbg, get_irn_mode(n), get_SymConst_symbol(n), get_SymConst_kind(n),
+ get_SymConst_value_type(n));
+ break;
+ case iro_Add:
+ nn = new_d_Add(dbg, copy_const_value(dbg, get_Add_left(n)),
+ copy_const_value(dbg, get_Add_right(n)), m); break;
+ case iro_Sub:
+ nn = new_d_Sub(dbg, copy_const_value(dbg, get_Sub_left(n)),
+ copy_const_value(dbg, get_Sub_right(n)), m); break;
+ case iro_Mul:
+ nn = new_d_Mul(dbg, copy_const_value(dbg, get_Mul_left(n)),
+ copy_const_value(dbg, get_Mul_right(n)), m); break;
+ case iro_And:
+ nn = new_d_And(dbg, copy_const_value(dbg, get_And_left(n)),
+ copy_const_value(dbg, get_And_right(n)), m); break;
+ case iro_Or:
+ nn = new_d_Or(dbg, copy_const_value(dbg, get_Or_left(n)),
+ copy_const_value(dbg, get_Or_right(n)), m); break;
+ case iro_Eor:
+ nn = new_d_Eor(dbg, copy_const_value(dbg, get_Eor_left(n)),
+ copy_const_value(dbg, get_Eor_right(n)), m); break;
+ case iro_Cast:
+ nn = new_d_Cast(dbg, copy_const_value(dbg, get_Cast_op(n)), get_Cast_type(n)); break;
+ case iro_Conv:
+ nn = new_d_Conv(dbg, copy_const_value(dbg, get_Conv_op(n)), m); break;
+ case iro_Unknown:
+ nn = new_d_Unknown(m); break;
+ default:
+ assert(0 && "opcode invalid or not implemented");
+ nn = NULL;
+ break;
+ }
+ return nn;
+} /* copy_const_value */
+
+static ir_initializer_t null_initializer = { IR_INITIALIZER_NULL };
+
+ir_initializer_t *get_initializer_null(void)
+{
+ return &null_initializer;
+}
+
+ir_initializer_t *create_initializer_const(ir_node *value)
+{
+ struct obstack *obst = get_irg_obstack(get_const_code_irg());
+
+ ir_initializer_t *initializer
+ = obstack_alloc(obst, sizeof(ir_initializer_const_t));
+ initializer->kind = IR_INITIALIZER_CONST;
+ initializer->consti.value = value;
+
+ return initializer;
+}
+
+ir_initializer_t *create_initializer_tarval(tarval *tv)
+{
+ struct obstack *obst = get_irg_obstack(get_const_code_irg());
+
+ ir_initializer_t *initializer
+ = obstack_alloc(obst, sizeof(ir_initializer_tarval_t));
+ initializer->kind = IR_INITIALIZER_TARVAL;
+ initializer->tarval.value = tv;
+
+ return initializer;
+}
+
+ir_initializer_t *create_initializer_compound(unsigned n_entries)
+{
+ struct obstack *obst = get_irg_obstack(get_const_code_irg());
+
+ size_t i;
+ size_t size = sizeof(ir_initializer_compound_t)
+ + (n_entries-1) * sizeof(ir_initializer_t*);
+
+ ir_initializer_t *initializer = obstack_alloc(obst, size);
+ initializer->kind = IR_INITIALIZER_COMPOUND;
+ initializer->compound.n_initializers = n_entries;
+
+ for(i = 0; i < n_entries; ++i) {
+ initializer->compound.initializers[i] = get_initializer_null();
+ }
+
+ return initializer;
+}
+
+ir_node *get_initializer_const_value(const ir_initializer_t *initializer)
+{
+ assert(initializer->kind == IR_INITIALIZER_CONST);
+ return initializer->consti.value;
+}
+
+tarval *get_initializer_tarval_value(const ir_initializer_t *initializer)
+{
+ assert(initializer->kind == IR_INITIALIZER_TARVAL);
+ return initializer->tarval.value;
+}
+
+unsigned get_initializer_compound_n_entries(const ir_initializer_t *initializer)
+{
+ assert(initializer->kind == IR_INITIALIZER_COMPOUND);
+ return initializer->compound.n_initializers;
+}
+
+void set_initializer_compound_value(ir_initializer_t *initializer,
+ unsigned index, ir_initializer_t *value)
+{
+ assert(initializer->kind == IR_INITIALIZER_COMPOUND);
+ assert(index < initializer->compound.n_initializers);
+
+ initializer->compound.initializers[index] = value;
+}
+
+ir_initializer_t *get_initializer_compound_value(
+ const ir_initializer_t *initializer, unsigned index)
+{
+ assert(initializer->kind == IR_INITIALIZER_COMPOUND);
+ assert(index < initializer->compound.n_initializers);
+
+ return initializer->compound.initializers[index];
+}
+
+ir_initializer_kind_t get_initializer_kind(const ir_initializer_t *initializer)
+{
+ return initializer->kind;
+}
+
+static void check_entity_initializer(ir_entity *entity)
+{
+ /* TODO */
+ (void) entity;
+}
+
+void set_entity_initializer(ir_entity *entity, ir_initializer_t *initializer)
+{
+ entity->attr.initializer = initializer;
+ entity->has_initializer = 1;
+ check_entity_initializer(entity);
+}
+
+ir_initializer_t *get_entity_initializer(const ir_entity *entity)
+{
+ assert(entity->has_initializer);
+ return entity->attr.initializer;