X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast2firm.c;h=9c122bdd2217f9519977392cafe41947080e0760;hb=1d51f4713f89ec9250425dabd347d452e431dd52;hp=4156376fbd6d6f78f1a3408b3d9f4360ce4124c1;hpb=b3c999c59e9cc7773e7bdff943315cd940beaf80;p=cparser diff --git a/ast2firm.c b/ast2firm.c index 4156376..9c122bd 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -129,7 +129,7 @@ static void enqueue_inner_function(entity_t *entity) ARR_APP1(entity_t*, inner_functions, entity); } -ir_node *uninitialized_local_var(ir_graph *irg, ir_mode *mode, int pos) +static ir_node *uninitialized_local_var(ir_graph *irg, ir_mode *mode, int pos) { const entity_t *entity = get_irg_loc_description(irg, pos); @@ -868,11 +868,11 @@ static const struct { { rts_strncmp, 1, "strncmp", 3, _C89 }, { rts_strcpy, 1, "strcpy", 2, _C89 }, { rts_strlen, 1, "strlen", 1, _C89 }, - { rts_memcpy, 1, "memcpy", 3, _C89 }, /* HMM, man say its C99 */ + { rts_memcpy, 1, "memcpy", 3, _C89 }, { rts_mempcpy, 1, "mempcpy", 3, _GNUC }, - { rts_memmove, 1, "memmove", 3, _C89 }, /* HMM, man say its C99 */ - { rts_memset, 1, "memset", 3, _C89 }, /* HMM, man say its C99 */ - { rts_memcmp, 1, "memcmp", 3, _C89 }, /* HMM, man say its C99 */ + { rts_memmove, 1, "memmove", 3, _C89 }, + { rts_memset, 1, "memset", 3, _C89 }, + { rts_memcmp, 1, "memcmp", 3, _C89 }, }; static ident *rts_idents[lengthof(rts_data)]; @@ -1026,6 +1026,22 @@ static ir_entity *get_function_entity(entity_t *entity, ir_type *owner_type) if (id != rts_idents[i]) continue; + function_type_t *function_type + = &entity->declaration.type->function; + /* rts_entities code can't handle a "wrong" number of parameters */ + if (function_type->unspecified_parameters) + continue; + + /* check number of parameters */ + int n_params = count_parameters(function_type); + if (n_params != rts_data[i].n_params) + continue; + + type_t *return_type = skip_typeref(function_type->return_type); + int n_res = return_type != type_void ? 1 : 0; + if (n_res != rts_data[i].n_res) + continue; + /* ignore those rts functions not necessary needed for current mode */ if ((c_mode & rts_data[i].flags) == 0) continue; @@ -4256,7 +4272,7 @@ static void create_dynamic_initializer_sub(ir_initializer_t *initializer, return; } case IR_INITIALIZER_COMPOUND: { - assert(is_compound_type(type)); + assert(is_compound_type(type) || is_Array_type(type)); int n_members; if (is_Array_type(type)) { assert(has_array_upper_bound(type, 0)); @@ -5475,7 +5491,7 @@ static void asm_statement_to_firm(const asm_statement_t *statement) /* create output projs & connect them */ if (needs_memory) { - ir_node *projm = new_Proj(node, mode_M, out_size+1); + ir_node *projm = new_Proj(node, mode_M, out_size); set_store(projm); } @@ -5643,13 +5659,12 @@ static void initialize_function_parameters(entity_t *entity) assert(entity->kind == ENTITY_FUNCTION); ir_graph *irg = current_ir_graph; ir_node *args = get_irg_args(irg); - ir_node *start_block = get_irg_start_block(irg); ir_type *function_irtype = get_ir_type(entity->declaration.type); int first_param_nr = 0; if (entity->function.need_closure) { /* add an extra parameter for the static link */ - entity->function.static_link = new_r_Proj(start_block, args, mode_P_data, 0); + entity->function.static_link = new_r_Proj(args, mode_P_data, 0); ++first_param_nr; } @@ -5683,7 +5698,7 @@ static void initialize_function_parameters(entity_t *entity) ir_mode *param_mode = get_type_mode(param_irtype); long pn = n + first_param_nr; - ir_node *value = new_r_Proj(start_block, args, param_mode, pn); + ir_node *value = new_r_Proj(args, param_mode, pn); ir_mode *mode = get_ir_mode_storage(type); value = create_conv(NULL, value, mode); @@ -6063,6 +6078,7 @@ void translation_unit_to_firm(translation_unit_t *unit) { /* initialize firm arithmetic */ tarval_set_integer_overflow_mode(TV_OVERFLOW_WRAP); + ir_set_uninitialized_local_variable_func(uninitialized_local_var); /* just to be sure */ continue_label = NULL;