Lines Matching refs:llvm
41 SmallVector<llvm::GlobalVariable *, 2> Globals;
109 llvm::array_pod_sort(VBPtrOffsets.begin(), VBPtrOffsets.end()); in getVBPtrOffsets()
125 llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD,
128 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
144 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
146 llvm::Type *StdTypeInfoPtrTy) override;
151 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, Address Value,
154 llvm::BasicBlock *CastEnd) override;
156 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
165 llvm::Value *
170 llvm::BasicBlock *
174 llvm::BasicBlock *
224 void setCXXDestructorDLLStorage(llvm::GlobalValue *GV,
228 llvm::GlobalValue::LinkageTypes
267 llvm::Value *getCXXDestructorImplicitParam(CodeGenFunction &CGF,
279 llvm::GlobalVariable *VTable);
293 llvm::Constant *
297 llvm::Value *getVTableAddressPointInStructor(
301 llvm::Constant *
305 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
309 Address This, llvm::Type *Ty,
312 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
327 llvm::GlobalVariable *
329 llvm::GlobalVariable::LinkageTypes Linkage);
331 llvm::GlobalVariable *
335 llvm::raw_svector_ostream Out(OutName); in getAddrOfVirtualDisplacementMap()
344 SmallVector<llvm::Constant *, 4> Map(NumEntries, in getAddrOfVirtualDisplacementMap()
345 llvm::UndefValue::get(CGM.IntTy)); in getAddrOfVirtualDisplacementMap()
346 Map[0] = llvm::ConstantInt::get(CGM.IntTy, 0); in getAddrOfVirtualDisplacementMap()
355 Map[SrcVBIndex] = llvm::ConstantInt::get(CGM.IntTy, DstVBIndex * 4); in getAddrOfVirtualDisplacementMap()
362 llvm::ArrayType *VDispMapTy = llvm::ArrayType::get(CGM.IntTy, Map.size()); in getAddrOfVirtualDisplacementMap()
363 llvm::Constant *Init = llvm::ConstantArray::get(VDispMapTy, Map); in getAddrOfVirtualDisplacementMap()
364 llvm::GlobalValue::LinkageTypes Linkage = in getAddrOfVirtualDisplacementMap()
366 ? llvm::GlobalValue::LinkOnceODRLinkage in getAddrOfVirtualDisplacementMap()
367 : llvm::GlobalValue::InternalLinkage; in getAddrOfVirtualDisplacementMap()
368 auto *VDispMap = new llvm::GlobalVariable( in getAddrOfVirtualDisplacementMap()
375 llvm::GlobalVariable *GV) const;
377 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, in setThunkLinkage()
383 Thunk->setLinkage(llvm::GlobalValue::InternalLinkage); in setThunkLinkage()
385 Thunk->setLinkage(llvm::GlobalValue::WeakODRLinkage); in setThunkLinkage()
387 Thunk->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage); in setThunkLinkage()
392 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
395 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
400 ArrayRef<llvm::Function *> CXXThreadLocalInits,
410 llvm::GlobalVariable *DeclPtr,
413 llvm::FunctionCallee Dtor,
414 llvm::Constant *Addr) override;
445 llvm::Value *NumElements,
448 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
459 llvm::StructType *getTypeDescriptorType(StringRef TypeInfoString) { in getTypeDescriptorType()
460 llvm::SmallString<32> TDTypeName("rtti.TypeDescriptor"); in getTypeDescriptorType()
461 TDTypeName += llvm::utostr(TypeInfoString.size()); in getTypeDescriptorType()
462 llvm::StructType *&TypeDescriptorType = in getTypeDescriptorType()
466 llvm::Type *FieldTypes[] = { in getTypeDescriptorType()
469 llvm::ArrayType::get(CGM.Int8Ty, TypeInfoString.size() + 1)}; in getTypeDescriptorType()
471 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, TDTypeName); in getTypeDescriptorType()
475 llvm::Type *getImageRelativeType(llvm::Type *PtrType) { in getImageRelativeType()
481 llvm::StructType *getBaseClassDescriptorType() { in getBaseClassDescriptorType()
484 llvm::Type *FieldTypes[] = { in getBaseClassDescriptorType()
493 BaseClassDescriptorType = llvm::StructType::create( in getBaseClassDescriptorType()
498 llvm::StructType *getClassHierarchyDescriptorType() { in getClassHierarchyDescriptorType()
502 ClassHierarchyDescriptorType = llvm::StructType::create( in getClassHierarchyDescriptorType()
504 llvm::Type *FieldTypes[] = { in getClassHierarchyDescriptorType()
515 llvm::StructType *getCompleteObjectLocatorType() { in getCompleteObjectLocatorType()
518 CompleteObjectLocatorType = llvm::StructType::create( in getCompleteObjectLocatorType()
520 llvm::Type *FieldTypes[] = { in getCompleteObjectLocatorType()
528 llvm::ArrayRef<llvm::Type *> FieldTypesRef(FieldTypes); in getCompleteObjectLocatorType()
535 llvm::GlobalVariable *getImageBase() { in getImageBase()
537 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name)) in getImageBase()
540 auto *GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty, in getImageBase()
542 llvm::GlobalValue::ExternalLinkage, in getImageBase()
548 llvm::Constant *getImageRelativeConstant(llvm::Constant *PtrVal) { in getImageRelativeConstant()
553 return llvm::Constant::getNullValue(CGM.IntTy); in getImageRelativeConstant()
555 llvm::Constant *ImageBaseAsInt = in getImageRelativeConstant()
556 llvm::ConstantExpr::getPtrToInt(getImageBase(), CGM.IntPtrTy); in getImageRelativeConstant()
557 llvm::Constant *PtrValAsInt = in getImageRelativeConstant()
558 llvm::ConstantExpr::getPtrToInt(PtrVal, CGM.IntPtrTy); in getImageRelativeConstant()
559 llvm::Constant *Diff = in getImageRelativeConstant()
560 llvm::ConstantExpr::getSub(PtrValAsInt, ImageBaseAsInt, in getImageRelativeConstant()
562 return llvm::ConstantExpr::getTrunc(Diff, CGM.IntTy); in getImageRelativeConstant()
570 llvm::Constant *getZeroInt() { in getZeroInt()
571 return llvm::ConstantInt::get(CGM.IntTy, 0); in getZeroInt()
574 llvm::Constant *getAllOnesInt() { in getAllOnesInt()
575 return llvm::Constant::getAllOnesValue(CGM.IntTy); in getAllOnesInt()
582 llvm::SmallVectorImpl<llvm::Constant *> &fields);
587 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
589 llvm::Value *VBPtrOffset,
590 llvm::Value *VBTableOffset,
591 llvm::Value **VBPtr = nullptr);
593 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, in GetVBaseOffsetFromVBPtr()
597 llvm::Value **VBPtr = nullptr) { in GetVBaseOffsetFromVBPtr()
599 llvm::Value *VBPOffset = llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), in GetVBaseOffsetFromVBPtr()
600 *VBTOffset = llvm::ConstantInt::get(CGM.IntTy, VBTableOffset); in GetVBaseOffsetFromVBPtr()
604 std::tuple<Address, llvm::Value *, const CXXRecordDecl *>
610 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const Expr *E,
612 llvm::Value *VirtualBaseAdjustmentOffset,
613 llvm::Value *VBPtrOffset /* optional */);
617 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
624 llvm::Constant *MP);
633 llvm::Function *EmitVirtualMemPtrThunk(const CXXMethodDecl *MD,
636 llvm::Constant *EmitMemberDataPointer(const CXXRecordDecl *RD,
640 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
649 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
651 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
653 llvm::Constant *EmitMemberFunctionPointer(const CXXMethodDecl *MD) override;
654 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
656 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
657 llvm::Value *L,
658 llvm::Value *R,
662 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
663 llvm::Value *MemPtr,
666 llvm::Value *
668 Address Base, llvm::Value *MemPtr,
671 llvm::Value *EmitNonNullMemberPointerConversion(
674 CastExpr::path_const_iterator PathEnd, llvm::Value *Src,
677 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
679 llvm::Value *Src) override;
681 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
682 llvm::Constant *Src) override;
684 llvm::Constant *EmitMemberPointerConversion(
687 CastExpr::path_const_iterator PathEnd, llvm::Constant *Src);
691 Address This, llvm::Value *&ThisPtrForCall,
692 llvm::Value *MemPtr,
697 llvm::StructType *getCatchableTypeType() { in getCatchableTypeType()
700 llvm::Type *FieldTypes[] = { in getCatchableTypeType()
709 CatchableTypeType = llvm::StructType::create( in getCatchableTypeType()
714 llvm::StructType *getCatchableTypeArrayType(uint32_t NumEntries) { in getCatchableTypeArrayType()
715 llvm::StructType *&CatchableTypeArrayType = in getCatchableTypeArrayType()
720 llvm::SmallString<23> CTATypeName("eh.CatchableTypeArray."); in getCatchableTypeArrayType()
721 CTATypeName += llvm::utostr(NumEntries); in getCatchableTypeArrayType()
722 llvm::Type *CTType = in getCatchableTypeArrayType()
724 llvm::Type *FieldTypes[] = { in getCatchableTypeArrayType()
726 llvm::ArrayType::get(CTType, NumEntries) // CatchableTypes in getCatchableTypeArrayType()
729 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, CTATypeName); in getCatchableTypeArrayType()
733 llvm::StructType *getThrowInfoType() { in getThrowInfoType()
736 llvm::Type *FieldTypes[] = { in getThrowInfoType()
742 ThrowInfoType = llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, in getThrowInfoType()
747 llvm::FunctionCallee getThrowFn() { in getThrowFn()
750 llvm::Type *Args[] = {CGM.Int8PtrTy, getThrowInfoType()->getPointerTo()}; in getThrowFn()
751 llvm::FunctionType *FTy = in getThrowFn()
752 llvm::FunctionType::get(CGM.VoidTy, Args, /*isVarArg=*/false); in getThrowFn()
753 llvm::FunctionCallee Throw = in getThrowFn()
756 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::x86) { in getThrowFn()
757 if (auto *Fn = dyn_cast<llvm::Function>(Throw.getCallee())) in getThrowFn()
758 Fn->setCallingConv(llvm::CallingConv::X86_StdCall); in getThrowFn()
763 llvm::Function *getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD,
766 llvm::Constant *getCatchableType(QualType T,
771 llvm::GlobalVariable *getCatchableTypeArray(QualType T);
773 llvm::GlobalVariable *getThrowInfo(QualType T) override;
775 std::pair<llvm::Value *, const CXXRecordDecl *>
784 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalVariable *> VTablesMapTy;
785 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalValue *> VFTablesMapTy;
791 llvm::SmallPtrSet<const CXXRecordDecl *, 4> DeferredVFTables;
795 llvm::DenseMap<const CXXRecordDecl *, VBTableGlobals> VBTablesMap;
801 llvm::GlobalVariable *Guard;
807 llvm::DenseMap<const DeclContext *, GuardInfo> GuardVariableMap;
808 llvm::DenseMap<const DeclContext *, GuardInfo> ThreadLocalGuardVariableMap;
809 llvm::DenseMap<const DeclContext *, unsigned> ThreadSafeGuardNumMap;
811 llvm::DenseMap<size_t, llvm::StructType *> TypeDescriptorTypeMap;
812 llvm::StructType *BaseClassDescriptorType;
813 llvm::StructType *ClassHierarchyDescriptorType;
814 llvm::StructType *CompleteObjectLocatorType;
816 llvm::DenseMap<QualType, llvm::GlobalVariable *> CatchableTypeArrays;
818 llvm::StructType *CatchableTypeType;
819 llvm::DenseMap<uint32_t, llvm::StructType *> CatchableTypeArrayTypeMap;
820 llvm::StructType *ThrowInfoType;
838 case llvm::Triple::thumb: in getRecordArgABI()
844 case llvm::Triple::x86: { in getRecordArgABI()
858 case llvm::Triple::x86_64: in getRecordArgABI()
859 case llvm::Triple::aarch64: in getRecordArgABI()
875 llvm::Value *MDThis = EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE); in emitVirtualObjectDelete()
881 llvm::Value *Args[] = { in emitRethrow()
882 llvm::ConstantPointerNull::get(CGM.Int8PtrTy), in emitRethrow()
883 llvm::ConstantPointerNull::get(getThrowInfoType()->getPointerTo())}; in emitRethrow()
884 llvm::FunctionCallee Fn = getThrowFn(); in emitRethrow()
896 llvm::BasicBlock *CatchPadBB = CGF.Builder.GetInsertBlock(); in emitBeginCatch()
897 llvm::CatchPadInst *CPI = in emitBeginCatch()
898 cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHI()); in emitBeginCatch()
917 std::tuple<Address, llvm::Value *, const CXXRecordDecl *>
928 return std::make_tuple(Value, llvm::ConstantInt::get(CGF.Int32Ty, 0), in performBaseAdjustment()
943 llvm::Value *Offset = in performBaseAdjustment()
945 llvm::Value *Ptr = CGF.Builder.CreateInBoundsGEP( in performBaseAdjustment()
959 static llvm::CallBase *emitRTtypeidCall(CodeGenFunction &CGF, in emitRTtypeidCall()
960 llvm::Value *Argument) { in emitRTtypeidCall()
961 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy}; in emitRTtypeidCall()
962 llvm::FunctionType *FTy = in emitRTtypeidCall()
963 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false); in emitRTtypeidCall()
964 llvm::Value *Args[] = {Argument}; in emitRTtypeidCall()
965 llvm::FunctionCallee Fn = CGF.CGM.CreateRuntimeFunction(FTy, "__RTtypeid"); in emitRTtypeidCall()
970 llvm::CallBase *Call = in EmitBadTypeidCall()
971 emitRTtypeidCall(CGF, llvm::Constant::getNullValue(CGM.VoidPtrTy)); in EmitBadTypeidCall()
976 llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF, in EmitTypeid()
979 llvm::Type *StdTypeInfoPtrTy) { in EmitTypeid()
982 llvm::CallBase *Typeid = emitRTtypeidCall(CGF, ThisPtr.getPointer()); in EmitTypeid()
993 llvm::Value *MicrosoftCXXABI::EmitDynamicCastCall( in EmitDynamicCastCall()
995 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) { in EmitDynamicCastCall()
996 llvm::Type *DestLTy = CGF.ConvertType(DestTy); in EmitDynamicCastCall()
998 llvm::Value *SrcRTTI = in EmitDynamicCastCall()
1000 llvm::Value *DestRTTI = in EmitDynamicCastCall()
1003 llvm::Value *Offset; in EmitDynamicCastCall()
1006 llvm::Value *ThisPtr = This.getPointer(); in EmitDynamicCastCall()
1015 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy, CGF.Int32Ty, CGF.Int8PtrTy, in EmitDynamicCastCall()
1017 llvm::FunctionCallee Function = CGF.CGM.CreateRuntimeFunction( in EmitDynamicCastCall()
1018 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false), in EmitDynamicCastCall()
1020 llvm::Value *Args[] = { in EmitDynamicCastCall()
1022 llvm::ConstantInt::get(CGF.Int32Ty, DestTy->isReferenceType())}; in EmitDynamicCastCall()
1027 llvm::Value *
1036 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy}; in EmitDynamicCastToVoid()
1037 llvm::FunctionCallee Function = CGF.CGM.CreateRuntimeFunction( in EmitDynamicCastToVoid()
1038 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false), in EmitDynamicCastToVoid()
1040 llvm::Value *Args[] = {Value.getPointer()}; in EmitDynamicCastToVoid()
1048 llvm::Value *MicrosoftCXXABI::GetVirtualBaseClassOffset( in GetVirtualBaseClassOffset()
1054 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars); in GetVirtualBaseClassOffset()
1059 llvm::Value *VBTableOffset = in GetVirtualBaseClassOffset()
1060 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity()); in GetVirtualBaseClassOffset()
1062 llvm::Value *VBPtrToNewBase = in GetVirtualBaseClassOffset()
1142 llvm::BasicBlock *
1145 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF); in EmitCtorCompleteObjectHandler()
1148 llvm::Value *IsCompleteObject = in EmitCtorCompleteObjectHandler()
1151 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases"); in EmitCtorCompleteObjectHandler()
1152 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases"); in EmitCtorCompleteObjectHandler()
1166 llvm::BasicBlock *
1168 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF); in EmitDtorCompleteObjectHandler()
1171 llvm::Value *IsCompleteObject = in EmitDtorCompleteObjectHandler()
1174 llvm::BasicBlock *CallVbaseDtorsBB = CGF.createBasicBlock("Dtor.dtor_vbases"); in EmitDtorCompleteObjectHandler()
1175 llvm::BasicBlock *SkipVbaseDtorsBB = CGF.createBasicBlock("Dtor.skip_vbases"); in EmitDtorCompleteObjectHandler()
1206 llvm::Value *Int8This = nullptr; // Initialize lazily. in initializeHiddenVirtualInheritanceMembers()
1215 llvm::Value *VBaseOffset = in initializeHiddenVirtualInheritanceMembers()
1220 llvm::Value *VtorDispValue = Builder.CreateSub( in initializeHiddenVirtualInheritanceMembers()
1221 VBaseOffset, llvm::ConstantInt::get(CGM.PtrDiffTy, ConstantVBaseOffset), in initializeHiddenVirtualInheritanceMembers()
1228 llvm::Value *VtorDispPtr = in initializeHiddenVirtualInheritanceMembers()
1260 llvm::Function *Fn = getAddrOfCXXCtorClosure(D, Ctor_DefaultClosure); in EmitCXXConstructors()
1261 Fn->setLinkage(llvm::GlobalValue::WeakODRLinkage); in EmitCXXConstructors()
1277 llvm::GlobalVariable *GV = VBGlobals.Globals[I]; in EmitVBPtrStores()
1285 llvm::Value *GVPtr = in EmitVBPtrStores()
1326 void MicrosoftCXXABI::setCXXDestructorDLLStorage(llvm::GlobalValue *GV, in setCXXDestructorDLLStorage()
1332 GV->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); in setCXXDestructorDLLStorage()
1339 llvm::GlobalValue::LinkageTypes MicrosoftCXXABI::getCXXDestructorLinkage( in getCXXDestructorLinkage()
1344 return llvm::GlobalValue::InternalLinkage; in getCXXDestructorLinkage()
1357 return llvm::GlobalValue::WeakODRLinkage; in getCXXDestructorLinkage()
1359 return llvm::GlobalValue::AvailableExternallyLinkage; in getCXXDestructorLinkage()
1360 return llvm::GlobalValue::LinkOnceODRLinkage; in getCXXDestructorLinkage()
1365 return llvm::GlobalValue::LinkOnceODRLinkage; in getCXXDestructorLinkage()
1465 llvm::Value *VBaseOffset = in adjustThisArgumentForVirtualFunctionCall()
1467 llvm::Value *VBasePtr = CGF.Builder.CreateInBoundsGEP( in adjustThisArgumentForVirtualFunctionCall()
1535 llvm::Value *This = loadIncomingCXXThis(CGF); in EmitInstanceFunctionProlog()
1540 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace(); in EmitInstanceFunctionProlog()
1541 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS), in EmitInstanceFunctionProlog()
1596 llvm::Value *MostDerivedArg; in getImplicitConstructorArgs()
1600 MostDerivedArg = llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete); in getImplicitConstructorArgs()
1608 llvm::Value *MicrosoftCXXABI::getCXXDestructorImplicitParam( in getCXXDestructorImplicitParam()
1635 llvm::BasicBlock *BaseDtorEndBB = nullptr; in EmitDestructorCall()
1640 llvm::Value *Implicit = in EmitDestructorCall()
1655 llvm::GlobalVariable *VTable) { in emitVTableTypeMetadata()
1662 llvm::DenseSet<const CXXRecordDecl *> Visited; in emitVTableTypeMetadata()
1663 llvm::GlobalObject::VCallVisibility TypeVis = in emitVTableTypeMetadata()
1665 if (TypeVis != llvm::GlobalObject::VCallVisibilityPublic) in emitVTableTypeMetadata()
1717 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, Info->FullOffsetInMDC); in emitVTableDefinitions()
1724 llvm::Constant *RTTI = nullptr; in emitVTableDefinitions()
1744 llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor( in getVTableAddressPointInStructor()
1747 llvm::Constant *VTableAddressPoint = getVTableAddressPoint(Base, VTableClass); in getVTableAddressPointInStructor()
1758 llvm::raw_svector_ostream Out(Name); in mangleVFTableName()
1762 llvm::Constant *
1770 llvm::Constant *MicrosoftCXXABI::getVTableAddressPointForConstExpr( in getVTableAddressPointForConstExpr()
1772 llvm::Constant *VFTable = getVTableAddressPoint(Base, VTableClass); in getVTableAddressPointForConstExpr()
1777 llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD, in getAddrOfVTable()
1790 llvm::GlobalVariable *&VTable = I->second; in getAddrOfVTable()
1803 llvm::StringSet<> ObservedMangledNames; in getAddrOfVTable()
1833 llvm::GlobalValue::LinkageTypes VFTableLinkage = in getAddrOfVTable()
1834 RD->hasAttr<DLLImportAttr>() ? llvm::GlobalValue::LinkOnceODRLinkage in getAddrOfVTable()
1837 llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage) || in getAddrOfVTable()
1838 llvm::GlobalValue::isExternalLinkage(VFTableLinkage); in getAddrOfVTable()
1842 if (llvm::GlobalValue *VFTable = in getAddrOfVTable()
1846 ? cast<llvm::GlobalVariable>( in getAddrOfVTable()
1847 cast<llvm::GlobalAlias>(VFTable)->getBaseObject()) in getAddrOfVTable()
1848 : cast<llvm::GlobalVariable>(VFTable); in getAddrOfVTable()
1854 llvm::GlobalValue::LinkageTypes VTableLinkage = in getAddrOfVTable()
1855 VTableAliasIsRequred ? llvm::GlobalValue::PrivateLinkage : VFTableLinkage; in getAddrOfVTable()
1859 llvm::Type *VTableType = CGM.getVTables().getVTableType(VTLayout); in getAddrOfVTable()
1863 llvm::GlobalValue *VFTable; in getAddrOfVTable()
1864 VTable = new llvm::GlobalVariable(CGM.getModule(), VTableType, in getAddrOfVTable()
1867 VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); in getAddrOfVTable()
1869 llvm::Comdat *C = nullptr; in getAddrOfVTable()
1871 (llvm::GlobalValue::isWeakForLinker(VFTableLinkage) || in getAddrOfVTable()
1872 (llvm::GlobalValue::isLocalLinkage(VFTableLinkage) && in getAddrOfVTable()
1880 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.Int32Ty, 0), in getAddrOfVTable()
1881 llvm::ConstantInt::get(CGM.Int32Ty, 0), in getAddrOfVTable()
1882 llvm::ConstantInt::get(CGM.Int32Ty, 1)}; in getAddrOfVTable()
1885 llvm::Constant *VTableGEP = llvm::ConstantExpr::getInBoundsGetElementPtr( in getAddrOfVTable()
1887 if (llvm::GlobalValue::isWeakForLinker(VFTableLinkage)) { in getAddrOfVTable()
1888 VFTableLinkage = llvm::GlobalValue::ExternalLinkage; in getAddrOfVTable()
1890 C->setSelectionKind(llvm::Comdat::Largest); in getAddrOfVTable()
1892 VFTable = llvm::GlobalAlias::create(CGM.Int8PtrTy, in getAddrOfVTable()
1896 VFTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); in getAddrOfVTable()
1908 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); in getAddrOfVTable()
1917 llvm::Type *Ty, in getVirtualFunctionPointer()
1926 llvm::Value *VTable = CGF.GetVTablePtr(VPtr, Ty->getPointerTo(), in getVirtualFunctionPointer()
1935 return llvm::find_if(VFTContext.getVFPtrOffsets( in getVirtualFunctionPointer()
1944 llvm::Value *VFunc; in getVirtualFunctionPointer()
1953 llvm::Value *VFuncPtr = in getVirtualFunctionPointer()
1962 llvm::Value *MicrosoftCXXABI::EmitVirtualDestructorCall( in EmitVirtualDestructorCall()
1976 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo); in EmitVirtualDestructorCall()
1980 llvm::Value *ImplicitParam = llvm::ConstantInt::get( in EmitVirtualDestructorCall()
1981 llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()), in EmitVirtualDestructorCall()
2001 llvm::DenseMap<const CXXRecordDecl*, VBTableGlobals>::iterator Entry; in enumerateVBTables()
2014 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD); in enumerateVBTables()
2024 llvm::Function *
2032 llvm::raw_svector_ostream Out(ThunkName); in EmitVirtualMemPtrThunk()
2036 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName)) in EmitVirtualMemPtrThunk()
2037 return cast<llvm::Function>(GV); in EmitVirtualMemPtrThunk()
2042 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo); in EmitVirtualMemPtrThunk()
2043 llvm::Function *ThunkFn = in EmitVirtualMemPtrThunk()
2044 llvm::Function::Create(ThunkTy, llvm::Function::ExternalLinkage, in EmitVirtualMemPtrThunk()
2049 ? llvm::GlobalValue::LinkOnceODRLinkage in EmitVirtualMemPtrThunk()
2050 : llvm::GlobalValue::InternalLinkage); in EmitVirtualMemPtrThunk()
2064 ThunkFn->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::None); in EmitVirtualMemPtrThunk()
2083 llvm::Value *VTable = CGF.GetVTablePtr( in EmitVirtualMemPtrThunk()
2086 llvm::Value *VFuncPtr = in EmitVirtualMemPtrThunk()
2088 llvm::Value *Callee = in EmitVirtualMemPtrThunk()
2101 llvm::GlobalVariable *GV = VBGlobals.Globals[I]; in emitVirtualInheritanceTables()
2107 llvm::GlobalVariable *
2109 llvm::GlobalVariable::LinkageTypes Linkage) { in getAddrOfVBTable()
2111 llvm::raw_svector_ostream Out(OutName); in getAddrOfVBTable()
2115 llvm::ArrayType *VBTableType = in getAddrOfVBTable()
2116 llvm::ArrayType::get(CGM.IntTy, 1 + VBT.ObjectWithVPtr->getNumVBases()); in getAddrOfVBTable()
2122 llvm::GlobalVariable *GV = CGM.CreateOrReplaceCXXRuntimeVariable( in getAddrOfVBTable()
2124 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); in getAddrOfVBTable()
2127 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); in getAddrOfVBTable()
2129 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); in getAddrOfVBTable()
2139 llvm::GlobalVariable *GV) const { in emitVBTableDefinition()
2149 SmallVector<llvm::Constant *, 4> Offsets(1 + ObjectWithVPtr->getNumVBases(), in emitVBTableDefinition()
2154 Offsets[0] = llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity()); in emitVBTableDefinition()
2171 Offsets[VBIndex] = llvm::ConstantInt::get(CGM.IntTy, Offset.getQuantity()); in emitVBTableDefinition()
2175 cast<llvm::ArrayType>(GV->getValueType())->getNumElements()); in emitVBTableDefinition()
2176 llvm::ArrayType *VBTableType = in emitVBTableDefinition()
2177 llvm::ArrayType::get(CGM.IntTy, Offsets.size()); in emitVBTableDefinition()
2178 llvm::Constant *Init = llvm::ConstantArray::get(VBTableType, Offsets); in emitVBTableDefinition()
2182 GV->setLinkage(llvm::GlobalVariable::AvailableExternallyLinkage); in emitVBTableDefinition()
2185 llvm::Value *MicrosoftCXXABI::performThisAdjustment(CodeGenFunction &CGF, in performThisAdjustment()
2193 llvm::Value *V; in performThisAdjustment()
2203 llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp"); in performThisAdjustment()
2217 llvm::Value *VBPtr; in performThisAdjustment()
2218 llvm::Value *VBaseOffset = in performThisAdjustment()
2237 llvm::Value *
2246 llvm::Value *V = Ret.getPointer(); in performReturnAdjustment()
2250 llvm::Value *VBPtr; in performReturnAdjustment()
2251 llvm::Value *VBaseOffset = in performReturnAdjustment()
2285 llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, in readArrayCookieImpl()
2295 llvm::Value *numElements, in InitializeArrayCookie()
2317 llvm::FunctionCallee Dtor, in emitGlobalDtorWithTLRegDtor()
2318 llvm::Constant *Addr) { in emitGlobalDtorWithTLRegDtor()
2320 llvm::Constant *DtorStub = CGF.createAtExitStub(VD, Dtor, Addr); in emitGlobalDtorWithTLRegDtor()
2323 llvm::FunctionType *TLRegDtorTy = llvm::FunctionType::get( in emitGlobalDtorWithTLRegDtor()
2326 llvm::FunctionCallee TLRegDtor = CGF.CGM.CreateRuntimeFunction( in emitGlobalDtorWithTLRegDtor()
2327 TLRegDtorTy, "__tlregdtor", llvm::AttributeList(), /*Local=*/true); in emitGlobalDtorWithTLRegDtor()
2328 if (llvm::Function *TLRegDtorFn = in emitGlobalDtorWithTLRegDtor()
2329 dyn_cast<llvm::Function>(TLRegDtor.getCallee())) in emitGlobalDtorWithTLRegDtor()
2336 llvm::FunctionCallee Dtor, in registerGlobalDtor()
2337 llvm::Constant *Addr) { in registerGlobalDtor()
2350 ArrayRef<llvm::Function *> CXXThreadLocalInits, in EmitThreadLocalInitFuncs()
2356 llvm::Triple::x86 in EmitThreadLocalInitFuncs()
2363 auto AddToXDU = [&CGM](llvm::Function *InitFunc) { in EmitThreadLocalInitFuncs()
2364 llvm::GlobalVariable *InitFuncPtr = new llvm::GlobalVariable( in EmitThreadLocalInitFuncs()
2366 llvm::GlobalVariable::InternalLinkage, InitFunc, in EmitThreadLocalInitFuncs()
2375 std::vector<llvm::Function *> NonComdatInits; in EmitThreadLocalInitFuncs()
2377 llvm::GlobalVariable *GV = cast<llvm::GlobalVariable>( in EmitThreadLocalInitFuncs()
2379 llvm::Function *F = CXXThreadLocalInits[I]; in EmitThreadLocalInitFuncs()
2382 if (llvm::Comdat *C = GV->getComdat()) in EmitThreadLocalInitFuncs()
2389 llvm::FunctionType *FTy = in EmitThreadLocalInitFuncs()
2390 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false); in EmitThreadLocalInitFuncs()
2391 llvm::Function *InitFunc = CGM.CreateGlobalInitOrCleanUpFunction( in EmitThreadLocalInitFuncs()
2412 auto *GV = new llvm::GlobalVariable( in getInitThreadEpochPtr()
2414 /*isConstant=*/false, llvm::GlobalVariable::ExternalLinkage, in getInitThreadEpochPtr()
2416 /*InsertBefore=*/nullptr, llvm::GlobalVariable::GeneralDynamicTLSModel); in getInitThreadEpochPtr()
2421 static llvm::FunctionCallee getInitThreadHeaderFn(CodeGenModule &CGM) { in getInitThreadHeaderFn()
2422 llvm::FunctionType *FTy = in getInitThreadHeaderFn()
2423 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()), in getInitThreadHeaderFn()
2427 llvm::AttributeList::get(CGM.getLLVMContext(), in getInitThreadHeaderFn()
2428 llvm::AttributeList::FunctionIndex, in getInitThreadHeaderFn()
2429 llvm::Attribute::NoUnwind), in getInitThreadHeaderFn()
2433 static llvm::FunctionCallee getInitThreadFooterFn(CodeGenModule &CGM) { in getInitThreadFooterFn()
2434 llvm::FunctionType *FTy = in getInitThreadFooterFn()
2435 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()), in getInitThreadFooterFn()
2439 llvm::AttributeList::get(CGM.getLLVMContext(), in getInitThreadFooterFn()
2440 llvm::AttributeList::FunctionIndex, in getInitThreadFooterFn()
2441 llvm::Attribute::NoUnwind), in getInitThreadFooterFn()
2445 static llvm::FunctionCallee getInitThreadAbortFn(CodeGenModule &CGM) { in getInitThreadAbortFn()
2446 llvm::FunctionType *FTy = in getInitThreadAbortFn()
2447 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()), in getInitThreadAbortFn()
2451 llvm::AttributeList::get(CGM.getLLVMContext(), in getInitThreadAbortFn()
2452 llvm::AttributeList::FunctionIndex, in getInitThreadAbortFn()
2453 llvm::Attribute::NoUnwind), in getInitThreadAbortFn()
2468 llvm::LoadInst *LI = Builder.CreateLoad(Guard); in Emit()
2469 llvm::ConstantInt *Mask = in Emit()
2470 llvm::ConstantInt::get(CGF.IntTy, ~(1ULL << GuardNum)); in Emit()
2476 llvm::Value *Guard;
2487 llvm::GlobalVariable *GV, in EmitGuardedInit()
2493 llvm::Function *F = CGF.CurFn; in EmitGuardedInit()
2494 F->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage); in EmitGuardedInit()
2508 llvm::IntegerType *GuardTy = CGF.Int32Ty; in EmitGuardedInit()
2509 llvm::ConstantInt *Zero = llvm::ConstantInt::get(GuardTy, 0); in EmitGuardedInit()
2519 llvm::GlobalVariable *GuardVar = GI ? GI->Guard : nullptr; in EmitGuardedInit()
2545 llvm::raw_svector_ostream Out(GuardName); in EmitGuardedInit()
2556 new llvm::GlobalVariable(CGM.getModule(), GuardTy, /*isConstant=*/false, in EmitGuardedInit()
2583 llvm::ConstantInt *Bit = llvm::ConstantInt::get(GuardTy, 1ULL << GuardNum); in EmitGuardedInit()
2584 llvm::LoadInst *LI = Builder.CreateLoad(GuardAddr); in EmitGuardedInit()
2585 llvm::Value *NeedsInit = in EmitGuardedInit()
2587 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); in EmitGuardedInit()
2588 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); in EmitGuardedInit()
2617 llvm::LoadInst *FirstGuardLoad = Builder.CreateLoad(GuardAddr); in EmitGuardedInit()
2618 FirstGuardLoad->setOrdering(llvm::AtomicOrdering::Unordered); in EmitGuardedInit()
2619 llvm::LoadInst *InitThreadEpoch = in EmitGuardedInit()
2621 llvm::Value *IsUninitialized = in EmitGuardedInit()
2623 llvm::BasicBlock *AttemptInitBlock = CGF.createBasicBlock("init.attempt"); in EmitGuardedInit()
2624 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); in EmitGuardedInit()
2633 llvm::LoadInst *SecondGuardLoad = Builder.CreateLoad(GuardAddr); in EmitGuardedInit()
2634 SecondGuardLoad->setOrdering(llvm::AtomicOrdering::Unordered); in EmitGuardedInit()
2635 llvm::Value *ShouldDoInit = in EmitGuardedInit()
2637 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); in EmitGuardedInit()
2668 llvm::Type *
2672 llvm::SmallVector<llvm::Type *, 4> fields; in ConvertMemberPointerType()
2688 return llvm::StructType::get(CGM.getLLVMContext(), fields); in ConvertMemberPointerType()
2693 llvm::SmallVectorImpl<llvm::Constant *> &fields) { in GetNullMemberPointerFields()
2699 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy)); in GetNullMemberPointerFields()
2716 llvm::Constant *
2718 llvm::SmallVector<llvm::Constant *, 4> fields; in EmitNullMemberPointer()
2722 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields); in EmitNullMemberPointer()
2727 llvm::Constant *
2728 MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField, in EmitFullMemberPointer()
2740 llvm::SmallVector<llvm::Constant *, 4> fields; in EmitFullMemberPointer()
2744 fields.push_back(llvm::ConstantInt::get( in EmitFullMemberPointer()
2751 fields.push_back(llvm::ConstantInt::get(CGM.IntTy, Offs.getQuantity())); in EmitFullMemberPointer()
2756 fields.push_back(llvm::ConstantInt::get(CGM.IntTy, VBTableIndex)); in EmitFullMemberPointer()
2758 return llvm::ConstantStruct::getAnon(fields); in EmitFullMemberPointer()
2761 llvm::Constant *
2767 llvm::Constant *MicrosoftCXXABI::EmitMemberDataPointer(const CXXRecordDecl *RD, in EmitMemberDataPointer()
2772 llvm::Constant *FirstField = in EmitMemberDataPointer()
2773 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity()); in EmitMemberDataPointer()
2778 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP, in EmitMemberPointer()
2788 llvm::Constant *C; in EmitMemberPointer()
2841 llvm::Constant *
2850 llvm::Constant *FirstField; in EmitMemberFunctionPointer()
2853 llvm::Type *Ty; in EmitMemberFunctionPointer()
2880 FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy); in EmitMemberFunctionPointer()
2888 llvm::Value *
2890 llvm::Value *L, in EmitMemberPointerComparison()
2891 llvm::Value *R, in EmitMemberPointerComparison()
2897 llvm::ICmpInst::Predicate Eq; in EmitMemberPointerComparison()
2898 llvm::Instruction::BinaryOps And, Or; in EmitMemberPointerComparison()
2900 Eq = llvm::ICmpInst::ICMP_NE; in EmitMemberPointerComparison()
2901 And = llvm::Instruction::Or; in EmitMemberPointerComparison()
2902 Or = llvm::Instruction::And; in EmitMemberPointerComparison()
2904 Eq = llvm::ICmpInst::ICMP_EQ; in EmitMemberPointerComparison()
2905 And = llvm::Instruction::And; in EmitMemberPointerComparison()
2906 Or = llvm::Instruction::Or; in EmitMemberPointerComparison()
2918 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0"); in EmitMemberPointerComparison()
2919 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0"); in EmitMemberPointerComparison()
2920 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first"); in EmitMemberPointerComparison()
2923 llvm::Value *Res = nullptr; in EmitMemberPointerComparison()
2924 llvm::StructType *LType = cast<llvm::StructType>(L->getType()); in EmitMemberPointerComparison()
2926 llvm::Value *LF = Builder.CreateExtractValue(L, I); in EmitMemberPointerComparison()
2927 llvm::Value *RF = Builder.CreateExtractValue(R, I); in EmitMemberPointerComparison()
2928 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest"); in EmitMemberPointerComparison()
2938 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType()); in EmitMemberPointerComparison()
2939 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero"); in EmitMemberPointerComparison()
2948 llvm::Value *
2950 llvm::Value *MemPtr, in EmitMemberPointerIsNotNull()
2953 llvm::SmallVector<llvm::Constant *, 4> fields; in EmitMemberPointerIsNotNull()
2956 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy)); in EmitMemberPointerIsNotNull()
2960 llvm::Value *FirstField = MemPtr; in EmitMemberPointerIsNotNull()
2963 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0"); in EmitMemberPointerIsNotNull()
2972 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I); in EmitMemberPointerIsNotNull()
2973 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp"); in EmitMemberPointerIsNotNull()
2980 llvm::Constant *Val) { in MemberPointerConstantIsNull()
2983 llvm::Constant *FirstField = Val->getType()->isStructTy() ? in MemberPointerConstantIsNull()
2995 llvm::SmallVector<llvm::Constant *, 4> Fields; in MemberPointerConstantIsNull()
3010 llvm::Value *
3013 llvm::Value *VBPtrOffset, in GetVBaseOffsetFromVBPtr()
3014 llvm::Value *VBTableOffset, in GetVBaseOffsetFromVBPtr()
3015 llvm::Value **VBPtrOut) { in GetVBaseOffsetFromVBPtr()
3019 llvm::Value *VBPtr = Builder.CreateInBoundsGEP( in GetVBaseOffsetFromVBPtr()
3026 if (auto CI = dyn_cast<llvm::ConstantInt>(VBPtrOffset)) { in GetVBaseOffsetFromVBPtr()
3033 llvm::Value *VBTable = Builder.CreateAlignedLoad( in GetVBaseOffsetFromVBPtr()
3037 llvm::Value *VBTableIndex = Builder.CreateAShr( in GetVBaseOffsetFromVBPtr()
3038 VBTableOffset, llvm::ConstantInt::get(VBTableOffset->getType(), 2), in GetVBaseOffsetFromVBPtr()
3042 llvm::Value *VBaseOffs = in GetVBaseOffsetFromVBPtr()
3051 llvm::Value *MicrosoftCXXABI::AdjustVirtualBase( in AdjustVirtualBase()
3053 Address Base, llvm::Value *VBTableOffset, llvm::Value *VBPtrOffset) { in AdjustVirtualBase()
3056 llvm::BasicBlock *OriginalBB = nullptr; in AdjustVirtualBase()
3057 llvm::BasicBlock *SkipAdjustBB = nullptr; in AdjustVirtualBase()
3058 llvm::BasicBlock *VBaseAdjustBB = nullptr; in AdjustVirtualBase()
3068 llvm::Value *IsVirtual = in AdjustVirtualBase()
3088 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity()); in AdjustVirtualBase()
3090 llvm::Value *VBPtr = nullptr; in AdjustVirtualBase()
3091 llvm::Value *VBaseOffs = in AdjustVirtualBase()
3093 llvm::Value *AdjustedBase = in AdjustVirtualBase()
3100 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base"); in AdjustVirtualBase()
3108 llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress( in EmitMemberDataPointerAddress()
3109 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr, in EmitMemberDataPointerAddress()
3113 llvm::Type *PType = in EmitMemberDataPointerAddress()
3121 llvm::Value *FieldOffset = MemPtr; in EmitMemberDataPointerAddress()
3122 llvm::Value *VirtualBaseAdjustmentOffset = nullptr; in EmitMemberDataPointerAddress()
3123 llvm::Value *VBPtrOffset = nullptr; in EmitMemberDataPointerAddress()
3134 llvm::Value *Addr; in EmitMemberDataPointerAddress()
3154 llvm::Value *
3157 llvm::Value *Src) { in EmitMemberPointerConversion()
3163 if (isa<llvm::Constant>(Src)) in EmitMemberPointerConversion()
3164 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src)); in EmitMemberPointerConversion()
3187 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy); in EmitMemberPointerConversion()
3188 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy); in EmitMemberPointerConversion()
3199 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock(); in EmitMemberPointerConversion()
3200 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert"); in EmitMemberPointerConversion()
3201 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted"); in EmitMemberPointerConversion()
3205 llvm::Value *Dst = EmitNonNullMemberPointerConversion( in EmitMemberPointerConversion()
3213 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted"); in EmitMemberPointerConversion()
3219 llvm::Value *MicrosoftCXXABI::EmitNonNullMemberPointerConversion( in EmitNonNullMemberPointerConversion()
3222 CastExpr::path_const_iterator PathEnd, llvm::Value *Src, in EmitNonNullMemberPointerConversion()
3229 bool IsConstant = isa<llvm::Constant>(Src); in EmitNonNullMemberPointerConversion()
3232 llvm::Value *FirstField = Src; in EmitNonNullMemberPointerConversion()
3233 llvm::Value *NonVirtualBaseAdjustment = getZeroInt(); in EmitNonNullMemberPointerConversion()
3234 llvm::Value *VirtualBaseAdjustmentOffset = getZeroInt(); in EmitNonNullMemberPointerConversion()
3235 llvm::Value *VBPtrOffset = getZeroInt(); in EmitNonNullMemberPointerConversion()
3254 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField; in EmitNonNullMemberPointerConversion()
3261 llvm::Value *SrcVBIndexEqZero = in EmitNonNullMemberPointerConversion()
3266 llvm::Value *UndoSrcAdjustment = Builder.CreateSelect( in EmitNonNullMemberPointerConversion()
3268 llvm::ConstantInt::get(CGM.IntTy, SrcOffsetToFirstVBase), in EmitNonNullMemberPointerConversion()
3281 llvm::Constant *BaseClassOffset = llvm::ConstantInt::get( in EmitNonNullMemberPointerConversion()
3286 llvm::Value *NVDisp; in EmitNonNullMemberPointerConversion()
3296 llvm::Value *DstVBIndexEqZero = SrcVBIndexEqZero; in EmitNonNullMemberPointerConversion()
3299 if (llvm::GlobalVariable *VDispMap = in EmitNonNullMemberPointerConversion()
3301 llvm::Value *VBIndex = Builder.CreateExactUDiv( in EmitNonNullMemberPointerConversion()
3302 VirtualBaseAdjustmentOffset, llvm::ConstantInt::get(CGM.IntTy, 4)); in EmitNonNullMemberPointerConversion()
3304 llvm::Constant *Mapping = VDispMap->getInitializer(); in EmitNonNullMemberPointerConversion()
3306 Mapping->getAggregateElement(cast<llvm::Constant>(VBIndex)); in EmitNonNullMemberPointerConversion()
3308 llvm::Value *Idxs[] = {getZeroInt(), VBIndex}; in EmitNonNullMemberPointerConversion()
3323 llvm::Value *DstVBPtrOffset = llvm::ConstantInt::get( in EmitNonNullMemberPointerConversion()
3336 llvm::Value *DoDstAdjustment = Builder.CreateSelect( in EmitNonNullMemberPointerConversion()
3338 llvm::ConstantInt::get(CGM.IntTy, DstOffsetToFirstVBase), in EmitNonNullMemberPointerConversion()
3345 llvm::Value *Dst; in EmitNonNullMemberPointerConversion()
3349 Dst = llvm::UndefValue::get(ConvertMemberPointerType(DstTy)); in EmitNonNullMemberPointerConversion()
3362 llvm::Constant *
3364 llvm::Constant *Src) { in EmitMemberPointerConversion()
3375 llvm::Constant *MicrosoftCXXABI::EmitMemberPointerConversion( in EmitMemberPointerConversion()
3378 CastExpr::path_const_iterator PathEnd, llvm::Constant *Src) { in EmitMemberPointerConversion()
3394 auto *Dst = cast<llvm::Constant>(EmitNonNullMemberPointerConversion( in EmitMemberPointerConversion()
3402 llvm::Value *&ThisPtrForCall, llvm::Value *MemPtr, in EmitLoadOfMemberFunctionPointer()
3408 llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType( in EmitLoadOfMemberFunctionPointer()
3416 llvm::Value *FunctionPointer = MemPtr; in EmitLoadOfMemberFunctionPointer()
3417 llvm::Value *NonVirtualBaseAdjustment = nullptr; in EmitLoadOfMemberFunctionPointer()
3418 llvm::Value *VirtualBaseAdjustmentOffset = nullptr; in EmitLoadOfMemberFunctionPointer()
3419 llvm::Value *VBPtrOffset = nullptr; in EmitLoadOfMemberFunctionPointer()
3441 llvm::Value *Ptr = Builder.CreateBitCast(ThisPtrForCall, CGF.Int8PtrTy); in EmitLoadOfMemberFunctionPointer()
3487 static llvm::GlobalVariable *getTypeInfoVTable(CodeGenModule &CGM) { in getTypeInfoVTable()
3491 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy, in getTypeInfoVTable()
3493 llvm::GlobalVariable::ExternalLinkage, in getTypeInfoVTable()
3557 static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) { in getLinkageForRTTI()
3562 return llvm::GlobalValue::InternalLinkage; in getLinkageForRTTI()
3568 return llvm::GlobalValue::LinkOnceODRLinkage; in getLinkageForRTTI()
3589 llvm::GlobalVariable *getBaseClassDescriptor(const MSRTTIClass &Classes);
3590 llvm::GlobalVariable *
3592 llvm::GlobalVariable *getClassHierarchyDescriptor();
3593 llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo &Info);
3597 llvm::LLVMContext &VMContext;
3598 llvm::Module &Module;
3600 llvm::GlobalVariable::LinkageTypes Linkage;
3618 llvm::SmallPtrSet<const CXXRecordDecl *, 8> VirtualBases; in detectAmbiguousBases()
3619 llvm::SmallPtrSet<const CXXRecordDecl *, 8> UniqueBases; in detectAmbiguousBases()
3620 llvm::SmallPtrSet<const CXXRecordDecl *, 8> AmbiguousBases; in detectAmbiguousBases()
3638 llvm::GlobalVariable *MSRTTIBuilder::getClassHierarchyDescriptor() { in getClassHierarchyDescriptor()
3641 llvm::raw_svector_ostream Out(MangledName); in getClassHierarchyDescriptor()
3667 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0), in getClassHierarchyDescriptor()
3668 llvm::ConstantInt::get(CGM.IntTy, 0)}; in getClassHierarchyDescriptor()
3672 auto CHD = new llvm::GlobalVariable(Module, Type, /*isConstant=*/true, Linkage, in getClassHierarchyDescriptor()
3681 llvm::Constant *Fields[] = { in getClassHierarchyDescriptor()
3682 llvm::ConstantInt::get(CGM.IntTy, 0), // reserved by the runtime in getClassHierarchyDescriptor()
3683 llvm::ConstantInt::get(CGM.IntTy, Flags), in getClassHierarchyDescriptor()
3684 llvm::ConstantInt::get(CGM.IntTy, Classes.size()), in getClassHierarchyDescriptor()
3685 ABI.getImageRelativeConstant(llvm::ConstantExpr::getInBoundsGetElementPtr( in getClassHierarchyDescriptor()
3687 llvm::ArrayRef<llvm::Value *>(GEPIndices))), in getClassHierarchyDescriptor()
3689 CHD->setInitializer(llvm::ConstantStruct::get(Type, Fields)); in getClassHierarchyDescriptor()
3693 llvm::GlobalVariable *
3697 llvm::raw_svector_ostream Out(MangledName); in getBaseClassArray()
3706 llvm::Type *PtrType = ABI.getImageRelativeType( in getBaseClassArray()
3708 auto *ArrType = llvm::ArrayType::get(PtrType, Classes.size() + 1); in getBaseClassArray()
3710 new llvm::GlobalVariable(Module, ArrType, in getBaseClassArray()
3717 SmallVector<llvm::Constant *, 8> BaseClassArrayData; in getBaseClassArray()
3721 BaseClassArrayData.push_back(llvm::Constant::getNullValue(PtrType)); in getBaseClassArray()
3722 BCA->setInitializer(llvm::ConstantArray::get(ArrType, BaseClassArrayData)); in getBaseClassArray()
3726 llvm::GlobalVariable *
3740 llvm::raw_svector_ostream Out(MangledName); in getBaseClassDescriptor()
3753 new llvm::GlobalVariable(Module, Type, /*isConstant=*/true, Linkage, in getBaseClassDescriptor()
3759 llvm::Constant *Fields[] = { in getBaseClassDescriptor()
3762 llvm::ConstantInt::get(CGM.IntTy, Class.NumBases), in getBaseClassDescriptor()
3763 llvm::ConstantInt::get(CGM.IntTy, Class.OffsetInVBase), in getBaseClassDescriptor()
3764 llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), in getBaseClassDescriptor()
3765 llvm::ConstantInt::get(CGM.IntTy, OffsetInVBTable), in getBaseClassDescriptor()
3766 llvm::ConstantInt::get(CGM.IntTy, Class.Flags), in getBaseClassDescriptor()
3770 BCD->setInitializer(llvm::ConstantStruct::get(Type, Fields)); in getBaseClassDescriptor()
3774 llvm::GlobalVariable *
3778 llvm::raw_svector_ostream Out(MangledName); in getCompleteObjectLocator()
3798 llvm::StructType *Type = ABI.getCompleteObjectLocatorType(); in getCompleteObjectLocator()
3799 auto COL = new llvm::GlobalVariable(Module, Type, /*isConstant=*/true, Linkage, in getCompleteObjectLocator()
3803 llvm::Constant *Fields[] = { in getCompleteObjectLocator()
3804 llvm::ConstantInt::get(CGM.IntTy, ABI.isImageRelative()), in getCompleteObjectLocator()
3805 llvm::ConstantInt::get(CGM.IntTy, OffsetToTop), in getCompleteObjectLocator()
3806 llvm::ConstantInt::get(CGM.IntTy, VFPtrOffset), in getCompleteObjectLocator()
3812 llvm::ArrayRef<llvm::Constant *> FieldsRef(Fields); in getCompleteObjectLocator()
3815 COL->setInitializer(llvm::ConstantStruct::get(Type, FieldsRef)); in getCompleteObjectLocator()
3885 llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) { in getAddrOfRTTIDescriptor()
3888 llvm::raw_svector_ostream Out(MangledName); in getAddrOfRTTIDescriptor()
3893 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) in getAddrOfRTTIDescriptor()
3894 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); in getAddrOfRTTIDescriptor()
3902 llvm::raw_svector_ostream Out(TypeInfoString); in getAddrOfRTTIDescriptor()
3907 llvm::Constant *Fields[] = { in getAddrOfRTTIDescriptor()
3909 llvm::ConstantPointerNull::get(CGM.Int8PtrTy), // Runtime data in getAddrOfRTTIDescriptor()
3910 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), TypeInfoString)}; in getAddrOfRTTIDescriptor()
3911 llvm::StructType *TypeDescriptorType = in getAddrOfRTTIDescriptor()
3913 auto *Var = new llvm::GlobalVariable( in getAddrOfRTTIDescriptor()
3916 llvm::ConstantStruct::get(TypeDescriptorType, Fields), in getAddrOfRTTIDescriptor()
3920 return llvm::ConstantExpr::getBitCast(Var, CGM.Int8PtrTy); in getAddrOfRTTIDescriptor()
3924 llvm::GlobalVariable *
3933 llvm::Function *Fn = in emitCXXStructor()
3955 llvm::Function *Fn = CGM.codegenCXXStructor(GD); in emitCXXStructor()
3960 llvm::Function *
3967 llvm::raw_svector_ostream Out(ThunkName); in getAddrOfCXXCtorClosure()
3971 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName)) in getAddrOfCXXCtorClosure()
3972 return cast<llvm::Function>(GV); in getAddrOfCXXCtorClosure()
3976 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo); in getAddrOfCXXCtorClosure()
3979 llvm::Function *ThunkFn = llvm::Function::Create( in getAddrOfCXXCtorClosure()
3981 ThunkFn->setCallingConv(static_cast<llvm::CallingConv::ID>( in getAddrOfCXXCtorClosure()
4026 llvm::Value *This = getThisValue(CGF); in getAddrOfCXXCtorClosure()
4028 llvm::Value *SrcVal = in getAddrOfCXXCtorClosure()
4052 CGF.EmitCallArgs(Args, FPT, llvm::makeArrayRef(ArgVec), CD, IsCopy ? 1 : 0); in getAddrOfCXXCtorClosure()
4060 llvm::Constant *CalleePtr = in getAddrOfCXXCtorClosure()
4077 llvm::Constant *MicrosoftCXXABI::getCatchableType(QualType T, in getCatchableType()
4094 llvm::raw_svector_ostream Out(MangledName); in getCatchableType()
4098 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) in getCatchableType()
4103 llvm::Constant *TD = getImageRelativeConstant(getAddrOfRTTIDescriptor(T)); in getCatchableType()
4107 llvm::Constant *CopyCtor; in getCatchableType()
4114 CopyCtor = llvm::ConstantExpr::getBitCast(CopyCtor, CGM.Int8PtrTy); in getCatchableType()
4116 CopyCtor = llvm::Constant::getNullValue(CGM.Int8PtrTy); in getCatchableType()
4142 llvm::Constant *Fields[] = { in getCatchableType()
4143 llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags in getCatchableType()
4145 llvm::ConstantInt::get(CGM.IntTy, NVOffset), // NonVirtualAdjustment in getCatchableType()
4146 llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), // OffsetToVBPtr in getCatchableType()
4147 llvm::ConstantInt::get(CGM.IntTy, VBIndex), // VBTableIndex in getCatchableType()
4148 llvm::ConstantInt::get(CGM.IntTy, Size), // Size in getCatchableType()
4151 llvm::StructType *CTType = getCatchableTypeType(); in getCatchableType()
4152 auto *GV = new llvm::GlobalVariable( in getCatchableType()
4154 llvm::ConstantStruct::get(CTType, Fields), MangledName); in getCatchableType()
4155 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); in getCatchableType()
4162 llvm::GlobalVariable *MicrosoftCXXABI::getCatchableTypeArray(QualType T) { in getCatchableTypeArray()
4166 llvm::GlobalVariable *&CTA = CatchableTypeArrays[T]; in getCatchableTypeArray()
4173 llvm::SmallSetVector<llvm::Constant *, 2> CatchableTypes; in getCatchableTypeArray()
4255 llvm::Type *CTType = in getCatchableTypeArray()
4257 llvm::ArrayType *AT = llvm::ArrayType::get(CTType, NumEntries); in getCatchableTypeArray()
4258 llvm::StructType *CTAType = getCatchableTypeArrayType(NumEntries); in getCatchableTypeArray()
4259 llvm::Constant *Fields[] = { in getCatchableTypeArray()
4260 llvm::ConstantInt::get(CGM.IntTy, NumEntries), // NumEntries in getCatchableTypeArray()
4261 llvm::ConstantArray::get( in getCatchableTypeArray()
4262 AT, llvm::makeArrayRef(CatchableTypes.begin(), in getCatchableTypeArray()
4267 llvm::raw_svector_ostream Out(MangledName); in getCatchableTypeArray()
4270 CTA = new llvm::GlobalVariable( in getCatchableTypeArray()
4272 llvm::ConstantStruct::get(CTAType, Fields), MangledName); in getCatchableTypeArray()
4273 CTA->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); in getCatchableTypeArray()
4280 llvm::GlobalVariable *MicrosoftCXXABI::getThrowInfo(QualType T) { in getThrowInfo()
4286 llvm::GlobalVariable *CTA = getCatchableTypeArray(T); in getThrowInfo()
4292 cast<llvm::ConstantInt>(CTA->getInitializer()->getAggregateElement(0U)) in getThrowInfo()
4297 llvm::raw_svector_ostream Out(MangledName); in getThrowInfo()
4304 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) in getThrowInfo()
4320 llvm::Constant *CleanupFn = llvm::Constant::getNullValue(CGM.Int8PtrTy); in getThrowInfo()
4324 CleanupFn = llvm::ConstantExpr::getBitCast( in getThrowInfo()
4328 llvm::Constant *ForwardCompat = in getThrowInfo()
4329 getImageRelativeConstant(llvm::Constant::getNullValue(CGM.Int8PtrTy)); in getThrowInfo()
4330 llvm::Constant *PointerToCatchableTypes = getImageRelativeConstant( in getThrowInfo()
4331 llvm::ConstantExpr::getBitCast(CTA, CGM.Int8PtrTy)); in getThrowInfo()
4332 llvm::StructType *TIType = getThrowInfoType(); in getThrowInfo()
4333 llvm::Constant *Fields[] = { in getThrowInfo()
4334 llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags in getThrowInfo()
4339 auto *GV = new llvm::GlobalVariable( in getThrowInfo()
4341 llvm::ConstantStruct::get(TIType, Fields), StringRef(MangledName)); in getThrowInfo()
4342 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); in getThrowInfo()
4360 llvm::GlobalVariable *TI = getThrowInfo(ThrowType); in emitThrow()
4363 llvm::Value *Args[] = { in emitThrow()
4370 std::pair<llvm::Value *, const CXXRecordDecl *>