From 5ce933f68c614faa048364f88a226cd3de6649bd Mon Sep 17 00:00:00 2001 From: Chris Lattner <sabre@nondot.org> Date: Mon, 9 Feb 2009 08:46:11 +0000 Subject: [PATCH] new document. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64127 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LanguageExtensions.html | 147 +++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 docs/LanguageExtensions.html diff --git a/docs/LanguageExtensions.html b/docs/LanguageExtensions.html new file mode 100644 index 00000000000..1bccdbd2cc7 --- /dev/null +++ b/docs/LanguageExtensions.html @@ -0,0 +1,147 @@ +<html> +<head> +<title>Clang Language Extensions</title> +<link type="text/css" rel="stylesheet" href="../menu.css" /> +<link type="text/css" rel="stylesheet" href="../content.css" /> +<style type="text/css"> +td { + vertical-align: top; +} +</style> +</head> +<body> + +<!--#include virtual="../menu.html.incl"--> + +<div id="content"> + +<h1>Clang Language Extensions</h1> + +<ul> +<li><a href="#intro">Introduction</a></li> +<li><a href="#vectors">Vectors and Extended Vectors</a></li> +<li><a href="#blocks">Blocks</a></li> +<li><a href="#builtins">Builtin Functions</a> + <ul> + <li><a href="#__builtin_overload">__builtin_overload</a></li> + <li><a href="#__builtin_shufflevector">__builtin_shufflevector</a></li> + </ul> +</li> +</ul> + + +<!-- ======================================================================= --> +<h2 id="intro">Introduction</h2> +<!-- ======================================================================= --> + +<p>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 <a +href="http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html">GCC manual</a> for +more information on these extensions.</p> + +<!-- ======================================================================= --> +<h2 id="vectors">Vectors and Extended Vectors</h2> +<!-- ======================================================================= --> + +<p>Supports the GCC vector extensions, plus some stuff like V[1]. ext_vector +with V.xyzw syntax and other tidbits. See also <a +href="#__builtin_shufflevector">__builtin_shufflevector</a>.</p> + +<!-- ======================================================================= --> +<h2 id="blocks">Blocks</h2> +<!-- ======================================================================= --> + +<p>The idea, syntax, and semantics.</p> + +<!-- ======================================================================= --> +<h2 id="builtins">Builtin Functions</h2> +<!-- ======================================================================= --> + +<p>Clang supports a number of builtin library functions with the same syntax as +GCC, including things like <tt>__builtin_nan</tt>, +<tt>__builtin_constant_p</tt>, <tt>__builtin_choose_expr</tt>, +<tt>__builtin_types_compatible_p</tt>, <tt>__sync_fetch_and_add</tt>, etc. In +addition to the GCC builtins, Clang supports a number of builtins that GCC does +not, which are listed here.</p> + +<p>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 <tt><xmmintrin.h></tt>, which +define portable wrappers for these. Many of the Clang versions of these +functions are implemented directly in terms of <a href="#vectors">extended +vector support</a> instead of builtins, in order to reduce the number of +builtins that we need to implement.</p> + + +<!-- ======================================================================= --> +<h3 id="__builtin_overload">__builtin_overload</h3> +<!-- ======================================================================= --> + +<p><tt>__builtin_overload</tt> is used to implement type-generic "overloaded" +functions in C. This builtin is used to implement the <tt><tgmath.h></tt> +header file, but is intended to be usable for a broad variety of other similar +situations, like the <tt><altivec.h></tt> header. +</p> + +<p><b>Syntax:</b></p> + +<pre> +__builtin_overload(FnNameStr, PromotionRuleStr, NumArgs, arg1, arg2, ... + overloadcandidate1, overloadcandidate2, ...) +</pre> + +<p><b>Examples:</b></p> + +<pre> +#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)) +</pre> + +<p><b>Description:</b></p> + +<p>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. +</p> + +<p>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:</p> + +<dl> + <dt>tgmath</dt> + <dd>Follow the rules of C99 7.22 to determine a single common type, and use it + for every argument.</dd> + <dt>tgmath1</dt> + <dd>Follow the rules of C99 7.22 to determine a single common type of just the + first argument (e.g. treat ints as doubles).</dd> +</dl> + +<p>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.</p> + +<p>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.</p> + + +<!-- ======================================================================= --> +<h3 id="__builtin_shufflevector">__builtin_shufflevector</h3> +<!-- ======================================================================= --> + +<p>todo describe me.</p> + + +</div> +</body> +</html> -- GitLab