[llvm-commits] PATCH: review request: X86: Use StackRegister instead of FrameRegister in getFrameIndexReference if stack needs realignment
Alexey Samsonov
samsonov at google.com
Fri Apr 27 06:41:31 PDT 2012
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/
--
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120427/ef13df96/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: llvm_x86_stack_realign_patch.diff
Type: application/octet-stream
Size: 4198 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120427/ef13df96/attachment.obj>
More information about the llvm-commits
mailing list