X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast2firm.c;h=81c0a489eadadbdf3375c79c713e6523ac26cbce;hb=d7fe3663e68f8ea135d69e043054720d59767577;hp=f6db928f20b04128814e04d84293cc14f0175646;hpb=211aaabd26e2f4eab27d054b1984c66904fb45c2;p=cparser diff --git a/ast2firm.c b/ast2firm.c index f6db928..81c0a48 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -64,7 +64,6 @@ fp_model_t firm_fp_model = fp_model_precise; static const backend_params *be_params; static ir_type *ir_type_char; -static ir_type *ir_type_wchar_t; /* architecture specific floating point arithmetic mode (if any) */ static ir_mode *mode_float_arithmetic; @@ -884,7 +883,7 @@ static bool declaration_is_definition(const entity_t *entity) case ENTITY_LOCAL_LABEL: break; } - panic("declaration_is_definition called on non-declaration"); + panic("entity is not a declaration"); } /** @@ -1134,7 +1133,8 @@ static ir_node *string_to_firm(source_position_t const *const src_pos, char cons ir_initializer_t *const initializer = create_initializer_compound(slen); ir_type * elem_type; switch (value->encoding) { - case STRING_ENCODING_CHAR: { + case STRING_ENCODING_CHAR: + case STRING_ENCODING_UTF8: { elem_type = ir_type_char; ir_mode *const mode = get_type_mode(elem_type); @@ -1147,8 +1147,13 @@ static ir_node *string_to_firm(source_position_t const *const src_pos, char cons goto finish; } - case STRING_ENCODING_WIDE: { - elem_type = ir_type_wchar_t; + { + type_t *type; + case STRING_ENCODING_CHAR16: type = type_char16_t; goto init_wide; + case STRING_ENCODING_CHAR32: type = type_char32_t; goto init_wide; + case STRING_ENCODING_WIDE: type = type_wchar_t; goto init_wide; +init_wide:; + elem_type = get_ir_type(type); ir_mode *const mode = get_type_mode(elem_type); char const *p = value->begin; @@ -1270,7 +1275,7 @@ static ir_node *literal_to_firm(const literal_expression_t *literal) break; default: - panic("Invalid literal kind found"); + panic("invalid literal kind"); } dbg_info *dbgi = get_dbg_info(&literal->base.source_position); @@ -1320,7 +1325,7 @@ static ir_node *char_literal_to_firm(string_literal_expression_t const *literal) } default: - panic("Invalid literal kind found"); + panic("invalid literal kind"); } dbg_info *dbgi = get_dbg_info(&literal->base.source_position); @@ -1463,16 +1468,13 @@ static ir_node *get_local_frame(ir_entity *const ent) } /** - * Keep all memory edges of the given block. + * Keep the current block and memory. + * This is necessary for all loops, because they could become infinite. */ -static void keep_all_memory(ir_node *block) +static void keep_loop(void) { - ir_node *old = get_cur_block(); - - set_cur_block(block); + keep_alive(get_cur_block()); keep_alive(get_store()); - /* TODO: keep all memory edges from restricted pointers */ - set_cur_block(old); } static ir_node *enum_constant_to_firm(reference_expression_t const *const ref) @@ -1554,7 +1556,7 @@ static ir_node *reference_addr(const reference_expression_t *ref) panic("not implemented reference type"); } - panic("reference to declaration with unknown type found"); + panic("reference to declaration with unknown type"); } static ir_node *reference_expression_to_firm(const reference_expression_t *ref) @@ -1668,7 +1670,7 @@ static ir_node *process_builtin_call(const call_expression_t *call) case BUILTIN_LIBC_CHECK: panic("builtin did not produce an entity"); } - panic("invalid builtin found"); + panic("invalid builtin"); } /** @@ -2118,7 +2120,7 @@ static ir_node *create_incdec(const unary_expression_t *expression) store_value = result; break; default: - panic("no incdec expr in create_incdec"); + panic("no incdec expr"); } set_value_for_expression_addr(value_expr, store_value, addr); @@ -2350,7 +2352,7 @@ static ir_node *unary_expression_to_firm(const unary_expression_t *expression) default: break; } - panic("invalid UNEXPR type found"); + panic("invalid unary expression type"); } /** @@ -2910,8 +2912,6 @@ bool fold_constant_to_bool(const expression_t *expression) static ir_node *conditional_to_firm(const conditional_expression_t *expression) { - dbg_info *const dbgi = get_dbg_info(&expression->base.source_position); - /* first try to fold a constant condition */ if (is_constant_expression(expression->condition) == EXPR_CLASS_CONSTANT) { bool val = fold_constant_to_bool(expression->condition); @@ -2952,7 +2952,8 @@ static ir_node *conditional_to_firm(const conditional_expression_t *expression) ir_node *const false_val = expression_to_firm(expression->false_expression); jump_to_target(&exit_target); if (val) { - ir_node *const in[] = { val, false_val }; + ir_node *const in[] = { val, false_val }; + dbg_info *const dbgi = get_dbg_info(&expression->base.source_position); val = new_rd_Phi(dbgi, exit_target.block, lengthof(in), in, get_irn_mode(val)); } else { val = false_val; @@ -3078,7 +3079,7 @@ static ir_node *classify_type_to_firm(const classify_type_expression_t *const ex tc = real_type_class; goto make_const; } - panic("Unexpected atomic type in classify_type_to_firm()."); + panic("Unexpected atomic type."); } case TYPE_COMPLEX: tc = complex_type_class; goto make_const; @@ -3101,7 +3102,7 @@ static ir_node *classify_type_to_firm(const classify_type_expression_t *const ex case TYPE_ERROR: break; } - panic("unexpected TYPE classify_type_to_firm()."); + panic("unexpected type."); } make_const:; @@ -3319,7 +3320,7 @@ static ir_node *_expression_to_firm(expression_t const *const expr) case EXPR_ERROR: break; } - panic("invalid expression found"); + panic("invalid expression"); } /** @@ -3423,26 +3424,33 @@ static ir_node *create_condition_evaluation(expression_t const *const expression break; } - dbg_info *dbgi = get_dbg_info(&expression->base.source_position); - ir_node *cond_expr = _expression_to_firm(expression); - ir_node *condition = create_conv(dbgi, cond_expr, mode_b); - ir_node *cond = new_d_Cond(dbgi, condition); - ir_node *true_proj = new_d_Proj(dbgi, cond, mode_X, pn_Cond_true); - ir_node *false_proj = new_d_Proj(dbgi, cond, mode_X, pn_Cond_false); - - /* set branch prediction info based on __builtin_expect */ - if (is_builtin_expect(expression) && is_Cond(cond)) { - call_argument_t *argument = expression->call.arguments->next; - if (is_constant_expression(argument->expression) == EXPR_CLASS_CONSTANT) { - bool const cnst = fold_constant_to_bool(argument->expression); - cond_jmp_predicate const pred = cnst ? COND_JMP_PRED_TRUE : COND_JMP_PRED_FALSE; - set_Cond_jmp_pred(cond, pred); + ir_node *cond_expr = _expression_to_firm(expression); + if (is_Const(cond_expr)) { + if (tarval_is_null(get_Const_tarval(cond_expr))) { + jump_to_target(false_target); + } else { + jump_to_target(true_target); + } + } else { + dbg_info *dbgi = get_dbg_info(&expression->base.source_position); + ir_node *condition = create_conv(dbgi, cond_expr, mode_b); + ir_node *cond = new_d_Cond(dbgi, condition); + ir_node *true_proj = new_d_Proj(dbgi, cond, mode_X, pn_Cond_true); + ir_node *false_proj = new_d_Proj(dbgi, cond, mode_X, pn_Cond_false); + + /* set branch prediction info based on __builtin_expect */ + if (is_builtin_expect(expression) && is_Cond(cond)) { + call_argument_t *argument = expression->call.arguments->next; + if (is_constant_expression(argument->expression) == EXPR_CLASS_CONSTANT) { + bool const cnst = fold_constant_to_bool(argument->expression); + cond_jmp_predicate const pred = cnst ? COND_JMP_PRED_TRUE : COND_JMP_PRED_FALSE; + set_Cond_jmp_pred(cond, pred); + } } - } - - add_pred_to_jump_target(true_target, true_proj); - add_pred_to_jump_target(false_target, false_proj); + add_pred_to_jump_target(true_target, true_proj); + add_pred_to_jump_target(false_target, false_proj); + } set_unreachable_now(); return cond_expr; } @@ -3684,7 +3692,7 @@ static void advance_current_object(type_path_t *path) { if (path->invalid) { /* TODO: handle this... */ - panic("invalid initializer in ast2firm (excessive elements)"); + panic("invalid initializer (excessive elements)"); } type_path_entry_t *top = get_type_path_top(path); @@ -3826,6 +3834,7 @@ static ir_initializer_t *create_ir_initializer_string(initializer_t const *const char const * p = str->value.begin; switch (str->value.encoding) { case STRING_ENCODING_CHAR: + case STRING_ENCODING_UTF8: for (size_t i = 0; i != arr_len; ++i) { char const c = i < str_len ? *p++ : 0; ir_tarval *const tv = new_tarval_from_long(c, mode); @@ -3834,6 +3843,8 @@ static ir_initializer_t *create_ir_initializer_string(initializer_t const *const } break; + case STRING_ENCODING_CHAR16: + case STRING_ENCODING_CHAR32: case STRING_ENCODING_WIDE: for (size_t i = 0; i != arr_len; ++i) { utf32 const c = i < str_len ? read_utf8_char(&p) : 0; @@ -3861,7 +3872,7 @@ static ir_initializer_t *create_ir_initializer( return create_ir_initializer_value(&initializer->value); case INITIALIZER_DESIGNATOR: - panic("unexpected designator initializer found"); + panic("unexpected designator initializer"); } panic("unknown initializer"); } @@ -4010,7 +4021,7 @@ static void create_dynamic_initializer_sub(ir_initializer_t *initializer, } } - panic("invalid IR_INITIALIZER found"); + panic("invalid ir_initializer"); } static void create_dynamic_initializer(ir_initializer_t *initializer, @@ -4390,7 +4401,7 @@ static void create_local_declaration(entity_t *entity) case STORAGE_CLASS_TYPEDEF: break; } - panic("invalid storage class found"); + panic("invalid storage class"); } static void create_local_declarations(entity_t *e) @@ -4512,6 +4523,7 @@ static ir_node *do_while_statement_to_firm(do_while_statement_t *statement) init_jump_target(&body_target, NULL); jump_to_target(&body_target); enter_immature_jump_target(&body_target); + keep_loop(); statement_to_firm(statement->body); jump_to_target(&continue_target); if (enter_jump_target(&continue_target)) @@ -4548,6 +4560,7 @@ static ir_node *for_statement_to_firm(for_statement_t *statement) init_jump_target(&header_target, NULL); jump_to_target(&header_target); enter_immature_jump_target(&header_target); + keep_loop(); expression_t *const step = statement->step; PUSH_BREAK(NULL); @@ -4560,10 +4573,6 @@ static ir_node *for_statement_to_firm(for_statement_t *statement) init_jump_target(&body_target, NULL); create_condition_evaluation(cond, &body_target, &break_target); enter_jump_target(&body_target); - } else { - /* for-ever. */ - keep_alive(header_target.block); - keep_all_memory(header_target.block); } /* Create the loop body. */ @@ -4684,8 +4693,7 @@ static ir_node *label_to_firm(const label_statement_t *statement) enter_jump_target(&label->target); } else { enter_immature_jump_target(&label->target); - keep_alive(label->target.block); - keep_all_memory(label->target.block); + keep_loop(); } return statement_to_firm(statement->statement); @@ -4995,7 +5003,7 @@ jump: return NULL; } - case STATEMENT_ERROR: panic("error statement found"); + case STATEMENT_ERROR: panic("error statement"); } panic("statement not implemented"); } @@ -5217,6 +5225,7 @@ static void create_function(entity_t *entity) } if (enter_jump_target(&ijmp_target)) { + keep_loop(); size_t const n = ARR_LEN(ijmp_ops); ir_node *const op = n == 1 ? ijmp_ops[0] : new_Phi(n, ijmp_ops, get_irn_mode(ijmp_ops[0])); ir_node *const ijmp = new_IJmp(op); @@ -5348,8 +5357,7 @@ static void init_ir_types(void) return; ir_types_initialized = 1; - ir_type_char = get_ir_type(type_char); - ir_type_wchar_t = get_ir_type(type_wchar_t); + ir_type_char = get_ir_type(type_char); be_params = be_get_backend_param(); mode_float_arithmetic = be_params->mode_float_arithmetic;