[PATCH] [ms-cxxabi] Get closer to emitting the correct set of destructors in each TU (PR12784).

Timur Iskhodzhanov timurrrr at google.com
Fri Apr 26 07:45:04 PDT 2013

Hi Peter,

@@ -551,17 +551,18 @@ void
MicrosoftCXXNameMangler::manglePostfix(const DeclContext *DC,
 void MicrosoftCXXNameMangler::mangleCXXDtorType(CXXDtorType T) {
   switch (T) {
   case Dtor_VectorDeleting:
     Out << "?_E";
   case Dtor_Deleting:
     Out << "?_G";
   case Dtor_Base:
     Out << "?1";
   case Dtor_Complete:
     Out << "?_D";
Why do you think Complete is "?_D" and Base is "?1" ?
I thought "?1" stands for the "usual" destructor (complete) whilst
"?_D" stands for vbase destructor?
See test below.

@@ -11,7 +11,7 @@ struct S {
 // CHECK: ret void

 // CHECK: define internal void @"__dtor_\01?s@@3US@@A"() [[NUW]] {
-// CHECK: call x86_thiscallcc void @"\01??1S@@QAE at XZ"
+// CHECK: call x86_thiscallcc void @"\01??_DS@@QAE at XZ"
 // CHECK: ret void
I believe this is wrong.
CL does not emit a "??_DS@@" destructor on this file and it calls
"??1S@@..." when "s" is to be destroyed.

@@ -1951,7 +1951,7 @@ void VTableBuilder::dumpLayout(raw_ostream& Out) {
       if (IsComplete)
         Out << "() [complete]";
       else if (isMicrosoftABI())
-        Out << "() [scalar deleting]";
+        Out << "() [vector deleting]";
         Out << "() [deleting]";
Hm, why do you think we should put a vector deleting dtor in the vftable?
Please look at http://llvm.org/bugs/show_bug.cgi?id=15058#c4 - if we
don't emit the deleting dtor definition, the linker error happens for
a scalar deleting dtor.
I think the "scalar" dtor deletes one object whilst the "vector" dtor
deletes multiple objects (e.g. when used with "delete []").
So I don't think we should change what's printed in the

The vector and scalar deleting dtors are usually aliases, right?
Are you sure the scalar dtor is an alias for a vector dtor, not vice versa?

@@ -328,17 +331,18 @@ RValue
MicrosoftCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
   ASTContext &Context = CGF.getContext();
   llvm::Value *ImplicitParam
-    = llvm::ConstantInt::get(llvm::IntegerType::getInt1Ty(CGF.getLLVMContext()),
-                             DtorType == Dtor_Deleting);
+   = llvm::ConstantInt::get(llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()),
+                            DtorType == Dtor_Deleting);
Are you sure there's a 32-bit argument? I'm sure I put Int1/bool on
purpose because I saw zero extension somewhere. Is there any case
where something other than 0/1 is passed as an argument to
scalar/vector deleting dtor?

@@ -230,15 +239,17 @@ CodeGenModule::GetAddrOfCXXConstructor(const
CXXConstructorDecl *ctor,

 void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
+  if (getTarget().getCXXABI().hasDestructorVariants()) {
Hm, is there any C++ ABI which doesn't have destructor variants? :)

2013/4/26 Peter Collingbourne <peter at pcc.me.uk>:
> Hi Timur,
> Patch attached -- please review.
> The main missing part of this patch is vector deleting
> destructors, which we don't need ourselves but may be
> required by MSVC TUs.
Do you have an example when we really need them?

I think they are only needed for polymorphic "operator delete[]",
which stackoverflow says to be an undefined behavior:

If that's just "nice to have", I'd personally like to defer that until
we have a justification to use them and real-world example of code
using it. Otherwise we don't even know if we implement it correctly :)


More information about the cfe-commits mailing list