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