Re: const versus __attribute__((const))

From: H. Peter Anvin
Date: Tue Dec 09 2003 - 02:43:20 EST


Linus Torvalds wrote:

And as far as I know, it won't. Newer gcc's will _require_ memory
arguments to be lvalues (well, it will warn if they aren't), and will
always turn them into addressables of that particular lvalue.


Well, I get no warning from the following code, with gcc 3.2.2 and -W -Wall:

int foo(int x)
{
int y, z, w;

asm("movl %1,%0" : "=r" (y) : "r" (x));
asm("movl %1,%0" : "=r" (z) : "m" (y+1));
asm("movl %1,%0" : "=r" (w) : "m" (33));

return z+w;
}

The memory operand is definitely not an lvalue. gcc allocates a stack slot
for the y+1 value as a temporary automatic and passes it in. The value 33
is put in the .rodata segment:

00000000 <foo>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 50 push %eax
4: 8b 45 08 mov 0x8(%ebp),%eax
7: 89 c0 mov %eax,%eax
9: 40 inc %eax
a: 89 45 fc mov %eax,0xfffffffc(%ebp)
d: 8b 15 00 00 00 00 mov 0x0,%edx
f: R_386_32 .rodata.cst4
13: 8b 45 fc mov 0xfffffffc(%ebp),%eax
16: 01 d0 add %edx,%eax
18: c9 leave
19: c3 ret

This is actually an issue, because some asm code depends on getting the
proper address - not just the proper value. Things like locks etc care
_deeply_ about more than just the value.

That would be a very bad thing indeed. Fortunately I think it would take
some rather odd contortions on the part of the compiler for that situation
to occur at all, I would think, and if the gcc people have since been
made aware of it it should be pretty easy for them to make sure it will not
happen.

-hpa

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/