ir_node *symconst = create_symconst(dbgi, entity);
return symconst;
}
- case DECLARATION_TYPE_LOCAL_VARIABLE_ENTITY:
+ case DECLARATION_TYPE_LOCAL_VARIABLE_ENTITY: {
+ ir_entity *entity = declaration->v.entity;
+ ir_node *frame = get_irg_frame(current_ir_graph);
+ ir_node *sel = new_d_simpleSel(dbgi, new_NoMem(), frame, entity);
+
+ return sel;
+ }
case DECLARATION_TYPE_COMPOUND_MEMBER:
case DECLARATION_TYPE_LABEL_BLOCK:
panic("not implemented reference type");
return load_from_expression_addr(type, addr, dbgi);
}
+static ir_node *dereference_addr(const unary_expression_t *const expression)
+{
+ assert(expression->type == UNEXPR_DEREFERENCE);
+ return expression_to_firm(expression->value);
+}
+
static ir_node *expression_to_addr(const expression_t *expression)
{
switch(expression->type) {
return array_access_addr((const array_access_expression_t*) expression);
case EXPR_SELECT:
return select_addr((const select_expression_t*) expression);
+ case EXPR_UNARY: {
+ const unary_expression_t *const unary_expr =
+ (const unary_expression_t*)expression;
+ if (unary_expr->type == UNEXPR_DEREFERENCE) {
+ return dereference_addr(unary_expr);
+ }
+ break;
+ }
default:
break;
}