diff options
Diffstat (limited to 'include/clang/AST')
-rw-r--r-- | include/clang/AST/ASTContext.h | 29 | ||||
-rw-r--r-- | include/clang/AST/ASTDiagnostic.h | 2 | ||||
-rw-r--r-- | include/clang/AST/Attr.h | 8 | ||||
-rw-r--r-- | include/clang/AST/Builtins.def | 407 | ||||
-rw-r--r-- | include/clang/AST/Builtins.h | 137 | ||||
-rw-r--r-- | include/clang/AST/DeclBase.h | 6 | ||||
-rw-r--r-- | include/clang/AST/DeclTemplate.h | 51 | ||||
-rw-r--r-- | include/clang/AST/PPCBuiltins.def | 24 | ||||
-rw-r--r-- | include/clang/AST/Stmt.h | 13 | ||||
-rw-r--r-- | include/clang/AST/TargetBuiltins.h | 38 | ||||
-rw-r--r-- | include/clang/AST/X86Builtins.def | 295 |
11 files changed, 80 insertions, 930 deletions
diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index b02faa8ff378..f4313f4dbfff 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -17,13 +17,11 @@ #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/LangOptions.h" #include "clang/AST/Attr.h" -#include "clang/AST/Builtins.h" #include "clang/AST/Decl.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/PrettyPrinter.h" #include "clang/AST/TemplateName.h" #include "clang/AST/Type.h" -#include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/OwningPtr.h" @@ -56,6 +54,8 @@ namespace clang { class ObjCIvarRefExpr; class ObjCIvarDecl; + namespace Builtin { class Context; } + /// ASTContext - This class holds long-lived AST nodes (such as types and /// decls) that can be referred to throughout the semantic analysis of a file. class ASTContext { @@ -142,6 +142,7 @@ public: TargetInfo &Target; IdentifierTable &Idents; SelectorTable &Selectors; + Builtin::Context &BuiltinInfo; DeclarationNameTable DeclarationNames; llvm::OwningPtr<ExternalASTSource> ExternalSource; clang::PrintingPolicy PrintingPolicy; @@ -164,7 +165,6 @@ public: TranslationUnitDecl *getTranslationUnitDecl() const { return TUDecl; } - Builtin::Context BuiltinInfo; // Builtin Types. QualType VoidTy; @@ -181,21 +181,12 @@ public: QualType DependentTy; ASTContext(const LangOptions& LOpts, SourceManager &SM, TargetInfo &t, - IdentifierTable &idents, SelectorTable &sels, - bool FreeMemory = true, unsigned size_reserve=0, - bool InitializeBuiltins = true); + IdentifierTable &idents, SelectorTable &sels, + Builtin::Context &builtins, + bool FreeMemory = true, unsigned size_reserve=0); ~ASTContext(); - /// \brief Initialize builtins. - /// - /// Typically, this routine will be called automatically by the - /// constructor. However, in certain cases (e.g., when there is a - /// PCH file to be loaded), the constructor does not perform - /// initialization for builtins. This routine can be called to - /// perform the initialization. - void InitializeBuiltins(IdentifierTable &idents); - /// \brief Attach an external AST source to the AST context. /// /// The external AST source provides the ability to load parts of @@ -455,6 +446,14 @@ public: TemplateName getDependentTemplateName(NestedNameSpecifier *NNS, const IdentifierInfo *Name); + enum GetBuiltinTypeError { + GE_None, //< No error + GE_Missing_FILE //< Missing the FILE type from <stdio.h> + }; + + /// GetBuiltinType - Return the type for the specified builtin. + QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error); + private: QualType getFromTargetType(unsigned Type) const; diff --git a/include/clang/AST/ASTDiagnostic.h b/include/clang/AST/ASTDiagnostic.h index 244ca9e10f3a..e9f150574b05 100644 --- a/include/clang/AST/ASTDiagnostic.h +++ b/include/clang/AST/ASTDiagnostic.h @@ -15,7 +15,7 @@ namespace clang { namespace diag { enum { -#define DIAG(ENUM,FLAGS,DEFAULT_MAPPING,DESC,GROUP) ENUM, +#define DIAG(ENUM,FLAGS,DEFAULT_MAPPING,DESC,GROUP,SFINAE) ENUM, #define ASTSTART #include "clang/Basic/DiagnosticASTKinds.inc" #undef DIAG diff --git a/include/clang/AST/Attr.h b/include/clang/AST/Attr.h index 0427f0003a3a..a5b7ad4ca382 100644 --- a/include/clang/AST/Attr.h +++ b/include/clang/AST/Attr.h @@ -24,10 +24,16 @@ namespace clang { } -// Defined in ASTContext.cpp +// Defined in ASTContext.h void *operator new(size_t Bytes, clang::ASTContext &C, size_t Alignment = 16) throw (); +// It is good practice to pair new/delete operators. Also, MSVC gives many +// warnings if a matching delete overload is not declared, even though the +// throw() spec guarantees it will not be implicitly called. +void operator delete(void *Ptr, clang::ASTContext &C, size_t) + throw (); + namespace clang { /// Attr - This represents one attribute. diff --git a/include/clang/AST/Builtins.def b/include/clang/AST/Builtins.def deleted file mode 100644 index c2f4061c5d78..000000000000 --- a/include/clang/AST/Builtins.def +++ /dev/null @@ -1,407 +0,0 @@ -//===--- 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 -// b -> boolean -// c -> char -// s -> short -// i -> int -// f -> float -// d -> double -// z -> size_t -// F -> constant CFString -// a -> __builtin_va_list -// A -> "reference" to __builtin_va_list -// V -> Vector, following num elements and a base type. -// P -> FILE -// . -> "...". 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 -// LLL -> __int128_t (e.g. LLLi) -// 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. -// f -> this is a libc/libm function without the '__builtin_' prefix. It can -// be followed by ':headername:' to state which header this function -// comes from. -// p:N: -> this is a printf-like function whose Nth argument is the format -// string. -// P:N: -> similar to the p:N: attribute, but the function is like vprintf -// in that it accepts its arguments as a va_list rather than -// through an ellipsis -// e -> const, but only when -fmath-errno=0 -// FIXME: gcc has nonnull - -#if defined(BUILTIN) && !defined(LIBBUILTIN) -# define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) BUILTIN(ID, TYPE, ATTRS) -#endif - -// Standard libc/libm functions: -BUILTIN(__builtin_huge_val, "d", "nc") -BUILTIN(__builtin_huge_valf, "f", "nc") -BUILTIN(__builtin_huge_vall, "Ld", "nc") -BUILTIN(__builtin_inf , "d" , "nc") -BUILTIN(__builtin_inff , "f" , "nc") -BUILTIN(__builtin_infl , "Ld" , "nc") -BUILTIN(__builtin_nan, "dcC*" , "ncF") -BUILTIN(__builtin_nanf, "fcC*" , "ncF") -BUILTIN(__builtin_nanl, "LdcC*", "ncF") -BUILTIN(__builtin_nans, "dcC*" , "ncF") -BUILTIN(__builtin_nansf, "fcC*" , "ncF") -BUILTIN(__builtin_nansl, "LdcC*", "ncF") -BUILTIN(__builtin_abs , "ii" , "ncF") -BUILTIN(__builtin_fabs , "dd" , "ncF") -BUILTIN(__builtin_fabsf, "ff" , "ncF") -BUILTIN(__builtin_fabsl, "LdLd", "ncF") -BUILTIN(__builtin_copysign, "ddd", "ncF") -BUILTIN(__builtin_copysignf, "fff", "ncF") -BUILTIN(__builtin_copysignl, "LdLdLd", "ncF") -BUILTIN(__builtin_powi , "ddi" , "nc") -BUILTIN(__builtin_powif, "ffi" , "nc") -BUILTIN(__builtin_powil, "LdLdi", "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) -BUILTIN(__builtin_ffs , "iUi" , "nc") -BUILTIN(__builtin_ffsl , "iULi" , "nc") -BUILTIN(__builtin_ffsll, "iULLi", "nc") -BUILTIN(__builtin_parity , "iUi" , "nc") -BUILTIN(__builtin_parityl , "iULi" , "nc") -BUILTIN(__builtin_parityll, "iULLi", "nc") -BUILTIN(__builtin_popcount , "iUi" , "nc") -BUILTIN(__builtin_popcountl , "iULi" , "nc") -BUILTIN(__builtin_popcountll, "iULLi", "nc") - -// 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, "Us.", "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, "vAA", "n") -BUILTIN(__builtin_stdarg_start, "vA.", "n") -BUILTIN(__builtin_bcmp, "iv*v*z", "n") -BUILTIN(__builtin_bcopy, "vv*v*z", "n") -BUILTIN(__builtin_bzero, "vv*z", "n") -BUILTIN(__builtin_memcmp, "ivC*vC*z", "nF") -BUILTIN(__builtin_memcpy, "v*v*vC*z", "nF") -BUILTIN(__builtin_memmove, "v*v*vC*z", "nF") -BUILTIN(__builtin_mempcpy, "v*v*vC*z", "nF") -BUILTIN(__builtin_memset, "v*v*iz", "nF") -BUILTIN(__builtin_stpcpy, "c*c*cC*", "nF") -BUILTIN(__builtin_stpncpy, "c*c*cC*z", "nF") -BUILTIN(__builtin_strcasecmp, "icC*cC*", "nF") -BUILTIN(__builtin_strcat, "c*c*cC*", "nF") -BUILTIN(__builtin_strchr, "c*cC*i", "nF") -BUILTIN(__builtin_strcmp, "icC*cC*", "nF") -BUILTIN(__builtin_strcpy, "c*c*cC*", "nF") -BUILTIN(__builtin_strcspn, "zcC*cC*", "nF") -BUILTIN(__builtin_strdup, "c*cC*", "nF") -BUILTIN(__builtin_strlen, "zcC*", "nF") -BUILTIN(__builtin_strncasecmp, "icC*cC*z", "nF") -BUILTIN(__builtin_strncat, "c*c*cC*z", "nF") -BUILTIN(__builtin_strncmp, "icC*cC*z", "nF") -BUILTIN(__builtin_strncpy, "c*c*cC*z", "nF") -BUILTIN(__builtin_strndup, "c*cC*z", "nF") -BUILTIN(__builtin_strpbrk, "c*cC*cC*", "nF") -BUILTIN(__builtin_strrchr, "c*cC*i", "nF") -BUILTIN(__builtin_strspn, "zcC*cC*", "nF") -BUILTIN(__builtin_strstr, "c*cC*cC*", "nF") -BUILTIN(__builtin_return_address, "v*Ui", "n") -BUILTIN(__builtin_extract_return_addr, "v*v*", "n") -BUILTIN(__builtin_frame_address, "v*Ui", "n") -BUILTIN(__builtin_flt_rounds, "i", "nc") -BUILTIN(__builtin_setjmp, "iv**", "") -BUILTIN(__builtin_longjmp, "vv**i", "") -BUILTIN(__builtin_unwind_init, "v", "") - -// GCC Object size checking builtins -BUILTIN(__builtin_object_size, "zv*i", "n") -BUILTIN(__builtin___memcpy_chk, "v*v*vC*zz", "nF") -BUILTIN(__builtin___memmove_chk, "v*v*vC*zz", "nF") -BUILTIN(__builtin___mempcpy_chk, "v*v*vC*zz", "nF") -BUILTIN(__builtin___memset_chk, "v*v*izz", "nF") -BUILTIN(__builtin___stpcpy_chk, "c*c*cC*z", "nF") -BUILTIN(__builtin___strcat_chk, "c*c*cC*z", "nF") -BUILTIN(__builtin___strcpy_chk, "c*c*cC*z", "nF") -BUILTIN(__builtin___strncat_chk, "c*c*cC*zz", "nF") -BUILTIN(__builtin___strncpy_chk, "c*c*cC*zz", "nF") -BUILTIN(__builtin___snprintf_chk, "ic*zizcC*.", "Fp:4:") -BUILTIN(__builtin___sprintf_chk, "ic*izcC*.", "Fp:3:") -BUILTIN(__builtin___vsnprintf_chk, "ic*zizcC*a", "FP:4:") -BUILTIN(__builtin___vsprintf_chk, "ic*izcC*a", "FP:3:") -BUILTIN(__builtin___fprintf_chk, "iP*icC*.", "Fp:2:") -BUILTIN(__builtin___printf_chk, "iicC*.", "Fp:1:") -BUILTIN(__builtin___vfprintf_chk, "iP*icC*a", "FP:2:") -BUILTIN(__builtin___vprintf_chk, "iicC*a", "FP:1:") - -BUILTIN(__builtin_expect, "iii" , "nc") -BUILTIN(__builtin_prefetch, "vvC*.", "nc") -BUILTIN(__builtin_trap, "v", "n") - -BUILTIN(__builtin_shufflevector, "v." , "nc") - -BUILTIN(__builtin_alloca, "v*z" , "n") - -// "Overloaded" Atomic operator builtins. These are overloaded to support data -// types of i8, i16, i32, i64, and i128. The front-end sees calls to the -// non-suffixed version of these (which has a bogus type) and transforms them to -// the right overloaded version in Sema (plus casts). - -// FIXME: These assume that char -> i8, short -> i16, int -> i32, -// long long -> i64. - -BUILTIN(__sync_fetch_and_add, "v.", "") -BUILTIN(__sync_fetch_and_add_1, "cc*c.", "n") -BUILTIN(__sync_fetch_and_add_2, "ss*s.", "n") -BUILTIN(__sync_fetch_and_add_4, "ii*i.", "n") -BUILTIN(__sync_fetch_and_add_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_fetch_and_add_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_fetch_and_sub, "v.", "") -BUILTIN(__sync_fetch_and_sub_1, "cc*c.", "n") -BUILTIN(__sync_fetch_and_sub_2, "ss*s.", "n") -BUILTIN(__sync_fetch_and_sub_4, "ii*i.", "n") -BUILTIN(__sync_fetch_and_sub_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_fetch_and_sub_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_fetch_and_or, "v.", "") -BUILTIN(__sync_fetch_and_or_1, "cc*c.", "n") -BUILTIN(__sync_fetch_and_or_2, "ss*s.", "n") -BUILTIN(__sync_fetch_and_or_4, "ii*i.", "n") -BUILTIN(__sync_fetch_and_or_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_fetch_and_or_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_fetch_and_and, "v.", "") -BUILTIN(__sync_fetch_and_and_1, "cc*c.", "n") -BUILTIN(__sync_fetch_and_and_2, "ss*s.", "n") -BUILTIN(__sync_fetch_and_and_4, "ii*i.", "n") -BUILTIN(__sync_fetch_and_and_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_fetch_and_and_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_fetch_and_xor, "v.", "") -BUILTIN(__sync_fetch_and_xor_1, "cc*c.", "n") -BUILTIN(__sync_fetch_and_xor_2, "ss*s.", "n") -BUILTIN(__sync_fetch_and_xor_4, "ii*i.", "n") -BUILTIN(__sync_fetch_and_xor_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_fetch_and_xor_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_fetch_and_nand, "v.", "") -BUILTIN(__sync_fetch_and_nand_1, "cc*c.", "n") -BUILTIN(__sync_fetch_and_nand_2, "ss*s.", "n") -BUILTIN(__sync_fetch_and_nand_4, "ii*i.", "n") -BUILTIN(__sync_fetch_and_nand_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_fetch_and_nand_16, "LLLiLLLi*LLLi.", "n") - - -BUILTIN(__sync_add_and_fetch, "v.", "") -BUILTIN(__sync_add_and_fetch_1, "cc*c.", "n") -BUILTIN(__sync_add_and_fetch_2, "ss*s.", "n") -BUILTIN(__sync_add_and_fetch_4, "ii*i.", "n") -BUILTIN(__sync_add_and_fetch_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_add_and_fetch_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_sub_and_fetch, "v.", "") -BUILTIN(__sync_sub_and_fetch_1, "cc*c.", "n") -BUILTIN(__sync_sub_and_fetch_2, "ss*s.", "n") -BUILTIN(__sync_sub_and_fetch_4, "ii*i.", "n") -BUILTIN(__sync_sub_and_fetch_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_sub_and_fetch_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_or_and_fetch, "v.", "") -BUILTIN(__sync_or_and_fetch_1, "cc*c.", "n") -BUILTIN(__sync_or_and_fetch_2, "ss*s.", "n") -BUILTIN(__sync_or_and_fetch_4, "ii*i.", "n") -BUILTIN(__sync_or_and_fetch_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_or_and_fetch_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_and_and_fetch, "v.", "") -BUILTIN(__sync_and_and_fetch_1, "cc*c.", "n") -BUILTIN(__sync_and_and_fetch_2, "ss*s.", "n") -BUILTIN(__sync_and_and_fetch_4, "ii*i.", "n") -BUILTIN(__sync_and_and_fetch_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_and_and_fetch_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_xor_and_fetch, "v.", "") -BUILTIN(__sync_xor_and_fetch_1, "cc*c.", "n") -BUILTIN(__sync_xor_and_fetch_2, "ss*s.", "n") -BUILTIN(__sync_xor_and_fetch_4, "ii*i.", "n") -BUILTIN(__sync_xor_and_fetch_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_xor_and_fetch_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_nand_and_fetch, "v.", "") -BUILTIN(__sync_nand_and_fetch_1, "cc*c.", "n") -BUILTIN(__sync_nand_and_fetch_2, "ss*s.", "n") -BUILTIN(__sync_nand_and_fetch_4, "ii*i.", "n") -BUILTIN(__sync_nand_and_fetch_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_nand_and_fetch_16, "LLLiLLLi*LLLi.", "n") - - -BUILTIN(__sync_bool_compare_and_swap, "v.", "") -BUILTIN(__sync_bool_compare_and_swap_1, "bc*cc.", "n") -BUILTIN(__sync_bool_compare_and_swap_2, "bs*ss.", "n") -BUILTIN(__sync_bool_compare_and_swap_4, "bi*ii.", "n") -BUILTIN(__sync_bool_compare_and_swap_8, "bLLi*LLi.", "n") -BUILTIN(__sync_bool_compare_and_swap_16, "bLLLi*LLLiLLLi.", "n") - -BUILTIN(__sync_val_compare_and_swap, "v.", "") -BUILTIN(__sync_val_compare_and_swap_1, "cc*cc.", "n") -BUILTIN(__sync_val_compare_and_swap_2, "ss*ss.", "n") -BUILTIN(__sync_val_compare_and_swap_4, "ii*ii.", "n") -BUILTIN(__sync_val_compare_and_swap_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_val_compare_and_swap_16, "LLLiLLLi*LLLiLLLi.", "n") - -BUILTIN(__sync_lock_test_and_set, "v.", "") -BUILTIN(__sync_lock_test_and_set_1, "cc*c.", "n") -BUILTIN(__sync_lock_test_and_set_2, "ss*s.", "n") -BUILTIN(__sync_lock_test_and_set_4, "ii*i.", "n") -BUILTIN(__sync_lock_test_and_set_8, "LLiLLi*LLi.", "n") -BUILTIN(__sync_lock_test_and_set_16, "LLLiLLLi*LLLi.", "n") - -BUILTIN(__sync_lock_release, "v.", "") -BUILTIN(__sync_lock_release_1, "vc*.", "n") -BUILTIN(__sync_lock_release_2, "vs*.", "n") -BUILTIN(__sync_lock_release_4, "vi*.", "n") -BUILTIN(__sync_lock_release_8, "vLLi*.", "n") -BUILTIN(__sync_lock_release_16, "vLLLi*.", "n") - - - -// Non-overloaded atomic builtins. -BUILTIN(__sync_synchronize, "v.", "n") -// LLVM instruction builtin [Clang extension]. -BUILTIN(__builtin_llvm_memory_barrier,"vbbbbb", "n") -// GCC does not support these, they are a Clang extension. -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") - -// C99 library functions -// C99 stdlib.h -LIBBUILTIN(calloc, "v*zz", "f", "stdlib.h") -LIBBUILTIN(malloc, "v*z", "f", "stdlib.h") -LIBBUILTIN(realloc, "v*v*z", "f", "stdlib.h") -// C99 string.h -LIBBUILTIN(memcpy, "v*v*vC*z", "f", "string.h") -LIBBUILTIN(memmove, "v*v*vC*z", "f", "string.h") -LIBBUILTIN(strcpy, "c*c*cC*", "f", "string.h") -LIBBUILTIN(strncpy, "c*c*cC*z", "f", "string.h") -LIBBUILTIN(strcat, "c*c*cC*", "f", "string.h") -LIBBUILTIN(strncat, "c*c*cC*z", "f", "string.h") -LIBBUILTIN(strxfrm, "zc*cC*z", "f", "string.h") -LIBBUILTIN(memchr, "v*vC*iz", "f", "string.h") -LIBBUILTIN(strchr, "c*cC*i", "f", "string.h") -LIBBUILTIN(strcspn, "zcC*cC*", "f", "string.h") -LIBBUILTIN(strpbrk, "c*cC*cC*", "f", "string.h") -LIBBUILTIN(strrchr, "c*cC*i", "f", "string.h") -LIBBUILTIN(strspn, "zcC*cC*", "f", "string.h") -LIBBUILTIN(strstr, "c*cC*cC*", "f", "string.h") -LIBBUILTIN(strtok, "c*c*cC*", "f", "string.h") -LIBBUILTIN(memset, "v*v*iz", "f", "string.h") -LIBBUILTIN(strerror, "c*i", "f", "string.h") -LIBBUILTIN(strlen, "zcC*", "f", "string.h") -// C99 stdio.h -LIBBUILTIN(printf, "icC*.", "fp:0:", "stdio.h") -LIBBUILTIN(fprintf, "iP*cC*.", "fp:1:", "stdio.h") -LIBBUILTIN(snprintf, "ic*zcC*.", "fp:2:", "stdio.h") -LIBBUILTIN(sprintf, "ic*cC*.", "fp:1:", "stdio.h") -LIBBUILTIN(vprintf, "icC*a", "fP:0:", "stdio.h") -LIBBUILTIN(vfprintf, "i.", "fP:1:", "stdio.h") -LIBBUILTIN(vsnprintf, "ic*zcC*a", "fP:2:", "stdio.h") -LIBBUILTIN(vsprintf, "ic*cC*a", "fP:1:", "stdio.h") - -// Non-C library functions -// FIXME: Non-C-standard stuff shouldn't be builtins in non-GNU mode! -LIBBUILTIN(alloca, "v*z", "f", "stdlib.h") -// POSIX string.h -LIBBUILTIN(stpcpy, "c*c*cC*", "f", "string.h") -LIBBUILTIN(stpncpy, "c*c*cC*z", "f", "string.h") -LIBBUILTIN(strdup, "c*cC*", "f", "string.h") -LIBBUILTIN(strndup, "c*cC*z", "f", "string.h") -// POSIX strings.h -LIBBUILTIN(index, "c*cC*i", "f", "strings.h") -LIBBUILTIN(rindex, "c*cC*i", "f", "strings.h") - -// FIXME: This type isn't very correct, it should be -// id objc_msgSend(id, SEL) -// but we need new type letters for that. -LIBBUILTIN(objc_msgSend, "v*.", "f", "objc/message.h") - -// FIXME: asprintf and vasprintf aren't C99 functions. Should they be -// target-specific builtins, perhaps? - -// Builtin math library functions -LIBBUILTIN(pow, "ddd", "fe", "math.h") -LIBBUILTIN(powl, "LdLdLd", "fe", "math.h") -LIBBUILTIN(powf, "fff", "fe", "math.h") - -LIBBUILTIN(sqrt, "dd", "fe", "math.h") -LIBBUILTIN(sqrtl, "LdLd", "fe", "math.h") -LIBBUILTIN(sqrtf, "ff", "fe", "math.h") - -LIBBUILTIN(sin, "dd", "fe", "math.h") -LIBBUILTIN(sinl, "LdLd", "fe", "math.h") -LIBBUILTIN(sinf, "ff", "fe", "math.h") - -LIBBUILTIN(cos, "dd", "fe", "math.h") -LIBBUILTIN(cosl, "LdLd", "fe", "math.h") -LIBBUILTIN(cosf, "ff", "fe", "math.h") - -#undef BUILTIN -#undef LIBBUILTIN diff --git a/include/clang/AST/Builtins.h b/include/clang/AST/Builtins.h deleted file mode 100644 index b16d3bf34139..000000000000 --- a/include/clang/AST/Builtins.h +++ /dev/null @@ -1,137 +0,0 @@ -//===--- Builtins.h - Builtin function header -------------------*- 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 enum values for all the target-independent builtin -// functions. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_AST_BUILTINS_H -#define LLVM_CLANG_AST_BUILTINS_H - -#include <cstring> -#include <string> -#include "llvm/ADT/SmallVector.h" - -namespace clang { - class TargetInfo; - class IdentifierTable; - class ASTContext; - class QualType; - -namespace Builtin { -enum ID { - NotBuiltin = 0, // This is not a builtin function. -#define BUILTIN(ID, TYPE, ATTRS) BI##ID, -#include "clang/AST/Builtins.def" - FirstTSBuiltin -}; - -struct Info { - const char *Name, *Type, *Attributes, *HeaderName; - bool Suppressed; - - bool operator==(const Info &RHS) const { - return !strcmp(Name, RHS.Name) && - !strcmp(Type, RHS.Type) && - !strcmp(Attributes, RHS.Attributes); - } - bool operator!=(const Info &RHS) const { return !(*this == RHS); } -}; - -/// Builtin::Context - This holds information about target-independent and -/// target-specific builtins, allowing easy queries by clients. -class Context { - const Info *TSRecords; - unsigned NumTSRecords; -public: - Context() : TSRecords(0), NumTSRecords(0) {} - - /// \brief Load all of the target builtins. This should be called - /// prior to initializing the builtin identifiers. - void InitializeTargetBuiltins(const TargetInfo &Target); - - /// InitializeBuiltins - Mark the identifiers for all the builtins with their - /// appropriate builtin ID # and mark any non-portable builtin identifiers as - /// such. - void InitializeBuiltins(IdentifierTable &Table, bool NoBuiltins = false); - - /// \brief Popular the vector with the names of all of the builtins. - void GetBuiltinNames(llvm::SmallVectorImpl<const char *> &Names, - bool NoBuiltins); - - /// Builtin::GetName - Return the identifier name for the specified builtin, - /// e.g. "__builtin_abs". - const char *GetName(unsigned ID) const { - return GetRecord(ID).Name; - } - - /// isConst - Return true if this function has no side effects and doesn't - /// read memory. - bool isConst(unsigned ID) const { - return strchr(GetRecord(ID).Attributes, 'c') != 0; - } - - /// isNoThrow - Return true if we know this builtin never throws an exception. - bool isNoThrow(unsigned ID) const { - return strchr(GetRecord(ID).Attributes, 'n') != 0; - } - - /// isLibFunction - Return true if this is a builtin for a libc/libm function, - /// with a "__builtin_" prefix (e.g. __builtin_abs). - bool isLibFunction(unsigned ID) const { - return strchr(GetRecord(ID).Attributes, 'F') != 0; - } - - /// \brief Determines whether this builtin is a predefined libc/libm - /// function, such as "malloc", where we know the signature a - /// priori. - bool isPredefinedLibFunction(unsigned ID) const { - return strchr(GetRecord(ID).Attributes, 'f') != 0; - } - - /// \brief If this is a library function that comes from a specific - /// header, retrieve that header name. - const char *getHeaderName(unsigned ID) const { - return GetRecord(ID).HeaderName; - } - - /// \brief Determine whether this builtin is like printf in its - /// formatting rules and, if so, set the index to the format string - /// argument and whether this function as a va_list argument. - bool isPrintfLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg); - - /// hasVAListUse - Return true of the specified builtin uses __builtin_va_list - /// as an operand or return type. - bool hasVAListUse(unsigned ID) const { - return strpbrk(GetRecord(ID).Type, "Aa") != 0; - } - - /// isConstWithoutErrno - Return true if this function has no side - /// effects and doesn't read memory, except for possibly errno. Such - /// functions can be const when the MathErrno lang option is - /// disabled. - bool isConstWithoutErrno(unsigned ID) const { - return strchr(GetRecord(ID).Attributes, 'e') != 0; - } - - /// GetBuiltinType - Return the type for the specified builtin. - enum GetBuiltinTypeError { - GE_None, //< No error - GE_Missing_FILE //< Missing the FILE type from <stdio.h> - }; - QualType GetBuiltinType(unsigned ID, ASTContext &Context, - GetBuiltinTypeError &Error) const; -private: - const Info &GetRecord(unsigned ID) const; -}; - -} -} // end namespace clang -#endif diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index c061b857063a..5c9fd342fa96 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -298,9 +298,13 @@ public: static bool CollectingStats(bool Enable = false); static void PrintStats(); - /// isTemplateParameter - Determines whether this declartion is a + /// isTemplateParameter - Determines whether this declaration is a /// template parameter. bool isTemplateParameter() const; + + /// isTemplateParameter - Determines whether this declaration is a + /// template parameter pack. + bool isTemplateParameterPack() const; // Implement isa/cast/dyncast/etc. static bool classof(const Decl *) { return true; } diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h index d1899006cc82..a480f54394c6 100644 --- a/include/clang/AST/DeclTemplate.h +++ b/include/clang/AST/DeclTemplate.h @@ -17,6 +17,7 @@ #include "clang/AST/DeclCXX.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/FoldingSet.h" +#include "llvm/ADT/PointerUnion.h" namespace clang { @@ -29,6 +30,10 @@ class TemplateTypeParmDecl; class NonTypeTemplateParmDecl; class TemplateTemplateParmDecl; +/// \brief Stores a template parameter of any kind. +typedef llvm::PointerUnion3<TemplateTypeParmDecl*, NonTypeTemplateParmDecl*, + TemplateTemplateParmDecl*> TemplateParameter; + /// TemplateParameterList - Stores a list of template parameters for a /// TemplateDecl and its derived classes. class TemplateParameterList { @@ -69,6 +74,11 @@ public: unsigned size() const { return NumParams; } + Decl* getParam(unsigned Idx) { + assert(Idx < size() && "Template parameter index out-of-range"); + return begin()[Idx]; + } + const Decl* getParam(unsigned Idx) const { assert(Idx < size() && "Template parameter index out-of-range"); return begin()[Idx]; @@ -77,7 +87,7 @@ public: /// \btief Returns the minimum number of arguments needed to form a /// template specialization. This may be fewer than the number of /// template parameters, if some of the parameters have default - /// arguments. + /// arguments or if there is a parameter pack. unsigned getMinRequiredArguments() const; SourceLocation getTemplateLoc() const { return TemplateLoc; } @@ -223,6 +233,9 @@ class TemplateTypeParmDecl : public TypeDecl { /// default argument. bool InheritedDefault : 1; + /// \brief Whether this is a parameter pack. + bool ParameterPack : 1; + /// \brief The location of the default argument, if any. SourceLocation DefaultArgumentLoc; @@ -230,16 +243,17 @@ class TemplateTypeParmDecl : public TypeDecl { QualType DefaultArgument; TemplateTypeParmDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id, - bool Typename, QualType Type) + bool Typename, QualType Type, bool ParameterPack) : TypeDecl(TemplateTypeParm, DC, L, Id), Typename(Typename), - InheritedDefault(false), DefaultArgument() { + InheritedDefault(false), ParameterPack(ParameterPack), DefaultArgument() { TypeForDecl = Type.getTypePtr(); } public: static TemplateTypeParmDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, - IdentifierInfo *Id, bool Typename); + IdentifierInfo *Id, bool Typename, + bool ParameterPack); /// \brief Whether this template type parameter was declared with /// the 'typename' keyword. If not, it was declared with the 'class' @@ -270,6 +284,9 @@ public: InheritedDefault = Inherited; } + /// \brief Returns whether this is a parameter pack. + bool isParameterPack() const { return ParameterPack; } + // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return D->getKind() == TemplateTypeParm; @@ -575,17 +592,38 @@ public: /// \brief A helper class for making template argument lists. class TemplateArgumentListBuilder { + /// Args - contains the template arguments. llvm::SmallVector<TemplateArgument, 16> Args; + + llvm::SmallVector<unsigned, 32> Indices; ASTContext &Context; + + /// isAddingFromParameterPack - Returns whether we're adding arguments from + /// a parameter pack. + bool isAddingFromParameterPack() const { return Indices.size() % 2; } + public: TemplateArgumentListBuilder(ASTContext &Context) : Context(Context) { } - // FIXME: Should use the index array size. - size_t size() const { return Args.size(); } + size_t size() const { + assert(!isAddingFromParameterPack() && + "Size is not valid when adding from a parameter pack"); + + return Indices.size() / 2; + } + size_t flatSize() const { return Args.size(); } void push_back(const TemplateArgument& Arg); + + /// BeginParameterPack - Start adding arguments from a parameter pack. + void BeginParameterPack(); + + /// EndParameterPack - Finish adding arguments from a parameter pack. + void EndParameterPack(); + + const TemplateArgument *getFlatArgumentList() const { return Args.data(); } TemplateArgument *getFlatArgumentList() { return Args.data(); } }; @@ -733,6 +771,7 @@ public: static void Profile(llvm::FoldingSetNodeID &ID, const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs) { + ID.AddInteger(NumTemplateArgs); for (unsigned Arg = 0; Arg != NumTemplateArgs; ++Arg) TemplateArgs[Arg].Profile(ID); } diff --git a/include/clang/AST/PPCBuiltins.def b/include/clang/AST/PPCBuiltins.def deleted file mode 100644 index b8c791286e55..000000000000 --- a/include/clang/AST/PPCBuiltins.def +++ /dev/null @@ -1,24 +0,0 @@ -//===--- PPCBuiltins.def - PowerPC Builtin function 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 PowerPC-specific 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. - -// The format of this database matches clang/AST/Builtins.def. - -// This is just a placeholder, the types and attributes are wrong. -BUILTIN(__builtin_altivec_abs_v4sf , "ii" , "nc") -// FIXME: Obviously incomplete. - -#undef BUILTIN diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 3656333d7423..a8688f62e2d9 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -709,14 +709,14 @@ class DoStmt : public Stmt { Stmt* SubExprs[END_EXPR]; SourceLocation DoLoc; SourceLocation WhileLoc; + SourceLocation RParenLoc; // Location of final ')' in do stmt condition. public: - DoStmt(Stmt *body, Expr *cond, SourceLocation DL, SourceLocation WL) - : Stmt(DoStmtClass), DoLoc(DL), WhileLoc(WL) { + DoStmt(Stmt *body, Expr *cond, SourceLocation DL, SourceLocation WL, + SourceLocation RP) + : Stmt(DoStmtClass), DoLoc(DL), WhileLoc(WL), RParenLoc(RP) { SubExprs[COND] = reinterpret_cast<Stmt*>(cond); SubExprs[BODY] = body; - DoLoc = DL; - WhileLoc = WL; } /// \brief Build an empty do-while statement. @@ -734,8 +734,11 @@ public: SourceLocation getWhileLoc() const { return WhileLoc; } void setWhileLoc(SourceLocation L) { WhileLoc = L; } + SourceLocation getRParenLoc() const { return RParenLoc; } + void setRParenLoc(SourceLocation L) { RParenLoc = L; } + virtual SourceRange getSourceRange() const { - return SourceRange(DoLoc, SubExprs[BODY]->getLocEnd()); + return SourceRange(DoLoc, RParenLoc); } static bool classof(const Stmt *T) { return T->getStmtClass() == DoStmtClass; diff --git a/include/clang/AST/TargetBuiltins.h b/include/clang/AST/TargetBuiltins.h deleted file mode 100644 index d425a9b8ecad..000000000000 --- a/include/clang/AST/TargetBuiltins.h +++ /dev/null @@ -1,38 +0,0 @@ -//===--- TargetBuiltins.h - Target specific builtin IDs -------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_AST_TARGET_BUILTINS_H -#define LLVM_CLANG_AST_TARGET_BUILTINS_H - -#include "clang/AST/Builtins.h" -#undef PPC - -namespace clang { - /// X86 builtins - namespace X86 { - enum { - LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, -#define BUILTIN(ID, TYPE, ATTRS) BI##ID, -#include "X86Builtins.def" - LastTSBuiltin - }; - } - - /// PPC builtins - namespace PPC { - enum { - LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, -#define BUILTIN(ID, TYPE, ATTRS) BI##ID, -#include "PPCBuiltins.def" - LastTSBuiltin - }; - } -} // end namespace clang. - -#endif diff --git a/include/clang/AST/X86Builtins.def b/include/clang/AST/X86Builtins.def deleted file mode 100644 index 85381c0762d5..000000000000 --- a/include/clang/AST/X86Builtins.def +++ /dev/null @@ -1,295 +0,0 @@ -//===--- X86Builtins.def - X86 Builtin function 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 X86-specific builtin function database. Users of -// this file must define the BUILTIN macro to make use of this information. -// -//===----------------------------------------------------------------------===// - -// The format of this database matches clang/AST/Builtins.def. - -// FIXME: In GCC, these builtins are defined depending on whether support for -// MMX/SSE/etc is turned on. We should do this too. - -// FIXME: Ideally we would be able to pull this information from what -// LLVM already knows about X86 builtins. We need to match the LLVM -// definition anyway, since code generation will lower to the -// intrinsic if one exists. - -BUILTIN(__builtin_ia32_emms , "v", "") - -// FIXME: Are these nothrow/const? - -// SSE intrinsics. -BUILTIN(__builtin_ia32_comieq, "iV4fV4f", "") -BUILTIN(__builtin_ia32_comilt, "iV4fV4f", "") -BUILTIN(__builtin_ia32_comile, "iV4fV4f", "") -BUILTIN(__builtin_ia32_comigt, "iV4fV4f", "") -BUILTIN(__builtin_ia32_comige, "iV4fV4f", "") -BUILTIN(__builtin_ia32_comineq, "iV4fV4f", "") -BUILTIN(__builtin_ia32_ucomieq, "iV4fV4f", "") -BUILTIN(__builtin_ia32_ucomilt, "iV4fV4f", "") -BUILTIN(__builtin_ia32_ucomile, "iV4fV4f", "") -BUILTIN(__builtin_ia32_ucomigt, "iV4fV4f", "") -BUILTIN(__builtin_ia32_ucomige, "iV4fV4f", "") -BUILTIN(__builtin_ia32_ucomineq, "iV4fV4f", "") -BUILTIN(__builtin_ia32_comisdeq, "iV2dV2d", "") -BUILTIN(__builtin_ia32_comisdlt, "iV2dV2d", "") -BUILTIN(__builtin_ia32_comisdle, "iV2dV2d", "") -BUILTIN(__builtin_ia32_comisdgt, "iV2dV2d", "") -BUILTIN(__builtin_ia32_comisdge, "iV2dV2d", "") -BUILTIN(__builtin_ia32_comisdneq, "iV2dV2d", "") -BUILTIN(__builtin_ia32_ucomisdeq, "iV2dV2d", "") -BUILTIN(__builtin_ia32_ucomisdlt, "iV2dV2d", "") -BUILTIN(__builtin_ia32_ucomisdle, "iV2dV2d", "") -BUILTIN(__builtin_ia32_ucomisdgt, "iV2dV2d", "") -BUILTIN(__builtin_ia32_ucomisdge, "iV2dV2d", "") -BUILTIN(__builtin_ia32_ucomisdneq, "iV2dV2d", "") -BUILTIN(__builtin_ia32_cmpps, "V4fV4fV4fc", "") -BUILTIN(__builtin_ia32_cmpss, "V4fV4fV4fc", "") -BUILTIN(__builtin_ia32_minps, "V4fV4fV4f", "") -BUILTIN(__builtin_ia32_maxps, "V4fV4fV4f", "") -BUILTIN(__builtin_ia32_minss, "V4fV4fV4f", "") -BUILTIN(__builtin_ia32_maxss, "V4fV4fV4f", "") -BUILTIN(__builtin_ia32_paddsb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_paddsw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_psubsb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_psubsw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_paddusb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_paddusw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_psubusb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_psubusw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pmulhw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pmulhuw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pavgb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_pavgw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pcmpeqb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_pcmpeqw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pcmpeqd, "V2iV2iV2i", "") -BUILTIN(__builtin_ia32_pcmpgtb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_pcmpgtw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pcmpgtd, "V2iV2iV2i", "") -BUILTIN(__builtin_ia32_pmaxub, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_pmaxsw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pminub, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_pminsw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_punpckhbw, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_punpckhwd, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_punpckhdq, "V2iV2iV2i", "") -BUILTIN(__builtin_ia32_punpcklbw, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_punpcklwd, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_punpckldq, "V2iV2iV2i", "") -BUILTIN(__builtin_ia32_cmppd, "V2dV2dV2dc", "") -BUILTIN(__builtin_ia32_cmpsd, "V2dV2dV2dc", "") -BUILTIN(__builtin_ia32_minpd, "V2dV2dV2d", "") -BUILTIN(__builtin_ia32_maxpd, "V2dV2dV2d", "") -BUILTIN(__builtin_ia32_minsd, "V2dV2dV2d", "") -BUILTIN(__builtin_ia32_maxsd, "V2dV2dV2d", "") -BUILTIN(__builtin_ia32_paddsb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_paddsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_psubsb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_psubsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_paddusb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_paddusw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_psubusb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_psubusw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pmullw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pmulhw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pavgb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pavgw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pcmpeqb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pcmpeqw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pcmpeqd128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_pcmpgtb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pcmpgtw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pcmpgtd128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_pmaxub128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pmaxsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pminub128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pminsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_packsswb128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_packssdw128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_packuswb128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pmulhuw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_addsubps, "V4fV4fV4f", "") -BUILTIN(__builtin_ia32_addsubpd, "V2dV2dV2d", "") -BUILTIN(__builtin_ia32_haddps, "V4fV4fV4f", "") -BUILTIN(__builtin_ia32_haddpd, "V2dV2dV2d", "") -BUILTIN(__builtin_ia32_hsubps, "V4fV4fV4f", "") -BUILTIN(__builtin_ia32_hsubpd, "V2dV2dV2d", "") -BUILTIN(__builtin_ia32_phaddw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_phaddw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_phaddd128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_phaddd, "V2iV2iV2i", "") -BUILTIN(__builtin_ia32_phaddsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_phaddsw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_phsubw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_phsubw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_phsubd128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_phsubd, "V2iV2iV2i", "") -BUILTIN(__builtin_ia32_phsubsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_phsubsw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pmaddubsw128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pmaddubsw, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_pmulhrsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pmulhrsw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_pshufb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pshufb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_psignb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_psignb, "V8cV8cV8c", "") -BUILTIN(__builtin_ia32_psignw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_psignw, "V4sV4sV4s", "") -BUILTIN(__builtin_ia32_psignd128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_psignd, "V2iV2iV2i", "") -BUILTIN(__builtin_ia32_pabsb128, "V16cV16c", "") -BUILTIN(__builtin_ia32_pabsb, "V8cV8c", "") -BUILTIN(__builtin_ia32_pabsw128, "V8sV8s", "") -BUILTIN(__builtin_ia32_pabsw, "V4sV4s", "") -BUILTIN(__builtin_ia32_pabsd128, "V4iV4i", "") -BUILTIN(__builtin_ia32_pabsd, "V2iV2i", "") -BUILTIN(__builtin_ia32_psllw, "V4sV4sV1LLi", "") -BUILTIN(__builtin_ia32_pslld, "V2iV2iV1LLi", "") -BUILTIN(__builtin_ia32_psllq, "V1LLiV1LLiV1LLi", "") -BUILTIN(__builtin_ia32_psrlw, "V4sV4sV1LLi", "") -BUILTIN(__builtin_ia32_psrld, "V2iV2iV1LLi", "") -BUILTIN(__builtin_ia32_psrlq, "V1LLiV1LLiV1LLi", "") -BUILTIN(__builtin_ia32_psraw, "V4sV4sV1LLi", "") -BUILTIN(__builtin_ia32_psrad, "V2iV2iV1LLi", "") -BUILTIN(__builtin_ia32_pmaddwd, "V2iV4sV4s", "") -BUILTIN(__builtin_ia32_packsswb, "V8cV4sV4s", "") -BUILTIN(__builtin_ia32_packssdw, "V4sV2iV2i", "") -BUILTIN(__builtin_ia32_packuswb, "V8cV4sV4s", "") -BUILTIN(__builtin_ia32_ldmxcsr, "vUi", "") -BUILTIN(__builtin_ia32_stmxcsr, "Ui", "") -BUILTIN(__builtin_ia32_cvtpi2ps, "V4fV4fV2i", "") -BUILTIN(__builtin_ia32_cvtps2pi, "V2iV4f", "") -BUILTIN(__builtin_ia32_cvtss2si, "iV4f", "") -BUILTIN(__builtin_ia32_cvtss2si64, "LLiV4f", "") -BUILTIN(__builtin_ia32_cvttps2pi, "V2iV4f", "") -BUILTIN(__builtin_ia32_maskmovq, "vV8cV8cc*", "") -BUILTIN(__builtin_ia32_loadups, "V4ffC*", "") -BUILTIN(__builtin_ia32_storeups, "vf*V4f", "") -BUILTIN(__builtin_ia32_storehps, "vV2i*V4f", "") -BUILTIN(__builtin_ia32_storelps, "vV2i*V4f", "") -BUILTIN(__builtin_ia32_movmskps, "iV4f", "") -BUILTIN(__builtin_ia32_pmovmskb, "iV8c", "") -BUILTIN(__builtin_ia32_movntps, "vf*V4f", "") -BUILTIN(__builtin_ia32_movntq, "vV1LLi*V1LLi", "") -BUILTIN(__builtin_ia32_sfence, "v", "") -BUILTIN(__builtin_ia32_psadbw, "V4sV8cV8c", "") -BUILTIN(__builtin_ia32_rcpps, "V4fV4f", "") -BUILTIN(__builtin_ia32_rcpss, "V4fV4f", "") -BUILTIN(__builtin_ia32_rsqrtps, "V4fV4f", "") -BUILTIN(__builtin_ia32_rsqrtss, "V4fV4f", "") -BUILTIN(__builtin_ia32_sqrtps, "V4fV4f", "") -BUILTIN(__builtin_ia32_sqrtss, "V4fV4f", "") -BUILTIN(__builtin_ia32_maskmovdqu, "vV16cV16cc*", "") -BUILTIN(__builtin_ia32_loadupd, "V2ddC*", "") -BUILTIN(__builtin_ia32_storeupd, "vd*V2d", "") -BUILTIN(__builtin_ia32_movmskpd, "iV2d", "") -BUILTIN(__builtin_ia32_pmovmskb128, "iV16c", "") -BUILTIN(__builtin_ia32_movnti, "vi*i", "") -BUILTIN(__builtin_ia32_movntpd, "vd*V2d", "") -BUILTIN(__builtin_ia32_movntdq, "vV2LLi*V2LLi", "") -BUILTIN(__builtin_ia32_psadbw128, "V2LLiV16cV16c", "") -BUILTIN(__builtin_ia32_sqrtpd, "V2dV2d", "") -BUILTIN(__builtin_ia32_sqrtsd, "V2dV2d", "") -BUILTIN(__builtin_ia32_cvtdq2pd, "V2dV4i", "") -BUILTIN(__builtin_ia32_cvtdq2ps, "V4fV4i", "") -BUILTIN(__builtin_ia32_cvtpd2dq, "V2LLiV2d", "") -BUILTIN(__builtin_ia32_cvtpd2pi, "V2iV2d", "") -BUILTIN(__builtin_ia32_cvtpd2ps, "V4fV2d", "") -BUILTIN(__builtin_ia32_cvttpd2dq, "V4iV2d", "") -BUILTIN(__builtin_ia32_cvttpd2pi, "V2iV2d", "") -BUILTIN(__builtin_ia32_cvtpi2pd, "V2dV2i", "") -BUILTIN(__builtin_ia32_cvtsd2si, "iV2d", "") -BUILTIN(__builtin_ia32_cvtsd2si64, "LLiV2d", "") -BUILTIN(__builtin_ia32_cvtps2dq, "V4iV4f", "") -BUILTIN(__builtin_ia32_cvtps2pd, "V2dV4f", "") -BUILTIN(__builtin_ia32_cvttps2dq, "V4iV4f", "") -BUILTIN(__builtin_ia32_clflush, "vvC*", "") -BUILTIN(__builtin_ia32_lfence, "v", "") -BUILTIN(__builtin_ia32_mfence, "v", "") -BUILTIN(__builtin_ia32_loaddqu, "V16ccC*", "") -BUILTIN(__builtin_ia32_storedqu, "vc*V16c", "") -BUILTIN(__builtin_ia32_psllwi, "V4sV4si", "") -BUILTIN(__builtin_ia32_pslldi, "V2iV2ii", "") -BUILTIN(__builtin_ia32_psllqi, "V1LLiV1LLii", "") -BUILTIN(__builtin_ia32_psrawi, "V4sV4si", "") -BUILTIN(__builtin_ia32_psradi, "V2iV2ii", "") -BUILTIN(__builtin_ia32_psrlwi, "V4sV4si", "") -BUILTIN(__builtin_ia32_psrldi, "V2iV2ii", "") -BUILTIN(__builtin_ia32_psrlqi, "V1LLiV1LLii", "") -BUILTIN(__builtin_ia32_pmuludq, "V1LLiV2iV2i", "") -BUILTIN(__builtin_ia32_pmuludq128, "V2LLiV4iV4i", "") -BUILTIN(__builtin_ia32_psraw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_psrad128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_psrlw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_psrld128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_pslldqi128, "V2LLiV2LLii", "") -BUILTIN(__builtin_ia32_psrldqi128, "V2LLiV2LLii", "") -BUILTIN(__builtin_ia32_psrlq128, "V2LLiV2LLiV2LLi", "") -BUILTIN(__builtin_ia32_psllw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pslld128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_psllq128, "V2LLiV2LLiV2LLi", "") -BUILTIN(__builtin_ia32_psllwi128, "V8sV8si", "") -BUILTIN(__builtin_ia32_pslldi128, "V4iV4ii", "") -BUILTIN(__builtin_ia32_psllqi128, "V2LLiV2LLii", "") -BUILTIN(__builtin_ia32_psrlwi128, "V8sV8si", "") -BUILTIN(__builtin_ia32_psrldi128, "V4iV4ii", "") -BUILTIN(__builtin_ia32_psrlqi128, "V2LLiV2LLii", "") -BUILTIN(__builtin_ia32_psrawi128, "V8sV8si", "") -BUILTIN(__builtin_ia32_psradi128, "V4iV4ii", "") -BUILTIN(__builtin_ia32_pmaddwd128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_monitor, "vv*UiUi", "") -BUILTIN(__builtin_ia32_mwait, "vUiUi", "") -BUILTIN(__builtin_ia32_lddqu, "V16ccC*", "") -BUILTIN(__builtin_ia32_palignr128, "V2LLiV2LLiV2LLii", "") -BUILTIN(__builtin_ia32_palignr, "V1LLiV1LLiV1LLis", "") -BUILTIN(__builtin_ia32_insertps128, "V4fV4fV4fi", "") - -BUILTIN(__builtin_ia32_storelv4si, "vV2i*V2LLi", "") - -BUILTIN(__builtin_ia32_pblendvb128, "V16cV16cV16cV16c", "") -BUILTIN(__builtin_ia32_pblendw128, "V8sV8sV8si", "") -BUILTIN(__builtin_ia32_blendpd, "V2dV2dV2di", "") -BUILTIN(__builtin_ia32_blendps, "V4fV4fV4fi", "") -BUILTIN(__builtin_ia32_blendvpd, "V2dV2dV2dV2d", "") -BUILTIN(__builtin_ia32_blendvps, "V4fV4fV4fV4f", "") - -BUILTIN(__builtin_ia32_packusdw128, "V8sV4iV4i", "") -BUILTIN(__builtin_ia32_pmaxsb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pmaxsd128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_pmaxud128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_pmaxuw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pminsb128, "V16cV16cV16c", "") -BUILTIN(__builtin_ia32_pminsd128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_pminud128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_pminuw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_pmovsxbd128, "V4iV16c", "") -BUILTIN(__builtin_ia32_pmovsxbq128, "V2LLiV16c", "") -BUILTIN(__builtin_ia32_pmovsxbw128, "V8sV16c", "") -BUILTIN(__builtin_ia32_pmovsxdq128, "V2LLiV4i", "") -BUILTIN(__builtin_ia32_pmovsxwd128, "V4iV8s", "") -BUILTIN(__builtin_ia32_pmovsxwq128, "V2LLiV8s", "") -BUILTIN(__builtin_ia32_pmovzxbd128, "V4iV16c", "") -BUILTIN(__builtin_ia32_pmovzxbq128, "V2LLiV16c", "") -BUILTIN(__builtin_ia32_pmovzxbw128, "V8sV16c", "") -BUILTIN(__builtin_ia32_pmovzxdq128, "V2LLiV4i", "") -BUILTIN(__builtin_ia32_pmovzxwd128, "V4iV8s", "") -BUILTIN(__builtin_ia32_pmovzxwq128, "V2LLiV8s", "") -BUILTIN(__builtin_ia32_pmuldq128, "V2LLiV4iV4i", "") -BUILTIN(__builtin_ia32_pmulld128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_roundps, "V4fV4fi", "") -BUILTIN(__builtin_ia32_roundss, "V4fV4fi", "") -BUILTIN(__builtin_ia32_roundsd, "V2dV2di", "") -BUILTIN(__builtin_ia32_roundpd, "V2dV2di", "") - - -#undef BUILTIN |