[LLVMdev] [cfe-dev] global alignment
John McCall
rjmccall at apple.com
Tue Aug 14 10:19:25 PDT 2012
On Aug 14, 2012, at 7:31 AM, Baozeng wrote:
> Hello all,
> I found that the alignment for stack value has no limitation, but for global value, it has a limitation.
>
> Here is an example:
>
> #include <stdio.h>
> #include <stdlib.h>
>
> char x[4000] __attribute__((aligned(4096)));
>
> int
> main (int argc, char ** argv) {
> char y[4000] __attribute__((aligned(4096)));
> printf("x is %p\n", x);
> printf("y is %p\n", y);
>
> return 0;
> }
>
> After compiled with clang, the result is:
> x is 0x804b000
> y is 0xbf9d8000
>
> They are both aligned to be 4096 as we expected.
>
> Then we change the example as the following:
>
> char x[4000] __attribute__((aligned(8192)));
>
> int
> main (int argc, char ** argv) {
> char y[4000] __attribute__((aligned(8192)));
> printf("x is %p\n", x);
> printf("y is %p\n", y);
>
> return 0;
> }
>
> The result is :
> x is 0x804d000
> y is 0xbffd2000
>
> We can see that the stack value y is aligned to be 8192, but the global value x is not!
>
> My target OS is 32-bit Linux. Anyone can explain this? or is this a bug of clang?
It is very unlikely to be a frontend bug, although I suppose it's possible that it's a backend problem.
It is much more likely that your environment just doesn't support aligning symbols at granularities larger than a page. The page size on x86-32 is 4K because that's what the hardware supports (or 4M if you're using PSE, which Linux does support, but it's not the default, and I don't think it'd solve your problem).
The stack example works because it has to dynamically realign anyway, i.e. it's just %ing the stack pointer, which has no inherent limitations. Note that this is quite expensive and is leaving a potentially huge gap on your stack.
I'll admit to being curious as to why you actually need larger-than-page-size alignment.
John.
More information about the llvm-dev
mailing list