 |
|
|
|
Actions
|
|
[ Date Prev][ Date Next][ Thread Prev][ Thread Next][ Date Index][ Thread Index]
Revisiting Issue C-18: Result buffers
- To: cxx-abi-dev@xxxxxxxxxxxxxxxx
- Subject: Revisiting Issue C-18: Result buffers
- From: Cary Coutant <cary@xxxxxxxxxx>
- Date: Fri, 29 Apr 2005 13:55:28 -0700
I was recently asked about Section 3.1.4 (Return Values) in the C++ ABI
spec, where it states:
"... if the return value type has a non-trivial copy constructor or
destructor, the caller allocates space for a temporary, and passes a
pointer to the temporary as an implicit first parameter preceding both
the this parameter and user parameters. The callee constructs the
return value into this temporary. On Itanium, the pointer is passed in
out0, different from other large class result buffer pointers, passed
in r8."
The HP compiler follows this convention, but g++ on HP-UX does not,
causing a binary incompatibility between the two compilers.
I dug up Issue C-18, which purports to have changed this convention to
use r8, just as the base C ABI would, and as g++ does:
Summary: Should buffers for results with non-trivial copy constructors
be passed as a dummy first parameter, or in r8 as specified by the
psABI for long structured results?
Resolution: All results with non-trivial copy constructors or
destructors will be returned in buffers allocated by the caller, with
their addresses passed as an implicit first parameter. Other structure
results too large for the return registers are returned in a buffer
created by the caller, with the buffer address passed in r8.
...
[000817 All] Accepted. In all cases where a result class object is
returned in a buffer created by the caller, the buffer address will be
passed in r8, and not like an implicit first parameter.
While the "Resolution" paragraph differs from the final "Accepted"
paragraph, I would take this to mean that the change to use r8 was
accepted. It looks like this change never got incorporated in the ABI
spec.
What does the C++ ABI test suite check for?
-cary
|
|