blob: f861af3e4574a193873483849230b32f2451a42b [file] [log] [blame]
Charles Davis4e786dd2010-05-25 19:52:27 +00001//===------- ItaniumCXXABI.cpp - Emit LLVM Code from ASTs for a Module ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Chris Lattner57540c52011-04-15 05:22:18 +000010// This provides C++ code generation targeting the Itanium C++ ABI. The class
Charles Davis4e786dd2010-05-25 19:52:27 +000011// in this file generates structures that follow the Itanium C++ ABI, which is
12// documented at:
13// http://www.codesourcery.com/public/cxx-abi/abi.html
14// http://www.codesourcery.com/public/cxx-abi/abi-eh.html
John McCall86353412010-08-21 22:46:04 +000015//
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
18//
Charles Davis4e786dd2010-05-25 19:52:27 +000019//===----------------------------------------------------------------------===//
20
21#include "CGCXXABI.h"
John McCall7a9aac22010-08-23 01:21:21 +000022#include "CGRecordLayout.h"
Charles Davisa325a6e2012-06-23 23:44:00 +000023#include "CGVTables.h"
John McCall475999d2010-08-22 00:05:51 +000024#include "CodeGenFunction.h"
Charles Davis4e786dd2010-05-25 19:52:27 +000025#include "CodeGenModule.h"
Craig Topperc9ee1d02012-09-15 18:47:51 +000026#include "clang/AST/Mangle.h"
27#include "clang/AST/Type.h"
David Majnemer1162d252014-06-22 19:05:33 +000028#include "llvm/IR/CallSite.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000029#include "llvm/IR/DataLayout.h"
30#include "llvm/IR/Intrinsics.h"
31#include "llvm/IR/Value.h"
Charles Davis4e786dd2010-05-25 19:52:27 +000032
33using namespace clang;
John McCall475999d2010-08-22 00:05:51 +000034using namespace CodeGen;
Charles Davis4e786dd2010-05-25 19:52:27 +000035
36namespace {
Charles Davis53c59df2010-08-16 03:33:14 +000037class ItaniumCXXABI : public CodeGen::CGCXXABI {
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +000038 /// VTables - All the vtables which have been defined.
39 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
40
John McCall475999d2010-08-22 00:05:51 +000041protected:
Mark Seabornedf0d382013-07-24 16:25:13 +000042 bool UseARMMethodPtrABI;
43 bool UseARMGuardVarABI;
John McCall7a9aac22010-08-23 01:21:21 +000044
Timur Iskhodzhanov67455222013-10-03 06:26:13 +000045 ItaniumMangleContext &getMangleContext() {
46 return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext());
47 }
48
Charles Davis4e786dd2010-05-25 19:52:27 +000049public:
Mark Seabornedf0d382013-07-24 16:25:13 +000050 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
51 bool UseARMMethodPtrABI = false,
52 bool UseARMGuardVarABI = false) :
53 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
54 UseARMGuardVarABI(UseARMGuardVarABI) { }
John McCall475999d2010-08-22 00:05:51 +000055
Reid Kleckner40ca9132014-05-13 22:05:45 +000056 bool classifyReturnType(CGFunctionInfo &FI) const override;
Timur Iskhodzhanov8fe501d2013-04-17 12:54:10 +000057
Craig Topper4f12f102014-03-12 06:41:41 +000058 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
Reid Klecknerd355ca72014-05-15 01:26:32 +000059 // Structures with either a non-trivial destructor or a non-trivial
60 // copy constructor are always indirect.
61 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
62 // special members.
63 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor())
Timur Iskhodzhanov8fe501d2013-04-17 12:54:10 +000064 return RAA_Indirect;
65 return RAA_Default;
66 }
67
Craig Topper4f12f102014-03-12 06:41:41 +000068 bool isZeroInitializable(const MemberPointerType *MPT) override;
John McCall84fa5102010-08-22 04:16:24 +000069
Craig Topper4f12f102014-03-12 06:41:41 +000070 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
John McCall7a9aac22010-08-23 01:21:21 +000071
Craig Topper4f12f102014-03-12 06:41:41 +000072 llvm::Value *
73 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
74 const Expr *E,
75 llvm::Value *&This,
76 llvm::Value *MemFnPtr,
77 const MemberPointerType *MPT) override;
John McCalla8bbb822010-08-22 03:04:22 +000078
Craig Topper4f12f102014-03-12 06:41:41 +000079 llvm::Value *
80 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
81 llvm::Value *Base,
82 llvm::Value *MemPtr,
83 const MemberPointerType *MPT) override;
John McCallc134eb52010-08-31 21:07:20 +000084
John McCall7a9aac22010-08-23 01:21:21 +000085 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
86 const CastExpr *E,
Craig Topper4f12f102014-03-12 06:41:41 +000087 llvm::Value *Src) override;
John McCallc62bb392012-02-15 01:22:51 +000088 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
Craig Topper4f12f102014-03-12 06:41:41 +000089 llvm::Constant *Src) override;
John McCall84fa5102010-08-22 04:16:24 +000090
Craig Topper4f12f102014-03-12 06:41:41 +000091 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
John McCall84fa5102010-08-22 04:16:24 +000092
Craig Topper4f12f102014-03-12 06:41:41 +000093 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override;
John McCallf3a88602011-02-03 08:15:49 +000094 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
Craig Topper4f12f102014-03-12 06:41:41 +000095 CharUnits offset) override;
96 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
Richard Smithdafff942012-01-14 04:30:29 +000097 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
98 CharUnits ThisAdjustment);
John McCall1c456c82010-08-22 06:43:33 +000099
John McCall7a9aac22010-08-23 01:21:21 +0000100 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
Craig Topper4f12f102014-03-12 06:41:41 +0000101 llvm::Value *L, llvm::Value *R,
John McCall7a9aac22010-08-23 01:21:21 +0000102 const MemberPointerType *MPT,
Craig Topper4f12f102014-03-12 06:41:41 +0000103 bool Inequality) override;
John McCall131d97d2010-08-22 08:30:07 +0000104
John McCall7a9aac22010-08-23 01:21:21 +0000105 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
Craig Topper4f12f102014-03-12 06:41:41 +0000106 llvm::Value *Addr,
107 const MemberPointerType *MPT) override;
John McCall5d865c322010-08-31 07:33:07 +0000108
Craig Topper4f12f102014-03-12 06:41:41 +0000109 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF, llvm::Value *ptr,
110 QualType type) override;
John McCall82fb8922012-09-25 10:10:39 +0000111
David Majnemere2cb8d12014-07-07 06:20:47 +0000112 void EmitFundamentalRTTIDescriptor(QualType Type);
113 void EmitFundamentalRTTIDescriptors();
114 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
115
David Majnemer1162d252014-06-22 19:05:33 +0000116 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
117 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
118 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
119 llvm::Value *ThisPtr,
120 llvm::Type *StdTypeInfoPtrTy) override;
121
122 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
123 QualType SrcRecordTy) override;
124
125 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
126 QualType SrcRecordTy, QualType DestTy,
127 QualType DestRecordTy,
128 llvm::BasicBlock *CastEnd) override;
129
130 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
131 QualType SrcRecordTy,
132 QualType DestTy) override;
133
134 bool EmitBadCastCall(CodeGenFunction &CGF) override;
135
Craig Topper4f12f102014-03-12 06:41:41 +0000136 llvm::Value *
137 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
138 const CXXRecordDecl *ClassDecl,
139 const CXXRecordDecl *BaseClassDecl) override;
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000140
John McCall5d865c322010-08-31 07:33:07 +0000141 void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
Craig Topper4f12f102014-03-12 06:41:41 +0000142 CXXCtorType T, CanQualType &ResTy,
143 SmallVectorImpl<CanQualType> &ArgTys) override;
John McCall5d865c322010-08-31 07:33:07 +0000144
Craig Topper4f12f102014-03-12 06:41:41 +0000145 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +0000146
John McCall5d865c322010-08-31 07:33:07 +0000147 void BuildDestructorSignature(const CXXDestructorDecl *Dtor,
Craig Topper4f12f102014-03-12 06:41:41 +0000148 CXXDtorType T, CanQualType &ResTy,
149 SmallVectorImpl<CanQualType> &ArgTys) override;
John McCall5d865c322010-08-31 07:33:07 +0000150
Reid Klecknere7de47e2013-07-22 13:51:44 +0000151 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
Craig Topper4f12f102014-03-12 06:41:41 +0000152 CXXDtorType DT) const override {
Reid Klecknere7de47e2013-07-22 13:51:44 +0000153 // Itanium does not emit any destructor variant as an inline thunk.
154 // Delegating may occur as an optimization, but all variants are either
155 // emitted with external linkage or as linkonce if they are inline and used.
156 return false;
157 }
158
Craig Topper4f12f102014-03-12 06:41:41 +0000159 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
Reid Klecknere7de47e2013-07-22 13:51:44 +0000160
Reid Kleckner89077a12013-12-17 19:46:40 +0000161 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
Craig Topper4f12f102014-03-12 06:41:41 +0000162 FunctionArgList &Params) override;
John McCall5d865c322010-08-31 07:33:07 +0000163
Craig Topper4f12f102014-03-12 06:41:41 +0000164 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
John McCall8ed55a52010-09-02 09:58:18 +0000165
Reid Kleckner89077a12013-12-17 19:46:40 +0000166 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
167 const CXXConstructorDecl *D,
168 CXXCtorType Type, bool ForVirtualBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000169 bool Delegating,
170 CallArgList &Args) override;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000171
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000172 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
173 CXXDtorType Type, bool ForVirtualBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000174 bool Delegating, llvm::Value *This) override;
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000175
Craig Topper4f12f102014-03-12 06:41:41 +0000176 void emitVTableDefinitions(CodeGenVTables &CGVT,
177 const CXXRecordDecl *RD) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000178
179 llvm::Value *getVTableAddressPointInStructor(
180 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
181 BaseSubobject Base, const CXXRecordDecl *NearestVBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000182 bool &NeedsVirtualOffset) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000183
184 llvm::Constant *
185 getVTableAddressPointForConstExpr(BaseSubobject Base,
Craig Topper4f12f102014-03-12 06:41:41 +0000186 const CXXRecordDecl *VTableClass) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000187
188 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
Craig Topper4f12f102014-03-12 06:41:41 +0000189 CharUnits VPtrOffset) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000190
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000191 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
Craig Topper4f12f102014-03-12 06:41:41 +0000192 llvm::Value *This,
193 llvm::Type *Ty) override;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000194
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000195 void EmitVirtualDestructorCall(CodeGenFunction &CGF,
196 const CXXDestructorDecl *Dtor,
Alexey Samsonova5bf76b2014-08-25 20:17:35 +0000197 CXXDtorType DtorType, llvm::Value *This,
198 const CXXMemberCallExpr *CE) override;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +0000199
Craig Topper4f12f102014-03-12 06:41:41 +0000200 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
Reid Kleckner7810af02013-06-19 15:20:38 +0000201
Hans Wennborgc94391d2014-06-06 20:04:01 +0000202 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
203 bool ReturnAdjustment) override {
Timur Iskhodzhanovad9d3b82013-10-09 09:23:58 +0000204 // Allow inlining of thunks by emitting them with available_externally
205 // linkage together with vtables when needed.
206 if (ForVTable)
207 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
208 }
209
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000210 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
Craig Topper4f12f102014-03-12 06:41:41 +0000211 const ThisAdjustment &TA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000212
213 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
Craig Topper4f12f102014-03-12 06:41:41 +0000214 const ReturnAdjustment &RA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000215
Craig Topper4f12f102014-03-12 06:41:41 +0000216 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
217 StringRef GetDeletedVirtualCallName() override
218 { return "__cxa_deleted_virtual"; }
Joao Matos2ce88ef2012-07-17 17:10:11 +0000219
Craig Topper4f12f102014-03-12 06:41:41 +0000220 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
John McCall8ed55a52010-09-02 09:58:18 +0000221 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
222 llvm::Value *NewPtr,
223 llvm::Value *NumElements,
John McCall284c48f2011-01-27 09:37:56 +0000224 const CXXNewExpr *expr,
Craig Topper4f12f102014-03-12 06:41:41 +0000225 QualType ElementType) override;
John McCallb91cd662012-05-01 05:23:51 +0000226 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
227 llvm::Value *allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000228 CharUnits cookieSize) override;
John McCall68ff0372010-09-08 01:44:27 +0000229
John McCallcdf7ef52010-11-06 09:44:32 +0000230 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
Craig Topper4f12f102014-03-12 06:41:41 +0000231 llvm::GlobalVariable *DeclPtr,
232 bool PerformInit) override;
Richard Smithdbf74ba2013-04-14 23:01:42 +0000233 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
Craig Topper4f12f102014-03-12 06:41:41 +0000234 llvm::Constant *dtor, llvm::Constant *addr) override;
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000235
236 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
237 llvm::GlobalVariable *Var);
238 void EmitThreadLocalInitFuncs(
Craig Topper00bbdcf2014-06-28 23:22:23 +0000239 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
Craig Topper4f12f102014-03-12 06:41:41 +0000240 llvm::Function *InitFunc) override;
Richard Smith0f383742014-03-26 22:48:22 +0000241 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
242 QualType LValType) override;
Peter Collingbourne66f82e62013-06-28 20:45:28 +0000243
Craig Topper4f12f102014-03-12 06:41:41 +0000244 bool NeedsVTTParameter(GlobalDecl GD) override;
David Majnemere2cb8d12014-07-07 06:20:47 +0000245
246 /**************************** RTTI Uniqueness ******************************/
247
248protected:
249 /// Returns true if the ABI requires RTTI type_info objects to be unique
250 /// across a program.
251 virtual bool shouldRTTIBeUnique() const { return true; }
252
253public:
254 /// What sort of unique-RTTI behavior should we use?
255 enum RTTIUniquenessKind {
256 /// We are guaranteeing, or need to guarantee, that the RTTI string
257 /// is unique.
258 RUK_Unique,
259
260 /// We are not guaranteeing uniqueness for the RTTI string, so we
261 /// can demote to hidden visibility but must use string comparisons.
262 RUK_NonUniqueHidden,
263
264 /// We are not guaranteeing uniqueness for the RTTI string, so we
265 /// have to use string comparisons, but we also have to emit it with
266 /// non-hidden visibility.
267 RUK_NonUniqueVisible
268 };
269
270 /// Return the required visibility status for the given type and linkage in
271 /// the current ABI.
272 RTTIUniquenessKind
273 classifyRTTIUniqueness(QualType CanTy,
274 llvm::GlobalValue::LinkageTypes Linkage) const;
275 friend class ItaniumRTTIBuilder;
Charles Davis4e786dd2010-05-25 19:52:27 +0000276};
John McCall86353412010-08-21 22:46:04 +0000277
278class ARMCXXABI : public ItaniumCXXABI {
279public:
Mark Seabornedf0d382013-07-24 16:25:13 +0000280 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
281 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
282 /* UseARMGuardVarABI = */ true) {}
John McCall5d865c322010-08-31 07:33:07 +0000283
Craig Topper4f12f102014-03-12 06:41:41 +0000284 bool HasThisReturn(GlobalDecl GD) const override {
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000285 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
286 isa<CXXDestructorDecl>(GD.getDecl()) &&
287 GD.getDtorType() != Dtor_Deleting));
288 }
John McCall5d865c322010-08-31 07:33:07 +0000289
Craig Topper4f12f102014-03-12 06:41:41 +0000290 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
291 QualType ResTy) override;
John McCall5d865c322010-08-31 07:33:07 +0000292
Craig Topper4f12f102014-03-12 06:41:41 +0000293 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
John McCall8ed55a52010-09-02 09:58:18 +0000294 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
295 llvm::Value *NewPtr,
296 llvm::Value *NumElements,
John McCall284c48f2011-01-27 09:37:56 +0000297 const CXXNewExpr *expr,
Craig Topper4f12f102014-03-12 06:41:41 +0000298 QualType ElementType) override;
John McCallb91cd662012-05-01 05:23:51 +0000299 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, llvm::Value *allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000300 CharUnits cookieSize) override;
John McCall86353412010-08-21 22:46:04 +0000301};
Tim Northovera2ee4332014-03-29 15:09:45 +0000302
303class iOS64CXXABI : public ARMCXXABI {
304public:
305 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
Tim Northover65f582f2014-03-30 17:32:48 +0000306
307 // ARM64 libraries are prepared for non-unique RTTI.
David Majnemere2cb8d12014-07-07 06:20:47 +0000308 bool shouldRTTIBeUnique() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +0000309};
Charles Davis4e786dd2010-05-25 19:52:27 +0000310}
311
Charles Davis53c59df2010-08-16 03:33:14 +0000312CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
John McCallc8e01702013-04-16 22:48:15 +0000313 switch (CGM.getTarget().getCXXABI().getKind()) {
John McCall57625922013-01-25 23:36:14 +0000314 // For IR-generation purposes, there's no significant difference
315 // between the ARM and iOS ABIs.
316 case TargetCXXABI::GenericARM:
317 case TargetCXXABI::iOS:
318 return new ARMCXXABI(CGM);
Charles Davis4e786dd2010-05-25 19:52:27 +0000319
Tim Northovera2ee4332014-03-29 15:09:45 +0000320 case TargetCXXABI::iOS64:
321 return new iOS64CXXABI(CGM);
322
Tim Northover9bb857a2013-01-31 12:13:10 +0000323 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
324 // include the other 32-bit ARM oddities: constructor/destructor return values
325 // and array cookies.
326 case TargetCXXABI::GenericAArch64:
Mark Seabornedf0d382013-07-24 16:25:13 +0000327 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
328 /* UseARMGuardVarABI = */ true);
Tim Northover9bb857a2013-01-31 12:13:10 +0000329
John McCall57625922013-01-25 23:36:14 +0000330 case TargetCXXABI::GenericItanium:
Mark Seabornedf0d382013-07-24 16:25:13 +0000331 if (CGM.getContext().getTargetInfo().getTriple().getArch()
332 == llvm::Triple::le32) {
333 // For PNaCl, use ARM-style method pointers so that PNaCl code
334 // does not assume anything about the alignment of function
335 // pointers.
336 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
337 /* UseARMGuardVarABI = */ false);
338 }
John McCall57625922013-01-25 23:36:14 +0000339 return new ItaniumCXXABI(CGM);
340
341 case TargetCXXABI::Microsoft:
342 llvm_unreachable("Microsoft ABI is not Itanium-based");
343 }
344 llvm_unreachable("bad ABI kind");
John McCall86353412010-08-21 22:46:04 +0000345}
346
Chris Lattnera5f58b02011-07-09 17:41:47 +0000347llvm::Type *
John McCall7a9aac22010-08-23 01:21:21 +0000348ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
349 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000350 return CGM.PtrDiffTy;
351 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, NULL);
John McCall1c456c82010-08-22 06:43:33 +0000352}
353
John McCalld9c6c0b2010-08-22 00:59:17 +0000354/// In the Itanium and ARM ABIs, method pointers have the form:
355/// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
356///
357/// In the Itanium ABI:
358/// - method pointers are virtual if (memptr.ptr & 1) is nonzero
359/// - the this-adjustment is (memptr.adj)
360/// - the virtual offset is (memptr.ptr - 1)
361///
362/// In the ARM ABI:
363/// - method pointers are virtual if (memptr.adj & 1) is nonzero
364/// - the this-adjustment is (memptr.adj >> 1)
365/// - the virtual offset is (memptr.ptr)
366/// ARM uses 'adj' for the virtual flag because Thumb functions
367/// may be only single-byte aligned.
368///
369/// If the member is virtual, the adjusted 'this' pointer points
370/// to a vtable pointer from which the virtual offset is applied.
371///
372/// If the member is non-virtual, memptr.ptr is the address of
373/// the function to call.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000374llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
375 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
376 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
John McCall475999d2010-08-22 00:05:51 +0000377 CGBuilderTy &Builder = CGF.Builder;
378
379 const FunctionProtoType *FPT =
380 MPT->getPointeeType()->getAs<FunctionProtoType>();
381 const CXXRecordDecl *RD =
382 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
383
Chris Lattner2192fe52011-07-18 04:24:23 +0000384 llvm::FunctionType *FTy =
John McCalla729c622012-02-17 03:33:10 +0000385 CGM.getTypes().GetFunctionType(
386 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
John McCall475999d2010-08-22 00:05:51 +0000387
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000388 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
John McCall475999d2010-08-22 00:05:51 +0000389
John McCalld9c6c0b2010-08-22 00:59:17 +0000390 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
391 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
392 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
393
John McCalla1dee5302010-08-22 10:59:02 +0000394 // Extract memptr.adj, which is in the second field.
395 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
John McCalld9c6c0b2010-08-22 00:59:17 +0000396
397 // Compute the true adjustment.
398 llvm::Value *Adj = RawAdj;
Mark Seabornedf0d382013-07-24 16:25:13 +0000399 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000400 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
John McCall475999d2010-08-22 00:05:51 +0000401
402 // Apply the adjustment and cast back to the original struct type
403 // for consistency.
John McCalld9c6c0b2010-08-22 00:59:17 +0000404 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
405 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
406 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
John McCall475999d2010-08-22 00:05:51 +0000407
408 // Load the function pointer.
John McCalla1dee5302010-08-22 10:59:02 +0000409 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
John McCall475999d2010-08-22 00:05:51 +0000410
411 // If the LSB in the function pointer is 1, the function pointer points to
412 // a virtual function.
John McCalld9c6c0b2010-08-22 00:59:17 +0000413 llvm::Value *IsVirtual;
Mark Seabornedf0d382013-07-24 16:25:13 +0000414 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000415 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
416 else
417 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
418 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
John McCall475999d2010-08-22 00:05:51 +0000419 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
420
421 // In the virtual path, the adjustment left 'This' pointing to the
422 // vtable of the correct base subobject. The "function pointer" is an
John McCalld9c6c0b2010-08-22 00:59:17 +0000423 // offset within the vtable (+1 for the virtual flag on non-ARM).
John McCall475999d2010-08-22 00:05:51 +0000424 CGF.EmitBlock(FnVirtual);
425
426 // Cast the adjusted this to a pointer to vtable pointer and load.
Chris Lattner2192fe52011-07-18 04:24:23 +0000427 llvm::Type *VTableTy = Builder.getInt8PtrTy();
Richard Smith0fc7bdc2014-03-12 18:26:14 +0000428 llvm::Value *VTable = CGF.GetVTablePtr(This, VTableTy);
John McCall475999d2010-08-22 00:05:51 +0000429
430 // Apply the offset.
John McCalld9c6c0b2010-08-22 00:59:17 +0000431 llvm::Value *VTableOffset = FnAsInt;
Mark Seabornedf0d382013-07-24 16:25:13 +0000432 if (!UseARMMethodPtrABI)
433 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
John McCalld9c6c0b2010-08-22 00:59:17 +0000434 VTable = Builder.CreateGEP(VTable, VTableOffset);
John McCall475999d2010-08-22 00:05:51 +0000435
436 // Load the virtual function to call.
437 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
John McCalld9c6c0b2010-08-22 00:59:17 +0000438 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn");
John McCall475999d2010-08-22 00:05:51 +0000439 CGF.EmitBranch(FnEnd);
440
441 // In the non-virtual path, the function pointer is actually a
442 // function pointer.
443 CGF.EmitBlock(FnNonVirtual);
444 llvm::Value *NonVirtualFn =
John McCalld9c6c0b2010-08-22 00:59:17 +0000445 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
John McCall475999d2010-08-22 00:05:51 +0000446
447 // We're done.
448 CGF.EmitBlock(FnEnd);
Jay Foad20c0f022011-03-30 11:28:58 +0000449 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
John McCall475999d2010-08-22 00:05:51 +0000450 Callee->addIncoming(VirtualFn, FnVirtual);
451 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
452 return Callee;
453}
John McCalla8bbb822010-08-22 03:04:22 +0000454
John McCallc134eb52010-08-31 21:07:20 +0000455/// Compute an l-value by applying the given pointer-to-member to a
456/// base object.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000457llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
458 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
459 const MemberPointerType *MPT) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000460 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCallc134eb52010-08-31 21:07:20 +0000461
462 CGBuilderTy &Builder = CGF.Builder;
463
Micah Villmowea2fea22012-10-25 15:39:14 +0000464 unsigned AS = Base->getType()->getPointerAddressSpace();
John McCallc134eb52010-08-31 21:07:20 +0000465
466 // Cast to char*.
467 Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
468
469 // Apply the offset, which we assume is non-null.
470 llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, MemPtr, "memptr.offset");
471
472 // Cast the address to the appropriate pointer type, adopting the
473 // address space of the base pointer.
Chris Lattner2192fe52011-07-18 04:24:23 +0000474 llvm::Type *PType
Douglas Gregor04f36212010-09-02 17:38:50 +0000475 = CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
John McCallc134eb52010-08-31 21:07:20 +0000476 return Builder.CreateBitCast(Addr, PType);
477}
478
John McCallc62bb392012-02-15 01:22:51 +0000479/// Perform a bitcast, derived-to-base, or base-to-derived member pointer
480/// conversion.
481///
482/// Bitcast conversions are always a no-op under Itanium.
John McCall7a9aac22010-08-23 01:21:21 +0000483///
484/// Obligatory offset/adjustment diagram:
485/// <-- offset --> <-- adjustment -->
486/// |--------------------------|----------------------|--------------------|
487/// ^Derived address point ^Base address point ^Member address point
488///
489/// So when converting a base member pointer to a derived member pointer,
490/// we add the offset to the adjustment because the address point has
491/// decreased; and conversely, when converting a derived MP to a base MP
492/// we subtract the offset from the adjustment because the address point
493/// has increased.
494///
495/// The standard forbids (at compile time) conversion to and from
496/// virtual bases, which is why we don't have to consider them here.
497///
498/// The standard forbids (at run time) casting a derived MP to a base
499/// MP when the derived MP does not point to a member of the base.
500/// This is why -1 is a reasonable choice for null data member
501/// pointers.
John McCalla1dee5302010-08-22 10:59:02 +0000502llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000503ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
504 const CastExpr *E,
John McCallc62bb392012-02-15 01:22:51 +0000505 llvm::Value *src) {
John McCalle3027922010-08-25 11:45:40 +0000506 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
John McCallc62bb392012-02-15 01:22:51 +0000507 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
508 E->getCastKind() == CK_ReinterpretMemberPointer);
509
510 // Under Itanium, reinterprets don't require any additional processing.
511 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
512
513 // Use constant emission if we can.
514 if (isa<llvm::Constant>(src))
515 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
516
517 llvm::Constant *adj = getMemberPointerAdjustment(E);
518 if (!adj) return src;
John McCalla8bbb822010-08-22 03:04:22 +0000519
520 CGBuilderTy &Builder = CGF.Builder;
John McCallc62bb392012-02-15 01:22:51 +0000521 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
John McCalla8bbb822010-08-22 03:04:22 +0000522
John McCallc62bb392012-02-15 01:22:51 +0000523 const MemberPointerType *destTy =
524 E->getType()->castAs<MemberPointerType>();
John McCall1c456c82010-08-22 06:43:33 +0000525
John McCall7a9aac22010-08-23 01:21:21 +0000526 // For member data pointers, this is just a matter of adding the
527 // offset if the source is non-null.
John McCallc62bb392012-02-15 01:22:51 +0000528 if (destTy->isMemberDataPointer()) {
529 llvm::Value *dst;
530 if (isDerivedToBase)
531 dst = Builder.CreateNSWSub(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000532 else
John McCallc62bb392012-02-15 01:22:51 +0000533 dst = Builder.CreateNSWAdd(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000534
535 // Null check.
John McCallc62bb392012-02-15 01:22:51 +0000536 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
537 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
538 return Builder.CreateSelect(isNull, src, dst);
John McCall7a9aac22010-08-23 01:21:21 +0000539 }
540
John McCalla1dee5302010-08-22 10:59:02 +0000541 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000542 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000543 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
544 offset <<= 1;
545 adj = llvm::ConstantInt::get(adj->getType(), offset);
John McCalla1dee5302010-08-22 10:59:02 +0000546 }
547
John McCallc62bb392012-02-15 01:22:51 +0000548 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
549 llvm::Value *dstAdj;
550 if (isDerivedToBase)
551 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000552 else
John McCallc62bb392012-02-15 01:22:51 +0000553 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000554
John McCallc62bb392012-02-15 01:22:51 +0000555 return Builder.CreateInsertValue(src, dstAdj, 1);
556}
557
558llvm::Constant *
559ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
560 llvm::Constant *src) {
561 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
562 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
563 E->getCastKind() == CK_ReinterpretMemberPointer);
564
565 // Under Itanium, reinterprets don't require any additional processing.
566 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
567
568 // If the adjustment is trivial, we don't need to do anything.
569 llvm::Constant *adj = getMemberPointerAdjustment(E);
570 if (!adj) return src;
571
572 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
573
574 const MemberPointerType *destTy =
575 E->getType()->castAs<MemberPointerType>();
576
577 // For member data pointers, this is just a matter of adding the
578 // offset if the source is non-null.
579 if (destTy->isMemberDataPointer()) {
580 // null maps to null.
581 if (src->isAllOnesValue()) return src;
582
583 if (isDerivedToBase)
584 return llvm::ConstantExpr::getNSWSub(src, adj);
585 else
586 return llvm::ConstantExpr::getNSWAdd(src, adj);
587 }
588
589 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000590 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000591 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
592 offset <<= 1;
593 adj = llvm::ConstantInt::get(adj->getType(), offset);
594 }
595
596 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
597 llvm::Constant *dstAdj;
598 if (isDerivedToBase)
599 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
600 else
601 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
602
603 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
John McCalla8bbb822010-08-22 03:04:22 +0000604}
John McCall84fa5102010-08-22 04:16:24 +0000605
606llvm::Constant *
John McCall7a9aac22010-08-23 01:21:21 +0000607ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
John McCall7a9aac22010-08-23 01:21:21 +0000608 // Itanium C++ ABI 2.3:
609 // A NULL pointer is represented as -1.
610 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000611 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
John McCalla1dee5302010-08-22 10:59:02 +0000612
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000613 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
John McCalla1dee5302010-08-22 10:59:02 +0000614 llvm::Constant *Values[2] = { Zero, Zero };
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000615 return llvm::ConstantStruct::getAnon(Values);
John McCall84fa5102010-08-22 04:16:24 +0000616}
617
John McCallf3a88602011-02-03 08:15:49 +0000618llvm::Constant *
619ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
620 CharUnits offset) {
John McCall7a9aac22010-08-23 01:21:21 +0000621 // Itanium C++ ABI 2.3:
622 // A pointer to data member is an offset from the base address of
623 // the class object containing it, represented as a ptrdiff_t
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000624 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
John McCall7a9aac22010-08-23 01:21:21 +0000625}
626
John McCall2979fe02011-04-12 00:42:48 +0000627llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
Richard Smithdafff942012-01-14 04:30:29 +0000628 return BuildMemberPointer(MD, CharUnits::Zero());
629}
630
631llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
632 CharUnits ThisAdjustment) {
John McCalla1dee5302010-08-22 10:59:02 +0000633 assert(MD->isInstance() && "Member function must not be static!");
634 MD = MD->getCanonicalDecl();
635
636 CodeGenTypes &Types = CGM.getTypes();
John McCalla1dee5302010-08-22 10:59:02 +0000637
638 // Get the function pointer (or index if this is a virtual function).
639 llvm::Constant *MemPtr[2];
640 if (MD->isVirtual()) {
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000641 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
John McCalla1dee5302010-08-22 10:59:02 +0000642
Ken Dyckdf016282011-04-09 01:30:02 +0000643 const ASTContext &Context = getContext();
644 CharUnits PointerWidth =
Douglas Gregore8bbc122011-09-02 00:18:52 +0000645 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
Ken Dyckdf016282011-04-09 01:30:02 +0000646 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000647
Mark Seabornedf0d382013-07-24 16:25:13 +0000648 if (UseARMMethodPtrABI) {
John McCalla1dee5302010-08-22 10:59:02 +0000649 // ARM C++ ABI 3.2.1:
650 // This ABI specifies that adj contains twice the this
651 // adjustment, plus 1 if the member function is virtual. The
652 // least significant bit of adj then makes exactly the same
653 // discrimination as the least significant bit of ptr does for
654 // Itanium.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000655 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
656 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000657 2 * ThisAdjustment.getQuantity() + 1);
John McCalla1dee5302010-08-22 10:59:02 +0000658 } else {
659 // Itanium C++ ABI 2.3:
660 // For a virtual function, [the pointer field] is 1 plus the
661 // virtual table offset (in bytes) of the function,
662 // represented as a ptrdiff_t.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000663 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
664 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000665 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000666 }
667 } else {
John McCall2979fe02011-04-12 00:42:48 +0000668 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
Chris Lattner2192fe52011-07-18 04:24:23 +0000669 llvm::Type *Ty;
John McCall2979fe02011-04-12 00:42:48 +0000670 // Check whether the function has a computable LLVM signature.
Chris Lattner8806e322011-07-10 00:18:59 +0000671 if (Types.isFuncTypeConvertible(FPT)) {
John McCall2979fe02011-04-12 00:42:48 +0000672 // The function has a computable LLVM signature; use the correct type.
John McCalla729c622012-02-17 03:33:10 +0000673 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
John McCalla1dee5302010-08-22 10:59:02 +0000674 } else {
John McCall2979fe02011-04-12 00:42:48 +0000675 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
676 // function type is incomplete.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000677 Ty = CGM.PtrDiffTy;
John McCalla1dee5302010-08-22 10:59:02 +0000678 }
John McCall2979fe02011-04-12 00:42:48 +0000679 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
John McCalla1dee5302010-08-22 10:59:02 +0000680
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000681 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
Mark Seabornedf0d382013-07-24 16:25:13 +0000682 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
683 (UseARMMethodPtrABI ? 2 : 1) *
Richard Smithdafff942012-01-14 04:30:29 +0000684 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000685 }
John McCall1c456c82010-08-22 06:43:33 +0000686
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000687 return llvm::ConstantStruct::getAnon(MemPtr);
John McCall1c456c82010-08-22 06:43:33 +0000688}
689
Richard Smithdafff942012-01-14 04:30:29 +0000690llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
691 QualType MPType) {
692 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
693 const ValueDecl *MPD = MP.getMemberPointerDecl();
694 if (!MPD)
695 return EmitNullMemberPointer(MPT);
696
Reid Kleckner452abac2013-05-09 21:01:17 +0000697 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
Richard Smithdafff942012-01-14 04:30:29 +0000698
699 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
700 return BuildMemberPointer(MD, ThisAdjustment);
701
702 CharUnits FieldOffset =
703 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
704 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
705}
706
John McCall131d97d2010-08-22 08:30:07 +0000707/// The comparison algorithm is pretty easy: the member pointers are
708/// the same if they're either bitwise identical *or* both null.
709///
710/// ARM is different here only because null-ness is more complicated.
711llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000712ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
713 llvm::Value *L,
714 llvm::Value *R,
715 const MemberPointerType *MPT,
716 bool Inequality) {
John McCall131d97d2010-08-22 08:30:07 +0000717 CGBuilderTy &Builder = CGF.Builder;
718
John McCall131d97d2010-08-22 08:30:07 +0000719 llvm::ICmpInst::Predicate Eq;
720 llvm::Instruction::BinaryOps And, Or;
721 if (Inequality) {
722 Eq = llvm::ICmpInst::ICMP_NE;
723 And = llvm::Instruction::Or;
724 Or = llvm::Instruction::And;
725 } else {
726 Eq = llvm::ICmpInst::ICMP_EQ;
727 And = llvm::Instruction::And;
728 Or = llvm::Instruction::Or;
729 }
730
John McCall7a9aac22010-08-23 01:21:21 +0000731 // Member data pointers are easy because there's a unique null
732 // value, so it just comes down to bitwise equality.
733 if (MPT->isMemberDataPointer())
734 return Builder.CreateICmp(Eq, L, R);
735
736 // For member function pointers, the tautologies are more complex.
737 // The Itanium tautology is:
John McCall61a14882010-08-23 06:56:36 +0000738 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
John McCall7a9aac22010-08-23 01:21:21 +0000739 // The ARM tautology is:
John McCall61a14882010-08-23 06:56:36 +0000740 // (L == R) <==> (L.ptr == R.ptr &&
741 // (L.adj == R.adj ||
742 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
John McCall7a9aac22010-08-23 01:21:21 +0000743 // The inequality tautologies have exactly the same structure, except
744 // applying De Morgan's laws.
745
746 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
747 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
748
John McCall131d97d2010-08-22 08:30:07 +0000749 // This condition tests whether L.ptr == R.ptr. This must always be
750 // true for equality to hold.
751 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
752
753 // This condition, together with the assumption that L.ptr == R.ptr,
754 // tests whether the pointers are both null. ARM imposes an extra
755 // condition.
756 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
757 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
758
759 // This condition tests whether L.adj == R.adj. If this isn't
760 // true, the pointers are unequal unless they're both null.
John McCalla1dee5302010-08-22 10:59:02 +0000761 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
762 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000763 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
764
765 // Null member function pointers on ARM clear the low bit of Adj,
766 // so the zero condition has to check that neither low bit is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000767 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000768 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
769
770 // Compute (l.adj | r.adj) & 1 and test it against zero.
771 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
772 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
773 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
774 "cmp.or.adj");
775 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
776 }
777
778 // Tie together all our conditions.
779 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
780 Result = Builder.CreateBinOp(And, PtrEq, Result,
781 Inequality ? "memptr.ne" : "memptr.eq");
782 return Result;
783}
784
785llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000786ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
787 llvm::Value *MemPtr,
788 const MemberPointerType *MPT) {
John McCall131d97d2010-08-22 08:30:07 +0000789 CGBuilderTy &Builder = CGF.Builder;
John McCall7a9aac22010-08-23 01:21:21 +0000790
791 /// For member data pointers, this is just a check against -1.
792 if (MPT->isMemberDataPointer()) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000793 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCall7a9aac22010-08-23 01:21:21 +0000794 llvm::Value *NegativeOne =
795 llvm::Constant::getAllOnesValue(MemPtr->getType());
796 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
797 }
John McCall131d97d2010-08-22 08:30:07 +0000798
Daniel Dunbar914bc412011-04-19 23:10:47 +0000799 // In Itanium, a member function pointer is not null if 'ptr' is not null.
John McCalla1dee5302010-08-22 10:59:02 +0000800 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
John McCall131d97d2010-08-22 08:30:07 +0000801
802 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
803 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
804
Daniel Dunbar914bc412011-04-19 23:10:47 +0000805 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
806 // (the virtual bit) is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000807 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000808 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
John McCalla1dee5302010-08-22 10:59:02 +0000809 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000810 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
Daniel Dunbar914bc412011-04-19 23:10:47 +0000811 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
812 "memptr.isvirtual");
813 Result = Builder.CreateOr(Result, IsVirtual);
John McCall131d97d2010-08-22 08:30:07 +0000814 }
815
816 return Result;
817}
John McCall1c456c82010-08-22 06:43:33 +0000818
Reid Kleckner40ca9132014-05-13 22:05:45 +0000819bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
820 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
821 if (!RD)
822 return false;
823
Reid Klecknerd355ca72014-05-15 01:26:32 +0000824 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
825 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
826 // special members.
827 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
Reid Kleckner40ca9132014-05-13 22:05:45 +0000828 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
829 return true;
830 }
Reid Kleckner40ca9132014-05-13 22:05:45 +0000831 return false;
832}
833
John McCall614dbdc2010-08-22 21:01:12 +0000834/// The Itanium ABI requires non-zero initialization only for data
835/// member pointers, for which '0' is a valid offset.
836bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
837 return MPT->getPointeeType()->isFunctionType();
John McCall84fa5102010-08-22 04:16:24 +0000838}
John McCall5d865c322010-08-31 07:33:07 +0000839
John McCall82fb8922012-09-25 10:10:39 +0000840/// The Itanium ABI always places an offset to the complete object
841/// at entry -2 in the vtable.
842llvm::Value *ItaniumCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
843 llvm::Value *ptr,
844 QualType type) {
845 // Grab the vtable pointer as an intptr_t*.
846 llvm::Value *vtable = CGF.GetVTablePtr(ptr, CGF.IntPtrTy->getPointerTo());
847
848 // Track back to entry -2 and pull out the offset there.
849 llvm::Value *offsetPtr =
850 CGF.Builder.CreateConstInBoundsGEP1_64(vtable, -2, "complete-offset.ptr");
851 llvm::LoadInst *offset = CGF.Builder.CreateLoad(offsetPtr);
852 offset->setAlignment(CGF.PointerAlignInBytes);
853
854 // Apply the offset.
855 ptr = CGF.Builder.CreateBitCast(ptr, CGF.Int8PtrTy);
856 return CGF.Builder.CreateInBoundsGEP(ptr, offset);
857}
858
David Majnemer1162d252014-06-22 19:05:33 +0000859static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
860 // void *__dynamic_cast(const void *sub,
861 // const abi::__class_type_info *src,
862 // const abi::__class_type_info *dst,
863 // std::ptrdiff_t src2dst_offset);
864
865 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
866 llvm::Type *PtrDiffTy =
867 CGF.ConvertType(CGF.getContext().getPointerDiffType());
868
869 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
870
871 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
872
873 // Mark the function as nounwind readonly.
874 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
875 llvm::Attribute::ReadOnly };
876 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
877 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
878
879 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
880}
881
882static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
883 // void __cxa_bad_cast();
884 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
885 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
886}
887
888/// \brief Compute the src2dst_offset hint as described in the
889/// Itanium C++ ABI [2.9.7]
890static CharUnits computeOffsetHint(ASTContext &Context,
891 const CXXRecordDecl *Src,
892 const CXXRecordDecl *Dst) {
893 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
894 /*DetectVirtual=*/false);
895
896 // If Dst is not derived from Src we can skip the whole computation below and
897 // return that Src is not a public base of Dst. Record all inheritance paths.
898 if (!Dst->isDerivedFrom(Src, Paths))
899 return CharUnits::fromQuantity(-2ULL);
900
901 unsigned NumPublicPaths = 0;
902 CharUnits Offset;
903
904 // Now walk all possible inheritance paths.
905 for (CXXBasePaths::paths_iterator I = Paths.begin(), E = Paths.end(); I != E;
906 ++I) {
907 if (I->Access != AS_public) // Ignore non-public inheritance.
908 continue;
909
910 ++NumPublicPaths;
911
912 for (CXXBasePath::iterator J = I->begin(), JE = I->end(); J != JE; ++J) {
913 // If the path contains a virtual base class we can't give any hint.
914 // -1: no hint.
915 if (J->Base->isVirtual())
916 return CharUnits::fromQuantity(-1ULL);
917
918 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
919 continue;
920
921 // Accumulate the base class offsets.
922 const ASTRecordLayout &L = Context.getASTRecordLayout(J->Class);
923 Offset += L.getBaseClassOffset(J->Base->getType()->getAsCXXRecordDecl());
924 }
925 }
926
927 // -2: Src is not a public base of Dst.
928 if (NumPublicPaths == 0)
929 return CharUnits::fromQuantity(-2ULL);
930
931 // -3: Src is a multiple public base type but never a virtual base type.
932 if (NumPublicPaths > 1)
933 return CharUnits::fromQuantity(-3ULL);
934
935 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
936 // Return the offset of Src from the origin of Dst.
937 return Offset;
938}
939
940static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
941 // void __cxa_bad_typeid();
942 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
943
944 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
945}
946
947bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
948 QualType SrcRecordTy) {
949 return IsDeref;
950}
951
952void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
953 llvm::Value *Fn = getBadTypeidFn(CGF);
954 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
955 CGF.Builder.CreateUnreachable();
956}
957
958llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
959 QualType SrcRecordTy,
960 llvm::Value *ThisPtr,
961 llvm::Type *StdTypeInfoPtrTy) {
962 llvm::Value *Value =
963 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo());
964
965 // Load the type info.
966 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
967 return CGF.Builder.CreateLoad(Value);
968}
969
970bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
971 QualType SrcRecordTy) {
972 return SrcIsPtr;
973}
974
975llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
976 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
977 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
978 llvm::Type *PtrDiffLTy =
979 CGF.ConvertType(CGF.getContext().getPointerDiffType());
980 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
981
982 llvm::Value *SrcRTTI =
983 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
984 llvm::Value *DestRTTI =
985 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
986
987 // Compute the offset hint.
988 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
989 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
990 llvm::Value *OffsetHint = llvm::ConstantInt::get(
991 PtrDiffLTy,
992 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
993
994 // Emit the call to __dynamic_cast.
995 Value = CGF.EmitCastToVoidPtr(Value);
996
997 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
998 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
999 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1000
1001 /// C++ [expr.dynamic.cast]p9:
1002 /// A failed cast to reference type throws std::bad_cast
1003 if (DestTy->isReferenceType()) {
1004 llvm::BasicBlock *BadCastBlock =
1005 CGF.createBasicBlock("dynamic_cast.bad_cast");
1006
1007 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1008 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1009
1010 CGF.EmitBlock(BadCastBlock);
1011 EmitBadCastCall(CGF);
1012 }
1013
1014 return Value;
1015}
1016
1017llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1018 llvm::Value *Value,
1019 QualType SrcRecordTy,
1020 QualType DestTy) {
1021 llvm::Type *PtrDiffLTy =
1022 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1023 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1024
1025 // Get the vtable pointer.
1026 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1027
1028 // Get the offset-to-top from the vtable.
1029 llvm::Value *OffsetToTop =
1030 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1031 OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1032
1033 // Finally, add the offset to the pointer.
1034 Value = CGF.EmitCastToVoidPtr(Value);
1035 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1036
1037 return CGF.Builder.CreateBitCast(Value, DestLTy);
1038}
1039
1040bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1041 llvm::Value *Fn = getBadCastFn(CGF);
1042 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1043 CGF.Builder.CreateUnreachable();
1044 return true;
1045}
1046
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001047llvm::Value *
1048ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1049 llvm::Value *This,
1050 const CXXRecordDecl *ClassDecl,
1051 const CXXRecordDecl *BaseClassDecl) {
1052 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy);
1053 CharUnits VBaseOffsetOffset =
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001054 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1055 BaseClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001056
1057 llvm::Value *VBaseOffsetPtr =
1058 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1059 "vbase.offset.ptr");
1060 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1061 CGM.PtrDiffTy->getPointerTo());
1062
1063 llvm::Value *VBaseOffset =
1064 CGF.Builder.CreateLoad(VBaseOffsetPtr, "vbase.offset");
1065
1066 return VBaseOffset;
1067}
1068
John McCall5d865c322010-08-31 07:33:07 +00001069/// The generic ABI passes 'this', plus a VTT if it's initializing a
1070/// base subobject.
Reid Kleckner89077a12013-12-17 19:46:40 +00001071void
1072ItaniumCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
1073 CXXCtorType Type, CanQualType &ResTy,
1074 SmallVectorImpl<CanQualType> &ArgTys) {
John McCall9bca9232010-09-02 10:25:57 +00001075 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001076
Reid Kleckner89077a12013-12-17 19:46:40 +00001077 // All parameters are already in place except VTT, which goes after 'this'.
1078 // These are Clang types, so we don't need to worry about sret yet.
John McCall5d865c322010-08-31 07:33:07 +00001079
1080 // Check if we need to add a VTT parameter (which has type void **).
1081 if (Type == Ctor_Base && Ctor->getParent()->getNumVBases() != 0)
Reid Kleckner89077a12013-12-17 19:46:40 +00001082 ArgTys.insert(ArgTys.begin() + 1,
1083 Context.getPointerType(Context.VoidPtrTy));
John McCall5d865c322010-08-31 07:33:07 +00001084}
1085
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001086void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1087 // Just make sure we're in sync with TargetCXXABI.
1088 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1089
Rafael Espindolac3cde362013-12-09 14:51:17 +00001090 // The constructor used for constructing this as a base class;
1091 // ignores virtual bases.
1092 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1093
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001094 // The constructor used for constructing this as a complete class;
1095 // constucts the virtual bases, then calls the base constructor.
1096 if (!D->getParent()->isAbstract()) {
1097 // We don't need to emit the complete ctor if the class is abstract.
1098 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1099 }
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001100}
1101
John McCall5d865c322010-08-31 07:33:07 +00001102/// The generic ABI passes 'this', plus a VTT if it's destroying a
1103/// base subobject.
1104void ItaniumCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
1105 CXXDtorType Type,
1106 CanQualType &ResTy,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001107 SmallVectorImpl<CanQualType> &ArgTys) {
John McCall9bca9232010-09-02 10:25:57 +00001108 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001109
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001110 // 'this' parameter is already there, as well as 'this' return if
1111 // HasThisReturn(GlobalDecl(Dtor, Type)) is true
John McCall5d865c322010-08-31 07:33:07 +00001112
1113 // Check if we need to add a VTT parameter (which has type void **).
1114 if (Type == Dtor_Base && Dtor->getParent()->getNumVBases() != 0)
1115 ArgTys.push_back(Context.getPointerType(Context.VoidPtrTy));
1116}
1117
Reid Klecknere7de47e2013-07-22 13:51:44 +00001118void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
Rafael Espindolac3cde362013-12-09 14:51:17 +00001119 // The destructor used for destructing this as a base class; ignores
1120 // virtual bases.
1121 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001122
1123 // The destructor used for destructing this as a most-derived class;
1124 // call the base destructor and then destructs any virtual bases.
1125 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1126
Rafael Espindolac3cde362013-12-09 14:51:17 +00001127 // The destructor in a virtual table is always a 'deleting'
1128 // destructor, which calls the complete destructor and then uses the
1129 // appropriate operator delete.
1130 if (D->isVirtual())
1131 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001132}
1133
Reid Kleckner89077a12013-12-17 19:46:40 +00001134void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1135 QualType &ResTy,
1136 FunctionArgList &Params) {
John McCall5d865c322010-08-31 07:33:07 +00001137 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
Reid Kleckner89077a12013-12-17 19:46:40 +00001138 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
John McCall5d865c322010-08-31 07:33:07 +00001139
1140 // Check if we need a VTT parameter as well.
Peter Collingbourne66f82e62013-06-28 20:45:28 +00001141 if (NeedsVTTParameter(CGF.CurGD)) {
John McCall9bca9232010-09-02 10:25:57 +00001142 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001143
1144 // FIXME: avoid the fake decl
1145 QualType T = Context.getPointerType(Context.VoidPtrTy);
1146 ImplicitParamDecl *VTTDecl
Craig Topper8a13c412014-05-21 05:09:00 +00001147 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
John McCall5d865c322010-08-31 07:33:07 +00001148 &Context.Idents.get("vtt"), T);
Reid Kleckner89077a12013-12-17 19:46:40 +00001149 Params.insert(Params.begin() + 1, VTTDecl);
Reid Kleckner2af6d732013-12-13 00:09:59 +00001150 getStructorImplicitParamDecl(CGF) = VTTDecl;
John McCall5d865c322010-08-31 07:33:07 +00001151 }
1152}
1153
John McCall5d865c322010-08-31 07:33:07 +00001154void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1155 /// Initialize the 'this' slot.
1156 EmitThisParam(CGF);
1157
1158 /// Initialize the 'vtt' slot if needed.
Reid Kleckner2af6d732013-12-13 00:09:59 +00001159 if (getStructorImplicitParamDecl(CGF)) {
1160 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1161 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
John McCall5d865c322010-08-31 07:33:07 +00001162 }
John McCall5d865c322010-08-31 07:33:07 +00001163
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001164 /// If this is a function that the ABI specifies returns 'this', initialize
1165 /// the return slot to 'this' at the start of the function.
1166 ///
1167 /// Unlike the setting of return types, this is done within the ABI
1168 /// implementation instead of by clients of CGCXXABI because:
1169 /// 1) getThisValue is currently protected
1170 /// 2) in theory, an ABI could implement 'this' returns some other way;
1171 /// HasThisReturn only specifies a contract, not the implementation
John McCall5d865c322010-08-31 07:33:07 +00001172 if (HasThisReturn(CGF.CurGD))
Eli Friedman9fbeba02012-02-11 02:57:39 +00001173 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
John McCall5d865c322010-08-31 07:33:07 +00001174}
1175
Reid Kleckner89077a12013-12-17 19:46:40 +00001176unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1177 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1178 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1179 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1180 return 0;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001181
Reid Kleckner89077a12013-12-17 19:46:40 +00001182 // Insert the implicit 'vtt' argument as the second argument.
1183 llvm::Value *VTT =
1184 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1185 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1186 Args.insert(Args.begin() + 1,
1187 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1188 return 1; // Added one arg.
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001189}
1190
1191void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1192 const CXXDestructorDecl *DD,
1193 CXXDtorType Type, bool ForVirtualBase,
1194 bool Delegating, llvm::Value *This) {
1195 GlobalDecl GD(DD, Type);
1196 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1197 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1198
Craig Topper8a13c412014-05-21 05:09:00 +00001199 llvm::Value *Callee = nullptr;
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001200 if (getContext().getLangOpts().AppleKext)
1201 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1202
1203 if (!Callee)
1204 Callee = CGM.GetAddrOfCXXDestructor(DD, Type);
1205
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001206 CGF.EmitCXXMemberOrOperatorCall(DD, Callee, ReturnValueSlot(), This, VTT,
1207 VTTTy, nullptr);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001208}
1209
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001210void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1211 const CXXRecordDecl *RD) {
1212 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1213 if (VTable->hasInitializer())
1214 return;
1215
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001216 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001217 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1218 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
David Majnemerd905da42014-07-01 20:30:31 +00001219 llvm::Constant *RTTI =
1220 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001221
1222 // Create and set the initializer.
1223 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1224 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
David Majnemerd905da42014-07-01 20:30:31 +00001225 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001226 VTable->setInitializer(Init);
1227
1228 // Set the correct linkage.
1229 VTable->setLinkage(Linkage);
1230
1231 // Set the right visibility.
John McCall8f80a612014-02-08 00:41:16 +00001232 CGM.setGlobalVisibility(VTable, RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001233
1234 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1235 // we will emit the typeinfo for the fundamental types. This is the
1236 // same behaviour as GCC.
1237 const DeclContext *DC = RD->getDeclContext();
1238 if (RD->getIdentifier() &&
1239 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1240 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1241 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1242 DC->getParent()->isTranslationUnit())
David Majnemere2cb8d12014-07-07 06:20:47 +00001243 EmitFundamentalRTTIDescriptors();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001244}
1245
1246llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1247 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1248 const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) {
1249 bool NeedsVTTParam = CGM.getCXXABI().NeedsVTTParameter(CGF.CurGD);
1250 NeedsVirtualOffset = (NeedsVTTParam && NearestVBase);
1251
1252 llvm::Value *VTableAddressPoint;
1253 if (NeedsVTTParam && (Base.getBase()->getNumVBases() || NearestVBase)) {
1254 // Get the secondary vpointer index.
1255 uint64_t VirtualPointerIndex =
1256 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1257
1258 /// Load the VTT.
1259 llvm::Value *VTT = CGF.LoadCXXVTT();
1260 if (VirtualPointerIndex)
1261 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1262
1263 // And load the address point from the VTT.
1264 VTableAddressPoint = CGF.Builder.CreateLoad(VTT);
1265 } else {
1266 llvm::Constant *VTable =
1267 CGM.getCXXABI().getAddrOfVTable(VTableClass, CharUnits());
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001268 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1269 .getVTableLayout(VTableClass)
1270 .getAddressPoint(Base);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001271 VTableAddressPoint =
1272 CGF.Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint);
1273 }
1274
1275 return VTableAddressPoint;
1276}
1277
1278llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1279 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1280 llvm::Constant *VTable = getAddrOfVTable(VTableClass, CharUnits());
1281
1282 // Find the appropriate vtable within the vtable group.
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001283 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1284 .getVTableLayout(VTableClass)
1285 .getAddressPoint(Base);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001286 llvm::Value *Indices[] = {
1287 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1288 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1289 };
1290
1291 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Indices);
1292}
1293
1294llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1295 CharUnits VPtrOffset) {
1296 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1297
1298 llvm::GlobalVariable *&VTable = VTables[RD];
1299 if (VTable)
1300 return VTable;
1301
1302 // Queue up this v-table for possible deferred emission.
1303 CGM.addDeferredVTable(RD);
1304
1305 SmallString<256> OutName;
1306 llvm::raw_svector_ostream Out(OutName);
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001307 getMangleContext().mangleCXXVTable(RD, Out);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001308 Out.flush();
1309 StringRef Name = OutName.str();
1310
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001311 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001312 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1313 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1314
1315 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1316 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1317 VTable->setUnnamedAddr(true);
Hans Wennborgda24e9c2014-06-02 23:13:03 +00001318
1319 if (RD->hasAttr<DLLImportAttr>())
1320 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1321 else if (RD->hasAttr<DLLExportAttr>())
1322 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1323
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001324 return VTable;
1325}
1326
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001327llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1328 GlobalDecl GD,
1329 llvm::Value *This,
1330 llvm::Type *Ty) {
1331 GD = GD.getCanonicalDecl();
1332 Ty = Ty->getPointerTo()->getPointerTo();
1333 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
1334
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001335 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001336 llvm::Value *VFuncPtr =
1337 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
1338 return CGF.Builder.CreateLoad(VFuncPtr);
1339}
1340
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001341void ItaniumCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
1342 const CXXDestructorDecl *Dtor,
1343 CXXDtorType DtorType,
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001344 llvm::Value *This,
1345 const CXXMemberCallExpr *CE) {
1346 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001347 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1348
1349 const CGFunctionInfo *FInfo
1350 = &CGM.getTypes().arrangeCXXDestructor(Dtor, DtorType);
1351 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001352 llvm::Value *Callee =
1353 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty);
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001354
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001355 CGF.EmitCXXMemberOrOperatorCall(Dtor, Callee, ReturnValueSlot(), This,
1356 /*ImplicitParam=*/nullptr, QualType(), CE);
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001357}
1358
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001359void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
Reid Kleckner7810af02013-06-19 15:20:38 +00001360 CodeGenVTables &VTables = CGM.getVTables();
1361 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001362 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
Reid Kleckner7810af02013-06-19 15:20:38 +00001363}
1364
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001365static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
1366 llvm::Value *Ptr,
1367 int64_t NonVirtualAdjustment,
1368 int64_t VirtualAdjustment,
1369 bool IsReturnAdjustment) {
1370 if (!NonVirtualAdjustment && !VirtualAdjustment)
1371 return Ptr;
1372
1373 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1374 llvm::Value *V = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy);
1375
1376 if (NonVirtualAdjustment && !IsReturnAdjustment) {
1377 // Perform the non-virtual adjustment for a base-to-derived cast.
1378 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1379 }
1380
1381 if (VirtualAdjustment) {
1382 llvm::Type *PtrDiffTy =
1383 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1384
1385 // Perform the virtual adjustment.
1386 llvm::Value *VTablePtrPtr =
1387 CGF.Builder.CreateBitCast(V, Int8PtrTy->getPointerTo());
1388
1389 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1390
1391 llvm::Value *OffsetPtr =
1392 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1393
1394 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1395
1396 // Load the adjustment offset from the vtable.
1397 llvm::Value *Offset = CGF.Builder.CreateLoad(OffsetPtr);
1398
1399 // Adjust our pointer.
1400 V = CGF.Builder.CreateInBoundsGEP(V, Offset);
1401 }
1402
1403 if (NonVirtualAdjustment && IsReturnAdjustment) {
1404 // Perform the non-virtual adjustment for a derived-to-base cast.
1405 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1406 }
1407
1408 // Cast back to the original type.
1409 return CGF.Builder.CreateBitCast(V, Ptr->getType());
1410}
1411
1412llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1413 llvm::Value *This,
1414 const ThisAdjustment &TA) {
Timur Iskhodzhanov053142a2013-11-06 06:24:31 +00001415 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1416 TA.Virtual.Itanium.VCallOffsetOffset,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001417 /*IsReturnAdjustment=*/false);
1418}
1419
1420llvm::Value *
1421ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1422 const ReturnAdjustment &RA) {
1423 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1424 RA.Virtual.Itanium.VBaseOffsetOffset,
1425 /*IsReturnAdjustment=*/true);
1426}
1427
John McCall5d865c322010-08-31 07:33:07 +00001428void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1429 RValue RV, QualType ResultType) {
1430 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1431 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1432
1433 // Destructor thunks in the ARM ABI have indeterminate results.
Chris Lattner2192fe52011-07-18 04:24:23 +00001434 llvm::Type *T =
John McCall5d865c322010-08-31 07:33:07 +00001435 cast<llvm::PointerType>(CGF.ReturnValue->getType())->getElementType();
1436 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1437 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1438}
John McCall8ed55a52010-09-02 09:58:18 +00001439
1440/************************** Array allocation cookies **************************/
1441
John McCallb91cd662012-05-01 05:23:51 +00001442CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1443 // The array cookie is a size_t; pad that up to the element alignment.
1444 // The cookie is actually right-justified in that space.
1445 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1446 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001447}
1448
1449llvm::Value *ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1450 llvm::Value *NewPtr,
1451 llvm::Value *NumElements,
John McCall284c48f2011-01-27 09:37:56 +00001452 const CXXNewExpr *expr,
John McCall8ed55a52010-09-02 09:58:18 +00001453 QualType ElementType) {
John McCallb91cd662012-05-01 05:23:51 +00001454 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001455
Micah Villmowea2fea22012-10-25 15:39:14 +00001456 unsigned AS = NewPtr->getType()->getPointerAddressSpace();
John McCall8ed55a52010-09-02 09:58:18 +00001457
John McCall9bca9232010-09-02 10:25:57 +00001458 ASTContext &Ctx = getContext();
John McCall8ed55a52010-09-02 09:58:18 +00001459 QualType SizeTy = Ctx.getSizeType();
1460 CharUnits SizeSize = Ctx.getTypeSizeInChars(SizeTy);
1461
1462 // The size of the cookie.
1463 CharUnits CookieSize =
1464 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
John McCallb91cd662012-05-01 05:23:51 +00001465 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
John McCall8ed55a52010-09-02 09:58:18 +00001466
1467 // Compute an offset to the cookie.
1468 llvm::Value *CookiePtr = NewPtr;
1469 CharUnits CookieOffset = CookieSize - SizeSize;
1470 if (!CookieOffset.isZero())
1471 CookiePtr = CGF.Builder.CreateConstInBoundsGEP1_64(CookiePtr,
1472 CookieOffset.getQuantity());
1473
1474 // Write the number of elements into the appropriate slot.
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001475 llvm::Type *NumElementsTy = CGF.ConvertType(SizeTy)->getPointerTo(AS);
1476 llvm::Value *NumElementsPtr =
1477 CGF.Builder.CreateBitCast(CookiePtr, NumElementsTy);
1478 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001479 if (CGM.getLangOpts().Sanitize.Address && AS == 0 &&
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001480 expr->getOperatorNew()->isReplaceableGlobalAllocationFunction()) {
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001481 // The store to the CookiePtr does not need to be instrumented.
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001482 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
1483 llvm::FunctionType *FTy =
1484 llvm::FunctionType::get(CGM.VoidTy, NumElementsTy, false);
1485 llvm::Constant *F =
1486 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
1487 CGF.Builder.CreateCall(F, NumElementsPtr);
1488 }
John McCall8ed55a52010-09-02 09:58:18 +00001489
1490 // Finally, compute a pointer to the actual data buffer by skipping
1491 // over the cookie completely.
1492 return CGF.Builder.CreateConstInBoundsGEP1_64(NewPtr,
1493 CookieSize.getQuantity());
1494}
1495
John McCallb91cd662012-05-01 05:23:51 +00001496llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1497 llvm::Value *allocPtr,
1498 CharUnits cookieSize) {
1499 // The element size is right-justified in the cookie.
1500 llvm::Value *numElementsPtr = allocPtr;
1501 CharUnits numElementsOffset =
1502 cookieSize - CharUnits::fromQuantity(CGF.SizeSizeInBytes);
1503 if (!numElementsOffset.isZero())
1504 numElementsPtr =
1505 CGF.Builder.CreateConstInBoundsGEP1_64(numElementsPtr,
1506 numElementsOffset.getQuantity());
John McCall8ed55a52010-09-02 09:58:18 +00001507
Micah Villmowea2fea22012-10-25 15:39:14 +00001508 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
John McCallb91cd662012-05-01 05:23:51 +00001509 numElementsPtr =
1510 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001511 if (!CGM.getLangOpts().Sanitize.Address || AS != 0)
1512 return CGF.Builder.CreateLoad(numElementsPtr);
1513 // In asan mode emit a function call instead of a regular load and let the
1514 // run-time deal with it: if the shadow is properly poisoned return the
1515 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
1516 // We can't simply ignore this load using nosanitize metadata because
1517 // the metadata may be lost.
1518 llvm::FunctionType *FTy =
1519 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
1520 llvm::Constant *F =
1521 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
1522 return CGF.Builder.CreateCall(F, numElementsPtr);
John McCall8ed55a52010-09-02 09:58:18 +00001523}
1524
John McCallb91cd662012-05-01 05:23:51 +00001525CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
John McCallc19c7062013-01-25 23:36:19 +00001526 // ARM says that the cookie is always:
John McCall8ed55a52010-09-02 09:58:18 +00001527 // struct array_cookie {
1528 // std::size_t element_size; // element_size != 0
1529 // std::size_t element_count;
1530 // };
John McCallc19c7062013-01-25 23:36:19 +00001531 // But the base ABI doesn't give anything an alignment greater than
1532 // 8, so we can dismiss this as typical ABI-author blindness to
1533 // actual language complexity and round up to the element alignment.
1534 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1535 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001536}
1537
1538llvm::Value *ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
John McCallc19c7062013-01-25 23:36:19 +00001539 llvm::Value *newPtr,
1540 llvm::Value *numElements,
John McCall284c48f2011-01-27 09:37:56 +00001541 const CXXNewExpr *expr,
John McCallc19c7062013-01-25 23:36:19 +00001542 QualType elementType) {
John McCallb91cd662012-05-01 05:23:51 +00001543 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001544
John McCallc19c7062013-01-25 23:36:19 +00001545 // NewPtr is a char*, but we generalize to arbitrary addrspaces.
1546 unsigned AS = newPtr->getType()->getPointerAddressSpace();
John McCall8ed55a52010-09-02 09:58:18 +00001547
1548 // The cookie is always at the start of the buffer.
John McCallc19c7062013-01-25 23:36:19 +00001549 llvm::Value *cookie = newPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001550
1551 // The first element is the element size.
John McCallc19c7062013-01-25 23:36:19 +00001552 cookie = CGF.Builder.CreateBitCast(cookie, CGF.SizeTy->getPointerTo(AS));
1553 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1554 getContext().getTypeSizeInChars(elementType).getQuantity());
1555 CGF.Builder.CreateStore(elementSize, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001556
1557 // The second element is the element count.
John McCallc19c7062013-01-25 23:36:19 +00001558 cookie = CGF.Builder.CreateConstInBoundsGEP1_32(cookie, 1);
1559 CGF.Builder.CreateStore(numElements, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001560
1561 // Finally, compute a pointer to the actual data buffer by skipping
1562 // over the cookie completely.
John McCallc19c7062013-01-25 23:36:19 +00001563 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
1564 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
1565 cookieSize.getQuantity());
John McCall8ed55a52010-09-02 09:58:18 +00001566}
1567
John McCallb91cd662012-05-01 05:23:51 +00001568llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1569 llvm::Value *allocPtr,
1570 CharUnits cookieSize) {
1571 // The number of elements is at offset sizeof(size_t) relative to
1572 // the allocated pointer.
1573 llvm::Value *numElementsPtr
1574 = CGF.Builder.CreateConstInBoundsGEP1_64(allocPtr, CGF.SizeSizeInBytes);
John McCall8ed55a52010-09-02 09:58:18 +00001575
Micah Villmowea2fea22012-10-25 15:39:14 +00001576 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
John McCallb91cd662012-05-01 05:23:51 +00001577 numElementsPtr =
1578 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1579 return CGF.Builder.CreateLoad(numElementsPtr);
John McCall8ed55a52010-09-02 09:58:18 +00001580}
1581
John McCall68ff0372010-09-08 01:44:27 +00001582/*********************** Static local initialization **************************/
1583
1584static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001585 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001586 // int __cxa_guard_acquire(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001587 llvm::FunctionType *FTy =
John McCall68ff0372010-09-08 01:44:27 +00001588 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
Jay Foad5709f7c2011-07-29 13:56:53 +00001589 GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001590 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001591 llvm::AttributeSet::get(CGM.getLLVMContext(),
1592 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001593 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001594}
1595
1596static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001597 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001598 // void __cxa_guard_release(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001599 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001600 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001601 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001602 llvm::AttributeSet::get(CGM.getLLVMContext(),
1603 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001604 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001605}
1606
1607static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001608 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001609 // void __cxa_guard_abort(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001610 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001611 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001612 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001613 llvm::AttributeSet::get(CGM.getLLVMContext(),
1614 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001615 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001616}
1617
1618namespace {
1619 struct CallGuardAbort : EHScopeStack::Cleanup {
1620 llvm::GlobalVariable *Guard;
Chandler Carruth84537952012-03-30 19:44:53 +00001621 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
John McCall68ff0372010-09-08 01:44:27 +00001622
Craig Topper4f12f102014-03-12 06:41:41 +00001623 void Emit(CodeGenFunction &CGF, Flags flags) override {
John McCall882987f2013-02-28 19:01:20 +00001624 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1625 Guard);
John McCall68ff0372010-09-08 01:44:27 +00001626 }
1627 };
1628}
1629
1630/// The ARM code here follows the Itanium code closely enough that we
1631/// just special-case it at particular places.
John McCallcdf7ef52010-11-06 09:44:32 +00001632void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1633 const VarDecl &D,
John McCallb88a5662012-03-30 21:00:39 +00001634 llvm::GlobalVariable *var,
1635 bool shouldPerformInit) {
John McCall68ff0372010-09-08 01:44:27 +00001636 CGBuilderTy &Builder = CGF.Builder;
John McCallcdf7ef52010-11-06 09:44:32 +00001637
Richard Smithdbf74ba2013-04-14 23:01:42 +00001638 // We only need to use thread-safe statics for local non-TLS variables;
John McCallcdf7ef52010-11-06 09:44:32 +00001639 // global initialization is always single-threaded.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001640 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1641 D.isLocalVarDecl() && !D.getTLSKind();
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001642
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001643 // If we have a global variable with internal linkage and thread-safe statics
1644 // are disabled, we can just let the guard variable be of type i8.
John McCallb88a5662012-03-30 21:00:39 +00001645 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1646
1647 llvm::IntegerType *guardTy;
John McCall5aa52592011-06-17 07:33:57 +00001648 if (useInt8GuardVariable) {
John McCallb88a5662012-03-30 21:00:39 +00001649 guardTy = CGF.Int8Ty;
John McCall5aa52592011-06-17 07:33:57 +00001650 } else {
Tim Northover9bb857a2013-01-31 12:13:10 +00001651 // Guard variables are 64 bits in the generic ABI and size width on ARM
1652 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
Mark Seabornedf0d382013-07-24 16:25:13 +00001653 guardTy = (UseARMGuardVarABI ? CGF.SizeTy : CGF.Int64Ty);
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001654 }
John McCallb88a5662012-03-30 21:00:39 +00001655 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
John McCall68ff0372010-09-08 01:44:27 +00001656
John McCallb88a5662012-03-30 21:00:39 +00001657 // Create the guard variable if we don't already have it (as we
1658 // might if we're double-emitting this function body).
1659 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1660 if (!guard) {
1661 // Mangle the name for the guard.
1662 SmallString<256> guardName;
1663 {
1664 llvm::raw_svector_ostream out(guardName);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001665 getMangleContext().mangleStaticGuardVariable(&D, out);
John McCallb88a5662012-03-30 21:00:39 +00001666 out.flush();
1667 }
John McCall8e7cb6d2010-11-02 21:04:24 +00001668
John McCallb88a5662012-03-30 21:00:39 +00001669 // Create the guard variable with a zero-initializer.
1670 // Just absorb linkage and visibility from the guarded variable.
1671 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1672 false, var->getLinkage(),
1673 llvm::ConstantInt::get(guardTy, 0),
1674 guardName.str());
1675 guard->setVisibility(var->getVisibility());
Richard Smithdbf74ba2013-04-14 23:01:42 +00001676 // If the variable is thread-local, so is its guard variable.
1677 guard->setThreadLocalMode(var->getThreadLocalMode());
John McCallb88a5662012-03-30 21:00:39 +00001678
1679 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1680 }
John McCall87590e62012-03-30 07:09:50 +00001681
John McCall68ff0372010-09-08 01:44:27 +00001682 // Test whether the variable has completed initialization.
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001683 //
John McCall68ff0372010-09-08 01:44:27 +00001684 // Itanium C++ ABI 3.3.2:
1685 // The following is pseudo-code showing how these functions can be used:
1686 // if (obj_guard.first_byte == 0) {
1687 // if ( __cxa_guard_acquire (&obj_guard) ) {
1688 // try {
1689 // ... initialize the object ...;
1690 // } catch (...) {
1691 // __cxa_guard_abort (&obj_guard);
1692 // throw;
1693 // }
1694 // ... queue object destructor with __cxa_atexit() ...;
1695 // __cxa_guard_release (&obj_guard);
1696 // }
1697 // }
Tim Northovera2ee4332014-03-29 15:09:45 +00001698
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001699 // Load the first byte of the guard variable.
1700 llvm::LoadInst *LI =
John McCallb88a5662012-03-30 21:00:39 +00001701 Builder.CreateLoad(Builder.CreateBitCast(guard, CGM.Int8PtrTy));
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001702 LI->setAlignment(1);
John McCall68ff0372010-09-08 01:44:27 +00001703
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001704 // Itanium ABI:
1705 // An implementation supporting thread-safety on multiprocessor
1706 // systems must also guarantee that references to the initialized
1707 // object do not occur before the load of the initialization flag.
1708 //
1709 // In LLVM, we do this by marking the load Acquire.
1710 if (threadsafe)
1711 LI->setAtomic(llvm::Acquire);
Eli Friedman84d28122011-09-13 22:21:56 +00001712
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001713 // For ARM, we should only check the first bit, rather than the entire byte:
1714 //
1715 // ARM C++ ABI 3.2.3.1:
1716 // To support the potential use of initialization guard variables
1717 // as semaphores that are the target of ARM SWP and LDREX/STREX
1718 // synchronizing instructions we define a static initialization
1719 // guard variable to be a 4-byte aligned, 4-byte word with the
1720 // following inline access protocol.
1721 // #define INITIALIZED 1
1722 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
1723 // if (__cxa_guard_acquire(&obj_guard))
1724 // ...
1725 // }
1726 //
1727 // and similarly for ARM64:
1728 //
1729 // ARM64 C++ ABI 3.2.2:
1730 // This ABI instead only specifies the value bit 0 of the static guard
1731 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
1732 // variable is not initialized and 1 when it is.
1733 llvm::Value *V =
1734 (UseARMGuardVarABI && !useInt8GuardVariable)
1735 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
1736 : LI;
1737 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
John McCall68ff0372010-09-08 01:44:27 +00001738
1739 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
1740 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1741
1742 // Check if the first byte of the guard variable is zero.
John McCallb88a5662012-03-30 21:00:39 +00001743 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
John McCall68ff0372010-09-08 01:44:27 +00001744
1745 CGF.EmitBlock(InitCheckBlock);
1746
1747 // Variables used when coping with thread-safe statics and exceptions.
John McCall5aa52592011-06-17 07:33:57 +00001748 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00001749 // Call __cxa_guard_acquire.
1750 llvm::Value *V
John McCall882987f2013-02-28 19:01:20 +00001751 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
John McCall68ff0372010-09-08 01:44:27 +00001752
1753 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1754
1755 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
1756 InitBlock, EndBlock);
1757
1758 // Call __cxa_guard_abort along the exceptional edge.
John McCallb88a5662012-03-30 21:00:39 +00001759 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
John McCall68ff0372010-09-08 01:44:27 +00001760
1761 CGF.EmitBlock(InitBlock);
1762 }
1763
1764 // Emit the initializer and add a global destructor if appropriate.
John McCallb88a5662012-03-30 21:00:39 +00001765 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
John McCall68ff0372010-09-08 01:44:27 +00001766
John McCall5aa52592011-06-17 07:33:57 +00001767 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00001768 // Pop the guard-abort cleanup if we pushed one.
1769 CGF.PopCleanupBlock();
1770
1771 // Call __cxa_guard_release. This cannot throw.
John McCall882987f2013-02-28 19:01:20 +00001772 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), guard);
John McCall68ff0372010-09-08 01:44:27 +00001773 } else {
John McCallb88a5662012-03-30 21:00:39 +00001774 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guard);
John McCall68ff0372010-09-08 01:44:27 +00001775 }
1776
1777 CGF.EmitBlock(EndBlock);
1778}
John McCallc84ed6a2012-05-01 06:13:13 +00001779
1780/// Register a global destructor using __cxa_atexit.
1781static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
1782 llvm::Constant *dtor,
Richard Smithdbf74ba2013-04-14 23:01:42 +00001783 llvm::Constant *addr,
1784 bool TLS) {
Bill Wendling95cae882013-05-02 19:18:03 +00001785 const char *Name = "__cxa_atexit";
1786 if (TLS) {
1787 const llvm::Triple &T = CGF.getTarget().getTriple();
1788 Name = T.isMacOSX() ? "_tlv_atexit" : "__cxa_thread_atexit";
1789 }
Richard Smithdbf74ba2013-04-14 23:01:42 +00001790
John McCallc84ed6a2012-05-01 06:13:13 +00001791 // We're assuming that the destructor function is something we can
1792 // reasonably call with the default CC. Go ahead and cast it to the
1793 // right prototype.
1794 llvm::Type *dtorTy =
1795 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
1796
1797 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
1798 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
1799 llvm::FunctionType *atexitTy =
1800 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
1801
1802 // Fetch the actual function.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001803 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
John McCallc84ed6a2012-05-01 06:13:13 +00001804 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
1805 fn->setDoesNotThrow();
1806
1807 // Create a variable that binds the atexit to this shared object.
1808 llvm::Constant *handle =
1809 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
1810
1811 llvm::Value *args[] = {
1812 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
1813 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
1814 handle
1815 };
John McCall882987f2013-02-28 19:01:20 +00001816 CGF.EmitNounwindRuntimeCall(atexit, args);
John McCallc84ed6a2012-05-01 06:13:13 +00001817}
1818
1819/// Register a global destructor as best as we know how.
1820void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
Richard Smithdbf74ba2013-04-14 23:01:42 +00001821 const VarDecl &D,
John McCallc84ed6a2012-05-01 06:13:13 +00001822 llvm::Constant *dtor,
1823 llvm::Constant *addr) {
1824 // Use __cxa_atexit if available.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001825 if (CGM.getCodeGenOpts().CXAAtExit)
1826 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
1827
1828 if (D.getTLSKind())
1829 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
John McCallc84ed6a2012-05-01 06:13:13 +00001830
1831 // In Apple kexts, we want to add a global destructor entry.
1832 // FIXME: shouldn't this be guarded by some variable?
Richard Smith9c6890a2012-11-01 22:30:59 +00001833 if (CGM.getLangOpts().AppleKext) {
John McCallc84ed6a2012-05-01 06:13:13 +00001834 // Generate a global destructor entry.
1835 return CGM.AddCXXDtorEntry(dtor, addr);
1836 }
1837
David Blaikieebe87e12013-08-27 23:57:18 +00001838 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
John McCallc84ed6a2012-05-01 06:13:13 +00001839}
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001840
David Majnemer9b21c332014-07-11 20:28:10 +00001841static bool isThreadWrapperReplaceable(const VarDecl *VD,
1842 CodeGen::CodeGenModule &CGM) {
1843 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
1844 // OS X prefers to have references to thread local variables to go through
1845 // the thread wrapper instead of directly referencing the backing variable.
1846 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
1847 CGM.getTarget().getTriple().isMacOSX();
1848}
1849
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001850/// Get the appropriate linkage for the wrapper function. This is essentially
David Majnemer4632e1e2014-06-27 16:56:27 +00001851/// the weak form of the variable's linkage; every translation unit which needs
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001852/// the wrapper emits a copy, and we want the linker to merge them.
David Majnemer35ab3282014-06-11 04:08:55 +00001853static llvm::GlobalValue::LinkageTypes
1854getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
1855 llvm::GlobalValue::LinkageTypes VarLinkage =
1856 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
1857
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001858 // For internal linkage variables, we don't need an external or weak wrapper.
1859 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
1860 return VarLinkage;
David Majnemer35ab3282014-06-11 04:08:55 +00001861
David Majnemer9b21c332014-07-11 20:28:10 +00001862 // If the thread wrapper is replaceable, give it appropriate linkage.
1863 if (isThreadWrapperReplaceable(VD, CGM)) {
1864 if (llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) ||
1865 llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
1866 return llvm::GlobalVariable::WeakAnyLinkage;
1867 return VarLinkage;
1868 }
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001869 return llvm::GlobalValue::WeakODRLinkage;
1870}
1871
1872llvm::Function *
1873ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
1874 llvm::GlobalVariable *Var) {
1875 // Mangle the name for the thread_local wrapper function.
1876 SmallString<256> WrapperName;
1877 {
1878 llvm::raw_svector_ostream Out(WrapperName);
1879 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
1880 Out.flush();
1881 }
1882
1883 if (llvm::Value *V = Var->getParent()->getNamedValue(WrapperName))
1884 return cast<llvm::Function>(V);
1885
1886 llvm::Type *RetTy = Var->getType();
1887 if (VD->getType()->isReferenceType())
1888 RetTy = RetTy->getPointerElementType();
1889
1890 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
David Majnemer35ab3282014-06-11 04:08:55 +00001891 llvm::Function *Wrapper =
1892 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
1893 WrapperName.str(), &CGM.getModule());
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001894 // Always resolve references to the wrapper at link time.
David Majnemer9b21c332014-07-11 20:28:10 +00001895 if (!Wrapper->hasLocalLinkage() && !isThreadWrapperReplaceable(VD, CGM))
Duncan P. N. Exon Smith4434d362014-05-07 22:36:11 +00001896 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001897 return Wrapper;
1898}
1899
1900void ItaniumCXXABI::EmitThreadLocalInitFuncs(
Craig Topper00bbdcf2014-06-28 23:22:23 +00001901 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001902 llvm::Function *InitFunc) {
1903 for (unsigned I = 0, N = Decls.size(); I != N; ++I) {
1904 const VarDecl *VD = Decls[I].first;
1905 llvm::GlobalVariable *Var = Decls[I].second;
1906
David Majnemer9b21c332014-07-11 20:28:10 +00001907 // Some targets require that all access to thread local variables go through
1908 // the thread wrapper. This means that we cannot attempt to create a thread
1909 // wrapper or a thread helper.
1910 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
1911 continue;
1912
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001913 // Mangle the name for the thread_local initialization function.
1914 SmallString<256> InitFnName;
1915 {
1916 llvm::raw_svector_ostream Out(InitFnName);
1917 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
1918 Out.flush();
1919 }
1920
1921 // If we have a definition for the variable, emit the initialization
1922 // function as an alias to the global Init function (if any). Otherwise,
1923 // produce a declaration of the initialization function.
Craig Topper8a13c412014-05-21 05:09:00 +00001924 llvm::GlobalValue *Init = nullptr;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001925 bool InitIsInitFunc = false;
1926 if (VD->hasDefinition()) {
1927 InitIsInitFunc = true;
1928 if (InitFunc)
Rafael Espindola234405b2014-05-17 21:30:14 +00001929 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
1930 InitFunc);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001931 } else {
1932 // Emit a weak global function referring to the initialization function.
1933 // This function will not exist if the TU defining the thread_local
1934 // variable in question does not need any dynamic initialization for
1935 // its thread_local variables.
1936 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
1937 Init = llvm::Function::Create(
1938 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
1939 &CGM.getModule());
1940 }
1941
1942 if (Init)
1943 Init->setVisibility(Var->getVisibility());
1944
1945 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
1946 llvm::LLVMContext &Context = CGM.getModule().getContext();
1947 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
1948 CGBuilderTy Builder(Entry);
1949 if (InitIsInitFunc) {
1950 if (Init)
1951 Builder.CreateCall(Init);
1952 } else {
1953 // Don't know whether we have an init function. Call it if it exists.
1954 llvm::Value *Have = Builder.CreateIsNotNull(Init);
1955 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1956 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1957 Builder.CreateCondBr(Have, InitBB, ExitBB);
1958
1959 Builder.SetInsertPoint(InitBB);
1960 Builder.CreateCall(Init);
1961 Builder.CreateBr(ExitBB);
1962
1963 Builder.SetInsertPoint(ExitBB);
1964 }
1965
1966 // For a reference, the result of the wrapper function is a pointer to
1967 // the referenced object.
1968 llvm::Value *Val = Var;
1969 if (VD->getType()->isReferenceType()) {
1970 llvm::LoadInst *LI = Builder.CreateLoad(Val);
1971 LI->setAlignment(CGM.getContext().getDeclAlign(VD).getQuantity());
1972 Val = LI;
1973 }
1974
1975 Builder.CreateRet(Val);
1976 }
1977}
1978
Richard Smith0f383742014-03-26 22:48:22 +00001979LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
1980 const VarDecl *VD,
1981 QualType LValType) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001982 QualType T = VD->getType();
1983 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
1984 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
1985 llvm::Function *Wrapper =
1986 getOrCreateThreadLocalWrapper(VD, cast<llvm::GlobalVariable>(Val));
1987
1988 Val = CGF.Builder.CreateCall(Wrapper);
1989
1990 LValue LV;
1991 if (VD->getType()->isReferenceType())
Richard Smith0f383742014-03-26 22:48:22 +00001992 LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001993 else
Richard Smith0f383742014-03-26 22:48:22 +00001994 LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD));
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001995 // FIXME: need setObjCGCLValueClass?
1996 return LV;
1997}
Peter Collingbourne66f82e62013-06-28 20:45:28 +00001998
1999/// Return whether the given global decl needs a VTT parameter, which it does
2000/// if it's a base constructor or destructor with virtual bases.
2001bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
2002 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
2003
2004 // We don't have any virtual bases, just return early.
2005 if (!MD->getParent()->getNumVBases())
2006 return false;
2007
2008 // Check if we have a base constructor.
2009 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
2010 return true;
2011
2012 // Check if we have a base destructor.
2013 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2014 return true;
2015
2016 return false;
2017}
David Majnemere2cb8d12014-07-07 06:20:47 +00002018
2019namespace {
2020class ItaniumRTTIBuilder {
2021 CodeGenModule &CGM; // Per-module state.
2022 llvm::LLVMContext &VMContext;
2023 const ItaniumCXXABI &CXXABI; // Per-module state.
2024
2025 /// Fields - The fields of the RTTI descriptor currently being built.
2026 SmallVector<llvm::Constant *, 16> Fields;
2027
2028 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2029 llvm::GlobalVariable *
2030 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2031
2032 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2033 /// descriptor of the given type.
2034 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2035
2036 /// BuildVTablePointer - Build the vtable pointer for the given type.
2037 void BuildVTablePointer(const Type *Ty);
2038
2039 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2040 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2041 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2042
2043 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2044 /// classes with bases that do not satisfy the abi::__si_class_type_info
2045 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2046 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2047
2048 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2049 /// for pointer types.
2050 void BuildPointerTypeInfo(QualType PointeeTy);
2051
2052 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2053 /// type_info for an object type.
2054 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2055
2056 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2057 /// struct, used for member pointer types.
2058 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2059
2060public:
2061 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2062 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2063
2064 // Pointer type info flags.
2065 enum {
2066 /// PTI_Const - Type has const qualifier.
2067 PTI_Const = 0x1,
2068
2069 /// PTI_Volatile - Type has volatile qualifier.
2070 PTI_Volatile = 0x2,
2071
2072 /// PTI_Restrict - Type has restrict qualifier.
2073 PTI_Restrict = 0x4,
2074
2075 /// PTI_Incomplete - Type is incomplete.
2076 PTI_Incomplete = 0x8,
2077
2078 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2079 /// (in pointer to member).
2080 PTI_ContainingClassIncomplete = 0x10
2081 };
2082
2083 // VMI type info flags.
2084 enum {
2085 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2086 VMI_NonDiamondRepeat = 0x1,
2087
2088 /// VMI_DiamondShaped - Class is diamond shaped.
2089 VMI_DiamondShaped = 0x2
2090 };
2091
2092 // Base class type info flags.
2093 enum {
2094 /// BCTI_Virtual - Base class is virtual.
2095 BCTI_Virtual = 0x1,
2096
2097 /// BCTI_Public - Base class is public.
2098 BCTI_Public = 0x2
2099 };
2100
2101 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2102 ///
2103 /// \param Force - true to force the creation of this RTTI value
2104 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2105};
2106}
2107
2108llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2109 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
2110 SmallString<256> OutName;
2111 llvm::raw_svector_ostream Out(OutName);
2112 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
2113 Out.flush();
2114 StringRef Name = OutName.str();
2115
2116 // We know that the mangled name of the type starts at index 4 of the
2117 // mangled name of the typename, so we can just index into it in order to
2118 // get the mangled name of the type.
2119 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2120 Name.substr(4));
2121
2122 llvm::GlobalVariable *GV =
2123 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2124
2125 GV->setInitializer(Init);
2126
2127 return GV;
2128}
2129
2130llvm::Constant *
2131ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2132 // Mangle the RTTI name.
2133 SmallString<256> OutName;
2134 llvm::raw_svector_ostream Out(OutName);
2135 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2136 Out.flush();
2137 StringRef Name = OutName.str();
2138
2139 // Look for an existing global.
2140 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2141
2142 if (!GV) {
2143 // Create a new global variable.
2144 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2145 /*Constant=*/true,
2146 llvm::GlobalValue::ExternalLinkage, nullptr,
2147 Name);
2148 }
2149
2150 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2151}
2152
2153/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2154/// info for that type is defined in the standard library.
2155static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2156 // Itanium C++ ABI 2.9.2:
2157 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2158 // the run-time support library. Specifically, the run-time support
2159 // library should contain type_info objects for the types X, X* and
2160 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2161 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2162 // long, unsigned long, long long, unsigned long long, float, double,
2163 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2164 // half-precision floating point types.
2165 switch (Ty->getKind()) {
2166 case BuiltinType::Void:
2167 case BuiltinType::NullPtr:
2168 case BuiltinType::Bool:
2169 case BuiltinType::WChar_S:
2170 case BuiltinType::WChar_U:
2171 case BuiltinType::Char_U:
2172 case BuiltinType::Char_S:
2173 case BuiltinType::UChar:
2174 case BuiltinType::SChar:
2175 case BuiltinType::Short:
2176 case BuiltinType::UShort:
2177 case BuiltinType::Int:
2178 case BuiltinType::UInt:
2179 case BuiltinType::Long:
2180 case BuiltinType::ULong:
2181 case BuiltinType::LongLong:
2182 case BuiltinType::ULongLong:
2183 case BuiltinType::Half:
2184 case BuiltinType::Float:
2185 case BuiltinType::Double:
2186 case BuiltinType::LongDouble:
2187 case BuiltinType::Char16:
2188 case BuiltinType::Char32:
2189 case BuiltinType::Int128:
2190 case BuiltinType::UInt128:
2191 case BuiltinType::OCLImage1d:
2192 case BuiltinType::OCLImage1dArray:
2193 case BuiltinType::OCLImage1dBuffer:
2194 case BuiltinType::OCLImage2d:
2195 case BuiltinType::OCLImage2dArray:
2196 case BuiltinType::OCLImage3d:
2197 case BuiltinType::OCLSampler:
2198 case BuiltinType::OCLEvent:
2199 return true;
2200
2201 case BuiltinType::Dependent:
2202#define BUILTIN_TYPE(Id, SingletonId)
2203#define PLACEHOLDER_TYPE(Id, SingletonId) \
2204 case BuiltinType::Id:
2205#include "clang/AST/BuiltinTypes.def"
2206 llvm_unreachable("asking for RRTI for a placeholder type!");
2207
2208 case BuiltinType::ObjCId:
2209 case BuiltinType::ObjCClass:
2210 case BuiltinType::ObjCSel:
2211 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2212 }
2213
2214 llvm_unreachable("Invalid BuiltinType Kind!");
2215}
2216
2217static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2218 QualType PointeeTy = PointerTy->getPointeeType();
2219 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2220 if (!BuiltinTy)
2221 return false;
2222
2223 // Check the qualifiers.
2224 Qualifiers Quals = PointeeTy.getQualifiers();
2225 Quals.removeConst();
2226
2227 if (!Quals.empty())
2228 return false;
2229
2230 return TypeInfoIsInStandardLibrary(BuiltinTy);
2231}
2232
2233/// IsStandardLibraryRTTIDescriptor - Returns whether the type
2234/// information for the given type exists in the standard library.
2235static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2236 // Type info for builtin types is defined in the standard library.
2237 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2238 return TypeInfoIsInStandardLibrary(BuiltinTy);
2239
2240 // Type info for some pointer types to builtin types is defined in the
2241 // standard library.
2242 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2243 return TypeInfoIsInStandardLibrary(PointerTy);
2244
2245 return false;
2246}
2247
2248/// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2249/// the given type exists somewhere else, and that we should not emit the type
2250/// information in this translation unit. Assumes that it is not a
2251/// standard-library type.
2252static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2253 QualType Ty) {
2254 ASTContext &Context = CGM.getContext();
2255
2256 // If RTTI is disabled, assume it might be disabled in the
2257 // translation unit that defines any potential key function, too.
2258 if (!Context.getLangOpts().RTTI) return false;
2259
2260 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2261 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2262 if (!RD->hasDefinition())
2263 return false;
2264
2265 if (!RD->isDynamicClass())
2266 return false;
2267
2268 // FIXME: this may need to be reconsidered if the key function
2269 // changes.
2270 return CGM.getVTables().isVTableExternal(RD);
2271 }
2272
2273 return false;
2274}
2275
2276/// IsIncompleteClassType - Returns whether the given record type is incomplete.
2277static bool IsIncompleteClassType(const RecordType *RecordTy) {
2278 return !RecordTy->getDecl()->isCompleteDefinition();
2279}
2280
2281/// ContainsIncompleteClassType - Returns whether the given type contains an
2282/// incomplete class type. This is true if
2283///
2284/// * The given type is an incomplete class type.
2285/// * The given type is a pointer type whose pointee type contains an
2286/// incomplete class type.
2287/// * The given type is a member pointer type whose class is an incomplete
2288/// class type.
2289/// * The given type is a member pointer type whoise pointee type contains an
2290/// incomplete class type.
2291/// is an indirect or direct pointer to an incomplete class type.
2292static bool ContainsIncompleteClassType(QualType Ty) {
2293 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2294 if (IsIncompleteClassType(RecordTy))
2295 return true;
2296 }
2297
2298 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2299 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2300
2301 if (const MemberPointerType *MemberPointerTy =
2302 dyn_cast<MemberPointerType>(Ty)) {
2303 // Check if the class type is incomplete.
2304 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2305 if (IsIncompleteClassType(ClassType))
2306 return true;
2307
2308 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2309 }
2310
2311 return false;
2312}
2313
2314// CanUseSingleInheritance - Return whether the given record decl has a "single,
2315// public, non-virtual base at offset zero (i.e. the derived class is dynamic
2316// iff the base is)", according to Itanium C++ ABI, 2.95p6b.
2317static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2318 // Check the number of bases.
2319 if (RD->getNumBases() != 1)
2320 return false;
2321
2322 // Get the base.
2323 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2324
2325 // Check that the base is not virtual.
2326 if (Base->isVirtual())
2327 return false;
2328
2329 // Check that the base is public.
2330 if (Base->getAccessSpecifier() != AS_public)
2331 return false;
2332
2333 // Check that the class is dynamic iff the base is.
2334 const CXXRecordDecl *BaseDecl =
2335 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2336 if (!BaseDecl->isEmpty() &&
2337 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2338 return false;
2339
2340 return true;
2341}
2342
2343void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2344 // abi::__class_type_info.
2345 static const char * const ClassTypeInfo =
2346 "_ZTVN10__cxxabiv117__class_type_infoE";
2347 // abi::__si_class_type_info.
2348 static const char * const SIClassTypeInfo =
2349 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2350 // abi::__vmi_class_type_info.
2351 static const char * const VMIClassTypeInfo =
2352 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2353
2354 const char *VTableName = nullptr;
2355
2356 switch (Ty->getTypeClass()) {
2357#define TYPE(Class, Base)
2358#define ABSTRACT_TYPE(Class, Base)
2359#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2360#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2361#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2362#include "clang/AST/TypeNodes.def"
2363 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2364
2365 case Type::LValueReference:
2366 case Type::RValueReference:
2367 llvm_unreachable("References shouldn't get here");
2368
2369 case Type::Auto:
2370 llvm_unreachable("Undeduced auto type shouldn't get here");
2371
2372 case Type::Builtin:
2373 // GCC treats vector and complex types as fundamental types.
2374 case Type::Vector:
2375 case Type::ExtVector:
2376 case Type::Complex:
2377 case Type::Atomic:
2378 // FIXME: GCC treats block pointers as fundamental types?!
2379 case Type::BlockPointer:
2380 // abi::__fundamental_type_info.
2381 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2382 break;
2383
2384 case Type::ConstantArray:
2385 case Type::IncompleteArray:
2386 case Type::VariableArray:
2387 // abi::__array_type_info.
2388 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2389 break;
2390
2391 case Type::FunctionNoProto:
2392 case Type::FunctionProto:
2393 // abi::__function_type_info.
2394 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2395 break;
2396
2397 case Type::Enum:
2398 // abi::__enum_type_info.
2399 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2400 break;
2401
2402 case Type::Record: {
2403 const CXXRecordDecl *RD =
2404 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2405
2406 if (!RD->hasDefinition() || !RD->getNumBases()) {
2407 VTableName = ClassTypeInfo;
2408 } else if (CanUseSingleInheritance(RD)) {
2409 VTableName = SIClassTypeInfo;
2410 } else {
2411 VTableName = VMIClassTypeInfo;
2412 }
2413
2414 break;
2415 }
2416
2417 case Type::ObjCObject:
2418 // Ignore protocol qualifiers.
2419 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2420
2421 // Handle id and Class.
2422 if (isa<BuiltinType>(Ty)) {
2423 VTableName = ClassTypeInfo;
2424 break;
2425 }
2426
2427 assert(isa<ObjCInterfaceType>(Ty));
2428 // Fall through.
2429
2430 case Type::ObjCInterface:
2431 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2432 VTableName = SIClassTypeInfo;
2433 } else {
2434 VTableName = ClassTypeInfo;
2435 }
2436 break;
2437
2438 case Type::ObjCObjectPointer:
2439 case Type::Pointer:
2440 // abi::__pointer_type_info.
2441 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2442 break;
2443
2444 case Type::MemberPointer:
2445 // abi::__pointer_to_member_type_info.
2446 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2447 break;
2448 }
2449
2450 llvm::Constant *VTable =
2451 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2452
2453 llvm::Type *PtrDiffTy =
2454 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2455
2456 // The vtable address point is 2.
2457 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
2458 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Two);
2459 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2460
2461 Fields.push_back(VTable);
2462}
2463
2464/// \brief Return the linkage that the type info and type info name constants
2465/// should have for the given type.
2466static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2467 QualType Ty) {
2468 // Itanium C++ ABI 2.9.5p7:
2469 // In addition, it and all of the intermediate abi::__pointer_type_info
2470 // structs in the chain down to the abi::__class_type_info for the
2471 // incomplete class type must be prevented from resolving to the
2472 // corresponding type_info structs for the complete class type, possibly
2473 // by making them local static objects. Finally, a dummy class RTTI is
2474 // generated for the incomplete type that will not resolve to the final
2475 // complete class RTTI (because the latter need not exist), possibly by
2476 // making it a local static object.
2477 if (ContainsIncompleteClassType(Ty))
2478 return llvm::GlobalValue::InternalLinkage;
2479
2480 switch (Ty->getLinkage()) {
2481 case NoLinkage:
2482 case InternalLinkage:
2483 case UniqueExternalLinkage:
2484 return llvm::GlobalValue::InternalLinkage;
2485
2486 case VisibleNoLinkage:
2487 case ExternalLinkage:
2488 if (!CGM.getLangOpts().RTTI) {
2489 // RTTI is not enabled, which means that this type info struct is going
2490 // to be used for exception handling. Give it linkonce_odr linkage.
2491 return llvm::GlobalValue::LinkOnceODRLinkage;
2492 }
2493
2494 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2495 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2496 if (RD->hasAttr<WeakAttr>())
2497 return llvm::GlobalValue::WeakODRLinkage;
2498 if (RD->isDynamicClass())
2499 return CGM.getVTableLinkage(RD);
2500 }
2501
2502 return llvm::GlobalValue::LinkOnceODRLinkage;
2503 }
2504
2505 llvm_unreachable("Invalid linkage!");
2506}
2507
2508llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2509 // We want to operate on the canonical type.
2510 Ty = CGM.getContext().getCanonicalType(Ty);
2511
2512 // Check if we've already emitted an RTTI descriptor for this type.
2513 SmallString<256> OutName;
2514 llvm::raw_svector_ostream Out(OutName);
2515 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2516 Out.flush();
2517 StringRef Name = OutName.str();
2518
2519 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2520 if (OldGV && !OldGV->isDeclaration()) {
2521 assert(!OldGV->hasAvailableExternallyLinkage() &&
2522 "available_externally typeinfos not yet implemented");
2523
2524 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2525 }
2526
2527 // Check if there is already an external RTTI descriptor for this type.
2528 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2529 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2530 return GetAddrOfExternalRTTIDescriptor(Ty);
2531
2532 // Emit the standard library with external linkage.
2533 llvm::GlobalVariable::LinkageTypes Linkage;
2534 if (IsStdLib)
2535 Linkage = llvm::GlobalValue::ExternalLinkage;
2536 else
2537 Linkage = getTypeInfoLinkage(CGM, Ty);
2538
2539 // Add the vtable pointer.
2540 BuildVTablePointer(cast<Type>(Ty));
2541
2542 // And the name.
2543 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2544 llvm::Constant *TypeNameField;
2545
2546 // If we're supposed to demote the visibility, be sure to set a flag
2547 // to use a string comparison for type_info comparisons.
2548 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2549 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2550 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2551 // The flag is the sign bit, which on ARM64 is defined to be clear
2552 // for global pointers. This is very ARM64-specific.
2553 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2554 llvm::Constant *flag =
2555 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2556 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2557 TypeNameField =
2558 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2559 } else {
2560 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2561 }
2562 Fields.push_back(TypeNameField);
2563
2564 switch (Ty->getTypeClass()) {
2565#define TYPE(Class, Base)
2566#define ABSTRACT_TYPE(Class, Base)
2567#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2568#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2569#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2570#include "clang/AST/TypeNodes.def"
2571 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2572
2573 // GCC treats vector types as fundamental types.
2574 case Type::Builtin:
2575 case Type::Vector:
2576 case Type::ExtVector:
2577 case Type::Complex:
2578 case Type::BlockPointer:
2579 // Itanium C++ ABI 2.9.5p4:
2580 // abi::__fundamental_type_info adds no data members to std::type_info.
2581 break;
2582
2583 case Type::LValueReference:
2584 case Type::RValueReference:
2585 llvm_unreachable("References shouldn't get here");
2586
2587 case Type::Auto:
2588 llvm_unreachable("Undeduced auto type shouldn't get here");
2589
2590 case Type::ConstantArray:
2591 case Type::IncompleteArray:
2592 case Type::VariableArray:
2593 // Itanium C++ ABI 2.9.5p5:
2594 // abi::__array_type_info adds no data members to std::type_info.
2595 break;
2596
2597 case Type::FunctionNoProto:
2598 case Type::FunctionProto:
2599 // Itanium C++ ABI 2.9.5p5:
2600 // abi::__function_type_info adds no data members to std::type_info.
2601 break;
2602
2603 case Type::Enum:
2604 // Itanium C++ ABI 2.9.5p5:
2605 // abi::__enum_type_info adds no data members to std::type_info.
2606 break;
2607
2608 case Type::Record: {
2609 const CXXRecordDecl *RD =
2610 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2611 if (!RD->hasDefinition() || !RD->getNumBases()) {
2612 // We don't need to emit any fields.
2613 break;
2614 }
2615
2616 if (CanUseSingleInheritance(RD))
2617 BuildSIClassTypeInfo(RD);
2618 else
2619 BuildVMIClassTypeInfo(RD);
2620
2621 break;
2622 }
2623
2624 case Type::ObjCObject:
2625 case Type::ObjCInterface:
2626 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
2627 break;
2628
2629 case Type::ObjCObjectPointer:
2630 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
2631 break;
2632
2633 case Type::Pointer:
2634 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
2635 break;
2636
2637 case Type::MemberPointer:
2638 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
2639 break;
2640
2641 case Type::Atomic:
2642 // No fields, at least for the moment.
2643 break;
2644 }
2645
2646 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2647
2648 llvm::GlobalVariable *GV =
2649 new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
2650 /*Constant=*/true, Linkage, Init, Name);
2651
2652 // If there's already an old global variable, replace it with the new one.
2653 if (OldGV) {
2654 GV->takeName(OldGV);
2655 llvm::Constant *NewPtr =
2656 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
2657 OldGV->replaceAllUsesWith(NewPtr);
2658 OldGV->eraseFromParent();
2659 }
2660
2661 // The Itanium ABI specifies that type_info objects must be globally
2662 // unique, with one exception: if the type is an incomplete class
2663 // type or a (possibly indirect) pointer to one. That exception
2664 // affects the general case of comparing type_info objects produced
2665 // by the typeid operator, which is why the comparison operators on
2666 // std::type_info generally use the type_info name pointers instead
2667 // of the object addresses. However, the language's built-in uses
2668 // of RTTI generally require class types to be complete, even when
2669 // manipulating pointers to those class types. This allows the
2670 // implementation of dynamic_cast to rely on address equality tests,
2671 // which is much faster.
2672
2673 // All of this is to say that it's important that both the type_info
2674 // object and the type_info name be uniqued when weakly emitted.
2675
2676 // Give the type_info object and name the formal visibility of the
2677 // type itself.
2678 llvm::GlobalValue::VisibilityTypes llvmVisibility;
2679 if (llvm::GlobalValue::isLocalLinkage(Linkage))
2680 // If the linkage is local, only default visibility makes sense.
2681 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
2682 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
2683 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
2684 else
2685 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
2686 TypeName->setVisibility(llvmVisibility);
2687 GV->setVisibility(llvmVisibility);
2688
2689 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2690}
2691
2692/// ComputeQualifierFlags - Compute the pointer type info flags from the
2693/// given qualifier.
2694static unsigned ComputeQualifierFlags(Qualifiers Quals) {
2695 unsigned Flags = 0;
2696
2697 if (Quals.hasConst())
2698 Flags |= ItaniumRTTIBuilder::PTI_Const;
2699 if (Quals.hasVolatile())
2700 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
2701 if (Quals.hasRestrict())
2702 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
2703
2704 return Flags;
2705}
2706
2707/// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
2708/// for the given Objective-C object type.
2709void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
2710 // Drop qualifiers.
2711 const Type *T = OT->getBaseType().getTypePtr();
2712 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
2713
2714 // The builtin types are abi::__class_type_infos and don't require
2715 // extra fields.
2716 if (isa<BuiltinType>(T)) return;
2717
2718 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
2719 ObjCInterfaceDecl *Super = Class->getSuperClass();
2720
2721 // Root classes are also __class_type_info.
2722 if (!Super) return;
2723
2724 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
2725
2726 // Everything else is single inheritance.
2727 llvm::Constant *BaseTypeInfo =
2728 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
2729 Fields.push_back(BaseTypeInfo);
2730}
2731
2732/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2733/// inheritance, according to the Itanium C++ ABI, 2.95p6b.
2734void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
2735 // Itanium C++ ABI 2.9.5p6b:
2736 // It adds to abi::__class_type_info a single member pointing to the
2737 // type_info structure for the base type,
2738 llvm::Constant *BaseTypeInfo =
2739 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
2740 Fields.push_back(BaseTypeInfo);
2741}
2742
2743namespace {
2744 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
2745 /// a class hierarchy.
2746 struct SeenBases {
2747 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
2748 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
2749 };
2750}
2751
2752/// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
2753/// abi::__vmi_class_type_info.
2754///
2755static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
2756 SeenBases &Bases) {
2757
2758 unsigned Flags = 0;
2759
2760 const CXXRecordDecl *BaseDecl =
2761 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2762
2763 if (Base->isVirtual()) {
2764 // Mark the virtual base as seen.
2765 if (!Bases.VirtualBases.insert(BaseDecl)) {
2766 // If this virtual base has been seen before, then the class is diamond
2767 // shaped.
2768 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
2769 } else {
2770 if (Bases.NonVirtualBases.count(BaseDecl))
2771 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2772 }
2773 } else {
2774 // Mark the non-virtual base as seen.
2775 if (!Bases.NonVirtualBases.insert(BaseDecl)) {
2776 // If this non-virtual base has been seen before, then the class has non-
2777 // diamond shaped repeated inheritance.
2778 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2779 } else {
2780 if (Bases.VirtualBases.count(BaseDecl))
2781 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2782 }
2783 }
2784
2785 // Walk all bases.
2786 for (const auto &I : BaseDecl->bases())
2787 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2788
2789 return Flags;
2790}
2791
2792static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
2793 unsigned Flags = 0;
2794 SeenBases Bases;
2795
2796 // Walk all bases.
2797 for (const auto &I : RD->bases())
2798 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2799
2800 return Flags;
2801}
2802
2803/// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2804/// classes with bases that do not satisfy the abi::__si_class_type_info
2805/// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2806void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
2807 llvm::Type *UnsignedIntLTy =
2808 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2809
2810 // Itanium C++ ABI 2.9.5p6c:
2811 // __flags is a word with flags describing details about the class
2812 // structure, which may be referenced by using the __flags_masks
2813 // enumeration. These flags refer to both direct and indirect bases.
2814 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
2815 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2816
2817 // Itanium C++ ABI 2.9.5p6c:
2818 // __base_count is a word with the number of direct proper base class
2819 // descriptions that follow.
2820 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
2821
2822 if (!RD->getNumBases())
2823 return;
2824
2825 llvm::Type *LongLTy =
2826 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
2827
2828 // Now add the base class descriptions.
2829
2830 // Itanium C++ ABI 2.9.5p6c:
2831 // __base_info[] is an array of base class descriptions -- one for every
2832 // direct proper base. Each description is of the type:
2833 //
2834 // struct abi::__base_class_type_info {
2835 // public:
2836 // const __class_type_info *__base_type;
2837 // long __offset_flags;
2838 //
2839 // enum __offset_flags_masks {
2840 // __virtual_mask = 0x1,
2841 // __public_mask = 0x2,
2842 // __offset_shift = 8
2843 // };
2844 // };
2845 for (const auto &Base : RD->bases()) {
2846 // The __base_type member points to the RTTI for the base type.
2847 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
2848
2849 const CXXRecordDecl *BaseDecl =
2850 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
2851
2852 int64_t OffsetFlags = 0;
2853
2854 // All but the lower 8 bits of __offset_flags are a signed offset.
2855 // For a non-virtual base, this is the offset in the object of the base
2856 // subobject. For a virtual base, this is the offset in the virtual table of
2857 // the virtual base offset for the virtual base referenced (negative).
2858 CharUnits Offset;
2859 if (Base.isVirtual())
2860 Offset =
2861 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
2862 else {
2863 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
2864 Offset = Layout.getBaseClassOffset(BaseDecl);
2865 };
2866
2867 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
2868
2869 // The low-order byte of __offset_flags contains flags, as given by the
2870 // masks from the enumeration __offset_flags_masks.
2871 if (Base.isVirtual())
2872 OffsetFlags |= BCTI_Virtual;
2873 if (Base.getAccessSpecifier() == AS_public)
2874 OffsetFlags |= BCTI_Public;
2875
2876 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
2877 }
2878}
2879
2880/// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
2881/// used for pointer types.
2882void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
2883 Qualifiers Quals;
2884 QualType UnqualifiedPointeeTy =
2885 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2886
2887 // Itanium C++ ABI 2.9.5p7:
2888 // __flags is a flag word describing the cv-qualification and other
2889 // attributes of the type pointed to
2890 unsigned Flags = ComputeQualifierFlags(Quals);
2891
2892 // Itanium C++ ABI 2.9.5p7:
2893 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
2894 // incomplete class type, the incomplete target type flag is set.
2895 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
2896 Flags |= PTI_Incomplete;
2897
2898 llvm::Type *UnsignedIntLTy =
2899 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2900 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2901
2902 // Itanium C++ ABI 2.9.5p7:
2903 // __pointee is a pointer to the std::type_info derivation for the
2904 // unqualified type being pointed to.
2905 llvm::Constant *PointeeTypeInfo =
2906 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
2907 Fields.push_back(PointeeTypeInfo);
2908}
2909
2910/// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2911/// struct, used for member pointer types.
2912void
2913ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
2914 QualType PointeeTy = Ty->getPointeeType();
2915
2916 Qualifiers Quals;
2917 QualType UnqualifiedPointeeTy =
2918 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2919
2920 // Itanium C++ ABI 2.9.5p7:
2921 // __flags is a flag word describing the cv-qualification and other
2922 // attributes of the type pointed to.
2923 unsigned Flags = ComputeQualifierFlags(Quals);
2924
2925 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
2926
2927 // Itanium C++ ABI 2.9.5p7:
2928 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
2929 // incomplete class type, the incomplete target type flag is set.
2930 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
2931 Flags |= PTI_Incomplete;
2932
2933 if (IsIncompleteClassType(ClassType))
2934 Flags |= PTI_ContainingClassIncomplete;
2935
2936 llvm::Type *UnsignedIntLTy =
2937 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2938 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2939
2940 // Itanium C++ ABI 2.9.5p7:
2941 // __pointee is a pointer to the std::type_info derivation for the
2942 // unqualified type being pointed to.
2943 llvm::Constant *PointeeTypeInfo =
2944 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
2945 Fields.push_back(PointeeTypeInfo);
2946
2947 // Itanium C++ ABI 2.9.5p9:
2948 // __context is a pointer to an abi::__class_type_info corresponding to the
2949 // class type containing the member pointed to
2950 // (e.g., the "A" in "int A::*").
2951 Fields.push_back(
2952 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
2953}
2954
2955llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
2956 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
2957}
2958
2959void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
2960 QualType PointerType = getContext().getPointerType(Type);
2961 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
2962 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
2963 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
2964 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
2965}
2966
2967void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
2968 QualType FundamentalTypes[] = {
2969 getContext().VoidTy, getContext().NullPtrTy,
2970 getContext().BoolTy, getContext().WCharTy,
2971 getContext().CharTy, getContext().UnsignedCharTy,
2972 getContext().SignedCharTy, getContext().ShortTy,
2973 getContext().UnsignedShortTy, getContext().IntTy,
2974 getContext().UnsignedIntTy, getContext().LongTy,
2975 getContext().UnsignedLongTy, getContext().LongLongTy,
2976 getContext().UnsignedLongLongTy, getContext().HalfTy,
2977 getContext().FloatTy, getContext().DoubleTy,
2978 getContext().LongDoubleTy, getContext().Char16Ty,
2979 getContext().Char32Ty,
2980 };
2981 for (const QualType &FundamentalType : FundamentalTypes)
2982 EmitFundamentalRTTIDescriptor(FundamentalType);
2983}
2984
2985/// What sort of uniqueness rules should we use for the RTTI for the
2986/// given type?
2987ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
2988 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
2989 if (shouldRTTIBeUnique())
2990 return RUK_Unique;
2991
2992 // It's only necessary for linkonce_odr or weak_odr linkage.
2993 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
2994 Linkage != llvm::GlobalValue::WeakODRLinkage)
2995 return RUK_Unique;
2996
2997 // It's only necessary with default visibility.
2998 if (CanTy->getVisibility() != DefaultVisibility)
2999 return RUK_Unique;
3000
3001 // If we're not required to publish this symbol, hide it.
3002 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3003 return RUK_NonUniqueHidden;
3004
3005 // If we're required to publish this symbol, as we might be under an
3006 // explicit instantiation, leave it with default visibility but
3007 // enable string-comparisons.
3008 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
3009 return RUK_NonUniqueVisible;
3010}