X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast2firm.c;h=f124790e236b4b14c8ee43f8b52a4615658fb3ad;hb=69bda5cf31457ea843bc4c6e3c13ed751a673b7f;hp=f34a2e47e2c9017b15dd0c2f4b64edd6c7c6f82f;hpb=f618d56a33190711d5bf34f1341a268667ce4645;p=cparser diff --git a/ast2firm.c b/ast2firm.c index f34a2e4..f124790 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -82,8 +82,6 @@ static ir_node *ijmp_list; static bool constant_folding; static bool initializer_use_bitfield_basetype; -extern bool have_const_functions; - static const entity_t *current_function_entity; static ir_node *current_function_name; static ir_node *current_funcsig; @@ -133,7 +131,7 @@ static ir_node *uninitialized_local_var(ir_graph *irg, ir_mode *mode, int pos) { const entity_t *entity = get_irg_loc_description(irg, pos); - if (entity != NULL) { + if (entity != NULL && warning.uninitialized) { warningf(&entity->base.source_position, "%s '%#T' might be used uninitialized", get_entity_kind_name(entity->kind), @@ -901,7 +899,6 @@ static void handle_decl_modifiers(ir_entity *irentity, entity_t *entity) } if (modifiers & DM_CONST) { add_entity_additional_properties(irentity, mtp_property_const); - have_const_functions = true; } } if (modifiers & DM_USED) { @@ -1068,16 +1065,14 @@ entity_created: * Creates a SymConst for a given entity. * * @param dbgi debug info - * @param mode the (reference) mode for the SymConst * @param entity the entity */ -static ir_node *create_symconst(dbg_info *dbgi, ir_mode *mode, - ir_entity *entity) +static ir_node *create_symconst(dbg_info *dbgi, ir_entity *entity) { assert(entity != NULL); union symconst_symbol sym; sym.entity_p = entity; - return new_d_SymConst(dbgi, mode, sym, symconst_addr_ent); + return new_d_SymConst(dbgi, mode_P, sym, symconst_addr_ent); } static ir_node *create_conv(dbg_info *dbgi, ir_node *value, ir_mode *dest_mode) @@ -1089,9 +1084,8 @@ static ir_node *create_conv(dbg_info *dbgi, ir_node *value, ir_mode *dest_mode) if (dest_mode == mode_b) { ir_node *zero = new_Const(get_mode_null(value_mode)); - ir_node *cmp = new_d_Cmp(dbgi, value, zero); - ir_node *proj = new_d_Proj(dbgi, cmp, mode_b, pn_Cmp_Lg); - return proj; + ir_node *cmp = new_d_Cmp(dbgi, value, zero, ir_relation_less_greater); + return cmp; } return new_d_Conv(dbgi, value, dest_mode); @@ -1140,7 +1134,7 @@ static ir_node *wide_string_literal_to_firm( } set_entity_initializer(entity, initializer); - return create_symconst(dbgi, mode_P_data, entity); + return create_symconst(dbgi, entity); } /** @@ -1183,7 +1177,7 @@ static ir_node *string_to_firm(const source_position_t *const src_pos, } set_entity_initializer(entity, initializer); - return create_symconst(dbgi, mode_P_data, entity); + return create_symconst(dbgi, entity); } static bool try_create_integer(literal_expression_t *literal, @@ -1423,7 +1417,7 @@ static ir_node *create_trampoline(dbg_info *dbgi, ir_mode *mode, assert(entity != NULL); ir_node *in[3]; in[0] = get_trampoline_region(dbgi, entity); - in[1] = create_symconst(dbgi, mode, entity); + in[1] = create_symconst(dbgi, entity); in[2] = get_irg_frame(current_ir_graph); ir_node *irn = new_d_Builtin(dbgi, get_store(), 3, in, ir_bk_inner_trampoline, get_unknown_type()); @@ -1488,25 +1482,6 @@ static ir_node *do_strict_conv(dbg_info *dbgi, ir_node *node) return new_d_strictConv(dbgi, node, mode); } -/** - * Returns the address of a global variable. - * - * @param dbgi debug info - * @param variable the variable - */ -static ir_node *get_global_var_address(dbg_info *const dbgi, - const variable_t *const variable) -{ - ir_entity *const irentity = variable->v.entity; - if (variable->thread_local) { - ir_node *const no_mem = new_NoMem(); - ir_node *const tls = get_irg_tls(current_ir_graph); - return new_d_simpleSel(dbgi, no_mem, tls, irentity); - } else { - return create_symconst(dbgi, mode_P_data, irentity); - } -} - /** * Returns the correct base address depending on whether it is a parameter or a * normal local variable. @@ -1591,14 +1566,13 @@ static ir_node *reference_expression_to_firm(const reference_expression_t *ref) return create_conv(NULL, value, get_ir_mode_arithmetic(type)); } case DECLARATION_KIND_FUNCTION: { - ir_mode *const mode = get_ir_mode_storage(type); - return create_symconst(dbgi, mode, entity->function.irentity); + return create_symconst(dbgi, entity->function.irentity); } case DECLARATION_KIND_INNER_FUNCTION: { ir_mode *const mode = get_ir_mode_storage(type); if (!entity->function.goto_to_outer && !entity->function.need_closure) { /* inner function not using the closure */ - return create_symconst(dbgi, mode, entity->function.irentity); + return create_symconst(dbgi, entity->function.irentity); } else { /* need trampoline here */ return create_trampoline(dbgi, mode, entity->function.irentity); @@ -1606,7 +1580,7 @@ static ir_node *reference_expression_to_firm(const reference_expression_t *ref) } case DECLARATION_KIND_GLOBAL_VARIABLE: { const variable_t *variable = &entity->variable; - ir_node *const addr = get_global_var_address(dbgi, variable); + ir_node *const addr = create_symconst(dbgi, variable->v.entity); return deref_address(dbgi, variable->base.type, addr); } @@ -1648,7 +1622,7 @@ static ir_node *reference_addr(const reference_expression_t *ref) * as an indicator for no real address) */ return NULL; case DECLARATION_KIND_GLOBAL_VARIABLE: { - ir_node *const addr = get_global_var_address(dbgi, &entity->variable); + ir_node *const addr = create_symconst(dbgi, entity->variable.v.entity); return addr; } case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY: { @@ -1670,9 +1644,7 @@ static ir_node *reference_addr(const reference_expression_t *ref) return entity->variable.v.vla_base; case DECLARATION_KIND_FUNCTION: { - type_t *const type = skip_typeref(entity->declaration.type); - ir_mode *const mode = get_ir_mode_storage(type); - return create_symconst(dbgi, mode, entity->function.irentity); + return create_symconst(dbgi, entity->function.irentity); } case DECLARATION_KIND_INNER_FUNCTION: { @@ -1680,7 +1652,7 @@ static ir_node *reference_addr(const reference_expression_t *ref) ir_mode *const mode = get_ir_mode_storage(type); if (!entity->function.goto_to_outer && !entity->function.need_closure) { /* inner function not using the closure */ - return create_symconst(dbgi, mode, entity->function.irentity); + return create_symconst(dbgi, entity->function.irentity); } else { /* need trampoline here */ return create_trampoline(dbgi, mode, entity->function.irentity); @@ -1895,13 +1867,9 @@ static ir_node *process_builtin_call(const call_expression_t *call) long type_val = fold_constant_to_int(type_expression); type_t *type = function_type->function.return_type; ir_mode *mode = get_ir_mode_arithmetic(type); - ir_tarval *result; - /* just produce a "I don't know" result */ - if (type_val & 2) - result = new_tarval_from_long(0, mode); - else - result = new_tarval_from_long(-1, mode); + ir_tarval *result = type_val & 2 ? get_mode_null(mode) : + get_mode_minus_one(mode); return new_d_Const(dbgi, result); } @@ -2418,22 +2386,21 @@ static bool is_local_variable(expression_t *expression) return entity->declaration.kind == DECLARATION_KIND_LOCAL_VARIABLE; } -static pn_Cmp get_pnc(const expression_kind_t kind, type_t *const type) +static ir_relation get_relation(const expression_kind_t kind) { switch(kind) { - case EXPR_BINARY_EQUAL: return pn_Cmp_Eq; - case EXPR_BINARY_ISLESSGREATER: return pn_Cmp_Lg; - case EXPR_BINARY_NOTEQUAL: - return is_type_float(skip_typeref(type)) ? pn_Cmp_Ne : pn_Cmp_Lg; + case EXPR_BINARY_EQUAL: return ir_relation_equal; + case EXPR_BINARY_ISLESSGREATER: return ir_relation_less_greater; + case EXPR_BINARY_NOTEQUAL: return ir_relation_unordered_less_greater; case EXPR_BINARY_ISLESS: - case EXPR_BINARY_LESS: return pn_Cmp_Lt; + case EXPR_BINARY_LESS: return ir_relation_less; case EXPR_BINARY_ISLESSEQUAL: - case EXPR_BINARY_LESSEQUAL: return pn_Cmp_Le; + case EXPR_BINARY_LESSEQUAL: return ir_relation_less_equal; case EXPR_BINARY_ISGREATER: - case EXPR_BINARY_GREATER: return pn_Cmp_Gt; + case EXPR_BINARY_GREATER: return ir_relation_greater; case EXPR_BINARY_ISGREATEREQUAL: - case EXPR_BINARY_GREATEREQUAL: return pn_Cmp_Ge; - case EXPR_BINARY_ISUNORDERED: return pn_Cmp_Uo; + case EXPR_BINARY_GREATEREQUAL: return ir_relation_greater_equal; + case EXPR_BINARY_ISUNORDERED: return ir_relation_unordered; default: break; @@ -2459,10 +2426,8 @@ static ir_node *handle_assume_compare(dbg_info *dbi, expression_t *op1 = expression->left; expression_t *op2 = expression->right; entity_t *var2, *var = NULL; - ir_node *res = NULL; - pn_Cmp cmp_val; - - cmp_val = get_pnc(expression->base.kind, op1->base.type); + ir_node *res = NULL; + ir_relation relation = get_relation(expression->base.kind); if (is_local_variable(op1) && is_local_variable(op2)) { var = op1->reference.entity; @@ -2474,10 +2439,10 @@ static ir_node *handle_assume_compare(dbg_info *dbi, ir_node *const irn1 = get_value(var->variable.v.value_number, mode); ir_node *const irn2 = get_value(var2->variable.v.value_number, mode); - res = new_d_Confirm(dbi, irn2, irn1, get_inversed_pnc(cmp_val)); + res = new_d_Confirm(dbi, irn2, irn1, get_inversed_relation(relation)); set_value(var2->variable.v.value_number, res); - res = new_d_Confirm(dbi, irn1, irn2, cmp_val); + res = new_d_Confirm(dbi, irn1, irn2, relation); set_value(var->variable.v.value_number, res); return res; @@ -2488,7 +2453,7 @@ static ir_node *handle_assume_compare(dbg_info *dbi, var = op1->reference.entity; con = op2; } else if (is_constant_expression(op1) == EXPR_CLASS_CONSTANT && is_local_variable(op2)) { - cmp_val = get_inversed_pnc(cmp_val); + relation = get_inversed_relation(relation); var = op2->reference.entity; con = op1; } @@ -2498,7 +2463,7 @@ static ir_node *handle_assume_compare(dbg_info *dbi, ir_mode *const mode = get_ir_mode_storage(type); res = get_value(var->variable.v.value_number, mode); - res = new_d_Confirm(dbi, res, expression_to_firm(con), cmp_val); + res = new_d_Confirm(dbi, res, expression_to_firm(con), relation); set_value(var->variable.v.value_number, res); } return res; @@ -2525,7 +2490,7 @@ static ir_node *handle_assume(dbg_info *dbi, const expression_t *expression) } } -static ir_node *create_cast(dbg_info *dbgi, ir_node *value_node, +static ir_node *create_cast(dbg_info *dbgi, ir_node *value_node, type_t *from_type, type_t *type) { type = skip_typeref(type); @@ -2548,12 +2513,12 @@ static ir_node *create_cast(dbg_info *dbgi, ir_node *value_node, const variable_t *to_var = type->pointer.base_variable; if (from_var != to_var) { if (from_var != NULL) { - ir_node *const addr = get_global_var_address(dbgi, from_var); + ir_node *const addr = create_symconst(dbgi, from_var->v.entity); ir_node *const base = deref_address(dbgi, from_var->base.type, addr); value_node = new_d_Add(dbgi, value_node, base, get_ir_mode_storage(from_type)); } if (to_var != NULL) { - ir_node *const addr = get_global_var_address(dbgi, to_var); + ir_node *const addr = create_symconst(dbgi, to_var->v.entity); ir_node *const base = deref_address(dbgi, to_var->base.type, addr); value_node = new_d_Sub(dbgi, value_node, base, mode); } @@ -2611,7 +2576,7 @@ static ir_node *unary_expression_to_firm(const unary_expression_t *expression) /* check for __based */ const variable_t *const base_var = value_type->pointer.base_variable; if (base_var != NULL) { - ir_node *const addr = get_global_var_address(dbgi, base_var); + 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)); } @@ -2770,15 +2735,9 @@ normal_node: case EXPR_BINARY_DIV: case EXPR_BINARY_DIV_ASSIGN: { ir_node *pin = new_Pin(new_NoMem()); - ir_node *op; - ir_node *res; - if (mode_is_float(mode)) { - op = new_d_Quot(dbgi, pin, left, right, mode, op_pin_state_floats); - res = new_d_Proj(dbgi, op, mode, pn_Quot_res); - } else { - op = new_d_Div(dbgi, pin, left, right, mode, op_pin_state_floats); - res = new_d_Proj(dbgi, op, mode, pn_Div_res); - } + ir_node *op = new_d_Div(dbgi, pin, left, right, mode, + op_pin_state_floats); + ir_node *res = new_d_Proj(dbgi, op, mode, pn_Div_res); return res; } case EXPR_BINARY_MOD: @@ -2869,13 +2828,12 @@ static ir_node *binary_expression_to_firm(const binary_expression_t *expression) case EXPR_BINARY_ISLESSEQUAL: case EXPR_BINARY_ISLESSGREATER: case EXPR_BINARY_ISUNORDERED: { - dbg_info *dbgi = get_dbg_info(&expression->base.source_position); - ir_node *left = expression_to_firm(expression->left); - ir_node *right = expression_to_firm(expression->right); - ir_node *cmp = new_d_Cmp(dbgi, left, right); - long pnc = get_pnc(kind, expression->left->base.type); - ir_node *proj = new_d_Proj(dbgi, cmp, mode_b, pnc); - return proj; + dbg_info *dbgi = get_dbg_info(&expression->base.source_position); + ir_node *left = expression_to_firm(expression->left); + ir_node *right = expression_to_firm(expression->right); + ir_relation relation = get_relation(kind); + ir_node *cmp = new_d_Cmp(dbgi, left, right, relation); + return cmp; } case EXPR_BINARY_ASSIGN: { ir_node *addr = expression_to_addr(expression->left); @@ -3050,6 +3008,11 @@ static ir_node *sizeof_to_firm(const typeprop_expression_t *expression) && expression->tp_expression != NULL) { expression_to_firm(expression->tp_expression); } + /* strange gnu extensions: sizeof(function) == 1 */ + if (is_type_function(type)) { + ir_mode *mode = get_ir_mode_storage(type_size_t); + return new_Const(get_mode_one(mode)); + } return get_type_size_node(type); } @@ -3089,7 +3052,12 @@ static ir_node *alignof_to_firm(const typeprop_expression_t *expression) if (tp_expression != NULL) { entity_t *entity = get_expression_entity(tp_expression); if (entity != NULL) { - alignment = get_cparser_entity_alignment(entity); + if (entity->kind == ENTITY_FUNCTION) { + /* a gnu-extension */ + alignment = 1; + } else { + alignment = get_cparser_entity_alignment(entity); + } } } @@ -3203,8 +3171,13 @@ static ir_node *conditional_to_firm(const conditional_expression_t *expression) return NULL; ir_node *const in[2] = { true_val, false_val }; - ir_mode *const mode = get_irn_mode(true_val); - assert(get_irn_mode(false_val) == mode); + type_t *const type = skip_typeref(expression->base.type); + ir_mode *mode; + if (is_type_compound(type)) { + mode = mode_P; + } else { + mode = get_ir_mode_arithmetic(type); + } ir_node *const val = new_d_Phi(dbgi, lengthof(in), in, mode); return val; @@ -4435,7 +4408,7 @@ static void create_local_initializer(initializer_t *initializer, dbg_info *dbgi, set_entity_initializer(init_entity, irinitializer); - ir_node *const src_addr = create_symconst(dbgi, mode_P_data, init_entity); + ir_node *const src_addr = create_symconst(dbgi, init_entity); ir_node *const copyb = new_d_CopyB(dbgi, memory, addr, src_addr, irtype); ir_node *const copyb_mem = new_Proj(copyb, mode_M, pn_CopyB_M); @@ -4857,7 +4830,7 @@ static void if_statement_to_firm(if_statement_t *statement) } /* Create the false statement. - * Hadle false before true, so if no false statement is present, then the + * Handle false before true, so if no false statement is present, then the * empty false block is reused as fallthrough block. */ ir_node *fallthrough_block = NULL; if (statement->false_statement != NULL) { @@ -5504,13 +5477,13 @@ static void asm_statement_to_firm(const asm_statement_t *statement) } } -static void ms_try_statement_to_firm(ms_try_statement_t *statement) +static void ms_try_statement_to_firm(ms_try_statement_t *statement) { statement_to_firm(statement->try_statement); warningf(&statement->base.source_position, "structured exception handling ignored"); } -static void leave_statement_to_firm(leave_statement_t *statement) +static void leave_statement_to_firm(leave_statement_t *statement) { errorf(&statement->base.source_position, "__leave not supported yet"); }