X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=builtins.c;h=e4f24f1185f39c9ea9b550978325c2a58a1c66dc;hb=10842603c042d3c62f128519d6356b3817b6a0db;hp=d15a982fc259857e1e814c72277b15547d84792b;hpb=ae5d6284021fcad759cb0b9099651267fffcc770;p=cparser diff --git a/builtins.c b/builtins.c index d15a982..e4f24f1 100644 --- a/builtins.c +++ b/builtins.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "adt/strutil.h" #include "type_t.h" #include "types.h" #include "entity_t.h" @@ -31,7 +32,7 @@ static entity_t *create_builtin_function(builtin_kind_t kind, symbol_t *symbol, type_t *function_type) { - entity_t *const entity = allocate_entity_zero(ENTITY_FUNCTION, NAMESPACE_NORMAL, symbol); + entity_t *const entity = allocate_entity_zero(ENTITY_FUNCTION, NAMESPACE_NORMAL, symbol, &builtin_source_position); entity->declaration.storage_class = STORAGE_CLASS_EXTERN; entity->declaration.declared_storage_class = STORAGE_CLASS_EXTERN; entity->declaration.type = function_type; @@ -112,29 +113,34 @@ void create_gnu_builtins(void) entity_t *(*f)(ir_builtin_kind,const char*,type_t*) = create_gnu_builtin_firm; - f(ir_bk_return_address, "return_address", make_function_1_type(type_void_ptr, type_unsigned_int, DM_NONE)); - f(ir_bk_frame_address, "frame_address", make_function_1_type(type_void_ptr, type_unsigned_int, DM_NONE)); - f(ir_bk_ffs, "ffs", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); - f(ir_bk_ffs, "ffsl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); - f(ir_bk_ffs, "ffsll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); + f(ir_bk_bswap, "bswap32", make_function_1_type(type_int32_t, type_int32_t, DM_CONST)); + f(ir_bk_bswap, "bswap64", make_function_1_type(type_int64_t, type_int64_t, DM_CONST)); f(ir_bk_clz, "clz", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_clz, "clzl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_clz, "clzll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_ctz, "ctz", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_ctz, "ctzl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_ctz, "ctzll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); - f(ir_bk_popcount, "popcount", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); - f(ir_bk_popcount, "popcountl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); - f(ir_bk_popcount, "popcountll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); + f(ir_bk_ffs, "ffs", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); + f(ir_bk_ffs, "ffsl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); + f(ir_bk_ffs, "ffsll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); + f(ir_bk_frame_address, "frame_address", make_function_1_type(type_void_ptr, type_unsigned_int, DM_NONE)); f(ir_bk_parity, "parity", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_parity, "parityl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_parity, "parityll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); + f(ir_bk_popcount, "popcount", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); + f(ir_bk_popcount, "popcountl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); + f(ir_bk_popcount, "popcountll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_prefetch, "prefetch", make_function_1_type_variadic(type_float, type_void_ptr, DM_NONE)); + f(ir_bk_return_address, "return_address", make_function_1_type(type_void_ptr, type_unsigned_int, DM_NONE)); f(ir_bk_trap, "trap", make_function_type(type_void, 0, NULL, DM_NORETURN)); entity_t *(*l)(const char*,type_t*) = create_gnu_builtin_libc; l("abort", make_function_type(type_void, 0, NULL, DM_NORETURN)); l("abs", make_function_type(type_int, 1, (type_t *[]) { type_int }, DM_CONST)); + l("fabs", make_function_type(type_double, 1, (type_t *[]) { type_double }, DM_CONST)); + l("fabsf", make_function_type(type_float, 1, (type_t *[]) { type_float }, DM_CONST)); + l("fabsl", make_function_type(type_long_double, 1, (type_t *[]) { type_long_double }, DM_CONST)); l("labs", make_function_type(type_long, 1, (type_t *[]) { type_long }, DM_CONST)); l("llabs", make_function_type(type_long_long, 1, (type_t *[]) { type_long_long }, DM_CONST)); l("memcpy", make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr_restrict, type_const_void_ptr_restrict, type_size_t }, DM_NONE)); @@ -234,7 +240,7 @@ void adapt_special_functions(function_t *function) /* Disregard prefix _, __, __x or __builtin_. */ if (name[0] == '_') { - if (!strncmp(name + 3, "uiltin_", 7)) + if (strstart(name + 1, "_builtin_")) name += 10; else if (name[1] == '_' && name[2] == 'x') name += 3; @@ -245,22 +251,22 @@ void adapt_special_functions(function_t *function) } if (name[0] == 's') { - if ((name[1] == 'e' && (!strcmp(name, "setjmp") - || !strcmp(name, "setjmp_syscall"))) - || (name[1] == 'i' && !strcmp(name, "sigsetjmp")) - || (name[1] == 'a' && !strcmp(name, "savectx"))) { + if ((name[1] == 'e' && (streq(name, "setjmp") + || streq(name, "setjmp_syscall"))) + || (name[1] == 'i' && streq(name, "sigsetjmp")) + || (name[1] == 'a' && streq(name, "savectx"))) { function->base.type = add_type_modifier(function->base.type, DM_RETURNS_TWICE); - } else if (name[1] == 'i' && !strcmp(name, "siglongjmp")) { + } else if (name[1] == 'i' && streq(name, "siglongjmp")) { function->base.type = add_type_modifier(function->base.type, DM_NORETURN); } - } else if ((name[0] == 'q' && !strcmp(name, "qsetjmp")) - || (name[0] == 'v' && !strcmp(name, "vfork")) - || (name[0] == 'g' && !strcmp(name, "getcontext"))) { + } else if ((name[0] == 'q' && streq(name, "qsetjmp")) + || (name[0] == 'v' && streq(name, "vfork")) + || (name[0] == 'g' && streq(name, "getcontext"))) { function->base.type = add_type_modifier(function->base.type, DM_RETURNS_TWICE); - } else if (name[0] == 'l' && !strcmp(name, "longjmp")) { + } else if (name[0] == 'l' && streq(name, "longjmp")) { function->base.type = add_type_modifier(function->base.type, DM_NORETURN); }