Re: r284624 - MS ABI: Fix assert when generating virtual function call with virtual bases and -flto (PR30731)
On Wed, Oct 19, 2016 at 3:38 PM, David Majnemer wrote: > > > On Wed, Oct 19, 2016 at 2:04 PM, Hans Wennborg via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> Author: hans >> Date: Wed Oct 19 13:04:27 2016 >> New Revision: 284624 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=284624&view=rev >> Log: >> MS ABI: Fix assert when generating virtual function call with virtual >> bases and -flto (PR30731) >> >> getClassAtVTableLocation() was calling >> ASTRecordLayout::getBaseClassOffset() on a virtual base, causing an >> assert. >> >> Differential Revision: https://reviews.llvm.org/D25779 >> >> Added: >> cfe/trunk/test/CodeGenCXX/pr30731.cpp >> Modified: >> cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp >> >> Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Mi >> crosoftCXXABI.cpp?rev=284624&r1=284623&r2=284624&view=diff >> >> == >> --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) >> +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Wed Oct 19 13:04:27 2016 >> @@ -1773,15 +1773,8 @@ static const CXXRecordDecl *getClassAtVT >>CharUnits MaxBaseOffset; >>for (auto &&B : RD->bases()) { >> const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); >> -CharUnits BaseOffset = Layout.getBaseClassOffset(Base); >> -if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { >> - MaxBase = Base; >> - MaxBaseOffset = BaseOffset; >> -} >> - } >> - for (auto &&B : RD->vbases()) { >> -const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); >> -CharUnits BaseOffset = Layout.getVBaseClassOffset(Base); >> +CharUnits BaseOffset = B.isVirtual() ? Layout.getVBaseClassOffset(Bas >> e) >> + : Layout.getBaseClassOffset(Base >> ); >> if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { >>MaxBase = Base; >>MaxBaseOffset = BaseOffset; >> > > I don't think this code is correct. > 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. > I think we need to do getVBaseOffset with the MDC's layout similar to how > VTableBuilder.cpp's findPathsToSubobject operates. > Thanks, I will put it on my todo list to try and understand how we need to handle vbases here. Peter > > >> >> Added: cfe/trunk/test/CodeGenCXX/pr30731.cpp >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCX >> X/pr30731.cpp?rev=284624&view=auto >> >> == >> --- cfe/trunk/test/CodeGenCXX/pr30731.cpp (added) >> +++ cfe/trunk/test/CodeGenCXX/pr30731.cpp Wed Oct 19 13:04:27 2016 >> @@ -0,0 +1,21 @@ >> +// RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm -flto -std=c++11 -o >> - %s | FileCheck %s >> + >> +struct A { >> + virtual ~A(); >> +}; >> + >> +struct B {}; >> + >> +struct C { >> + virtual void f(); >> +}; >> + >> +struct S : A, virtual B, C { >> + void f() override; >> +}; >> + >> +void f(S* s) { s->f(); } >> + >> +// CHECK-LABEL: define void @"\01?f@@YAXPAUS@@@Z" >> +// CHECK: call >> +// CHECK: ret void >> >> >> ___ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> > > -- -- Peter ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: r284624 - MS ABI: Fix assert when generating virtual function call with virtual bases and -flto (PR30731)
On Wed, Oct 19, 2016 at 2:04 PM, Hans Wennborg via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: hans > Date: Wed Oct 19 13:04:27 2016 > New Revision: 284624 > > URL: http://llvm.org/viewvc/llvm-project?rev=284624&view=rev > Log: > MS ABI: Fix assert when generating virtual function call with virtual > bases and -flto (PR30731) > > getClassAtVTableLocation() was calling > ASTRecordLayout::getBaseClassOffset() on a virtual base, causing an > assert. > > Differential Revision: https://reviews.llvm.org/D25779 > > Added: > cfe/trunk/test/CodeGenCXX/pr30731.cpp > Modified: > cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > > Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Mi > crosoftCXXABI.cpp?rev=284624&r1=284623&r2=284624&view=diff > > == > --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) > +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Wed Oct 19 13:04:27 2016 > @@ -1773,15 +1773,8 @@ static const CXXRecordDecl *getClassAtVT >CharUnits MaxBaseOffset; >for (auto &&B : RD->bases()) { > const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); > -CharUnits BaseOffset = Layout.getBaseClassOffset(Base); > -if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { > - MaxBase = Base; > - MaxBaseOffset = BaseOffset; > -} > - } > - for (auto &&B : RD->vbases()) { > -const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); > -CharUnits BaseOffset = Layout.getVBaseClassOffset(Base); > +CharUnits BaseOffset = B.isVirtual() ? Layout.getVBaseClassOffset(Bas > e) > + : Layout.getBaseClassOffset(Base > ); > if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { >MaxBase = Base; >MaxBaseOffset = BaseOffset; > I don't think this code is correct. 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. I think we need to do getVBaseOffset with the MDC's layout similar to how VTableBuilder.cpp's findPathsToSubobject operates. > > Added: cfe/trunk/test/CodeGenCXX/pr30731.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCX > X/pr30731.cpp?rev=284624&view=auto > > == > --- cfe/trunk/test/CodeGenCXX/pr30731.cpp (added) > +++ cfe/trunk/test/CodeGenCXX/pr30731.cpp Wed Oct 19 13:04:27 2016 > @@ -0,0 +1,21 @@ > +// RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm -flto -std=c++11 -o - > %s | FileCheck %s > + > +struct A { > + virtual ~A(); > +}; > + > +struct B {}; > + > +struct C { > + virtual void f(); > +}; > + > +struct S : A, virtual B, C { > + void f() override; > +}; > + > +void f(S* s) { s->f(); } > + > +// CHECK-LABEL: define void @"\01?f@@YAXPAUS@@@Z" > +// CHECK: call > +// CHECK: ret void > > > ___ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r284624 - MS ABI: Fix assert when generating virtual function call with virtual bases and -flto (PR30731)
Author: hans Date: Wed Oct 19 13:04:27 2016 New Revision: 284624 URL: http://llvm.org/viewvc/llvm-project?rev=284624&view=rev Log: MS ABI: Fix assert when generating virtual function call with virtual bases and -flto (PR30731) getClassAtVTableLocation() was calling ASTRecordLayout::getBaseClassOffset() on a virtual base, causing an assert. Differential Revision: https://reviews.llvm.org/D25779 Added: cfe/trunk/test/CodeGenCXX/pr30731.cpp Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=284624&r1=284623&r2=284624&view=diff == --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Wed Oct 19 13:04:27 2016 @@ -1773,15 +1773,8 @@ static const CXXRecordDecl *getClassAtVT CharUnits MaxBaseOffset; for (auto &&B : RD->bases()) { const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); -CharUnits BaseOffset = Layout.getBaseClassOffset(Base); -if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { - MaxBase = Base; - MaxBaseOffset = BaseOffset; -} - } - for (auto &&B : RD->vbases()) { -const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); -CharUnits BaseOffset = Layout.getVBaseClassOffset(Base); +CharUnits BaseOffset = B.isVirtual() ? Layout.getVBaseClassOffset(Base) + : Layout.getBaseClassOffset(Base); if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { MaxBase = Base; MaxBaseOffset = BaseOffset; Added: cfe/trunk/test/CodeGenCXX/pr30731.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/pr30731.cpp?rev=284624&view=auto == --- cfe/trunk/test/CodeGenCXX/pr30731.cpp (added) +++ cfe/trunk/test/CodeGenCXX/pr30731.cpp Wed Oct 19 13:04:27 2016 @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm -flto -std=c++11 -o - %s | FileCheck %s + +struct A { + virtual ~A(); +}; + +struct B {}; + +struct C { + virtual void f(); +}; + +struct S : A, virtual B, C { + void f() override; +}; + +void f(S* s) { s->f(); } + +// CHECK-LABEL: define void @"\01?f@@YAXPAUS@@@Z" +// CHECK: call +// CHECK: ret void ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits