blob: 29d922c68e3ec8a2e33e4cbebc1020fd7424d707 [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
David Majnemer08681372014-11-01 07:37:17 +0000109 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
David Majnemer0c0b6d92014-10-31 20:09:12 +0000110 llvm::Value *Ptr, QualType ElementType,
David Majnemer0c0b6d92014-10-31 20:09:12 +0000111 const CXXDestructorDecl *Dtor) override;
John McCall82fb8922012-09-25 10:10:39 +0000112
David Majnemer442d0a22014-11-25 07:20:20 +0000113 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
114
David Majnemere2cb8d12014-07-07 06:20:47 +0000115 void EmitFundamentalRTTIDescriptor(QualType Type);
116 void EmitFundamentalRTTIDescriptors();
117 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
118
David Majnemer1162d252014-06-22 19:05:33 +0000119 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
120 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
121 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
122 llvm::Value *ThisPtr,
123 llvm::Type *StdTypeInfoPtrTy) override;
124
125 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
126 QualType SrcRecordTy) override;
127
128 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
129 QualType SrcRecordTy, QualType DestTy,
130 QualType DestRecordTy,
131 llvm::BasicBlock *CastEnd) override;
132
133 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
134 QualType SrcRecordTy,
135 QualType DestTy) override;
136
137 bool EmitBadCastCall(CodeGenFunction &CGF) override;
138
Craig Topper4f12f102014-03-12 06:41:41 +0000139 llvm::Value *
140 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
141 const CXXRecordDecl *ClassDecl,
142 const CXXRecordDecl *BaseClassDecl) override;
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000143
Craig Topper4f12f102014-03-12 06:41:41 +0000144 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +0000145
Rafael Espindola8d2a19b2014-09-08 16:01:27 +0000146 void buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
147 SmallVectorImpl<CanQualType> &ArgTys) override;
John McCall5d865c322010-08-31 07:33:07 +0000148
Reid Klecknere7de47e2013-07-22 13:51:44 +0000149 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
Craig Topper4f12f102014-03-12 06:41:41 +0000150 CXXDtorType DT) const override {
Reid Klecknere7de47e2013-07-22 13:51:44 +0000151 // Itanium does not emit any destructor variant as an inline thunk.
152 // Delegating may occur as an optimization, but all variants are either
153 // emitted with external linkage or as linkonce if they are inline and used.
154 return false;
155 }
156
Craig Topper4f12f102014-03-12 06:41:41 +0000157 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
Reid Klecknere7de47e2013-07-22 13:51:44 +0000158
Reid Kleckner89077a12013-12-17 19:46:40 +0000159 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
Craig Topper4f12f102014-03-12 06:41:41 +0000160 FunctionArgList &Params) override;
John McCall5d865c322010-08-31 07:33:07 +0000161
Craig Topper4f12f102014-03-12 06:41:41 +0000162 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
John McCall8ed55a52010-09-02 09:58:18 +0000163
Reid Kleckner89077a12013-12-17 19:46:40 +0000164 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
165 const CXXConstructorDecl *D,
166 CXXCtorType Type, bool ForVirtualBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000167 bool Delegating,
168 CallArgList &Args) override;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000169
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000170 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
171 CXXDtorType Type, bool ForVirtualBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000172 bool Delegating, llvm::Value *This) override;
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000173
Craig Topper4f12f102014-03-12 06:41:41 +0000174 void emitVTableDefinitions(CodeGenVTables &CGVT,
175 const CXXRecordDecl *RD) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000176
177 llvm::Value *getVTableAddressPointInStructor(
178 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
179 BaseSubobject Base, const CXXRecordDecl *NearestVBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000180 bool &NeedsVirtualOffset) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000181
182 llvm::Constant *
183 getVTableAddressPointForConstExpr(BaseSubobject Base,
Craig Topper4f12f102014-03-12 06:41:41 +0000184 const CXXRecordDecl *VTableClass) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000185
186 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
Craig Topper4f12f102014-03-12 06:41:41 +0000187 CharUnits VPtrOffset) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000188
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000189 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
Craig Topper4f12f102014-03-12 06:41:41 +0000190 llvm::Value *This,
191 llvm::Type *Ty) override;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000192
David Majnemer0c0b6d92014-10-31 20:09:12 +0000193 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
194 const CXXDestructorDecl *Dtor,
195 CXXDtorType DtorType,
196 llvm::Value *This,
197 const CXXMemberCallExpr *CE) override;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +0000198
Craig Topper4f12f102014-03-12 06:41:41 +0000199 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
Reid Kleckner7810af02013-06-19 15:20:38 +0000200
Hans Wennborgc94391d2014-06-06 20:04:01 +0000201 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
202 bool ReturnAdjustment) override {
Timur Iskhodzhanovad9d3b82013-10-09 09:23:58 +0000203 // Allow inlining of thunks by emitting them with available_externally
204 // linkage together with vtables when needed.
205 if (ForVTable)
206 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
207 }
208
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000209 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
Craig Topper4f12f102014-03-12 06:41:41 +0000210 const ThisAdjustment &TA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000211
212 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
Craig Topper4f12f102014-03-12 06:41:41 +0000213 const ReturnAdjustment &RA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000214
David Majnemer196ac332014-09-11 23:05:02 +0000215 size_t getSrcArgforCopyCtor(const CXXConstructorDecl *,
216 FunctionArgList &Args) const override {
217 assert(!Args.empty() && "expected the arglist to not be empty!");
218 return Args.size() - 1;
219 }
220
Craig Topper4f12f102014-03-12 06:41:41 +0000221 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
222 StringRef GetDeletedVirtualCallName() override
223 { return "__cxa_deleted_virtual"; }
Joao Matos2ce88ef2012-07-17 17:10:11 +0000224
Craig Topper4f12f102014-03-12 06:41:41 +0000225 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
John McCall8ed55a52010-09-02 09:58:18 +0000226 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
227 llvm::Value *NewPtr,
228 llvm::Value *NumElements,
John McCall284c48f2011-01-27 09:37:56 +0000229 const CXXNewExpr *expr,
Craig Topper4f12f102014-03-12 06:41:41 +0000230 QualType ElementType) override;
John McCallb91cd662012-05-01 05:23:51 +0000231 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
232 llvm::Value *allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000233 CharUnits cookieSize) override;
John McCall68ff0372010-09-08 01:44:27 +0000234
John McCallcdf7ef52010-11-06 09:44:32 +0000235 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
Craig Topper4f12f102014-03-12 06:41:41 +0000236 llvm::GlobalVariable *DeclPtr,
237 bool PerformInit) override;
Richard Smithdbf74ba2013-04-14 23:01:42 +0000238 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
Craig Topper4f12f102014-03-12 06:41:41 +0000239 llvm::Constant *dtor, llvm::Constant *addr) override;
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000240
241 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
Alexander Musmanf94c3182014-09-26 06:28:25 +0000242 llvm::Value *Val);
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000243 void EmitThreadLocalInitFuncs(
David Majnemerb3341ea2014-10-05 05:05:40 +0000244 CodeGenModule &CGM,
245 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
246 CXXThreadLocals,
247 ArrayRef<llvm::Function *> CXXThreadLocalInits,
248 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) override;
249
250 bool usesThreadWrapperFunction() const override { return true; }
Richard Smith0f383742014-03-26 22:48:22 +0000251 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
252 QualType LValType) override;
Peter Collingbourne66f82e62013-06-28 20:45:28 +0000253
Craig Topper4f12f102014-03-12 06:41:41 +0000254 bool NeedsVTTParameter(GlobalDecl GD) override;
David Majnemere2cb8d12014-07-07 06:20:47 +0000255
256 /**************************** RTTI Uniqueness ******************************/
257
258protected:
259 /// Returns true if the ABI requires RTTI type_info objects to be unique
260 /// across a program.
261 virtual bool shouldRTTIBeUnique() const { return true; }
262
263public:
264 /// What sort of unique-RTTI behavior should we use?
265 enum RTTIUniquenessKind {
266 /// We are guaranteeing, or need to guarantee, that the RTTI string
267 /// is unique.
268 RUK_Unique,
269
270 /// We are not guaranteeing uniqueness for the RTTI string, so we
271 /// can demote to hidden visibility but must use string comparisons.
272 RUK_NonUniqueHidden,
273
274 /// We are not guaranteeing uniqueness for the RTTI string, so we
275 /// have to use string comparisons, but we also have to emit it with
276 /// non-hidden visibility.
277 RUK_NonUniqueVisible
278 };
279
280 /// Return the required visibility status for the given type and linkage in
281 /// the current ABI.
282 RTTIUniquenessKind
283 classifyRTTIUniqueness(QualType CanTy,
284 llvm::GlobalValue::LinkageTypes Linkage) const;
285 friend class ItaniumRTTIBuilder;
Rafael Espindola91f68b42014-09-15 19:20:10 +0000286
287 void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override;
Charles Davis4e786dd2010-05-25 19:52:27 +0000288};
John McCall86353412010-08-21 22:46:04 +0000289
290class ARMCXXABI : public ItaniumCXXABI {
291public:
Mark Seabornedf0d382013-07-24 16:25:13 +0000292 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
293 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
294 /* UseARMGuardVarABI = */ true) {}
John McCall5d865c322010-08-31 07:33:07 +0000295
Craig Topper4f12f102014-03-12 06:41:41 +0000296 bool HasThisReturn(GlobalDecl GD) const override {
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000297 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
298 isa<CXXDestructorDecl>(GD.getDecl()) &&
299 GD.getDtorType() != Dtor_Deleting));
300 }
John McCall5d865c322010-08-31 07:33:07 +0000301
Craig Topper4f12f102014-03-12 06:41:41 +0000302 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
303 QualType ResTy) override;
John McCall5d865c322010-08-31 07:33:07 +0000304
Craig Topper4f12f102014-03-12 06:41:41 +0000305 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
John McCall8ed55a52010-09-02 09:58:18 +0000306 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
307 llvm::Value *NewPtr,
308 llvm::Value *NumElements,
John McCall284c48f2011-01-27 09:37:56 +0000309 const CXXNewExpr *expr,
Craig Topper4f12f102014-03-12 06:41:41 +0000310 QualType ElementType) override;
John McCallb91cd662012-05-01 05:23:51 +0000311 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, llvm::Value *allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000312 CharUnits cookieSize) override;
John McCall86353412010-08-21 22:46:04 +0000313};
Tim Northovera2ee4332014-03-29 15:09:45 +0000314
315class iOS64CXXABI : public ARMCXXABI {
316public:
317 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
Tim Northover65f582f2014-03-30 17:32:48 +0000318
319 // ARM64 libraries are prepared for non-unique RTTI.
David Majnemere2cb8d12014-07-07 06:20:47 +0000320 bool shouldRTTIBeUnique() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +0000321};
Charles Davis4e786dd2010-05-25 19:52:27 +0000322}
323
Charles Davis53c59df2010-08-16 03:33:14 +0000324CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
John McCallc8e01702013-04-16 22:48:15 +0000325 switch (CGM.getTarget().getCXXABI().getKind()) {
John McCall57625922013-01-25 23:36:14 +0000326 // For IR-generation purposes, there's no significant difference
327 // between the ARM and iOS ABIs.
328 case TargetCXXABI::GenericARM:
329 case TargetCXXABI::iOS:
330 return new ARMCXXABI(CGM);
Charles Davis4e786dd2010-05-25 19:52:27 +0000331
Tim Northovera2ee4332014-03-29 15:09:45 +0000332 case TargetCXXABI::iOS64:
333 return new iOS64CXXABI(CGM);
334
Tim Northover9bb857a2013-01-31 12:13:10 +0000335 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
336 // include the other 32-bit ARM oddities: constructor/destructor return values
337 // and array cookies.
338 case TargetCXXABI::GenericAArch64:
Mark Seabornedf0d382013-07-24 16:25:13 +0000339 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
340 /* UseARMGuardVarABI = */ true);
Tim Northover9bb857a2013-01-31 12:13:10 +0000341
John McCall57625922013-01-25 23:36:14 +0000342 case TargetCXXABI::GenericItanium:
Mark Seabornedf0d382013-07-24 16:25:13 +0000343 if (CGM.getContext().getTargetInfo().getTriple().getArch()
344 == llvm::Triple::le32) {
345 // For PNaCl, use ARM-style method pointers so that PNaCl code
346 // does not assume anything about the alignment of function
347 // pointers.
348 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
349 /* UseARMGuardVarABI = */ false);
350 }
John McCall57625922013-01-25 23:36:14 +0000351 return new ItaniumCXXABI(CGM);
352
353 case TargetCXXABI::Microsoft:
354 llvm_unreachable("Microsoft ABI is not Itanium-based");
355 }
356 llvm_unreachable("bad ABI kind");
John McCall86353412010-08-21 22:46:04 +0000357}
358
Chris Lattnera5f58b02011-07-09 17:41:47 +0000359llvm::Type *
John McCall7a9aac22010-08-23 01:21:21 +0000360ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
361 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000362 return CGM.PtrDiffTy;
Reid Kleckneree7cf842014-12-01 22:02:27 +0000363 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, nullptr);
John McCall1c456c82010-08-22 06:43:33 +0000364}
365
John McCalld9c6c0b2010-08-22 00:59:17 +0000366/// In the Itanium and ARM ABIs, method pointers have the form:
367/// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
368///
369/// In the Itanium ABI:
370/// - method pointers are virtual if (memptr.ptr & 1) is nonzero
371/// - the this-adjustment is (memptr.adj)
372/// - the virtual offset is (memptr.ptr - 1)
373///
374/// In the ARM ABI:
375/// - method pointers are virtual if (memptr.adj & 1) is nonzero
376/// - the this-adjustment is (memptr.adj >> 1)
377/// - the virtual offset is (memptr.ptr)
378/// ARM uses 'adj' for the virtual flag because Thumb functions
379/// may be only single-byte aligned.
380///
381/// If the member is virtual, the adjusted 'this' pointer points
382/// to a vtable pointer from which the virtual offset is applied.
383///
384/// If the member is non-virtual, memptr.ptr is the address of
385/// the function to call.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000386llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
387 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
388 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
John McCall475999d2010-08-22 00:05:51 +0000389 CGBuilderTy &Builder = CGF.Builder;
390
391 const FunctionProtoType *FPT =
392 MPT->getPointeeType()->getAs<FunctionProtoType>();
393 const CXXRecordDecl *RD =
394 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
395
Chris Lattner2192fe52011-07-18 04:24:23 +0000396 llvm::FunctionType *FTy =
John McCalla729c622012-02-17 03:33:10 +0000397 CGM.getTypes().GetFunctionType(
398 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
John McCall475999d2010-08-22 00:05:51 +0000399
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000400 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
John McCall475999d2010-08-22 00:05:51 +0000401
John McCalld9c6c0b2010-08-22 00:59:17 +0000402 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
403 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
404 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
405
John McCalla1dee5302010-08-22 10:59:02 +0000406 // Extract memptr.adj, which is in the second field.
407 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
John McCalld9c6c0b2010-08-22 00:59:17 +0000408
409 // Compute the true adjustment.
410 llvm::Value *Adj = RawAdj;
Mark Seabornedf0d382013-07-24 16:25:13 +0000411 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000412 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
John McCall475999d2010-08-22 00:05:51 +0000413
414 // Apply the adjustment and cast back to the original struct type
415 // for consistency.
John McCalld9c6c0b2010-08-22 00:59:17 +0000416 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
417 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
418 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
John McCall475999d2010-08-22 00:05:51 +0000419
420 // Load the function pointer.
John McCalla1dee5302010-08-22 10:59:02 +0000421 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
John McCall475999d2010-08-22 00:05:51 +0000422
423 // If the LSB in the function pointer is 1, the function pointer points to
424 // a virtual function.
John McCalld9c6c0b2010-08-22 00:59:17 +0000425 llvm::Value *IsVirtual;
Mark Seabornedf0d382013-07-24 16:25:13 +0000426 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000427 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
428 else
429 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
430 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
John McCall475999d2010-08-22 00:05:51 +0000431 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
432
433 // In the virtual path, the adjustment left 'This' pointing to the
434 // vtable of the correct base subobject. The "function pointer" is an
John McCalld9c6c0b2010-08-22 00:59:17 +0000435 // offset within the vtable (+1 for the virtual flag on non-ARM).
John McCall475999d2010-08-22 00:05:51 +0000436 CGF.EmitBlock(FnVirtual);
437
438 // Cast the adjusted this to a pointer to vtable pointer and load.
Chris Lattner2192fe52011-07-18 04:24:23 +0000439 llvm::Type *VTableTy = Builder.getInt8PtrTy();
Richard Smith0fc7bdc2014-03-12 18:26:14 +0000440 llvm::Value *VTable = CGF.GetVTablePtr(This, VTableTy);
John McCall475999d2010-08-22 00:05:51 +0000441
442 // Apply the offset.
John McCalld9c6c0b2010-08-22 00:59:17 +0000443 llvm::Value *VTableOffset = FnAsInt;
Mark Seabornedf0d382013-07-24 16:25:13 +0000444 if (!UseARMMethodPtrABI)
445 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
John McCalld9c6c0b2010-08-22 00:59:17 +0000446 VTable = Builder.CreateGEP(VTable, VTableOffset);
John McCall475999d2010-08-22 00:05:51 +0000447
448 // Load the virtual function to call.
449 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
John McCalld9c6c0b2010-08-22 00:59:17 +0000450 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn");
John McCall475999d2010-08-22 00:05:51 +0000451 CGF.EmitBranch(FnEnd);
452
453 // In the non-virtual path, the function pointer is actually a
454 // function pointer.
455 CGF.EmitBlock(FnNonVirtual);
456 llvm::Value *NonVirtualFn =
John McCalld9c6c0b2010-08-22 00:59:17 +0000457 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
John McCall475999d2010-08-22 00:05:51 +0000458
459 // We're done.
460 CGF.EmitBlock(FnEnd);
Jay Foad20c0f022011-03-30 11:28:58 +0000461 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
John McCall475999d2010-08-22 00:05:51 +0000462 Callee->addIncoming(VirtualFn, FnVirtual);
463 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
464 return Callee;
465}
John McCalla8bbb822010-08-22 03:04:22 +0000466
John McCallc134eb52010-08-31 21:07:20 +0000467/// Compute an l-value by applying the given pointer-to-member to a
468/// base object.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000469llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
470 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
471 const MemberPointerType *MPT) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000472 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCallc134eb52010-08-31 21:07:20 +0000473
474 CGBuilderTy &Builder = CGF.Builder;
475
Micah Villmowea2fea22012-10-25 15:39:14 +0000476 unsigned AS = Base->getType()->getPointerAddressSpace();
John McCallc134eb52010-08-31 21:07:20 +0000477
478 // Cast to char*.
479 Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
480
481 // Apply the offset, which we assume is non-null.
482 llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, MemPtr, "memptr.offset");
483
484 // Cast the address to the appropriate pointer type, adopting the
485 // address space of the base pointer.
Chris Lattner2192fe52011-07-18 04:24:23 +0000486 llvm::Type *PType
Douglas Gregor04f36212010-09-02 17:38:50 +0000487 = CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
John McCallc134eb52010-08-31 21:07:20 +0000488 return Builder.CreateBitCast(Addr, PType);
489}
490
John McCallc62bb392012-02-15 01:22:51 +0000491/// Perform a bitcast, derived-to-base, or base-to-derived member pointer
492/// conversion.
493///
494/// Bitcast conversions are always a no-op under Itanium.
John McCall7a9aac22010-08-23 01:21:21 +0000495///
496/// Obligatory offset/adjustment diagram:
497/// <-- offset --> <-- adjustment -->
498/// |--------------------------|----------------------|--------------------|
499/// ^Derived address point ^Base address point ^Member address point
500///
501/// So when converting a base member pointer to a derived member pointer,
502/// we add the offset to the adjustment because the address point has
503/// decreased; and conversely, when converting a derived MP to a base MP
504/// we subtract the offset from the adjustment because the address point
505/// has increased.
506///
507/// The standard forbids (at compile time) conversion to and from
508/// virtual bases, which is why we don't have to consider them here.
509///
510/// The standard forbids (at run time) casting a derived MP to a base
511/// MP when the derived MP does not point to a member of the base.
512/// This is why -1 is a reasonable choice for null data member
513/// pointers.
John McCalla1dee5302010-08-22 10:59:02 +0000514llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000515ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
516 const CastExpr *E,
John McCallc62bb392012-02-15 01:22:51 +0000517 llvm::Value *src) {
John McCalle3027922010-08-25 11:45:40 +0000518 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
John McCallc62bb392012-02-15 01:22:51 +0000519 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
520 E->getCastKind() == CK_ReinterpretMemberPointer);
521
522 // Under Itanium, reinterprets don't require any additional processing.
523 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
524
525 // Use constant emission if we can.
526 if (isa<llvm::Constant>(src))
527 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
528
529 llvm::Constant *adj = getMemberPointerAdjustment(E);
530 if (!adj) return src;
John McCalla8bbb822010-08-22 03:04:22 +0000531
532 CGBuilderTy &Builder = CGF.Builder;
John McCallc62bb392012-02-15 01:22:51 +0000533 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
John McCalla8bbb822010-08-22 03:04:22 +0000534
John McCallc62bb392012-02-15 01:22:51 +0000535 const MemberPointerType *destTy =
536 E->getType()->castAs<MemberPointerType>();
John McCall1c456c82010-08-22 06:43:33 +0000537
John McCall7a9aac22010-08-23 01:21:21 +0000538 // For member data pointers, this is just a matter of adding the
539 // offset if the source is non-null.
John McCallc62bb392012-02-15 01:22:51 +0000540 if (destTy->isMemberDataPointer()) {
541 llvm::Value *dst;
542 if (isDerivedToBase)
543 dst = Builder.CreateNSWSub(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000544 else
John McCallc62bb392012-02-15 01:22:51 +0000545 dst = Builder.CreateNSWAdd(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000546
547 // Null check.
John McCallc62bb392012-02-15 01:22:51 +0000548 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
549 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
550 return Builder.CreateSelect(isNull, src, dst);
John McCall7a9aac22010-08-23 01:21:21 +0000551 }
552
John McCalla1dee5302010-08-22 10:59:02 +0000553 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000554 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000555 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
556 offset <<= 1;
557 adj = llvm::ConstantInt::get(adj->getType(), offset);
John McCalla1dee5302010-08-22 10:59:02 +0000558 }
559
John McCallc62bb392012-02-15 01:22:51 +0000560 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
561 llvm::Value *dstAdj;
562 if (isDerivedToBase)
563 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000564 else
John McCallc62bb392012-02-15 01:22:51 +0000565 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000566
John McCallc62bb392012-02-15 01:22:51 +0000567 return Builder.CreateInsertValue(src, dstAdj, 1);
568}
569
570llvm::Constant *
571ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
572 llvm::Constant *src) {
573 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
574 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
575 E->getCastKind() == CK_ReinterpretMemberPointer);
576
577 // Under Itanium, reinterprets don't require any additional processing.
578 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
579
580 // If the adjustment is trivial, we don't need to do anything.
581 llvm::Constant *adj = getMemberPointerAdjustment(E);
582 if (!adj) return src;
583
584 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
585
586 const MemberPointerType *destTy =
587 E->getType()->castAs<MemberPointerType>();
588
589 // For member data pointers, this is just a matter of adding the
590 // offset if the source is non-null.
591 if (destTy->isMemberDataPointer()) {
592 // null maps to null.
593 if (src->isAllOnesValue()) return src;
594
595 if (isDerivedToBase)
596 return llvm::ConstantExpr::getNSWSub(src, adj);
597 else
598 return llvm::ConstantExpr::getNSWAdd(src, adj);
599 }
600
601 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000602 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000603 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
604 offset <<= 1;
605 adj = llvm::ConstantInt::get(adj->getType(), offset);
606 }
607
608 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
609 llvm::Constant *dstAdj;
610 if (isDerivedToBase)
611 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
612 else
613 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
614
615 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
John McCalla8bbb822010-08-22 03:04:22 +0000616}
John McCall84fa5102010-08-22 04:16:24 +0000617
618llvm::Constant *
John McCall7a9aac22010-08-23 01:21:21 +0000619ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
John McCall7a9aac22010-08-23 01:21:21 +0000620 // Itanium C++ ABI 2.3:
621 // A NULL pointer is represented as -1.
622 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000623 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
John McCalla1dee5302010-08-22 10:59:02 +0000624
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000625 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
John McCalla1dee5302010-08-22 10:59:02 +0000626 llvm::Constant *Values[2] = { Zero, Zero };
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000627 return llvm::ConstantStruct::getAnon(Values);
John McCall84fa5102010-08-22 04:16:24 +0000628}
629
John McCallf3a88602011-02-03 08:15:49 +0000630llvm::Constant *
631ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
632 CharUnits offset) {
John McCall7a9aac22010-08-23 01:21:21 +0000633 // Itanium C++ ABI 2.3:
634 // A pointer to data member is an offset from the base address of
635 // the class object containing it, represented as a ptrdiff_t
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000636 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
John McCall7a9aac22010-08-23 01:21:21 +0000637}
638
John McCall2979fe02011-04-12 00:42:48 +0000639llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
Richard Smithdafff942012-01-14 04:30:29 +0000640 return BuildMemberPointer(MD, CharUnits::Zero());
641}
642
643llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
644 CharUnits ThisAdjustment) {
John McCalla1dee5302010-08-22 10:59:02 +0000645 assert(MD->isInstance() && "Member function must not be static!");
646 MD = MD->getCanonicalDecl();
647
648 CodeGenTypes &Types = CGM.getTypes();
John McCalla1dee5302010-08-22 10:59:02 +0000649
650 // Get the function pointer (or index if this is a virtual function).
651 llvm::Constant *MemPtr[2];
652 if (MD->isVirtual()) {
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000653 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
John McCalla1dee5302010-08-22 10:59:02 +0000654
Ken Dyckdf016282011-04-09 01:30:02 +0000655 const ASTContext &Context = getContext();
656 CharUnits PointerWidth =
Douglas Gregore8bbc122011-09-02 00:18:52 +0000657 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
Ken Dyckdf016282011-04-09 01:30:02 +0000658 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000659
Mark Seabornedf0d382013-07-24 16:25:13 +0000660 if (UseARMMethodPtrABI) {
John McCalla1dee5302010-08-22 10:59:02 +0000661 // ARM C++ ABI 3.2.1:
662 // This ABI specifies that adj contains twice the this
663 // adjustment, plus 1 if the member function is virtual. The
664 // least significant bit of adj then makes exactly the same
665 // discrimination as the least significant bit of ptr does for
666 // Itanium.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000667 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
668 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000669 2 * ThisAdjustment.getQuantity() + 1);
John McCalla1dee5302010-08-22 10:59:02 +0000670 } else {
671 // Itanium C++ ABI 2.3:
672 // For a virtual function, [the pointer field] is 1 plus the
673 // virtual table offset (in bytes) of the function,
674 // represented as a ptrdiff_t.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000675 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
676 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000677 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000678 }
679 } else {
John McCall2979fe02011-04-12 00:42:48 +0000680 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
Chris Lattner2192fe52011-07-18 04:24:23 +0000681 llvm::Type *Ty;
John McCall2979fe02011-04-12 00:42:48 +0000682 // Check whether the function has a computable LLVM signature.
Chris Lattner8806e322011-07-10 00:18:59 +0000683 if (Types.isFuncTypeConvertible(FPT)) {
John McCall2979fe02011-04-12 00:42:48 +0000684 // The function has a computable LLVM signature; use the correct type.
John McCalla729c622012-02-17 03:33:10 +0000685 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
John McCalla1dee5302010-08-22 10:59:02 +0000686 } else {
John McCall2979fe02011-04-12 00:42:48 +0000687 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
688 // function type is incomplete.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000689 Ty = CGM.PtrDiffTy;
John McCalla1dee5302010-08-22 10:59:02 +0000690 }
John McCall2979fe02011-04-12 00:42:48 +0000691 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
John McCalla1dee5302010-08-22 10:59:02 +0000692
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000693 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
Mark Seabornedf0d382013-07-24 16:25:13 +0000694 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
695 (UseARMMethodPtrABI ? 2 : 1) *
Richard Smithdafff942012-01-14 04:30:29 +0000696 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000697 }
John McCall1c456c82010-08-22 06:43:33 +0000698
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000699 return llvm::ConstantStruct::getAnon(MemPtr);
John McCall1c456c82010-08-22 06:43:33 +0000700}
701
Richard Smithdafff942012-01-14 04:30:29 +0000702llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
703 QualType MPType) {
704 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
705 const ValueDecl *MPD = MP.getMemberPointerDecl();
706 if (!MPD)
707 return EmitNullMemberPointer(MPT);
708
Reid Kleckner452abac2013-05-09 21:01:17 +0000709 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
Richard Smithdafff942012-01-14 04:30:29 +0000710
711 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
712 return BuildMemberPointer(MD, ThisAdjustment);
713
714 CharUnits FieldOffset =
715 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
716 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
717}
718
John McCall131d97d2010-08-22 08:30:07 +0000719/// The comparison algorithm is pretty easy: the member pointers are
720/// the same if they're either bitwise identical *or* both null.
721///
722/// ARM is different here only because null-ness is more complicated.
723llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000724ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
725 llvm::Value *L,
726 llvm::Value *R,
727 const MemberPointerType *MPT,
728 bool Inequality) {
John McCall131d97d2010-08-22 08:30:07 +0000729 CGBuilderTy &Builder = CGF.Builder;
730
John McCall131d97d2010-08-22 08:30:07 +0000731 llvm::ICmpInst::Predicate Eq;
732 llvm::Instruction::BinaryOps And, Or;
733 if (Inequality) {
734 Eq = llvm::ICmpInst::ICMP_NE;
735 And = llvm::Instruction::Or;
736 Or = llvm::Instruction::And;
737 } else {
738 Eq = llvm::ICmpInst::ICMP_EQ;
739 And = llvm::Instruction::And;
740 Or = llvm::Instruction::Or;
741 }
742
John McCall7a9aac22010-08-23 01:21:21 +0000743 // Member data pointers are easy because there's a unique null
744 // value, so it just comes down to bitwise equality.
745 if (MPT->isMemberDataPointer())
746 return Builder.CreateICmp(Eq, L, R);
747
748 // For member function pointers, the tautologies are more complex.
749 // The Itanium tautology is:
John McCall61a14882010-08-23 06:56:36 +0000750 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
John McCall7a9aac22010-08-23 01:21:21 +0000751 // The ARM tautology is:
John McCall61a14882010-08-23 06:56:36 +0000752 // (L == R) <==> (L.ptr == R.ptr &&
753 // (L.adj == R.adj ||
754 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
John McCall7a9aac22010-08-23 01:21:21 +0000755 // The inequality tautologies have exactly the same structure, except
756 // applying De Morgan's laws.
757
758 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
759 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
760
John McCall131d97d2010-08-22 08:30:07 +0000761 // This condition tests whether L.ptr == R.ptr. This must always be
762 // true for equality to hold.
763 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
764
765 // This condition, together with the assumption that L.ptr == R.ptr,
766 // tests whether the pointers are both null. ARM imposes an extra
767 // condition.
768 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
769 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
770
771 // This condition tests whether L.adj == R.adj. If this isn't
772 // true, the pointers are unequal unless they're both null.
John McCalla1dee5302010-08-22 10:59:02 +0000773 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
774 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000775 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
776
777 // Null member function pointers on ARM clear the low bit of Adj,
778 // so the zero condition has to check that neither low bit is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000779 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000780 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
781
782 // Compute (l.adj | r.adj) & 1 and test it against zero.
783 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
784 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
785 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
786 "cmp.or.adj");
787 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
788 }
789
790 // Tie together all our conditions.
791 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
792 Result = Builder.CreateBinOp(And, PtrEq, Result,
793 Inequality ? "memptr.ne" : "memptr.eq");
794 return Result;
795}
796
797llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000798ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
799 llvm::Value *MemPtr,
800 const MemberPointerType *MPT) {
John McCall131d97d2010-08-22 08:30:07 +0000801 CGBuilderTy &Builder = CGF.Builder;
John McCall7a9aac22010-08-23 01:21:21 +0000802
803 /// For member data pointers, this is just a check against -1.
804 if (MPT->isMemberDataPointer()) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000805 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCall7a9aac22010-08-23 01:21:21 +0000806 llvm::Value *NegativeOne =
807 llvm::Constant::getAllOnesValue(MemPtr->getType());
808 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
809 }
John McCall131d97d2010-08-22 08:30:07 +0000810
Daniel Dunbar914bc412011-04-19 23:10:47 +0000811 // In Itanium, a member function pointer is not null if 'ptr' is not null.
John McCalla1dee5302010-08-22 10:59:02 +0000812 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
John McCall131d97d2010-08-22 08:30:07 +0000813
814 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
815 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
816
Daniel Dunbar914bc412011-04-19 23:10:47 +0000817 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
818 // (the virtual bit) is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000819 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000820 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
John McCalla1dee5302010-08-22 10:59:02 +0000821 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000822 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
Daniel Dunbar914bc412011-04-19 23:10:47 +0000823 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
824 "memptr.isvirtual");
825 Result = Builder.CreateOr(Result, IsVirtual);
John McCall131d97d2010-08-22 08:30:07 +0000826 }
827
828 return Result;
829}
John McCall1c456c82010-08-22 06:43:33 +0000830
Reid Kleckner40ca9132014-05-13 22:05:45 +0000831bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
832 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
833 if (!RD)
834 return false;
835
Reid Klecknerd355ca72014-05-15 01:26:32 +0000836 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
837 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
838 // special members.
839 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
Reid Kleckner40ca9132014-05-13 22:05:45 +0000840 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
841 return true;
842 }
Reid Kleckner40ca9132014-05-13 22:05:45 +0000843 return false;
844}
845
John McCall614dbdc2010-08-22 21:01:12 +0000846/// The Itanium ABI requires non-zero initialization only for data
847/// member pointers, for which '0' is a valid offset.
848bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
849 return MPT->getPointeeType()->isFunctionType();
John McCall84fa5102010-08-22 04:16:24 +0000850}
John McCall5d865c322010-08-31 07:33:07 +0000851
John McCall82fb8922012-09-25 10:10:39 +0000852/// The Itanium ABI always places an offset to the complete object
853/// at entry -2 in the vtable.
David Majnemer08681372014-11-01 07:37:17 +0000854void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
855 const CXXDeleteExpr *DE,
856 llvm::Value *Ptr,
857 QualType ElementType,
858 const CXXDestructorDecl *Dtor) {
859 bool UseGlobalDelete = DE->isGlobalDelete();
David Majnemer0c0b6d92014-10-31 20:09:12 +0000860 if (UseGlobalDelete) {
861 // Derive the complete-object pointer, which is what we need
862 // to pass to the deallocation function.
John McCall82fb8922012-09-25 10:10:39 +0000863
David Majnemer0c0b6d92014-10-31 20:09:12 +0000864 // Grab the vtable pointer as an intptr_t*.
865 llvm::Value *VTable = CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo());
John McCall82fb8922012-09-25 10:10:39 +0000866
David Majnemer0c0b6d92014-10-31 20:09:12 +0000867 // Track back to entry -2 and pull out the offset there.
868 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
869 VTable, -2, "complete-offset.ptr");
870 llvm::LoadInst *Offset = CGF.Builder.CreateLoad(OffsetPtr);
871 Offset->setAlignment(CGF.PointerAlignInBytes);
872
873 // Apply the offset.
874 llvm::Value *CompletePtr = CGF.Builder.CreateBitCast(Ptr, CGF.Int8PtrTy);
875 CompletePtr = CGF.Builder.CreateInBoundsGEP(CompletePtr, Offset);
876
877 // If we're supposed to call the global delete, make sure we do so
878 // even if the destructor throws.
David Majnemer08681372014-11-01 07:37:17 +0000879 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
880 ElementType);
David Majnemer0c0b6d92014-10-31 20:09:12 +0000881 }
882
883 // FIXME: Provide a source location here even though there's no
884 // CXXMemberCallExpr for dtor call.
885 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
886 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr);
887
888 if (UseGlobalDelete)
889 CGF.PopCleanupBlock();
John McCall82fb8922012-09-25 10:10:39 +0000890}
891
David Majnemer442d0a22014-11-25 07:20:20 +0000892void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
893 // void __cxa_rethrow();
894
895 llvm::FunctionType *FTy =
896 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
897
898 llvm::Constant *Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
899
900 if (isNoReturn)
901 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, None);
902 else
903 CGF.EmitRuntimeCallOrInvoke(Fn);
904}
905
David Majnemer1162d252014-06-22 19:05:33 +0000906static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
907 // void *__dynamic_cast(const void *sub,
908 // const abi::__class_type_info *src,
909 // const abi::__class_type_info *dst,
910 // std::ptrdiff_t src2dst_offset);
911
912 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
913 llvm::Type *PtrDiffTy =
914 CGF.ConvertType(CGF.getContext().getPointerDiffType());
915
916 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
917
918 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
919
920 // Mark the function as nounwind readonly.
921 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
922 llvm::Attribute::ReadOnly };
923 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
924 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
925
926 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
927}
928
929static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
930 // void __cxa_bad_cast();
931 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
932 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
933}
934
935/// \brief Compute the src2dst_offset hint as described in the
936/// Itanium C++ ABI [2.9.7]
937static CharUnits computeOffsetHint(ASTContext &Context,
938 const CXXRecordDecl *Src,
939 const CXXRecordDecl *Dst) {
940 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
941 /*DetectVirtual=*/false);
942
943 // If Dst is not derived from Src we can skip the whole computation below and
944 // return that Src is not a public base of Dst. Record all inheritance paths.
945 if (!Dst->isDerivedFrom(Src, Paths))
946 return CharUnits::fromQuantity(-2ULL);
947
948 unsigned NumPublicPaths = 0;
949 CharUnits Offset;
950
951 // Now walk all possible inheritance paths.
952 for (CXXBasePaths::paths_iterator I = Paths.begin(), E = Paths.end(); I != E;
953 ++I) {
954 if (I->Access != AS_public) // Ignore non-public inheritance.
955 continue;
956
957 ++NumPublicPaths;
958
959 for (CXXBasePath::iterator J = I->begin(), JE = I->end(); J != JE; ++J) {
960 // If the path contains a virtual base class we can't give any hint.
961 // -1: no hint.
962 if (J->Base->isVirtual())
963 return CharUnits::fromQuantity(-1ULL);
964
965 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
966 continue;
967
968 // Accumulate the base class offsets.
969 const ASTRecordLayout &L = Context.getASTRecordLayout(J->Class);
970 Offset += L.getBaseClassOffset(J->Base->getType()->getAsCXXRecordDecl());
971 }
972 }
973
974 // -2: Src is not a public base of Dst.
975 if (NumPublicPaths == 0)
976 return CharUnits::fromQuantity(-2ULL);
977
978 // -3: Src is a multiple public base type but never a virtual base type.
979 if (NumPublicPaths > 1)
980 return CharUnits::fromQuantity(-3ULL);
981
982 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
983 // Return the offset of Src from the origin of Dst.
984 return Offset;
985}
986
987static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
988 // void __cxa_bad_typeid();
989 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
990
991 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
992}
993
994bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
995 QualType SrcRecordTy) {
996 return IsDeref;
997}
998
999void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1000 llvm::Value *Fn = getBadTypeidFn(CGF);
1001 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1002 CGF.Builder.CreateUnreachable();
1003}
1004
1005llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1006 QualType SrcRecordTy,
1007 llvm::Value *ThisPtr,
1008 llvm::Type *StdTypeInfoPtrTy) {
1009 llvm::Value *Value =
1010 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo());
1011
1012 // Load the type info.
1013 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
1014 return CGF.Builder.CreateLoad(Value);
1015}
1016
1017bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1018 QualType SrcRecordTy) {
1019 return SrcIsPtr;
1020}
1021
1022llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
1023 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
1024 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1025 llvm::Type *PtrDiffLTy =
1026 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1027 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1028
1029 llvm::Value *SrcRTTI =
1030 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1031 llvm::Value *DestRTTI =
1032 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1033
1034 // Compute the offset hint.
1035 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1036 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1037 llvm::Value *OffsetHint = llvm::ConstantInt::get(
1038 PtrDiffLTy,
1039 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1040
1041 // Emit the call to __dynamic_cast.
1042 Value = CGF.EmitCastToVoidPtr(Value);
1043
1044 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1045 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
1046 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1047
1048 /// C++ [expr.dynamic.cast]p9:
1049 /// A failed cast to reference type throws std::bad_cast
1050 if (DestTy->isReferenceType()) {
1051 llvm::BasicBlock *BadCastBlock =
1052 CGF.createBasicBlock("dynamic_cast.bad_cast");
1053
1054 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1055 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1056
1057 CGF.EmitBlock(BadCastBlock);
1058 EmitBadCastCall(CGF);
1059 }
1060
1061 return Value;
1062}
1063
1064llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1065 llvm::Value *Value,
1066 QualType SrcRecordTy,
1067 QualType DestTy) {
1068 llvm::Type *PtrDiffLTy =
1069 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1070 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1071
1072 // Get the vtable pointer.
1073 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1074
1075 // Get the offset-to-top from the vtable.
1076 llvm::Value *OffsetToTop =
1077 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1078 OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1079
1080 // Finally, add the offset to the pointer.
1081 Value = CGF.EmitCastToVoidPtr(Value);
1082 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1083
1084 return CGF.Builder.CreateBitCast(Value, DestLTy);
1085}
1086
1087bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1088 llvm::Value *Fn = getBadCastFn(CGF);
1089 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1090 CGF.Builder.CreateUnreachable();
1091 return true;
1092}
1093
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001094llvm::Value *
1095ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1096 llvm::Value *This,
1097 const CXXRecordDecl *ClassDecl,
1098 const CXXRecordDecl *BaseClassDecl) {
1099 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy);
1100 CharUnits VBaseOffsetOffset =
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001101 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1102 BaseClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001103
1104 llvm::Value *VBaseOffsetPtr =
1105 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1106 "vbase.offset.ptr");
1107 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1108 CGM.PtrDiffTy->getPointerTo());
1109
1110 llvm::Value *VBaseOffset =
1111 CGF.Builder.CreateLoad(VBaseOffsetPtr, "vbase.offset");
1112
1113 return VBaseOffset;
1114}
1115
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001116void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1117 // Just make sure we're in sync with TargetCXXABI.
1118 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1119
Rafael Espindolac3cde362013-12-09 14:51:17 +00001120 // The constructor used for constructing this as a base class;
1121 // ignores virtual bases.
1122 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1123
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001124 // The constructor used for constructing this as a complete class;
Nico Weber4c2ffb22015-01-07 05:25:05 +00001125 // constructs the virtual bases, then calls the base constructor.
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001126 if (!D->getParent()->isAbstract()) {
1127 // We don't need to emit the complete ctor if the class is abstract.
1128 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1129 }
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001130}
1131
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001132void
1133ItaniumCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
1134 SmallVectorImpl<CanQualType> &ArgTys) {
John McCall9bca9232010-09-02 10:25:57 +00001135 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001136
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001137 // All parameters are already in place except VTT, which goes after 'this'.
1138 // These are Clang types, so we don't need to worry about sret yet.
John McCall5d865c322010-08-31 07:33:07 +00001139
1140 // Check if we need to add a VTT parameter (which has type void **).
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001141 if (T == StructorType::Base && MD->getParent()->getNumVBases() != 0)
1142 ArgTys.insert(ArgTys.begin() + 1,
1143 Context.getPointerType(Context.VoidPtrTy));
John McCall5d865c322010-08-31 07:33:07 +00001144}
1145
Reid Klecknere7de47e2013-07-22 13:51:44 +00001146void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
Rafael Espindolac3cde362013-12-09 14:51:17 +00001147 // The destructor used for destructing this as a base class; ignores
1148 // virtual bases.
1149 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001150
1151 // The destructor used for destructing this as a most-derived class;
1152 // call the base destructor and then destructs any virtual bases.
1153 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1154
Rafael Espindolac3cde362013-12-09 14:51:17 +00001155 // The destructor in a virtual table is always a 'deleting'
1156 // destructor, which calls the complete destructor and then uses the
1157 // appropriate operator delete.
1158 if (D->isVirtual())
1159 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001160}
1161
Reid Kleckner89077a12013-12-17 19:46:40 +00001162void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1163 QualType &ResTy,
1164 FunctionArgList &Params) {
John McCall5d865c322010-08-31 07:33:07 +00001165 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
Reid Kleckner89077a12013-12-17 19:46:40 +00001166 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
John McCall5d865c322010-08-31 07:33:07 +00001167
1168 // Check if we need a VTT parameter as well.
Peter Collingbourne66f82e62013-06-28 20:45:28 +00001169 if (NeedsVTTParameter(CGF.CurGD)) {
John McCall9bca9232010-09-02 10:25:57 +00001170 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001171
1172 // FIXME: avoid the fake decl
1173 QualType T = Context.getPointerType(Context.VoidPtrTy);
1174 ImplicitParamDecl *VTTDecl
Craig Topper8a13c412014-05-21 05:09:00 +00001175 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
John McCall5d865c322010-08-31 07:33:07 +00001176 &Context.Idents.get("vtt"), T);
Reid Kleckner89077a12013-12-17 19:46:40 +00001177 Params.insert(Params.begin() + 1, VTTDecl);
Reid Kleckner2af6d732013-12-13 00:09:59 +00001178 getStructorImplicitParamDecl(CGF) = VTTDecl;
John McCall5d865c322010-08-31 07:33:07 +00001179 }
1180}
1181
John McCall5d865c322010-08-31 07:33:07 +00001182void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1183 /// Initialize the 'this' slot.
1184 EmitThisParam(CGF);
1185
1186 /// Initialize the 'vtt' slot if needed.
Reid Kleckner2af6d732013-12-13 00:09:59 +00001187 if (getStructorImplicitParamDecl(CGF)) {
1188 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1189 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
John McCall5d865c322010-08-31 07:33:07 +00001190 }
John McCall5d865c322010-08-31 07:33:07 +00001191
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001192 /// If this is a function that the ABI specifies returns 'this', initialize
1193 /// the return slot to 'this' at the start of the function.
1194 ///
1195 /// Unlike the setting of return types, this is done within the ABI
1196 /// implementation instead of by clients of CGCXXABI because:
1197 /// 1) getThisValue is currently protected
1198 /// 2) in theory, an ABI could implement 'this' returns some other way;
1199 /// HasThisReturn only specifies a contract, not the implementation
John McCall5d865c322010-08-31 07:33:07 +00001200 if (HasThisReturn(CGF.CurGD))
Eli Friedman9fbeba02012-02-11 02:57:39 +00001201 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
John McCall5d865c322010-08-31 07:33:07 +00001202}
1203
Reid Kleckner89077a12013-12-17 19:46:40 +00001204unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1205 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1206 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1207 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1208 return 0;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001209
Reid Kleckner89077a12013-12-17 19:46:40 +00001210 // Insert the implicit 'vtt' argument as the second argument.
1211 llvm::Value *VTT =
1212 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1213 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1214 Args.insert(Args.begin() + 1,
1215 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1216 return 1; // Added one arg.
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001217}
1218
1219void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1220 const CXXDestructorDecl *DD,
1221 CXXDtorType Type, bool ForVirtualBase,
1222 bool Delegating, llvm::Value *This) {
1223 GlobalDecl GD(DD, Type);
1224 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1225 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1226
Craig Topper8a13c412014-05-21 05:09:00 +00001227 llvm::Value *Callee = nullptr;
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001228 if (getContext().getLangOpts().AppleKext)
1229 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1230
1231 if (!Callee)
Rafael Espindola1ac0ec82014-09-11 15:42:06 +00001232 Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type));
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001233
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001234 CGF.EmitCXXMemberOrOperatorCall(DD, Callee, ReturnValueSlot(), This, VTT,
1235 VTTTy, nullptr);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001236}
1237
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001238void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1239 const CXXRecordDecl *RD) {
1240 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1241 if (VTable->hasInitializer())
1242 return;
1243
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001244 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001245 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1246 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
David Majnemerd905da42014-07-01 20:30:31 +00001247 llvm::Constant *RTTI =
1248 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001249
1250 // Create and set the initializer.
1251 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1252 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
David Majnemerd905da42014-07-01 20:30:31 +00001253 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001254 VTable->setInitializer(Init);
1255
1256 // Set the correct linkage.
1257 VTable->setLinkage(Linkage);
1258
Rafael Espindolacb92c192015-01-15 23:18:01 +00001259 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
1260 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
1261
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001262 // Set the right visibility.
John McCall8f80a612014-02-08 00:41:16 +00001263 CGM.setGlobalVisibility(VTable, RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001264
Benjamin Kramer5d34a2b2014-09-10 12:50:59 +00001265 // Use pointer alignment for the vtable. Otherwise we would align them based
1266 // on the size of the initializer which doesn't make sense as only single
1267 // values are read.
1268 unsigned PAlign = CGM.getTarget().getPointerAlign(0);
1269 VTable->setAlignment(getContext().toCharUnitsFromBits(PAlign).getQuantity());
1270
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001271 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1272 // we will emit the typeinfo for the fundamental types. This is the
1273 // same behaviour as GCC.
1274 const DeclContext *DC = RD->getDeclContext();
1275 if (RD->getIdentifier() &&
1276 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1277 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1278 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1279 DC->getParent()->isTranslationUnit())
David Majnemere2cb8d12014-07-07 06:20:47 +00001280 EmitFundamentalRTTIDescriptors();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001281}
1282
1283llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1284 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1285 const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) {
1286 bool NeedsVTTParam = CGM.getCXXABI().NeedsVTTParameter(CGF.CurGD);
1287 NeedsVirtualOffset = (NeedsVTTParam && NearestVBase);
1288
1289 llvm::Value *VTableAddressPoint;
1290 if (NeedsVTTParam && (Base.getBase()->getNumVBases() || NearestVBase)) {
1291 // Get the secondary vpointer index.
1292 uint64_t VirtualPointerIndex =
1293 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1294
1295 /// Load the VTT.
1296 llvm::Value *VTT = CGF.LoadCXXVTT();
1297 if (VirtualPointerIndex)
1298 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1299
1300 // And load the address point from the VTT.
1301 VTableAddressPoint = CGF.Builder.CreateLoad(VTT);
1302 } else {
1303 llvm::Constant *VTable =
1304 CGM.getCXXABI().getAddrOfVTable(VTableClass, CharUnits());
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001305 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1306 .getVTableLayout(VTableClass)
1307 .getAddressPoint(Base);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001308 VTableAddressPoint =
1309 CGF.Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint);
1310 }
1311
1312 return VTableAddressPoint;
1313}
1314
1315llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1316 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1317 llvm::Constant *VTable = getAddrOfVTable(VTableClass, CharUnits());
1318
1319 // Find the appropriate vtable within the vtable group.
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001320 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1321 .getVTableLayout(VTableClass)
1322 .getAddressPoint(Base);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001323 llvm::Value *Indices[] = {
1324 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1325 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1326 };
1327
1328 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Indices);
1329}
1330
1331llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1332 CharUnits VPtrOffset) {
1333 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1334
1335 llvm::GlobalVariable *&VTable = VTables[RD];
1336 if (VTable)
1337 return VTable;
1338
1339 // Queue up this v-table for possible deferred emission.
1340 CGM.addDeferredVTable(RD);
1341
1342 SmallString<256> OutName;
1343 llvm::raw_svector_ostream Out(OutName);
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001344 getMangleContext().mangleCXXVTable(RD, Out);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001345 Out.flush();
1346 StringRef Name = OutName.str();
1347
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001348 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001349 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1350 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1351
1352 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1353 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1354 VTable->setUnnamedAddr(true);
Hans Wennborgda24e9c2014-06-02 23:13:03 +00001355
1356 if (RD->hasAttr<DLLImportAttr>())
1357 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1358 else if (RD->hasAttr<DLLExportAttr>())
1359 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1360
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001361 return VTable;
1362}
1363
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001364llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1365 GlobalDecl GD,
1366 llvm::Value *This,
1367 llvm::Type *Ty) {
1368 GD = GD.getCanonicalDecl();
1369 Ty = Ty->getPointerTo()->getPointerTo();
1370 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
1371
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001372 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001373 llvm::Value *VFuncPtr =
1374 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
1375 return CGF.Builder.CreateLoad(VFuncPtr);
1376}
1377
David Majnemer0c0b6d92014-10-31 20:09:12 +00001378llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
1379 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
1380 llvm::Value *This, const CXXMemberCallExpr *CE) {
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001381 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001382 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1383
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001384 const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
1385 Dtor, getFromDtorType(DtorType));
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001386 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001387 llvm::Value *Callee =
1388 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty);
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001389
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001390 CGF.EmitCXXMemberOrOperatorCall(Dtor, Callee, ReturnValueSlot(), This,
1391 /*ImplicitParam=*/nullptr, QualType(), CE);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001392 return nullptr;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001393}
1394
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001395void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
Reid Kleckner7810af02013-06-19 15:20:38 +00001396 CodeGenVTables &VTables = CGM.getVTables();
1397 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001398 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
Reid Kleckner7810af02013-06-19 15:20:38 +00001399}
1400
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001401static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
1402 llvm::Value *Ptr,
1403 int64_t NonVirtualAdjustment,
1404 int64_t VirtualAdjustment,
1405 bool IsReturnAdjustment) {
1406 if (!NonVirtualAdjustment && !VirtualAdjustment)
1407 return Ptr;
1408
1409 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1410 llvm::Value *V = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy);
1411
1412 if (NonVirtualAdjustment && !IsReturnAdjustment) {
1413 // Perform the non-virtual adjustment for a base-to-derived cast.
1414 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1415 }
1416
1417 if (VirtualAdjustment) {
1418 llvm::Type *PtrDiffTy =
1419 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1420
1421 // Perform the virtual adjustment.
1422 llvm::Value *VTablePtrPtr =
1423 CGF.Builder.CreateBitCast(V, Int8PtrTy->getPointerTo());
1424
1425 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1426
1427 llvm::Value *OffsetPtr =
1428 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1429
1430 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1431
1432 // Load the adjustment offset from the vtable.
1433 llvm::Value *Offset = CGF.Builder.CreateLoad(OffsetPtr);
1434
1435 // Adjust our pointer.
1436 V = CGF.Builder.CreateInBoundsGEP(V, Offset);
1437 }
1438
1439 if (NonVirtualAdjustment && IsReturnAdjustment) {
1440 // Perform the non-virtual adjustment for a derived-to-base cast.
1441 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1442 }
1443
1444 // Cast back to the original type.
1445 return CGF.Builder.CreateBitCast(V, Ptr->getType());
1446}
1447
1448llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1449 llvm::Value *This,
1450 const ThisAdjustment &TA) {
Timur Iskhodzhanov053142a2013-11-06 06:24:31 +00001451 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1452 TA.Virtual.Itanium.VCallOffsetOffset,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001453 /*IsReturnAdjustment=*/false);
1454}
1455
1456llvm::Value *
1457ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1458 const ReturnAdjustment &RA) {
1459 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1460 RA.Virtual.Itanium.VBaseOffsetOffset,
1461 /*IsReturnAdjustment=*/true);
1462}
1463
John McCall5d865c322010-08-31 07:33:07 +00001464void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1465 RValue RV, QualType ResultType) {
1466 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1467 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1468
1469 // Destructor thunks in the ARM ABI have indeterminate results.
Chris Lattner2192fe52011-07-18 04:24:23 +00001470 llvm::Type *T =
John McCall5d865c322010-08-31 07:33:07 +00001471 cast<llvm::PointerType>(CGF.ReturnValue->getType())->getElementType();
1472 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1473 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1474}
John McCall8ed55a52010-09-02 09:58:18 +00001475
1476/************************** Array allocation cookies **************************/
1477
John McCallb91cd662012-05-01 05:23:51 +00001478CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1479 // The array cookie is a size_t; pad that up to the element alignment.
1480 // The cookie is actually right-justified in that space.
1481 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1482 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001483}
1484
1485llvm::Value *ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1486 llvm::Value *NewPtr,
1487 llvm::Value *NumElements,
John McCall284c48f2011-01-27 09:37:56 +00001488 const CXXNewExpr *expr,
John McCall8ed55a52010-09-02 09:58:18 +00001489 QualType ElementType) {
John McCallb91cd662012-05-01 05:23:51 +00001490 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001491
Micah Villmowea2fea22012-10-25 15:39:14 +00001492 unsigned AS = NewPtr->getType()->getPointerAddressSpace();
John McCall8ed55a52010-09-02 09:58:18 +00001493
John McCall9bca9232010-09-02 10:25:57 +00001494 ASTContext &Ctx = getContext();
John McCall8ed55a52010-09-02 09:58:18 +00001495 QualType SizeTy = Ctx.getSizeType();
1496 CharUnits SizeSize = Ctx.getTypeSizeInChars(SizeTy);
1497
1498 // The size of the cookie.
1499 CharUnits CookieSize =
1500 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
John McCallb91cd662012-05-01 05:23:51 +00001501 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
John McCall8ed55a52010-09-02 09:58:18 +00001502
1503 // Compute an offset to the cookie.
1504 llvm::Value *CookiePtr = NewPtr;
1505 CharUnits CookieOffset = CookieSize - SizeSize;
1506 if (!CookieOffset.isZero())
1507 CookiePtr = CGF.Builder.CreateConstInBoundsGEP1_64(CookiePtr,
1508 CookieOffset.getQuantity());
1509
1510 // Write the number of elements into the appropriate slot.
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001511 llvm::Type *NumElementsTy = CGF.ConvertType(SizeTy)->getPointerTo(AS);
1512 llvm::Value *NumElementsPtr =
1513 CGF.Builder.CreateBitCast(CookiePtr, NumElementsTy);
1514 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001515 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001516 expr->getOperatorNew()->isReplaceableGlobalAllocationFunction()) {
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001517 // The store to the CookiePtr does not need to be instrumented.
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001518 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
1519 llvm::FunctionType *FTy =
1520 llvm::FunctionType::get(CGM.VoidTy, NumElementsTy, false);
1521 llvm::Constant *F =
1522 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
1523 CGF.Builder.CreateCall(F, NumElementsPtr);
1524 }
John McCall8ed55a52010-09-02 09:58:18 +00001525
1526 // Finally, compute a pointer to the actual data buffer by skipping
1527 // over the cookie completely.
1528 return CGF.Builder.CreateConstInBoundsGEP1_64(NewPtr,
1529 CookieSize.getQuantity());
1530}
1531
John McCallb91cd662012-05-01 05:23:51 +00001532llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1533 llvm::Value *allocPtr,
1534 CharUnits cookieSize) {
1535 // The element size is right-justified in the cookie.
1536 llvm::Value *numElementsPtr = allocPtr;
1537 CharUnits numElementsOffset =
1538 cookieSize - CharUnits::fromQuantity(CGF.SizeSizeInBytes);
1539 if (!numElementsOffset.isZero())
1540 numElementsPtr =
1541 CGF.Builder.CreateConstInBoundsGEP1_64(numElementsPtr,
1542 numElementsOffset.getQuantity());
John McCall8ed55a52010-09-02 09:58:18 +00001543
Micah Villmowea2fea22012-10-25 15:39:14 +00001544 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
John McCallb91cd662012-05-01 05:23:51 +00001545 numElementsPtr =
1546 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001547 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001548 return CGF.Builder.CreateLoad(numElementsPtr);
1549 // In asan mode emit a function call instead of a regular load and let the
1550 // run-time deal with it: if the shadow is properly poisoned return the
1551 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
1552 // We can't simply ignore this load using nosanitize metadata because
1553 // the metadata may be lost.
1554 llvm::FunctionType *FTy =
1555 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
1556 llvm::Constant *F =
1557 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
1558 return CGF.Builder.CreateCall(F, numElementsPtr);
John McCall8ed55a52010-09-02 09:58:18 +00001559}
1560
John McCallb91cd662012-05-01 05:23:51 +00001561CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
John McCallc19c7062013-01-25 23:36:19 +00001562 // ARM says that the cookie is always:
John McCall8ed55a52010-09-02 09:58:18 +00001563 // struct array_cookie {
1564 // std::size_t element_size; // element_size != 0
1565 // std::size_t element_count;
1566 // };
John McCallc19c7062013-01-25 23:36:19 +00001567 // But the base ABI doesn't give anything an alignment greater than
1568 // 8, so we can dismiss this as typical ABI-author blindness to
1569 // actual language complexity and round up to the element alignment.
1570 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1571 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001572}
1573
1574llvm::Value *ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
John McCallc19c7062013-01-25 23:36:19 +00001575 llvm::Value *newPtr,
1576 llvm::Value *numElements,
John McCall284c48f2011-01-27 09:37:56 +00001577 const CXXNewExpr *expr,
John McCallc19c7062013-01-25 23:36:19 +00001578 QualType elementType) {
John McCallb91cd662012-05-01 05:23:51 +00001579 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001580
John McCallc19c7062013-01-25 23:36:19 +00001581 // NewPtr is a char*, but we generalize to arbitrary addrspaces.
1582 unsigned AS = newPtr->getType()->getPointerAddressSpace();
John McCall8ed55a52010-09-02 09:58:18 +00001583
1584 // The cookie is always at the start of the buffer.
John McCallc19c7062013-01-25 23:36:19 +00001585 llvm::Value *cookie = newPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001586
1587 // The first element is the element size.
John McCallc19c7062013-01-25 23:36:19 +00001588 cookie = CGF.Builder.CreateBitCast(cookie, CGF.SizeTy->getPointerTo(AS));
1589 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1590 getContext().getTypeSizeInChars(elementType).getQuantity());
1591 CGF.Builder.CreateStore(elementSize, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001592
1593 // The second element is the element count.
John McCallc19c7062013-01-25 23:36:19 +00001594 cookie = CGF.Builder.CreateConstInBoundsGEP1_32(cookie, 1);
1595 CGF.Builder.CreateStore(numElements, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001596
1597 // Finally, compute a pointer to the actual data buffer by skipping
1598 // over the cookie completely.
John McCallc19c7062013-01-25 23:36:19 +00001599 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
1600 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
1601 cookieSize.getQuantity());
John McCall8ed55a52010-09-02 09:58:18 +00001602}
1603
John McCallb91cd662012-05-01 05:23:51 +00001604llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1605 llvm::Value *allocPtr,
1606 CharUnits cookieSize) {
1607 // The number of elements is at offset sizeof(size_t) relative to
1608 // the allocated pointer.
1609 llvm::Value *numElementsPtr
1610 = CGF.Builder.CreateConstInBoundsGEP1_64(allocPtr, CGF.SizeSizeInBytes);
John McCall8ed55a52010-09-02 09:58:18 +00001611
Micah Villmowea2fea22012-10-25 15:39:14 +00001612 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
John McCallb91cd662012-05-01 05:23:51 +00001613 numElementsPtr =
1614 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1615 return CGF.Builder.CreateLoad(numElementsPtr);
John McCall8ed55a52010-09-02 09:58:18 +00001616}
1617
John McCall68ff0372010-09-08 01:44:27 +00001618/*********************** Static local initialization **************************/
1619
1620static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001621 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001622 // int __cxa_guard_acquire(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001623 llvm::FunctionType *FTy =
John McCall68ff0372010-09-08 01:44:27 +00001624 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
Jay Foad5709f7c2011-07-29 13:56:53 +00001625 GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001626 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001627 llvm::AttributeSet::get(CGM.getLLVMContext(),
1628 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001629 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001630}
1631
1632static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001633 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001634 // void __cxa_guard_release(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001635 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001636 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001637 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001638 llvm::AttributeSet::get(CGM.getLLVMContext(),
1639 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001640 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001641}
1642
1643static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001644 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001645 // void __cxa_guard_abort(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001646 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001647 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001648 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001649 llvm::AttributeSet::get(CGM.getLLVMContext(),
1650 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001651 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001652}
1653
1654namespace {
1655 struct CallGuardAbort : EHScopeStack::Cleanup {
1656 llvm::GlobalVariable *Guard;
Chandler Carruth84537952012-03-30 19:44:53 +00001657 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
John McCall68ff0372010-09-08 01:44:27 +00001658
Craig Topper4f12f102014-03-12 06:41:41 +00001659 void Emit(CodeGenFunction &CGF, Flags flags) override {
John McCall882987f2013-02-28 19:01:20 +00001660 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1661 Guard);
John McCall68ff0372010-09-08 01:44:27 +00001662 }
1663 };
1664}
1665
1666/// The ARM code here follows the Itanium code closely enough that we
1667/// just special-case it at particular places.
John McCallcdf7ef52010-11-06 09:44:32 +00001668void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1669 const VarDecl &D,
John McCallb88a5662012-03-30 21:00:39 +00001670 llvm::GlobalVariable *var,
1671 bool shouldPerformInit) {
John McCall68ff0372010-09-08 01:44:27 +00001672 CGBuilderTy &Builder = CGF.Builder;
John McCallcdf7ef52010-11-06 09:44:32 +00001673
Richard Smithdbf74ba2013-04-14 23:01:42 +00001674 // We only need to use thread-safe statics for local non-TLS variables;
John McCallcdf7ef52010-11-06 09:44:32 +00001675 // global initialization is always single-threaded.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001676 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1677 D.isLocalVarDecl() && !D.getTLSKind();
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001678
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001679 // If we have a global variable with internal linkage and thread-safe statics
1680 // are disabled, we can just let the guard variable be of type i8.
John McCallb88a5662012-03-30 21:00:39 +00001681 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1682
1683 llvm::IntegerType *guardTy;
John McCall5aa52592011-06-17 07:33:57 +00001684 if (useInt8GuardVariable) {
John McCallb88a5662012-03-30 21:00:39 +00001685 guardTy = CGF.Int8Ty;
John McCall5aa52592011-06-17 07:33:57 +00001686 } else {
Tim Northover9bb857a2013-01-31 12:13:10 +00001687 // Guard variables are 64 bits in the generic ABI and size width on ARM
1688 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
Mark Seabornedf0d382013-07-24 16:25:13 +00001689 guardTy = (UseARMGuardVarABI ? CGF.SizeTy : CGF.Int64Ty);
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001690 }
John McCallb88a5662012-03-30 21:00:39 +00001691 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
John McCall68ff0372010-09-08 01:44:27 +00001692
John McCallb88a5662012-03-30 21:00:39 +00001693 // Create the guard variable if we don't already have it (as we
1694 // might if we're double-emitting this function body).
1695 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1696 if (!guard) {
1697 // Mangle the name for the guard.
1698 SmallString<256> guardName;
1699 {
1700 llvm::raw_svector_ostream out(guardName);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001701 getMangleContext().mangleStaticGuardVariable(&D, out);
John McCallb88a5662012-03-30 21:00:39 +00001702 out.flush();
1703 }
John McCall8e7cb6d2010-11-02 21:04:24 +00001704
John McCallb88a5662012-03-30 21:00:39 +00001705 // Create the guard variable with a zero-initializer.
1706 // Just absorb linkage and visibility from the guarded variable.
1707 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1708 false, var->getLinkage(),
1709 llvm::ConstantInt::get(guardTy, 0),
1710 guardName.str());
1711 guard->setVisibility(var->getVisibility());
Richard Smithdbf74ba2013-04-14 23:01:42 +00001712 // If the variable is thread-local, so is its guard variable.
1713 guard->setThreadLocalMode(var->getThreadLocalMode());
John McCallb88a5662012-03-30 21:00:39 +00001714
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001715 // The ABI says: It is suggested that it be emitted in the same COMDAT group
1716 // as the associated data object
Rafael Espindola0d4fb982015-01-12 22:13:53 +00001717 llvm::Comdat *C = var->getComdat();
1718 if (!D.isLocalVarDecl() && C) {
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001719 guard->setComdat(C);
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001720 CGF.CurFn->setComdat(C);
Rafael Espindola0d4fb982015-01-12 22:13:53 +00001721 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
1722 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001723 }
1724
John McCallb88a5662012-03-30 21:00:39 +00001725 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1726 }
John McCall87590e62012-03-30 07:09:50 +00001727
John McCall68ff0372010-09-08 01:44:27 +00001728 // Test whether the variable has completed initialization.
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001729 //
John McCall68ff0372010-09-08 01:44:27 +00001730 // Itanium C++ ABI 3.3.2:
1731 // The following is pseudo-code showing how these functions can be used:
1732 // if (obj_guard.first_byte == 0) {
1733 // if ( __cxa_guard_acquire (&obj_guard) ) {
1734 // try {
1735 // ... initialize the object ...;
1736 // } catch (...) {
1737 // __cxa_guard_abort (&obj_guard);
1738 // throw;
1739 // }
1740 // ... queue object destructor with __cxa_atexit() ...;
1741 // __cxa_guard_release (&obj_guard);
1742 // }
1743 // }
Tim Northovera2ee4332014-03-29 15:09:45 +00001744
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001745 // Load the first byte of the guard variable.
1746 llvm::LoadInst *LI =
John McCallb88a5662012-03-30 21:00:39 +00001747 Builder.CreateLoad(Builder.CreateBitCast(guard, CGM.Int8PtrTy));
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001748 LI->setAlignment(1);
John McCall68ff0372010-09-08 01:44:27 +00001749
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001750 // Itanium ABI:
1751 // An implementation supporting thread-safety on multiprocessor
1752 // systems must also guarantee that references to the initialized
1753 // object do not occur before the load of the initialization flag.
1754 //
1755 // In LLVM, we do this by marking the load Acquire.
1756 if (threadsafe)
1757 LI->setAtomic(llvm::Acquire);
Eli Friedman84d28122011-09-13 22:21:56 +00001758
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001759 // For ARM, we should only check the first bit, rather than the entire byte:
1760 //
1761 // ARM C++ ABI 3.2.3.1:
1762 // To support the potential use of initialization guard variables
1763 // as semaphores that are the target of ARM SWP and LDREX/STREX
1764 // synchronizing instructions we define a static initialization
1765 // guard variable to be a 4-byte aligned, 4-byte word with the
1766 // following inline access protocol.
1767 // #define INITIALIZED 1
1768 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
1769 // if (__cxa_guard_acquire(&obj_guard))
1770 // ...
1771 // }
1772 //
1773 // and similarly for ARM64:
1774 //
1775 // ARM64 C++ ABI 3.2.2:
1776 // This ABI instead only specifies the value bit 0 of the static guard
1777 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
1778 // variable is not initialized and 1 when it is.
1779 llvm::Value *V =
1780 (UseARMGuardVarABI && !useInt8GuardVariable)
1781 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
1782 : LI;
1783 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
John McCall68ff0372010-09-08 01:44:27 +00001784
1785 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
1786 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1787
1788 // Check if the first byte of the guard variable is zero.
John McCallb88a5662012-03-30 21:00:39 +00001789 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
John McCall68ff0372010-09-08 01:44:27 +00001790
1791 CGF.EmitBlock(InitCheckBlock);
1792
1793 // Variables used when coping with thread-safe statics and exceptions.
John McCall5aa52592011-06-17 07:33:57 +00001794 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00001795 // Call __cxa_guard_acquire.
1796 llvm::Value *V
John McCall882987f2013-02-28 19:01:20 +00001797 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
John McCall68ff0372010-09-08 01:44:27 +00001798
1799 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1800
1801 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
1802 InitBlock, EndBlock);
1803
1804 // Call __cxa_guard_abort along the exceptional edge.
John McCallb88a5662012-03-30 21:00:39 +00001805 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
John McCall68ff0372010-09-08 01:44:27 +00001806
1807 CGF.EmitBlock(InitBlock);
1808 }
1809
1810 // Emit the initializer and add a global destructor if appropriate.
John McCallb88a5662012-03-30 21:00:39 +00001811 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
John McCall68ff0372010-09-08 01:44:27 +00001812
John McCall5aa52592011-06-17 07:33:57 +00001813 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00001814 // Pop the guard-abort cleanup if we pushed one.
1815 CGF.PopCleanupBlock();
1816
1817 // Call __cxa_guard_release. This cannot throw.
John McCall882987f2013-02-28 19:01:20 +00001818 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), guard);
John McCall68ff0372010-09-08 01:44:27 +00001819 } else {
John McCallb88a5662012-03-30 21:00:39 +00001820 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guard);
John McCall68ff0372010-09-08 01:44:27 +00001821 }
1822
1823 CGF.EmitBlock(EndBlock);
1824}
John McCallc84ed6a2012-05-01 06:13:13 +00001825
1826/// Register a global destructor using __cxa_atexit.
1827static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
1828 llvm::Constant *dtor,
Richard Smithdbf74ba2013-04-14 23:01:42 +00001829 llvm::Constant *addr,
1830 bool TLS) {
Bill Wendling95cae882013-05-02 19:18:03 +00001831 const char *Name = "__cxa_atexit";
1832 if (TLS) {
1833 const llvm::Triple &T = CGF.getTarget().getTriple();
1834 Name = T.isMacOSX() ? "_tlv_atexit" : "__cxa_thread_atexit";
1835 }
Richard Smithdbf74ba2013-04-14 23:01:42 +00001836
John McCallc84ed6a2012-05-01 06:13:13 +00001837 // We're assuming that the destructor function is something we can
1838 // reasonably call with the default CC. Go ahead and cast it to the
1839 // right prototype.
1840 llvm::Type *dtorTy =
1841 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
1842
1843 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
1844 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
1845 llvm::FunctionType *atexitTy =
1846 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
1847
1848 // Fetch the actual function.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001849 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
John McCallc84ed6a2012-05-01 06:13:13 +00001850 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
1851 fn->setDoesNotThrow();
1852
1853 // Create a variable that binds the atexit to this shared object.
1854 llvm::Constant *handle =
1855 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
1856
1857 llvm::Value *args[] = {
1858 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
1859 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
1860 handle
1861 };
John McCall882987f2013-02-28 19:01:20 +00001862 CGF.EmitNounwindRuntimeCall(atexit, args);
John McCallc84ed6a2012-05-01 06:13:13 +00001863}
1864
1865/// Register a global destructor as best as we know how.
1866void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
Richard Smithdbf74ba2013-04-14 23:01:42 +00001867 const VarDecl &D,
John McCallc84ed6a2012-05-01 06:13:13 +00001868 llvm::Constant *dtor,
1869 llvm::Constant *addr) {
1870 // Use __cxa_atexit if available.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001871 if (CGM.getCodeGenOpts().CXAAtExit)
1872 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
1873
1874 if (D.getTLSKind())
1875 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
John McCallc84ed6a2012-05-01 06:13:13 +00001876
1877 // In Apple kexts, we want to add a global destructor entry.
1878 // FIXME: shouldn't this be guarded by some variable?
Richard Smith9c6890a2012-11-01 22:30:59 +00001879 if (CGM.getLangOpts().AppleKext) {
John McCallc84ed6a2012-05-01 06:13:13 +00001880 // Generate a global destructor entry.
1881 return CGM.AddCXXDtorEntry(dtor, addr);
1882 }
1883
David Blaikieebe87e12013-08-27 23:57:18 +00001884 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
John McCallc84ed6a2012-05-01 06:13:13 +00001885}
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001886
David Majnemer9b21c332014-07-11 20:28:10 +00001887static bool isThreadWrapperReplaceable(const VarDecl *VD,
1888 CodeGen::CodeGenModule &CGM) {
1889 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
1890 // OS X prefers to have references to thread local variables to go through
1891 // the thread wrapper instead of directly referencing the backing variable.
1892 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
1893 CGM.getTarget().getTriple().isMacOSX();
1894}
1895
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001896/// Get the appropriate linkage for the wrapper function. This is essentially
David Majnemer4632e1e2014-06-27 16:56:27 +00001897/// the weak form of the variable's linkage; every translation unit which needs
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001898/// the wrapper emits a copy, and we want the linker to merge them.
David Majnemer35ab3282014-06-11 04:08:55 +00001899static llvm::GlobalValue::LinkageTypes
1900getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
1901 llvm::GlobalValue::LinkageTypes VarLinkage =
1902 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
1903
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001904 // For internal linkage variables, we don't need an external or weak wrapper.
1905 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
1906 return VarLinkage;
David Majnemer35ab3282014-06-11 04:08:55 +00001907
David Majnemer9b21c332014-07-11 20:28:10 +00001908 // If the thread wrapper is replaceable, give it appropriate linkage.
1909 if (isThreadWrapperReplaceable(VD, CGM)) {
1910 if (llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) ||
1911 llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
1912 return llvm::GlobalVariable::WeakAnyLinkage;
1913 return VarLinkage;
1914 }
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001915 return llvm::GlobalValue::WeakODRLinkage;
1916}
1917
1918llvm::Function *
1919ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
Alexander Musmanf94c3182014-09-26 06:28:25 +00001920 llvm::Value *Val) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001921 // Mangle the name for the thread_local wrapper function.
1922 SmallString<256> WrapperName;
1923 {
1924 llvm::raw_svector_ostream Out(WrapperName);
1925 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
1926 Out.flush();
1927 }
1928
Alexander Musmanf94c3182014-09-26 06:28:25 +00001929 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001930 return cast<llvm::Function>(V);
1931
Alexander Musmanf94c3182014-09-26 06:28:25 +00001932 llvm::Type *RetTy = Val->getType();
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001933 if (VD->getType()->isReferenceType())
1934 RetTy = RetTy->getPointerElementType();
1935
1936 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
David Majnemer35ab3282014-06-11 04:08:55 +00001937 llvm::Function *Wrapper =
1938 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
1939 WrapperName.str(), &CGM.getModule());
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001940 // Always resolve references to the wrapper at link time.
David Majnemer9b21c332014-07-11 20:28:10 +00001941 if (!Wrapper->hasLocalLinkage() && !isThreadWrapperReplaceable(VD, CGM))
Duncan P. N. Exon Smith4434d362014-05-07 22:36:11 +00001942 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001943 return Wrapper;
1944}
1945
1946void ItaniumCXXABI::EmitThreadLocalInitFuncs(
David Majnemerb3341ea2014-10-05 05:05:40 +00001947 CodeGenModule &CGM,
1948 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
1949 CXXThreadLocals, ArrayRef<llvm::Function *> CXXThreadLocalInits,
1950 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) {
1951 llvm::Function *InitFunc = nullptr;
1952 if (!CXXThreadLocalInits.empty()) {
1953 // Generate a guarded initialization function.
1954 llvm::FunctionType *FTy =
1955 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
1956 InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init",
Alexey Samsonov1444bb92014-10-17 00:20:19 +00001957 SourceLocation(),
David Majnemerb3341ea2014-10-05 05:05:40 +00001958 /*TLS=*/true);
1959 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
1960 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
1961 llvm::GlobalVariable::InternalLinkage,
1962 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
1963 Guard->setThreadLocal(true);
1964 CodeGenFunction(CGM)
1965 .GenerateCXXGlobalInitFunc(InitFunc, CXXThreadLocalInits, Guard);
1966 }
1967 for (unsigned I = 0, N = CXXThreadLocals.size(); I != N; ++I) {
1968 const VarDecl *VD = CXXThreadLocals[I].first;
1969 llvm::GlobalVariable *Var = CXXThreadLocals[I].second;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001970
David Majnemer9b21c332014-07-11 20:28:10 +00001971 // Some targets require that all access to thread local variables go through
1972 // the thread wrapper. This means that we cannot attempt to create a thread
1973 // wrapper or a thread helper.
1974 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
1975 continue;
1976
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001977 // Mangle the name for the thread_local initialization function.
1978 SmallString<256> InitFnName;
1979 {
1980 llvm::raw_svector_ostream Out(InitFnName);
1981 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
1982 Out.flush();
1983 }
1984
1985 // If we have a definition for the variable, emit the initialization
1986 // function as an alias to the global Init function (if any). Otherwise,
1987 // produce a declaration of the initialization function.
Craig Topper8a13c412014-05-21 05:09:00 +00001988 llvm::GlobalValue *Init = nullptr;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001989 bool InitIsInitFunc = false;
1990 if (VD->hasDefinition()) {
1991 InitIsInitFunc = true;
1992 if (InitFunc)
Rafael Espindola234405b2014-05-17 21:30:14 +00001993 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
1994 InitFunc);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00001995 } else {
1996 // Emit a weak global function referring to the initialization function.
1997 // This function will not exist if the TU defining the thread_local
1998 // variable in question does not need any dynamic initialization for
1999 // its thread_local variables.
2000 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
2001 Init = llvm::Function::Create(
2002 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
2003 &CGM.getModule());
2004 }
2005
2006 if (Init)
2007 Init->setVisibility(Var->getVisibility());
2008
2009 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
2010 llvm::LLVMContext &Context = CGM.getModule().getContext();
2011 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
2012 CGBuilderTy Builder(Entry);
2013 if (InitIsInitFunc) {
2014 if (Init)
2015 Builder.CreateCall(Init);
2016 } else {
2017 // Don't know whether we have an init function. Call it if it exists.
2018 llvm::Value *Have = Builder.CreateIsNotNull(Init);
2019 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2020 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2021 Builder.CreateCondBr(Have, InitBB, ExitBB);
2022
2023 Builder.SetInsertPoint(InitBB);
2024 Builder.CreateCall(Init);
2025 Builder.CreateBr(ExitBB);
2026
2027 Builder.SetInsertPoint(ExitBB);
2028 }
2029
2030 // For a reference, the result of the wrapper function is a pointer to
2031 // the referenced object.
2032 llvm::Value *Val = Var;
2033 if (VD->getType()->isReferenceType()) {
2034 llvm::LoadInst *LI = Builder.CreateLoad(Val);
2035 LI->setAlignment(CGM.getContext().getDeclAlign(VD).getQuantity());
2036 Val = LI;
2037 }
Alexander Musmanf94c3182014-09-26 06:28:25 +00002038 if (Val->getType() != Wrapper->getReturnType())
2039 Val = Builder.CreatePointerBitCastOrAddrSpaceCast(
2040 Val, Wrapper->getReturnType(), "");
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002041 Builder.CreateRet(Val);
2042 }
2043}
2044
Richard Smith0f383742014-03-26 22:48:22 +00002045LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2046 const VarDecl *VD,
2047 QualType LValType) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002048 QualType T = VD->getType();
2049 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
2050 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
Alexander Musmanf94c3182014-09-26 06:28:25 +00002051 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002052
2053 Val = CGF.Builder.CreateCall(Wrapper);
2054
2055 LValue LV;
2056 if (VD->getType()->isReferenceType())
Richard Smith0f383742014-03-26 22:48:22 +00002057 LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002058 else
Richard Smith0f383742014-03-26 22:48:22 +00002059 LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD));
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002060 // FIXME: need setObjCGCLValueClass?
2061 return LV;
2062}
Peter Collingbourne66f82e62013-06-28 20:45:28 +00002063
2064/// Return whether the given global decl needs a VTT parameter, which it does
2065/// if it's a base constructor or destructor with virtual bases.
2066bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
2067 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
2068
2069 // We don't have any virtual bases, just return early.
2070 if (!MD->getParent()->getNumVBases())
2071 return false;
2072
2073 // Check if we have a base constructor.
2074 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
2075 return true;
2076
2077 // Check if we have a base destructor.
2078 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2079 return true;
2080
2081 return false;
2082}
David Majnemere2cb8d12014-07-07 06:20:47 +00002083
2084namespace {
2085class ItaniumRTTIBuilder {
2086 CodeGenModule &CGM; // Per-module state.
2087 llvm::LLVMContext &VMContext;
2088 const ItaniumCXXABI &CXXABI; // Per-module state.
2089
2090 /// Fields - The fields of the RTTI descriptor currently being built.
2091 SmallVector<llvm::Constant *, 16> Fields;
2092
2093 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2094 llvm::GlobalVariable *
2095 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2096
2097 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2098 /// descriptor of the given type.
2099 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2100
2101 /// BuildVTablePointer - Build the vtable pointer for the given type.
2102 void BuildVTablePointer(const Type *Ty);
2103
2104 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2105 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2106 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2107
2108 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2109 /// classes with bases that do not satisfy the abi::__si_class_type_info
2110 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2111 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2112
2113 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2114 /// for pointer types.
2115 void BuildPointerTypeInfo(QualType PointeeTy);
2116
2117 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2118 /// type_info for an object type.
2119 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2120
2121 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2122 /// struct, used for member pointer types.
2123 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2124
2125public:
2126 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2127 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2128
2129 // Pointer type info flags.
2130 enum {
2131 /// PTI_Const - Type has const qualifier.
2132 PTI_Const = 0x1,
2133
2134 /// PTI_Volatile - Type has volatile qualifier.
2135 PTI_Volatile = 0x2,
2136
2137 /// PTI_Restrict - Type has restrict qualifier.
2138 PTI_Restrict = 0x4,
2139
2140 /// PTI_Incomplete - Type is incomplete.
2141 PTI_Incomplete = 0x8,
2142
2143 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2144 /// (in pointer to member).
2145 PTI_ContainingClassIncomplete = 0x10
2146 };
2147
2148 // VMI type info flags.
2149 enum {
2150 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2151 VMI_NonDiamondRepeat = 0x1,
2152
2153 /// VMI_DiamondShaped - Class is diamond shaped.
2154 VMI_DiamondShaped = 0x2
2155 };
2156
2157 // Base class type info flags.
2158 enum {
2159 /// BCTI_Virtual - Base class is virtual.
2160 BCTI_Virtual = 0x1,
2161
2162 /// BCTI_Public - Base class is public.
2163 BCTI_Public = 0x2
2164 };
2165
2166 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2167 ///
2168 /// \param Force - true to force the creation of this RTTI value
2169 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2170};
2171}
2172
2173llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2174 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
2175 SmallString<256> OutName;
2176 llvm::raw_svector_ostream Out(OutName);
2177 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
2178 Out.flush();
2179 StringRef Name = OutName.str();
2180
2181 // We know that the mangled name of the type starts at index 4 of the
2182 // mangled name of the typename, so we can just index into it in order to
2183 // get the mangled name of the type.
2184 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2185 Name.substr(4));
2186
2187 llvm::GlobalVariable *GV =
2188 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2189
2190 GV->setInitializer(Init);
2191
2192 return GV;
2193}
2194
2195llvm::Constant *
2196ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2197 // Mangle the RTTI name.
2198 SmallString<256> OutName;
2199 llvm::raw_svector_ostream Out(OutName);
2200 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2201 Out.flush();
2202 StringRef Name = OutName.str();
2203
2204 // Look for an existing global.
2205 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2206
2207 if (!GV) {
2208 // Create a new global variable.
2209 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2210 /*Constant=*/true,
2211 llvm::GlobalValue::ExternalLinkage, nullptr,
2212 Name);
David Majnemer1fb1a042014-11-07 07:26:38 +00002213 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2214 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2215 if (RD->hasAttr<DLLImportAttr>())
2216 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2217 }
David Majnemere2cb8d12014-07-07 06:20:47 +00002218 }
2219
2220 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2221}
2222
2223/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2224/// info for that type is defined in the standard library.
2225static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2226 // Itanium C++ ABI 2.9.2:
2227 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2228 // the run-time support library. Specifically, the run-time support
2229 // library should contain type_info objects for the types X, X* and
2230 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2231 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2232 // long, unsigned long, long long, unsigned long long, float, double,
2233 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2234 // half-precision floating point types.
2235 switch (Ty->getKind()) {
2236 case BuiltinType::Void:
2237 case BuiltinType::NullPtr:
2238 case BuiltinType::Bool:
2239 case BuiltinType::WChar_S:
2240 case BuiltinType::WChar_U:
2241 case BuiltinType::Char_U:
2242 case BuiltinType::Char_S:
2243 case BuiltinType::UChar:
2244 case BuiltinType::SChar:
2245 case BuiltinType::Short:
2246 case BuiltinType::UShort:
2247 case BuiltinType::Int:
2248 case BuiltinType::UInt:
2249 case BuiltinType::Long:
2250 case BuiltinType::ULong:
2251 case BuiltinType::LongLong:
2252 case BuiltinType::ULongLong:
2253 case BuiltinType::Half:
2254 case BuiltinType::Float:
2255 case BuiltinType::Double:
2256 case BuiltinType::LongDouble:
2257 case BuiltinType::Char16:
2258 case BuiltinType::Char32:
2259 case BuiltinType::Int128:
2260 case BuiltinType::UInt128:
2261 case BuiltinType::OCLImage1d:
2262 case BuiltinType::OCLImage1dArray:
2263 case BuiltinType::OCLImage1dBuffer:
2264 case BuiltinType::OCLImage2d:
2265 case BuiltinType::OCLImage2dArray:
2266 case BuiltinType::OCLImage3d:
2267 case BuiltinType::OCLSampler:
2268 case BuiltinType::OCLEvent:
2269 return true;
2270
2271 case BuiltinType::Dependent:
2272#define BUILTIN_TYPE(Id, SingletonId)
2273#define PLACEHOLDER_TYPE(Id, SingletonId) \
2274 case BuiltinType::Id:
2275#include "clang/AST/BuiltinTypes.def"
2276 llvm_unreachable("asking for RRTI for a placeholder type!");
2277
2278 case BuiltinType::ObjCId:
2279 case BuiltinType::ObjCClass:
2280 case BuiltinType::ObjCSel:
2281 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2282 }
2283
2284 llvm_unreachable("Invalid BuiltinType Kind!");
2285}
2286
2287static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2288 QualType PointeeTy = PointerTy->getPointeeType();
2289 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2290 if (!BuiltinTy)
2291 return false;
2292
2293 // Check the qualifiers.
2294 Qualifiers Quals = PointeeTy.getQualifiers();
2295 Quals.removeConst();
2296
2297 if (!Quals.empty())
2298 return false;
2299
2300 return TypeInfoIsInStandardLibrary(BuiltinTy);
2301}
2302
2303/// IsStandardLibraryRTTIDescriptor - Returns whether the type
2304/// information for the given type exists in the standard library.
2305static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2306 // Type info for builtin types is defined in the standard library.
2307 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2308 return TypeInfoIsInStandardLibrary(BuiltinTy);
2309
2310 // Type info for some pointer types to builtin types is defined in the
2311 // standard library.
2312 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2313 return TypeInfoIsInStandardLibrary(PointerTy);
2314
2315 return false;
2316}
2317
2318/// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2319/// the given type exists somewhere else, and that we should not emit the type
2320/// information in this translation unit. Assumes that it is not a
2321/// standard-library type.
2322static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2323 QualType Ty) {
2324 ASTContext &Context = CGM.getContext();
2325
2326 // If RTTI is disabled, assume it might be disabled in the
2327 // translation unit that defines any potential key function, too.
2328 if (!Context.getLangOpts().RTTI) return false;
2329
2330 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2331 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2332 if (!RD->hasDefinition())
2333 return false;
2334
2335 if (!RD->isDynamicClass())
2336 return false;
2337
2338 // FIXME: this may need to be reconsidered if the key function
2339 // changes.
David Majnemer1fb1a042014-11-07 07:26:38 +00002340 if (CGM.getVTables().isVTableExternal(RD))
2341 return true;
2342
2343 if (RD->hasAttr<DLLImportAttr>())
2344 return true;
David Majnemere2cb8d12014-07-07 06:20:47 +00002345 }
2346
2347 return false;
2348}
2349
2350/// IsIncompleteClassType - Returns whether the given record type is incomplete.
2351static bool IsIncompleteClassType(const RecordType *RecordTy) {
2352 return !RecordTy->getDecl()->isCompleteDefinition();
2353}
2354
2355/// ContainsIncompleteClassType - Returns whether the given type contains an
2356/// incomplete class type. This is true if
2357///
2358/// * The given type is an incomplete class type.
2359/// * The given type is a pointer type whose pointee type contains an
2360/// incomplete class type.
2361/// * The given type is a member pointer type whose class is an incomplete
2362/// class type.
2363/// * The given type is a member pointer type whoise pointee type contains an
2364/// incomplete class type.
2365/// is an indirect or direct pointer to an incomplete class type.
2366static bool ContainsIncompleteClassType(QualType Ty) {
2367 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2368 if (IsIncompleteClassType(RecordTy))
2369 return true;
2370 }
2371
2372 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2373 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2374
2375 if (const MemberPointerType *MemberPointerTy =
2376 dyn_cast<MemberPointerType>(Ty)) {
2377 // Check if the class type is incomplete.
2378 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2379 if (IsIncompleteClassType(ClassType))
2380 return true;
2381
2382 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2383 }
2384
2385 return false;
2386}
2387
2388// CanUseSingleInheritance - Return whether the given record decl has a "single,
2389// public, non-virtual base at offset zero (i.e. the derived class is dynamic
2390// iff the base is)", according to Itanium C++ ABI, 2.95p6b.
2391static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2392 // Check the number of bases.
2393 if (RD->getNumBases() != 1)
2394 return false;
2395
2396 // Get the base.
2397 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2398
2399 // Check that the base is not virtual.
2400 if (Base->isVirtual())
2401 return false;
2402
2403 // Check that the base is public.
2404 if (Base->getAccessSpecifier() != AS_public)
2405 return false;
2406
2407 // Check that the class is dynamic iff the base is.
2408 const CXXRecordDecl *BaseDecl =
2409 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2410 if (!BaseDecl->isEmpty() &&
2411 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2412 return false;
2413
2414 return true;
2415}
2416
2417void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2418 // abi::__class_type_info.
2419 static const char * const ClassTypeInfo =
2420 "_ZTVN10__cxxabiv117__class_type_infoE";
2421 // abi::__si_class_type_info.
2422 static const char * const SIClassTypeInfo =
2423 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2424 // abi::__vmi_class_type_info.
2425 static const char * const VMIClassTypeInfo =
2426 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2427
2428 const char *VTableName = nullptr;
2429
2430 switch (Ty->getTypeClass()) {
2431#define TYPE(Class, Base)
2432#define ABSTRACT_TYPE(Class, Base)
2433#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2434#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2435#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2436#include "clang/AST/TypeNodes.def"
2437 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2438
2439 case Type::LValueReference:
2440 case Type::RValueReference:
2441 llvm_unreachable("References shouldn't get here");
2442
2443 case Type::Auto:
2444 llvm_unreachable("Undeduced auto type shouldn't get here");
2445
2446 case Type::Builtin:
2447 // GCC treats vector and complex types as fundamental types.
2448 case Type::Vector:
2449 case Type::ExtVector:
2450 case Type::Complex:
2451 case Type::Atomic:
2452 // FIXME: GCC treats block pointers as fundamental types?!
2453 case Type::BlockPointer:
2454 // abi::__fundamental_type_info.
2455 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2456 break;
2457
2458 case Type::ConstantArray:
2459 case Type::IncompleteArray:
2460 case Type::VariableArray:
2461 // abi::__array_type_info.
2462 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2463 break;
2464
2465 case Type::FunctionNoProto:
2466 case Type::FunctionProto:
2467 // abi::__function_type_info.
2468 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2469 break;
2470
2471 case Type::Enum:
2472 // abi::__enum_type_info.
2473 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2474 break;
2475
2476 case Type::Record: {
2477 const CXXRecordDecl *RD =
2478 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2479
2480 if (!RD->hasDefinition() || !RD->getNumBases()) {
2481 VTableName = ClassTypeInfo;
2482 } else if (CanUseSingleInheritance(RD)) {
2483 VTableName = SIClassTypeInfo;
2484 } else {
2485 VTableName = VMIClassTypeInfo;
2486 }
2487
2488 break;
2489 }
2490
2491 case Type::ObjCObject:
2492 // Ignore protocol qualifiers.
2493 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2494
2495 // Handle id and Class.
2496 if (isa<BuiltinType>(Ty)) {
2497 VTableName = ClassTypeInfo;
2498 break;
2499 }
2500
2501 assert(isa<ObjCInterfaceType>(Ty));
2502 // Fall through.
2503
2504 case Type::ObjCInterface:
2505 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2506 VTableName = SIClassTypeInfo;
2507 } else {
2508 VTableName = ClassTypeInfo;
2509 }
2510 break;
2511
2512 case Type::ObjCObjectPointer:
2513 case Type::Pointer:
2514 // abi::__pointer_type_info.
2515 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2516 break;
2517
2518 case Type::MemberPointer:
2519 // abi::__pointer_to_member_type_info.
2520 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2521 break;
2522 }
2523
2524 llvm::Constant *VTable =
2525 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2526
2527 llvm::Type *PtrDiffTy =
2528 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2529
2530 // The vtable address point is 2.
2531 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
2532 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Two);
2533 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2534
2535 Fields.push_back(VTable);
2536}
2537
2538/// \brief Return the linkage that the type info and type info name constants
2539/// should have for the given type.
2540static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2541 QualType Ty) {
2542 // Itanium C++ ABI 2.9.5p7:
2543 // In addition, it and all of the intermediate abi::__pointer_type_info
2544 // structs in the chain down to the abi::__class_type_info for the
2545 // incomplete class type must be prevented from resolving to the
2546 // corresponding type_info structs for the complete class type, possibly
2547 // by making them local static objects. Finally, a dummy class RTTI is
2548 // generated for the incomplete type that will not resolve to the final
2549 // complete class RTTI (because the latter need not exist), possibly by
2550 // making it a local static object.
2551 if (ContainsIncompleteClassType(Ty))
2552 return llvm::GlobalValue::InternalLinkage;
2553
2554 switch (Ty->getLinkage()) {
2555 case NoLinkage:
2556 case InternalLinkage:
2557 case UniqueExternalLinkage:
2558 return llvm::GlobalValue::InternalLinkage;
2559
2560 case VisibleNoLinkage:
2561 case ExternalLinkage:
2562 if (!CGM.getLangOpts().RTTI) {
2563 // RTTI is not enabled, which means that this type info struct is going
2564 // to be used for exception handling. Give it linkonce_odr linkage.
2565 return llvm::GlobalValue::LinkOnceODRLinkage;
2566 }
2567
2568 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2569 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2570 if (RD->hasAttr<WeakAttr>())
2571 return llvm::GlobalValue::WeakODRLinkage;
2572 if (RD->isDynamicClass())
2573 return CGM.getVTableLinkage(RD);
2574 }
2575
2576 return llvm::GlobalValue::LinkOnceODRLinkage;
2577 }
2578
2579 llvm_unreachable("Invalid linkage!");
2580}
2581
2582llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2583 // We want to operate on the canonical type.
2584 Ty = CGM.getContext().getCanonicalType(Ty);
2585
2586 // Check if we've already emitted an RTTI descriptor for this type.
2587 SmallString<256> OutName;
2588 llvm::raw_svector_ostream Out(OutName);
2589 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2590 Out.flush();
2591 StringRef Name = OutName.str();
2592
2593 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2594 if (OldGV && !OldGV->isDeclaration()) {
2595 assert(!OldGV->hasAvailableExternallyLinkage() &&
2596 "available_externally typeinfos not yet implemented");
2597
2598 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2599 }
2600
2601 // Check if there is already an external RTTI descriptor for this type.
2602 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2603 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2604 return GetAddrOfExternalRTTIDescriptor(Ty);
2605
2606 // Emit the standard library with external linkage.
2607 llvm::GlobalVariable::LinkageTypes Linkage;
2608 if (IsStdLib)
2609 Linkage = llvm::GlobalValue::ExternalLinkage;
2610 else
2611 Linkage = getTypeInfoLinkage(CGM, Ty);
2612
2613 // Add the vtable pointer.
2614 BuildVTablePointer(cast<Type>(Ty));
2615
2616 // And the name.
2617 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2618 llvm::Constant *TypeNameField;
2619
2620 // If we're supposed to demote the visibility, be sure to set a flag
2621 // to use a string comparison for type_info comparisons.
2622 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2623 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2624 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2625 // The flag is the sign bit, which on ARM64 is defined to be clear
2626 // for global pointers. This is very ARM64-specific.
2627 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2628 llvm::Constant *flag =
2629 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2630 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2631 TypeNameField =
2632 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2633 } else {
2634 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2635 }
2636 Fields.push_back(TypeNameField);
2637
2638 switch (Ty->getTypeClass()) {
2639#define TYPE(Class, Base)
2640#define ABSTRACT_TYPE(Class, Base)
2641#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2642#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2643#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2644#include "clang/AST/TypeNodes.def"
2645 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2646
2647 // GCC treats vector types as fundamental types.
2648 case Type::Builtin:
2649 case Type::Vector:
2650 case Type::ExtVector:
2651 case Type::Complex:
2652 case Type::BlockPointer:
2653 // Itanium C++ ABI 2.9.5p4:
2654 // abi::__fundamental_type_info adds no data members to std::type_info.
2655 break;
2656
2657 case Type::LValueReference:
2658 case Type::RValueReference:
2659 llvm_unreachable("References shouldn't get here");
2660
2661 case Type::Auto:
2662 llvm_unreachable("Undeduced auto type shouldn't get here");
2663
2664 case Type::ConstantArray:
2665 case Type::IncompleteArray:
2666 case Type::VariableArray:
2667 // Itanium C++ ABI 2.9.5p5:
2668 // abi::__array_type_info adds no data members to std::type_info.
2669 break;
2670
2671 case Type::FunctionNoProto:
2672 case Type::FunctionProto:
2673 // Itanium C++ ABI 2.9.5p5:
2674 // abi::__function_type_info adds no data members to std::type_info.
2675 break;
2676
2677 case Type::Enum:
2678 // Itanium C++ ABI 2.9.5p5:
2679 // abi::__enum_type_info adds no data members to std::type_info.
2680 break;
2681
2682 case Type::Record: {
2683 const CXXRecordDecl *RD =
2684 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2685 if (!RD->hasDefinition() || !RD->getNumBases()) {
2686 // We don't need to emit any fields.
2687 break;
2688 }
2689
2690 if (CanUseSingleInheritance(RD))
2691 BuildSIClassTypeInfo(RD);
2692 else
2693 BuildVMIClassTypeInfo(RD);
2694
2695 break;
2696 }
2697
2698 case Type::ObjCObject:
2699 case Type::ObjCInterface:
2700 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
2701 break;
2702
2703 case Type::ObjCObjectPointer:
2704 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
2705 break;
2706
2707 case Type::Pointer:
2708 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
2709 break;
2710
2711 case Type::MemberPointer:
2712 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
2713 break;
2714
2715 case Type::Atomic:
2716 // No fields, at least for the moment.
2717 break;
2718 }
2719
2720 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2721
Rafael Espindolacb92c192015-01-15 23:18:01 +00002722 llvm::Module &M = CGM.getModule();
David Majnemere2cb8d12014-07-07 06:20:47 +00002723 llvm::GlobalVariable *GV =
Rafael Espindolacb92c192015-01-15 23:18:01 +00002724 new llvm::GlobalVariable(M, Init->getType(),
2725 /*Constant=*/true, Linkage, Init, Name);
2726
2727 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
2728 GV->setComdat(M.getOrInsertComdat(GV->getName()));
David Majnemere2cb8d12014-07-07 06:20:47 +00002729
2730 // If there's already an old global variable, replace it with the new one.
2731 if (OldGV) {
2732 GV->takeName(OldGV);
2733 llvm::Constant *NewPtr =
2734 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
2735 OldGV->replaceAllUsesWith(NewPtr);
2736 OldGV->eraseFromParent();
2737 }
2738
2739 // The Itanium ABI specifies that type_info objects must be globally
2740 // unique, with one exception: if the type is an incomplete class
2741 // type or a (possibly indirect) pointer to one. That exception
2742 // affects the general case of comparing type_info objects produced
2743 // by the typeid operator, which is why the comparison operators on
2744 // std::type_info generally use the type_info name pointers instead
2745 // of the object addresses. However, the language's built-in uses
2746 // of RTTI generally require class types to be complete, even when
2747 // manipulating pointers to those class types. This allows the
2748 // implementation of dynamic_cast to rely on address equality tests,
2749 // which is much faster.
2750
2751 // All of this is to say that it's important that both the type_info
2752 // object and the type_info name be uniqued when weakly emitted.
2753
2754 // Give the type_info object and name the formal visibility of the
2755 // type itself.
2756 llvm::GlobalValue::VisibilityTypes llvmVisibility;
2757 if (llvm::GlobalValue::isLocalLinkage(Linkage))
2758 // If the linkage is local, only default visibility makes sense.
2759 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
2760 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
2761 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
2762 else
2763 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
2764 TypeName->setVisibility(llvmVisibility);
2765 GV->setVisibility(llvmVisibility);
2766
2767 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2768}
2769
2770/// ComputeQualifierFlags - Compute the pointer type info flags from the
2771/// given qualifier.
2772static unsigned ComputeQualifierFlags(Qualifiers Quals) {
2773 unsigned Flags = 0;
2774
2775 if (Quals.hasConst())
2776 Flags |= ItaniumRTTIBuilder::PTI_Const;
2777 if (Quals.hasVolatile())
2778 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
2779 if (Quals.hasRestrict())
2780 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
2781
2782 return Flags;
2783}
2784
2785/// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
2786/// for the given Objective-C object type.
2787void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
2788 // Drop qualifiers.
2789 const Type *T = OT->getBaseType().getTypePtr();
2790 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
2791
2792 // The builtin types are abi::__class_type_infos and don't require
2793 // extra fields.
2794 if (isa<BuiltinType>(T)) return;
2795
2796 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
2797 ObjCInterfaceDecl *Super = Class->getSuperClass();
2798
2799 // Root classes are also __class_type_info.
2800 if (!Super) return;
2801
2802 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
2803
2804 // Everything else is single inheritance.
2805 llvm::Constant *BaseTypeInfo =
2806 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
2807 Fields.push_back(BaseTypeInfo);
2808}
2809
2810/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2811/// inheritance, according to the Itanium C++ ABI, 2.95p6b.
2812void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
2813 // Itanium C++ ABI 2.9.5p6b:
2814 // It adds to abi::__class_type_info a single member pointing to the
2815 // type_info structure for the base type,
2816 llvm::Constant *BaseTypeInfo =
2817 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
2818 Fields.push_back(BaseTypeInfo);
2819}
2820
2821namespace {
2822 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
2823 /// a class hierarchy.
2824 struct SeenBases {
2825 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
2826 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
2827 };
2828}
2829
2830/// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
2831/// abi::__vmi_class_type_info.
2832///
2833static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
2834 SeenBases &Bases) {
2835
2836 unsigned Flags = 0;
2837
2838 const CXXRecordDecl *BaseDecl =
2839 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2840
2841 if (Base->isVirtual()) {
2842 // Mark the virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00002843 if (!Bases.VirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00002844 // If this virtual base has been seen before, then the class is diamond
2845 // shaped.
2846 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
2847 } else {
2848 if (Bases.NonVirtualBases.count(BaseDecl))
2849 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2850 }
2851 } else {
2852 // Mark the non-virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00002853 if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00002854 // If this non-virtual base has been seen before, then the class has non-
2855 // diamond shaped repeated inheritance.
2856 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2857 } else {
2858 if (Bases.VirtualBases.count(BaseDecl))
2859 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2860 }
2861 }
2862
2863 // Walk all bases.
2864 for (const auto &I : BaseDecl->bases())
2865 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2866
2867 return Flags;
2868}
2869
2870static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
2871 unsigned Flags = 0;
2872 SeenBases Bases;
2873
2874 // Walk all bases.
2875 for (const auto &I : RD->bases())
2876 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2877
2878 return Flags;
2879}
2880
2881/// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2882/// classes with bases that do not satisfy the abi::__si_class_type_info
2883/// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2884void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
2885 llvm::Type *UnsignedIntLTy =
2886 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2887
2888 // Itanium C++ ABI 2.9.5p6c:
2889 // __flags is a word with flags describing details about the class
2890 // structure, which may be referenced by using the __flags_masks
2891 // enumeration. These flags refer to both direct and indirect bases.
2892 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
2893 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2894
2895 // Itanium C++ ABI 2.9.5p6c:
2896 // __base_count is a word with the number of direct proper base class
2897 // descriptions that follow.
2898 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
2899
2900 if (!RD->getNumBases())
2901 return;
2902
2903 llvm::Type *LongLTy =
2904 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
2905
2906 // Now add the base class descriptions.
2907
2908 // Itanium C++ ABI 2.9.5p6c:
2909 // __base_info[] is an array of base class descriptions -- one for every
2910 // direct proper base. Each description is of the type:
2911 //
2912 // struct abi::__base_class_type_info {
2913 // public:
2914 // const __class_type_info *__base_type;
2915 // long __offset_flags;
2916 //
2917 // enum __offset_flags_masks {
2918 // __virtual_mask = 0x1,
2919 // __public_mask = 0x2,
2920 // __offset_shift = 8
2921 // };
2922 // };
2923 for (const auto &Base : RD->bases()) {
2924 // The __base_type member points to the RTTI for the base type.
2925 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
2926
2927 const CXXRecordDecl *BaseDecl =
2928 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
2929
2930 int64_t OffsetFlags = 0;
2931
2932 // All but the lower 8 bits of __offset_flags are a signed offset.
2933 // For a non-virtual base, this is the offset in the object of the base
2934 // subobject. For a virtual base, this is the offset in the virtual table of
2935 // the virtual base offset for the virtual base referenced (negative).
2936 CharUnits Offset;
2937 if (Base.isVirtual())
2938 Offset =
2939 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
2940 else {
2941 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
2942 Offset = Layout.getBaseClassOffset(BaseDecl);
2943 };
2944
2945 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
2946
2947 // The low-order byte of __offset_flags contains flags, as given by the
2948 // masks from the enumeration __offset_flags_masks.
2949 if (Base.isVirtual())
2950 OffsetFlags |= BCTI_Virtual;
2951 if (Base.getAccessSpecifier() == AS_public)
2952 OffsetFlags |= BCTI_Public;
2953
2954 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
2955 }
2956}
2957
2958/// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
2959/// used for pointer types.
2960void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
2961 Qualifiers Quals;
2962 QualType UnqualifiedPointeeTy =
2963 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2964
2965 // Itanium C++ ABI 2.9.5p7:
2966 // __flags is a flag word describing the cv-qualification and other
2967 // attributes of the type pointed to
2968 unsigned Flags = ComputeQualifierFlags(Quals);
2969
2970 // Itanium C++ ABI 2.9.5p7:
2971 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
2972 // incomplete class type, the incomplete target type flag is set.
2973 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
2974 Flags |= PTI_Incomplete;
2975
2976 llvm::Type *UnsignedIntLTy =
2977 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2978 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2979
2980 // Itanium C++ ABI 2.9.5p7:
2981 // __pointee is a pointer to the std::type_info derivation for the
2982 // unqualified type being pointed to.
2983 llvm::Constant *PointeeTypeInfo =
2984 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
2985 Fields.push_back(PointeeTypeInfo);
2986}
2987
2988/// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2989/// struct, used for member pointer types.
2990void
2991ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
2992 QualType PointeeTy = Ty->getPointeeType();
2993
2994 Qualifiers Quals;
2995 QualType UnqualifiedPointeeTy =
2996 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2997
2998 // Itanium C++ ABI 2.9.5p7:
2999 // __flags is a flag word describing the cv-qualification and other
3000 // attributes of the type pointed to.
3001 unsigned Flags = ComputeQualifierFlags(Quals);
3002
3003 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
3004
3005 // Itanium C++ ABI 2.9.5p7:
3006 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3007 // incomplete class type, the incomplete target type flag is set.
3008 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3009 Flags |= PTI_Incomplete;
3010
3011 if (IsIncompleteClassType(ClassType))
3012 Flags |= PTI_ContainingClassIncomplete;
3013
3014 llvm::Type *UnsignedIntLTy =
3015 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3016 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3017
3018 // Itanium C++ ABI 2.9.5p7:
3019 // __pointee is a pointer to the std::type_info derivation for the
3020 // unqualified type being pointed to.
3021 llvm::Constant *PointeeTypeInfo =
3022 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3023 Fields.push_back(PointeeTypeInfo);
3024
3025 // Itanium C++ ABI 2.9.5p9:
3026 // __context is a pointer to an abi::__class_type_info corresponding to the
3027 // class type containing the member pointed to
3028 // (e.g., the "A" in "int A::*").
3029 Fields.push_back(
3030 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
3031}
3032
3033llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
3034 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
3035}
3036
3037void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
3038 QualType PointerType = getContext().getPointerType(Type);
3039 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
3040 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
3041 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
3042 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
3043}
3044
3045void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
3046 QualType FundamentalTypes[] = {
3047 getContext().VoidTy, getContext().NullPtrTy,
3048 getContext().BoolTy, getContext().WCharTy,
3049 getContext().CharTy, getContext().UnsignedCharTy,
3050 getContext().SignedCharTy, getContext().ShortTy,
3051 getContext().UnsignedShortTy, getContext().IntTy,
3052 getContext().UnsignedIntTy, getContext().LongTy,
3053 getContext().UnsignedLongTy, getContext().LongLongTy,
3054 getContext().UnsignedLongLongTy, getContext().HalfTy,
3055 getContext().FloatTy, getContext().DoubleTy,
3056 getContext().LongDoubleTy, getContext().Char16Ty,
3057 getContext().Char32Ty,
3058 };
3059 for (const QualType &FundamentalType : FundamentalTypes)
3060 EmitFundamentalRTTIDescriptor(FundamentalType);
3061}
3062
3063/// What sort of uniqueness rules should we use for the RTTI for the
3064/// given type?
3065ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
3066 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
3067 if (shouldRTTIBeUnique())
3068 return RUK_Unique;
3069
3070 // It's only necessary for linkonce_odr or weak_odr linkage.
3071 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
3072 Linkage != llvm::GlobalValue::WeakODRLinkage)
3073 return RUK_Unique;
3074
3075 // It's only necessary with default visibility.
3076 if (CanTy->getVisibility() != DefaultVisibility)
3077 return RUK_Unique;
3078
3079 // If we're not required to publish this symbol, hide it.
3080 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3081 return RUK_NonUniqueHidden;
3082
3083 // If we're required to publish this symbol, as we might be under an
3084 // explicit instantiation, leave it with default visibility but
3085 // enable string-comparisons.
3086 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
3087 return RUK_NonUniqueVisible;
3088}
Rafael Espindola91f68b42014-09-15 19:20:10 +00003089
Rafael Espindola1e4df922014-09-16 15:18:21 +00003090// Find out how to codegen the complete destructor and constructor
3091namespace {
3092enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
3093}
3094static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
3095 const CXXMethodDecl *MD) {
3096 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
3097 return StructorCodegen::Emit;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003098
Rafael Espindola1e4df922014-09-16 15:18:21 +00003099 // The complete and base structors are not equivalent if there are any virtual
3100 // bases, so emit separate functions.
3101 if (MD->getParent()->getNumVBases())
3102 return StructorCodegen::Emit;
3103
3104 GlobalDecl AliasDecl;
3105 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
3106 AliasDecl = GlobalDecl(DD, Dtor_Complete);
3107 } else {
3108 const auto *CD = cast<CXXConstructorDecl>(MD);
3109 AliasDecl = GlobalDecl(CD, Ctor_Complete);
3110 }
3111 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3112
3113 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
3114 return StructorCodegen::RAUW;
3115
3116 // FIXME: Should we allow available_externally aliases?
3117 if (!llvm::GlobalAlias::isValidLinkage(Linkage))
3118 return StructorCodegen::RAUW;
3119
Rafael Espindola0806f982014-09-16 20:19:43 +00003120 if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
3121 // Only ELF supports COMDATs with arbitrary names (C5/D5).
3122 if (CGM.getTarget().getTriple().isOSBinFormatELF())
3123 return StructorCodegen::COMDAT;
3124 return StructorCodegen::Emit;
3125 }
Rafael Espindola1e4df922014-09-16 15:18:21 +00003126
3127 return StructorCodegen::Alias;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003128}
3129
Rafael Espindola1e4df922014-09-16 15:18:21 +00003130static void emitConstructorDestructorAlias(CodeGenModule &CGM,
3131 GlobalDecl AliasDecl,
3132 GlobalDecl TargetDecl) {
3133 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3134
3135 StringRef MangledName = CGM.getMangledName(AliasDecl);
3136 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
3137 if (Entry && !Entry->isDeclaration())
3138 return;
3139
3140 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
3141 llvm::PointerType *AliasType = Aliasee->getType();
3142
3143 // Create the alias with no name.
3144 auto *Alias = llvm::GlobalAlias::create(
3145 AliasType->getElementType(), 0, Linkage, "", Aliasee, &CGM.getModule());
3146
3147 // Switch any previous uses to the alias.
3148 if (Entry) {
3149 assert(Entry->getType() == AliasType &&
3150 "declaration exists with different type");
3151 Alias->takeName(Entry);
3152 Entry->replaceAllUsesWith(Alias);
3153 Entry->eraseFromParent();
3154 } else {
3155 Alias->setName(MangledName);
3156 }
3157
3158 // Finally, set up the alias with its proper name and attributes.
Dario Domiziolic4fb8ca72014-09-19 22:06:24 +00003159 CGM.setAliasAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003160}
3161
3162void ItaniumCXXABI::emitCXXStructor(const CXXMethodDecl *MD,
3163 StructorType Type) {
3164 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
3165 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
3166
3167 StructorCodegen CGType = getCodegenToUse(CGM, MD);
3168
3169 if (Type == StructorType::Complete) {
3170 GlobalDecl CompleteDecl;
3171 GlobalDecl BaseDecl;
3172 if (CD) {
3173 CompleteDecl = GlobalDecl(CD, Ctor_Complete);
3174 BaseDecl = GlobalDecl(CD, Ctor_Base);
3175 } else {
3176 CompleteDecl = GlobalDecl(DD, Dtor_Complete);
3177 BaseDecl = GlobalDecl(DD, Dtor_Base);
3178 }
3179
3180 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
3181 emitConstructorDestructorAlias(CGM, CompleteDecl, BaseDecl);
3182 return;
3183 }
3184
3185 if (CGType == StructorCodegen::RAUW) {
3186 StringRef MangledName = CGM.getMangledName(CompleteDecl);
3187 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(BaseDecl));
3188 CGM.addReplacement(MangledName, Aliasee);
3189 return;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003190 }
3191 }
3192
3193 // The base destructor is equivalent to the base destructor of its
3194 // base class if there is exactly one non-virtual base class with a
3195 // non-trivial destructor, there are no fields with a non-trivial
3196 // destructor, and the body of the destructor is trivial.
Rafael Espindola1e4df922014-09-16 15:18:21 +00003197 if (DD && Type == StructorType::Base && CGType != StructorCodegen::COMDAT &&
3198 !CGM.TryEmitBaseDestructorAsAlias(DD))
Rafael Espindola91f68b42014-09-15 19:20:10 +00003199 return;
3200
Rafael Espindola1e4df922014-09-16 15:18:21 +00003201 llvm::Function *Fn = CGM.codegenCXXStructor(MD, Type);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003202
Rafael Espindola1e4df922014-09-16 15:18:21 +00003203 if (CGType == StructorCodegen::COMDAT) {
3204 SmallString<256> Buffer;
3205 llvm::raw_svector_ostream Out(Buffer);
3206 if (DD)
3207 getMangleContext().mangleCXXDtorComdat(DD, Out);
3208 else
3209 getMangleContext().mangleCXXCtorComdat(CD, Out);
3210 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
3211 Fn->setComdat(C);
Rafael Espindoladbee8a72015-01-15 21:36:08 +00003212 } else {
3213 CGM.maybeSetTrivialComdat(*MD, *Fn);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003214 }
Rafael Espindola91f68b42014-09-15 19:20:10 +00003215}