Home | History | Annotate | Download | only in CodeGen

Lines Matching full:llvm

1 //===--- MicrosoftCXXABI.cpp - Emit LLVM Code from ASTs for a Module ------===//
3 // The LLVM Compiler Infrastructure
23 #include "llvm/ADT/StringExtras.h"
24 #include "llvm/ADT/StringSet.h"
25 #include "llvm/IR/CallSite.h"
35 SmallVector<llvm::GlobalVariable *, 2> Globals;
60 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF,
61 llvm::Value *ptr,
64 llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD,
67 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
71 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
72 llvm::Value *ThisPtr,
73 llvm::Type *StdTypeInfoPtrTy) override;
78 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
81 llvm::BasicBlock *CastEnd) override;
83 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
89 llvm::Value *
90 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
98 llvm::BasicBlock *
170 llvm::Value *
172 llvm::Value *This,
178 llvm::Value *adjustThisParameterInVirtualFunctionPrologue(
179 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) override;
191 bool Delegating, llvm::Value *This) override;
196 llvm::Value *getVTableAddressPointInStructor(
201 llvm::Constant *
205 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
208 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
209 llvm::Value *This,
210 llvm::Type *Ty) override;
215 llvm::Value *This) override;
227 llvm::GlobalVariable *
229 llvm::GlobalVariable::LinkageTypes Linkage);
232 llvm::GlobalVariable *GV) const;
234 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable,
237 Thunk->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
243 Thunk->setLinkage(llvm::GlobalValue::InternalLinkage);
245 Thunk->setLinkage(llvm::GlobalValue::WeakODRLinkage);
247 Thunk->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
250 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
253 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
257 llvm::GlobalVariable *DeclPtr,
287 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
288 llvm::Value *NewPtr,
289 llvm::Value *NumElements,
292 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
293 llvm::Value *allocPtr,
302 // 5 routines for constructing the llvm types for MS RTTI structs.
303 llvm::StructType *getTypeDescriptorType(StringRef TypeInfoString) {
304 llvm::SmallString<32> TDTypeName("rtti.TypeDescriptor");
305 TDTypeName += llvm::utostr(TypeInfoString.size());
306 llvm::StructType *&TypeDescriptorType =
310 llvm::Type *FieldTypes[] = {
313 llvm::ArrayType::get(CGM.Int8Ty, TypeInfoString.size() + 1)};
315 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, TDTypeName);
319 llvm::Type *getImageRelativeType(llvm::Type *PtrType) {
325 llvm::StructType *getBaseClassDescriptorType() {
328 llvm::Type *FieldTypes[] = {
337 BaseClassDescriptorType = llvm::StructType::create(
342 llvm::StructType *getClassHierarchyDescriptorType() {
346 ClassHierarchyDescriptorType = llvm::StructType::create(
348 llvm::Type *FieldTypes[] = {
359 llvm::StructType *getCompleteObjectLocatorType() {
362 CompleteObjectLocatorType = llvm::StructType::create(
364 llvm::Type *FieldTypes[] = {
372 llvm::ArrayRef<llvm::Type *> FieldTypesRef(FieldTypes);
379 llvm::GlobalVariable *getImageBase() {
381 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name))
384 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty,
386 llvm::GlobalValue::ExternalLinkage,
390 llvm::Constant *getImageRelativeConstant(llvm::Constant *PtrVal) {
394 llvm::Constant *ImageBaseAsInt =
395 llvm::ConstantExpr::getPtrToInt(getImageBase(), CGM.IntPtrTy);
396 llvm::Constant *PtrValAsInt =
397 llvm::ConstantExpr::getPtrToInt(PtrVal, CGM.IntPtrTy);
398 llvm::Constant *Diff =
399 llvm::ConstantExpr::getSub(PtrValAsInt, ImageBaseAsInt,
401 return llvm::ConstantExpr::getTrunc(Diff, CGM.IntTy);
409 llvm::Constant *getZeroInt() {
410 return llvm::ConstantInt::get(CGM.IntTy, 0);
413 llvm::Constant *getAllOnesInt() {
414 return llvm::Constant::getAllOnesValue(CGM.IntTy);
417 llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) {
421 llvm::Value *getValueOrZeroInt(llvm::Value *C) {
429 llvm::SmallVectorImpl<llvm::Constant *> &fields);
434 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
435 llvm::Value *Base,
436 llvm::Value *VBPtrOffset,
437 llvm::Value *VBTableOffset,
438 llvm::Value **VBPtr = nullptr);
440 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
441 llvm::Value *Base,
444 llvm::Value **VBPtr = nullptr) {
445 llvm::Value *VBPOffset = llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset),
446 *VBTOffset = llvm::ConstantInt::get(CGM.IntTy, VBTableOffset);
452 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const Expr *E,
453 const CXXRecordDecl *RD, llvm::Value *Base,
454 llvm::Value *VirtualBaseAdjustmentOffset,
455 llvm::Value *VBPtrOffset /* optional */);
459 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
464 llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD,
469 llvm::Constant *MP);
478 llvm::Function *EmitVirtualMemPtrThunk(
483 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
487 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
489 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
491 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override;
492 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
494 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
495 llvm::Value *L,
496 llvm::Value *R,
500 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
501 llvm::Value *MemPtr,
504 llvm::Value *
506 llvm::Value *Base, llvm::Value *MemPtr,
509 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
511 llvm::Value *Src) override;
513 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
514 llvm::Constant *Src) override;
516 llvm::Value *
518 llvm::Value *&This, llvm::Value *MemPtr,
523 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalVariable *> VTablesMapTy;
524 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalValue *> VFTablesMapTy;
530 llvm::SmallPtrSet<const CXXRecordDecl *, 4> DeferredVFTables;
534 llvm::DenseMap<const CXXRecordDecl *, VBTableGlobals> VBTablesMap;
540 llvm::GlobalVariable *Guard;
546 llvm::DenseMap<const DeclContext *, GuardInfo> GuardVariableMap;
548 llvm::DenseMap<size_t, llvm::StructType *> TypeDescriptorTypeMap;
549 llvm::StructType *BaseClassDescriptorType;
550 llvm::StructType *ClassHierarchyDescriptorType;
551 llvm::StructType *CompleteObjectLocatorType;
563 case llvm::Triple::x86:
577 case llvm::Triple::x86_64:
610 llvm::Value *MicrosoftCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
611 llvm::Value *ptr,
619 static llvm::Value *getPolymorphicOffset(CodeGenFunction &CGF,
621 llvm::Value *Value) {
631 static std::pair<llvm::Value *, llvm::Value *>
632 performBaseAdjustment(CodeGenFunction &CGF, llvm::Value *Value,
638 return std::make_pair(Value, llvm::ConstantInt::get(CGF.Int32Ty, 0));
641 llvm::Value *Offset = getPolymorphicOffset(CGF, SrcDecl, Value);
654 static llvm::CallSite emitRTtypeidCall(CodeGenFunction &CGF,
655 llvm::Value *Argument) {
656 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
657 llvm::FunctionType *FTy =
658 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false);
659 llvm::Value *Args[] = {Argument};
660 llvm::Constant *Fn = CGF.CGM.CreateRuntimeFunction(FTy, "__RTtypeid");
665 llvm::CallSite Call =
666 emitRTtypeidCall(CGF, llvm::Constant::getNullValue(CGM.VoidPtrTy));
671 llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF,
673 llvm::Value *ThisPtr,
674 llvm::Type *StdTypeInfoPtrTy) {
675 llvm::Value *Offset;
688 llvm::Value *MicrosoftCXXABI::EmitDynamicCastCall(
689 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
690 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
691 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
693 llvm::Value *SrcRTTI =
695 llvm::Value *DestRTTI =
698 llvm::Value *Offset;
707 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy, CGF.Int32Ty, CGF.Int8PtrTy,
709 llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction(
710 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
712 llvm::Value *Args[] = {
714 llvm::ConstantInt::get(CGF.Int32Ty, DestTy->isReferenceType())};
719 llvm::Value *
720 MicrosoftCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
723 llvm::Value *Offset;
728 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
729 llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction(
730 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
732 llvm::Value *Args[] = {Value};
740 llvm::Value *
742 llvm::Value *This,
747 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars);
752 llvm::Value *VBTableOffset =
753 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity());
755 llvm::Value *VBPtrToNewBase =
804 llvm::BasicBlock *
807 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
810 llvm::Value *IsCompleteObject =
813 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases");
814 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases");
849 cast<llvm::PointerType>(getThisValue(CGF)->getType())->getAddressSpace();
850 llvm::Value *Int8This = nullptr; // Initialize lazily.
857 llvm::Value *VBaseOffset =
866 llvm::Value *VtorDispValue = Builder.CreateSub(
867 VBaseOffset, llvm::ConstantInt::get(CGM.Int32Ty, ConstantVBaseOffset),
873 llvm::Value *VtorDispPtr = Builder.CreateInBoundsGEP(Int8This, VBaseOffset);
890 llvm::Value *ThisInt8Ptr =
897 llvm::GlobalVariable *GV = VBGlobals.Globals[I];
904 llvm::Value *VBPtr =
969 llvm::Value *MicrosoftCXXABI::adjustThisArgumentForVirtualFunctionCall(
970 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, bool VirtualCall) {
978 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
979 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS);
1002 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
1003 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS);
1014 llvm::Value *VBaseOffset =
1074 llvm::Value *MicrosoftCXXABI::adjustThisParameterInVirtualFunctionPrologue(
1075 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) {
1085 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
1086 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS),
1141 llvm::Value *MostDerivedArg =
1142 llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete);
1158 bool Delegating, llvm::Value *This) {
1159 llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(DD, Type);
1180 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, Info->FullOffsetInMDC);
1184 llvm::Constant *RTTI = getMSCompleteObjectLocator(RD, Info);
1188 llvm
1197 llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor(
1204 llvm::GlobalValue *VTableAddressPoint = VFTablesMap[ID];
1215 llvm::raw_svector_ostream Out(Name);
1219 llvm::Constant *MicrosoftCXXABI::getVTableAddressPointForConstExpr(
1223 llvm::GlobalValue *VFTable = VFTablesMap[ID];
1228 llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1240 llvm::GlobalVariable *&VTable = I->second;
1253 llvm::StringSet<> ObservedMangledNames;
1273 llvm::GlobalValue::LinkageTypes VTableLinkage =
1274 llvm::GlobalValue::ExternalLinkage;
1275 llvm::ArrayType *VTableType =
1276 llvm::ArrayType::get(CGM.Int8PtrTy, NumVTableSlots);
1278 VTableLinkage = llvm::GlobalValue::PrivateLinkage;
1286 llvm::GlobalValue *VFTable = VTable = new llvm::GlobalVariable(
1296 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0),
1297 llvm::ConstantInt::get(CGM.IntTy, 1)};
1300 llvm::Constant *VTableGEP =
1301 llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, GEPIndices);
1306 VFTable = llvm::GlobalAlias::create(
1307 cast<llvm::SequentialType>(VTableGEP->getType())->getElementType(),
1308 /*AddressSpace=*/0, llvm::GlobalValue::ExternalLinkage,
1319 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1321 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1323 llvm::GlobalValue::LinkageTypes VFTableLinkage = CGM.getVTableLinkage(RD);
1325 if (llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage)) {
1328 } else if (llvm::GlobalValue::isLocalLinkage(VFTableLinkage)) {
1332 } else if (llvm::GlobalValue::isWeakODRLinkage(VFTableLinkage) ||
1333 llvm::GlobalValue::isLinkOnceODRLinkage(VFTableLinkage)) {
1336 VFTableLinkage = llvm::GlobalValue::ExternalLinkage;
1337 llvm::Comdat *C =
1344 C->setSelectionKind(llvm::Comdat::Largest);
1360 llvm::Value *MicrosoftCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1362 llvm::Value *This,
1363 llvm::Type *Ty) {
1368 llvm::Value *VPtr =
1370 llvm::Value *VTable = CGF.GetVTablePtr(VPtr, Ty);
1374 llvm::Value *VFuncPtr =
1383 llvm::Value *This) {
1391 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1392 llvm::Value *Callee = getVirtualFunctionPointer(CGF, GD, This, Ty);
1395 llvm::Value *ImplicitParam =
1396 llvm::ConstantInt::get(llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()),
1408 llvm::DenseMap<const CXXRecordDecl*, VBTableGlobals>::iterator Entry;
1421 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1431 llvm::Function *MicrosoftCXXABI::EmitVirtualMemPtrThunk(
1436 llvm::raw_svector_ostream Out(ThunkName);
1441 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName))
1442 return cast<llvm::Function>(GV);
1444 // Create the llvm::Function.
1446 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
1447 llvm::Function *ThunkFn =
1448 llvm::Function::Create(ThunkTy, llvm::Function::ExternalLinkage,
1453 ? llvm::GlobalValue::LinkOnceODRLinkage
1454 : llvm::GlobalValue::InternalLinkage);
1465 llvm::Value *This = CGF.LoadCXXThis();
1466 llvm::Value *VTable =
1468 llvm::Value *VFuncPtr =
1470 llvm::Value *Callee = CGF.Builder.CreateLoad(VFuncPtr);
1475 llvm::AttributeSet Attrs =
1476 llvm::AttributeSet::get(CGF.getLLVMContext(), AttributeList);
1480 SmallVector<llvm::Value *, 8> Args;
1481 for (llvm::Argument &A : ThunkFn->args())
1483 llvm::CallInst *Call = CGF.Builder.CreateCall(Callee, Args);
1484 Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
1486 Call->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
1505 llvm::GlobalVariable *GV = VBGlobals.Globals[I];
1510 llvm::GlobalVariable *
1512 llvm::GlobalVariable::LinkageTypes Linkage) {
1514 llvm::raw_svector_ostream Out(OutName);
1519 llvm::ArrayType *VBTableType =
1520 llvm::ArrayType::get(CGM.IntTy, 1 + VBT.ReusingBase->getNumVBases());
1524 llvm::GlobalVariable *GV =
1529 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1531 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1538 llvm::GlobalVariable *GV) const {
1549 SmallVector<llvm::Constant *, 4> Offsets(1 + ReusingBase->getNumVBases(),
1554 Offsets[0] = llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity());
1571 Offsets[VBIndex] = llvm
1575 cast<llvm::ArrayType>(cast<llvm::PointerType>(GV->getType())
1577 llvm::ArrayType *VBTableType =
1578 llvm::ArrayType::get(CGM.IntTy, Offsets.size());
1579 llvm::Constant *Init = llvm::ConstantArray::get(VBTableType, Offsets);
1586 llvm::Value *MicrosoftCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1587 llvm::Value *This,
1592 llvm::Value *V = CGF.Builder.CreateBitCast(This, CGF.Int8PtrTy);
1597 llvm::Value *VtorDispPtr =
1601 llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp");
1610 llvm::Value *VBPtr;
1611 llvm::Value *VBaseOffset =
1629 llvm::Value *
1630 MicrosoftCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1635 llvm::Value *V = CGF.Builder.CreateBitCast(Ret, CGF.Int8PtrTy);
1641 llvm::Value *VBPtr;
1642 llvm::Value *VBaseOffset =
1676 llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1677 llvm::Value *allocPtr,
1680 llvm::Value *numElementsPtr =
1685 llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1686 llvm::Value *newPtr,
1687 llvm::Value *numElements,
1696 llvm::Value *cookiePtr = newPtr;
1700 llvm::Value *numElementsPtr
1711 llvm::GlobalVariable *GV,
1717 CGF.CurFn->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
1731 llvm::IntegerType *GuardTy = CGF.Int32Ty;
1732 llvm::ConstantInt *Zero = llvm::ConstantInt::get(GuardTy, 0);
1761 llvm::raw_svector_ostream Out(GuardName);
1769 new llvm::GlobalVariable(CGM.getModule(), GuardTy, false,
1785 llvm::ConstantInt *Bit = llvm::ConstantInt::get(GuardTy, 1U << BitIndex);
1786 llvm::LoadInst *LI = Builder.CreateLoad(GI->Guard);
1787 llvm::Value *IsInitialized =
1789 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1790 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1819 llvm::Type *
1823 llvm::SmallVector<llvm::Type *, 4> fields;
1839 return llvm::StructType::get(CGM.getLLVMContext(), fields);
1844 llvm::SmallVectorImpl<llvm::Constant *> &fields) {
1850 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
1867 llvm::Constant *
1869 llvm::SmallVector<llvm::Constant *, 4> fields;
1873 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields);
1878 llvm::Constant *
1879 MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
1891 llvm::SmallVector<llvm::Constant *, 4> fields;
1895 fields.push_back(llvm::ConstantInt::get(
1902 fields.push_back(llvm::ConstantInt::get(CGM.IntTy, Offs.getQuantity()));
1909 return llvm::ConstantStruct::getAnon(fields);
1912 llvm::Constant *
1916 llvm::Constant *FirstField =
1917 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity());
1922 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
1926 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP,
1946 llvm::Constant *
1955 llvm::Constant *FirstField;
1958 llvm::Type *Ty;
1959 // Check whether the function has a computable LLVM signature.
1961 // The function has a computable LLVM signature; use the correct type.
1969 FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy);
1975 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
1980 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
1984 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
1986 llvm::Function *Thunk = EmitVirtualMemPtrThunk(MD, ML);
1987 FirstField = llvm::ConstantExpr::getBitCast(Thunk, CGM.VoidPtrTy);
2001 llvm::Value *
2003 llvm::Value *L,
2004 llvm::Value *R,
2010 llvm::ICmpInst::Predicate Eq;
2011 llvm::Instruction::BinaryOps And, Or;
2013 Eq = llvm::ICmpInst::ICMP_NE;
2014 And = llvm::Instruction::Or;
2015 Or = llvm::Instruction::And;
2017 Eq = llvm::ICmpInst::ICMP_EQ;
2018 And = llvm::Instruction::And;
2019 Or = llvm::Instruction::Or;
2031 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0");
2032 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0");
2033 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first");
2036 llvm::Value *Res = nullptr;
2037 llvm::StructType *LType = cast<llvm::StructType>(L->getType());
2039 llvm::Value *LF = Builder.CreateExtractValue(L, I);
2040 llvm::Value *RF = Builder.CreateExtractValue(R, I);
2041 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest");
2051 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType());
2052 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero");
2061 llvm::Value *
2063 llvm::Value *MemPtr,
2066 llvm::SmallVector<llvm::Constant *, 4> fields;
2069 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
2073 llvm::Value *FirstField = MemPtr;
2076 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0");
2085 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I);
2086 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp");
2093 llvm::Constant *Val) {
2096 llvm::Constant *FirstField = Val->getType()->isStructTy() ?
2108 llvm::SmallVector<llvm::Constant *, 4> Fields;
2123 llvm::Value *
2125 llvm::Value *This,
2126 llvm::Value *VBPtrOffset,
2127 llvm::Value *VBTableOffset,
2128 llvm::Value **VBPtrOut) {
2132 llvm::Value *VBPtr =
2136 llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable");
2139 llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableOffset);
2146 llvm::Value *MicrosoftCXXABI::AdjustVirtualBase(
2148 llvm::Value *Base, llvm::Value *VBTableOffset, llvm::Value *VBPtrOffset) {
2151 llvm::BasicBlock *OriginalBB = nullptr;
2152 llvm::BasicBlock *SkipAdjustBB = nullptr;
2153 llvm::BasicBlock *VBaseAdjustBB = nullptr;
2163 llvm::Value *IsVirtual =
2183 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity());
2185 llvm::Value *VBPtr = nullptr;
2186 llvm::Value *VBaseOffs =
2188 llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs);
2194 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base");
2202 llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress(
2203 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
2207 llvm::Type *PType =
2215 llvm::Value *FieldOffset = MemPtr;
2216 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2217 llvm::Value *VBPtrOffset = nullptr;
2237 llvm::Value *Addr =
2250 llvm::Value *
2253 llvm::Value *Src) {
2259 if (isa<llvm::Constant>(Src))
2260 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src));
2283 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy);
2284 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy);
2290 // or data and have the same size, which means the LLVM types should match.
2295 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock();
2296 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert");
2297 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted");
2302 llvm::Value *FirstField = Src;
2303 llvm::Value *NonVirtualBaseAdjustment = nullptr;
2304 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2305 llvm::Value *VBPtrOffset = nullptr;
2321 llvm::Constant *Adj = getMemberPointerAdjustment(E);
2323 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
2324 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField;
2338 llvm::Value *Dst;
2342 Dst = llvm::UndefValue::get(DstNull->getType());
2359 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted");
2365 llvm::Constant *
2367 llvm::Constant *Src) {
2387 llvm::Constant *FirstField = Src;
2388 llvm::Constant *NonVirtualBaseAdjustment = nullptr;
2389 llvm::Constant *VirtualBaseAdjustmentOffset = nullptr;
2390 llvm::Constant *VBPtrOffset = nullptr;
2406 llvm::Constant *Adj = getMemberPointerAdjustment(E);
2408 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
2409 llvm::Constant *&NVAdjustField =
2415 NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj);
2417 NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj);
2426 llvm::SmallVector<llvm::Constant *, 4> Fields;
2434 return llvm::ConstantStruct::getAnon(Fields);
2437 llvm::Value *MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(
2438 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
2439 llvm::Value *MemPtr, const MemberPointerType *MPT) {
2444 llvm::FunctionType *FTy =
2453 llvm::Value *FunctionPointer = MemPtr;
2454 llvm::Value *NonVirtualBaseAdjustment = nullptr;
2455 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2456 llvm::Value *VBPtrOffset = nullptr;
2476 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
2508 // not declare a specific llvm type for BaseClassArray, it's merely an array
2518 static llvm::GlobalVariable *getTypeInfoVTable(CodeGenModule &CGM) {
2522 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2524 llvm::GlobalVariable::ExternalLinkage,
2588 static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) {
2593 return llvm::GlobalValue::InternalLinkage;
2597 return llvm::GlobalValue::LinkOnceODRLinkage;
2618 llvm::GlobalVariable *getBaseClassDescriptor(const MSRTTIClass &Classes);
2619 llvm::GlobalVariable *
2621 llvm::GlobalVariable *getClassHierarchyDescriptor();
2622 llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo *Info);
2626 llvm::LLVMContext &VMContext;
2627 llvm::Module &Module;
2629 llvm::GlobalVariable::LinkageTypes Linkage;
2647 llvm::SmallPtrSet<const CXXRecordDecl *, 8> VirtualBases;
2648 llvm::SmallPtrSet<const CXXRecordDecl *, 8> UniqueBases;
2649 llvm::SmallPtrSet<const CXXRecordDecl *, 8> AmbiguousBases;
2667 llvm::GlobalVariable *MSRTTIBuilder::getClassHierarchyDescriptor() {
2670 llvm::raw_svector_ostream Out(MangledName);
2696 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0),
2697 llvm::ConstantInt::get(CGM.IntTy, 0)};
2701 auto CHD = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
2706 llvm::Constant *Fields[] = {
2707 llvm::ConstantInt::get(CGM.IntTy, 0), // Unknown
2708 llvm::ConstantInt::get(CGM.IntTy, Flags),
2709 llvm::ConstantInt::get(CGM.IntTy, Classes.size()),
2710 ABI.getImageRelativeConstant(llvm::ConstantExpr::getInBoundsGetElementPtr(
2712 llvm::ArrayRef<llvm::Value *>(GEPIndices))),
2714 CHD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
2718 llvm::GlobalVariable *
2722 llvm::raw_svector_ostream Out(MangledName);
2731 llvm::Type *PtrType = ABI.getImageRelativeType(
2733 auto *ArrType = llvm::ArrayType::get(PtrType, Classes.size() + 1);
2734 auto *BCA = new llvm::GlobalVariable(
2739 SmallVector<llvm::Constant *, 8> BaseClassArrayData;
2743 BaseClassArrayData.push_back(llvm::Constant::getNullValue(PtrType));
2744 BCA->setInitializer(llvm::ConstantArray::get(ArrType, BaseClassArrayData));
2748 llvm::GlobalVariable *
2762 llvm::raw_svector_ostream Out(MangledName);
2774 auto BCD = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
2779 llvm::Constant *Fields[] = {
2782 llvm::ConstantInt::get(CGM.IntTy, Class.NumBases),
2783 llvm::ConstantInt::get(CGM.IntTy, Class.OffsetInVBase),
2784 llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset),
2785 llvm::ConstantInt::get(CGM.IntTy, OffsetInVBTable),
2786 llvm::ConstantInt::get(CGM.IntTy, Class.Flags),
2790 BCD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
2794 llvm::GlobalVariable *
2798 llvm::raw_svector_ostream Out(MangledName);
2818 llvm::StructType *Type = ABI.getCompleteObjectLocatorType();
2819 auto COL = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
2823 llvm::Constant *Fields[] = {
2824 llvm::ConstantInt::get(CGM.IntTy, ABI.isImageRelative()),
2825 llvm::ConstantInt::get(CGM.IntTy, OffsetToTop),
2826 llvm::ConstantInt::get(CGM.IntTy, VFPtrOffset),
2832 llvm::ArrayRef<llvm::Constant *> FieldsRef(Fields);
2835 COL->setInitializer(llvm::ConstantStruct::get(Type, FieldsRef));
2839 /// \brief Gets a TypeDescriptor. Returns a llvm::Constant * rather than a
2840 /// llvm::GlobalVariable * because different type descriptors have different
2843 llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) {
2846 llvm::raw_svector_ostream Out(MangledName);
2851 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
2852 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2856 llvm::raw_svector_ostream Out(TypeInfoString);
2861 llvm::Constant *Fields[] = {
2863 llvm::ConstantPointerNull::get(CGM.Int8PtrTy), // Runtime data
2864 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), TypeInfoString)};
2865 llvm::StructType *TypeDescriptorType =
2867 return llvm::ConstantExpr::getBitCast(
2868 new llvm::GlobalVariable(
2871 llvm::ConstantStruct::get(TypeDescriptorType, Fields),
2877 llvm::GlobalVariable *