- dbg_info *dbgi = get_dbg_info(&expression->base.pos);
- type_t *type = skip_typeref(expression->base.type);
-
- const expression_t *value = expression->value;
-
- switch(expression->base.kind) {
- case EXPR_UNARY_TAKE_ADDRESS:
- return expression_to_addr(value);
-
- case EXPR_UNARY_NEGATE: {
- ir_node *value_node = expression_to_firm(value);
- ir_mode *mode = get_ir_mode_arithmetic(type);
- return new_d_Minus(dbgi, value_node, mode);
- }
- case EXPR_UNARY_PLUS:
- return expression_to_firm(value);
- case EXPR_UNARY_BITWISE_NEGATE: {
- ir_node *value_node = expression_to_firm(value);
- ir_mode *mode = get_ir_mode_arithmetic(type);
- return new_d_Not(dbgi, value_node, mode);
- }
- case EXPR_UNARY_NOT: {
- ir_node *value_node = _expression_to_firm(value);
- value_node = create_conv(dbgi, value_node, mode_b);
- ir_node *res = new_d_Not(dbgi, value_node, mode_b);
- return res;
- }
- case EXPR_UNARY_DEREFERENCE: {
- ir_node *value_node = expression_to_firm(value);
- type_t *value_type = skip_typeref(value->base.type);
- assert(is_type_pointer(value_type));
-
- /* check for __based */
- const variable_t *const base_var = value_type->pointer.base_variable;
- if (base_var != NULL) {
- ir_node *const addr = create_symconst(dbgi, base_var->v.entity);
- ir_node *const base = deref_address(dbgi, base_var->base.type, addr);
- value_node = new_d_Add(dbgi, value_node, base, get_ir_mode_storage(value_type));
- }
- type_t *points_to = value_type->pointer.points_to;
- return deref_address(dbgi, points_to, value_node);
- }
-
- {
- bool inc;
- bool pre;
- case EXPR_UNARY_POSTFIX_DECREMENT: inc = false; pre = false; goto incdec;
- case EXPR_UNARY_POSTFIX_INCREMENT: inc = true; pre = false; goto incdec;
- case EXPR_UNARY_PREFIX_DECREMENT: inc = false; pre = true; goto incdec;
- case EXPR_UNARY_PREFIX_INCREMENT: inc = true; pre = true; goto incdec;
-incdec:
- return create_incdec(expression, inc, pre);
- }
-
- case EXPR_UNARY_CAST: {
- ir_node *value_node = expression_to_firm(value);
- type_t *from_type = value->base.type;
- return create_cast(dbgi, value_node, from_type, type);
- }
- case EXPR_UNARY_ASSUME:
- return handle_assume(dbgi, value);
-
- default:
- break;
- }
- panic("invalid unary expression type");