Marc Glisse <marc.gli...@inria.fr> wrote:

On Fri, 10 Apr 2020, Martin Liška wrote:

On 4/9/20 10:13 AM, Jonathan Wakely wrote:
On Thu, 9 Apr 2020 at 09:05, Marc Glisse wrote:
Note that the matching is not 1-to-1. Array vs non-array and
aligned vs non-aligned seem important, but sized and unsized delete can
both match the same new, IIUC.
Right.
Not sure about the nothrow versions...
This is valid, and mixes the nothrow new with non-nothrow delete:
delete new (std::nothrow) int;

All right, there's a patch candidate that comes up with the list of possible pairs.
For better readability, I present demangled names:

$ cat /tmp/pairs.txt | c++filt
          "operator new(unsigned long):operator delete(void*)" ,
          "operator new(unsigned long):operator delete(void*, unsigned long)" ,
          "operator new(unsigned long):operator delete(void*, std::nothrow_t 
const&)" ,
          "operator new(unsigned long, std::nothrow_t const&):operator 
delete(void*)" ,
          "operator new(unsigned long, std::nothrow_t const&):operator delete(void*, 
unsigned long)" ,
          "operator new(unsigned long, std::nothrow_t const&):operator delete(void*, 
std::nothrow_t const&)" ,
          /* non-[] operators with alignment.  */
          "operator new(unsigned long, std::align_val_t):operator delete(void*, 
unsigned long, std::align_val_t)" ,
          "operator new(unsigned long, std::align_val_t):operator delete(void*, 
std::align_val_t)" ,
          "operator new(unsigned long, std::align_val_t):operator delete(void*, 
std::align_val_t, std::nothrow_t const&)" ,
          "operator new(unsigned long, std::align_val_t, std::nothrow_t 
const&):operator delete(void*, unsigned long, std::align_val_t)" ,
          "operator new(unsigned long, std::align_val_t, std::nothrow_t 
const&):operator delete(void*, std::align_val_t)" ,
          "operator new(unsigned long, std::align_val_t, std::nothrow_t const&):operator 
delete(void*, std::align_val_t, std::nothrow_t const&)" ,
          /* [] operators.  */
           "operator new[](unsigned long):operator delete[](void*)" ,
           "operator new[](unsigned long):operator delete[](void*, unsigned 
long)" ,
           "operator new[](unsigned long):operator delete[](void*, std::nothrow_t 
const&)" ,
           "operator new[](unsigned long, std::nothrow_t const&):operator 
delete[](void*)" ,
           "operator new[](unsigned long, std::nothrow_t const&):operator 
delete[](void*, unsigned long)" ,
           "operator new[](unsigned long, std::nothrow_t const&):operator 
delete[](void*, std::nothrow_t const&)" ,
          /* [] operators with alignment.  */
           "operator new[](unsigned long, std::align_val_t):operator delete[](void*, 
unsigned long, std::align_val_t)" ,
           "operator new[](unsigned long, std::align_val_t):operator delete[](void*, 
std::align_val_t)" ,
           "operator new[](unsigned long, std::align_val_t):operator delete[](void*, 
std::align_val_t, std::nothrow_t const&)" ,
           "operator new[](unsigned long, std::align_val_t, std::nothrow_t 
const&):operator delete[](void*, unsigned long, std::align_val_t)",
           "operator new[](unsigned long, std::align_val_t, std::nothrow_t 
const&):operator delete[](void*, std::align_val_t)",
           "operator new[](unsigned long, std::align_val_t, std::nothrow_t 
const&):operator delete[](void*, std::align_val_t, std::nothrow_t const&)",

Marc pointed out that some targets do not use the leading '_' (or use 2 dashes?) for mangled named?

This is USER_LABEL_PREFIX.  Several targets, including Darwin, do use it.

Other than pre-pending the U_L_P, name mangling on Darwin (and I’d imagine any other Itanium ABI platform) is as per ABI.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

How do you handle platforms where size_t is not unsigned long?

--
Marc Glisse


Reply via email to