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