Implement __builtin_unreachable(), a GCC 4.5 extension.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82433 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-09-21 03:09:59 +00:00
Родитель a674bf437e
Коммит 21190d5463
4 изменённых файлов: 60 добавлений и 1 удалений

Просмотреть файл

@ -27,6 +27,7 @@ td {
<li><a href="#builtins">Builtin Functions</a>
<ul>
<li><a href="#__builtin_shufflevector">__builtin_shufflevector</a></li>
<li><a href="#__builtin_unreachable">__builtin_unreachable</a></li>
</ul>
</li>
<li><a href="#targetspecific">Target-Specific Extensions</a>
@ -310,6 +311,47 @@ with the same element type as vec1/vec2 but that has an element count equal to
the number of indices specified.
</p>
<p>Query for this feature with __has_builtin(__builtin_shufflevector).</p>
<!-- ======================================================================= -->
<h3 id="__builtin_unreachable">__builtin_unreachable</h3>
<!-- ======================================================================= -->
<p><tt>__builtin_unreachable</tt> is used to indicate that a specific point in
the program cannot be reached, even if the compiler might otherwise think it
can. This is useful to improve optimization and eliminates certain warnings.
For example, without the <tt>__builtin_unreachable</tt> in the example below,
the compiler assumes that the inline asm can fall through and prints a "function
declared 'noreturn' should not return" warning.
</p>
<p><b>Syntax:</b></p>
<pre>
__builtin_unreachable()
</pre>
<p><b>Example of Use:</b></p>
<pre>
void myabort(void) __attribute__((noreturn));
void myabort(void) {
asm("int3");
__builtin_unreachable();
}
</pre>
<p><b>Description:</b></p>
<p>The __builtin_unreachable() builtin has completely undefined behavior. Since
it has undefined behavior, it is a statement that it is never reached and the
optimizer can take advantage of this to produce better code. This builtin takes
no arguments and produces a void result.
</p>
<p>Query for this feature with __has_builtin(__builtin_unreachable).</p>
<!-- ======================================================================= -->
<h2 id="targetspecific">Target-Specific Extensions</h2>
<!-- ======================================================================= -->

Просмотреть файл

@ -271,6 +271,7 @@ 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_unreachable, "v", "nr")
BUILTIN(__builtin_shufflevector, "v." , "nc")

Просмотреть файл

@ -224,7 +224,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Value *F = CGM.getIntrinsic(Intrinsic::trap, 0, 0);
return RValue::get(Builder.CreateCall(F));
}
case Builtin::BI__builtin_unreachable: {
Value *V = Builder.CreateUnreachable();
Builder.ClearInsertionPoint();
return RValue::get(V);
}
case Builtin::BI__builtin_powi:
case Builtin::BI__builtin_powif:
case Builtin::BI__builtin_powil: {

Просмотреть файл

@ -41,3 +41,14 @@ void test9(short v) {
old = __sync_fetch_and_add(&old); // expected-error {{too few arguments to function call}}
old = __sync_fetch_and_add((int**)0, 42i); // expected-warning {{imaginary constants are an extension}}
}
// rdar://7236819
void test10(void) __attribute__((noreturn));
void test10(void) {
__asm__("int3");
__builtin_unreachable();
// No warning about falling off the end of a noreturn function.
}