On Mon, Aug 19, 2019 at 04:08:43PM +0200, Christophe Leroy wrote: > Le 19/08/2019 à 15:23, Segher Boessenkool a écrit : > >On Mon, Aug 19, 2019 at 01:06:31PM +0000, Christophe Leroy wrote: > >>Note that we keep using an assembly text using "twi 31, 0, 0" for > >>inconditional traps because GCC drops all code after > >>__builtin_trap() when the condition is always true at build time. > > > >As I said, it can also do this for conditional traps, if it can prove > >the condition is always true. > > But we have another branch for 'always true' and 'always false' using > __builtin_constant_p(), which don't use __builtin_trap(). Is there > anything wrong with that ?:
The compiler might not realise it is constant when it evaluates the __builtin_constant_p, but only realises it later. As the documentation for the builtin says: A return of 0 does not indicate that the value is _not_ a constant, but merely that GCC cannot prove it is a constant with the specified value of the '-O' option. (and there should be many more and more serious warnings here). > #define BUG_ON(x) do { \ > if (__builtin_constant_p(x)) { \ > if (x) \ > BUG(); \ > } else { \ > if (x) \ > __builtin_trap(); \ > BUG_ENTRY("", 0); \ > } \ > } while (0) I think it may work if you do #define BUG_ON(x) do { \ if (__builtin_constant_p(x)) { \ if (x) \ BUG(); \ } else { \ BUG_ENTRY("", 0); \ if (x) \ __builtin_trap(); \ } \ } while (0) or even just #define BUG_ON(x) do { \ BUG_ENTRY("", 0); \ if (x) \ __builtin_trap(); \ } \ } while (0) if BUG_ENTRY can work for the trap insn *after* it. > >Can you put the bug table asm *before* the __builtin_trap maybe? That > >should make it all work fine... If you somehow can tell what machine > >instruction is that trap, anyway. > > And how can I tell that ? I don't know how BUG_ENTRY works exactly. Segher