That's a great suggestion!

Attached is a patch that does as you've described and also addresses
all the TODOs I've left for myself in the previous patch.

One questionable change is the removal of "static" for GetVTTParameter.
I didn't want to make it a CGF method as it should be used anywhere
except ItaniumCXXABI.cpp but we have to use it in CGClass.cpp until
the full abstraction is finished.
Please tell me if I cut a corner too much there and how to do it better.

2013/2/26 John McCall <[email protected]>:
> On Feb 25, 2013, at 9:02 AM, Timur Iskhodzhanov <[email protected]> wrote:
>> Attached is a preliminary patch for ctors in -cxx-abi microsoft.
>>
>> It adds:
>> - support for out-of-class constructor definitions (PR12784),
>> - reading and writing proper ctor arguments when dealing with virtual bases.
>> I also tried this patch on some "build, run and verify" tests for
>> virtual inheritance vs ctors and it works great.
>>
>> Can you please take a look at the implementation and tell me if there
>> are any logical mistakes?
>>
>> Also, I've put two TODOs in the code with questions.
>> It would be nice if you could take a look at the logic first and
>> suggest me if my CGCXXABI abstraction plans are sane - before I copy
>> any code between files.
>>
>> If the logic of the patch and the abstraction suggestions are fine,
>> I'll move the code around as described and prepare a patch ready for
>> review.
>
> I think the overall structure here is fine.
>
> +      CXXCtorInitializer *Member = *B;
> +      if (!Member->isBaseInitializer())
> +        continue;
>
> The member and base initializers should already be in the correct
> order, with the virtual base initializers coming first.  That's something
> we can take advantage of by breaking up the loop like so:
>
>   CXXConstructorDecl::init_const_iterator B = CD->init_begin(), E = 
> CD->init_end();
>
>   // Branch on implicit parameter here if necessary.
>   // You can abstract this with some sort of method like this:
>   //   llvm::BasicBlock *emitCtorCompleteObjectCheck();
>   // The rule would be that it only gets implemented for ABIs without
>   // constructor variants, and that it returns the continuation block if a
>   // branch was required.
>   llvm::BasicBlock *baseCtorContBB = 0;
>   if (CD->getParent()->hasVBases() && !ABI.hasConstructorVariants()) {
>     baseCtorContBB = CGM.getCXXABI().emitCtorCompleteObjectCheck();
>   }
>
>   // Emit all the virtual base initializers.
>   while (B != E && (*B)->isBaseInitializer() && (*B)->isBaseVirtual()) {
>     if (CtorType == Ctor_Base) continue;
>     EmitBaseInitializer...
>   }
>
>   // Enter continuation block for conditional branch
>   if (baseCtorContBB) EmitBlock(baseCtorContBB);
>
>   // Emit all the non-virtual base initializers.
>   while (B != E && (*B)->isBaseInitializer()) {
>     assert(!(*B)->isBaseVirtual());
>     EmitBaseInitializer...
>   }
>
>   // Okay, everything else.
>   InitializeVTablePointers
>   ConstructorMemcpyizer CM(...);
>   while (B != E) {
>     assert((*B)->isMemberInitializer());
>     CM.addMember...
>   }
>   CM.finish();
> }
>
> John.

Attachment: ctors_2.patch
Description: Binary data

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to