Lines Matching refs:llvm

28 #include "llvm/IR/CallSite.h"
29 #include "llvm/IR/DataLayout.h"
30 #include "llvm/IR/Intrinsics.h"
31 #include "llvm/IR/Value.h"
39 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
70 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
72 llvm::Value *
75 llvm::Value *&This,
76 llvm::Value *MemFnPtr,
79 llvm::Value *
81 llvm::Value *Base,
82 llvm::Value *MemPtr,
85 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
87 llvm::Value *Src) override;
88 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
89 llvm::Constant *Src) override;
91 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
93 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override;
94 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
96 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
97 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
100 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
101 llvm::Value *L, llvm::Value *R,
105 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
106 llvm::Value *Addr,
109 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF, llvm::Value *ptr,
114 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
118 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
119 llvm::Value *ThisPtr,
120 llvm::Type *StdTypeInfoPtrTy) override;
125 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
128 llvm::BasicBlock *CastEnd) override;
130 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
136 llvm::Value *
137 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
174 bool Delegating, llvm::Value *This) override;
179 llvm::Value *getVTableAddressPointInStructor(
184 llvm::Constant *
188 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
191 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
192 llvm::Value *This,
193 llvm::Type *Ty) override;
198 llvm::Value *This) override;
202 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
207 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
210 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
213 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
221 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
222 llvm::Value *NewPtr,
223 llvm::Value *NumElements,
226 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
227 llvm::Value *allocPtr,
231 llvm::GlobalVariable *DeclPtr,
234 llvm::Constant *dtor, llvm::Constant *addr) override;
236 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
237 llvm::GlobalVariable *Var);
239 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
240 llvm::Function *InitFunc) override;
274 llvm::GlobalValue::LinkageTypes Linkage) const;
294 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
295 llvm::Value *NewPtr,
296 llvm::Value *NumElements,
299 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, llvm::Value *allocPtr,
332 == llvm::Triple::le32) {
347 llvm::Type *
351 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, NULL);
374 llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
375 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
376 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
384 llvm::FunctionType *FTy =
388 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
390 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
391 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
392 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
395 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
398 llvm::Value *Adj = RawAdj;
404 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
409 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
413 llvm::Value *IsVirtual;
427 llvm::Type *VTableTy = Builder.getInt8PtrTy();
428 llvm::Value *VTable = CGF.GetVTablePtr(This, VTableTy);
431 llvm::Value *VTableOffset = FnAsInt;
438 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn");
444 llvm::Value *NonVirtualFn =
449 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
457 llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
458 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
470 llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, MemPtr, "memptr.offset");
474 llvm::Type *PType
502 llvm::Value *
505 llvm::Value *src) {
514 if (isa<llvm::Constant>(src))
515 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
517 llvm::Constant *adj = getMemberPointerAdjustment(E);
529 llvm::Value *dst;
536 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
537 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
543 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
545 adj = llvm::ConstantInt::get(adj->getType(), offset);
548 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
549 llvm::Value *dstAdj;
558 llvm::Constant *
560 llvm::Constant *src) {
569 llvm::Constant *adj = getMemberPointerAdjustment(E);
584 return llvm::ConstantExpr::getNSWSub(src, adj);
586 return llvm::ConstantExpr::getNSWAdd(src, adj);
591 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
593 adj = llvm::ConstantInt::get(adj->getType(), offset);
596 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
597 llvm::Constant *dstAdj;
599 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
601 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
603 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
606 llvm::Constant *
611 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
613 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
614 llvm::Constant *Values[2] = { Zero, Zero };
615 return llvm::ConstantStruct::getAnon(Values);
618 llvm::Constant *
624 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
627 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
631 llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
639 llvm::Constant *MemPtr[2];
655 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
656 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
663 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
664 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
669 llvm::Type *Ty;
679 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
681 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
682 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
687 return llvm::ConstantStruct::getAnon(MemPtr);
690 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
711 llvm::Value *
713 llvm::Value *L,
714 llvm::Value *R,
719 llvm::ICmpInst::Predicate Eq;
720 llvm::Instruction::BinaryOps And, Or;
722 Eq = llvm::ICmpInst::ICMP_NE;
723 And = llvm::Instruction::Or;
724 Or = llvm::Instruction::And;
726 Eq = llvm::ICmpInst::ICMP_EQ;
727 And = llvm::Instruction::And;
728 Or = llvm::Instruction::Or;
746 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
747 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
751 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
756 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
757 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
761 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
762 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
763 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
768 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
771 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
772 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
773 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
779 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
785 llvm::Value *
787 llvm::Value *MemPtr,
794 llvm::Value *NegativeOne =
795 llvm::Constant::getAllOnesValue(MemPtr->getType());
800 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
802 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
803 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
808 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
809 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
810 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
811 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
842 llvm::Value *ItaniumCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
843 llvm::Value *ptr,
846 llvm::Value *vtable = CGF.GetVTablePtr(ptr, CGF.IntPtrTy->getPointerTo());
849 llvm::Value *offsetPtr =
851 llvm::LoadInst *offset = CGF.Builder.CreateLoad(offsetPtr);
859 static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
865 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
866 llvm::Type *PtrDiffTy =
869 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
871 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
874 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
875 llvm::Attribute::ReadOnly };
876 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
877 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
882 static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
884 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
940 static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
942 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
953 llvm::Value *Fn = getBadTypeidFn(CGF);
958 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
960 llvm::Value *ThisPtr,
961 llvm::Type *StdTypeInfoPtrTy) {
962 llvm::Value *Value =
975 llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
976 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
977 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
978 llvm::Type *PtrDiffLTy =
980 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
982 llvm::Value *SrcRTTI =
984 llvm::Value *DestRTTI =
990 llvm::Value *OffsetHint = llvm::ConstantInt::get(
997 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1004 llvm::BasicBlock *BadCastBlock =
1007 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1017 llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1018 llvm::Value *Value,
1021 llvm::Type *PtrDiffLTy =
1023 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1026 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1029 llvm::Value *OffsetToTop =
1041 llvm::Value *Fn = getBadCastFn(CGF);
1047 llvm::Value *
1049 llvm::Value *This,
1052 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy);
1057 llvm::Value *VBaseOffsetPtr =
1063 llvm::Value *VBaseOffset =
1183 llvm::Value *VTT =
1194 bool Delegating, llvm::Value *This) {
1196 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1199 llvm::Value *Callee = nullptr;
1213 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1219 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1220 llvm::Constant *RTTI =
1224 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1247 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1253 llvm::Value *VTableAddressPoint;
1260 llvm::Value *VTT = CGF.LoadCXXVTT();
1267 llvm::Constant *VTable =
1279 llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1281 llvm::Constant *VTable = getAddrOfVTable(VTableClass, CharUnits());
1287 llvm::Value *Indices[] = {
1288 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1289 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1292 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Indices);
1295 llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1299 llvm::GlobalVariable *&VTable = VTables[RD];
1307 llvm::raw_svector_ostream Out(OutName);
1313 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1317 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1321 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1323 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1328 llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1330 llvm::Value *This,
1331 llvm::Type *Ty) {
1334 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
1337 llvm::Value *VFuncPtr =
1346 llvm::Value *This) {
1351 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1352 llvm::Value *Callee =
1362 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
1366 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
1367 llvm::Value *Ptr,
1374 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1375 llvm::Value *V = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy);
1383 llvm::Type *PtrDiffTy =
1387 llvm::Value *VTablePtrPtr =
1390 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1392 llvm::Value *OffsetPtr =
1398 llvm::Value *Offset = CGF.Builder.CreateLoad(OffsetPtr);
1413 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1414 llvm::Value *This,
1421 llvm::Value *
1422 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1435 llvm::Type *T =
1436 cast<llvm::PointerType>(CGF.ReturnValue->getType())->getElementType();
1437 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1450 llvm::Value *ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1451 llvm::Value *NewPtr,
1452 llvm::Value *NumElements,
1469 llvm::Value *CookiePtr = NewPtr;
1476 llvm::Value *NumElementsPtr
1487 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1488 llvm::Value *allocPtr,
1491 llvm::Value *numElementsPtr = allocPtr;
1518 llvm::Value *ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1519 llvm::Value *newPtr,
1520 llvm::Value *numElements,
1529 llvm::Value *cookie = newPtr;
1533 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1548 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1549 llvm::Value *allocPtr,
1553 llvm::Value *numElementsPtr
1564 static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
1565 llvm::PointerType *GuardPtrTy) {
1567 llvm::FunctionType *FTy =
1568 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
1571 llvm::AttributeSet::get(CGM.getLLVMContext(),
1572 llvm::AttributeSet::FunctionIndex,
1573 llvm::Attribute::NoUnwind));
1576 static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
1577 llvm::PointerType *GuardPtrTy) {
1579 llvm::FunctionType *FTy =
1580 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1582 llvm::AttributeSet::get(CGM.getLLVMContext(),
1583 llvm::AttributeSet::FunctionIndex,
1584 llvm::Attribute::NoUnwind));
1587 static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
1588 llvm::PointerType *GuardPtrTy) {
1590 llvm::FunctionType *FTy =
1591 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1593 llvm::AttributeSet::get(CGM.getLLVMContext(),
1594 llvm::AttributeSet::FunctionIndex,
1595 llvm::Attribute::NoUnwind));
1600 llvm::GlobalVariable *Guard;
1601 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
1614 llvm::GlobalVariable *var,
1627 llvm::IntegerType *guardTy;
1635 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
1639 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1644 llvm::raw_svector_ostream out(guardName);
1651 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1653 llvm::ConstantInt::get(guardTy, 0),
1680 llvm::LoadInst *LI =
1691 LI->setAtomic(llvm::Acquire);
1713 llvm::Value *V =
1715 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
1717 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
1719 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
1720 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1730 llvm::Value *V
1733 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1754 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guard);
1762 llvm::Constant *dtor,
1763 llvm::Constant *addr,
1767 const llvm::Triple &T = CGF.getTarget().getTriple();
1774 llvm::Type *dtorTy =
1775 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
1778 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
1779 llvm::FunctionType *atexitTy =
1780 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
1783 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
1784 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
1788 llvm::Constant *handle =
1791 llvm::Value *args[] = {
1792 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
1793 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
1802 llvm::Constant *dtor,
1803 llvm::Constant *addr) {
1824 static llvm::GlobalValue::LinkageTypes
1826 llvm::GlobalValue::LinkageTypes VarLinkage =
1830 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
1838 return llvm::GlobalValue::WeakAnyLinkage;
1839 return llvm::GlobalValue::WeakODRLinkage;
1842 llvm::Function *
1844 llvm::GlobalVariable *Var) {
1848 llvm::raw_svector_ostream Out(WrapperName);
1853 if (llvm::Value *V = Var->getParent()->getNamedValue(WrapperName))
1854 return cast<llvm::Function>(V);
1856 llvm::Type *RetTy = Var->getType();
1860 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
1861 llvm::Function *Wrapper =
1862 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
1866 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
1871 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
1872 llvm::Function *InitFunc) {
1875 llvm::GlobalVariable *Var = Decls[I].second;
1880 llvm::raw_svector_ostream Out(InitFnName);
1888 llvm::GlobalValue *Init = nullptr;
1893 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
1900 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
1901 Init = llvm::Function::Create(
1902 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
1909 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
1910 llvm::LLVMContext &Context = CGM.getModule().getContext();
1911 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
1918 llvm::Value *Have = Builder.CreateIsNotNull(Init);
1919 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1920 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1932 llvm::Value *Val = Var;
1934 llvm::LoadInst *LI = Builder.CreateLoad(Val);
1947 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
1948 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
1949 llvm::Function *Wrapper =
1950 getOrCreateThreadLocalWrapper(VD, cast<llvm::GlobalVariable>(Val));
1986 llvm::LLVMContext &VMContext;
1990 SmallVector<llvm::Constant *, 16> Fields;
1993 llvm::GlobalVariable *
1994 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
1998 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2068 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2072 llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2073 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
2075 llvm::raw_svector_ostream Out(OutName);
2083 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2086 llvm::GlobalVariable *GV =
2094 llvm::Constant *
2098 llvm::raw_svector_ostream Out(OutName);
2104 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2108 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2110 llvm::GlobalValue::ExternalLinkage, nullptr,
2114 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2414 llvm::Constant *VTable =
2417 llvm::Type *PtrDiffTy =
2421 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
2422 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Two);
2423 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2430 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2442 return llvm::GlobalValue::InternalLinkage;
2448 return llvm::GlobalValue::InternalLinkage;
2455 return llvm::GlobalValue::LinkOnceODRLinkage;
2461 return llvm::GlobalValue::WeakODRLinkage;
2466 return llvm::GlobalValue::LinkOnceODRLinkage;
2472 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2478 llvm::raw_svector_ostream Out(OutName);
2483 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2488 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2497 llvm::GlobalVariable::LinkageTypes Linkage;
2499 Linkage = llvm::GlobalValue::ExternalLinkage;
2507 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2508 llvm::Constant *TypeNameField;
2517 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2518 llvm::Constant *flag =
2519 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2520 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2522 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2524 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2610 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2612 llvm::GlobalVariable *GV =
2613 new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
2619 llvm::Constant *NewPtr =
2620 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
2642 llvm::GlobalValue::VisibilityTypes llvmVisibility;
2643 if (llvm::GlobalValue::isLocalLinkage(Linkage))
2645 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
2647 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
2653 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2691 llvm::Constant *BaseTypeInfo =
2702 llvm::Constant *BaseTypeInfo =
2711 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
2712 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
2771 llvm::Type *UnsignedIntLTy =
2779 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2784 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
2789 llvm::Type *LongLTy =
2840 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
2862 llvm::Type *UnsignedIntLTy =
2864 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2869 llvm::Constant *PointeeTypeInfo =
2900 llvm::Type *UnsignedIntLTy =
2902 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2907 llvm::Constant *PointeeTypeInfo =
2919 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
2952 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
2957 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
2958 Linkage != llvm::GlobalValue::WeakODRLinkage)
2966 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
2972 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);