<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 19, 2016 at 3:38 PM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="gmail-h5">On Wed, Oct 19, 2016 at 2:04 PM, Hans Wennborg via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: hans<br>
Date: Wed Oct 19 13:04:27 2016<br>
New Revision: 284624<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=284624&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=284624&view=rev</a><br>
Log:<br>
MS ABI: Fix assert when generating virtual function call with virtual bases and -flto (PR30731)<br>
<br>
getClassAtVTableLocation() was calling<br>
ASTRecordLayout::getBaseClassO<wbr>ffset() on a virtual base, causing an<br>
assert.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D25779" rel="noreferrer" target="_blank">https://reviews.llvm.org/D2577<wbr>9</a><br>
<br>
Added:<br>
    cfe/trunk/test/CodeGenCXX/pr30<wbr>731.cpp<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/Microsof<wbr>tCXXABI.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/Microsof<wbr>tCXXABI.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=284624&r1=284623&r2=284624&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/lib/CodeGen/Mi<wbr>crosoftCXXABI.cpp?rev=284624&r<wbr>1=284623&r2=284624&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/Microsof<wbr>tCXXABI.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/Microsof<wbr>tCXXABI.cpp Wed Oct 19 13:04:27 2016<br>
@@ -1773,15 +1773,8 @@ static const CXXRecordDecl *getClassAtVT<br>
   CharUnits MaxBaseOffset;<br>
   for (auto &&B : RD->bases()) {<br>
     const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDec<wbr>l();<br>
-    CharUnits BaseOffset = Layout.getBaseClassOffset(Base<wbr>);<br>
-    if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) {<br>
-      MaxBase = Base;<br>
-      MaxBaseOffset = BaseOffset;<br>
-    }<br>
-  }<br>
-  for (auto &&B : RD->vbases()) {<br>
-    const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDec<wbr>l();<br>
-    CharUnits BaseOffset = Layout.getVBaseClassOffset(Bas<wbr>e);<br>
+    CharUnits BaseOffset = B.isVirtual() ? Layout.getVBaseClassOffset(Bas<wbr>e)<br>
+                                         : Layout.getBaseClassOffset(Base<wbr>);<br>
     if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) {<br>
       MaxBase = Base;<br>
       MaxBaseOffset = BaseOffset;<br></blockquote><div><br></div></div></div><div><div>I don't think this code is correct.</div><div>It uses a base's layout to find virtual base offsets, that seems wrong because the virtual base offsets can be different in a base and the most derived class.</div><div>I think we need to do getVBaseOffset with the MDC's layout similar to how VTableBuilder.cpp's findPathsToSubobject operates.</div></div></div></div></div></blockquote><div><br></div><div>Thanks, I will put it on my todo list to try and understand how we need to handle vbases here.</div><div><br></div><div>Peter</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="gmail-h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Added: cfe/trunk/test/CodeGenCXX/pr30<wbr>731.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/pr30731.cpp?rev=284624&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/test/CodeGenCX<wbr>X/pr30731.cpp?rev=284624&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/pr30<wbr>731.cpp (added)<br>
+++ cfe/trunk/test/CodeGenCXX/pr30<wbr>731.cpp Wed Oct 19 13:04:27 2016<br>
@@ -0,0 +1,21 @@<br>
+// RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm -flto -std=c++11 -o - %s | FileCheck %s<br>
+<br>
+struct A {<br>
+  virtual ~A();<br>
+};<br>
+<br>
+struct B {};<br>
+<br>
+struct C {<br>
+  virtual void f();<br>
+};<br>
+<br>
+struct S : A, virtual B, C {<br>
+  void f() override;<br>
+};<br>
+<br>
+void f(S* s) { s->f(); }<br>
+<br>
+// CHECK-LABEL: define void @"\01?f@@YAXPAUS@@@Z"<br>
+// CHECK: call<br>
+// CHECK: ret void<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">-- <div>Peter</div></div></div>
</div></div>