[cxx-abi-dev] C++ ABI version 2

Hubert Tong hstong at ca.ibm.com
Thu Jul 21 00:24:42 UTC 2016


I believe at least the covariant return case can be solved with alternative
function entry points which record the adjustments necessary on return.
Of course, the va_list option can still be presented.

-- HT



From:	Richard Smith <richardsmith at google.com>
To:	"cxx-abi-dev at codesourcery.com" <cxx-abi-dev at codesourcery.com>
Date:	19-07-2016 09:04 p.m.
Subject:	Re: [cxx-abi-dev] C++ ABI version 2
Sent by:	cxx-abi-dev-bounces at codesourcery.com



Another item for the list:

Variadic virtual functions with covariant return types are currently
problematic: it's not possible in general to generate an adjustor thunk for
them, because it's not possible in general to forward a (non-tail) varargs
call. Similar problems exist for the conversion to function pointer in a
non-capturing varargs lambda.

We can fix this by changing the calling convention for varargs non-static
member functions so that they are passed a va_list object directly (that
is, effectively put the va_start / va_end into the caller, and convert a
va_start in the callee into a va_copy from the va_list argument). Then
forwarding the varargs become trivial.

(It seems preferable to apply this change to all non-static member
functions, not just virtual functions, so that we don't need to emit two
quite different codepaths for a call through a pointer to member.)

On 12 May 2015 at 17:29, Richard Smith <richardsmith at google.com> wrote:
  Another item for the Itanium C++ ABI version 2 list:

  The ABI currently specifies that the initial guard variable load is an
  acquire load (3.3.2, "An implementation supporting thread-safety on
  multiprocessor systems must also guarantee that references to the
  initialized object do not occur before the load of the initialization
  flag. On Itanium, this can be done by using a ld1.acq operation to load
  the flag.").

  This is inefficient on systems where an acquire load requires a fence.
  Using an algorithm due to Mike Burrows (described in the appendix of
  http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm) the
  same interface can be implemented starting with a relaxed load, where the
  acquire operation is performed only the first time each thread hits the
  initialization.

  On 19 November 2013 at 17:57, Richard Smith <richardsmith at google.com>
  wrote:
   Hi,

   There are a few things in the current ABI which are known to be
   suboptimal, but we cannot change because doing so would introduce an ABI
   break. However, vendors sometimes get an opportunity to break their ABI
   (or are defining a new ABI), and for some vendors, this is a very common
   occurrence. To this end, I think it would be valuable for the ABI
   document to describe what we might want to put in a 'Version 2' of the
   ABI; that is, a set of changes that we recommend be made whenever a
   vendor has a chance to introduce an ABI break.

   (Or perhaps this should be viewed from the opposite perspective: we
   could make improvements to the ABI, with an annex listing changes that
   old platforms must make for compatibility.)

   Would there be support for this idea?


   In off-line discussion with John McCall, we came up with the following
   list of potential changes that might be made (sorry if I forgot any):

    * Make constructors and destructors return 'this' instead of returning
   'void', in order to allow callers to avoid a reload in common cases and
   to allow more tail calls.
    * Simplify case 2b in non-POD class layout.
    * Make virtual functions that are defined as 'inline' not be key
   functions
    * Fix the bug that -1 is both the null pointer-to-data-member value and
   also a valid value of a pointer-to-data-member (could use SIZE_MIN
   instead)
    * Relax the definition of POD used in the ABI, in order to allow more
   class types to be passed in registers

   Are there any other things that it would make sense to change in a
   version 2 of the ABI?


   Also, would there be any support for documenting common deviations from
   the ABI that platform vendors might want to consider when specifying
   their own ABIs? In addition to some of the above, this would also
   include:

    * Representation of pointers-to-member-functions (in particular, the
   current representation assumes that the lowest bit of a function pointer
   is unused, which isn't true in general)
    * Representation of guard variables (some platforms use the native word
   size rather than forcing this to be 64 bits wide)

   Are there any others?


   Thanks!

_______________________________________________
cxx-abi-dev mailing list
cxx-abi-dev at codesourcery.com
http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://sourcerytools.com/pipermail/cxx-abi-dev/attachments/20160720/0b1b6fdc/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: graycol.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <http://sourcerytools.com/pipermail/cxx-abi-dev/attachments/20160720/0b1b6fdc/attachment.gif>


More information about the cxx-abi-dev mailing list