On Fri, Nov 21, 2008 at 07:46:43PM +0100, Geert Uytterhoeven wrote: > > up with a couple of options: > > > > 1) Enhance the _builtin_trap() function so that we can specify the > > break code that is emitted. This would allow us to do something > > like: > > > > static inline void __attribute__((noreturn)) BUG() > > { > > __builtin_trap(0x200); > > } I had suggested this one before ... > > 2) Create a new builtin '__builtin_noreturn()' that expands to nothing > > but has no CFG edges leaving it, which would allow: > > > > static inline void __attribute__((noreturn)) BUG() > > { > > __asm__ __volatile__("break %0" : : "i" (0x200)); > > __builtin_noreturn(); > > } > > Now I remember, yes, __builtin_trap() is how we fixed it on m68k: I like this interface. > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e8006b060f3982a969c5170aa869628d54dd30d8 > > Of course, if you need a different trap code than the default, you're in > trouble. MIPS ISA newer than MIPS I also have conditional break codes allowing something like this: #define BUG_ON(condition) \ do { \ __asm__ __volatile__("tne $0, %0, %1" \ : : "r" (condition), "i" (BRK_BUG)); \ } while (0) that is test of condition and the trap as a single instruction. Note there are break and trap instructions on MIPS and they are basically doing the same job ... Ralf