//===--- Builtins.def - Builtin function info database ----------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the standard builtin function database. Users of this file // must define the BUILTIN macro to make use of this information. // //===----------------------------------------------------------------------===// // FIXME: this needs to be the full list supported by GCC. Right now, I'm just // adding stuff on demand. // // FIXME: This should really be a .td file, but that requires modifying tblgen. // Perhaps tblgen should have plugins. // The first value provided to the macro specifies the function name of the // builtin, and results in a clang::builtin::BIXX enum value for XX. // The second value provided to the macro specifies the type of the function // (result value, then each argument) as follows: // v -> void // c -> char // s -> short // i -> int // f -> float // d -> double // z -> size_t // F -> constant CFString // a -> __builtin_va_list // V -> Vector, following num elements and a base type. // . -> "...". This may only occur at the end of the function list. // // Types maybe prefixed with the following modifiers: // L -> long (e.g. Li for 'long int') // LL -> long long // S -> signed // U -> unsigned // // Types may be postfixed with the following modifiers: // * -> pointer // & -> reference // C -> const // The third value provided to the macro specifies information about attributes // of the function. These must be kept in sync with the predicates in the // Builtin::Context class. Currently we have: // n -> nothrow // c -> const // F -> this is a libc/libm function with a '__builtin_' prefix added. // Standard libc/libm functions: BUILTIN(__builtin_inf , "d" , "nc") BUILTIN(__builtin_inff , "f" , "nc") BUILTIN(__builtin_infl , "Ld" , "nc") BUILTIN(__builtin_abs , "ii" , "ncF") BUILTIN(__builtin_fabs , "dd" , "ncF") BUILTIN(__builtin_fabsf, "ff" , "ncF") BUILTIN(__builtin_fabsl, "LdLd", "ncF") BUILTIN(__builtin_huge_val, "d", "nc") // FP Comparisons. BUILTIN(__builtin_isgreater , "i.", "nc") BUILTIN(__builtin_isgreaterequal, "i.", "nc") BUILTIN(__builtin_isless , "i.", "nc") BUILTIN(__builtin_islessequal , "i.", "nc") BUILTIN(__builtin_islessgreater , "i.", "nc") BUILTIN(__builtin_isunordered , "i.", "nc") // Builtins for arithmetic. BUILTIN(__builtin_clz , "iUi" , "nc") BUILTIN(__builtin_clzl , "iULi" , "nc") BUILTIN(__builtin_clzll, "iULLi", "nc") // TODO: int clzimax(uintmax_t) BUILTIN(__builtin_ctz , "iUi" , "nc") BUILTIN(__builtin_ctzl , "iULi" , "nc") BUILTIN(__builtin_ctzll, "iULLi", "nc") // TODO: int ctzimax(uintmax_t) // FIXME: These type signatures are not correct for targets with int != 32-bits // or with ULL != 64-bits. BUILTIN(__builtin_bswap32, "UiUi", "nc") BUILTIN(__builtin_bswap64, "ULLiULLi", "nc") // Random GCC builtins BUILTIN(__builtin_constant_p, "UsUs", "nc") BUILTIN(__builtin_classify_type, "i.", "nc") BUILTIN(__builtin___CFStringMakeConstantString, "FC*cC*", "nc") BUILTIN(__builtin_va_start, "va&.", "n") BUILTIN(__builtin_va_end, "va&", "n") BUILTIN(__builtin_va_copy, "va&a", "n") BUILTIN(__builtin_memcpy, "v*v*vC*z", "n") BUILTIN(__builtin_expect, "iii" , "nc") BUILTIN(__builtin_alloca, "v*z" , "n") // Atomic operators builtin. BUILTIN(__sync_fetch_and_add,"ii*i", "n") BUILTIN(__sync_fetch_and_sub,"ii*i", "n") BUILTIN(__sync_fetch_and_min,"ii*i", "n") BUILTIN(__sync_fetch_and_max,"ii*i", "n") BUILTIN(__sync_fetch_and_umin,"UiUi*Ui", "n") BUILTIN(__sync_fetch_and_umax,"UiUi*Ui", "n") BUILTIN(__sync_fetch_and_and,"ii*i", "n") BUILTIN(__sync_fetch_and_or,"ii*i", "n") BUILTIN(__sync_fetch_and_xor,"ii*i", "n") BUILTIN(__sync_lock_test_and_set,"ii*i", "n") BUILTIN(__sync_val_compare_and_swap,"ii*ii", "n") #undef BUILTIN