[llvm-bugs] [Bug 40012] New: Tail merging causes mismatched CFA offset for stack adjustments
via llvm-bugs
llvm-bugs at lists.llvm.org
Thu Dec 13 12:46:21 PST 2018
https://bugs.llvm.org/show_bug.cgi?id=40012
Bug ID: 40012
Summary: Tail merging causes mismatched CFA offset for stack
adjustments
Product: libraries
Version: trunk
Hardware: PC
OS: All
Status: NEW
Severity: enhancement
Priority: P
Component: Backend: X86
Assignee: unassignedbugs at nondot.org
Reporter: martin at martin.st
CC: craig.topper at gmail.com, llvm-bugs at lists.llvm.org,
llvm-dev at redking.me.uk, spatel+llvm at rotateright.com
Created attachment 21220
--> https://bugs.llvm.org/attachment.cgi?id=21220&action=edit
LLVM IR for reproducing the issue
In cases where the X86CallFrameOptimization has run on a function, the stack
pointer is adjusted within functions when doing a function call. This leads to
output that looks like this:
pushl $72
.cfi_adjust_cfa_offset 4
calll __Znwj
addl $4, %esp
.cfi_adjust_cfa_offset -4
If multiple blocks within a function share the same tail, tail merging can end
up merging the stack pointer restoration from multiple blocks. This leads to
the CFA offset from interpreting the dwarf CFI being incorrect:
LBB622_99:
Ltmp2253:
movl %eax, %ebx
.cfi_escape 0x2e, 0x04
pushl $__ZGVZNSt3__16locale7classicEvE1c
.cfi_adjust_cfa_offset 4
calll ___cxa_guard_abort
jmp LBB622_158
...
LBB622_155:
pushl %edi
.cfi_adjust_cfa_offset 4
LBB622_156:
calll __ZdlPv
LBB622_157:
addl $4, %esp
.cfi_adjust_cfa_offset -4
jmp LBB622_158
When scanning the DWARF CFI linearly, the CFA offset ends up at +4 after this
section, even though the stack pointer actually always is back where it
started.
If the "addl $4, %esp; .cfi_adjust_cfa_offset -4" is moved back into both
branches, the CFA offset from scanning DWARF CFI ends up correct.
The attached (zipped) LLVM IR, when compiled with "llc locale.ll", shows off
the issue.
This results in broken DWARF unwinding on x86 platforms, in particular on
platforms where X86CallFrameOptimization actually does transformations (which
seems to mostly be on x86_32 platforms with a 4 byte aligned stack). It seems
that the issue can be avoided by either -enable-tail-merge=0 or
-no-x86-call-frame-opt.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20181213/fc9ce4f9/attachment.html>
More information about the llvm-bugs
mailing list