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 "CGCleanup.h"
23 #include "CGRecordLayout.h"
24 #include "CGVTables.h"
25 #include "CodeGenFunction.h"
26 #include "CodeGenModule.h"
27 #include "TargetInfo.h"
28 #include "clang/AST/Mangle.h"
29 #include "clang/AST/Type.h"
30 #include "clang/AST/StmtCXX.h"
31 #include "llvm/IR/CallSite.h"
32 #include "llvm/IR/DataLayout.h"
33 #include "llvm/IR/Instructions.h"
34 #include "llvm/IR/Intrinsics.h"
35 #include "llvm/IR/Value.h"
37 using namespace clang;
38 using namespace CodeGen;
41 class ItaniumCXXABI : public CodeGen::CGCXXABI {
42 /// VTables - All the vtables which have been defined.
43 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
46 bool UseARMMethodPtrABI;
47 bool UseARMGuardVarABI;
49 ItaniumMangleContext &getMangleContext() {
50 return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext());
54 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
55 bool UseARMMethodPtrABI = false,
56 bool UseARMGuardVarABI = false) :
57 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
58 UseARMGuardVarABI(UseARMGuardVarABI) { }
60 bool classifyReturnType(CGFunctionInfo &FI) const override;
62 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
63 // Structures with either a non-trivial destructor or a non-trivial
64 // copy constructor are always indirect.
65 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
67 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor())
72 bool isZeroInitializable(const MemberPointerType *MPT) override;
74 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
77 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
80 llvm::Value *MemFnPtr,
81 const MemberPointerType *MPT) override;
84 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
87 const MemberPointerType *MPT) override;
89 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
91 llvm::Value *Src) override;
92 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
93 llvm::Constant *Src) override;
95 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
97 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override;
98 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
99 CharUnits offset) override;
100 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
101 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
102 CharUnits ThisAdjustment);
104 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
105 llvm::Value *L, llvm::Value *R,
106 const MemberPointerType *MPT,
107 bool Inequality) override;
109 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
111 const MemberPointerType *MPT) override;
113 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
114 llvm::Value *Ptr, QualType ElementType,
115 const CXXDestructorDecl *Dtor) override;
117 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
118 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
120 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
123 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
124 llvm::Value *Exn) override;
126 void EmitFundamentalRTTIDescriptor(QualType Type);
127 void EmitFundamentalRTTIDescriptors();
128 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
130 getAddrOfCXXCatchHandlerType(QualType Ty,
131 QualType CatchHandlerType) override {
132 return getAddrOfRTTIDescriptor(Ty);
135 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
136 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
137 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
138 llvm::Value *ThisPtr,
139 llvm::Type *StdTypeInfoPtrTy) override;
141 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
142 QualType SrcRecordTy) override;
144 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
145 QualType SrcRecordTy, QualType DestTy,
146 QualType DestRecordTy,
147 llvm::BasicBlock *CastEnd) override;
149 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
150 QualType SrcRecordTy,
151 QualType DestTy) override;
153 bool EmitBadCastCall(CodeGenFunction &CGF) override;
156 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
157 const CXXRecordDecl *ClassDecl,
158 const CXXRecordDecl *BaseClassDecl) override;
160 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
162 void buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
163 SmallVectorImpl<CanQualType> &ArgTys) override;
165 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
166 CXXDtorType DT) const override {
167 // Itanium does not emit any destructor variant as an inline thunk.
168 // Delegating may occur as an optimization, but all variants are either
169 // emitted with external linkage or as linkonce if they are inline and used.
173 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
175 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
176 FunctionArgList &Params) override;
178 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
180 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
181 const CXXConstructorDecl *D,
182 CXXCtorType Type, bool ForVirtualBase,
184 CallArgList &Args) override;
186 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
187 CXXDtorType Type, bool ForVirtualBase,
188 bool Delegating, llvm::Value *This) override;
190 void emitVTableDefinitions(CodeGenVTables &CGVT,
191 const CXXRecordDecl *RD) override;
193 llvm::Value *getVTableAddressPointInStructor(
194 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
195 BaseSubobject Base, const CXXRecordDecl *NearestVBase,
196 bool &NeedsVirtualOffset) override;
199 getVTableAddressPointForConstExpr(BaseSubobject Base,
200 const CXXRecordDecl *VTableClass) override;
202 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
203 CharUnits VPtrOffset) override;
205 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
207 llvm::Type *Ty) override;
209 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
210 const CXXDestructorDecl *Dtor,
211 CXXDtorType DtorType,
213 const CXXMemberCallExpr *CE) override;
215 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
217 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
218 bool ReturnAdjustment) override {
219 // Allow inlining of thunks by emitting them with available_externally
220 // linkage together with vtables when needed.
222 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
225 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
226 const ThisAdjustment &TA) override;
228 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
229 const ReturnAdjustment &RA) override;
231 size_t getSrcArgforCopyCtor(const CXXConstructorDecl *,
232 FunctionArgList &Args) const override {
233 assert(!Args.empty() && "expected the arglist to not be empty!");
234 return Args.size() - 1;
237 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
238 StringRef GetDeletedVirtualCallName() override
239 { return "__cxa_deleted_virtual"; }
241 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
242 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
244 llvm::Value *NumElements,
245 const CXXNewExpr *expr,
246 QualType ElementType) override;
247 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
248 llvm::Value *allocPtr,
249 CharUnits cookieSize) override;
251 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
252 llvm::GlobalVariable *DeclPtr,
253 bool PerformInit) override;
254 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
255 llvm::Constant *dtor, llvm::Constant *addr) override;
257 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
259 void EmitThreadLocalInitFuncs(
261 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
263 ArrayRef<llvm::Function *> CXXThreadLocalInits,
264 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) override;
266 bool usesThreadWrapperFunction() const override { return true; }
267 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
268 QualType LValType) override;
270 bool NeedsVTTParameter(GlobalDecl GD) override;
272 /**************************** RTTI Uniqueness ******************************/
275 /// Returns true if the ABI requires RTTI type_info objects to be unique
276 /// across a program.
277 virtual bool shouldRTTIBeUnique() const { return true; }
280 /// What sort of unique-RTTI behavior should we use?
281 enum RTTIUniquenessKind {
282 /// We are guaranteeing, or need to guarantee, that the RTTI string
286 /// We are not guaranteeing uniqueness for the RTTI string, so we
287 /// can demote to hidden visibility but must use string comparisons.
290 /// We are not guaranteeing uniqueness for the RTTI string, so we
291 /// have to use string comparisons, but we also have to emit it with
292 /// non-hidden visibility.
296 /// Return the required visibility status for the given type and linkage in
299 classifyRTTIUniqueness(QualType CanTy,
300 llvm::GlobalValue::LinkageTypes Linkage) const;
301 friend class ItaniumRTTIBuilder;
303 void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override;
306 class ARMCXXABI : public ItaniumCXXABI {
308 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
309 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
310 /* UseARMGuardVarABI = */ true) {}
312 bool HasThisReturn(GlobalDecl GD) const override {
313 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
314 isa<CXXDestructorDecl>(GD.getDecl()) &&
315 GD.getDtorType() != Dtor_Deleting));
318 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
319 QualType ResTy) override;
321 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
322 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
324 llvm::Value *NumElements,
325 const CXXNewExpr *expr,
326 QualType ElementType) override;
327 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, llvm::Value *allocPtr,
328 CharUnits cookieSize) override;
331 class iOS64CXXABI : public ARMCXXABI {
333 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
335 // ARM64 libraries are prepared for non-unique RTTI.
336 bool shouldRTTIBeUnique() const override { return false; }
340 CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
341 switch (CGM.getTarget().getCXXABI().getKind()) {
342 // For IR-generation purposes, there's no significant difference
343 // between the ARM and iOS ABIs.
344 case TargetCXXABI::GenericARM:
345 case TargetCXXABI::iOS:
346 return new ARMCXXABI(CGM);
348 case TargetCXXABI::iOS64:
349 return new iOS64CXXABI(CGM);
351 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
352 // include the other 32-bit ARM oddities: constructor/destructor return values
353 // and array cookies.
354 case TargetCXXABI::GenericAArch64:
355 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
356 /* UseARMGuardVarABI = */ true);
358 case TargetCXXABI::GenericMIPS:
359 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true);
361 case TargetCXXABI::GenericItanium:
362 if (CGM.getContext().getTargetInfo().getTriple().getArch()
363 == llvm::Triple::le32) {
364 // For PNaCl, use ARM-style method pointers so that PNaCl code
365 // does not assume anything about the alignment of function
367 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
368 /* UseARMGuardVarABI = */ false);
370 return new ItaniumCXXABI(CGM);
372 case TargetCXXABI::Microsoft:
373 llvm_unreachable("Microsoft ABI is not Itanium-based");
375 llvm_unreachable("bad ABI kind");
379 ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
380 if (MPT->isMemberDataPointer())
381 return CGM.PtrDiffTy;
382 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, nullptr);
385 /// In the Itanium and ARM ABIs, method pointers have the form:
386 /// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
388 /// In the Itanium ABI:
389 /// - method pointers are virtual if (memptr.ptr & 1) is nonzero
390 /// - the this-adjustment is (memptr.adj)
391 /// - the virtual offset is (memptr.ptr - 1)
394 /// - method pointers are virtual if (memptr.adj & 1) is nonzero
395 /// - the this-adjustment is (memptr.adj >> 1)
396 /// - the virtual offset is (memptr.ptr)
397 /// ARM uses 'adj' for the virtual flag because Thumb functions
398 /// may be only single-byte aligned.
400 /// If the member is virtual, the adjusted 'this' pointer points
401 /// to a vtable pointer from which the virtual offset is applied.
403 /// If the member is non-virtual, memptr.ptr is the address of
404 /// the function to call.
405 llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
406 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
407 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
408 CGBuilderTy &Builder = CGF.Builder;
410 const FunctionProtoType *FPT =
411 MPT->getPointeeType()->getAs<FunctionProtoType>();
412 const CXXRecordDecl *RD =
413 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
415 llvm::FunctionType *FTy =
416 CGM.getTypes().GetFunctionType(
417 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
419 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
421 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
422 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
423 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
425 // Extract memptr.adj, which is in the second field.
426 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
428 // Compute the true adjustment.
429 llvm::Value *Adj = RawAdj;
430 if (UseARMMethodPtrABI)
431 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
433 // Apply the adjustment and cast back to the original struct type
435 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
436 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
437 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
439 // Load the function pointer.
440 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
442 // If the LSB in the function pointer is 1, the function pointer points to
443 // a virtual function.
444 llvm::Value *IsVirtual;
445 if (UseARMMethodPtrABI)
446 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
448 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
449 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
450 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
452 // In the virtual path, the adjustment left 'This' pointing to the
453 // vtable of the correct base subobject. The "function pointer" is an
454 // offset within the vtable (+1 for the virtual flag on non-ARM).
455 CGF.EmitBlock(FnVirtual);
457 // Cast the adjusted this to a pointer to vtable pointer and load.
458 llvm::Type *VTableTy = Builder.getInt8PtrTy();
459 llvm::Value *VTable = CGF.GetVTablePtr(This, VTableTy);
462 llvm::Value *VTableOffset = FnAsInt;
463 if (!UseARMMethodPtrABI)
464 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
465 VTable = Builder.CreateGEP(VTable, VTableOffset);
467 // Load the virtual function to call.
468 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
469 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn");
470 CGF.EmitBranch(FnEnd);
472 // In the non-virtual path, the function pointer is actually a
474 CGF.EmitBlock(FnNonVirtual);
475 llvm::Value *NonVirtualFn =
476 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
479 CGF.EmitBlock(FnEnd);
480 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
481 Callee->addIncoming(VirtualFn, FnVirtual);
482 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
486 /// Compute an l-value by applying the given pointer-to-member to a
488 llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
489 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
490 const MemberPointerType *MPT) {
491 assert(MemPtr->getType() == CGM.PtrDiffTy);
493 CGBuilderTy &Builder = CGF.Builder;
495 unsigned AS = Base->getType()->getPointerAddressSpace();
498 Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
500 // Apply the offset, which we assume is non-null.
501 llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, MemPtr, "memptr.offset");
503 // Cast the address to the appropriate pointer type, adopting the
504 // address space of the base pointer.
506 = CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
507 return Builder.CreateBitCast(Addr, PType);
510 /// Perform a bitcast, derived-to-base, or base-to-derived member pointer
513 /// Bitcast conversions are always a no-op under Itanium.
515 /// Obligatory offset/adjustment diagram:
516 /// <-- offset --> <-- adjustment -->
517 /// |--------------------------|----------------------|--------------------|
518 /// ^Derived address point ^Base address point ^Member address point
520 /// So when converting a base member pointer to a derived member pointer,
521 /// we add the offset to the adjustment because the address point has
522 /// decreased; and conversely, when converting a derived MP to a base MP
523 /// we subtract the offset from the adjustment because the address point
526 /// The standard forbids (at compile time) conversion to and from
527 /// virtual bases, which is why we don't have to consider them here.
529 /// The standard forbids (at run time) casting a derived MP to a base
530 /// MP when the derived MP does not point to a member of the base.
531 /// This is why -1 is a reasonable choice for null data member
534 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
537 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
538 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
539 E->getCastKind() == CK_ReinterpretMemberPointer);
541 // Under Itanium, reinterprets don't require any additional processing.
542 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
544 // Use constant emission if we can.
545 if (isa<llvm::Constant>(src))
546 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
548 llvm::Constant *adj = getMemberPointerAdjustment(E);
549 if (!adj) return src;
551 CGBuilderTy &Builder = CGF.Builder;
552 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
554 const MemberPointerType *destTy =
555 E->getType()->castAs<MemberPointerType>();
557 // For member data pointers, this is just a matter of adding the
558 // offset if the source is non-null.
559 if (destTy->isMemberDataPointer()) {
562 dst = Builder.CreateNSWSub(src, adj, "adj");
564 dst = Builder.CreateNSWAdd(src, adj, "adj");
567 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
568 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
569 return Builder.CreateSelect(isNull, src, dst);
572 // The this-adjustment is left-shifted by 1 on ARM.
573 if (UseARMMethodPtrABI) {
574 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
576 adj = llvm::ConstantInt::get(adj->getType(), offset);
579 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
582 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
584 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
586 return Builder.CreateInsertValue(src, dstAdj, 1);
590 ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
591 llvm::Constant *src) {
592 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
593 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
594 E->getCastKind() == CK_ReinterpretMemberPointer);
596 // Under Itanium, reinterprets don't require any additional processing.
597 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
599 // If the adjustment is trivial, we don't need to do anything.
600 llvm::Constant *adj = getMemberPointerAdjustment(E);
601 if (!adj) return src;
603 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
605 const MemberPointerType *destTy =
606 E->getType()->castAs<MemberPointerType>();
608 // For member data pointers, this is just a matter of adding the
609 // offset if the source is non-null.
610 if (destTy->isMemberDataPointer()) {
611 // null maps to null.
612 if (src->isAllOnesValue()) return src;
615 return llvm::ConstantExpr::getNSWSub(src, adj);
617 return llvm::ConstantExpr::getNSWAdd(src, adj);
620 // The this-adjustment is left-shifted by 1 on ARM.
621 if (UseARMMethodPtrABI) {
622 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
624 adj = llvm::ConstantInt::get(adj->getType(), offset);
627 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
628 llvm::Constant *dstAdj;
630 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
632 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
634 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
638 ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
639 // Itanium C++ ABI 2.3:
640 // A NULL pointer is represented as -1.
641 if (MPT->isMemberDataPointer())
642 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
644 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
645 llvm::Constant *Values[2] = { Zero, Zero };
646 return llvm::ConstantStruct::getAnon(Values);
650 ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
652 // Itanium C++ ABI 2.3:
653 // A pointer to data member is an offset from the base address of
654 // the class object containing it, represented as a ptrdiff_t
655 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
658 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
659 return BuildMemberPointer(MD, CharUnits::Zero());
662 llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
663 CharUnits ThisAdjustment) {
664 assert(MD->isInstance() && "Member function must not be static!");
665 MD = MD->getCanonicalDecl();
667 CodeGenTypes &Types = CGM.getTypes();
669 // Get the function pointer (or index if this is a virtual function).
670 llvm::Constant *MemPtr[2];
671 if (MD->isVirtual()) {
672 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
674 const ASTContext &Context = getContext();
675 CharUnits PointerWidth =
676 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
677 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
679 if (UseARMMethodPtrABI) {
680 // ARM C++ ABI 3.2.1:
681 // This ABI specifies that adj contains twice the this
682 // adjustment, plus 1 if the member function is virtual. The
683 // least significant bit of adj then makes exactly the same
684 // discrimination as the least significant bit of ptr does for
686 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
687 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
688 2 * ThisAdjustment.getQuantity() + 1);
690 // Itanium C++ ABI 2.3:
691 // For a virtual function, [the pointer field] is 1 plus the
692 // virtual table offset (in bytes) of the function,
693 // represented as a ptrdiff_t.
694 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
695 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
696 ThisAdjustment.getQuantity());
699 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
701 // Check whether the function has a computable LLVM signature.
702 if (Types.isFuncTypeConvertible(FPT)) {
703 // The function has a computable LLVM signature; use the correct type.
704 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
706 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
707 // function type is incomplete.
710 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
712 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
713 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
714 (UseARMMethodPtrABI ? 2 : 1) *
715 ThisAdjustment.getQuantity());
718 return llvm::ConstantStruct::getAnon(MemPtr);
721 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
723 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
724 const ValueDecl *MPD = MP.getMemberPointerDecl();
726 return EmitNullMemberPointer(MPT);
728 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
730 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
731 return BuildMemberPointer(MD, ThisAdjustment);
733 CharUnits FieldOffset =
734 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
735 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
738 /// The comparison algorithm is pretty easy: the member pointers are
739 /// the same if they're either bitwise identical *or* both null.
741 /// ARM is different here only because null-ness is more complicated.
743 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
746 const MemberPointerType *MPT,
748 CGBuilderTy &Builder = CGF.Builder;
750 llvm::ICmpInst::Predicate Eq;
751 llvm::Instruction::BinaryOps And, Or;
753 Eq = llvm::ICmpInst::ICMP_NE;
754 And = llvm::Instruction::Or;
755 Or = llvm::Instruction::And;
757 Eq = llvm::ICmpInst::ICMP_EQ;
758 And = llvm::Instruction::And;
759 Or = llvm::Instruction::Or;
762 // Member data pointers are easy because there's a unique null
763 // value, so it just comes down to bitwise equality.
764 if (MPT->isMemberDataPointer())
765 return Builder.CreateICmp(Eq, L, R);
767 // For member function pointers, the tautologies are more complex.
768 // The Itanium tautology is:
769 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
770 // The ARM tautology is:
771 // (L == R) <==> (L.ptr == R.ptr &&
772 // (L.adj == R.adj ||
773 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
774 // The inequality tautologies have exactly the same structure, except
775 // applying De Morgan's laws.
777 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
778 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
780 // This condition tests whether L.ptr == R.ptr. This must always be
781 // true for equality to hold.
782 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
784 // This condition, together with the assumption that L.ptr == R.ptr,
785 // tests whether the pointers are both null. ARM imposes an extra
787 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
788 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
790 // This condition tests whether L.adj == R.adj. If this isn't
791 // true, the pointers are unequal unless they're both null.
792 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
793 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
794 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
796 // Null member function pointers on ARM clear the low bit of Adj,
797 // so the zero condition has to check that neither low bit is set.
798 if (UseARMMethodPtrABI) {
799 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
801 // Compute (l.adj | r.adj) & 1 and test it against zero.
802 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
803 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
804 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
806 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
809 // Tie together all our conditions.
810 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
811 Result = Builder.CreateBinOp(And, PtrEq, Result,
812 Inequality ? "memptr.ne" : "memptr.eq");
817 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
819 const MemberPointerType *MPT) {
820 CGBuilderTy &Builder = CGF.Builder;
822 /// For member data pointers, this is just a check against -1.
823 if (MPT->isMemberDataPointer()) {
824 assert(MemPtr->getType() == CGM.PtrDiffTy);
825 llvm::Value *NegativeOne =
826 llvm::Constant::getAllOnesValue(MemPtr->getType());
827 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
830 // In Itanium, a member function pointer is not null if 'ptr' is not null.
831 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
833 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
834 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
836 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
837 // (the virtual bit) is set.
838 if (UseARMMethodPtrABI) {
839 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
840 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
841 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
842 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
844 Result = Builder.CreateOr(Result, IsVirtual);
850 bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
851 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
855 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
856 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
858 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
859 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
865 /// The Itanium ABI requires non-zero initialization only for data
866 /// member pointers, for which '0' is a valid offset.
867 bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
868 return MPT->isMemberFunctionPointer();
871 /// The Itanium ABI always places an offset to the complete object
872 /// at entry -2 in the vtable.
873 void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
874 const CXXDeleteExpr *DE,
876 QualType ElementType,
877 const CXXDestructorDecl *Dtor) {
878 bool UseGlobalDelete = DE->isGlobalDelete();
879 if (UseGlobalDelete) {
880 // Derive the complete-object pointer, which is what we need
881 // to pass to the deallocation function.
883 // Grab the vtable pointer as an intptr_t*.
884 llvm::Value *VTable = CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo());
886 // Track back to entry -2 and pull out the offset there.
887 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
888 VTable, -2, "complete-offset.ptr");
889 llvm::LoadInst *Offset = CGF.Builder.CreateLoad(OffsetPtr);
890 Offset->setAlignment(CGF.PointerAlignInBytes);
893 llvm::Value *CompletePtr = CGF.Builder.CreateBitCast(Ptr, CGF.Int8PtrTy);
894 CompletePtr = CGF.Builder.CreateInBoundsGEP(CompletePtr, Offset);
896 // If we're supposed to call the global delete, make sure we do so
897 // even if the destructor throws.
898 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
902 // FIXME: Provide a source location here even though there's no
903 // CXXMemberCallExpr for dtor call.
904 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
905 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr);
908 CGF.PopCleanupBlock();
911 void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
912 // void __cxa_rethrow();
914 llvm::FunctionType *FTy =
915 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
917 llvm::Constant *Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
920 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, None);
922 CGF.EmitRuntimeCallOrInvoke(Fn);
925 static llvm::Constant *getAllocateExceptionFn(CodeGenModule &CGM) {
926 // void *__cxa_allocate_exception(size_t thrown_size);
928 llvm::FunctionType *FTy =
929 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*IsVarArgs=*/false);
931 return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
934 static llvm::Constant *getThrowFn(CodeGenModule &CGM) {
935 // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
936 // void (*dest) (void *));
938 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.Int8PtrTy, CGM.Int8PtrTy };
939 llvm::FunctionType *FTy =
940 llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false);
942 return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
945 void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
946 QualType ThrowType = E->getSubExpr()->getType();
947 // Now allocate the exception object.
948 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType());
949 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
951 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM);
952 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall(
953 AllocExceptionFn, llvm::ConstantInt::get(SizeTy, TypeSize), "exception");
955 CGF.EmitAnyExprToExn(E->getSubExpr(), ExceptionPtr);
957 // Now throw the exception.
958 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
961 // The address of the destructor. If the exception type has a
962 // trivial destructor (or isn't a record), we just pass null.
963 llvm::Constant *Dtor = nullptr;
964 if (const RecordType *RecordTy = ThrowType->getAs<RecordType>()) {
965 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
966 if (!Record->hasTrivialDestructor()) {
967 CXXDestructorDecl *DtorD = Record->getDestructor();
968 Dtor = CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete);
969 Dtor = llvm::ConstantExpr::getBitCast(Dtor, CGM.Int8PtrTy);
972 if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
974 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
975 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args);
978 static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
979 // void *__dynamic_cast(const void *sub,
980 // const abi::__class_type_info *src,
981 // const abi::__class_type_info *dst,
982 // std::ptrdiff_t src2dst_offset);
984 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
985 llvm::Type *PtrDiffTy =
986 CGF.ConvertType(CGF.getContext().getPointerDiffType());
988 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
990 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
992 // Mark the function as nounwind readonly.
993 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
994 llvm::Attribute::ReadOnly };
995 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
996 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
998 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1001 static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1002 // void __cxa_bad_cast();
1003 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1004 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1007 /// \brief Compute the src2dst_offset hint as described in the
1008 /// Itanium C++ ABI [2.9.7]
1009 static CharUnits computeOffsetHint(ASTContext &Context,
1010 const CXXRecordDecl *Src,
1011 const CXXRecordDecl *Dst) {
1012 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1013 /*DetectVirtual=*/false);
1015 // If Dst is not derived from Src we can skip the whole computation below and
1016 // return that Src is not a public base of Dst. Record all inheritance paths.
1017 if (!Dst->isDerivedFrom(Src, Paths))
1018 return CharUnits::fromQuantity(-2ULL);
1020 unsigned NumPublicPaths = 0;
1023 // Now walk all possible inheritance paths.
1024 for (CXXBasePaths::paths_iterator I = Paths.begin(), E = Paths.end(); I != E;
1026 if (I->Access != AS_public) // Ignore non-public inheritance.
1031 for (CXXBasePath::iterator J = I->begin(), JE = I->end(); J != JE; ++J) {
1032 // If the path contains a virtual base class we can't give any hint.
1034 if (J->Base->isVirtual())
1035 return CharUnits::fromQuantity(-1ULL);
1037 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1040 // Accumulate the base class offsets.
1041 const ASTRecordLayout &L = Context.getASTRecordLayout(J->Class);
1042 Offset += L.getBaseClassOffset(J->Base->getType()->getAsCXXRecordDecl());
1046 // -2: Src is not a public base of Dst.
1047 if (NumPublicPaths == 0)
1048 return CharUnits::fromQuantity(-2ULL);
1050 // -3: Src is a multiple public base type but never a virtual base type.
1051 if (NumPublicPaths > 1)
1052 return CharUnits::fromQuantity(-3ULL);
1054 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1055 // Return the offset of Src from the origin of Dst.
1059 static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
1060 // void __cxa_bad_typeid();
1061 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1063 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1066 bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
1067 QualType SrcRecordTy) {
1071 void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1072 llvm::Value *Fn = getBadTypeidFn(CGF);
1073 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1074 CGF.Builder.CreateUnreachable();
1077 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1078 QualType SrcRecordTy,
1079 llvm::Value *ThisPtr,
1080 llvm::Type *StdTypeInfoPtrTy) {
1081 llvm::Value *Value =
1082 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo());
1084 // Load the type info.
1085 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
1086 return CGF.Builder.CreateLoad(Value);
1089 bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1090 QualType SrcRecordTy) {
1094 llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
1095 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
1096 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1097 llvm::Type *PtrDiffLTy =
1098 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1099 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1101 llvm::Value *SrcRTTI =
1102 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1103 llvm::Value *DestRTTI =
1104 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1106 // Compute the offset hint.
1107 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1108 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1109 llvm::Value *OffsetHint = llvm::ConstantInt::get(
1111 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1113 // Emit the call to __dynamic_cast.
1114 Value = CGF.EmitCastToVoidPtr(Value);
1116 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1117 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
1118 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1120 /// C++ [expr.dynamic.cast]p9:
1121 /// A failed cast to reference type throws std::bad_cast
1122 if (DestTy->isReferenceType()) {
1123 llvm::BasicBlock *BadCastBlock =
1124 CGF.createBasicBlock("dynamic_cast.bad_cast");
1126 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1127 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1129 CGF.EmitBlock(BadCastBlock);
1130 EmitBadCastCall(CGF);
1136 llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1138 QualType SrcRecordTy,
1140 llvm::Type *PtrDiffLTy =
1141 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1142 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1144 // Get the vtable pointer.
1145 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1147 // Get the offset-to-top from the vtable.
1148 llvm::Value *OffsetToTop =
1149 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1150 OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1152 // Finally, add the offset to the pointer.
1153 Value = CGF.EmitCastToVoidPtr(Value);
1154 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1156 return CGF.Builder.CreateBitCast(Value, DestLTy);
1159 bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1160 llvm::Value *Fn = getBadCastFn(CGF);
1161 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1162 CGF.Builder.CreateUnreachable();
1167 ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1169 const CXXRecordDecl *ClassDecl,
1170 const CXXRecordDecl *BaseClassDecl) {
1171 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy);
1172 CharUnits VBaseOffsetOffset =
1173 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1176 llvm::Value *VBaseOffsetPtr =
1177 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1178 "vbase.offset.ptr");
1179 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1180 CGM.PtrDiffTy->getPointerTo());
1182 llvm::Value *VBaseOffset =
1183 CGF.Builder.CreateLoad(VBaseOffsetPtr, "vbase.offset");
1188 void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1189 // Just make sure we're in sync with TargetCXXABI.
1190 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1192 // The constructor used for constructing this as a base class;
1193 // ignores virtual bases.
1194 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1196 // The constructor used for constructing this as a complete class;
1197 // constructs the virtual bases, then calls the base constructor.
1198 if (!D->getParent()->isAbstract()) {
1199 // We don't need to emit the complete ctor if the class is abstract.
1200 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1205 ItaniumCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
1206 SmallVectorImpl<CanQualType> &ArgTys) {
1207 ASTContext &Context = getContext();
1209 // All parameters are already in place except VTT, which goes after 'this'.
1210 // These are Clang types, so we don't need to worry about sret yet.
1212 // Check if we need to add a VTT parameter (which has type void **).
1213 if (T == StructorType::Base && MD->getParent()->getNumVBases() != 0)
1214 ArgTys.insert(ArgTys.begin() + 1,
1215 Context.getPointerType(Context.VoidPtrTy));
1218 void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1219 // The destructor used for destructing this as a base class; ignores
1221 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1223 // The destructor used for destructing this as a most-derived class;
1224 // call the base destructor and then destructs any virtual bases.
1225 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1227 // The destructor in a virtual table is always a 'deleting'
1228 // destructor, which calls the complete destructor and then uses the
1229 // appropriate operator delete.
1231 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
1234 void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1236 FunctionArgList &Params) {
1237 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1238 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
1240 // Check if we need a VTT parameter as well.
1241 if (NeedsVTTParameter(CGF.CurGD)) {
1242 ASTContext &Context = getContext();
1244 // FIXME: avoid the fake decl
1245 QualType T = Context.getPointerType(Context.VoidPtrTy);
1246 ImplicitParamDecl *VTTDecl
1247 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
1248 &Context.Idents.get("vtt"), T);
1249 Params.insert(Params.begin() + 1, VTTDecl);
1250 getStructorImplicitParamDecl(CGF) = VTTDecl;
1254 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1255 /// Initialize the 'this' slot.
1258 /// Initialize the 'vtt' slot if needed.
1259 if (getStructorImplicitParamDecl(CGF)) {
1260 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1261 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
1264 /// If this is a function that the ABI specifies returns 'this', initialize
1265 /// the return slot to 'this' at the start of the function.
1267 /// Unlike the setting of return types, this is done within the ABI
1268 /// implementation instead of by clients of CGCXXABI because:
1269 /// 1) getThisValue is currently protected
1270 /// 2) in theory, an ABI could implement 'this' returns some other way;
1271 /// HasThisReturn only specifies a contract, not the implementation
1272 if (HasThisReturn(CGF.CurGD))
1273 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1276 unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1277 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1278 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1279 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1282 // Insert the implicit 'vtt' argument as the second argument.
1284 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1285 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1286 Args.insert(Args.begin() + 1,
1287 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1288 return 1; // Added one arg.
1291 void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1292 const CXXDestructorDecl *DD,
1293 CXXDtorType Type, bool ForVirtualBase,
1294 bool Delegating, llvm::Value *This) {
1295 GlobalDecl GD(DD, Type);
1296 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1297 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1299 llvm::Value *Callee = nullptr;
1300 if (getContext().getLangOpts().AppleKext)
1301 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1304 Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type));
1306 CGF.EmitCXXMemberOrOperatorCall(DD, Callee, ReturnValueSlot(), This, VTT,
1310 void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1311 const CXXRecordDecl *RD) {
1312 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1313 if (VTable->hasInitializer())
1316 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1317 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1318 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1319 llvm::Constant *RTTI =
1320 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
1322 // Create and set the initializer.
1323 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1324 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
1325 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
1326 VTable->setInitializer(Init);
1328 // Set the correct linkage.
1329 VTable->setLinkage(Linkage);
1331 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
1332 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
1334 // Set the right visibility.
1335 CGM.setGlobalVisibility(VTable, RD);
1337 // Use pointer alignment for the vtable. Otherwise we would align them based
1338 // on the size of the initializer which doesn't make sense as only single
1340 unsigned PAlign = CGM.getTarget().getPointerAlign(0);
1341 VTable->setAlignment(getContext().toCharUnitsFromBits(PAlign).getQuantity());
1343 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1344 // we will emit the typeinfo for the fundamental types. This is the
1345 // same behaviour as GCC.
1346 const DeclContext *DC = RD->getDeclContext();
1347 if (RD->getIdentifier() &&
1348 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1349 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1350 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1351 DC->getParent()->isTranslationUnit())
1352 EmitFundamentalRTTIDescriptors();
1354 CGM.EmitVTableBitSetEntries(VTable, VTLayout);
1357 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1358 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1359 const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) {
1360 bool NeedsVTTParam = CGM.getCXXABI().NeedsVTTParameter(CGF.CurGD);
1361 NeedsVirtualOffset = (NeedsVTTParam && NearestVBase);
1363 llvm::Value *VTableAddressPoint;
1364 if (NeedsVTTParam && (Base.getBase()->getNumVBases() || NearestVBase)) {
1365 // Get the secondary vpointer index.
1366 uint64_t VirtualPointerIndex =
1367 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1370 llvm::Value *VTT = CGF.LoadCXXVTT();
1371 if (VirtualPointerIndex)
1372 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1374 // And load the address point from the VTT.
1375 VTableAddressPoint = CGF.Builder.CreateLoad(VTT);
1377 llvm::Constant *VTable =
1378 CGM.getCXXABI().getAddrOfVTable(VTableClass, CharUnits());
1379 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1380 .getVTableLayout(VTableClass)
1381 .getAddressPoint(Base);
1382 VTableAddressPoint =
1383 CGF.Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint);
1386 return VTableAddressPoint;
1389 llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1390 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1391 auto *VTable = getAddrOfVTable(VTableClass, CharUnits());
1393 // Find the appropriate vtable within the vtable group.
1394 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1395 .getVTableLayout(VTableClass)
1396 .getAddressPoint(Base);
1397 llvm::Value *Indices[] = {
1398 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1399 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1402 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable->getValueType(),
1406 llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1407 CharUnits VPtrOffset) {
1408 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1410 llvm::GlobalVariable *&VTable = VTables[RD];
1414 // Queue up this v-table for possible deferred emission.
1415 CGM.addDeferredVTable(RD);
1417 SmallString<256> OutName;
1418 llvm::raw_svector_ostream Out(OutName);
1419 getMangleContext().mangleCXXVTable(RD, Out);
1421 StringRef Name = OutName.str();
1423 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1424 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1425 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1427 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1428 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1429 VTable->setUnnamedAddr(true);
1431 if (RD->hasAttr<DLLImportAttr>())
1432 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1433 else if (RD->hasAttr<DLLExportAttr>())
1434 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1439 llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1443 GD = GD.getCanonicalDecl();
1444 Ty = Ty->getPointerTo()->getPointerTo();
1445 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
1447 if (CGF.SanOpts.has(SanitizerKind::CFIVCall))
1448 CGF.EmitVTablePtrCheckForCall(cast<CXXMethodDecl>(GD.getDecl()), VTable);
1450 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
1451 llvm::Value *VFuncPtr =
1452 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
1453 return CGF.Builder.CreateLoad(VFuncPtr);
1456 llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
1457 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
1458 llvm::Value *This, const CXXMemberCallExpr *CE) {
1459 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
1460 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1462 const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
1463 Dtor, getFromDtorType(DtorType));
1464 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1465 llvm::Value *Callee =
1466 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty);
1468 CGF.EmitCXXMemberOrOperatorCall(Dtor, Callee, ReturnValueSlot(), This,
1469 /*ImplicitParam=*/nullptr, QualType(), CE);
1473 void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
1474 CodeGenVTables &VTables = CGM.getVTables();
1475 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
1476 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
1479 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
1481 int64_t NonVirtualAdjustment,
1482 int64_t VirtualAdjustment,
1483 bool IsReturnAdjustment) {
1484 if (!NonVirtualAdjustment && !VirtualAdjustment)
1487 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1488 llvm::Value *V = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy);
1490 if (NonVirtualAdjustment && !IsReturnAdjustment) {
1491 // Perform the non-virtual adjustment for a base-to-derived cast.
1492 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1495 if (VirtualAdjustment) {
1496 llvm::Type *PtrDiffTy =
1497 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1499 // Perform the virtual adjustment.
1500 llvm::Value *VTablePtrPtr =
1501 CGF.Builder.CreateBitCast(V, Int8PtrTy->getPointerTo());
1503 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1505 llvm::Value *OffsetPtr =
1506 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1508 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1510 // Load the adjustment offset from the vtable.
1511 llvm::Value *Offset = CGF.Builder.CreateLoad(OffsetPtr);
1513 // Adjust our pointer.
1514 V = CGF.Builder.CreateInBoundsGEP(V, Offset);
1517 if (NonVirtualAdjustment && IsReturnAdjustment) {
1518 // Perform the non-virtual adjustment for a derived-to-base cast.
1519 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1522 // Cast back to the original type.
1523 return CGF.Builder.CreateBitCast(V, Ptr->getType());
1526 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1528 const ThisAdjustment &TA) {
1529 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1530 TA.Virtual.Itanium.VCallOffsetOffset,
1531 /*IsReturnAdjustment=*/false);
1535 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1536 const ReturnAdjustment &RA) {
1537 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1538 RA.Virtual.Itanium.VBaseOffsetOffset,
1539 /*IsReturnAdjustment=*/true);
1542 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1543 RValue RV, QualType ResultType) {
1544 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1545 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1547 // Destructor thunks in the ARM ABI have indeterminate results.
1549 cast<llvm::PointerType>(CGF.ReturnValue->getType())->getElementType();
1550 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1551 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1554 /************************** Array allocation cookies **************************/
1556 CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1557 // The array cookie is a size_t; pad that up to the element alignment.
1558 // The cookie is actually right-justified in that space.
1559 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1560 CGM.getContext().getTypeAlignInChars(elementType));
1563 llvm::Value *ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1564 llvm::Value *NewPtr,
1565 llvm::Value *NumElements,
1566 const CXXNewExpr *expr,
1567 QualType ElementType) {
1568 assert(requiresArrayCookie(expr));
1570 unsigned AS = NewPtr->getType()->getPointerAddressSpace();
1572 ASTContext &Ctx = getContext();
1573 QualType SizeTy = Ctx.getSizeType();
1574 CharUnits SizeSize = Ctx.getTypeSizeInChars(SizeTy);
1576 // The size of the cookie.
1577 CharUnits CookieSize =
1578 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
1579 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
1581 // Compute an offset to the cookie.
1582 llvm::Value *CookiePtr = NewPtr;
1583 CharUnits CookieOffset = CookieSize - SizeSize;
1584 if (!CookieOffset.isZero())
1585 CookiePtr = CGF.Builder.CreateConstInBoundsGEP1_64(CookiePtr,
1586 CookieOffset.getQuantity());
1588 // Write the number of elements into the appropriate slot.
1589 llvm::Type *NumElementsTy = CGF.ConvertType(SizeTy)->getPointerTo(AS);
1590 llvm::Value *NumElementsPtr =
1591 CGF.Builder.CreateBitCast(CookiePtr, NumElementsTy);
1592 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
1593 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
1594 expr->getOperatorNew()->isReplaceableGlobalAllocationFunction()) {
1595 // The store to the CookiePtr does not need to be instrumented.
1596 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
1597 llvm::FunctionType *FTy =
1598 llvm::FunctionType::get(CGM.VoidTy, NumElementsTy, false);
1600 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
1601 CGF.Builder.CreateCall(F, NumElementsPtr);
1604 // Finally, compute a pointer to the actual data buffer by skipping
1605 // over the cookie completely.
1606 return CGF.Builder.CreateConstInBoundsGEP1_64(NewPtr,
1607 CookieSize.getQuantity());
1610 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1611 llvm::Value *allocPtr,
1612 CharUnits cookieSize) {
1613 // The element size is right-justified in the cookie.
1614 llvm::Value *numElementsPtr = allocPtr;
1615 CharUnits numElementsOffset =
1616 cookieSize - CharUnits::fromQuantity(CGF.SizeSizeInBytes);
1617 if (!numElementsOffset.isZero())
1619 CGF.Builder.CreateConstInBoundsGEP1_64(numElementsPtr,
1620 numElementsOffset.getQuantity());
1622 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
1624 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1625 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
1626 return CGF.Builder.CreateLoad(numElementsPtr);
1627 // In asan mode emit a function call instead of a regular load and let the
1628 // run-time deal with it: if the shadow is properly poisoned return the
1629 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
1630 // We can't simply ignore this load using nosanitize metadata because
1631 // the metadata may be lost.
1632 llvm::FunctionType *FTy =
1633 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
1635 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
1636 return CGF.Builder.CreateCall(F, numElementsPtr);
1639 CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1640 // ARM says that the cookie is always:
1641 // struct array_cookie {
1642 // std::size_t element_size; // element_size != 0
1643 // std::size_t element_count;
1645 // But the base ABI doesn't give anything an alignment greater than
1646 // 8, so we can dismiss this as typical ABI-author blindness to
1647 // actual language complexity and round up to the element alignment.
1648 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1649 CGM.getContext().getTypeAlignInChars(elementType));
1652 llvm::Value *ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1653 llvm::Value *newPtr,
1654 llvm::Value *numElements,
1655 const CXXNewExpr *expr,
1656 QualType elementType) {
1657 assert(requiresArrayCookie(expr));
1659 // NewPtr is a char*, but we generalize to arbitrary addrspaces.
1660 unsigned AS = newPtr->getType()->getPointerAddressSpace();
1662 // The cookie is always at the start of the buffer.
1663 llvm::Value *cookie = newPtr;
1665 // The first element is the element size.
1666 cookie = CGF.Builder.CreateBitCast(cookie, CGF.SizeTy->getPointerTo(AS));
1667 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1668 getContext().getTypeSizeInChars(elementType).getQuantity());
1669 CGF.Builder.CreateStore(elementSize, cookie);
1671 // The second element is the element count.
1672 cookie = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.SizeTy, cookie, 1);
1673 CGF.Builder.CreateStore(numElements, cookie);
1675 // Finally, compute a pointer to the actual data buffer by skipping
1676 // over the cookie completely.
1677 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
1678 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
1679 cookieSize.getQuantity());
1682 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1683 llvm::Value *allocPtr,
1684 CharUnits cookieSize) {
1685 // The number of elements is at offset sizeof(size_t) relative to
1686 // the allocated pointer.
1687 llvm::Value *numElementsPtr
1688 = CGF.Builder.CreateConstInBoundsGEP1_64(allocPtr, CGF.SizeSizeInBytes);
1690 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
1692 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1693 return CGF.Builder.CreateLoad(numElementsPtr);
1696 /*********************** Static local initialization **************************/
1698 static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
1699 llvm::PointerType *GuardPtrTy) {
1700 // int __cxa_guard_acquire(__guard *guard_object);
1701 llvm::FunctionType *FTy =
1702 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
1703 GuardPtrTy, /*isVarArg=*/false);
1704 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
1705 llvm::AttributeSet::get(CGM.getLLVMContext(),
1706 llvm::AttributeSet::FunctionIndex,
1707 llvm::Attribute::NoUnwind));
1710 static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
1711 llvm::PointerType *GuardPtrTy) {
1712 // void __cxa_guard_release(__guard *guard_object);
1713 llvm::FunctionType *FTy =
1714 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1715 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
1716 llvm::AttributeSet::get(CGM.getLLVMContext(),
1717 llvm::AttributeSet::FunctionIndex,
1718 llvm::Attribute::NoUnwind));
1721 static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
1722 llvm::PointerType *GuardPtrTy) {
1723 // void __cxa_guard_abort(__guard *guard_object);
1724 llvm::FunctionType *FTy =
1725 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1726 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
1727 llvm::AttributeSet::get(CGM.getLLVMContext(),
1728 llvm::AttributeSet::FunctionIndex,
1729 llvm::Attribute::NoUnwind));
1733 struct CallGuardAbort : EHScopeStack::Cleanup {
1734 llvm::GlobalVariable *Guard;
1735 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
1737 void Emit(CodeGenFunction &CGF, Flags flags) override {
1738 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1744 /// The ARM code here follows the Itanium code closely enough that we
1745 /// just special-case it at particular places.
1746 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1748 llvm::GlobalVariable *var,
1749 bool shouldPerformInit) {
1750 CGBuilderTy &Builder = CGF.Builder;
1752 // We only need to use thread-safe statics for local non-TLS variables;
1753 // global initialization is always single-threaded.
1754 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1755 D.isLocalVarDecl() && !D.getTLSKind();
1757 // If we have a global variable with internal linkage and thread-safe statics
1758 // are disabled, we can just let the guard variable be of type i8.
1759 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1761 llvm::IntegerType *guardTy;
1762 if (useInt8GuardVariable) {
1763 guardTy = CGF.Int8Ty;
1765 // Guard variables are 64 bits in the generic ABI and size width on ARM
1766 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
1767 guardTy = (UseARMGuardVarABI ? CGF.SizeTy : CGF.Int64Ty);
1769 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
1771 // Create the guard variable if we don't already have it (as we
1772 // might if we're double-emitting this function body).
1773 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1775 // Mangle the name for the guard.
1776 SmallString<256> guardName;
1778 llvm::raw_svector_ostream out(guardName);
1779 getMangleContext().mangleStaticGuardVariable(&D, out);
1783 // Create the guard variable with a zero-initializer.
1784 // Just absorb linkage and visibility from the guarded variable.
1785 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1786 false, var->getLinkage(),
1787 llvm::ConstantInt::get(guardTy, 0),
1789 guard->setVisibility(var->getVisibility());
1790 // If the variable is thread-local, so is its guard variable.
1791 guard->setThreadLocalMode(var->getThreadLocalMode());
1793 // The ABI says: It is suggested that it be emitted in the same COMDAT group
1794 // as the associated data object
1795 llvm::Comdat *C = var->getComdat();
1796 if (!D.isLocalVarDecl() && C) {
1797 guard->setComdat(C);
1798 CGF.CurFn->setComdat(C);
1799 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
1800 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
1803 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1806 // Test whether the variable has completed initialization.
1808 // Itanium C++ ABI 3.3.2:
1809 // The following is pseudo-code showing how these functions can be used:
1810 // if (obj_guard.first_byte == 0) {
1811 // if ( __cxa_guard_acquire (&obj_guard) ) {
1813 // ... initialize the object ...;
1815 // __cxa_guard_abort (&obj_guard);
1818 // ... queue object destructor with __cxa_atexit() ...;
1819 // __cxa_guard_release (&obj_guard);
1823 // Load the first byte of the guard variable.
1824 llvm::LoadInst *LI =
1825 Builder.CreateLoad(Builder.CreateBitCast(guard, CGM.Int8PtrTy));
1826 LI->setAlignment(1);
1829 // An implementation supporting thread-safety on multiprocessor
1830 // systems must also guarantee that references to the initialized
1831 // object do not occur before the load of the initialization flag.
1833 // In LLVM, we do this by marking the load Acquire.
1835 LI->setAtomic(llvm::Acquire);
1837 // For ARM, we should only check the first bit, rather than the entire byte:
1839 // ARM C++ ABI 3.2.3.1:
1840 // To support the potential use of initialization guard variables
1841 // as semaphores that are the target of ARM SWP and LDREX/STREX
1842 // synchronizing instructions we define a static initialization
1843 // guard variable to be a 4-byte aligned, 4-byte word with the
1844 // following inline access protocol.
1845 // #define INITIALIZED 1
1846 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
1847 // if (__cxa_guard_acquire(&obj_guard))
1851 // and similarly for ARM64:
1853 // ARM64 C++ ABI 3.2.2:
1854 // This ABI instead only specifies the value bit 0 of the static guard
1855 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
1856 // variable is not initialized and 1 when it is.
1858 (UseARMGuardVarABI && !useInt8GuardVariable)
1859 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
1861 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
1863 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
1864 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1866 // Check if the first byte of the guard variable is zero.
1867 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
1869 CGF.EmitBlock(InitCheckBlock);
1871 // Variables used when coping with thread-safe statics and exceptions.
1873 // Call __cxa_guard_acquire.
1875 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
1877 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1879 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
1880 InitBlock, EndBlock);
1882 // Call __cxa_guard_abort along the exceptional edge.
1883 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
1885 CGF.EmitBlock(InitBlock);
1888 // Emit the initializer and add a global destructor if appropriate.
1889 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
1892 // Pop the guard-abort cleanup if we pushed one.
1893 CGF.PopCleanupBlock();
1895 // Call __cxa_guard_release. This cannot throw.
1896 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), guard);
1898 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guard);
1901 CGF.EmitBlock(EndBlock);
1904 /// Register a global destructor using __cxa_atexit.
1905 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
1906 llvm::Constant *dtor,
1907 llvm::Constant *addr,
1909 const char *Name = "__cxa_atexit";
1911 const llvm::Triple &T = CGF.getTarget().getTriple();
1912 Name = T.isMacOSX() ? "_tlv_atexit" : "__cxa_thread_atexit";
1915 // We're assuming that the destructor function is something we can
1916 // reasonably call with the default CC. Go ahead and cast it to the
1918 llvm::Type *dtorTy =
1919 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
1921 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
1922 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
1923 llvm::FunctionType *atexitTy =
1924 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
1926 // Fetch the actual function.
1927 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
1928 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
1929 fn->setDoesNotThrow();
1931 // Create a variable that binds the atexit to this shared object.
1932 llvm::Constant *handle =
1933 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
1935 llvm::Value *args[] = {
1936 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
1937 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
1940 CGF.EmitNounwindRuntimeCall(atexit, args);
1943 /// Register a global destructor as best as we know how.
1944 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
1946 llvm::Constant *dtor,
1947 llvm::Constant *addr) {
1948 // Use __cxa_atexit if available.
1949 if (CGM.getCodeGenOpts().CXAAtExit)
1950 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
1953 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
1955 // In Apple kexts, we want to add a global destructor entry.
1956 // FIXME: shouldn't this be guarded by some variable?
1957 if (CGM.getLangOpts().AppleKext) {
1958 // Generate a global destructor entry.
1959 return CGM.AddCXXDtorEntry(dtor, addr);
1962 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
1965 static bool isThreadWrapperReplaceable(const VarDecl *VD,
1966 CodeGen::CodeGenModule &CGM) {
1967 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
1968 // OS X prefers to have references to thread local variables to go through
1969 // the thread wrapper instead of directly referencing the backing variable.
1970 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
1971 CGM.getTarget().getTriple().isMacOSX();
1974 /// Get the appropriate linkage for the wrapper function. This is essentially
1975 /// the weak form of the variable's linkage; every translation unit which needs
1976 /// the wrapper emits a copy, and we want the linker to merge them.
1977 static llvm::GlobalValue::LinkageTypes
1978 getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
1979 llvm::GlobalValue::LinkageTypes VarLinkage =
1980 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
1982 // For internal linkage variables, we don't need an external or weak wrapper.
1983 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
1986 // If the thread wrapper is replaceable, give it appropriate linkage.
1987 if (isThreadWrapperReplaceable(VD, CGM)) {
1988 if (llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) ||
1989 llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
1990 return llvm::GlobalVariable::WeakAnyLinkage;
1993 return llvm::GlobalValue::WeakODRLinkage;
1997 ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
1999 // Mangle the name for the thread_local wrapper function.
2000 SmallString<256> WrapperName;
2002 llvm::raw_svector_ostream Out(WrapperName);
2003 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
2007 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
2008 return cast<llvm::Function>(V);
2010 llvm::Type *RetTy = Val->getType();
2011 if (VD->getType()->isReferenceType())
2012 RetTy = RetTy->getPointerElementType();
2014 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
2015 llvm::Function *Wrapper =
2016 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
2017 WrapperName.str(), &CGM.getModule());
2018 // Always resolve references to the wrapper at link time.
2019 if (!Wrapper->hasLocalLinkage() && !isThreadWrapperReplaceable(VD, CGM))
2020 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
2024 void ItaniumCXXABI::EmitThreadLocalInitFuncs(
2026 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
2027 CXXThreadLocals, ArrayRef<llvm::Function *> CXXThreadLocalInits,
2028 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) {
2029 llvm::Function *InitFunc = nullptr;
2030 if (!CXXThreadLocalInits.empty()) {
2031 // Generate a guarded initialization function.
2032 llvm::FunctionType *FTy =
2033 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
2034 InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init",
2037 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
2038 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
2039 llvm::GlobalVariable::InternalLinkage,
2040 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
2041 Guard->setThreadLocal(true);
2042 CodeGenFunction(CGM)
2043 .GenerateCXXGlobalInitFunc(InitFunc, CXXThreadLocalInits, Guard);
2045 for (unsigned I = 0, N = CXXThreadLocals.size(); I != N; ++I) {
2046 const VarDecl *VD = CXXThreadLocals[I].first;
2047 llvm::GlobalVariable *Var = CXXThreadLocals[I].second;
2049 // Some targets require that all access to thread local variables go through
2050 // the thread wrapper. This means that we cannot attempt to create a thread
2051 // wrapper or a thread helper.
2052 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
2055 // Mangle the name for the thread_local initialization function.
2056 SmallString<256> InitFnName;
2058 llvm::raw_svector_ostream Out(InitFnName);
2059 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
2063 // If we have a definition for the variable, emit the initialization
2064 // function as an alias to the global Init function (if any). Otherwise,
2065 // produce a declaration of the initialization function.
2066 llvm::GlobalValue *Init = nullptr;
2067 bool InitIsInitFunc = false;
2068 if (VD->hasDefinition()) {
2069 InitIsInitFunc = true;
2071 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
2074 // Emit a weak global function referring to the initialization function.
2075 // This function will not exist if the TU defining the thread_local
2076 // variable in question does not need any dynamic initialization for
2077 // its thread_local variables.
2078 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
2079 Init = llvm::Function::Create(
2080 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
2085 Init->setVisibility(Var->getVisibility());
2087 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
2088 llvm::LLVMContext &Context = CGM.getModule().getContext();
2089 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
2090 CGBuilderTy Builder(Entry);
2091 if (InitIsInitFunc) {
2093 Builder.CreateCall(Init, {});
2095 // Don't know whether we have an init function. Call it if it exists.
2096 llvm::Value *Have = Builder.CreateIsNotNull(Init);
2097 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2098 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2099 Builder.CreateCondBr(Have, InitBB, ExitBB);
2101 Builder.SetInsertPoint(InitBB);
2102 Builder.CreateCall(Init, {});
2103 Builder.CreateBr(ExitBB);
2105 Builder.SetInsertPoint(ExitBB);
2108 // For a reference, the result of the wrapper function is a pointer to
2109 // the referenced object.
2110 llvm::Value *Val = Var;
2111 if (VD->getType()->isReferenceType()) {
2112 llvm::LoadInst *LI = Builder.CreateLoad(Val);
2113 LI->setAlignment(CGM.getContext().getDeclAlign(VD).getQuantity());
2116 if (Val->getType() != Wrapper->getReturnType())
2117 Val = Builder.CreatePointerBitCastOrAddrSpaceCast(
2118 Val, Wrapper->getReturnType(), "");
2119 Builder.CreateRet(Val);
2123 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2125 QualType LValType) {
2126 QualType T = VD->getType();
2127 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
2128 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
2129 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
2131 Val = CGF.Builder.CreateCall(Wrapper, {});
2134 if (VD->getType()->isReferenceType())
2135 LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType);
2137 LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD));
2138 // FIXME: need setObjCGCLValueClass?
2142 /// Return whether the given global decl needs a VTT parameter, which it does
2143 /// if it's a base constructor or destructor with virtual bases.
2144 bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
2145 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
2147 // We don't have any virtual bases, just return early.
2148 if (!MD->getParent()->getNumVBases())
2151 // Check if we have a base constructor.
2152 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
2155 // Check if we have a base destructor.
2156 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2163 class ItaniumRTTIBuilder {
2164 CodeGenModule &CGM; // Per-module state.
2165 llvm::LLVMContext &VMContext;
2166 const ItaniumCXXABI &CXXABI; // Per-module state.
2168 /// Fields - The fields of the RTTI descriptor currently being built.
2169 SmallVector<llvm::Constant *, 16> Fields;
2171 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2172 llvm::GlobalVariable *
2173 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2175 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2176 /// descriptor of the given type.
2177 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2179 /// BuildVTablePointer - Build the vtable pointer for the given type.
2180 void BuildVTablePointer(const Type *Ty);
2182 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2183 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2184 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2186 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2187 /// classes with bases that do not satisfy the abi::__si_class_type_info
2188 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2189 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2191 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2192 /// for pointer types.
2193 void BuildPointerTypeInfo(QualType PointeeTy);
2195 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2196 /// type_info for an object type.
2197 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2199 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2200 /// struct, used for member pointer types.
2201 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2204 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2205 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2207 // Pointer type info flags.
2209 /// PTI_Const - Type has const qualifier.
2212 /// PTI_Volatile - Type has volatile qualifier.
2215 /// PTI_Restrict - Type has restrict qualifier.
2218 /// PTI_Incomplete - Type is incomplete.
2219 PTI_Incomplete = 0x8,
2221 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2222 /// (in pointer to member).
2223 PTI_ContainingClassIncomplete = 0x10
2226 // VMI type info flags.
2228 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2229 VMI_NonDiamondRepeat = 0x1,
2231 /// VMI_DiamondShaped - Class is diamond shaped.
2232 VMI_DiamondShaped = 0x2
2235 // Base class type info flags.
2237 /// BCTI_Virtual - Base class is virtual.
2240 /// BCTI_Public - Base class is public.
2244 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2246 /// \param Force - true to force the creation of this RTTI value
2247 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2251 llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2252 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
2253 SmallString<256> OutName;
2254 llvm::raw_svector_ostream Out(OutName);
2255 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
2257 StringRef Name = OutName.str();
2259 // We know that the mangled name of the type starts at index 4 of the
2260 // mangled name of the typename, so we can just index into it in order to
2261 // get the mangled name of the type.
2262 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2265 llvm::GlobalVariable *GV =
2266 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2268 GV->setInitializer(Init);
2274 ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2275 // Mangle the RTTI name.
2276 SmallString<256> OutName;
2277 llvm::raw_svector_ostream Out(OutName);
2278 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2280 StringRef Name = OutName.str();
2282 // Look for an existing global.
2283 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2286 // Create a new global variable.
2287 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2289 llvm::GlobalValue::ExternalLinkage, nullptr,
2291 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2292 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2293 if (RD->hasAttr<DLLImportAttr>())
2294 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2298 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2301 /// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2302 /// info for that type is defined in the standard library.
2303 static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2304 // Itanium C++ ABI 2.9.2:
2305 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2306 // the run-time support library. Specifically, the run-time support
2307 // library should contain type_info objects for the types X, X* and
2308 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2309 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2310 // long, unsigned long, long long, unsigned long long, float, double,
2311 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2312 // half-precision floating point types.
2313 switch (Ty->getKind()) {
2314 case BuiltinType::Void:
2315 case BuiltinType::NullPtr:
2316 case BuiltinType::Bool:
2317 case BuiltinType::WChar_S:
2318 case BuiltinType::WChar_U:
2319 case BuiltinType::Char_U:
2320 case BuiltinType::Char_S:
2321 case BuiltinType::UChar:
2322 case BuiltinType::SChar:
2323 case BuiltinType::Short:
2324 case BuiltinType::UShort:
2325 case BuiltinType::Int:
2326 case BuiltinType::UInt:
2327 case BuiltinType::Long:
2328 case BuiltinType::ULong:
2329 case BuiltinType::LongLong:
2330 case BuiltinType::ULongLong:
2331 case BuiltinType::Half:
2332 case BuiltinType::Float:
2333 case BuiltinType::Double:
2334 case BuiltinType::LongDouble:
2335 case BuiltinType::Char16:
2336 case BuiltinType::Char32:
2337 case BuiltinType::Int128:
2338 case BuiltinType::UInt128:
2339 case BuiltinType::OCLImage1d:
2340 case BuiltinType::OCLImage1dArray:
2341 case BuiltinType::OCLImage1dBuffer:
2342 case BuiltinType::OCLImage2d:
2343 case BuiltinType::OCLImage2dArray:
2344 case BuiltinType::OCLImage3d:
2345 case BuiltinType::OCLSampler:
2346 case BuiltinType::OCLEvent:
2349 case BuiltinType::Dependent:
2350 #define BUILTIN_TYPE(Id, SingletonId)
2351 #define PLACEHOLDER_TYPE(Id, SingletonId) \
2352 case BuiltinType::Id:
2353 #include "clang/AST/BuiltinTypes.def"
2354 llvm_unreachable("asking for RRTI for a placeholder type!");
2356 case BuiltinType::ObjCId:
2357 case BuiltinType::ObjCClass:
2358 case BuiltinType::ObjCSel:
2359 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2362 llvm_unreachable("Invalid BuiltinType Kind!");
2365 static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2366 QualType PointeeTy = PointerTy->getPointeeType();
2367 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2371 // Check the qualifiers.
2372 Qualifiers Quals = PointeeTy.getQualifiers();
2373 Quals.removeConst();
2378 return TypeInfoIsInStandardLibrary(BuiltinTy);
2381 /// IsStandardLibraryRTTIDescriptor - Returns whether the type
2382 /// information for the given type exists in the standard library.
2383 static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2384 // Type info for builtin types is defined in the standard library.
2385 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2386 return TypeInfoIsInStandardLibrary(BuiltinTy);
2388 // Type info for some pointer types to builtin types is defined in the
2389 // standard library.
2390 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2391 return TypeInfoIsInStandardLibrary(PointerTy);
2396 /// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2397 /// the given type exists somewhere else, and that we should not emit the type
2398 /// information in this translation unit. Assumes that it is not a
2399 /// standard-library type.
2400 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2402 ASTContext &Context = CGM.getContext();
2404 // If RTTI is disabled, assume it might be disabled in the
2405 // translation unit that defines any potential key function, too.
2406 if (!Context.getLangOpts().RTTI) return false;
2408 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2409 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2410 if (!RD->hasDefinition())
2413 if (!RD->isDynamicClass())
2416 // FIXME: this may need to be reconsidered if the key function
2418 if (CGM.getVTables().isVTableExternal(RD))
2421 if (RD->hasAttr<DLLImportAttr>())
2428 /// IsIncompleteClassType - Returns whether the given record type is incomplete.
2429 static bool IsIncompleteClassType(const RecordType *RecordTy) {
2430 return !RecordTy->getDecl()->isCompleteDefinition();
2433 /// ContainsIncompleteClassType - Returns whether the given type contains an
2434 /// incomplete class type. This is true if
2436 /// * The given type is an incomplete class type.
2437 /// * The given type is a pointer type whose pointee type contains an
2438 /// incomplete class type.
2439 /// * The given type is a member pointer type whose class is an incomplete
2441 /// * The given type is a member pointer type whoise pointee type contains an
2442 /// incomplete class type.
2443 /// is an indirect or direct pointer to an incomplete class type.
2444 static bool ContainsIncompleteClassType(QualType Ty) {
2445 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2446 if (IsIncompleteClassType(RecordTy))
2450 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2451 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2453 if (const MemberPointerType *MemberPointerTy =
2454 dyn_cast<MemberPointerType>(Ty)) {
2455 // Check if the class type is incomplete.
2456 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2457 if (IsIncompleteClassType(ClassType))
2460 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2466 // CanUseSingleInheritance - Return whether the given record decl has a "single,
2467 // public, non-virtual base at offset zero (i.e. the derived class is dynamic
2468 // iff the base is)", according to Itanium C++ ABI, 2.95p6b.
2469 static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2470 // Check the number of bases.
2471 if (RD->getNumBases() != 1)
2475 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2477 // Check that the base is not virtual.
2478 if (Base->isVirtual())
2481 // Check that the base is public.
2482 if (Base->getAccessSpecifier() != AS_public)
2485 // Check that the class is dynamic iff the base is.
2486 const CXXRecordDecl *BaseDecl =
2487 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2488 if (!BaseDecl->isEmpty() &&
2489 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2495 void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2496 // abi::__class_type_info.
2497 static const char * const ClassTypeInfo =
2498 "_ZTVN10__cxxabiv117__class_type_infoE";
2499 // abi::__si_class_type_info.
2500 static const char * const SIClassTypeInfo =
2501 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2502 // abi::__vmi_class_type_info.
2503 static const char * const VMIClassTypeInfo =
2504 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2506 const char *VTableName = nullptr;
2508 switch (Ty->getTypeClass()) {
2509 #define TYPE(Class, Base)
2510 #define ABSTRACT_TYPE(Class, Base)
2511 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2512 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2513 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2514 #include "clang/AST/TypeNodes.def"
2515 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2517 case Type::LValueReference:
2518 case Type::RValueReference:
2519 llvm_unreachable("References shouldn't get here");
2522 llvm_unreachable("Undeduced auto type shouldn't get here");
2525 // GCC treats vector and complex types as fundamental types.
2527 case Type::ExtVector:
2530 // FIXME: GCC treats block pointers as fundamental types?!
2531 case Type::BlockPointer:
2532 // abi::__fundamental_type_info.
2533 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2536 case Type::ConstantArray:
2537 case Type::IncompleteArray:
2538 case Type::VariableArray:
2539 // abi::__array_type_info.
2540 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2543 case Type::FunctionNoProto:
2544 case Type::FunctionProto:
2545 // abi::__function_type_info.
2546 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2550 // abi::__enum_type_info.
2551 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2554 case Type::Record: {
2555 const CXXRecordDecl *RD =
2556 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2558 if (!RD->hasDefinition() || !RD->getNumBases()) {
2559 VTableName = ClassTypeInfo;
2560 } else if (CanUseSingleInheritance(RD)) {
2561 VTableName = SIClassTypeInfo;
2563 VTableName = VMIClassTypeInfo;
2569 case Type::ObjCObject:
2570 // Ignore protocol qualifiers.
2571 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2573 // Handle id and Class.
2574 if (isa<BuiltinType>(Ty)) {
2575 VTableName = ClassTypeInfo;
2579 assert(isa<ObjCInterfaceType>(Ty));
2582 case Type::ObjCInterface:
2583 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2584 VTableName = SIClassTypeInfo;
2586 VTableName = ClassTypeInfo;
2590 case Type::ObjCObjectPointer:
2592 // abi::__pointer_type_info.
2593 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2596 case Type::MemberPointer:
2597 // abi::__pointer_to_member_type_info.
2598 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2602 llvm::Constant *VTable =
2603 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2605 llvm::Type *PtrDiffTy =
2606 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2608 // The vtable address point is 2.
2609 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
2611 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two);
2612 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2614 Fields.push_back(VTable);
2617 /// \brief Return the linkage that the type info and type info name constants
2618 /// should have for the given type.
2619 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2621 // Itanium C++ ABI 2.9.5p7:
2622 // In addition, it and all of the intermediate abi::__pointer_type_info
2623 // structs in the chain down to the abi::__class_type_info for the
2624 // incomplete class type must be prevented from resolving to the
2625 // corresponding type_info structs for the complete class type, possibly
2626 // by making them local static objects. Finally, a dummy class RTTI is
2627 // generated for the incomplete type that will not resolve to the final
2628 // complete class RTTI (because the latter need not exist), possibly by
2629 // making it a local static object.
2630 if (ContainsIncompleteClassType(Ty))
2631 return llvm::GlobalValue::InternalLinkage;
2633 switch (Ty->getLinkage()) {
2635 case InternalLinkage:
2636 case UniqueExternalLinkage:
2637 return llvm::GlobalValue::InternalLinkage;
2639 case VisibleNoLinkage:
2640 case ExternalLinkage:
2641 if (!CGM.getLangOpts().RTTI) {
2642 // RTTI is not enabled, which means that this type info struct is going
2643 // to be used for exception handling. Give it linkonce_odr linkage.
2644 return llvm::GlobalValue::LinkOnceODRLinkage;
2647 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2648 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2649 if (RD->hasAttr<WeakAttr>())
2650 return llvm::GlobalValue::WeakODRLinkage;
2651 if (RD->isDynamicClass())
2652 return CGM.getVTableLinkage(RD);
2655 return llvm::GlobalValue::LinkOnceODRLinkage;
2658 llvm_unreachable("Invalid linkage!");
2661 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2662 // We want to operate on the canonical type.
2663 Ty = CGM.getContext().getCanonicalType(Ty);
2665 // Check if we've already emitted an RTTI descriptor for this type.
2666 SmallString<256> OutName;
2667 llvm::raw_svector_ostream Out(OutName);
2668 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2670 StringRef Name = OutName.str();
2672 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2673 if (OldGV && !OldGV->isDeclaration()) {
2674 assert(!OldGV->hasAvailableExternallyLinkage() &&
2675 "available_externally typeinfos not yet implemented");
2677 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2680 // Check if there is already an external RTTI descriptor for this type.
2681 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2682 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2683 return GetAddrOfExternalRTTIDescriptor(Ty);
2685 // Emit the standard library with external linkage.
2686 llvm::GlobalVariable::LinkageTypes Linkage;
2688 Linkage = llvm::GlobalValue::ExternalLinkage;
2690 Linkage = getTypeInfoLinkage(CGM, Ty);
2692 // Add the vtable pointer.
2693 BuildVTablePointer(cast<Type>(Ty));
2696 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2697 llvm::Constant *TypeNameField;
2699 // If we're supposed to demote the visibility, be sure to set a flag
2700 // to use a string comparison for type_info comparisons.
2701 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2702 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2703 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2704 // The flag is the sign bit, which on ARM64 is defined to be clear
2705 // for global pointers. This is very ARM64-specific.
2706 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2707 llvm::Constant *flag =
2708 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2709 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2711 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2713 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2715 Fields.push_back(TypeNameField);
2717 switch (Ty->getTypeClass()) {
2718 #define TYPE(Class, Base)
2719 #define ABSTRACT_TYPE(Class, Base)
2720 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2721 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2722 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2723 #include "clang/AST/TypeNodes.def"
2724 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2726 // GCC treats vector types as fundamental types.
2729 case Type::ExtVector:
2731 case Type::BlockPointer:
2732 // Itanium C++ ABI 2.9.5p4:
2733 // abi::__fundamental_type_info adds no data members to std::type_info.
2736 case Type::LValueReference:
2737 case Type::RValueReference:
2738 llvm_unreachable("References shouldn't get here");
2741 llvm_unreachable("Undeduced auto type shouldn't get here");
2743 case Type::ConstantArray:
2744 case Type::IncompleteArray:
2745 case Type::VariableArray:
2746 // Itanium C++ ABI 2.9.5p5:
2747 // abi::__array_type_info adds no data members to std::type_info.
2750 case Type::FunctionNoProto:
2751 case Type::FunctionProto:
2752 // Itanium C++ ABI 2.9.5p5:
2753 // abi::__function_type_info adds no data members to std::type_info.
2757 // Itanium C++ ABI 2.9.5p5:
2758 // abi::__enum_type_info adds no data members to std::type_info.
2761 case Type::Record: {
2762 const CXXRecordDecl *RD =
2763 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2764 if (!RD->hasDefinition() || !RD->getNumBases()) {
2765 // We don't need to emit any fields.
2769 if (CanUseSingleInheritance(RD))
2770 BuildSIClassTypeInfo(RD);
2772 BuildVMIClassTypeInfo(RD);
2777 case Type::ObjCObject:
2778 case Type::ObjCInterface:
2779 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
2782 case Type::ObjCObjectPointer:
2783 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
2787 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
2790 case Type::MemberPointer:
2791 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
2795 // No fields, at least for the moment.
2799 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2801 llvm::Module &M = CGM.getModule();
2802 llvm::GlobalVariable *GV =
2803 new llvm::GlobalVariable(M, Init->getType(),
2804 /*Constant=*/true, Linkage, Init, Name);
2806 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
2807 GV->setComdat(M.getOrInsertComdat(GV->getName()));
2809 // If there's already an old global variable, replace it with the new one.
2811 GV->takeName(OldGV);
2812 llvm::Constant *NewPtr =
2813 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
2814 OldGV->replaceAllUsesWith(NewPtr);
2815 OldGV->eraseFromParent();
2818 // The Itanium ABI specifies that type_info objects must be globally
2819 // unique, with one exception: if the type is an incomplete class
2820 // type or a (possibly indirect) pointer to one. That exception
2821 // affects the general case of comparing type_info objects produced
2822 // by the typeid operator, which is why the comparison operators on
2823 // std::type_info generally use the type_info name pointers instead
2824 // of the object addresses. However, the language's built-in uses
2825 // of RTTI generally require class types to be complete, even when
2826 // manipulating pointers to those class types. This allows the
2827 // implementation of dynamic_cast to rely on address equality tests,
2828 // which is much faster.
2830 // All of this is to say that it's important that both the type_info
2831 // object and the type_info name be uniqued when weakly emitted.
2833 // Give the type_info object and name the formal visibility of the
2835 llvm::GlobalValue::VisibilityTypes llvmVisibility;
2836 if (llvm::GlobalValue::isLocalLinkage(Linkage))
2837 // If the linkage is local, only default visibility makes sense.
2838 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
2839 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
2840 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
2842 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
2843 TypeName->setVisibility(llvmVisibility);
2844 GV->setVisibility(llvmVisibility);
2846 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2849 /// ComputeQualifierFlags - Compute the pointer type info flags from the
2850 /// given qualifier.
2851 static unsigned ComputeQualifierFlags(Qualifiers Quals) {
2854 if (Quals.hasConst())
2855 Flags |= ItaniumRTTIBuilder::PTI_Const;
2856 if (Quals.hasVolatile())
2857 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
2858 if (Quals.hasRestrict())
2859 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
2864 /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
2865 /// for the given Objective-C object type.
2866 void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
2868 const Type *T = OT->getBaseType().getTypePtr();
2869 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
2871 // The builtin types are abi::__class_type_infos and don't require
2873 if (isa<BuiltinType>(T)) return;
2875 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
2876 ObjCInterfaceDecl *Super = Class->getSuperClass();
2878 // Root classes are also __class_type_info.
2881 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
2883 // Everything else is single inheritance.
2884 llvm::Constant *BaseTypeInfo =
2885 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
2886 Fields.push_back(BaseTypeInfo);
2889 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2890 /// inheritance, according to the Itanium C++ ABI, 2.95p6b.
2891 void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
2892 // Itanium C++ ABI 2.9.5p6b:
2893 // It adds to abi::__class_type_info a single member pointing to the
2894 // type_info structure for the base type,
2895 llvm::Constant *BaseTypeInfo =
2896 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
2897 Fields.push_back(BaseTypeInfo);
2901 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
2902 /// a class hierarchy.
2904 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
2905 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
2909 /// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
2910 /// abi::__vmi_class_type_info.
2912 static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
2917 const CXXRecordDecl *BaseDecl =
2918 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2920 if (Base->isVirtual()) {
2921 // Mark the virtual base as seen.
2922 if (!Bases.VirtualBases.insert(BaseDecl).second) {
2923 // If this virtual base has been seen before, then the class is diamond
2925 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
2927 if (Bases.NonVirtualBases.count(BaseDecl))
2928 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2931 // Mark the non-virtual base as seen.
2932 if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
2933 // If this non-virtual base has been seen before, then the class has non-
2934 // diamond shaped repeated inheritance.
2935 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2937 if (Bases.VirtualBases.count(BaseDecl))
2938 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2943 for (const auto &I : BaseDecl->bases())
2944 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2949 static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
2954 for (const auto &I : RD->bases())
2955 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2960 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2961 /// classes with bases that do not satisfy the abi::__si_class_type_info
2962 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2963 void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
2964 llvm::Type *UnsignedIntLTy =
2965 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2967 // Itanium C++ ABI 2.9.5p6c:
2968 // __flags is a word with flags describing details about the class
2969 // structure, which may be referenced by using the __flags_masks
2970 // enumeration. These flags refer to both direct and indirect bases.
2971 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
2972 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2974 // Itanium C++ ABI 2.9.5p6c:
2975 // __base_count is a word with the number of direct proper base class
2976 // descriptions that follow.
2977 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
2979 if (!RD->getNumBases())
2982 llvm::Type *LongLTy =
2983 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
2985 // Now add the base class descriptions.
2987 // Itanium C++ ABI 2.9.5p6c:
2988 // __base_info[] is an array of base class descriptions -- one for every
2989 // direct proper base. Each description is of the type:
2991 // struct abi::__base_class_type_info {
2993 // const __class_type_info *__base_type;
2994 // long __offset_flags;
2996 // enum __offset_flags_masks {
2997 // __virtual_mask = 0x1,
2998 // __public_mask = 0x2,
2999 // __offset_shift = 8
3002 for (const auto &Base : RD->bases()) {
3003 // The __base_type member points to the RTTI for the base type.
3004 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
3006 const CXXRecordDecl *BaseDecl =
3007 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
3009 int64_t OffsetFlags = 0;
3011 // All but the lower 8 bits of __offset_flags are a signed offset.
3012 // For a non-virtual base, this is the offset in the object of the base
3013 // subobject. For a virtual base, this is the offset in the virtual table of
3014 // the virtual base offset for the virtual base referenced (negative).
3016 if (Base.isVirtual())
3018 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
3020 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
3021 Offset = Layout.getBaseClassOffset(BaseDecl);
3024 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
3026 // The low-order byte of __offset_flags contains flags, as given by the
3027 // masks from the enumeration __offset_flags_masks.
3028 if (Base.isVirtual())
3029 OffsetFlags |= BCTI_Virtual;
3030 if (Base.getAccessSpecifier() == AS_public)
3031 OffsetFlags |= BCTI_Public;
3033 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
3037 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
3038 /// used for pointer types.
3039 void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
3041 QualType UnqualifiedPointeeTy =
3042 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3044 // Itanium C++ ABI 2.9.5p7:
3045 // __flags is a flag word describing the cv-qualification and other
3046 // attributes of the type pointed to
3047 unsigned Flags = ComputeQualifierFlags(Quals);
3049 // Itanium C++ ABI 2.9.5p7:
3050 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3051 // incomplete class type, the incomplete target type flag is set.
3052 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3053 Flags |= PTI_Incomplete;
3055 llvm::Type *UnsignedIntLTy =
3056 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3057 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3059 // Itanium C++ ABI 2.9.5p7:
3060 // __pointee is a pointer to the std::type_info derivation for the
3061 // unqualified type being pointed to.
3062 llvm::Constant *PointeeTypeInfo =
3063 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3064 Fields.push_back(PointeeTypeInfo);
3067 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
3068 /// struct, used for member pointer types.
3070 ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
3071 QualType PointeeTy = Ty->getPointeeType();
3074 QualType UnqualifiedPointeeTy =
3075 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3077 // Itanium C++ ABI 2.9.5p7:
3078 // __flags is a flag word describing the cv-qualification and other
3079 // attributes of the type pointed to.
3080 unsigned Flags = ComputeQualifierFlags(Quals);
3082 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
3084 // Itanium C++ ABI 2.9.5p7:
3085 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3086 // incomplete class type, the incomplete target type flag is set.
3087 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3088 Flags |= PTI_Incomplete;
3090 if (IsIncompleteClassType(ClassType))
3091 Flags |= PTI_ContainingClassIncomplete;
3093 llvm::Type *UnsignedIntLTy =
3094 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3095 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3097 // Itanium C++ ABI 2.9.5p7:
3098 // __pointee is a pointer to the std::type_info derivation for the
3099 // unqualified type being pointed to.
3100 llvm::Constant *PointeeTypeInfo =
3101 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3102 Fields.push_back(PointeeTypeInfo);
3104 // Itanium C++ ABI 2.9.5p9:
3105 // __context is a pointer to an abi::__class_type_info corresponding to the
3106 // class type containing the member pointed to
3107 // (e.g., the "A" in "int A::*").
3109 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
3112 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
3113 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
3116 void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
3117 QualType PointerType = getContext().getPointerType(Type);
3118 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
3119 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
3120 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
3121 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
3124 void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
3125 QualType FundamentalTypes[] = {
3126 getContext().VoidTy, getContext().NullPtrTy,
3127 getContext().BoolTy, getContext().WCharTy,
3128 getContext().CharTy, getContext().UnsignedCharTy,
3129 getContext().SignedCharTy, getContext().ShortTy,
3130 getContext().UnsignedShortTy, getContext().IntTy,
3131 getContext().UnsignedIntTy, getContext().LongTy,
3132 getContext().UnsignedLongTy, getContext().LongLongTy,
3133 getContext().UnsignedLongLongTy, getContext().HalfTy,
3134 getContext().FloatTy, getContext().DoubleTy,
3135 getContext().LongDoubleTy, getContext().Char16Ty,
3136 getContext().Char32Ty,
3138 for (const QualType &FundamentalType : FundamentalTypes)
3139 EmitFundamentalRTTIDescriptor(FundamentalType);
3142 /// What sort of uniqueness rules should we use for the RTTI for the
3144 ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
3145 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
3146 if (shouldRTTIBeUnique())
3149 // It's only necessary for linkonce_odr or weak_odr linkage.
3150 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
3151 Linkage != llvm::GlobalValue::WeakODRLinkage)
3154 // It's only necessary with default visibility.
3155 if (CanTy->getVisibility() != DefaultVisibility)
3158 // If we're not required to publish this symbol, hide it.
3159 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3160 return RUK_NonUniqueHidden;
3162 // If we're required to publish this symbol, as we might be under an
3163 // explicit instantiation, leave it with default visibility but
3164 // enable string-comparisons.
3165 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
3166 return RUK_NonUniqueVisible;
3169 // Find out how to codegen the complete destructor and constructor
3171 enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
3173 static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
3174 const CXXMethodDecl *MD) {
3175 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
3176 return StructorCodegen::Emit;
3178 // The complete and base structors are not equivalent if there are any virtual
3179 // bases, so emit separate functions.
3180 if (MD->getParent()->getNumVBases())
3181 return StructorCodegen::Emit;
3183 GlobalDecl AliasDecl;
3184 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
3185 AliasDecl = GlobalDecl(DD, Dtor_Complete);
3187 const auto *CD = cast<CXXConstructorDecl>(MD);
3188 AliasDecl = GlobalDecl(CD, Ctor_Complete);
3190 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3192 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
3193 return StructorCodegen::RAUW;
3195 // FIXME: Should we allow available_externally aliases?
3196 if (!llvm::GlobalAlias::isValidLinkage(Linkage))
3197 return StructorCodegen::RAUW;
3199 if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
3200 // Only ELF supports COMDATs with arbitrary names (C5/D5).
3201 if (CGM.getTarget().getTriple().isOSBinFormatELF())
3202 return StructorCodegen::COMDAT;
3203 return StructorCodegen::Emit;
3206 return StructorCodegen::Alias;
3209 static void emitConstructorDestructorAlias(CodeGenModule &CGM,
3210 GlobalDecl AliasDecl,
3211 GlobalDecl TargetDecl) {
3212 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3214 StringRef MangledName = CGM.getMangledName(AliasDecl);
3215 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
3216 if (Entry && !Entry->isDeclaration())
3219 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
3220 llvm::PointerType *AliasType = Aliasee->getType();
3222 // Create the alias with no name.
3223 auto *Alias = llvm::GlobalAlias::create(AliasType, Linkage, "", Aliasee,
3226 // Switch any previous uses to the alias.
3228 assert(Entry->getType() == AliasType &&
3229 "declaration exists with different type");
3230 Alias->takeName(Entry);
3231 Entry->replaceAllUsesWith(Alias);
3232 Entry->eraseFromParent();
3234 Alias->setName(MangledName);
3237 // Finally, set up the alias with its proper name and attributes.
3238 CGM.setAliasAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias);
3241 void ItaniumCXXABI::emitCXXStructor(const CXXMethodDecl *MD,
3242 StructorType Type) {
3243 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
3244 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
3246 StructorCodegen CGType = getCodegenToUse(CGM, MD);
3248 if (Type == StructorType::Complete) {
3249 GlobalDecl CompleteDecl;
3250 GlobalDecl BaseDecl;
3252 CompleteDecl = GlobalDecl(CD, Ctor_Complete);
3253 BaseDecl = GlobalDecl(CD, Ctor_Base);
3255 CompleteDecl = GlobalDecl(DD, Dtor_Complete);
3256 BaseDecl = GlobalDecl(DD, Dtor_Base);
3259 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
3260 emitConstructorDestructorAlias(CGM, CompleteDecl, BaseDecl);
3264 if (CGType == StructorCodegen::RAUW) {
3265 StringRef MangledName = CGM.getMangledName(CompleteDecl);
3266 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(BaseDecl));
3267 CGM.addReplacement(MangledName, Aliasee);
3272 // The base destructor is equivalent to the base destructor of its
3273 // base class if there is exactly one non-virtual base class with a
3274 // non-trivial destructor, there are no fields with a non-trivial
3275 // destructor, and the body of the destructor is trivial.
3276 if (DD && Type == StructorType::Base && CGType != StructorCodegen::COMDAT &&
3277 !CGM.TryEmitBaseDestructorAsAlias(DD))
3280 llvm::Function *Fn = CGM.codegenCXXStructor(MD, Type);
3282 if (CGType == StructorCodegen::COMDAT) {
3283 SmallString<256> Buffer;
3284 llvm::raw_svector_ostream Out(Buffer);
3286 getMangleContext().mangleCXXDtorComdat(DD, Out);
3288 getMangleContext().mangleCXXCtorComdat(CD, Out);
3289 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
3292 CGM.maybeSetTrivialComdat(*MD, *Fn);
3296 static llvm::Constant *getBeginCatchFn(CodeGenModule &CGM) {
3297 // void *__cxa_begin_catch(void*);
3298 llvm::FunctionType *FTy = llvm::FunctionType::get(
3299 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3301 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
3304 static llvm::Constant *getEndCatchFn(CodeGenModule &CGM) {
3305 // void __cxa_end_catch();
3306 llvm::FunctionType *FTy =
3307 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
3309 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
3312 static llvm::Constant *getGetExceptionPtrFn(CodeGenModule &CGM) {
3313 // void *__cxa_get_exception_ptr(void*);
3314 llvm::FunctionType *FTy = llvm::FunctionType::get(
3315 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3317 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
3321 /// A cleanup to call __cxa_end_catch. In many cases, the caught
3322 /// exception type lets us state definitively that the thrown exception
3323 /// type does not have a destructor. In particular:
3324 /// - Catch-alls tell us nothing, so we have to conservatively
3325 /// assume that the thrown exception might have a destructor.
3326 /// - Catches by reference behave according to their base types.
3327 /// - Catches of non-record types will only trigger for exceptions
3328 /// of non-record types, which never have destructors.
3329 /// - Catches of record types can trigger for arbitrary subclasses
3330 /// of the caught type, so we have to assume the actual thrown
3331 /// exception type might have a throwing destructor, even if the
3332 /// caught type's destructor is trivial or nothrow.
3333 struct CallEndCatch : EHScopeStack::Cleanup {
3334 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
3337 void Emit(CodeGenFunction &CGF, Flags flags) override {
3339 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
3343 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
3348 /// Emits a call to __cxa_begin_catch and enters a cleanup to call
3349 /// __cxa_end_catch.
3351 /// \param EndMightThrow - true if __cxa_end_catch might throw
3352 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
3354 bool EndMightThrow) {
3355 llvm::CallInst *call =
3356 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
3358 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
3363 /// A "special initializer" callback for initializing a catch
3364 /// parameter during catch initialization.
3365 static void InitCatchParam(CodeGenFunction &CGF,
3366 const VarDecl &CatchParam,
3367 llvm::Value *ParamAddr,
3368 SourceLocation Loc) {
3369 // Load the exception from where the landing pad saved it.
3370 llvm::Value *Exn = CGF.getExceptionFromSlot();
3372 CanQualType CatchType =
3373 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
3374 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
3376 // If we're catching by reference, we can just cast the object
3377 // pointer to the appropriate pointer.
3378 if (isa<ReferenceType>(CatchType)) {
3379 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
3380 bool EndCatchMightThrow = CaughtType->isRecordType();
3382 // __cxa_begin_catch returns the adjusted object pointer.
3383 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
3385 // We have no way to tell the personality function that we're
3386 // catching by reference, so if we're catching a pointer,
3387 // __cxa_begin_catch will actually return that pointer by value.
3388 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
3389 QualType PointeeType = PT->getPointeeType();
3391 // When catching by reference, generally we should just ignore
3392 // this by-value pointer and use the exception object instead.
3393 if (!PointeeType->isRecordType()) {
3395 // Exn points to the struct _Unwind_Exception header, which
3396 // we have to skip past in order to reach the exception data.
3397 unsigned HeaderSize =
3398 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
3399 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize);
3401 // However, if we're catching a pointer-to-record type that won't
3402 // work, because the personality function might have adjusted
3403 // the pointer. There's actually no way for us to fully satisfy
3404 // the language/ABI contract here: we can't use Exn because it
3405 // might have the wrong adjustment, but we can't use the by-value
3406 // pointer because it's off by a level of abstraction.
3408 // The current solution is to dump the adjusted pointer into an
3409 // alloca, which breaks language semantics (because changing the
3410 // pointer doesn't change the exception) but at least works.
3411 // The better solution would be to filter out non-exact matches
3412 // and rethrow them, but this is tricky because the rethrow
3413 // really needs to be catchable by other sites at this landing
3414 // pad. The best solution is to fix the personality function.
3416 // Pull the pointer for the reference type off.
3418 cast<llvm::PointerType>(LLVMCatchTy)->getElementType();
3420 // Create the temporary and write the adjusted pointer into it.
3421 llvm::Value *ExnPtrTmp = CGF.CreateTempAlloca(PtrTy, "exn.byref.tmp");
3422 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3423 CGF.Builder.CreateStore(Casted, ExnPtrTmp);
3425 // Bind the reference to the temporary.
3426 AdjustedExn = ExnPtrTmp;
3430 llvm::Value *ExnCast =
3431 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
3432 CGF.Builder.CreateStore(ExnCast, ParamAddr);
3436 // Scalars and complexes.
3437 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
3438 if (TEK != TEK_Aggregate) {
3439 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
3441 // If the catch type is a pointer type, __cxa_begin_catch returns
3442 // the pointer by value.
3443 if (CatchType->hasPointerRepresentation()) {
3444 llvm::Value *CastExn =
3445 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
3447 switch (CatchType.getQualifiers().getObjCLifetime()) {
3448 case Qualifiers::OCL_Strong:
3449 CastExn = CGF.EmitARCRetainNonBlock(CastExn);
3452 case Qualifiers::OCL_None:
3453 case Qualifiers::OCL_ExplicitNone:
3454 case Qualifiers::OCL_Autoreleasing:
3455 CGF.Builder.CreateStore(CastExn, ParamAddr);
3458 case Qualifiers::OCL_Weak:
3459 CGF.EmitARCInitWeak(ParamAddr, CastExn);
3462 llvm_unreachable("bad ownership qualifier!");
3465 // Otherwise, it returns a pointer into the exception object.
3467 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3468 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3470 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType);
3471 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType,
3472 CGF.getContext().getDeclAlign(&CatchParam));
3475 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
3479 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
3480 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
3484 llvm_unreachable("evaluation kind filtered out!");
3486 llvm_unreachable("bad evaluation kind");
3489 assert(isa<RecordType>(CatchType) && "unexpected catch type!");
3491 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3493 // Check for a copy expression. If we don't have a copy expression,
3494 // that means a trivial copy is okay.
3495 const Expr *copyExpr = CatchParam.getInit();
3497 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
3498 llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
3499 CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType);
3503 // We have to call __cxa_get_exception_ptr to get the adjusted
3504 // pointer before copying.
3505 llvm::CallInst *rawAdjustedExn =
3506 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
3508 // Cast that to the appropriate type.
3509 llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
3511 // The copy expression is defined in terms of an OpaqueValueExpr.
3512 // Find it and map it to the adjusted expression.
3513 CodeGenFunction::OpaqueValueMapping
3514 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
3515 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
3517 // Call the copy ctor in a terminate scope.
3518 CGF.EHStack.pushTerminate();
3520 // Perform the copy construction.
3521 CharUnits Alignment = CGF.getContext().getDeclAlign(&CatchParam);
3522 CGF.EmitAggExpr(copyExpr,
3523 AggValueSlot::forAddr(ParamAddr, Alignment, Qualifiers(),
3524 AggValueSlot::IsNotDestructed,
3525 AggValueSlot::DoesNotNeedGCBarriers,
3526 AggValueSlot::IsNotAliased));
3528 // Leave the terminate scope.
3529 CGF.EHStack.popTerminate();
3531 // Undo the opaque value mapping.
3534 // Finally we can call __cxa_begin_catch.
3535 CallBeginCatch(CGF, Exn, true);
3538 /// Begins a catch statement by initializing the catch variable and
3539 /// calling __cxa_begin_catch.
3540 void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF,
3541 const CXXCatchStmt *S) {
3542 // We have to be very careful with the ordering of cleanups here:
3543 // C++ [except.throw]p4:
3544 // The destruction [of the exception temporary] occurs
3545 // immediately after the destruction of the object declared in
3546 // the exception-declaration in the handler.
3548 // So the precise ordering is:
3549 // 1. Construct catch variable.
3550 // 2. __cxa_begin_catch
3551 // 3. Enter __cxa_end_catch cleanup
3552 // 4. Enter dtor cleanup
3554 // We do this by using a slightly abnormal initialization process.
3555 // Delegation sequence:
3556 // - ExitCXXTryStmt opens a RunCleanupsScope
3557 // - EmitAutoVarAlloca creates the variable and debug info
3558 // - InitCatchParam initializes the variable from the exception
3559 // - CallBeginCatch calls __cxa_begin_catch
3560 // - CallBeginCatch enters the __cxa_end_catch cleanup
3561 // - EmitAutoVarCleanups enters the variable destructor cleanup
3562 // - EmitCXXTryStmt emits the code for the catch body
3563 // - EmitCXXTryStmt close the RunCleanupsScope
3565 VarDecl *CatchParam = S->getExceptionDecl();
3567 llvm::Value *Exn = CGF.getExceptionFromSlot();
3568 CallBeginCatch(CGF, Exn, true);
3573 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
3574 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart());
3575 CGF.EmitAutoVarCleanups(var);
3578 /// Get or define the following function:
3579 /// void @__clang_call_terminate(i8* %exn) nounwind noreturn
3580 /// This code is used only in C++.
3581 static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) {
3582 llvm::FunctionType *fnTy =
3583 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3584 llvm::Constant *fnRef =
3585 CGM.CreateRuntimeFunction(fnTy, "__clang_call_terminate");
3587 llvm::Function *fn = dyn_cast<llvm::Function>(fnRef);
3588 if (fn && fn->empty()) {
3589 fn->setDoesNotThrow();
3590 fn->setDoesNotReturn();
3592 // What we really want is to massively penalize inlining without
3593 // forbidding it completely. The difference between that and
3594 // 'noinline' is negligible.
3595 fn->addFnAttr(llvm::Attribute::NoInline);
3597 // Allow this function to be shared across translation units, but
3598 // we don't want it to turn into an exported symbol.
3599 fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
3600 fn->setVisibility(llvm::Function::HiddenVisibility);
3601 if (CGM.supportsCOMDAT())
3602 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
3604 // Set up the function.
3605 llvm::BasicBlock *entry =
3606 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
3607 CGBuilderTy builder(entry);
3609 // Pull the exception pointer out of the parameter list.
3610 llvm::Value *exn = &*fn->arg_begin();
3612 // Call __cxa_begin_catch(exn).
3613 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
3614 catchCall->setDoesNotThrow();
3615 catchCall->setCallingConv(CGM.getRuntimeCC());
3617 // Call std::terminate().
3618 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn(), {});
3619 termCall->setDoesNotThrow();
3620 termCall->setDoesNotReturn();
3621 termCall->setCallingConv(CGM.getRuntimeCC());
3623 // std::terminate cannot return.
3624 builder.CreateUnreachable();
3631 ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
3633 // In C++, we want to call __cxa_begin_catch() before terminating.
3635 assert(CGF.CGM.getLangOpts().CPlusPlus);
3636 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn);
3638 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());