[llvm-commits] PATCH: review request: X86: Use StackRegister instead of FrameRegister in getFrameIndexReference if stack needs realignment
Eric Christopher
echristo at apple.com
Mon Apr 30 11:42:46 PDT 2012
On Apr 27, 2012, at 6:41 AM, Alexey Samsonov <samsonov at google.com> wrote:
> Hi, llvm-commits!
>
> It looks like debug info generated for variables is incorrect in case the stack needs realignment. Consider:
> $ cat test.cc
> #include <stdio.h>
> void run() {
> int x __attribute__((aligned(32))); // enforce alignment
> printf("%p\n", &x);
> }
> $ clang++ -g -c test.cc
> $ objdump -d test.o
> <...>
> 0: 55 push %rbp
> 1: 48 89 e5 mov %rsp,%rbp
> 4: 48 81 e4 e0 ff ff ff and $0xffffffffffffffe0,%rsp <----- stack gets aligned here
> b: 48 83 ec 40 sub $0x40,%rsp
> f: 48 8d 3c 25 00 00 00 lea 0x0,%rdi
> 16: 00
> 17: 48 8d 74 24 20 lea 0x20(%rsp),%rsi
> 1c: b0 00 mov $0x0,%al
> 1e: e8 00 00 00 00 callq 23 <_Z3runv+0x23>
> <...>
> $ readelf -wi test.o
> <...>
> <3><55>: Abbrev Number: 4 (DW_TAG_variable)
> <56> DW_AT_name : (indirect string, offset: 0xa4): x
> <5a> DW_AT_decl_file : 1
> <5b> DW_AT_decl_line : 3
> <5c> DW_AT_type : <0x65>
> <60> DW_AT_location : 2 byte block: 91 20 (DW_OP_fbreg: 32)
>
> That is, dwarf debug info says that "x" is located at offset 0x20 from frame register (%rbp), which is wrong:
> 1) the offset from %rbp should clearly be negative
> 2) we can't calculate it that easy, as stack is aligned (%rsp is changed) after old rsp value is assigned to rbp.
> 3) 0x20 is actually the offset from *%rsp*, not %rbp
>
> I may be wrong, but X86FrameLowering::getFrameIndexOffset in case the stack needs realignment (http://llvm.org/docs/doxygen/html/X86FrameLowering_8cpp_source.html#l01144)
> seems to be calculating the offset from %rsp. If this is true, we should enforce the usage of rsp when calculating variable locations, even if we have frame pointers. This can be fixed by applying the patch.
>
> Codereview link: http://codereview.appspot.com/6127054/
Looks reasonable, please apply.
Thanks!
-eric
More information about the llvm-commits
mailing list