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);
{ 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)];
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;
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));
/* 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);
}
{
/* 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;