[LLVMdev] [patch] Change llvm_unreachable to use __builtin_unreachable() in -asserts

Duncan Sands baldrick at free.fr
Sat Mar 12 03:01:58 PST 2011


Hi Sebastian,

>>> This patch implements the current consensus of PR8973:
>>> http://llvm.org/bugs/show_bug.cgi?id=8973.
>>>
>>> The macro llvm_unreachable is used in LLVM to indicate that
>>> a particular place in a function is not supposed to be reachable
>>> during execution. Like an assert macro, it takes a string
>>> argument. In +Asserts builds, this string argument, together with
>>> some location information, is passed to a function which prints
>>> the information and calls abort(). In -Asserts builds, this string
>>> argument is dropped (to minimize code size impact), and
>>> instead a bunch of zero arguments are passed to the same
>>> function.
>>
>> I have to ask: what is the point of llvm_unreachable?  Why not just
>> use assert?
>
> assert completely disappears in release builds, often leading to compiler warnings when the compiler thinks a control path doesn't return a value.

if the point is to have a better assert, why not introduce llvm_assert
and do a bulk replace of all asserts with it?  By the way, GCC does this:


#ifdef ENABLE_RUNTIME_CHECKING
#define gcc_assert(EXPR) ((void)(!(EXPR) ? abort (), 0 : 0))
#else
/* Include EXPR, so that unused variable warnings do not occur.  */
#define gcc_assert(EXPR) ((void)(0 && (EXPR)))
#endif
/* Use gcc_unreachable() to mark unreachable locations (like an
    unreachable default case of a switch.  Do not use gcc_assert(0).  */
#define gcc_unreachable() (abort ())

Ciao, Duncan.



More information about the llvm-dev mailing list