Clang Language Extensions
+ + + + + +Introduction
+ + +This document describes the language extensions provided by Clang. In +addition to the langauge extensions listed here, Clang aims to support a broad +range of GCC extensions. Please see the GCC manual for +more information on these extensions.
+ + +Vectors and Extended Vectors
+ + +Supports the GCC vector extensions, plus some stuff like V[1]. ext_vector +with V.xyzw syntax and other tidbits. See also __builtin_shufflevector.
+ + +Blocks
+ + +The idea, syntax, and semantics.
+ + +Builtin Functions
+ + +Clang supports a number of builtin library functions with the same syntax as +GCC, including things like __builtin_nan, +__builtin_constant_p, __builtin_choose_expr, +__builtin_types_compatible_p, __sync_fetch_and_add, etc. In +addition to the GCC builtins, Clang supports a number of builtins that GCC does +not, which are listed here.
+ +Please note that Clang does not and will not support all of the GCC builtins +for vector operations. Instead of using builtins, you should use the functions +defined in target-specific header files like <xmmintrin.h>, which +define portable wrappers for these. Many of the Clang versions of these +functions are implemented directly in terms of extended +vector support instead of builtins, in order to reduce the number of +builtins that we need to implement.
+ + + +__builtin_overload
+ + +__builtin_overload is used to implement type-generic "overloaded" +functions in C. This builtin is used to implement the <tgmath.h> +header file, but is intended to be usable for a broad variety of other similar +situations, like the <altivec.h> header. +
+ +Syntax:
+ ++__builtin_overload(FnNameStr, PromotionRuleStr, NumArgs, arg1, arg2, ... + overloadcandidate1, overloadcandidate2, ...) ++ +
Examples:
+ +
+#define sin(x) \
+ (__builtin_overload("sin", "tgmath", 1, x, sinf, sin, sinl,
+ csinf, csin, csinl)(x))
+#define fma(x,y,z) \
+ (__builtin_overload("fma", "tgmath", 3, x, y, z, fmaf, fma, fmal)(x,y,z))
+#define ldexp(x, y) \
+ (__builtin_overload("ldexp", "tgmath1", 2, x, 0, ldexpf, ldexp, ldexpl)(x,y))
+
+
+Description:
+ +The first argument to __builtin_overload is a string that is the name of the +"function" being implemented. This is used to produce diagnostics that make +sense to the user. For example, if you accidentally pass a pointer argument to +"sin" in GCC, it emits 6 errors about incompatible types. This name allows +Clang to diagnose the error in a way the user can understand. +
+ +The second argument is a string that indicates a set of promotion rules to +apply to the arguments before prototype matching occurs. The currently +supported rules are:
+ +-
+
- tgmath +
- Follow the rules of C99 7.22 to determine a single common type, and use it + for every argument. +
- tgmath1 +
- Follow the rules of C99 7.22 to determine a single common type of just the + first argument (e.g. treat ints as doubles). +
The third argument is an integer that specifies the arity of the function + being overloaded. After this are N expression arguments which are promoted + according to the rules specified by the promotion rule string.
+ +The final arguments are functions or function pointers with different + signatures. __builtin_overload will match and evaluate to the first function + pointer whose signature is compatible and does not cause value truncation of + any arguments to the function.
+ + + +__builtin_shufflevector
+ + +todo describe me.
+ + +