implement LOCAL_VARIBALE_ENTITY in reference_expression_addr
[cparser] / ast2firm.c
index 8f75068..334ac62 100644 (file)
@@ -680,7 +680,13 @@ static ir_node *reference_addr(const reference_expression_t *ref)
                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");
@@ -1295,6 +1301,12 @@ static ir_node *select_to_firm(const select_expression_t *expression)
        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) {
@@ -1304,6 +1316,14 @@ static ir_node *expression_to_addr(const expression_t *expression)
                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;
        }