firm backend is not optional anymore
[cparser] / ast2firm.c
index 12764a8..9c122bd 100644 (file)
@@ -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);
        }
 
@@ -6062,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;