X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast2firm.c;h=334ac62a86976e5c0f396bf5587c7eb225317832;hb=bad31bab1b92f39152e36f10d7f5881b0e8fe022;hp=8f75068996735d1e8828e1d6c1e1c61ccd02498d;hpb=e141741dd5e795dbb85a97a0a54505bc7ef932da;p=cparser diff --git a/ast2firm.c b/ast2firm.c index 8f75068..334ac62 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -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; }