On Tue, Feb 06, 2007 at 04:44:50PM -0200, Alexandre Oliva wrote:

> > * You can add a return 0 or an exit(1) at the end of the function or
> > in a default label. Since in your case the code is unreachable, the
> > optimiser may remove it or it will never be executed.
> 
> But this would generate additional code for no useful purpose.
> See Ralf Baechle's posting with Subject: False ‘noreturn’ function
> does return warnings.
> 
> /me thinks it would make sense for us to add a __builtin_unreachable()
> that would indicate to GCC that no further action is needed from that
> point on.  A command-line flag could then tell whether GCC should
> generate abort() for such cases, or take a more general "undefined
> behavior" approach without generating additional code to that end.
> 
> Meanwhile, there's __builtin_trap() already, and Ralf might use that
> even to remove the asm volatile, and Paweł could use it in a default:
> label.  It's still worse than a __builtin_assume(e == X || e == Y),
> but it's probably much simpler to implement.  But then,
> __builtin_unreachable() might very well be implemented as
> __builtin_assume(0).

The Linux/MIPS BUG() macro uses a break 512 instruction while
__builtin_trap() generates a plain break that is break 0 instruction.
Aside of that __builtin_trap() would be fine ...

  Ralf

Reply via email to