Messages in this thread | | | Date | Tue, 11 Nov 2008 11:18:00 -0800 | From | Andrew Morton <> | Subject | Re: rc4-mmotm1110 - Another build error |
| |
On Tue, 11 Nov 2008 14:04:57 -0500 Valdis.Kletnieks@vt.edu wrote:
> On Mon, 10 Nov 2008 19:43:53 PST, Andrew Morton said: > > On Mon, 10 Nov 2008 22:20:33 -0500 Valdis.Kletnieks@vt.edu wrote: > > > > > gcc --version says: > > > gcc (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7) > > > > > > ka-blam number 2: > > > > > > CC kernel/audit.o > > > In file included from include/net/dst.h:15, > > > from include/net/sock.h:57, > > > from kernel/audit.c:54: > > > include/net/neighbour.h:114: error: braced-group within expression allowed > only inside a function > > > make[1]: *** [kernel/audit.o] Error 1 > > > > > > I'm placing bets on patches/align-avoid-evaluating-its-argument-twice.patch > > > > > > Yep, revert that patch, and audit.o compiles again. > > > > > > > I hadn't got around to testing that one yet. > > > > So ug. ALIGN() is used in array sizing and hence has to be a > > compile-time thing. But ALIGN(foo, bar()) will call bar() twice. > > > > Now how do we fix that? > > Can we abuse __builtin_constant_p somehow? Maybe we can make a definition > something like: > > #define __align_mask(x,mask) ( > __builtin_constant_p(mask) ? { > (((x)+(mask))&~(mask)) : > { \ > typeof(mask) __mask = mask; \ > (((x) + __mask) & ~__mask); \ > } > }) > > If it's a compile-time constant, it's safe to evaluate mask twice.
This seems to compile:
int y; char x[__builtin_constant_p(1) ? 42 : y + 1];
so yes, that might work. For this gcc version. However I suspect that it would blow up on us. We keep on having problems with the __builtin_constant_p() in kmalloc() doing wrong things (with gcc-3.2.x, iirc).
It'd be worth trying though.
DIV_ROUND_UP() and roundup() are busted too.
| |