/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
set_Load_mem(get_irn_link(get_irn_link(bb)), mem);
}
+static void add_constructor(ir_entity *method)
+{
+ ir_type *method_type = get_entity_type(method);
+ ident *id = id_unique("constructor_ptrt.%u");
+ ir_type *ptr_type = new_type_pointer(id, method_type, mode_P_code);
+
+ ir_type *constructors = get_constructors_type();
+ ident *ide = id_unique("constructor_ptr.%u");
+ ir_entity *ptr = new_entity(constructors, ide, ptr_type);
+ ir_graph *irg = get_const_code_irg();
+ ir_node *val = new_rd_SymConst_addr_ent(NULL, irg, mode_P_code,
+ method, NULL);
+
+ set_entity_compiler_generated(ptr, 1);
+ set_atomic_ent_value(ptr, val);
+}
/**
* Generates a new irg which calls the initializer
start_block = get_irg_start_block(irg);
sym.entity_p = init_ent;
- symconst = new_r_SymConst(irg, start_block, sym, symconst_addr_ent);
+ symconst = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent);
sym.entity_p = ent_filename;
- ins[0] = new_r_SymConst(irg, start_block, sym, symconst_addr_ent);
+ ins[0] = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent);
sym.entity_p = bblock_id;
- ins[1] = new_r_SymConst(irg, start_block, sym, symconst_addr_ent);
+ ins[1] = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent);
sym.entity_p = bblock_counts;
- ins[2] = new_r_SymConst(irg, start_block, sym, symconst_addr_ent);
+ ins[2] = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent);
ins[3] = new_r_Const_long(irg, start_block, mode_Iu, n_blocks);
call = new_r_Call(irg, bb, get_irg_initial_mem(irg), symconst, 4, ins, init_type);
irg_finalize_cons(irg);
+ add_constructor(ent);
+
return irg;
}
tarval *tv;
int filename_len = strlen(filename)+1;
ident *cur_ident;
- int align_l, align_n, size;
+ unsigned align_l, align_n, size;
ir_graph *rem;
block_id_walker_data_t wd;
symconst_symbol sym;
align_n = get_type_size_bytes(charptr_type);
set_type_alignment_bytes(charptr_type, align_n);
loc_name = new_entity(loc_type, IDENT("name"), charptr_type);
- size = (size + align_n - 1) & -align_n;
+ size = (size + align_n - 1) & ~(align_n - 1);
set_entity_offset(loc_name, size);
size += align_n;
if (align_n > align_l)
align_l = align_n;
- size = (size + align_l - 1) & -align_l;
+ size = (size + align_l - 1) & ~(align_l - 1);
set_type_size_bytes(loc_type, size);
set_type_state(loc_type, layout_fixed);
/* generate a symbolic constant pointing to the count array */
sym.entity_p = bblock_counts;
- wd.symconst = new_r_SymConst(irg, get_irg_start_block(irg), sym, symconst_addr_ent);
+ wd.symconst = new_r_SymConst(irg, get_irg_start_block(irg), mode_P_data, sym, symconst_addr_ent);
irg_block_walk_graph(irg, block_id_walker, NULL, &wd);
start_block = get_irg_start_block(irg);
set_compound_graph_path_node(path, 1, loc_name);
if (wd.locs[i].fname) {
sym.entity_p = wd.locs[i].fname;
- n = new_SymConst(sym, symconst_addr_ent);
+ n = new_SymConst(mode_P_data, sym, symconst_addr_ent);
} else {
n = new_Const(mode_P_data, get_mode_null(mode_P_data));
}