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