<html>
<head>
<base href="https://bugs.llvm.org/">
</head>
<body><table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Bug ID</th>
<td><a class="bz_bug_link
bz_status_NEW "
title="NEW - ABI mismatch with GCC: missing/extra sret for variadic function templates"
href="https://bugs.llvm.org/show_bug.cgi?id=33112">33112</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>ABI mismatch with GCC: missing/extra sret for variadic function templates
</td>
</tr>
<tr>
<th>Product</th>
<td>clang
</td>
</tr>
<tr>
<th>Version</th>
<td>unspecified
</td>
</tr>
<tr>
<th>Hardware</th>
<td>PC
</td>
</tr>
<tr>
<th>OS</th>
<td>All
</td>
</tr>
<tr>
<th>Status</th>
<td>NEW
</td>
</tr>
<tr>
<th>Severity</th>
<td>normal
</td>
</tr>
<tr>
<th>Priority</th>
<td>P
</td>
</tr>
<tr>
<th>Component</th>
<td>LLVM Codegen
</td>
</tr>
<tr>
<th>Assignee</th>
<td>unassignedclangbugs@nondot.org
</td>
</tr>
<tr>
<th>Reporter</th>
<td>syniurge@gmail.com
</td>
</tr>
<tr>
<th>CC</th>
<td>llvm-bugs@lists.llvm.org
</td>
</tr></table>
<p>
<div>
<pre>Feed the following code to <a href="https://godbolt.org/">https://godbolt.org/</a>:
#include <tuple>
using namespace std;
template<typename... _Elements>
tuple<_Elements...>
forward_as_tuple2(_Elements... __args) noexcept
{ return tuple<_Elements...>(__args...); }
void f() {
forward_as_tuple2("s");
}
Below is the amd64 disassembly for GCC 5.4 vs Clang 3.9. The function produced
by GCC expects two argument registers, one of them holding the sret pointer.
When I mixed libraries built by GCC and by Clang this resulted in hard to track
bugs. I don't have the will to investigate further (is it truly related to
variadic function templates I don't know), but wanted to let you know.
GCC
Dump of assembler code for function
std::forward_as_tuple<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >&&):
=> 0x0000000000c90dac <+0>: push %rbp
0x0000000000c90dad <+1>: mov %rsp,%rbp
0x0000000000c90db0 <+4>: sub $0x10,%rsp
0x0000000000c90db4 <+8>: mov %rdi,-0x8(%rbp)
0x0000000000c90db8 <+12>: mov %rsi,-0x10(%rbp)
0x0000000000c90dbc <+16>: mov -0x10(%rbp),%rax
0x0000000000c90dc0 <+20>: mov %rax,%rdi
0x0000000000c90dc3 <+23>: callq 0x636fb0
<std::forward<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(std::remove_reference<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > >::type&)>
0x0000000000c90dc8 <+28>: mov %rax,%rdx
0x0000000000c90dcb <+31>: mov -0x8(%rbp),%rax
0x0000000000c90dcf <+35>: mov %rdx,%rsi
0x0000000000c90dd2 <+38>: mov %rax,%rdi
0x0000000000c90dd5 <+41>: callq 0xc90ce2
<std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&&>::tuple<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >,
void>(std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&&)>
0x0000000000c90dda <+46>: mov -0x8(%rbp),%rax
0x0000000000c90dde <+50>: leaveq
0x0000000000c90ddf <+51>: retq
End of assembler dump.
Clang
Dump of assembler code for function
std::forward_as_tuple<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >&&):
=> 0x000000000097ba50 <+0>: push %rbp
0x000000000097ba51 <+1>: mov %rsp,%rbp
0x000000000097ba54 <+4>: sub $0x10,%rsp
0x000000000097ba58 <+8>: mov %rdi,-0x10(%rbp)
0x000000000097ba5c <+12>: mov -0x10(%rbp),%rdi
0x000000000097ba60 <+16>: callq 0x644c20
<std::forward<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(std::remove_reference<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > >::type&)>
0x000000000097ba65 <+21>: lea -0x8(%rbp),%rdi
0x000000000097ba69 <+25>: mov %rax,%rsi
0x000000000097ba6c <+28>: callq 0x97c180
<std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&&>::tuple<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >,
void>(std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&&)>
0x000000000097ba71 <+33>: mov -0x8(%rbp),%rax
0x000000000097ba75 <+37>: add $0x10,%rsp
0x000000000097ba79 <+41>: pop %rbp
0x000000000097ba7a <+42>: retq
End of assembler dump.</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are on the CC list for the bug.</li>
</ul>
</body>
</html>