Messages in this thread | | | Date | Fri, 21 Nov 2008 08:40:57 -0800 | From | David Daney <> | Subject | Re: [PATCH] MIPS: Make BUG() __noreturn. |
| |
Geert Uytterhoeven wrote: > On Fri, 21 Nov 2008, Alan Cox wrote: >> On Thu, 20 Nov 2008 17:26:36 -0800 >> David Daney <ddaney@caviumnetworks.com> wrote: >> >>> MIPS: Make BUG() __noreturn. >>> >>> Often we do things like put BUG() in the default clause of a case >>> statement. Since it was not declared __noreturn, this could sometimes >>> lead to bogus compiler warnings that variables were used >>> uninitialized. >>> >>> There is a small problem in that we have to put a magic while(1); loop to >>> fool GCC into really thinking it is noreturn. >> That sounds like your __noreturn macro is wrong. >> >> Try using __attribute__ ((__noreturn__)) >> >> if that works then fix up the __noreturn definitions for the MIPS and gcc >> you have. > > Nope, gcc is too smart: > > $ cat a.c > > int f(void) __attribute__((__noreturn__)); > > int f(void) > { > } > > $ gcc -c -Wall a.c > a.c: In function f: > a.c:6: warning: `noreturn' function does return > $ >
That's right.
I was discussing this issue with my colleague Adam Nemet, and we came 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); }
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(); }
David Daney
| |