You might've forgotten to svn add the test :-) On Thu, May 17, 2018, 2:16 PM Reid Kleckner via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: rnk > Date: Thu May 17 11:12:18 2018 > New Revision: 332639 > > URL: http://llvm.org/viewvc/llvm-project?rev=332639&view=rev > Log: > Fix a mangling failure on clang-cl C++17 > > MethodVFTableLocations in MigrosoftVTableContext contains canonicalized > decl. But, it's sometimes asked to lookup for non-canonicalized decl, > and that causes assertion failure, and compilation failure. > > Fixes PR37481. > > Patch by Taiju Tsuiki! > > Differential Revision: https://reviews.llvm.org/D46929 > > Modified: > cfe/trunk/lib/AST/VTableBuilder.cpp > cfe/trunk/lib/CodeGen/CGCXX.cpp > cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp > cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > > Modified: cfe/trunk/lib/AST/VTableBuilder.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/VTableBuilder.cpp?rev=332639&r1=332638&r2=332639&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/VTableBuilder.cpp (original) > +++ cfe/trunk/lib/AST/VTableBuilder.cpp Thu May 17 11:12:18 2018 > @@ -2223,6 +2223,7 @@ ItaniumVTableContext::ItaniumVTableConte > ItaniumVTableContext::~ItaniumVTableContext() {} > > uint64_t ItaniumVTableContext::getMethodVTableIndex(GlobalDecl GD) { > + GD = GD.getCanonicalDecl(); > MethodVTableIndicesTy::iterator I = MethodVTableIndices.find(GD); > if (I != MethodVTableIndices.end()) > return I->second; > @@ -2503,6 +2504,8 @@ private: > for (const auto &I : MethodInfoMap) { > const CXXMethodDecl *MD = I.first; > const MethodInfo &MI = I.second; > + assert(MD == MD->getCanonicalDecl()); > + > // Skip the methods that the MostDerivedClass didn't override > // and the entries shadowed by return adjusting thunks. > if (MD->getParent() != MostDerivedClass || MI.Shadowed) > @@ -3737,6 +3740,8 @@ MicrosoftVTableContext::getMethodVFTable > if (isa<CXXDestructorDecl>(GD.getDecl())) > assert(GD.getDtorType() == Dtor_Deleting); > > + GD = GD.getCanonicalDecl(); > + > MethodVFTableLocationsTy::iterator I = MethodVFTableLocations.find(GD); > if (I != MethodVFTableLocations.end()) > return I->second; > > Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=332639&r1=332638&r2=332639&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGCXX.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGCXX.cpp Thu May 17 11:12:18 2018 > @@ -267,7 +267,6 @@ static CGCallee BuildAppleKextVirtualCal > const CXXRecordDecl *RD) { > assert(!CGF.CGM.getTarget().getCXXABI().isMicrosoft() && > "No kext in Microsoft ABI"); > - GD = GD.getCanonicalDecl(); > CodeGenModule &CGM = CGF.CGM; > llvm::Value *VTable = CGM.getCXXABI().getAddrOfVTable(RD, CharUnits()); > Ty = Ty->getPointerTo()->getPointerTo(); > @@ -283,7 +282,7 @@ static CGCallee BuildAppleKextVirtualCal > CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt"); > llvm::Value *VFunc = > CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.PointerAlignInBytes); > - CGCallee Callee(GD.getDecl(), VFunc); > + CGCallee Callee(GD.getDecl()->getCanonicalDecl(), VFunc); > return Callee; > } > > > Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=332639&r1=332638&r2=332639&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original) > +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Thu May 17 11:12:18 2018 > @@ -825,7 +825,6 @@ ItaniumCXXABI::EmitMemberFunctionPointer > llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD, > CharUnits > ThisAdjustment) { > assert(MD->isInstance() && "Member function must not be static!"); > - MD = MD->getCanonicalDecl(); > > CodeGenTypes &Types = CGM.getTypes(); > > @@ -1640,7 +1639,6 @@ CGCallee ItaniumCXXABI::getVirtualFuncti > Address This, > llvm::Type *Ty, > SourceLocation Loc) { > - GD = GD.getCanonicalDecl(); > Ty = Ty->getPointerTo()->getPointerTo(); > auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl()); > llvm::Value *VTable = CGF.GetVTablePtr(This, Ty, > MethodDecl->getParent()); > @@ -1674,7 +1672,7 @@ CGCallee ItaniumCXXABI::getVirtualFuncti > VFunc = VFuncLoad; > } > > - CGCallee Callee(MethodDecl, VFunc); > + CGCallee Callee(MethodDecl->getCanonicalDecl(), VFunc); > return Callee; > } > > > Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=332639&r1=332638&r2=332639&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) > +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Thu May 17 11:12:18 2018 > @@ -228,7 +228,6 @@ public: > > const CXXRecordDecl * > getThisArgumentTypeForMethod(const CXXMethodDecl *MD) override { > - MD = MD->getCanonicalDecl(); > if (MD->isVirtual() && !isa<CXXDestructorDecl>(MD)) { > MethodVFTableLocation ML = > CGM.getMicrosoftVTableContext().getMethodVFTableLocation(MD); > @@ -1320,10 +1319,8 @@ void MicrosoftCXXABI::EmitCXXDestructors > > CharUnits > MicrosoftCXXABI::getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD) { > - GD = GD.getCanonicalDecl(); > const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); > > - GlobalDecl LookupGD = GD; > if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) { > // Complete destructors take a pointer to the complete object as a > // parameter, thus don't need this adjustment. > @@ -1332,11 +1329,11 @@ MicrosoftCXXABI::getVirtualFunctionProlo > > // There's no Dtor_Base in vftable but it shares the this adjustment > with > // the deleting one, so look it up instead. > - LookupGD = GlobalDecl(DD, Dtor_Deleting); > + GD = GlobalDecl(DD, Dtor_Deleting); > } > > MethodVFTableLocation ML = > - CGM.getMicrosoftVTableContext().getMethodVFTableLocation(LookupGD); > + CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD); > CharUnits Adjustment = ML.VFPtrOffset; > > // Normal virtual instance methods need to adjust from the vfptr that > first > @@ -1370,7 +1367,6 @@ Address MicrosoftCXXABI::adjustThisArgum > return CGF.Builder.CreateConstByteGEP(This, Adjustment); > } > > - GD = GD.getCanonicalDecl(); > const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); > > GlobalDecl LookupGD = GD; > @@ -1839,7 +1835,6 @@ CGCallee MicrosoftCXXABI::getVirtualFunc > Address This, > llvm::Type *Ty, > SourceLocation Loc) { > - GD = GD.getCanonicalDecl(); > CGBuilderTy &Builder = CGF.Builder; > > Ty = Ty->getPointerTo()->getPointerTo(); > @@ -1878,7 +1873,7 @@ CGCallee MicrosoftCXXABI::getVirtualFunc > VFunc = Builder.CreateAlignedLoad(VFuncPtr, CGF.getPointerAlign()); > } > > - CGCallee Callee(MethodDecl, VFunc); > + CGCallee Callee(MethodDecl->getCanonicalDecl(), VFunc); > return Callee; > } > > @@ -2737,7 +2732,6 @@ llvm::Constant * > MicrosoftCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) { > assert(MD->isInstance() && "Member function must not be static!"); > > - MD = MD->getCanonicalDecl(); > CharUnits NonVirtualBaseAdjustment = CharUnits::Zero(); > const CXXRecordDecl *RD = MD->getParent()->getMostRecentDecl(); > CodeGenTypes &Types = CGM.getTypes(); > > > _______________________________________________ > 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