Confirm, the assertions are different from the last one. On Mon, Aug 17, 2015 at 11:45 PM, Justin Bogner via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Richard Smith <rich...@metafoo.co.uk> writes: > > Are you sure it was this change and not r245265? > > Pretty sure - I ran the crash repro script with tot and it repro'd, then > with r245264 reverted and it didn't. That's when I pushed the revert. > > > On Aug 17, 2015 10:41 PM, "Justin Bogner via cfe-commits" < > > cfe-commits@lists.llvm.org> wrote: > > > > Author: bogner > > Date: Tue Aug 18 00:40:20 2015 > > New Revision: 245267 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=245267&view=rev > > Log: > > Revert "Generating assumption loads of vptr after ctor call (fixed)" > > > > Bootstrap bots were failing: > > > > > http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_build/6382/ > > http://bb.pgr.jp/builders/clang-3stage-i686-linux/builds/2969 > > > > This reverts r245264. > > > > Removed: > > cfe/trunk/test/CodeGenCXX/vtable-assume-load.cpp > > Modified: > > cfe/trunk/lib/CodeGen/CGCXXABI.h > > cfe/trunk/lib/CodeGen/CGCall.cpp > > cfe/trunk/lib/CodeGen/CGClass.cpp > > cfe/trunk/lib/CodeGen/CodeGenFunction.h > > cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp > > cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > > cfe/trunk/test/CodeGen/available-externally-hidden.cpp > > cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp > > cfe/trunk/test/CodeGenCXX/template-instantiation.cpp > > cfe/trunk/test/CodeGenCXX/thunks.cpp > > cfe/trunk/test/CodeGenCXX/virtual-base-ctor.cpp > > cfe/trunk/test/CodeGenCXX/vtable-available-externally.cpp > > > > Modified: cfe/trunk/lib/CodeGen/CGCXXABI.h > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXXABI.h? > > rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/lib/CodeGen/CGCXXABI.h (original) > > +++ cfe/trunk/lib/CodeGen/CGCXXABI.h Tue Aug 18 00:40:20 2015 > > @@ -346,25 +346,13 @@ public: > > virtual void emitVTableDefinitions(CodeGenVTables &CGVT, > > const CXXRecordDecl *RD) = 0; > > > > - /// Checks if ABI requires extra virtual offset for vtable field. > > - virtual bool > > - isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF, > > - CodeGenFunction::VPtr Vptr) = > 0; > > - > > - /// Checks if ABI requires to initilize vptrs for given dynamic > class. > > - virtual bool doStructorsInitializeVPtrs(const CXXRecordDecl > > *VTableClass) = 0; > > - > > - /// Get the address point of the vtable for the given base > subobject. > > - virtual llvm::Constant * > > - getVTableAddressPoint(BaseSubobject Base, > > - const CXXRecordDecl *VTableClass) = 0; > > - > > /// Get the address point of the vtable for the given base > subobject > > while > > - /// building a constructor or a destructor. > > - virtual llvm::Value * > > - getVTableAddressPointInStructor(CodeGenFunction &CGF, const > > CXXRecordDecl *RD, > > - BaseSubobject Base, > > - const CXXRecordDecl > *NearestVBase) = 0; > > + /// building a constructor or a destructor. On return, > > NeedsVirtualOffset > > + /// tells if a virtual base adjustment is needed in order to get > the > > offset > > + /// of the base subobject. > > + virtual llvm::Value *getVTableAddressPointInStructor( > > + CodeGenFunction &CGF, const CXXRecordDecl *RD, BaseSubobject > Base, > > + const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) > = 0; > > > > /// Get the address point of the vtable for the given base > subobject > > while > > /// building a constexpr. > > > > Modified: cfe/trunk/lib/CodeGen/CGCall.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp? > > rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) > > +++ cfe/trunk/lib/CodeGen/CGCall.cpp Tue Aug 18 00:40:20 2015 > > @@ -1412,8 +1412,7 @@ void CodeGenModule::ConstructAttributeLi > > > > if (const FunctionDecl *Fn = > dyn_cast<FunctionDecl>(TargetDecl)) { > > const FunctionProtoType *FPT = Fn->getType()->getAs > > <FunctionProtoType>(); > > - if (FPT && > !isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) > > && > > - FPT->isNothrow(getContext())) > > + if (FPT && FPT->isNothrow(getContext())) > > FuncAttrs.addAttribute(llvm::Attribute::NoUnwind); > > // Don't use [[noreturn]] or _Noreturn for a call to a virtual > > function. > > // These attributes are not inherited by overloads. > > > > Modified: cfe/trunk/lib/CodeGen/CGClass.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ > > CGClass.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/lib/CodeGen/CGClass.cpp (original) > > +++ cfe/trunk/lib/CodeGen/CGClass.cpp Tue Aug 18 00:40:20 2015 > > @@ -1806,14 +1806,12 @@ void CodeGenFunction::EmitCXXConstructor > > bool ForVirtualBase, > > bool Delegating, > llvm::Value > > *This, > > const CXXConstructExpr > *E) { > > - const CXXRecordDecl *ClassDecl = D->getParent(); > > - > > // C++11 [class.mfct.non-static]p2: > > // If a non-static member function of a class X is called for an > > object that > > // is not of type X, or of a type derived from X, the behavior > is > > undefined. > > // FIXME: Provide a source location here. > > EmitTypeCheck(CodeGenFunction::TCK_ConstructorCall, > SourceLocation(), > > This, > > - getContext().getRecordType(ClassDecl)); > > + getContext().getRecordType(D->getParent())); > > > > if (D->isTrivial() && D->isDefaultConstructor()) { > > assert(E->getNumArgs() == 0 && "trivial default ctor with > args"); > > @@ -1829,7 +1827,7 @@ void CodeGenFunction::EmitCXXConstructor > > const Expr *Arg = E->getArg(0); > > QualType SrcTy = Arg->getType(); > > llvm::Value *Src = EmitLValue(Arg).getAddress(); > > - QualType DestTy = getContext().getTypeDeclType(ClassDecl); > > + QualType DestTy = getContext().getTypeDeclType(D->getParent()); > > EmitAggregateCopyCtor(This, Src, DestTy, SrcTy); > > return; > > } > > @@ -1852,41 +1850,6 @@ void CodeGenFunction::EmitCXXConstructor > > const CGFunctionInfo &Info = > > CGM.getTypes().arrangeCXXConstructorCall(Args, D, Type, > ExtraArgs); > > EmitCall(Info, Callee, ReturnValueSlot(), Args, D); > > - > > - // Generate vtable assumptions if we're constructing a complete > object > > - // with a vtable. We don't do this for base subobjects for two > > reasons: > > - // first, it's incorrect for classes with virtual bases, and > second, > > we're > > - // about to overwrite the vptrs anyway. > > - if (CGM.getCodeGenOpts().OptimizationLevel > 0 && > > - ClassDecl->isDynamicClass() && Type != Ctor_Base) > > - EmitVTableAssumptionLoads(ClassDecl, This); > > -} > > - > > -void CodeGenFunction::EmitVTableAssumptionLoad(const VPtr &Vptr, > > - llvm::Value *This) { > > - llvm::Value *VTableGlobal = > > - CGM.getCXXABI().getVTableAddressPoint(Vptr.Base, > Vptr.VTableClass); > > - if (!VTableGlobal) > > - return; > > - > > - // We can just use the base offset in the complete class. > > - CharUnits NonVirtualOffset = Vptr.Base.getBaseOffset(); > > - > > - if (!NonVirtualOffset.isZero()) > > - This = > > - ApplyNonVirtualAndVirtualOffset(*this, This, > NonVirtualOffset, > > nullptr); > > - > > - llvm::Value *VPtrValue = GetVTablePtr(This, > VTableGlobal->getType()); > > - llvm::Value *Cmp = > > - Builder.CreateICmpEQ(VPtrValue, VTableGlobal, "cmp.vtables"); > > - Builder.CreateAssumption(Cmp); > > -} > > - > > -void CodeGenFunction::EmitVTableAssumptionLoads(const CXXRecordDecl > > *ClassDecl, > > - llvm::Value *This) { > > - if (CGM.getCXXABI().doStructorsInitializeVPtrs(ClassDecl)) > > - for (const VPtr &Vptr : getVTablePointers(ClassDecl)) > > - EmitVTableAssumptionLoad(Vptr, This); > > } > > > > void > > @@ -2054,12 +2017,24 @@ void CodeGenFunction::PushDestructorClea > > PushDestructorCleanup(D, Addr); > > } > > > > -void CodeGenFunction::InitializeVTablePointer(const VPtr &Vptr) { > > +void > > +CodeGenFunction::InitializeVTablePointer(BaseSubobject Base, > > + const CXXRecordDecl > > *NearestVBase, > > + CharUnits > > OffsetFromNearestVBase, > > + const CXXRecordDecl > > *VTableClass) { > > + const CXXRecordDecl *RD = Base.getBase(); > > + > > + // Don't initialize the vtable pointer if the class is marked > with the > > + // 'novtable' attribute. > > + if ((RD == VTableClass || RD == NearestVBase) && > > + VTableClass->hasAttr<MSNoVTableAttr>()) > > + return; > > + > > // Compute the address point. > > + bool NeedsVirtualOffset; > > llvm::Value *VTableAddressPoint = > > CGM.getCXXABI().getVTableAddressPointInStructor( > > - *this, Vptr.VTableClass, Vptr.Base, Vptr.NearestVBase); > > - > > + *this, VTableClass, Base, NearestVBase, > NeedsVirtualOffset); > > if (!VTableAddressPoint) > > return; > > > > @@ -2067,15 +2042,17 @@ void CodeGenFunction::InitializeVTablePo > > llvm::Value *VirtualOffset = nullptr; > > CharUnits NonVirtualOffset = CharUnits::Zero(); > > > > - if (CGM.getCXXABI().isVirtualOffsetNeededForVTableField(*this, > Vptr)) { > > + if (NeedsVirtualOffset) { > > // We need to use the virtual base offset offset because the > virtual > > base > > // might have a different offset in the most derived class. > > - VirtualOffset = CGM.getCXXABI().GetVirtualBaseClassOffset( > > - *this, LoadCXXThis(), Vptr.VTableClass, Vptr.NearestVBase); > > - NonVirtualOffset = Vptr.OffsetFromNearestVBase; > > + VirtualOffset = CGM.getCXXABI().GetVirtualBaseClassOffset(*this, > > + > LoadCXXThis > > (), > > + > > VTableClass, > > + > > NearestVBase); > > + NonVirtualOffset = OffsetFromNearestVBase; > > } else { > > // We can just use the base offset in the complete class. > > - NonVirtualOffset = Vptr.Base.getBaseOffset(); > > + NonVirtualOffset = Base.getBaseOffset(); > > } > > > > // Apply the offsets. > > @@ -2094,36 +2071,23 @@ void CodeGenFunction::InitializeVTablePo > > ->getPointerTo(); > > VTableField = Builder.CreateBitCast(VTableField, VTablePtrTy-> > > getPointerTo()); > > VTableAddressPoint = Builder.CreateBitCast(VTableAddressPoint, > > VTablePtrTy); > > - > > llvm::StoreInst *Store = Builder.CreateStore(VTableAddressPoint, > > VTableField); > > CGM.DecorateInstruction(Store, CGM.getTBAAInfoForVTablePtr()); > > } > > > > -CodeGenFunction::VPtrsVector > > -CodeGenFunction::getVTablePointers(const CXXRecordDecl > *VTableClass) { > > - CodeGenFunction::VPtrsVector VPtrsResult; > > - VisitedVirtualBasesSetTy VBases; > > - getVTablePointers(BaseSubobject(VTableClass, CharUnits::Zero()), > > - /*NearestVBase=*/nullptr, > > - /*OffsetFromNearestVBase=*/CharUnits::Zero(), > > - /*BaseIsNonVirtualPrimaryBase=*/false, > VTableClass, > > VBases, > > - VPtrsResult); > > - return VPtrsResult; > > -} > > - > > -void CodeGenFunction::getVTablePointers(BaseSubobject Base, > > - const CXXRecordDecl > > *NearestVBase, > > - CharUnits > OffsetFromNearestVBase, > > - bool > BaseIsNonVirtualPrimaryBase, > > - const CXXRecordDecl > *VTableClass, > > - VisitedVirtualBasesSetTy > &VBases, > > - VPtrsVector &Vptrs) { > > +void > > +CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, > > + const CXXRecordDecl > > *NearestVBase, > > + CharUnits > > OffsetFromNearestVBase, > > + bool > > BaseIsNonVirtualPrimaryBase, > > + const CXXRecordDecl > > *VTableClass, > > + VisitedVirtualBasesSetTy& > > VBases) { > > // If this base is a non-virtual primary base the address point > has > > already > > // been set. > > if (!BaseIsNonVirtualPrimaryBase) { > > // Initialize the vtable pointer for this base. > > - VPtr Vptr = {Base, NearestVBase, OffsetFromNearestVBase, > > VTableClass}; > > - Vptrs.push_back(Vptr); > > + InitializeVTablePointer(Base, NearestVBase, > OffsetFromNearestVBase, > > + VTableClass); > > } > > > > const CXXRecordDecl *RD = Base.getBase(); > > @@ -2161,10 +2125,11 @@ void CodeGenFunction::getVTablePointers( > > BaseDeclIsNonVirtualPrimaryBase = Layout.getPrimaryBase() == > > BaseDecl; > > } > > > > - getVTablePointers( > > - BaseSubobject(BaseDecl, BaseOffset), > > - I.isVirtual() ? BaseDecl : NearestVBase, > > BaseOffsetFromNearestVBase, > > - BaseDeclIsNonVirtualPrimaryBase, VTableClass, VBases, > Vptrs); > > + InitializeVTablePointers(BaseSubobject(BaseDecl, BaseOffset), > > + I.isVirtual() ? BaseDecl : > NearestVBase, > > + BaseOffsetFromNearestVBase, > > + BaseDeclIsNonVirtualPrimaryBase, > > + VTableClass, VBases); > > } > > } > > > > @@ -2174,9 +2139,11 @@ void CodeGenFunction::InitializeVTablePo > > return; > > > > // Initialize the vtable pointers for this class and all of its > bases. > > - if (CGM.getCXXABI().doStructorsInitializeVPtrs(RD)) > > - for (const VPtr &Vptr : getVTablePointers(RD)) > > - InitializeVTablePointer(Vptr); > > + VisitedVirtualBasesSetTy VBases; > > + InitializeVTablePointers(BaseSubobject(RD, CharUnits::Zero()), > > + /*NearestVBase=*/nullptr, > > + > /*OffsetFromNearestVBase=*/CharUnits::Zero(), > > + /*BaseIsNonVirtualPrimaryBase=*/false, > RD, > > VBases); > > > > if (RD->getNumVBases()) > > > CGM.getCXXABI().initializeHiddenVirtualInheritanceMembers(*this, RD); > > > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ > > CodeGenFunction.h?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) > > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Tue Aug 18 00:40:20 2015 > > @@ -1309,27 +1309,21 @@ public: > > void EmitInitializerForField(FieldDecl *Field, LValue LHS, Expr > *Init, > > ArrayRef<VarDecl *> ArrayIndexes); > > > > - /// Struct with all informations about dynamic [sub]class needed > to set > > vptr. > > - struct VPtr { > > - BaseSubobject Base; > > - const CXXRecordDecl *NearestVBase; > > - CharUnits OffsetFromNearestVBase; > > - const CXXRecordDecl *VTableClass; > > - }; > > - > > - /// Initialize the vtable pointer of the given subobject. > > - void InitializeVTablePointer(const VPtr &vptr); > > - > > - typedef llvm::SmallVector<VPtr, 4> VPtrsVector; > > + /// InitializeVTablePointer - Initialize the vtable pointer of the > > given > > + /// subobject. > > + /// > > + void InitializeVTablePointer(BaseSubobject Base, > > + const CXXRecordDecl *NearestVBase, > > + CharUnits OffsetFromNearestVBase, > > + const CXXRecordDecl *VTableClass); > > > > typedef llvm::SmallPtrSet<const CXXRecordDecl *, 4> > > VisitedVirtualBasesSetTy; > > - VPtrsVector getVTablePointers(const CXXRecordDecl *VTableClass); > > - > > - void getVTablePointers(BaseSubobject Base, const CXXRecordDecl > > *NearestVBase, > > - CharUnits OffsetFromNearestVBase, > > - bool BaseIsNonVirtualPrimaryBase, > > - const CXXRecordDecl *VTableClass, > > - VisitedVirtualBasesSetTy &VBases, > VPtrsVector & > > vptrs); > > + void InitializeVTablePointers(BaseSubobject Base, > > + const CXXRecordDecl *NearestVBase, > > + CharUnits OffsetFromNearestVBase, > > + bool BaseIsNonVirtualPrimaryBase, > > + const CXXRecordDecl *VTableClass, > > + VisitedVirtualBasesSetTy& VBases); > > > > void InitializeVTablePointers(const CXXRecordDecl *ClassDecl); > > > > @@ -1758,19 +1752,10 @@ public: > > // they are substantially the same. > > void EmitDelegatingCXXConstructorCall(const CXXConstructorDecl > *Ctor, > > const FunctionArgList > &Args); > > - > > void EmitCXXConstructorCall(const CXXConstructorDecl *D, > CXXCtorType > > Type, > > bool ForVirtualBase, bool Delegating, > > llvm::Value *This, const > CXXConstructExpr > > *E); > > > > - /// Emit assumption load for all bases. Requires to be be called > only > > on > > - /// most-derived class and not under construction of the object. > > - void EmitVTableAssumptionLoads(const CXXRecordDecl *ClassDecl, > > - llvm::Value *This); > > - > > - /// Emit assumption that vptr load == global vtable. > > - void EmitVTableAssumptionLoad(const VPtr &vptr, llvm::Value > *This); > > - > > void EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D, > > llvm::Value *This, llvm::Value *Src, > > const CXXConstructExpr *E); > > > > Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ > > ItaniumCXXABI.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original) > > +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Tue Aug 18 00:40:20 2015 > > @@ -190,24 +190,10 @@ public: > > void emitVTableDefinitions(CodeGenVTables &CGVT, > > const CXXRecordDecl *RD) override; > > > > - bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF, > > - CodeGenFunction::VPtr > Vptr) > > override; > > - > > - bool doStructorsInitializeVPtrs(const CXXRecordDecl *VTableClass) > > override { > > - return true; > > - } > > - > > - llvm::Constant * > > - getVTableAddressPoint(BaseSubobject Base, > > - const CXXRecordDecl *VTableClass) override; > > - > > llvm::Value *getVTableAddressPointInStructor( > > CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, > > - BaseSubobject Base, const CXXRecordDecl *NearestVBase) > override; > > - > > - llvm::Value *getVTableAddressPointInStructorWithVTT( > > - CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, > > - BaseSubobject Base, const CXXRecordDecl *NearestVBase); > > + BaseSubobject Base, const CXXRecordDecl *NearestVBase, > > + bool &NeedsVirtualOffset) override; > > > > llvm::Constant * > > getVTableAddressPointForConstExpr(BaseSubobject Base, > > @@ -1390,29 +1376,41 @@ void ItaniumCXXABI::emitVTableDefinition > > CGM.EmitVTableBitSetEntries(VTable, VTLayout); > > } > > > > -bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField( > > - CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) { > > - if (Vptr.NearestVBase == nullptr) > > - return false; > > - return NeedsVTTParameter(CGF.CurGD); > > -} > > - > > llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor( > > CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, > BaseSubobject > > Base, > > - const CXXRecordDecl *NearestVBase) { > > + const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) { > > + bool NeedsVTTParam = CGM.getCXXABI().NeedsVTTParameter(CGF.CurGD); > > + NeedsVirtualOffset = (NeedsVTTParam && NearestVBase); > > + > > + llvm::Value *VTableAddressPoint; > > + if (NeedsVTTParam && (Base.getBase()->getNumVBases() || > NearestVBase)) > > { > > + // Get the secondary vpointer index. > > + uint64_t VirtualPointerIndex = > > + > CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, > > Base); > > + > > + /// Load the VTT. > > + llvm::Value *VTT = CGF.LoadCXXVTT(); > > + if (VirtualPointerIndex) > > + VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, > > VirtualPointerIndex); > > > > - if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) && > > - NeedsVTTParameter(CGF.CurGD)) { > > - return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, > Base, > > - NearestVBase); > > + // And load the address point from the VTT. > > + VTableAddressPoint = CGF.Builder.CreateLoad(VTT); > > + } else { > > + llvm::Constant *VTable = > > + CGM.getCXXABI().getAddrOfVTable(VTableClass, CharUnits()); > > + uint64_t AddressPoint = CGM.getItaniumVTableContext() > > + .getVTableLayout(VTableClass) > > + .getAddressPoint(Base); > > + VTableAddressPoint = > > + CGF.Builder.CreateConstInBoundsGEP2_64(VTable, 0, > AddressPoint); > > } > > - return getVTableAddressPoint(Base, VTableClass); > > + > > + return VTableAddressPoint; > > } > > > > -llvm::Constant * > > -ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base, > > - const CXXRecordDecl > *VTableClass) { > > - llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, > CharUnits()); > > +llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr( > > + BaseSubobject Base, const CXXRecordDecl *VTableClass) { > > + auto *VTable = getAddrOfVTable(VTableClass, CharUnits()); > > > > // Find the appropriate vtable within the vtable group. > > uint64_t AddressPoint = CGM.getItaniumVTableContext() > > @@ -1427,30 +1425,6 @@ ItaniumCXXABI::getVTableAddressPoint(Bas > > VTable, > Indices); > > } > > > > -llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT( > > - CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, > BaseSubobject > > Base, > > - const CXXRecordDecl *NearestVBase) { > > - assert((Base.getBase()->getNumVBases() || NearestVBase != > nullptr) && > > - NeedsVTTParameter(CGF.CurGD) && "This class doesn't have > VTT"); > > - > > - // Get the secondary vpointer index. > > - uint64_t VirtualPointerIndex = > > - CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, > > Base); > > - > > - /// Load the VTT. > > - llvm::Value *VTT = CGF.LoadCXXVTT(); > > - if (VirtualPointerIndex) > > - VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, > > VirtualPointerIndex); > > - > > - // And load the address point from the VTT. > > - return CGF.Builder.CreateLoad(VTT); > > -} > > - > > -llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr( > > - BaseSubobject Base, const CXXRecordDecl *VTableClass) { > > - return getVTableAddressPoint(Base, VTableClass); > > -} > > - > > llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const > CXXRecordDecl > > *RD, > > CharUnits > > VPtrOffset) { > > assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr > > offsets"); > > > > Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ > > MicrosoftCXXABI.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) > > +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Tue Aug 18 00:40:20 > 2015 > > @@ -215,22 +215,10 @@ public: > > void emitVTableDefinitions(CodeGenVTables &CGVT, > > const CXXRecordDecl *RD) override; > > > > - bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF, > > - CodeGenFunction::VPtr > Vptr) > > override; > > - > > - /// Don't initialize vptrs if dynamic class > > - /// is marked with with the 'novtable' attribute. > > - bool doStructorsInitializeVPtrs(const CXXRecordDecl *VTableClass) > > override { > > - return !VTableClass->hasAttr<MSNoVTableAttr>(); > > - } > > - > > - llvm::Constant * > > - getVTableAddressPoint(BaseSubobject Base, > > - const CXXRecordDecl *VTableClass) override; > > - > > llvm::Value *getVTableAddressPointInStructor( > > CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, > > - BaseSubobject Base, const CXXRecordDecl *NearestVBase) > override; > > + BaseSubobject Base, const CXXRecordDecl *NearestVBase, > > + bool &NeedsVirtualOffset) override; > > > > llvm::Constant * > > getVTableAddressPointForConstExpr(BaseSubobject Base, > > @@ -1580,15 +1568,14 @@ void MicrosoftCXXABI::emitVTableDefiniti > > } > > } > > > > -bool MicrosoftCXXABI::isVirtualOffsetNeededForVTableField( > > - CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) { > > - return Vptr.NearestVBase != nullptr; > > -} > > - > > llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor( > > CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, > BaseSubobject > > Base, > > - const CXXRecordDecl *NearestVBase) { > > - llvm::Constant *VTableAddressPoint = getVTableAddressPoint(Base, > > VTableClass); > > + const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) { > > + NeedsVirtualOffset = (NearestVBase != nullptr); > > + > > + (void)getAddrOfVTable(VTableClass, Base.getBaseOffset()); > > + VFTableIdTy ID(VTableClass, Base.getBaseOffset()); > > + llvm::GlobalValue *VTableAddressPoint = VFTablesMap[ID]; > > if (!VTableAddressPoint) { > > assert(Base.getBase()->getNumVBases() && > > > !getContext().getASTRecordLayout(Base.getBase()).hasOwnVFPtr > > ()); > > @@ -1603,17 +1590,11 @@ static void mangleVFTableName(MicrosoftM > > MangleContext.mangleCXXVFTable(RD, VFPtr->MangledPath, Out); > > } > > > > -llvm::Constant * > > -MicrosoftCXXABI::getVTableAddressPoint(BaseSubobject Base, > > - const CXXRecordDecl > *VTableClass) > > { > > - (void)getAddrOfVTable(VTableClass, Base.getBaseOffset()); > > - VFTableIdTy ID(VTableClass, Base.getBaseOffset()); > > - return VFTablesMap[ID]; > > -} > > - > > llvm::Constant *MicrosoftCXXABI::getVTableAddressPointForConstExpr( > > BaseSubobject Base, const CXXRecordDecl *VTableClass) { > > - llvm::Constant *VFTable = getVTableAddressPoint(Base, > VTableClass); > > + (void)getAddrOfVTable(VTableClass, Base.getBaseOffset()); > > + VFTableIdTy ID(VTableClass, Base.getBaseOffset()); > > + llvm::GlobalValue *VFTable = VFTablesMap[ID]; > > assert(VFTable && "Couldn't find a vftable for the given base?"); > > return VFTable; > > } > > @@ -1623,7 +1604,6 @@ llvm::GlobalVariable *MicrosoftCXXABI::g > > // getAddrOfVTable may return 0 if asked to get an address of a > vtable > > which > > // shouldn't be used in the given record type. We want to cache > this > > result in > > // VFTablesMap, thus a simple zero check is not sufficient. > > - > > VFTableIdTy ID(RD, VPtrOffset); > > VTablesMapTy::iterator I; > > bool Inserted; > > @@ -1677,11 +1657,10 @@ llvm::GlobalVariable *MicrosoftCXXABI::g > > if (llvm::GlobalValue *VFTable = > > CGM.getModule().getNamedGlobal(VFTableName)) { > > VFTablesMap[ID] = VFTable; > > - VTable = VTableAliasIsRequred > > - ? cast<llvm::GlobalVariable>( > > - > cast<llvm::GlobalAlias>(VFTable)->getBaseObject()) > > - : cast<llvm::GlobalVariable>(VFTable); > > - return VTable; > > + return VTableAliasIsRequred > > + ? cast<llvm::GlobalVariable>( > > + > cast<llvm::GlobalAlias>(VFTable)->getBaseObject()) > > + : cast<llvm::GlobalVariable>(VFTable); > > } > > > > uint64_t NumVTableSlots = > > > > Modified: cfe/trunk/test/CodeGen/available-externally-hidden.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ > > > available-externally-hidden.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/test/CodeGen/available-externally-hidden.cpp (original) > > +++ cfe/trunk/test/CodeGen/available-externally-hidden.cpp Tue Aug 18 > > 00:40:20 2015 > > @@ -27,6 +27,6 @@ class TestSyncMessageFilter : public Syn > > }; > > > > int main() { > > - TestSyncMessageFilter *f = new TestSyncMessageFilter; > > +TestSyncMessageFilter* f = new TestSyncMessageFilter; > > f->Send(new Message); > > } > > > > Modified: cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ > > ctor-globalopt.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp (original) > > +++ cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp Tue Aug 18 00:40:20 > 2015 > > @@ -1,7 +1,7 @@ > > // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | > > FileCheck %s > > -// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s > -O2 | > > opt - -S -globalopt -o - | FileCheck %s --check-prefix=O1 > > +// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s > -O1 | > > FileCheck %s --check-prefix=O1 > > // RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s | > FileCheck > > %s > > -// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s -O2 | > opt - > > -S -globalopt -o - | FileCheck %s --check-prefix=O1 > > +// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s -O1 | > > FileCheck %s --check-prefix=O1 > > > > // Check that GlobalOpt can eliminate static constructors for simple > > implicit > > // constructors. This is a targetted integration test to make sure > that > > LLVM's > > > > Modified: cfe/trunk/test/CodeGenCXX/template-instantiation.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ > > template-instantiation.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/test/CodeGenCXX/template-instantiation.cpp (original) > > +++ cfe/trunk/test/CodeGenCXX/template-instantiation.cpp Tue Aug 18 > > 00:40:20 2015 > > @@ -1,7 +1,5 @@ > > // RUN: %clang_cc1 %s -O1 -disable-llvm-optzns -triple= > > x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s > > > > -// CHECK: @_ZTVN5test018stdio_sync_filebufIA4_iEE = linkonce_odr > > unnamed_addr constant > > - > > // CHECK: @_ZN7PR100011xE = global > > // CHECK-NOT: @_ZN7PR100014kBarE = external global i32 > > // > > @@ -14,6 +12,7 @@ > > // CHECK: @_ZN7PR100011SIiE3arrE = linkonce_odr global [3 x i32] > > // CHECK-NOT: @_ZN7PR100011SIiE3arr2E = linkonce_odr global [3 x > i32]A > > > > +// CHECK: @_ZTVN5test018stdio_sync_filebufIA4_iEE = linkonce_odr > > unnamed_addr constant > > > > // CHECK-NOT: _ZTVN5test31SIiEE > > // CHECK-NOT: _ZTSN5test31SIiEE > > > > Modified: cfe/trunk/test/CodeGenCXX/thunks.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ > > thunks.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/test/CodeGenCXX/thunks.cpp (original) > > +++ cfe/trunk/test/CodeGenCXX/thunks.cpp Tue Aug 18 00:40:20 2015 > > @@ -1,9 +1,5 @@ > > -// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables > > -emit-llvm -o %t > > -// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables > > -emit-llvm -o %t.opt -O1 -disable-llvm-optzns > > -// RUN: FileCheck %s < %t > > -// RUN: FileCheck %s < %t.opt > > -// RUN: FileCheck --check-prefix=CHECK-NONOPT %s < %t > > -// RUN: FileCheck --check-prefix=CHECK-OPT %s < %t.opt > > +// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables > > -emit-llvm -o - | FileCheck %s > > +// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables > > -emit-llvm -o - -O1 -disable-llvm-optzns | FileCheck %s > > > > namespace Test1 { > > > > @@ -384,25 +380,13 @@ D::~D() {} > > > > /**** The following has to go at the end of the file ****/ > > > > -// checking without opt > > -// CHECK-NONOPT-LABEL: define internal void > > @_ZThn8_N6Test4B12_GLOBAL__N_11C1fEv( > > -// CHECK-NONOPT-NOT: comdat > > - > > // This is from Test5: > > -// CHECK-NONOPT-LABEL: define linkonce_odr void > @_ZTv0_n24_N5Test51B1fEv > > - > > -// This is from Test10: > > -// CHECK-NONOPT-LABEL: define linkonce_odr void @_ZN6Test101C3fooEv > > -// CHECK-NONOPT-LABEL: define linkonce_odr void > @_ZThn8_N6Test101C3fooEv > > - > > -// Checking with opt > > -// CHECK-OPT-LABEL: define internal void > > @_ZThn8_N6Test4B12_GLOBAL__N_11C1fEv(%"struct.Test4B::(anonymous > > namespace)::C"* %this) unnamed_addr #0 align 2 > > +// CHECK-LABEL: define internal void > @_ZThn8_N6Test4B12_GLOBAL__N_11C1fEv > > ( > > +// CHECK-NOT: comdat > > +// CHECK-LABEL: define linkonce_odr void @_ZTv0_n24_N5Test51B1fEv > > > > // This is from Test10: > > -// CHECK-OPT-LABEL: define linkonce_odr void @_ZN6Test101C3fooEv > > -// CHECK-OPT-LABEL: define linkonce_odr void > @_ZThn8_N6Test101C3fooEv > > - > > -// This is from Test5: > > -// CHECK-OPT-LABEL: define linkonce_odr void > @_ZTv0_n24_N5Test51B1fEv > > +// CHECK-LABEL: define linkonce_odr void @_ZN6Test101C3fooEv > > +// CHECK-LABEL: define linkonce_odr void @_ZThn8_N6Test101C3fooEv > > > > // CHECK: attributes [[NUW]] = { nounwind uwtable{{.*}} } > > > > Modified: cfe/trunk/test/CodeGenCXX/virtual-base-ctor.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ > > virtual-base-ctor.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/test/CodeGenCXX/virtual-base-ctor.cpp (original) > > +++ cfe/trunk/test/CodeGenCXX/virtual-base-ctor.cpp Tue Aug 18 > 00:40:20 > > 2015 > > @@ -1,4 +1,4 @@ > > -// RUN: %clang_cc1 %s -emit-llvm -triple %itanium_abi_triple -o - > -O2 | > > opt - -S -globalopt -o - | FileCheck %s > > +// RUN: %clang_cc1 %s -emit-llvm -triple %itanium_abi_triple -o - > -O2 | > > FileCheck %s > > > > struct B; > > extern B x; > > > > Removed: cfe/trunk/test/CodeGenCXX/vtable-assume-load.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ > > vtable-assume-load.cpp?rev=245266&view=auto > > > ========================================================================== > > ==== > > --- cfe/trunk/test/CodeGenCXX/vtable-assume-load.cpp (original) > > +++ cfe/trunk/test/CodeGenCXX/vtable-assume-load.cpp (removed) > > @@ -1,172 +0,0 @@ > > -// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o > %t.ll > > -O1 -disable-llvm-optzns -fms-extensions > > -// RUN: %clang_cc1 %s -triple i686-pc-win32 -emit-llvm -o %t.ms.ll > -O1 > > -disable-llvm-optzns -fms-extensions > > - > > -// RUN: FileCheck --check-prefix=CHECK1 --input-file=%t.ll %s > > -// RUN: FileCheck --check-prefix=CHECK2 --input-file=%t.ll %s > > -// RUN: FileCheck --check-prefix=CHECK3 --input-file=%t.ll %s > > -// RUN: FileCheck --check-prefix=CHECK4 --input-file=%t.ll %s > > -// RUN: FileCheck --check-prefix=CHECK-MS --input-file=%t.ms.ll %s > > - > > -namespace test1 { > > - > > -struct A { > > - A(); > > - virtual void foo(); > > -}; > > - > > -struct B : A { > > - virtual void foo(); > > -}; > > - > > -void g(A *a) { a->foo(); } > > - > > -// CHECK1-LABEL: define void @_ZN5test14fooAEv() > > -// CHECK1: call void @_ZN5test11AC1Ev(%"struct.test1::A"* > > -// CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} > > -// CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr > inbounds > > ([3 x i8*], [3 x i8*]* @_ZTVN5test11AE, i64 0, i64 2) > > -// CHECK1: call void @llvm.assume(i1 %[[CMP]]) > > -// CHECK1-LABEL: } > > - > > -void fooA() { > > - A a; > > - g(&a); > > -} > > - > > -// CHECK1-LABEL: define void @_ZN5test14fooBEv() > > -// CHECK1: call void @_ZN5test11BC1Ev(%"struct.test1::B"* %{{.*}}) > > -// CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} > > -// CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr > inbounds > > ([3 x i8*], [3 x i8*]* @_ZTVN5test11BE, i64 0, i64 2) > > -// CHECK1: call void @llvm.assume(i1 %[[CMP]]) > > -// CHECK1-LABEL: } > > - > > -void fooB() { > > - B b; > > - g(&b); > > -} > > -// there should not be any assumes in the ctor that calls base ctor > > -// CHECK1-LABEL: define linkonce_odr void @_ZN5test11BC2Ev > > (%"struct.test1::B"* > > -// CHECK1-NOT: @llvm.assume( > > -// CHECK1-LABEL: } > > -} > > -namespace test2 { > > -struct A { > > - A(); > > - virtual void foo(); > > -}; > > - > > -struct B { > > - B(); > > - virtual void bar(); > > -}; > > - > > -struct C : A, B { > > - C(); > > - virtual void foo(); > > -}; > > -void g(A *a) { a->foo(); } > > -void h(B *b) { b->bar(); } > > - > > -// CHECK2-LABEL: define void @_ZN5test24testEv() > > -// CHECK2: call void @_ZN5test21CC1Ev(%"struct.test2::C"* > > -// CHECK2: %[[VTABLE:.*]] = load i8**, i8*** {{.*}} > > -// CHECK2: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr > inbounds > > ([6 x i8*], [6 x i8*]* @_ZTVN5test21CE, i64 0, i64 2) > > -// CHECK2: call void @llvm.assume(i1 %[[CMP]]) > > - > > -// CHECK2: %[[V2:.*]] = bitcast %"struct.test2::C"* %{{.*}} to i8* > > -// CHECK2: %[[ADD_PTR:.*]] = getelementptr inbounds i8, i8* > %[[V2]], i64 > > 8 > > -// CHECK2: %[[V3:.*]] = bitcast i8* %[[ADD_PTR]] to i8*** > > -// CHECK2: %[[VTABLE2:.*]] = load i8**, i8*** %[[V3]] > > -// CHECK2: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr > > inbounds ([6 x i8*], [6 x i8*]* @_ZTVN5test21CE, i64 0, i64 5) > > -// CHECK2: call void @llvm.assume(i1 %[[CMP2]]) > > - > > -// CHECK2: call void @_ZN5test21gEPNS_1AE( > > -// CHECK2-LABEL: } > > - > > -void test() { > > - C c; > > - g(&c); > > - h(&c); > > -} > > -} > > - > > -namespace test3 { > > -struct A { > > - A(); > > -}; > > - > > -struct B : A { > > - B(); > > - virtual void foo(); > > -}; > > - > > -struct C : virtual A, B { > > - C(); > > - virtual void foo(); > > -}; > > -void g(B *a) { a->foo(); } > > - > > -// CHECK3-LABEL: define void @_ZN5test34testEv() > > -// CHECK3: call void @_ZN5test31CC1Ev(%"struct.test3::C"* > > -// CHECK3: %[[CMP:.*]] = icmp eq i8** %{{.*}}, getelementptr > inbounds ([4 > > x i8*], [4 x i8*]* @_ZTVN5test31CE, i64 0, i64 3) > > -// CHECK3: call void @llvm.assume(i1 %[[CMP]]) > > -// CHECK3-LABLEL: } > > -void test() { > > - C c; > > - g(&c); > > -} > > -} // test3 > > - > > -namespace test4 { > > -struct A { > > - A(); > > - virtual void foo(); > > -}; > > - > > -struct B : virtual A { > > - B(); > > - virtual void foo(); > > -}; > > -struct C : B { > > - C(); > > - virtual void foo(); > > -}; > > - > > -void g(C *c) { c->foo(); } > > - > > -// CHECK4-LABEL: define void @_ZN5test44testEv() > > -// CHECK4: call void @_ZN5test41CC1Ev(%"struct.test4::C"* > > -// CHECK4: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} > > -// CHECK4: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr > inbounds > > ([5 x i8*], [5 x i8*]* @_ZTVN5test41CE, i64 0, i64 4) > > -// CHECK4: call void @llvm.assume(i1 %[[CMP]] > > - > > -// CHECK4: %[[VTABLE2:.*]] = load i8**, i8*** %{{.*}} > > -// CHECK4: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr > > inbounds ([5 x i8*], [5 x i8*]* @_ZTVN5test41CE, i64 0, i64 4) > > -// CHECK4: call void @llvm.assume(i1 %[[CMP2]]) > > -// CHECK4-LABEL: } > > - > > -void test() { > > - C c; > > - g(&c); > > -} > > -} // test4 > > - > > -namespace test5 { > > - > > -struct __declspec(novtable) S { > > - virtual void foo(); > > -}; > > - > > -void g(S &s) { s.foo(); } > > - > > -// if struct has novtable specifier, then we can't generate assumes > > -// CHECK-MS-LABEL: define void @"\01?test@test5@@YAXXZ"() > > -// CHECK-MS: call x86_thiscallcc %"struct.test5::S"* @"\01?? > > 0S@test5@@QAE@XZ"( > > -// CHECK-MS-NOT: @llvm.assume > > -// CHECK-MS-LABEL: } > > - > > -void test() { > > - S s; > > - g(s); > > -} > > - > > -} // test5 > > > > Modified: cfe/trunk/test/CodeGenCXX/vtable-available-externally.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ > > > vtable-available-externally.cpp?rev=245267&r1=245266&r2=245267&view=diff > > > ========================================================================== > > ==== > > --- cfe/trunk/test/CodeGenCXX/vtable-available-externally.cpp > (original) > > +++ cfe/trunk/test/CodeGenCXX/vtable-available-externally.cpp Tue > Aug 18 > > 00:40:20 2015 > > @@ -182,8 +182,8 @@ void f() { > > namespace Test9 { > > // all virtual functions are outline, so we can assume that it will > > // be generated in translation unit where foo is defined > > -// CHECK-TEST9-DAG: @_ZTVN5Test91AE = available_externally > unnamed_addr > > constant > > -// CHECK-TEST9-DAG: @_ZTVN5Test91BE = available_externally > unnamed_addr > > constant > > +// CHECK-TEST9: @_ZTVN5Test91AE = available_externally unnamed_addr > > constant > > +// CHECK-TEST9: @_ZTVN5Test91BE = available_externally unnamed_addr > > constant > > struct A { > > virtual void foo(); > > virtual void bar(); > > @@ -206,7 +206,7 @@ void g() { > > namespace Test10 { > > > > // because A's key function is defined here, vtable is generated in > this > > TU > > -// CHECK-TEST10-DAG: @_ZTVN6Test101AE = unnamed_addr constant > > +// CHECK-TEST10: @_ZTVN6Test101AE = unnamed_addr constant > > struct A { > > virtual void foo(); > > virtual void bar(); > > @@ -214,14 +214,14 @@ struct A { > > void A::foo() {} > > > > // Because key function is inline we will generate vtable as > linkonce_odr > > -// CHECK-TEST10-DAG: @_ZTVN6Test101DE = linkonce_odr unnamed_addr > > constant > > +// CHECK-TEST10: @_ZTVN6Test101DE = linkonce_odr unnamed_addr > constant > > struct D : A { > > void bar(); > > }; > > inline void D::bar() {} > > > > // because B has outline key function then we can refer to > > -// CHECK-TEST10-DAG: @_ZTVN6Test101BE = available_externally > unnamed_addr > > constant > > +// CHECK-TEST10: @_ZTVN6Test101BE = available_externally > unnamed_addr > > constant > > struct B : A { > > void foo(); > > void bar(); > > @@ -230,7 +230,7 @@ struct B : A { > > // C's key function (car) is outline, but C has inline virtual > function > > so we > > // can't guarantee that we will be able to refer to bar from name > > // so (at the moment) we can't emit vtable available_externally > > -// CHECK-TEST10-DAG: @_ZTVN6Test101CE = external unnamed_addr > constant > > +// CHECK-TEST10: @_ZTVN6Test101CE = external unnamed_addr constant > > struct C : A { > > void bar() {} // defined in body - not key function > > virtual inline void gar(); // inline in body - not key function > > @@ -238,7 +238,7 @@ struct C : A { > > }; > > > > // no key function, vtable will be generated everywhere it will be > used > > -// CHECK-TEST10-DAG: @_ZTVN6Test101EE = linkonce_odr unnamed_addr > > constant > > +// CHECK-TEST10: @_ZTVN6Test101EE = linkonce_odr unnamed_addr > constant > > struct E : A {}; > > > > void g(A& a) { > > > > _______________________________________________ > > 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 >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits