1 //===------- ItaniumCXXABI.cpp - Emit LLVM Code from ASTs for a Module ----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This provides C++ code generation targeting the Itanium C++ ABI. The class
11 // in this file generates structures that follow the Itanium C++ ABI, which is
13 // http://www.codesourcery.com/public/cxx-abi/abi.html
14 // http://www.codesourcery.com/public/cxx-abi/abi-eh.html
16 // It also supports the closely-related ARM ABI, documented at:
17 // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0041c/IHI0041C_cppabi.pdf
19 //===----------------------------------------------------------------------===//
22 #include "CGRecordLayout.h"
23 #include "CGVTables.h"
24 #include "CodeGenFunction.h"
25 #include "CodeGenModule.h"
26 #include "clang/AST/Mangle.h"
27 #include "clang/AST/Type.h"
28 #include "llvm/IR/CallSite.h"
29 #include "llvm/IR/DataLayout.h"
30 #include "llvm/IR/Intrinsics.h"
31 #include "llvm/IR/Value.h"
33 using namespace clang;
34 using namespace CodeGen;
37 class ItaniumCXXABI : public CodeGen::CGCXXABI {
38 /// VTables - All the vtables which have been defined.
39 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
42 bool UseARMMethodPtrABI;
43 bool UseARMGuardVarABI;
45 ItaniumMangleContext &getMangleContext() {
46 return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext());
50 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
51 bool UseARMMethodPtrABI = false,
52 bool UseARMGuardVarABI = false) :
53 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
54 UseARMGuardVarABI(UseARMGuardVarABI) { }
56 bool classifyReturnType(CGFunctionInfo &FI) const override;
58 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
59 // Structures with either a non-trivial destructor or a non-trivial
60 // copy constructor are always indirect.
61 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
63 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor())
68 bool isZeroInitializable(const MemberPointerType *MPT) override;
70 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
73 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
76 llvm::Value *MemFnPtr,
77 const MemberPointerType *MPT) override;
80 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
83 const MemberPointerType *MPT) override;
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,
95 CharUnits offset) override;
96 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
97 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
98 CharUnits ThisAdjustment);
100 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
101 llvm::Value *L, llvm::Value *R,
102 const MemberPointerType *MPT,
103 bool Inequality) override;
105 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
107 const MemberPointerType *MPT) override;
109 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF, llvm::Value *ptr,
110 QualType type) override;
112 void EmitFundamentalRTTIDescriptor(QualType Type);
113 void EmitFundamentalRTTIDescriptors();
114 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
116 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
117 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
118 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
119 llvm::Value *ThisPtr,
120 llvm::Type *StdTypeInfoPtrTy) override;
122 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
123 QualType SrcRecordTy) override;
125 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
126 QualType SrcRecordTy, QualType DestTy,
127 QualType DestRecordTy,
128 llvm::BasicBlock *CastEnd) override;
130 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
131 QualType SrcRecordTy,
132 QualType DestTy) override;
134 bool EmitBadCastCall(CodeGenFunction &CGF) override;
137 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
138 const CXXRecordDecl *ClassDecl,
139 const CXXRecordDecl *BaseClassDecl) override;
141 void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
142 CXXCtorType T, CanQualType &ResTy,
143 SmallVectorImpl<CanQualType> &ArgTys) override;
145 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
147 void BuildDestructorSignature(const CXXDestructorDecl *Dtor,
148 CXXDtorType T, CanQualType &ResTy,
149 SmallVectorImpl<CanQualType> &ArgTys) override;
151 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
152 CXXDtorType DT) const override {
153 // Itanium does not emit any destructor variant as an inline thunk.
154 // Delegating may occur as an optimization, but all variants are either
155 // emitted with external linkage or as linkonce if they are inline and used.
159 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
161 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
162 FunctionArgList &Params) override;
164 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
166 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
167 const CXXConstructorDecl *D,
168 CXXCtorType Type, bool ForVirtualBase,
170 CallArgList &Args) override;
172 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
173 CXXDtorType Type, bool ForVirtualBase,
174 bool Delegating, llvm::Value *This) override;
176 void emitVTableDefinitions(CodeGenVTables &CGVT,
177 const CXXRecordDecl *RD) override;
179 llvm::Value *getVTableAddressPointInStructor(
180 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
181 BaseSubobject Base, const CXXRecordDecl *NearestVBase,
182 bool &NeedsVirtualOffset) override;
185 getVTableAddressPointForConstExpr(BaseSubobject Base,
186 const CXXRecordDecl *VTableClass) override;
188 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
189 CharUnits VPtrOffset) override;
191 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
193 llvm::Type *Ty) override;
195 void EmitVirtualDestructorCall(CodeGenFunction &CGF,
196 const CXXDestructorDecl *Dtor,
197 CXXDtorType DtorType, SourceLocation CallLoc,
198 llvm::Value *This) override;
200 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
202 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
203 bool ReturnAdjustment) override {
204 // Allow inlining of thunks by emitting them with available_externally
205 // linkage together with vtables when needed.
207 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
210 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
211 const ThisAdjustment &TA) override;
213 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
214 const ReturnAdjustment &RA) override;
216 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
217 StringRef GetDeletedVirtualCallName() override
218 { return "__cxa_deleted_virtual"; }
220 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
221 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
223 llvm::Value *NumElements,
224 const CXXNewExpr *expr,
225 QualType ElementType) override;
226 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
227 llvm::Value *allocPtr,
228 CharUnits cookieSize) override;
230 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
231 llvm::GlobalVariable *DeclPtr,
232 bool PerformInit) override;
233 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
234 llvm::Constant *dtor, llvm::Constant *addr) override;
236 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
237 llvm::GlobalVariable *Var);
238 void EmitThreadLocalInitFuncs(
239 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
240 llvm::Function *InitFunc) override;
241 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
242 QualType LValType) override;
244 bool NeedsVTTParameter(GlobalDecl GD) override;
246 /**************************** RTTI Uniqueness ******************************/
249 /// Returns true if the ABI requires RTTI type_info objects to be unique
250 /// across a program.
251 virtual bool shouldRTTIBeUnique() const { return true; }
254 /// What sort of unique-RTTI behavior should we use?
255 enum RTTIUniquenessKind {
256 /// We are guaranteeing, or need to guarantee, that the RTTI string
260 /// We are not guaranteeing uniqueness for the RTTI string, so we
261 /// can demote to hidden visibility but must use string comparisons.
264 /// We are not guaranteeing uniqueness for the RTTI string, so we
265 /// have to use string comparisons, but we also have to emit it with
266 /// non-hidden visibility.
270 /// Return the required visibility status for the given type and linkage in
273 classifyRTTIUniqueness(QualType CanTy,
274 llvm::GlobalValue::LinkageTypes Linkage) const;
275 friend class ItaniumRTTIBuilder;
278 class ARMCXXABI : public ItaniumCXXABI {
280 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
281 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
282 /* UseARMGuardVarABI = */ true) {}
284 bool HasThisReturn(GlobalDecl GD) const override {
285 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
286 isa<CXXDestructorDecl>(GD.getDecl()) &&
287 GD.getDtorType() != Dtor_Deleting));
290 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
291 QualType ResTy) override;
293 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
294 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
296 llvm::Value *NumElements,
297 const CXXNewExpr *expr,
298 QualType ElementType) override;
299 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, llvm::Value *allocPtr,
300 CharUnits cookieSize) override;
303 class iOS64CXXABI : public ARMCXXABI {
305 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
307 // ARM64 libraries are prepared for non-unique RTTI.
308 bool shouldRTTIBeUnique() const override { return false; }
312 CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
313 switch (CGM.getTarget().getCXXABI().getKind()) {
314 // For IR-generation purposes, there's no significant difference
315 // between the ARM and iOS ABIs.
316 case TargetCXXABI::GenericARM:
317 case TargetCXXABI::iOS:
318 return new ARMCXXABI(CGM);
320 case TargetCXXABI::iOS64:
321 return new iOS64CXXABI(CGM);
323 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
324 // include the other 32-bit ARM oddities: constructor/destructor return values
325 // and array cookies.
326 case TargetCXXABI::GenericAArch64:
327 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
328 /* UseARMGuardVarABI = */ true);
330 case TargetCXXABI::GenericItanium:
331 if (CGM.getContext().getTargetInfo().getTriple().getArch()
332 == llvm::Triple::le32) {
333 // For PNaCl, use ARM-style method pointers so that PNaCl code
334 // does not assume anything about the alignment of function
336 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
337 /* UseARMGuardVarABI = */ false);
339 return new ItaniumCXXABI(CGM);
341 case TargetCXXABI::Microsoft:
342 llvm_unreachable("Microsoft ABI is not Itanium-based");
344 llvm_unreachable("bad ABI kind");
348 ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
349 if (MPT->isMemberDataPointer())
350 return CGM.PtrDiffTy;
351 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, NULL);
354 /// In the Itanium and ARM ABIs, method pointers have the form:
355 /// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
357 /// In the Itanium ABI:
358 /// - method pointers are virtual if (memptr.ptr & 1) is nonzero
359 /// - the this-adjustment is (memptr.adj)
360 /// - the virtual offset is (memptr.ptr - 1)
363 /// - method pointers are virtual if (memptr.adj & 1) is nonzero
364 /// - the this-adjustment is (memptr.adj >> 1)
365 /// - the virtual offset is (memptr.ptr)
366 /// ARM uses 'adj' for the virtual flag because Thumb functions
367 /// may be only single-byte aligned.
369 /// If the member is virtual, the adjusted 'this' pointer points
370 /// to a vtable pointer from which the virtual offset is applied.
372 /// If the member is non-virtual, memptr.ptr is the address of
373 /// the function to call.
374 llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
375 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
376 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
377 CGBuilderTy &Builder = CGF.Builder;
379 const FunctionProtoType *FPT =
380 MPT->getPointeeType()->getAs<FunctionProtoType>();
381 const CXXRecordDecl *RD =
382 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
384 llvm::FunctionType *FTy =
385 CGM.getTypes().GetFunctionType(
386 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
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");
394 // Extract memptr.adj, which is in the second field.
395 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
397 // Compute the true adjustment.
398 llvm::Value *Adj = RawAdj;
399 if (UseARMMethodPtrABI)
400 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
402 // Apply the adjustment and cast back to the original struct type
404 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
405 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
406 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
408 // Load the function pointer.
409 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
411 // If the LSB in the function pointer is 1, the function pointer points to
412 // a virtual function.
413 llvm::Value *IsVirtual;
414 if (UseARMMethodPtrABI)
415 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
417 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
418 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
419 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
421 // In the virtual path, the adjustment left 'This' pointing to the
422 // vtable of the correct base subobject. The "function pointer" is an
423 // offset within the vtable (+1 for the virtual flag on non-ARM).
424 CGF.EmitBlock(FnVirtual);
426 // Cast the adjusted this to a pointer to vtable pointer and load.
427 llvm::Type *VTableTy = Builder.getInt8PtrTy();
428 llvm::Value *VTable = CGF.GetVTablePtr(This, VTableTy);
431 llvm::Value *VTableOffset = FnAsInt;
432 if (!UseARMMethodPtrABI)
433 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
434 VTable = Builder.CreateGEP(VTable, VTableOffset);
436 // Load the virtual function to call.
437 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
438 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn");
439 CGF.EmitBranch(FnEnd);
441 // In the non-virtual path, the function pointer is actually a
443 CGF.EmitBlock(FnNonVirtual);
444 llvm::Value *NonVirtualFn =
445 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
448 CGF.EmitBlock(FnEnd);
449 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
450 Callee->addIncoming(VirtualFn, FnVirtual);
451 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
455 /// Compute an l-value by applying the given pointer-to-member to a
457 llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
458 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
459 const MemberPointerType *MPT) {
460 assert(MemPtr->getType() == CGM.PtrDiffTy);
462 CGBuilderTy &Builder = CGF.Builder;
464 unsigned AS = Base->getType()->getPointerAddressSpace();
467 Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
469 // Apply the offset, which we assume is non-null.
470 llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, MemPtr, "memptr.offset");
472 // Cast the address to the appropriate pointer type, adopting the
473 // address space of the base pointer.
475 = CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
476 return Builder.CreateBitCast(Addr, PType);
479 /// Perform a bitcast, derived-to-base, or base-to-derived member pointer
482 /// Bitcast conversions are always a no-op under Itanium.
484 /// Obligatory offset/adjustment diagram:
485 /// <-- offset --> <-- adjustment -->
486 /// |--------------------------|----------------------|--------------------|
487 /// ^Derived address point ^Base address point ^Member address point
489 /// So when converting a base member pointer to a derived member pointer,
490 /// we add the offset to the adjustment because the address point has
491 /// decreased; and conversely, when converting a derived MP to a base MP
492 /// we subtract the offset from the adjustment because the address point
495 /// The standard forbids (at compile time) conversion to and from
496 /// virtual bases, which is why we don't have to consider them here.
498 /// The standard forbids (at run time) casting a derived MP to a base
499 /// MP when the derived MP does not point to a member of the base.
500 /// This is why -1 is a reasonable choice for null data member
503 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
506 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
507 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
508 E->getCastKind() == CK_ReinterpretMemberPointer);
510 // Under Itanium, reinterprets don't require any additional processing.
511 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
513 // Use constant emission if we can.
514 if (isa<llvm::Constant>(src))
515 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
517 llvm::Constant *adj = getMemberPointerAdjustment(E);
518 if (!adj) return src;
520 CGBuilderTy &Builder = CGF.Builder;
521 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
523 const MemberPointerType *destTy =
524 E->getType()->castAs<MemberPointerType>();
526 // For member data pointers, this is just a matter of adding the
527 // offset if the source is non-null.
528 if (destTy->isMemberDataPointer()) {
531 dst = Builder.CreateNSWSub(src, adj, "adj");
533 dst = Builder.CreateNSWAdd(src, adj, "adj");
536 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
537 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
538 return Builder.CreateSelect(isNull, src, dst);
541 // The this-adjustment is left-shifted by 1 on ARM.
542 if (UseARMMethodPtrABI) {
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");
551 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
553 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
555 return Builder.CreateInsertValue(src, dstAdj, 1);
559 ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
560 llvm::Constant *src) {
561 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
562 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
563 E->getCastKind() == CK_ReinterpretMemberPointer);
565 // Under Itanium, reinterprets don't require any additional processing.
566 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
568 // If the adjustment is trivial, we don't need to do anything.
569 llvm::Constant *adj = getMemberPointerAdjustment(E);
570 if (!adj) return src;
572 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
574 const MemberPointerType *destTy =
575 E->getType()->castAs<MemberPointerType>();
577 // For member data pointers, this is just a matter of adding the
578 // offset if the source is non-null.
579 if (destTy->isMemberDataPointer()) {
580 // null maps to null.
581 if (src->isAllOnesValue()) return src;
584 return llvm::ConstantExpr::getNSWSub(src, adj);
586 return llvm::ConstantExpr::getNSWAdd(src, adj);
589 // The this-adjustment is left-shifted by 1 on ARM.
590 if (UseARMMethodPtrABI) {
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);
607 ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
608 // Itanium C++ ABI 2.3:
609 // A NULL pointer is represented as -1.
610 if (MPT->isMemberDataPointer())
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);
619 ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
621 // Itanium C++ ABI 2.3:
622 // A pointer to data member is an offset from the base address of
623 // the class object containing it, represented as a ptrdiff_t
624 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
627 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
628 return BuildMemberPointer(MD, CharUnits::Zero());
631 llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
632 CharUnits ThisAdjustment) {
633 assert(MD->isInstance() && "Member function must not be static!");
634 MD = MD->getCanonicalDecl();
636 CodeGenTypes &Types = CGM.getTypes();
638 // Get the function pointer (or index if this is a virtual function).
639 llvm::Constant *MemPtr[2];
640 if (MD->isVirtual()) {
641 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
643 const ASTContext &Context = getContext();
644 CharUnits PointerWidth =
645 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
646 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
648 if (UseARMMethodPtrABI) {
649 // ARM C++ ABI 3.2.1:
650 // This ABI specifies that adj contains twice the this
651 // adjustment, plus 1 if the member function is virtual. The
652 // least significant bit of adj then makes exactly the same
653 // discrimination as the least significant bit of ptr does for
655 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
656 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
657 2 * ThisAdjustment.getQuantity() + 1);
659 // Itanium C++ ABI 2.3:
660 // For a virtual function, [the pointer field] is 1 plus the
661 // virtual table offset (in bytes) of the function,
662 // represented as a ptrdiff_t.
663 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
664 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
665 ThisAdjustment.getQuantity());
668 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
670 // Check whether the function has a computable LLVM signature.
671 if (Types.isFuncTypeConvertible(FPT)) {
672 // The function has a computable LLVM signature; use the correct type.
673 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
675 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
676 // function type is incomplete.
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,
683 (UseARMMethodPtrABI ? 2 : 1) *
684 ThisAdjustment.getQuantity());
687 return llvm::ConstantStruct::getAnon(MemPtr);
690 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
692 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
693 const ValueDecl *MPD = MP.getMemberPointerDecl();
695 return EmitNullMemberPointer(MPT);
697 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
699 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
700 return BuildMemberPointer(MD, ThisAdjustment);
702 CharUnits FieldOffset =
703 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
704 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
707 /// The comparison algorithm is pretty easy: the member pointers are
708 /// the same if they're either bitwise identical *or* both null.
710 /// ARM is different here only because null-ness is more complicated.
712 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
715 const MemberPointerType *MPT,
717 CGBuilderTy &Builder = CGF.Builder;
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;
731 // Member data pointers are easy because there's a unique null
732 // value, so it just comes down to bitwise equality.
733 if (MPT->isMemberDataPointer())
734 return Builder.CreateICmp(Eq, L, R);
736 // For member function pointers, the tautologies are more complex.
737 // The Itanium tautology is:
738 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
739 // The ARM tautology is:
740 // (L == R) <==> (L.ptr == R.ptr &&
741 // (L.adj == R.adj ||
742 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
743 // The inequality tautologies have exactly the same structure, except
744 // applying De Morgan's laws.
746 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
747 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
749 // This condition tests whether L.ptr == R.ptr. This must always be
750 // true for equality to hold.
751 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
753 // This condition, together with the assumption that L.ptr == R.ptr,
754 // tests whether the pointers are both null. ARM imposes an extra
756 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
757 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
759 // This condition tests whether L.adj == R.adj. If this isn't
760 // true, the pointers are unequal unless they're both 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");
765 // Null member function pointers on ARM clear the low bit of Adj,
766 // so the zero condition has to check that neither low bit is set.
767 if (UseARMMethodPtrABI) {
768 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
770 // Compute (l.adj | r.adj) & 1 and test it against zero.
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,
775 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
778 // Tie together all our conditions.
779 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
780 Result = Builder.CreateBinOp(And, PtrEq, Result,
781 Inequality ? "memptr.ne" : "memptr.eq");
786 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
788 const MemberPointerType *MPT) {
789 CGBuilderTy &Builder = CGF.Builder;
791 /// For member data pointers, this is just a check against -1.
792 if (MPT->isMemberDataPointer()) {
793 assert(MemPtr->getType() == CGM.PtrDiffTy);
794 llvm::Value *NegativeOne =
795 llvm::Constant::getAllOnesValue(MemPtr->getType());
796 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
799 // In Itanium, a member function pointer is not null if 'ptr' is not null.
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");
805 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
806 // (the virtual bit) is set.
807 if (UseARMMethodPtrABI) {
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,
813 Result = Builder.CreateOr(Result, IsVirtual);
819 bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
820 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
824 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
825 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
827 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
828 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
834 /// The Itanium ABI requires non-zero initialization only for data
835 /// member pointers, for which '0' is a valid offset.
836 bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
837 return MPT->getPointeeType()->isFunctionType();
840 /// The Itanium ABI always places an offset to the complete object
841 /// at entry -2 in the vtable.
842 llvm::Value *ItaniumCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
845 // Grab the vtable pointer as an intptr_t*.
846 llvm::Value *vtable = CGF.GetVTablePtr(ptr, CGF.IntPtrTy->getPointerTo());
848 // Track back to entry -2 and pull out the offset there.
849 llvm::Value *offsetPtr =
850 CGF.Builder.CreateConstInBoundsGEP1_64(vtable, -2, "complete-offset.ptr");
851 llvm::LoadInst *offset = CGF.Builder.CreateLoad(offsetPtr);
852 offset->setAlignment(CGF.PointerAlignInBytes);
855 ptr = CGF.Builder.CreateBitCast(ptr, CGF.Int8PtrTy);
856 return CGF.Builder.CreateInBoundsGEP(ptr, offset);
859 static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
860 // void *__dynamic_cast(const void *sub,
861 // const abi::__class_type_info *src,
862 // const abi::__class_type_info *dst,
863 // std::ptrdiff_t src2dst_offset);
865 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
866 llvm::Type *PtrDiffTy =
867 CGF.ConvertType(CGF.getContext().getPointerDiffType());
869 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
871 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
873 // Mark the function as nounwind readonly.
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);
879 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
882 static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
883 // void __cxa_bad_cast();
884 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
885 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
888 /// \brief Compute the src2dst_offset hint as described in the
889 /// Itanium C++ ABI [2.9.7]
890 static CharUnits computeOffsetHint(ASTContext &Context,
891 const CXXRecordDecl *Src,
892 const CXXRecordDecl *Dst) {
893 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
894 /*DetectVirtual=*/false);
896 // If Dst is not derived from Src we can skip the whole computation below and
897 // return that Src is not a public base of Dst. Record all inheritance paths.
898 if (!Dst->isDerivedFrom(Src, Paths))
899 return CharUnits::fromQuantity(-2ULL);
901 unsigned NumPublicPaths = 0;
904 // Now walk all possible inheritance paths.
905 for (CXXBasePaths::paths_iterator I = Paths.begin(), E = Paths.end(); I != E;
907 if (I->Access != AS_public) // Ignore non-public inheritance.
912 for (CXXBasePath::iterator J = I->begin(), JE = I->end(); J != JE; ++J) {
913 // If the path contains a virtual base class we can't give any hint.
915 if (J->Base->isVirtual())
916 return CharUnits::fromQuantity(-1ULL);
918 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
921 // Accumulate the base class offsets.
922 const ASTRecordLayout &L = Context.getASTRecordLayout(J->Class);
923 Offset += L.getBaseClassOffset(J->Base->getType()->getAsCXXRecordDecl());
927 // -2: Src is not a public base of Dst.
928 if (NumPublicPaths == 0)
929 return CharUnits::fromQuantity(-2ULL);
931 // -3: Src is a multiple public base type but never a virtual base type.
932 if (NumPublicPaths > 1)
933 return CharUnits::fromQuantity(-3ULL);
935 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
936 // Return the offset of Src from the origin of Dst.
940 static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
941 // void __cxa_bad_typeid();
942 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
944 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
947 bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
948 QualType SrcRecordTy) {
952 void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
953 llvm::Value *Fn = getBadTypeidFn(CGF);
954 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
955 CGF.Builder.CreateUnreachable();
958 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
959 QualType SrcRecordTy,
960 llvm::Value *ThisPtr,
961 llvm::Type *StdTypeInfoPtrTy) {
963 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo());
965 // Load the type info.
966 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
967 return CGF.Builder.CreateLoad(Value);
970 bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
971 QualType SrcRecordTy) {
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 =
979 CGF.ConvertType(CGF.getContext().getPointerDiffType());
980 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
982 llvm::Value *SrcRTTI =
983 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
984 llvm::Value *DestRTTI =
985 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
987 // Compute the offset hint.
988 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
989 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
990 llvm::Value *OffsetHint = llvm::ConstantInt::get(
992 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
994 // Emit the call to __dynamic_cast.
995 Value = CGF.EmitCastToVoidPtr(Value);
997 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
998 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
999 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1001 /// C++ [expr.dynamic.cast]p9:
1002 /// A failed cast to reference type throws std::bad_cast
1003 if (DestTy->isReferenceType()) {
1004 llvm::BasicBlock *BadCastBlock =
1005 CGF.createBasicBlock("dynamic_cast.bad_cast");
1007 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1008 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1010 CGF.EmitBlock(BadCastBlock);
1011 EmitBadCastCall(CGF);
1017 llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1019 QualType SrcRecordTy,
1021 llvm::Type *PtrDiffLTy =
1022 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1023 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1025 // Get the vtable pointer.
1026 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1028 // Get the offset-to-top from the vtable.
1029 llvm::Value *OffsetToTop =
1030 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1031 OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1033 // Finally, add the offset to the pointer.
1034 Value = CGF.EmitCastToVoidPtr(Value);
1035 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1037 return CGF.Builder.CreateBitCast(Value, DestLTy);
1040 bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1041 llvm::Value *Fn = getBadCastFn(CGF);
1042 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1043 CGF.Builder.CreateUnreachable();
1048 ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1050 const CXXRecordDecl *ClassDecl,
1051 const CXXRecordDecl *BaseClassDecl) {
1052 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy);
1053 CharUnits VBaseOffsetOffset =
1054 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1057 llvm::Value *VBaseOffsetPtr =
1058 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1059 "vbase.offset.ptr");
1060 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1061 CGM.PtrDiffTy->getPointerTo());
1063 llvm::Value *VBaseOffset =
1064 CGF.Builder.CreateLoad(VBaseOffsetPtr, "vbase.offset");
1069 /// The generic ABI passes 'this', plus a VTT if it's initializing a
1072 ItaniumCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
1073 CXXCtorType Type, CanQualType &ResTy,
1074 SmallVectorImpl<CanQualType> &ArgTys) {
1075 ASTContext &Context = getContext();
1077 // All parameters are already in place except VTT, which goes after 'this'.
1078 // These are Clang types, so we don't need to worry about sret yet.
1080 // Check if we need to add a VTT parameter (which has type void **).
1081 if (Type == Ctor_Base && Ctor->getParent()->getNumVBases() != 0)
1082 ArgTys.insert(ArgTys.begin() + 1,
1083 Context.getPointerType(Context.VoidPtrTy));
1086 void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1087 // Just make sure we're in sync with TargetCXXABI.
1088 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1090 // The constructor used for constructing this as a base class;
1091 // ignores virtual bases.
1092 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1094 // The constructor used for constructing this as a complete class;
1095 // constucts the virtual bases, then calls the base constructor.
1096 if (!D->getParent()->isAbstract()) {
1097 // We don't need to emit the complete ctor if the class is abstract.
1098 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1102 /// The generic ABI passes 'this', plus a VTT if it's destroying a
1104 void ItaniumCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
1107 SmallVectorImpl<CanQualType> &ArgTys) {
1108 ASTContext &Context = getContext();
1110 // 'this' parameter is already there, as well as 'this' return if
1111 // HasThisReturn(GlobalDecl(Dtor, Type)) is true
1113 // Check if we need to add a VTT parameter (which has type void **).
1114 if (Type == Dtor_Base && Dtor->getParent()->getNumVBases() != 0)
1115 ArgTys.push_back(Context.getPointerType(Context.VoidPtrTy));
1118 void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1119 // The destructor used for destructing this as a base class; ignores
1121 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1123 // The destructor used for destructing this as a most-derived class;
1124 // call the base destructor and then destructs any virtual bases.
1125 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1127 // The destructor in a virtual table is always a 'deleting'
1128 // destructor, which calls the complete destructor and then uses the
1129 // appropriate operator delete.
1131 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
1134 void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1136 FunctionArgList &Params) {
1137 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1138 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
1140 // Check if we need a VTT parameter as well.
1141 if (NeedsVTTParameter(CGF.CurGD)) {
1142 ASTContext &Context = getContext();
1144 // FIXME: avoid the fake decl
1145 QualType T = Context.getPointerType(Context.VoidPtrTy);
1146 ImplicitParamDecl *VTTDecl
1147 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
1148 &Context.Idents.get("vtt"), T);
1149 Params.insert(Params.begin() + 1, VTTDecl);
1150 getStructorImplicitParamDecl(CGF) = VTTDecl;
1154 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1155 /// Initialize the 'this' slot.
1158 /// Initialize the 'vtt' slot if needed.
1159 if (getStructorImplicitParamDecl(CGF)) {
1160 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1161 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
1164 /// If this is a function that the ABI specifies returns 'this', initialize
1165 /// the return slot to 'this' at the start of the function.
1167 /// Unlike the setting of return types, this is done within the ABI
1168 /// implementation instead of by clients of CGCXXABI because:
1169 /// 1) getThisValue is currently protected
1170 /// 2) in theory, an ABI could implement 'this' returns some other way;
1171 /// HasThisReturn only specifies a contract, not the implementation
1172 if (HasThisReturn(CGF.CurGD))
1173 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1176 unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1177 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1178 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1179 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1182 // Insert the implicit 'vtt' argument as the second argument.
1184 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1185 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1186 Args.insert(Args.begin() + 1,
1187 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1188 return 1; // Added one arg.
1191 void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1192 const CXXDestructorDecl *DD,
1193 CXXDtorType Type, bool ForVirtualBase,
1194 bool Delegating, llvm::Value *This) {
1195 GlobalDecl GD(DD, Type);
1196 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1197 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1199 llvm::Value *Callee = nullptr;
1200 if (getContext().getLangOpts().AppleKext)
1201 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1204 Callee = CGM.GetAddrOfCXXDestructor(DD, Type);
1206 // FIXME: Provide a source location here.
1207 CGF.EmitCXXMemberCall(DD, SourceLocation(), Callee, ReturnValueSlot(), This,
1208 VTT, VTTTy, nullptr, nullptr);
1211 void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1212 const CXXRecordDecl *RD) {
1213 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1214 if (VTable->hasInitializer())
1217 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1218 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1219 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1220 llvm::Constant *RTTI =
1221 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
1223 // Create and set the initializer.
1224 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1225 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
1226 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
1227 VTable->setInitializer(Init);
1229 // Set the correct linkage.
1230 VTable->setLinkage(Linkage);
1232 // Set the right visibility.
1233 CGM.setGlobalVisibility(VTable, RD);
1235 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1236 // we will emit the typeinfo for the fundamental types. This is the
1237 // same behaviour as GCC.
1238 const DeclContext *DC = RD->getDeclContext();
1239 if (RD->getIdentifier() &&
1240 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1241 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1242 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1243 DC->getParent()->isTranslationUnit())
1244 EmitFundamentalRTTIDescriptors();
1247 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1248 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1249 const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) {
1250 bool NeedsVTTParam = CGM.getCXXABI().NeedsVTTParameter(CGF.CurGD);
1251 NeedsVirtualOffset = (NeedsVTTParam && NearestVBase);
1253 llvm::Value *VTableAddressPoint;
1254 if (NeedsVTTParam && (Base.getBase()->getNumVBases() || NearestVBase)) {
1255 // Get the secondary vpointer index.
1256 uint64_t VirtualPointerIndex =
1257 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1260 llvm::Value *VTT = CGF.LoadCXXVTT();
1261 if (VirtualPointerIndex)
1262 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1264 // And load the address point from the VTT.
1265 VTableAddressPoint = CGF.Builder.CreateLoad(VTT);
1267 llvm::Constant *VTable =
1268 CGM.getCXXABI().getAddrOfVTable(VTableClass, CharUnits());
1269 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1270 .getVTableLayout(VTableClass)
1271 .getAddressPoint(Base);
1272 VTableAddressPoint =
1273 CGF.Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint);
1276 return VTableAddressPoint;
1279 llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1280 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1281 llvm::Constant *VTable = getAddrOfVTable(VTableClass, CharUnits());
1283 // Find the appropriate vtable within the vtable group.
1284 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1285 .getVTableLayout(VTableClass)
1286 .getAddressPoint(Base);
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,
1296 CharUnits VPtrOffset) {
1297 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1299 llvm::GlobalVariable *&VTable = VTables[RD];
1303 // Queue up this v-table for possible deferred emission.
1304 CGM.addDeferredVTable(RD);
1306 SmallString<256> OutName;
1307 llvm::raw_svector_ostream Out(OutName);
1308 getMangleContext().mangleCXXVTable(RD, Out);
1310 StringRef Name = OutName.str();
1312 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1313 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1314 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1316 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1317 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1318 VTable->setUnnamedAddr(true);
1320 if (RD->hasAttr<DLLImportAttr>())
1321 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1322 else if (RD->hasAttr<DLLExportAttr>())
1323 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1328 llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1332 GD = GD.getCanonicalDecl();
1333 Ty = Ty->getPointerTo()->getPointerTo();
1334 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
1336 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
1337 llvm::Value *VFuncPtr =
1338 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
1339 return CGF.Builder.CreateLoad(VFuncPtr);
1342 void ItaniumCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
1343 const CXXDestructorDecl *Dtor,
1344 CXXDtorType DtorType,
1345 SourceLocation CallLoc,
1346 llvm::Value *This) {
1347 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1349 const CGFunctionInfo *FInfo
1350 = &CGM.getTypes().arrangeCXXDestructor(Dtor, DtorType);
1351 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1352 llvm::Value *Callee =
1353 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty);
1355 CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValueSlot(), This,
1356 /*ImplicitParam=*/nullptr, QualType(), nullptr,
1360 void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
1361 CodeGenVTables &VTables = CGM.getVTables();
1362 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
1363 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
1366 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
1368 int64_t NonVirtualAdjustment,
1369 int64_t VirtualAdjustment,
1370 bool IsReturnAdjustment) {
1371 if (!NonVirtualAdjustment && !VirtualAdjustment)
1374 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1375 llvm::Value *V = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy);
1377 if (NonVirtualAdjustment && !IsReturnAdjustment) {
1378 // Perform the non-virtual adjustment for a base-to-derived cast.
1379 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1382 if (VirtualAdjustment) {
1383 llvm::Type *PtrDiffTy =
1384 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1386 // Perform the virtual adjustment.
1387 llvm::Value *VTablePtrPtr =
1388 CGF.Builder.CreateBitCast(V, Int8PtrTy->getPointerTo());
1390 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1392 llvm::Value *OffsetPtr =
1393 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1395 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1397 // Load the adjustment offset from the vtable.
1398 llvm::Value *Offset = CGF.Builder.CreateLoad(OffsetPtr);
1400 // Adjust our pointer.
1401 V = CGF.Builder.CreateInBoundsGEP(V, Offset);
1404 if (NonVirtualAdjustment && IsReturnAdjustment) {
1405 // Perform the non-virtual adjustment for a derived-to-base cast.
1406 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1409 // Cast back to the original type.
1410 return CGF.Builder.CreateBitCast(V, Ptr->getType());
1413 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1415 const ThisAdjustment &TA) {
1416 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1417 TA.Virtual.Itanium.VCallOffsetOffset,
1418 /*IsReturnAdjustment=*/false);
1422 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1423 const ReturnAdjustment &RA) {
1424 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1425 RA.Virtual.Itanium.VBaseOffsetOffset,
1426 /*IsReturnAdjustment=*/true);
1429 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1430 RValue RV, QualType ResultType) {
1431 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1432 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1434 // Destructor thunks in the ARM ABI have indeterminate results.
1436 cast<llvm::PointerType>(CGF.ReturnValue->getType())->getElementType();
1437 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1438 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1441 /************************** Array allocation cookies **************************/
1443 CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1444 // The array cookie is a size_t; pad that up to the element alignment.
1445 // The cookie is actually right-justified in that space.
1446 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1447 CGM.getContext().getTypeAlignInChars(elementType));
1450 llvm::Value *ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1451 llvm::Value *NewPtr,
1452 llvm::Value *NumElements,
1453 const CXXNewExpr *expr,
1454 QualType ElementType) {
1455 assert(requiresArrayCookie(expr));
1457 unsigned AS = NewPtr->getType()->getPointerAddressSpace();
1459 ASTContext &Ctx = getContext();
1460 QualType SizeTy = Ctx.getSizeType();
1461 CharUnits SizeSize = Ctx.getTypeSizeInChars(SizeTy);
1463 // The size of the cookie.
1464 CharUnits CookieSize =
1465 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
1466 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
1468 // Compute an offset to the cookie.
1469 llvm::Value *CookiePtr = NewPtr;
1470 CharUnits CookieOffset = CookieSize - SizeSize;
1471 if (!CookieOffset.isZero())
1472 CookiePtr = CGF.Builder.CreateConstInBoundsGEP1_64(CookiePtr,
1473 CookieOffset.getQuantity());
1475 // Write the number of elements into the appropriate slot.
1476 llvm::Value *NumElementsPtr
1477 = CGF.Builder.CreateBitCast(CookiePtr,
1478 CGF.ConvertType(SizeTy)->getPointerTo(AS));
1479 CGF.Builder.CreateStore(NumElements, NumElementsPtr);
1481 // Finally, compute a pointer to the actual data buffer by skipping
1482 // over the cookie completely.
1483 return CGF.Builder.CreateConstInBoundsGEP1_64(NewPtr,
1484 CookieSize.getQuantity());
1487 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1488 llvm::Value *allocPtr,
1489 CharUnits cookieSize) {
1490 // The element size is right-justified in the cookie.
1491 llvm::Value *numElementsPtr = allocPtr;
1492 CharUnits numElementsOffset =
1493 cookieSize - CharUnits::fromQuantity(CGF.SizeSizeInBytes);
1494 if (!numElementsOffset.isZero())
1496 CGF.Builder.CreateConstInBoundsGEP1_64(numElementsPtr,
1497 numElementsOffset.getQuantity());
1499 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
1501 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1502 return CGF.Builder.CreateLoad(numElementsPtr);
1505 CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1506 // ARM says that the cookie is always:
1507 // struct array_cookie {
1508 // std::size_t element_size; // element_size != 0
1509 // std::size_t element_count;
1511 // But the base ABI doesn't give anything an alignment greater than
1512 // 8, so we can dismiss this as typical ABI-author blindness to
1513 // actual language complexity and round up to the element alignment.
1514 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1515 CGM.getContext().getTypeAlignInChars(elementType));
1518 llvm::Value *ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1519 llvm::Value *newPtr,
1520 llvm::Value *numElements,
1521 const CXXNewExpr *expr,
1522 QualType elementType) {
1523 assert(requiresArrayCookie(expr));
1525 // NewPtr is a char*, but we generalize to arbitrary addrspaces.
1526 unsigned AS = newPtr->getType()->getPointerAddressSpace();
1528 // The cookie is always at the start of the buffer.
1529 llvm::Value *cookie = newPtr;
1531 // The first element is the element size.
1532 cookie = CGF.Builder.CreateBitCast(cookie, CGF.SizeTy->getPointerTo(AS));
1533 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1534 getContext().getTypeSizeInChars(elementType).getQuantity());
1535 CGF.Builder.CreateStore(elementSize, cookie);
1537 // The second element is the element count.
1538 cookie = CGF.Builder.CreateConstInBoundsGEP1_32(cookie, 1);
1539 CGF.Builder.CreateStore(numElements, cookie);
1541 // Finally, compute a pointer to the actual data buffer by skipping
1542 // over the cookie completely.
1543 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
1544 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
1545 cookieSize.getQuantity());
1548 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1549 llvm::Value *allocPtr,
1550 CharUnits cookieSize) {
1551 // The number of elements is at offset sizeof(size_t) relative to
1552 // the allocated pointer.
1553 llvm::Value *numElementsPtr
1554 = CGF.Builder.CreateConstInBoundsGEP1_64(allocPtr, CGF.SizeSizeInBytes);
1556 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
1558 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1559 return CGF.Builder.CreateLoad(numElementsPtr);
1562 /*********************** Static local initialization **************************/
1564 static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
1565 llvm::PointerType *GuardPtrTy) {
1566 // int __cxa_guard_acquire(__guard *guard_object);
1567 llvm::FunctionType *FTy =
1568 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
1569 GuardPtrTy, /*isVarArg=*/false);
1570 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
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) {
1578 // void __cxa_guard_release(__guard *guard_object);
1579 llvm::FunctionType *FTy =
1580 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1581 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
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) {
1589 // void __cxa_guard_abort(__guard *guard_object);
1590 llvm::FunctionType *FTy =
1591 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1592 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
1593 llvm::AttributeSet::get(CGM.getLLVMContext(),
1594 llvm::AttributeSet::FunctionIndex,
1595 llvm::Attribute::NoUnwind));
1599 struct CallGuardAbort : EHScopeStack::Cleanup {
1600 llvm::GlobalVariable *Guard;
1601 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
1603 void Emit(CodeGenFunction &CGF, Flags flags) override {
1604 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1610 /// The ARM code here follows the Itanium code closely enough that we
1611 /// just special-case it at particular places.
1612 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1614 llvm::GlobalVariable *var,
1615 bool shouldPerformInit) {
1616 CGBuilderTy &Builder = CGF.Builder;
1618 // We only need to use thread-safe statics for local non-TLS variables;
1619 // global initialization is always single-threaded.
1620 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1621 D.isLocalVarDecl() && !D.getTLSKind();
1623 // If we have a global variable with internal linkage and thread-safe statics
1624 // are disabled, we can just let the guard variable be of type i8.
1625 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1627 llvm::IntegerType *guardTy;
1628 if (useInt8GuardVariable) {
1629 guardTy = CGF.Int8Ty;
1631 // Guard variables are 64 bits in the generic ABI and size width on ARM
1632 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
1633 guardTy = (UseARMGuardVarABI ? CGF.SizeTy : CGF.Int64Ty);
1635 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
1637 // Create the guard variable if we don't already have it (as we
1638 // might if we're double-emitting this function body).
1639 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1641 // Mangle the name for the guard.
1642 SmallString<256> guardName;
1644 llvm::raw_svector_ostream out(guardName);
1645 getMangleContext().mangleStaticGuardVariable(&D, out);
1649 // Create the guard variable with a zero-initializer.
1650 // Just absorb linkage and visibility from the guarded variable.
1651 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1652 false, var->getLinkage(),
1653 llvm::ConstantInt::get(guardTy, 0),
1655 guard->setVisibility(var->getVisibility());
1656 // If the variable is thread-local, so is its guard variable.
1657 guard->setThreadLocalMode(var->getThreadLocalMode());
1659 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1662 // Test whether the variable has completed initialization.
1664 // Itanium C++ ABI 3.3.2:
1665 // The following is pseudo-code showing how these functions can be used:
1666 // if (obj_guard.first_byte == 0) {
1667 // if ( __cxa_guard_acquire (&obj_guard) ) {
1669 // ... initialize the object ...;
1671 // __cxa_guard_abort (&obj_guard);
1674 // ... queue object destructor with __cxa_atexit() ...;
1675 // __cxa_guard_release (&obj_guard);
1679 // Load the first byte of the guard variable.
1680 llvm::LoadInst *LI =
1681 Builder.CreateLoad(Builder.CreateBitCast(guard, CGM.Int8PtrTy));
1682 LI->setAlignment(1);
1685 // An implementation supporting thread-safety on multiprocessor
1686 // systems must also guarantee that references to the initialized
1687 // object do not occur before the load of the initialization flag.
1689 // In LLVM, we do this by marking the load Acquire.
1691 LI->setAtomic(llvm::Acquire);
1693 // For ARM, we should only check the first bit, rather than the entire byte:
1695 // ARM C++ ABI 3.2.3.1:
1696 // To support the potential use of initialization guard variables
1697 // as semaphores that are the target of ARM SWP and LDREX/STREX
1698 // synchronizing instructions we define a static initialization
1699 // guard variable to be a 4-byte aligned, 4-byte word with the
1700 // following inline access protocol.
1701 // #define INITIALIZED 1
1702 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
1703 // if (__cxa_guard_acquire(&obj_guard))
1707 // and similarly for ARM64:
1709 // ARM64 C++ ABI 3.2.2:
1710 // This ABI instead only specifies the value bit 0 of the static guard
1711 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
1712 // variable is not initialized and 1 when it is.
1714 (UseARMGuardVarABI && !useInt8GuardVariable)
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");
1722 // Check if the first byte of the guard variable is zero.
1723 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
1725 CGF.EmitBlock(InitCheckBlock);
1727 // Variables used when coping with thread-safe statics and exceptions.
1729 // Call __cxa_guard_acquire.
1731 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
1733 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1735 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
1736 InitBlock, EndBlock);
1738 // Call __cxa_guard_abort along the exceptional edge.
1739 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
1741 CGF.EmitBlock(InitBlock);
1744 // Emit the initializer and add a global destructor if appropriate.
1745 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
1748 // Pop the guard-abort cleanup if we pushed one.
1749 CGF.PopCleanupBlock();
1751 // Call __cxa_guard_release. This cannot throw.
1752 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), guard);
1754 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guard);
1757 CGF.EmitBlock(EndBlock);
1760 /// Register a global destructor using __cxa_atexit.
1761 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
1762 llvm::Constant *dtor,
1763 llvm::Constant *addr,
1765 const char *Name = "__cxa_atexit";
1767 const llvm::Triple &T = CGF.getTarget().getTriple();
1768 Name = T.isMacOSX() ? "_tlv_atexit" : "__cxa_thread_atexit";
1771 // We're assuming that the destructor function is something we can
1772 // reasonably call with the default CC. Go ahead and cast it to the
1774 llvm::Type *dtorTy =
1775 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
1777 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
1778 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
1779 llvm::FunctionType *atexitTy =
1780 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
1782 // Fetch the actual function.
1783 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
1784 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
1785 fn->setDoesNotThrow();
1787 // Create a variable that binds the atexit to this shared object.
1788 llvm::Constant *handle =
1789 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
1791 llvm::Value *args[] = {
1792 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
1793 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
1796 CGF.EmitNounwindRuntimeCall(atexit, args);
1799 /// Register a global destructor as best as we know how.
1800 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
1802 llvm::Constant *dtor,
1803 llvm::Constant *addr) {
1804 // Use __cxa_atexit if available.
1805 if (CGM.getCodeGenOpts().CXAAtExit)
1806 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
1809 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
1811 // In Apple kexts, we want to add a global destructor entry.
1812 // FIXME: shouldn't this be guarded by some variable?
1813 if (CGM.getLangOpts().AppleKext) {
1814 // Generate a global destructor entry.
1815 return CGM.AddCXXDtorEntry(dtor, addr);
1818 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
1821 static bool isThreadWrapperReplaceable(const VarDecl *VD,
1822 CodeGen::CodeGenModule &CGM) {
1823 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
1824 // OS X prefers to have references to thread local variables to go through
1825 // the thread wrapper instead of directly referencing the backing variable.
1826 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
1827 CGM.getTarget().getTriple().isMacOSX();
1830 /// Get the appropriate linkage for the wrapper function. This is essentially
1831 /// the weak form of the variable's linkage; every translation unit which needs
1832 /// the wrapper emits a copy, and we want the linker to merge them.
1833 static llvm::GlobalValue::LinkageTypes
1834 getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
1835 llvm::GlobalValue::LinkageTypes VarLinkage =
1836 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
1838 // For internal linkage variables, we don't need an external or weak wrapper.
1839 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
1842 // If the thread wrapper is replaceable, give it appropriate linkage.
1843 if (isThreadWrapperReplaceable(VD, CGM)) {
1844 if (llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) ||
1845 llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
1846 return llvm::GlobalVariable::WeakAnyLinkage;
1849 return llvm::GlobalValue::WeakODRLinkage;
1853 ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
1854 llvm::GlobalVariable *Var) {
1855 // Mangle the name for the thread_local wrapper function.
1856 SmallString<256> WrapperName;
1858 llvm::raw_svector_ostream Out(WrapperName);
1859 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
1863 if (llvm::Value *V = Var->getParent()->getNamedValue(WrapperName))
1864 return cast<llvm::Function>(V);
1866 llvm::Type *RetTy = Var->getType();
1867 if (VD->getType()->isReferenceType())
1868 RetTy = RetTy->getPointerElementType();
1870 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
1871 llvm::Function *Wrapper =
1872 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
1873 WrapperName.str(), &CGM.getModule());
1874 // Always resolve references to the wrapper at link time.
1875 if (!Wrapper->hasLocalLinkage() && !isThreadWrapperReplaceable(VD, CGM))
1876 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
1880 void ItaniumCXXABI::EmitThreadLocalInitFuncs(
1881 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
1882 llvm::Function *InitFunc) {
1883 for (unsigned I = 0, N = Decls.size(); I != N; ++I) {
1884 const VarDecl *VD = Decls[I].first;
1885 llvm::GlobalVariable *Var = Decls[I].second;
1887 // Some targets require that all access to thread local variables go through
1888 // the thread wrapper. This means that we cannot attempt to create a thread
1889 // wrapper or a thread helper.
1890 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
1893 // Mangle the name for the thread_local initialization function.
1894 SmallString<256> InitFnName;
1896 llvm::raw_svector_ostream Out(InitFnName);
1897 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
1901 // If we have a definition for the variable, emit the initialization
1902 // function as an alias to the global Init function (if any). Otherwise,
1903 // produce a declaration of the initialization function.
1904 llvm::GlobalValue *Init = nullptr;
1905 bool InitIsInitFunc = false;
1906 if (VD->hasDefinition()) {
1907 InitIsInitFunc = true;
1909 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
1912 // Emit a weak global function referring to the initialization function.
1913 // This function will not exist if the TU defining the thread_local
1914 // variable in question does not need any dynamic initialization for
1915 // its thread_local variables.
1916 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
1917 Init = llvm::Function::Create(
1918 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
1923 Init->setVisibility(Var->getVisibility());
1925 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
1926 llvm::LLVMContext &Context = CGM.getModule().getContext();
1927 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
1928 CGBuilderTy Builder(Entry);
1929 if (InitIsInitFunc) {
1931 Builder.CreateCall(Init);
1933 // Don't know whether we have an init function. Call it if it exists.
1934 llvm::Value *Have = Builder.CreateIsNotNull(Init);
1935 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1936 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1937 Builder.CreateCondBr(Have, InitBB, ExitBB);
1939 Builder.SetInsertPoint(InitBB);
1940 Builder.CreateCall(Init);
1941 Builder.CreateBr(ExitBB);
1943 Builder.SetInsertPoint(ExitBB);
1946 // For a reference, the result of the wrapper function is a pointer to
1947 // the referenced object.
1948 llvm::Value *Val = Var;
1949 if (VD->getType()->isReferenceType()) {
1950 llvm::LoadInst *LI = Builder.CreateLoad(Val);
1951 LI->setAlignment(CGM.getContext().getDeclAlign(VD).getQuantity());
1955 Builder.CreateRet(Val);
1959 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
1961 QualType LValType) {
1962 QualType T = VD->getType();
1963 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
1964 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
1965 llvm::Function *Wrapper =
1966 getOrCreateThreadLocalWrapper(VD, cast<llvm::GlobalVariable>(Val));
1968 Val = CGF.Builder.CreateCall(Wrapper);
1971 if (VD->getType()->isReferenceType())
1972 LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType);
1974 LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD));
1975 // FIXME: need setObjCGCLValueClass?
1979 /// Return whether the given global decl needs a VTT parameter, which it does
1980 /// if it's a base constructor or destructor with virtual bases.
1981 bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
1982 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
1984 // We don't have any virtual bases, just return early.
1985 if (!MD->getParent()->getNumVBases())
1988 // Check if we have a base constructor.
1989 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
1992 // Check if we have a base destructor.
1993 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2000 class ItaniumRTTIBuilder {
2001 CodeGenModule &CGM; // Per-module state.
2002 llvm::LLVMContext &VMContext;
2003 const ItaniumCXXABI &CXXABI; // Per-module state.
2005 /// Fields - The fields of the RTTI descriptor currently being built.
2006 SmallVector<llvm::Constant *, 16> Fields;
2008 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2009 llvm::GlobalVariable *
2010 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2012 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2013 /// descriptor of the given type.
2014 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2016 /// BuildVTablePointer - Build the vtable pointer for the given type.
2017 void BuildVTablePointer(const Type *Ty);
2019 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2020 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2021 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2023 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2024 /// classes with bases that do not satisfy the abi::__si_class_type_info
2025 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2026 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2028 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2029 /// for pointer types.
2030 void BuildPointerTypeInfo(QualType PointeeTy);
2032 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2033 /// type_info for an object type.
2034 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2036 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2037 /// struct, used for member pointer types.
2038 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2041 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2042 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2044 // Pointer type info flags.
2046 /// PTI_Const - Type has const qualifier.
2049 /// PTI_Volatile - Type has volatile qualifier.
2052 /// PTI_Restrict - Type has restrict qualifier.
2055 /// PTI_Incomplete - Type is incomplete.
2056 PTI_Incomplete = 0x8,
2058 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2059 /// (in pointer to member).
2060 PTI_ContainingClassIncomplete = 0x10
2063 // VMI type info flags.
2065 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2066 VMI_NonDiamondRepeat = 0x1,
2068 /// VMI_DiamondShaped - Class is diamond shaped.
2069 VMI_DiamondShaped = 0x2
2072 // Base class type info flags.
2074 /// BCTI_Virtual - Base class is virtual.
2077 /// BCTI_Public - Base class is public.
2081 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2083 /// \param Force - true to force the creation of this RTTI value
2084 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2088 llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2089 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
2090 SmallString<256> OutName;
2091 llvm::raw_svector_ostream Out(OutName);
2092 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
2094 StringRef Name = OutName.str();
2096 // We know that the mangled name of the type starts at index 4 of the
2097 // mangled name of the typename, so we can just index into it in order to
2098 // get the mangled name of the type.
2099 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2102 llvm::GlobalVariable *GV =
2103 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2105 GV->setInitializer(Init);
2111 ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2112 // Mangle the RTTI name.
2113 SmallString<256> OutName;
2114 llvm::raw_svector_ostream Out(OutName);
2115 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2117 StringRef Name = OutName.str();
2119 // Look for an existing global.
2120 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2123 // Create a new global variable.
2124 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2126 llvm::GlobalValue::ExternalLinkage, nullptr,
2130 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2133 /// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2134 /// info for that type is defined in the standard library.
2135 static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2136 // Itanium C++ ABI 2.9.2:
2137 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2138 // the run-time support library. Specifically, the run-time support
2139 // library should contain type_info objects for the types X, X* and
2140 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2141 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2142 // long, unsigned long, long long, unsigned long long, float, double,
2143 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2144 // half-precision floating point types.
2145 switch (Ty->getKind()) {
2146 case BuiltinType::Void:
2147 case BuiltinType::NullPtr:
2148 case BuiltinType::Bool:
2149 case BuiltinType::WChar_S:
2150 case BuiltinType::WChar_U:
2151 case BuiltinType::Char_U:
2152 case BuiltinType::Char_S:
2153 case BuiltinType::UChar:
2154 case BuiltinType::SChar:
2155 case BuiltinType::Short:
2156 case BuiltinType::UShort:
2157 case BuiltinType::Int:
2158 case BuiltinType::UInt:
2159 case BuiltinType::Long:
2160 case BuiltinType::ULong:
2161 case BuiltinType::LongLong:
2162 case BuiltinType::ULongLong:
2163 case BuiltinType::Half:
2164 case BuiltinType::Float:
2165 case BuiltinType::Double:
2166 case BuiltinType::LongDouble:
2167 case BuiltinType::Char16:
2168 case BuiltinType::Char32:
2169 case BuiltinType::Int128:
2170 case BuiltinType::UInt128:
2171 case BuiltinType::OCLImage1d:
2172 case BuiltinType::OCLImage1dArray:
2173 case BuiltinType::OCLImage1dBuffer:
2174 case BuiltinType::OCLImage2d:
2175 case BuiltinType::OCLImage2dArray:
2176 case BuiltinType::OCLImage3d:
2177 case BuiltinType::OCLSampler:
2178 case BuiltinType::OCLEvent:
2181 case BuiltinType::Dependent:
2182 #define BUILTIN_TYPE(Id, SingletonId)
2183 #define PLACEHOLDER_TYPE(Id, SingletonId) \
2184 case BuiltinType::Id:
2185 #include "clang/AST/BuiltinTypes.def"
2186 llvm_unreachable("asking for RRTI for a placeholder type!");
2188 case BuiltinType::ObjCId:
2189 case BuiltinType::ObjCClass:
2190 case BuiltinType::ObjCSel:
2191 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2194 llvm_unreachable("Invalid BuiltinType Kind!");
2197 static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2198 QualType PointeeTy = PointerTy->getPointeeType();
2199 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2203 // Check the qualifiers.
2204 Qualifiers Quals = PointeeTy.getQualifiers();
2205 Quals.removeConst();
2210 return TypeInfoIsInStandardLibrary(BuiltinTy);
2213 /// IsStandardLibraryRTTIDescriptor - Returns whether the type
2214 /// information for the given type exists in the standard library.
2215 static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2216 // Type info for builtin types is defined in the standard library.
2217 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2218 return TypeInfoIsInStandardLibrary(BuiltinTy);
2220 // Type info for some pointer types to builtin types is defined in the
2221 // standard library.
2222 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2223 return TypeInfoIsInStandardLibrary(PointerTy);
2228 /// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2229 /// the given type exists somewhere else, and that we should not emit the type
2230 /// information in this translation unit. Assumes that it is not a
2231 /// standard-library type.
2232 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2234 ASTContext &Context = CGM.getContext();
2236 // If RTTI is disabled, assume it might be disabled in the
2237 // translation unit that defines any potential key function, too.
2238 if (!Context.getLangOpts().RTTI) return false;
2240 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2241 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2242 if (!RD->hasDefinition())
2245 if (!RD->isDynamicClass())
2248 // FIXME: this may need to be reconsidered if the key function
2250 return CGM.getVTables().isVTableExternal(RD);
2256 /// IsIncompleteClassType - Returns whether the given record type is incomplete.
2257 static bool IsIncompleteClassType(const RecordType *RecordTy) {
2258 return !RecordTy->getDecl()->isCompleteDefinition();
2261 /// ContainsIncompleteClassType - Returns whether the given type contains an
2262 /// incomplete class type. This is true if
2264 /// * The given type is an incomplete class type.
2265 /// * The given type is a pointer type whose pointee type contains an
2266 /// incomplete class type.
2267 /// * The given type is a member pointer type whose class is an incomplete
2269 /// * The given type is a member pointer type whoise pointee type contains an
2270 /// incomplete class type.
2271 /// is an indirect or direct pointer to an incomplete class type.
2272 static bool ContainsIncompleteClassType(QualType Ty) {
2273 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2274 if (IsIncompleteClassType(RecordTy))
2278 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2279 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2281 if (const MemberPointerType *MemberPointerTy =
2282 dyn_cast<MemberPointerType>(Ty)) {
2283 // Check if the class type is incomplete.
2284 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2285 if (IsIncompleteClassType(ClassType))
2288 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2294 // CanUseSingleInheritance - Return whether the given record decl has a "single,
2295 // public, non-virtual base at offset zero (i.e. the derived class is dynamic
2296 // iff the base is)", according to Itanium C++ ABI, 2.95p6b.
2297 static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2298 // Check the number of bases.
2299 if (RD->getNumBases() != 1)
2303 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2305 // Check that the base is not virtual.
2306 if (Base->isVirtual())
2309 // Check that the base is public.
2310 if (Base->getAccessSpecifier() != AS_public)
2313 // Check that the class is dynamic iff the base is.
2314 const CXXRecordDecl *BaseDecl =
2315 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2316 if (!BaseDecl->isEmpty() &&
2317 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2323 void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2324 // abi::__class_type_info.
2325 static const char * const ClassTypeInfo =
2326 "_ZTVN10__cxxabiv117__class_type_infoE";
2327 // abi::__si_class_type_info.
2328 static const char * const SIClassTypeInfo =
2329 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2330 // abi::__vmi_class_type_info.
2331 static const char * const VMIClassTypeInfo =
2332 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2334 const char *VTableName = nullptr;
2336 switch (Ty->getTypeClass()) {
2337 #define TYPE(Class, Base)
2338 #define ABSTRACT_TYPE(Class, Base)
2339 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2340 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2341 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2342 #include "clang/AST/TypeNodes.def"
2343 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2345 case Type::LValueReference:
2346 case Type::RValueReference:
2347 llvm_unreachable("References shouldn't get here");
2350 llvm_unreachable("Undeduced auto type shouldn't get here");
2353 // GCC treats vector and complex types as fundamental types.
2355 case Type::ExtVector:
2358 // FIXME: GCC treats block pointers as fundamental types?!
2359 case Type::BlockPointer:
2360 // abi::__fundamental_type_info.
2361 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2364 case Type::ConstantArray:
2365 case Type::IncompleteArray:
2366 case Type::VariableArray:
2367 // abi::__array_type_info.
2368 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2371 case Type::FunctionNoProto:
2372 case Type::FunctionProto:
2373 // abi::__function_type_info.
2374 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2378 // abi::__enum_type_info.
2379 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2382 case Type::Record: {
2383 const CXXRecordDecl *RD =
2384 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2386 if (!RD->hasDefinition() || !RD->getNumBases()) {
2387 VTableName = ClassTypeInfo;
2388 } else if (CanUseSingleInheritance(RD)) {
2389 VTableName = SIClassTypeInfo;
2391 VTableName = VMIClassTypeInfo;
2397 case Type::ObjCObject:
2398 // Ignore protocol qualifiers.
2399 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2401 // Handle id and Class.
2402 if (isa<BuiltinType>(Ty)) {
2403 VTableName = ClassTypeInfo;
2407 assert(isa<ObjCInterfaceType>(Ty));
2410 case Type::ObjCInterface:
2411 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2412 VTableName = SIClassTypeInfo;
2414 VTableName = ClassTypeInfo;
2418 case Type::ObjCObjectPointer:
2420 // abi::__pointer_type_info.
2421 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2424 case Type::MemberPointer:
2425 // abi::__pointer_to_member_type_info.
2426 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2430 llvm::Constant *VTable =
2431 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2433 llvm::Type *PtrDiffTy =
2434 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2436 // The vtable address point is 2.
2437 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
2438 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Two);
2439 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2441 Fields.push_back(VTable);
2444 /// \brief Return the linkage that the type info and type info name constants
2445 /// should have for the given type.
2446 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2448 // Itanium C++ ABI 2.9.5p7:
2449 // In addition, it and all of the intermediate abi::__pointer_type_info
2450 // structs in the chain down to the abi::__class_type_info for the
2451 // incomplete class type must be prevented from resolving to the
2452 // corresponding type_info structs for the complete class type, possibly
2453 // by making them local static objects. Finally, a dummy class RTTI is
2454 // generated for the incomplete type that will not resolve to the final
2455 // complete class RTTI (because the latter need not exist), possibly by
2456 // making it a local static object.
2457 if (ContainsIncompleteClassType(Ty))
2458 return llvm::GlobalValue::InternalLinkage;
2460 switch (Ty->getLinkage()) {
2462 case InternalLinkage:
2463 case UniqueExternalLinkage:
2464 return llvm::GlobalValue::InternalLinkage;
2466 case VisibleNoLinkage:
2467 case ExternalLinkage:
2468 if (!CGM.getLangOpts().RTTI) {
2469 // RTTI is not enabled, which means that this type info struct is going
2470 // to be used for exception handling. Give it linkonce_odr linkage.
2471 return llvm::GlobalValue::LinkOnceODRLinkage;
2474 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2475 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2476 if (RD->hasAttr<WeakAttr>())
2477 return llvm::GlobalValue::WeakODRLinkage;
2478 if (RD->isDynamicClass())
2479 return CGM.getVTableLinkage(RD);
2482 return llvm::GlobalValue::LinkOnceODRLinkage;
2485 llvm_unreachable("Invalid linkage!");
2488 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2489 // We want to operate on the canonical type.
2490 Ty = CGM.getContext().getCanonicalType(Ty);
2492 // Check if we've already emitted an RTTI descriptor for this type.
2493 SmallString<256> OutName;
2494 llvm::raw_svector_ostream Out(OutName);
2495 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2497 StringRef Name = OutName.str();
2499 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2500 if (OldGV && !OldGV->isDeclaration()) {
2501 assert(!OldGV->hasAvailableExternallyLinkage() &&
2502 "available_externally typeinfos not yet implemented");
2504 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2507 // Check if there is already an external RTTI descriptor for this type.
2508 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2509 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2510 return GetAddrOfExternalRTTIDescriptor(Ty);
2512 // Emit the standard library with external linkage.
2513 llvm::GlobalVariable::LinkageTypes Linkage;
2515 Linkage = llvm::GlobalValue::ExternalLinkage;
2517 Linkage = getTypeInfoLinkage(CGM, Ty);
2519 // Add the vtable pointer.
2520 BuildVTablePointer(cast<Type>(Ty));
2523 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2524 llvm::Constant *TypeNameField;
2526 // If we're supposed to demote the visibility, be sure to set a flag
2527 // to use a string comparison for type_info comparisons.
2528 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2529 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2530 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2531 // The flag is the sign bit, which on ARM64 is defined to be clear
2532 // for global pointers. This is very ARM64-specific.
2533 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2534 llvm::Constant *flag =
2535 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2536 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2538 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2540 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2542 Fields.push_back(TypeNameField);
2544 switch (Ty->getTypeClass()) {
2545 #define TYPE(Class, Base)
2546 #define ABSTRACT_TYPE(Class, Base)
2547 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2548 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2549 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2550 #include "clang/AST/TypeNodes.def"
2551 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2553 // GCC treats vector types as fundamental types.
2556 case Type::ExtVector:
2558 case Type::BlockPointer:
2559 // Itanium C++ ABI 2.9.5p4:
2560 // abi::__fundamental_type_info adds no data members to std::type_info.
2563 case Type::LValueReference:
2564 case Type::RValueReference:
2565 llvm_unreachable("References shouldn't get here");
2568 llvm_unreachable("Undeduced auto type shouldn't get here");
2570 case Type::ConstantArray:
2571 case Type::IncompleteArray:
2572 case Type::VariableArray:
2573 // Itanium C++ ABI 2.9.5p5:
2574 // abi::__array_type_info adds no data members to std::type_info.
2577 case Type::FunctionNoProto:
2578 case Type::FunctionProto:
2579 // Itanium C++ ABI 2.9.5p5:
2580 // abi::__function_type_info adds no data members to std::type_info.
2584 // Itanium C++ ABI 2.9.5p5:
2585 // abi::__enum_type_info adds no data members to std::type_info.
2588 case Type::Record: {
2589 const CXXRecordDecl *RD =
2590 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2591 if (!RD->hasDefinition() || !RD->getNumBases()) {
2592 // We don't need to emit any fields.
2596 if (CanUseSingleInheritance(RD))
2597 BuildSIClassTypeInfo(RD);
2599 BuildVMIClassTypeInfo(RD);
2604 case Type::ObjCObject:
2605 case Type::ObjCInterface:
2606 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
2609 case Type::ObjCObjectPointer:
2610 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
2614 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
2617 case Type::MemberPointer:
2618 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
2622 // No fields, at least for the moment.
2626 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2628 llvm::GlobalVariable *GV =
2629 new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
2630 /*Constant=*/true, Linkage, Init, Name);
2632 // If there's already an old global variable, replace it with the new one.
2634 GV->takeName(OldGV);
2635 llvm::Constant *NewPtr =
2636 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
2637 OldGV->replaceAllUsesWith(NewPtr);
2638 OldGV->eraseFromParent();
2641 // The Itanium ABI specifies that type_info objects must be globally
2642 // unique, with one exception: if the type is an incomplete class
2643 // type or a (possibly indirect) pointer to one. That exception
2644 // affects the general case of comparing type_info objects produced
2645 // by the typeid operator, which is why the comparison operators on
2646 // std::type_info generally use the type_info name pointers instead
2647 // of the object addresses. However, the language's built-in uses
2648 // of RTTI generally require class types to be complete, even when
2649 // manipulating pointers to those class types. This allows the
2650 // implementation of dynamic_cast to rely on address equality tests,
2651 // which is much faster.
2653 // All of this is to say that it's important that both the type_info
2654 // object and the type_info name be uniqued when weakly emitted.
2656 // Give the type_info object and name the formal visibility of the
2658 llvm::GlobalValue::VisibilityTypes llvmVisibility;
2659 if (llvm::GlobalValue::isLocalLinkage(Linkage))
2660 // If the linkage is local, only default visibility makes sense.
2661 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
2662 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
2663 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
2665 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
2666 TypeName->setVisibility(llvmVisibility);
2667 GV->setVisibility(llvmVisibility);
2669 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2672 /// ComputeQualifierFlags - Compute the pointer type info flags from the
2673 /// given qualifier.
2674 static unsigned ComputeQualifierFlags(Qualifiers Quals) {
2677 if (Quals.hasConst())
2678 Flags |= ItaniumRTTIBuilder::PTI_Const;
2679 if (Quals.hasVolatile())
2680 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
2681 if (Quals.hasRestrict())
2682 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
2687 /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
2688 /// for the given Objective-C object type.
2689 void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
2691 const Type *T = OT->getBaseType().getTypePtr();
2692 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
2694 // The builtin types are abi::__class_type_infos and don't require
2696 if (isa<BuiltinType>(T)) return;
2698 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
2699 ObjCInterfaceDecl *Super = Class->getSuperClass();
2701 // Root classes are also __class_type_info.
2704 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
2706 // Everything else is single inheritance.
2707 llvm::Constant *BaseTypeInfo =
2708 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
2709 Fields.push_back(BaseTypeInfo);
2712 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2713 /// inheritance, according to the Itanium C++ ABI, 2.95p6b.
2714 void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
2715 // Itanium C++ ABI 2.9.5p6b:
2716 // It adds to abi::__class_type_info a single member pointing to the
2717 // type_info structure for the base type,
2718 llvm::Constant *BaseTypeInfo =
2719 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
2720 Fields.push_back(BaseTypeInfo);
2724 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
2725 /// a class hierarchy.
2727 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
2728 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
2732 /// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
2733 /// abi::__vmi_class_type_info.
2735 static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
2740 const CXXRecordDecl *BaseDecl =
2741 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2743 if (Base->isVirtual()) {
2744 // Mark the virtual base as seen.
2745 if (!Bases.VirtualBases.insert(BaseDecl)) {
2746 // If this virtual base has been seen before, then the class is diamond
2748 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
2750 if (Bases.NonVirtualBases.count(BaseDecl))
2751 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2754 // Mark the non-virtual base as seen.
2755 if (!Bases.NonVirtualBases.insert(BaseDecl)) {
2756 // If this non-virtual base has been seen before, then the class has non-
2757 // diamond shaped repeated inheritance.
2758 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2760 if (Bases.VirtualBases.count(BaseDecl))
2761 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2766 for (const auto &I : BaseDecl->bases())
2767 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2772 static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
2777 for (const auto &I : RD->bases())
2778 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2783 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2784 /// classes with bases that do not satisfy the abi::__si_class_type_info
2785 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2786 void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
2787 llvm::Type *UnsignedIntLTy =
2788 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2790 // Itanium C++ ABI 2.9.5p6c:
2791 // __flags is a word with flags describing details about the class
2792 // structure, which may be referenced by using the __flags_masks
2793 // enumeration. These flags refer to both direct and indirect bases.
2794 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
2795 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2797 // Itanium C++ ABI 2.9.5p6c:
2798 // __base_count is a word with the number of direct proper base class
2799 // descriptions that follow.
2800 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
2802 if (!RD->getNumBases())
2805 llvm::Type *LongLTy =
2806 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
2808 // Now add the base class descriptions.
2810 // Itanium C++ ABI 2.9.5p6c:
2811 // __base_info[] is an array of base class descriptions -- one for every
2812 // direct proper base. Each description is of the type:
2814 // struct abi::__base_class_type_info {
2816 // const __class_type_info *__base_type;
2817 // long __offset_flags;
2819 // enum __offset_flags_masks {
2820 // __virtual_mask = 0x1,
2821 // __public_mask = 0x2,
2822 // __offset_shift = 8
2825 for (const auto &Base : RD->bases()) {
2826 // The __base_type member points to the RTTI for the base type.
2827 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
2829 const CXXRecordDecl *BaseDecl =
2830 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
2832 int64_t OffsetFlags = 0;
2834 // All but the lower 8 bits of __offset_flags are a signed offset.
2835 // For a non-virtual base, this is the offset in the object of the base
2836 // subobject. For a virtual base, this is the offset in the virtual table of
2837 // the virtual base offset for the virtual base referenced (negative).
2839 if (Base.isVirtual())
2841 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
2843 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
2844 Offset = Layout.getBaseClassOffset(BaseDecl);
2847 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
2849 // The low-order byte of __offset_flags contains flags, as given by the
2850 // masks from the enumeration __offset_flags_masks.
2851 if (Base.isVirtual())
2852 OffsetFlags |= BCTI_Virtual;
2853 if (Base.getAccessSpecifier() == AS_public)
2854 OffsetFlags |= BCTI_Public;
2856 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
2860 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
2861 /// used for pointer types.
2862 void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
2864 QualType UnqualifiedPointeeTy =
2865 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2867 // Itanium C++ ABI 2.9.5p7:
2868 // __flags is a flag word describing the cv-qualification and other
2869 // attributes of the type pointed to
2870 unsigned Flags = ComputeQualifierFlags(Quals);
2872 // Itanium C++ ABI 2.9.5p7:
2873 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
2874 // incomplete class type, the incomplete target type flag is set.
2875 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
2876 Flags |= PTI_Incomplete;
2878 llvm::Type *UnsignedIntLTy =
2879 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2880 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2882 // Itanium C++ ABI 2.9.5p7:
2883 // __pointee is a pointer to the std::type_info derivation for the
2884 // unqualified type being pointed to.
2885 llvm::Constant *PointeeTypeInfo =
2886 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
2887 Fields.push_back(PointeeTypeInfo);
2890 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2891 /// struct, used for member pointer types.
2893 ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
2894 QualType PointeeTy = Ty->getPointeeType();
2897 QualType UnqualifiedPointeeTy =
2898 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2900 // Itanium C++ ABI 2.9.5p7:
2901 // __flags is a flag word describing the cv-qualification and other
2902 // attributes of the type pointed to.
2903 unsigned Flags = ComputeQualifierFlags(Quals);
2905 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
2907 // Itanium C++ ABI 2.9.5p7:
2908 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
2909 // incomplete class type, the incomplete target type flag is set.
2910 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
2911 Flags |= PTI_Incomplete;
2913 if (IsIncompleteClassType(ClassType))
2914 Flags |= PTI_ContainingClassIncomplete;
2916 llvm::Type *UnsignedIntLTy =
2917 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2918 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2920 // Itanium C++ ABI 2.9.5p7:
2921 // __pointee is a pointer to the std::type_info derivation for the
2922 // unqualified type being pointed to.
2923 llvm::Constant *PointeeTypeInfo =
2924 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
2925 Fields.push_back(PointeeTypeInfo);
2927 // Itanium C++ ABI 2.9.5p9:
2928 // __context is a pointer to an abi::__class_type_info corresponding to the
2929 // class type containing the member pointed to
2930 // (e.g., the "A" in "int A::*").
2932 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
2935 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
2936 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
2939 void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
2940 QualType PointerType = getContext().getPointerType(Type);
2941 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
2942 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
2943 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
2944 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
2947 void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
2948 QualType FundamentalTypes[] = {
2949 getContext().VoidTy, getContext().NullPtrTy,
2950 getContext().BoolTy, getContext().WCharTy,
2951 getContext().CharTy, getContext().UnsignedCharTy,
2952 getContext().SignedCharTy, getContext().ShortTy,
2953 getContext().UnsignedShortTy, getContext().IntTy,
2954 getContext().UnsignedIntTy, getContext().LongTy,
2955 getContext().UnsignedLongTy, getContext().LongLongTy,
2956 getContext().UnsignedLongLongTy, getContext().HalfTy,
2957 getContext().FloatTy, getContext().DoubleTy,
2958 getContext().LongDoubleTy, getContext().Char16Ty,
2959 getContext().Char32Ty,
2961 for (const QualType &FundamentalType : FundamentalTypes)
2962 EmitFundamentalRTTIDescriptor(FundamentalType);
2965 /// What sort of uniqueness rules should we use for the RTTI for the
2967 ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
2968 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
2969 if (shouldRTTIBeUnique())
2972 // It's only necessary for linkonce_odr or weak_odr linkage.
2973 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
2974 Linkage != llvm::GlobalValue::WeakODRLinkage)
2977 // It's only necessary with default visibility.
2978 if (CanTy->getVisibility() != DefaultVisibility)
2981 // If we're not required to publish this symbol, hide it.
2982 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
2983 return RUK_NonUniqueHidden;
2985 // If we're required to publish this symbol, as we might be under an
2986 // explicit instantiation, leave it with default visibility but
2987 // enable string-comparisons.
2988 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
2989 return RUK_NonUniqueVisible;