return mode_P;
}
- ir_mode *mode = get_type_mode(irtype);
+ ir_mode *mode = get_type_mode(irtype);
assert(mode != NULL);
return mode;
}
dbg_info *dbgi = get_dbg_info(&ref->expression.source_position);
declaration_t *declaration = ref->declaration;
type_t *type = skip_typeref(declaration->type);
- ir_mode *mode = get_ir_mode(type);
switch((declaration_type_t) declaration->declaration_type) {
case DECLARATION_TYPE_UNKNOWN:
break;
- case DECLARATION_TYPE_LOCAL_VARIABLE:
+ case DECLARATION_TYPE_LOCAL_VARIABLE: {
+ ir_mode *mode = get_ir_mode(type);
return get_value(declaration->v.value_number, mode);
+ }
case DECLARATION_TYPE_FUNCTION: {
return create_symconst(dbgi, declaration->v.entity);
}
ir_node *frame = get_irg_frame(current_ir_graph);
ir_node *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, entity);
- if(type->type == TYPE_ARRAY) {
+ if(type->type == TYPE_ARRAY || type->type == TYPE_COMPOUND_STRUCT
+ || type->type == TYPE_COMPOUND_UNION) {
return sel;
} else {
return load_from_expression_addr(type, sel, dbgi);
static ir_node *expression_to_firm(const expression_t *expression)
{
- ir_node *res = _expression_to_firm(expression);
+ ir_node *res = _expression_to_firm(expression);
- if(expression->datatype == type_void)
- return NULL;
+ if(get_irn_mode(res) == mode_b) {
+ ir_mode *mode = get_ir_mode(expression->datatype);
+ res = create_conv(NULL, res, mode);
+ }
- ir_mode *mode = get_ir_mode(expression->datatype);
- res = create_conv(NULL, res, mode);
return res;
}
assert(declaration->declaration_type == DECLARATION_TYPE_UNKNOWN);
bool needs_entity = declaration->address_taken;
- type_t *type = declaration->type;
+ type_t *type = skip_typeref(declaration->type);
+
if(type->type == TYPE_ARRAY
|| type->type == TYPE_COMPOUND_STRUCT
|| type->type == TYPE_COMPOUND_UNION) {
declaration_t *parameter = declaration->context.declarations;
for( ; parameter != NULL; parameter = parameter->next) {
assert(parameter->declaration_type == DECLARATION_TYPE_UNKNOWN);
+ type_t *type = parameter->type;
+
+ bool needs_entity = parameter->address_taken;
+ if(type->type == TYPE_COMPOUND_STRUCT
+ || type->type == TYPE_COMPOUND_UNION) {
+ needs_entity = true;
+ }
- if(parameter->address_taken) {
- panic("address take from parameter not implemented yet");
+ if(needs_entity) {
+ panic("entities for function parameters not implemented yet");
}
ir_mode *mode = get_ir_mode(parameter->type);