Esempio n. 1
0
/* The default prototype is: long X(long, long, long, long).  */
static struct prototype *
build_default_prototype(void)
{
    static struct prototype *ret = NULL;
    if (ret != NULL)
        return ret;

    static struct prototype proto;
    prototype_init(&proto);

    struct arg_type_info *unknown_type = get_unknown_type();
    assert(unknown_type != NULL);
    proto.return_info = unknown_type;
    proto.own_return_info = 0;

    struct param unknown_param;
    param_init_type(&unknown_param, unknown_type, 0);

    size_t i;
    for (i = 0; i < 4; ++i)
        if (prototype_push_param(&proto, &unknown_param) < 0) {
            report_global_error("build_default_prototype: %s",
                                strerror(errno));
            prototype_destroy(&proto);
            return NULL;
        }

    ret = &proto;
    return ret;
}
Esempio n. 2
0
ir_entity *be_make_va_start_entity(ir_type *const frame_type, int const offset)
{
	ident     *const id       = new_id_from_str("$va_start");
	ir_type   *const unknown  = get_unknown_type();
	ir_entity *const va_start = new_entity(frame_type, id, unknown);
	set_entity_offset(va_start, offset);
	return va_start;
}
Esempio n. 3
0
void gcji_create_rtti_entity(ir_type *type)
{
	const char *name = get_compound_name(type);
	/* create RTTI object entity (actual initializer is constructed in liboo) */
	ident     *rtti_ident  = mangle_rtti_name(name);
	ir_type   *unknown     = get_unknown_type();
	ir_entity *rtti_entity = new_entity(glob, rtti_ident, unknown);
	oo_set_class_rtti_entity(type, rtti_entity);
}
Esempio n. 4
0
void gcji_create_vtable_entity(ir_type *type)
{
	const char *name         = get_compound_name(type);
	ident      *vtable_ident = mangle_vtable_name(name);
	ir_type    *unknown      = get_unknown_type();
	ir_type    *glob         = get_glob_type();
	ir_entity  *vtable       = new_entity(glob, vtable_ident, unknown);
	oo_set_class_vtable_entity(type, vtable);
}
Esempio n. 5
0
static void sparc_layout_param_entities(ir_graph *const irg, calling_convention_t *const cconv, ir_type *const non_lowered)
{
	ir_entity **const param_map  = be_collect_parameter_entities(irg);
	ir_type    *const frame_type = get_irg_frame_type(irg);
	size_t      const n_params   = cconv->n_parameters;
	/* calculate offsets/create missing entities */
	for (size_t i = 0; i < n_params; ++i) {
		reg_or_stackslot_t *const param  = &cconv->parameters[i];
		ir_entity          *      entity = param_map[i];
		if (entity == NULL) {
			if (!param->already_stored)
				continue;
			entity = new_parameter_entity(frame_type, i, param->type);
		}
		param->entity = entity;
		set_entity_offset(entity, param->offset);
	}

	ir_entity *const function      = get_irg_entity(irg);
	ir_type   *const function_type = get_entity_type(function);
	if (is_method_variadic(function_type)) {
		ir_type   *unknown       = get_unknown_type();
		ident     *id            = new_id_from_str("$va_start");
		ir_entity *va_start_addr = new_entity(frame_type, id, unknown);

		/* sparc_variadic_fixups() fiddled with our type, find out the
		 * original number of parameters */
		size_t const orig_n_params = get_method_n_params(non_lowered);
		long offset;
		if (orig_n_params < n_params) {
			assert(param_map[orig_n_params] != NULL);
			offset = get_entity_offset(param_map[orig_n_params]);
		} else {
			offset = cconv->param_stack_size + SPARC_MIN_STACKSIZE;
		}

		set_entity_offset(va_start_addr, offset);
		cconv->va_start_addr = va_start_addr;
	}

	free(param_map);
}