This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
x86_64 ABI
- From: Maurizio Vitale <mav at cuma dot polymath-solutions dot lan>
- To: gcc at gcc dot gnu dot org
- Date: Wed, 08 Aug 2007 18:38:13 -0400
- Subject: x86_64 ABI
- Reply-to: maurizio dot vitale at polymath-solutions dot com
with reference to the following:
struct data {
data (long v) : m_data (v) {}
data (const data&) {}
long m_data;
};
data foo (data v) {
return v;
}
my reading of the x86_64 ABI (v .98, sept 2006) on page 17 is that
data should have class MEMORY when passed as argument to function foo.
This because it has a non-trivial copy constructor
(it is not implicitely declared).
But GCC 4.1.1 and a more recent version from svn give (for foo):
.globl _Z3foo4data
.type _Z3foo4data, @function
_Z3foo4data:
.LFB8:
movq %rdi, %rax
ret
.LFE8:
[so v is passed in a register]
The gimple dump (from the svn version) is:
data::data(long int) (this, v)
{
this->m_data = v;
}
data::data(const data&) (this, D.2481)
{
}
data foo(data) (v)
{
struct data & D.2509;
D.2509 = <retval>;
__comp_ctor (D.2509, v);
return <retval>;
}
which seems to confirm v in a register.
So the question is whether my reading of the ABI is wrong (and why).
Thanks a lot and best regards,
Maurizio