r332639 - Fix a mangling failure on clang-cl C++17
Reid Kleckner via cfe-commits
cfe-commits at lists.llvm.org
Thu May 17 14:07:37 PDT 2018
Thanks! Added in 332646
On Thu, May 17, 2018 at 11:30 AM Nico Weber <thakis at chromium.org> wrote:
> You might've forgotten to svn add the test :-)
>
> On Thu, May 17, 2018, 2:16 PM Reid Kleckner via cfe-commits <
> cfe-commits at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180517/3551bc45/attachment.html>
More information about the cfe-commits
mailing list