some more builtins
authorMatthias Braun <matze@braunis.de>
Thu, 17 Jun 2010 10:26:26 +0000 (10:26 +0000)
committerMatthias Braun <matze@braunis.de>
Thu, 17 Jun 2010 10:26:26 +0000 (10:26 +0000)
[r27632]

ast2firm.c
builtins.c
builtins.h
types.c
types.h

index 9c122bd..ae5023c 100644 (file)
@@ -1763,7 +1763,7 @@ static ir_node *process_builtin_call(const call_expression_t *call)
        type_t *type = skip_typeref(builtin->base.type);
        assert(is_type_pointer(type));
 
-       type_t   *function_type = skip_typeref(type->pointer.points_to);
+       type_t *function_type = skip_typeref(type->pointer.points_to);
 
        switch (builtin->entity->function.btk) {
        case bk_gnu_builtin_alloca: {
@@ -1832,7 +1832,6 @@ static ir_node *process_builtin_call(const call_expression_t *call)
                }
        }
        case bk_gnu_builtin_return_address: {
-
                expression_t *const expression = call->arguments->expression;
                ir_node *in[2];
 
@@ -1963,6 +1962,7 @@ static ir_node *call_expression_to_firm(const call_expression_t *const call)
                                return process_builtin_call(call);
                        }
 
+#if 0
                        if (irentity == rts_entities[rts_alloca]) {
                                /* handle alloca() call */
                                expression_t *argument = call->arguments->expression;
@@ -1980,6 +1980,7 @@ static ir_node *call_expression_to_firm(const call_expression_t *const call)
 
                                return res;
                        }
+#endif
                }
        }
        ir_node *callee = expression_to_firm(function);
index 1109c25..9c40e08 100644 (file)
@@ -75,15 +75,19 @@ void create_gnu_builtins(void)
        GNU_BUILTIN(abs,            make_function_type(type_int, 1, (type_t *[]) { type_int }, DM_CONST));
        GNU_BUILTIN(labs,           make_function_type(type_long, 1, (type_t *[]) { type_long }, DM_CONST));
        GNU_BUILTIN(llabs,          make_function_type(type_long_long, 1, (type_t *[]) { type_long_long }, DM_CONST));
-       GNU_BUILTIN(memcpy,         make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr_restrict, type_void_ptr_restrict, type_size_t }, DM_NONE));
-       GNU_BUILTIN(__memcpy_chk,   make_function_type(type_void_ptr, 4, (type_t *[]) { type_void_ptr_restrict, type_void_ptr_restrict, type_size_t, type_size_t}, DM_NONE));
-       GNU_BUILTIN(exit,           make_function_type(type_void, 1, (type_t *[]) { type_int }, DM_NORETURN));
-       GNU_BUILTIN(malloc,         make_function_type(type_void_ptr, 1, (type_t *[]) { type_size_t }, DM_MALLOC));
+       GNU_BUILTIN(memcpy,         make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr_restrict, type_const_void_ptr_restrict, type_size_t }, DM_NONE));
+       GNU_BUILTIN(__memcpy_chk,   make_function_type(type_void_ptr, 4, (type_t *[]) { type_void_ptr_restrict, type_const_void_ptr_restrict, type_size_t, type_size_t}, DM_NONE));
        GNU_BUILTIN(memcmp,         make_function_type(type_int, 3, (type_t *[]) { type_const_void_ptr, type_const_void_ptr, type_size_t }, DM_PURE));
        GNU_BUILTIN(memset,         make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr, type_int, type_size_t }, DM_NONE));
+       GNU_BUILTIN(memmove,        make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr_restrict, type_const_void_ptr_restrict, type_size_t }, DM_NONE));
+       GNU_BUILTIN(strcat,         make_function_type(type_char_ptr, 2, (type_t *[]) { type_char_ptr_restrict, type_const_char_ptr_restrict }, DM_NONE));
+       GNU_BUILTIN(strcat,         make_function_type(type_char_ptr, 3, (type_t *[]) { type_char_ptr_restrict, type_const_char_ptr_restrict, type_size_t }, DM_NONE));
        GNU_BUILTIN(strlen,         make_function_type(type_size_t, 1, (type_t *[]) { type_const_char_ptr }, DM_PURE));
        GNU_BUILTIN(strcmp,         make_function_type(type_int, 2, (type_t *[]) { type_const_char_ptr, type_const_char_ptr }, DM_PURE));
        GNU_BUILTIN(strcpy,         make_function_type(type_char_ptr, 2, (type_t *[]) { type_char_ptr_restrict, type_const_char_ptr_restrict }, DM_NONE));
+       GNU_BUILTIN(strncpy,        make_function_type(type_char_ptr, 3, (type_t *[]) { type_char_ptr_restrict, type_char_ptr_restrict, type_size_t }, DM_NONE));
+       GNU_BUILTIN(exit,           make_function_type(type_void, 1, (type_t *[]) { type_int }, DM_NORETURN));
+       GNU_BUILTIN(malloc,         make_function_type(type_void_ptr, 1, (type_t *[]) { type_size_t }, DM_MALLOC));
 
        /* TODO: gcc has a LONG list of builtin functions (nearly everything from
         * C89-C99 and others. Complete this */
@@ -94,18 +98,22 @@ void create_gnu_builtins(void)
 static const char *get_builtin_replacement_name(builtin_kind_t kind)
 {
        switch (kind) {
-       case bk_gnu_builtin_abort:  return "abort";
-       case bk_gnu_builtin_abs:    return "abs";
-       case bk_gnu_builtin_labs:   return "labs";
-       case bk_gnu_builtin_llabs:  return "llabs";
-       case bk_gnu_builtin_exit:   return "exit";
-       case bk_gnu_builtin_malloc: return "malloc";
-       case bk_gnu_builtin_memcmp: return "memcmp";
-       case bk_gnu_builtin_memcpy: return "memcpy";
-       case bk_gnu_builtin_memset: return "memset";
-       case bk_gnu_builtin_strlen: return "strlen";
-       case bk_gnu_builtin_strcmp: return "strcmp";
-       case bk_gnu_builtin_strcpy: return "strcpy";
+       case bk_gnu_builtin_abort:        return "abort";
+       case bk_gnu_builtin_abs:          return "abs";
+       case bk_gnu_builtin_labs:         return "labs";
+       case bk_gnu_builtin_llabs:        return "llabs";
+       case bk_gnu_builtin_exit:         return "exit";
+       case bk_gnu_builtin_malloc:       return "malloc";
+       case bk_gnu_builtin_memcmp:       return "memcmp";
+       case bk_gnu_builtin_memcpy:       return "memcpy";
+       case bk_gnu_builtin___memcpy_chk: return "memcpy";
+       case bk_gnu_builtin_memset:       return "memset";
+       case bk_gnu_builtin_memmove:      return "memmove";
+       case bk_gnu_builtin_strlen:       return "strlen";
+       case bk_gnu_builtin_strcmp:       return "strcmp";
+       case bk_gnu_builtin_strcpy:       return "strcpy";
+       case bk_gnu_builtin_strcat:       return "strcat";
+       case bk_gnu_builtin_strncat:      return "strncat";
 
        default:
                break;
@@ -113,6 +121,16 @@ static const char *get_builtin_replacement_name(builtin_kind_t kind)
        return NULL;
 }
 
+int get_builtin_chk_arg_pos(builtin_kind_t kind)
+{
+       switch (kind) {
+       case bk_gnu_builtin___memcpy_chk: return 3;
+       default:
+               break;
+       }
+       return -1;
+}
+
 entity_t *get_builtin_replacement(const entity_t *builtin_entity)
 {
        builtin_kind_t  kind        = builtin_entity->function.btk;
index 6170ad5..a246538 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef BUILTINS_H
 #define BUILTINS_H
 
+#include <stdbool.h>
+
 /**
  * GNU builtin or MS intrinsic functions.
  */
@@ -56,10 +58,14 @@ typedef enum builtin_kind_t {
        bk_gnu_builtin_memcmp,
        bk_gnu_builtin_memcpy,
        bk_gnu_builtin___memcpy_chk,
+       bk_gnu_builtin_memmove,
        bk_gnu_builtin_memset,
        bk_gnu_builtin_strlen,
        bk_gnu_builtin_strcmp,
        bk_gnu_builtin_strcpy,
+       bk_gnu_builtin_strncpy,
+       bk_gnu_builtin_strcat,
+       bk_gnu_builtin_strncat,
 
        bk_ms_rotl,
        bk_ms_rotr,
@@ -107,4 +113,6 @@ void create_microsoft_intrinsics(void);
  */
 entity_t *get_builtin_replacement(const entity_t *builtin_entity);
 
+int get_builtin_chk_arg_pos(builtin_kind_t kind);
+
 #endif
diff --git a/types.c b/types.c
index 0c71f81..e62c07f 100644 (file)
--- a/types.c
+++ b/types.c
@@ -56,6 +56,7 @@ type_t *type_signed_char_ptr;
 type_t *type_void_ptr;
 type_t *type_const_void_ptr;
 type_t *type_void_ptr_restrict;
+type_t *type_const_void_ptr_restrict;
 
 type_t *type_char_ptr_ptr;
 
@@ -149,6 +150,8 @@ void init_basic_types(void)
        type_void_ptr           = make_pointer_type(type_void,              TYPE_QUALIFIER_NONE);
        type_const_void_ptr     = make_pointer_type(type_void,              TYPE_QUALIFIER_CONST);
        type_void_ptr_restrict  = make_pointer_type(type_void,              TYPE_QUALIFIER_RESTRICT);
+       type_const_void_ptr_restrict
+                               = make_pointer_type(type_void,              TYPE_QUALIFIER_CONST | TYPE_QUALIFIER_RESTRICT);
        type_char_ptr           = make_pointer_type(type_char,              TYPE_QUALIFIER_NONE);
        type_char_ptr_restrict  = make_pointer_type(type_char,              TYPE_QUALIFIER_RESTRICT);
        type_signed_char_ptr    = make_pointer_type(type_signed_char,       TYPE_QUALIFIER_NONE);
diff --git a/types.h b/types.h
index ca61283..f6ff56b 100644 (file)
--- a/types.h
+++ b/types.h
@@ -55,6 +55,7 @@ extern type_t *type_signed_char_ptr;
 extern type_t *type_void_ptr;
 extern type_t *type_const_void_ptr;
 extern type_t *type_void_ptr_restrict;
+extern type_t *type_const_void_ptr_restrict;
 
 extern type_t *type_char_ptr_ptr;