rnk marked an inline comment as done.
rnk added a comment.

In D67028#1653439 <https://reviews.llvm.org/D67028#1653439>, @efriedma wrote:

> Do we have test coverage for a variadic, covariant thunk for a function 
> without a definition?  I don't think there's any way for us to actually emit 
> that, but we should make sure the error message is right.


That appears to have been PR18098, so we have a test for it in thunks.cpp. The 
way the Itanium C++ ABI works, thunks are always emitted as `weak_odr` in TUs 
that provide the implementation, so emitting them with the vtable is just an 
optimization. Basically, clang never *has* to emit a thunk when the definition 
isn't present, it can always choose to simply declare it, and that's what we do 
here: 
https://github.com/llvm/llvm-project/blob/7c8952197b86790b31731d34d559281840916e1f/clang/lib/CodeGen/CGVTables.cpp#L558

In the MS ABI, deriving a new class may require the creation of new thunks for 
methods that were not overridden, so we can't use the same trick.

I think my two new tests are redundant with tests in thunks.cpp, so perhaps I 
should just add some new RUN lines there.

> I'm a little concerned that using musttail thunks with the Itanium ABI will 
> flush out bugs that have been hiding because we have less test coverage on 
> Windows. But it's probably the right thing to do.

True, it's a risk. One other thing worth mentioning is that the IR cloning 
doesn't actually work in the presence of labels-as-values, so we are improving 
conformance in that extra, extra corner case.



================
Comment at: clang/lib/CodeGen/CGVTables.cpp:206
+  AdjustedThisPtr = Builder.CreateBitCast(AdjustedThisPtr,
+                                          ThisStore->getOperand(0)->getType());
   ThisStore->setOperand(0, AdjustedThisPtr);
----------------
efriedma wrote:
> This is fine, I guess, but how is it related?
The MS ABI implementation of `performThisAdjustment` returns a pointer that 
needs to be cast. The covariant test exercises this codepath in the MS ABI, and 
we didn't do that before. I guess the Itanium one does the cast internally, but 
the MS ABI impl has this comment:
  // Don't need to bitcast back, the call CodeGen will handle this.
  return V;

I probably removed the cast when trying to clean up our generated IR.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67028/new/

https://reviews.llvm.org/D67028



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to