[llvm-bugs] [Bug 38466] New: Miscompilation of non-virtual thunk on x86

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Aug 6 23:31:30 PDT 2018


https://bugs.llvm.org/show_bug.cgi?id=38466

            Bug ID: 38466
           Summary: Miscompilation of non-virtual thunk on x86
           Product: new-bugs
           Version: unspecified
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: new bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: mh+llvm at glandium.org
                CC: llvm-bugs at lists.llvm.org

The miscompilation happens in the non-virtual thunk to to
mozilla::net::HttpChannelChild::AsyncCall(void
(mozilla::net::HttpChannelChild::*)(),
nsRunnableMethod<mozilla::net::HttpChannelChild, void, true,
(mozilla::RunnableKind)0>**) when compiling
https://dxr.mozilla.org/mozilla-central/rev/4e56a2f51ad739ca52046723448f3129a58f1666/netwerk/protocol/http/HttpChannelChild.cpp

I'd attach the original preprocessed file, but it's too large for bugzilla.
I've been able to reproduce the problem with clang 6 and current clang trunk
(r339085).

The thunk looks like:
00991a46
<_ZThn1092_N7mozilla3net16HttpChannelChild9AsyncCallEMS1_FvvEPP16nsRunnableMethodIS1_vLb1ELNS_12RunnableKindE0EE>:
  991a46:       55                      push   %ebp
  991a47:       89 e5                   mov    %esp,%ebp
  991a49:       53                      push   %ebx
  991a4a:       83 ec 24                sub    $0x24,%esp
  991a4d:       b9 bc fb ff ff          mov    $0xfffffbbc,%ecx
  991a52:       f2 0f 10 45 f0          movsd  -0x10(%ebp),%xmm0
  991a57:       8b 45 14                mov    0x14(%ebp),%eax
  991a5a:       e8 00 00 00 00          call   991a5f
<_ZThn1092_N7mozilla3net16HttpChannelChild9AsyncCallEMS1_FvvEPP16nsRunnableMethodIS1_vLb1ELNS_12RunnableKindE0EE+0x19>
  991a5f:       5b                      pop    %ebx
  991a60:       03 4d 08                add    0x8(%ebp),%ecx
  991a63:       81 c3 a1 65 01 06       add    $0x60165a1,%ebx
  991a69:       f2 0f 11 44 24 04       movsd  %xmm0,0x4(%esp)
  991a6f:       89 44 24 0c             mov    %eax,0xc(%esp)
  991a73:       89 0c 24                mov    %ecx,(%esp)
  991a76:       e8 bf ba ff ff          call   98d53a
<_ZN7mozilla3net16HttpChannelChild9AsyncCallEMS1_FvvEPP16nsRunnableMethodIS1_vLb1ELNS_12RunnableKindE0EE>
  991a7b:       83 c4 24                add    $0x24,%esp
  991a7e:       5b                      pop    %ebx
  991a7f:       5d                      pop    %ebp
  991a80:       c3                      ret    
  991a81:       90                      nop

Note how it's filling %xmm0 from the uninitialized stack, to pass its content
to the actual AsyncCall function, instead of reading the arguments that were
passed in. The result is that the AsyncCall function is passed broken
arguments.

I'm running the code through creduce, hopefully this will yield a small enough
testcase to attach.

Interestingly, the bug goes away if I make the virtual AsyncCall call a
non-virtual AsyncCallImpl method. A thunk is created, which looks similar, but
it reads arguments properly, albeit unefficiently:

00994de0
<_ZThn1092_N7mozilla3net16HttpChannelChild9AsyncCallEMS1_FvvEPP16nsRunnableMethodIS1_vLb1ELNS_12RunnableKindE0EE>:
  994de0:       55                      push   %ebp
  994de1:       89 e5                   mov    %esp,%ebp
  994de3:       53                      push   %ebx
  994de4:       56                      push   %esi
  994de5:       83 ec 20                sub    $0x20,%esp
  994de8:       8b 4d 0c                mov    0xc(%ebp),%ecx
  994deb:       8b 55 10                mov    0x10(%ebp),%edx
  994dee:       be bc fb ff ff          mov    $0xfffffbbc,%esi
  994df3:       8b 45 14                mov    0x14(%ebp),%eax
  994df6:       e8 00 00 00 00          call   994dfb
<_ZThn1092_N7mozilla3net16HttpChannelChild9AsyncCallEMS1_FvvEPP16nsRunnableMethodIS1_vLb1ELNS_12RunnableKindE0EE+0x1b>
  994dfb:       5b                      pop    %ebx
  994dfc:       03 75 08                add    0x8(%ebp),%esi
  994dff:       81 c3 05 82 01 06       add    $0x6018205,%ebx
  994e05:       89 4d f0                mov    %ecx,-0x10(%ebp)
  994e08:       89 55 f4                mov    %edx,-0xc(%ebp)
  994e0b:       f2 0f 10 45 f0          movsd  -0x10(%ebp),%xmm0
  994e10:       f2 0f 11 44 24 04       movsd  %xmm0,0x4(%esp)
  994e16:       89 44 24 0c             mov    %eax,0xc(%esp)
  994e1a:       89 34 24                mov    %esi,(%esp)
  994e1d:       e8 96 eb ff ff          call   9939b8
<_ZN7mozilla3net16HttpChannelChild13AsyncCallImplEMS1_FvvEPP16nsRunnableMethodIS1_vLb1ELNS_12RunnableKindE0EE>
  994e22:       83 c4 20                add    $0x20,%esp
  994e25:       5e                      pop    %esi
  994e26:       5b                      pop    %ebx
  994e27:       5d                      pop    %ebp
  994e28:       c3                      ret    
  994e29:       90                      nop

Note the pasted assembly was generated with -Os -fno-omit-frame-pointer, but
this happens equally with -O2 and without -fno-omit-frame-pointer. It also
happens with -fno-sse.

-- 
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/20180807/863c98d6/attachment.html>


More information about the llvm-bugs mailing list