blob: 8b6322a4b755ed5528f09541271e33e879ea3320 [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"
Reid Klecknerfff8e7f2015-03-03 19:21:04 +000022#include "CGCleanup.h"
John McCall7a9aac22010-08-23 01:21:21 +000023#include "CGRecordLayout.h"
Charles Davisa325a6e2012-06-23 23:44:00 +000024#include "CGVTables.h"
John McCall475999d2010-08-22 00:05:51 +000025#include "CodeGenFunction.h"
Charles Davis4e786dd2010-05-25 19:52:27 +000026#include "CodeGenModule.h"
Reid Klecknerfff8e7f2015-03-03 19:21:04 +000027#include "TargetInfo.h"
Craig Topperc9ee1d02012-09-15 18:47:51 +000028#include "clang/AST/Mangle.h"
29#include "clang/AST/Type.h"
Reid Klecknerfff8e7f2015-03-03 19:21:04 +000030#include "clang/AST/StmtCXX.h"
David Majnemer1162d252014-06-22 19:05:33 +000031#include "llvm/IR/CallSite.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000032#include "llvm/IR/DataLayout.h"
Reid Klecknerfff8e7f2015-03-03 19:21:04 +000033#include "llvm/IR/Instructions.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000034#include "llvm/IR/Intrinsics.h"
35#include "llvm/IR/Value.h"
Charles Davis4e786dd2010-05-25 19:52:27 +000036
37using namespace clang;
John McCall475999d2010-08-22 00:05:51 +000038using namespace CodeGen;
Charles Davis4e786dd2010-05-25 19:52:27 +000039
40namespace {
Charles Davis53c59df2010-08-16 03:33:14 +000041class ItaniumCXXABI : public CodeGen::CGCXXABI {
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +000042 /// VTables - All the vtables which have been defined.
43 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
44
John McCall475999d2010-08-22 00:05:51 +000045protected:
Mark Seabornedf0d382013-07-24 16:25:13 +000046 bool UseARMMethodPtrABI;
47 bool UseARMGuardVarABI;
John McCall7a9aac22010-08-23 01:21:21 +000048
Timur Iskhodzhanov67455222013-10-03 06:26:13 +000049 ItaniumMangleContext &getMangleContext() {
50 return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext());
51 }
52
Charles Davis4e786dd2010-05-25 19:52:27 +000053public:
Mark Seabornedf0d382013-07-24 16:25:13 +000054 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
55 bool UseARMMethodPtrABI = false,
56 bool UseARMGuardVarABI = false) :
57 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
58 UseARMGuardVarABI(UseARMGuardVarABI) { }
John McCall475999d2010-08-22 00:05:51 +000059
Reid Kleckner40ca9132014-05-13 22:05:45 +000060 bool classifyReturnType(CGFunctionInfo &FI) const override;
Timur Iskhodzhanov8fe501d2013-04-17 12:54:10 +000061
Craig Topper4f12f102014-03-12 06:41:41 +000062 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
Reid Klecknerd355ca72014-05-15 01:26:32 +000063 // Structures with either a non-trivial destructor or a non-trivial
64 // copy constructor are always indirect.
65 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
66 // special members.
67 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor())
Timur Iskhodzhanov8fe501d2013-04-17 12:54:10 +000068 return RAA_Indirect;
69 return RAA_Default;
70 }
71
John McCall7f416cc2015-09-08 08:05:57 +000072 bool isThisCompleteObject(GlobalDecl GD) const override {
73 // The Itanium ABI has separate complete-object vs. base-object
74 // variants of both constructors and destructors.
75 if (isa<CXXDestructorDecl>(GD.getDecl())) {
76 switch (GD.getDtorType()) {
77 case Dtor_Complete:
78 case Dtor_Deleting:
79 return true;
80
81 case Dtor_Base:
82 return false;
83
84 case Dtor_Comdat:
85 llvm_unreachable("emitting dtor comdat as function?");
86 }
87 llvm_unreachable("bad dtor kind");
88 }
89 if (isa<CXXConstructorDecl>(GD.getDecl())) {
90 switch (GD.getCtorType()) {
91 case Ctor_Complete:
92 return true;
93
94 case Ctor_Base:
95 return false;
96
97 case Ctor_CopyingClosure:
98 case Ctor_DefaultClosure:
99 llvm_unreachable("closure ctors in Itanium ABI?");
100
101 case Ctor_Comdat:
102 llvm_unreachable("emitting ctor comdat as function?");
103 }
104 llvm_unreachable("bad dtor kind");
105 }
106
107 // No other kinds.
108 return false;
109 }
110
Craig Topper4f12f102014-03-12 06:41:41 +0000111 bool isZeroInitializable(const MemberPointerType *MPT) override;
John McCall84fa5102010-08-22 04:16:24 +0000112
Craig Topper4f12f102014-03-12 06:41:41 +0000113 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
John McCall7a9aac22010-08-23 01:21:21 +0000114
Craig Topper4f12f102014-03-12 06:41:41 +0000115 llvm::Value *
116 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
117 const Expr *E,
John McCall7f416cc2015-09-08 08:05:57 +0000118 Address This,
119 llvm::Value *&ThisPtrForCall,
Craig Topper4f12f102014-03-12 06:41:41 +0000120 llvm::Value *MemFnPtr,
121 const MemberPointerType *MPT) override;
John McCalla8bbb822010-08-22 03:04:22 +0000122
Craig Topper4f12f102014-03-12 06:41:41 +0000123 llvm::Value *
124 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
John McCall7f416cc2015-09-08 08:05:57 +0000125 Address Base,
Craig Topper4f12f102014-03-12 06:41:41 +0000126 llvm::Value *MemPtr,
127 const MemberPointerType *MPT) override;
John McCallc134eb52010-08-31 21:07:20 +0000128
John McCall7a9aac22010-08-23 01:21:21 +0000129 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
130 const CastExpr *E,
Craig Topper4f12f102014-03-12 06:41:41 +0000131 llvm::Value *Src) override;
John McCallc62bb392012-02-15 01:22:51 +0000132 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
Craig Topper4f12f102014-03-12 06:41:41 +0000133 llvm::Constant *Src) override;
John McCall84fa5102010-08-22 04:16:24 +0000134
Craig Topper4f12f102014-03-12 06:41:41 +0000135 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
John McCall84fa5102010-08-22 04:16:24 +0000136
David Majnemere2be95b2015-06-23 07:31:01 +0000137 llvm::Constant *EmitMemberFunctionPointer(const CXXMethodDecl *MD) override;
John McCallf3a88602011-02-03 08:15:49 +0000138 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
Craig Topper4f12f102014-03-12 06:41:41 +0000139 CharUnits offset) override;
140 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
Richard Smithdafff942012-01-14 04:30:29 +0000141 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
142 CharUnits ThisAdjustment);
John McCall1c456c82010-08-22 06:43:33 +0000143
John McCall7a9aac22010-08-23 01:21:21 +0000144 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
Craig Topper4f12f102014-03-12 06:41:41 +0000145 llvm::Value *L, llvm::Value *R,
John McCall7a9aac22010-08-23 01:21:21 +0000146 const MemberPointerType *MPT,
Craig Topper4f12f102014-03-12 06:41:41 +0000147 bool Inequality) override;
John McCall131d97d2010-08-22 08:30:07 +0000148
John McCall7a9aac22010-08-23 01:21:21 +0000149 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
Craig Topper4f12f102014-03-12 06:41:41 +0000150 llvm::Value *Addr,
151 const MemberPointerType *MPT) override;
John McCall5d865c322010-08-31 07:33:07 +0000152
David Majnemer08681372014-11-01 07:37:17 +0000153 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
John McCall7f416cc2015-09-08 08:05:57 +0000154 Address Ptr, QualType ElementType,
David Majnemer0c0b6d92014-10-31 20:09:12 +0000155 const CXXDestructorDecl *Dtor) override;
John McCall82fb8922012-09-25 10:10:39 +0000156
John McCall7f416cc2015-09-08 08:05:57 +0000157 /// Itanium says that an _Unwind_Exception has to be "double-word"
158 /// aligned (and thus the end of it is also so-aligned), meaning 16
159 /// bytes. Of course, that was written for the actual Itanium,
160 /// which is a 64-bit platform. Classically, the ABI doesn't really
161 /// specify the alignment on other platforms, but in practice
162 /// libUnwind declares the struct with __attribute__((aligned)), so
163 /// we assume that alignment here. (It's generally 16 bytes, but
164 /// some targets overwrite it.)
165 CharUnits getAlignmentOfExnObject() {
166 auto align = CGM.getContext().getTargetDefaultAlignForAttributeAligned();
167 return CGM.getContext().toCharUnitsFromBits(align);
168 }
169
David Majnemer442d0a22014-11-25 07:20:20 +0000170 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
David Majnemer7c237072015-03-05 00:46:22 +0000171 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
David Majnemer442d0a22014-11-25 07:20:20 +0000172
Reid Klecknerfff8e7f2015-03-03 19:21:04 +0000173 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
174
175 llvm::CallInst *
176 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
177 llvm::Value *Exn) override;
178
David Majnemere2cb8d12014-07-07 06:20:47 +0000179 void EmitFundamentalRTTIDescriptor(QualType Type);
180 void EmitFundamentalRTTIDescriptors();
David Majnemer443250f2015-03-17 20:35:00 +0000181 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
Reid Kleckner10aa7702015-09-16 20:15:55 +0000182 CatchTypeInfo
David Majnemer37b417f2015-03-29 21:55:10 +0000183 getAddrOfCXXCatchHandlerType(QualType Ty,
184 QualType CatchHandlerType) override {
Reid Kleckner10aa7702015-09-16 20:15:55 +0000185 return CatchTypeInfo{getAddrOfRTTIDescriptor(Ty), 0};
David Majnemer443250f2015-03-17 20:35:00 +0000186 }
David Majnemere2cb8d12014-07-07 06:20:47 +0000187
David Majnemer1162d252014-06-22 19:05:33 +0000188 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
189 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
190 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
John McCall7f416cc2015-09-08 08:05:57 +0000191 Address ThisPtr,
David Majnemer1162d252014-06-22 19:05:33 +0000192 llvm::Type *StdTypeInfoPtrTy) override;
193
194 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
195 QualType SrcRecordTy) override;
196
John McCall7f416cc2015-09-08 08:05:57 +0000197 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, Address Value,
David Majnemer1162d252014-06-22 19:05:33 +0000198 QualType SrcRecordTy, QualType DestTy,
199 QualType DestRecordTy,
200 llvm::BasicBlock *CastEnd) override;
201
John McCall7f416cc2015-09-08 08:05:57 +0000202 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
David Majnemer1162d252014-06-22 19:05:33 +0000203 QualType SrcRecordTy,
204 QualType DestTy) override;
205
206 bool EmitBadCastCall(CodeGenFunction &CGF) override;
207
Craig Topper4f12f102014-03-12 06:41:41 +0000208 llvm::Value *
John McCall7f416cc2015-09-08 08:05:57 +0000209 GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
Craig Topper4f12f102014-03-12 06:41:41 +0000210 const CXXRecordDecl *ClassDecl,
211 const CXXRecordDecl *BaseClassDecl) override;
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000212
Craig Topper4f12f102014-03-12 06:41:41 +0000213 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +0000214
Rafael Espindola8d2a19b2014-09-08 16:01:27 +0000215 void buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
216 SmallVectorImpl<CanQualType> &ArgTys) override;
John McCall5d865c322010-08-31 07:33:07 +0000217
Reid Klecknere7de47e2013-07-22 13:51:44 +0000218 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
Craig Topper4f12f102014-03-12 06:41:41 +0000219 CXXDtorType DT) const override {
Reid Klecknere7de47e2013-07-22 13:51:44 +0000220 // Itanium does not emit any destructor variant as an inline thunk.
221 // Delegating may occur as an optimization, but all variants are either
222 // emitted with external linkage or as linkonce if they are inline and used.
223 return false;
224 }
225
Craig Topper4f12f102014-03-12 06:41:41 +0000226 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
Reid Klecknere7de47e2013-07-22 13:51:44 +0000227
Reid Kleckner89077a12013-12-17 19:46:40 +0000228 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
Craig Topper4f12f102014-03-12 06:41:41 +0000229 FunctionArgList &Params) override;
John McCall5d865c322010-08-31 07:33:07 +0000230
Craig Topper4f12f102014-03-12 06:41:41 +0000231 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
John McCall8ed55a52010-09-02 09:58:18 +0000232
Reid Kleckner89077a12013-12-17 19:46:40 +0000233 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
234 const CXXConstructorDecl *D,
235 CXXCtorType Type, bool ForVirtualBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000236 bool Delegating,
237 CallArgList &Args) override;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000238
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000239 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
240 CXXDtorType Type, bool ForVirtualBase,
John McCall7f416cc2015-09-08 08:05:57 +0000241 bool Delegating, Address This) override;
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000242
Craig Topper4f12f102014-03-12 06:41:41 +0000243 void emitVTableDefinitions(CodeGenVTables &CGVT,
244 const CXXRecordDecl *RD) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000245
Piotr Padlewskid679d7e2015-09-15 00:37:06 +0000246 bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
247 CodeGenFunction::VPtr Vptr) override;
248
249 bool doStructorsInitializeVPtrs(const CXXRecordDecl *VTableClass) override {
250 return true;
251 }
252
253 llvm::Constant *
254 getVTableAddressPoint(BaseSubobject Base,
255 const CXXRecordDecl *VTableClass) override;
256
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000257 llvm::Value *getVTableAddressPointInStructor(
258 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
Piotr Padlewskid679d7e2015-09-15 00:37:06 +0000259 BaseSubobject Base, const CXXRecordDecl *NearestVBase) override;
260
261 llvm::Value *getVTableAddressPointInStructorWithVTT(
262 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
263 BaseSubobject Base, const CXXRecordDecl *NearestVBase);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000264
265 llvm::Constant *
266 getVTableAddressPointForConstExpr(BaseSubobject Base,
Craig Topper4f12f102014-03-12 06:41:41 +0000267 const CXXRecordDecl *VTableClass) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000268
269 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
Craig Topper4f12f102014-03-12 06:41:41 +0000270 CharUnits VPtrOffset) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000271
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000272 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
John McCall7f416cc2015-09-08 08:05:57 +0000273 Address This, llvm::Type *Ty,
Peter Collingbourne6708c4a2015-06-19 01:51:54 +0000274 SourceLocation Loc) override;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000275
David Majnemer0c0b6d92014-10-31 20:09:12 +0000276 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
277 const CXXDestructorDecl *Dtor,
278 CXXDtorType DtorType,
John McCall7f416cc2015-09-08 08:05:57 +0000279 Address This,
David Majnemer0c0b6d92014-10-31 20:09:12 +0000280 const CXXMemberCallExpr *CE) override;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +0000281
Craig Topper4f12f102014-03-12 06:41:41 +0000282 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
Reid Kleckner7810af02013-06-19 15:20:38 +0000283
Piotr Padlewskid679d7e2015-09-15 00:37:06 +0000284 bool canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const override;
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000285
Hans Wennborgc94391d2014-06-06 20:04:01 +0000286 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
287 bool ReturnAdjustment) override {
Timur Iskhodzhanovad9d3b82013-10-09 09:23:58 +0000288 // Allow inlining of thunks by emitting them with available_externally
289 // linkage together with vtables when needed.
Peter Collingbourne8fabc1b2015-07-01 02:10:26 +0000290 if (ForVTable && !Thunk->hasLocalLinkage())
Timur Iskhodzhanovad9d3b82013-10-09 09:23:58 +0000291 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
292 }
293
John McCall7f416cc2015-09-08 08:05:57 +0000294 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
Craig Topper4f12f102014-03-12 06:41:41 +0000295 const ThisAdjustment &TA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000296
John McCall7f416cc2015-09-08 08:05:57 +0000297 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
Craig Topper4f12f102014-03-12 06:41:41 +0000298 const ReturnAdjustment &RA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000299
David Majnemer196ac332014-09-11 23:05:02 +0000300 size_t getSrcArgforCopyCtor(const CXXConstructorDecl *,
301 FunctionArgList &Args) const override {
302 assert(!Args.empty() && "expected the arglist to not be empty!");
303 return Args.size() - 1;
304 }
305
Craig Topper4f12f102014-03-12 06:41:41 +0000306 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
307 StringRef GetDeletedVirtualCallName() override
308 { return "__cxa_deleted_virtual"; }
Joao Matos2ce88ef2012-07-17 17:10:11 +0000309
Craig Topper4f12f102014-03-12 06:41:41 +0000310 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
John McCall7f416cc2015-09-08 08:05:57 +0000311 Address InitializeArrayCookie(CodeGenFunction &CGF,
312 Address NewPtr,
313 llvm::Value *NumElements,
314 const CXXNewExpr *expr,
315 QualType ElementType) override;
John McCallb91cd662012-05-01 05:23:51 +0000316 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +0000317 Address allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000318 CharUnits cookieSize) override;
John McCall68ff0372010-09-08 01:44:27 +0000319
John McCallcdf7ef52010-11-06 09:44:32 +0000320 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
Craig Topper4f12f102014-03-12 06:41:41 +0000321 llvm::GlobalVariable *DeclPtr,
322 bool PerformInit) override;
Richard Smithdbf74ba2013-04-14 23:01:42 +0000323 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
Craig Topper4f12f102014-03-12 06:41:41 +0000324 llvm::Constant *dtor, llvm::Constant *addr) override;
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000325
326 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
Alexander Musmanf94c3182014-09-26 06:28:25 +0000327 llvm::Value *Val);
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000328 void EmitThreadLocalInitFuncs(
David Majnemerb3341ea2014-10-05 05:05:40 +0000329 CodeGenModule &CGM,
Richard Smith5a99c492015-12-01 01:10:48 +0000330 ArrayRef<const VarDecl *> CXXThreadLocals,
David Majnemerb3341ea2014-10-05 05:05:40 +0000331 ArrayRef<llvm::Function *> CXXThreadLocalInits,
Richard Smith5a99c492015-12-01 01:10:48 +0000332 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) override;
David Majnemerb3341ea2014-10-05 05:05:40 +0000333
334 bool usesThreadWrapperFunction() const override { return true; }
Richard Smith0f383742014-03-26 22:48:22 +0000335 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
336 QualType LValType) override;
Peter Collingbourne66f82e62013-06-28 20:45:28 +0000337
Craig Topper4f12f102014-03-12 06:41:41 +0000338 bool NeedsVTTParameter(GlobalDecl GD) override;
David Majnemere2cb8d12014-07-07 06:20:47 +0000339
340 /**************************** RTTI Uniqueness ******************************/
341
342protected:
343 /// Returns true if the ABI requires RTTI type_info objects to be unique
344 /// across a program.
345 virtual bool shouldRTTIBeUnique() const { return true; }
346
347public:
348 /// What sort of unique-RTTI behavior should we use?
349 enum RTTIUniquenessKind {
350 /// We are guaranteeing, or need to guarantee, that the RTTI string
351 /// is unique.
352 RUK_Unique,
353
354 /// We are not guaranteeing uniqueness for the RTTI string, so we
355 /// can demote to hidden visibility but must use string comparisons.
356 RUK_NonUniqueHidden,
357
358 /// We are not guaranteeing uniqueness for the RTTI string, so we
359 /// have to use string comparisons, but we also have to emit it with
360 /// non-hidden visibility.
361 RUK_NonUniqueVisible
362 };
363
364 /// Return the required visibility status for the given type and linkage in
365 /// the current ABI.
366 RTTIUniquenessKind
367 classifyRTTIUniqueness(QualType CanTy,
368 llvm::GlobalValue::LinkageTypes Linkage) const;
369 friend class ItaniumRTTIBuilder;
Rafael Espindola91f68b42014-09-15 19:20:10 +0000370
371 void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override;
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000372
373 private:
Piotr Padlewski1d02f682015-08-19 20:09:09 +0000374 bool hasAnyUsedVirtualInlineFunction(const CXXRecordDecl *RD) const {
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000375 const auto &VtableLayout =
376 CGM.getItaniumVTableContext().getVTableLayout(RD);
377
378 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
Piotr Padlewski1d02f682015-08-19 20:09:09 +0000379 if (!VtableComponent.isUsedFunctionPointerKind())
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000380 continue;
381
Piotr Padlewski1d02f682015-08-19 20:09:09 +0000382 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000383 if (Method->getCanonicalDecl()->isInlined())
384 return true;
385 }
386 return false;
387 }
Piotr Padlewskid679d7e2015-09-15 00:37:06 +0000388
389 bool isVTableHidden(const CXXRecordDecl *RD) const {
390 const auto &VtableLayout =
391 CGM.getItaniumVTableContext().getVTableLayout(RD);
392
393 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
394 if (VtableComponent.isRTTIKind()) {
395 const CXXRecordDecl *RTTIDecl = VtableComponent.getRTTIDecl();
396 if (RTTIDecl->getVisibility() == Visibility::HiddenVisibility)
397 return true;
398 } else if (VtableComponent.isUsedFunctionPointerKind()) {
399 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
400 if (Method->getVisibility() == Visibility::HiddenVisibility &&
401 !Method->isDefined())
402 return true;
403 }
404 }
405 return false;
406 }
Charles Davis4e786dd2010-05-25 19:52:27 +0000407};
John McCall86353412010-08-21 22:46:04 +0000408
409class ARMCXXABI : public ItaniumCXXABI {
410public:
Mark Seabornedf0d382013-07-24 16:25:13 +0000411 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
412 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
413 /* UseARMGuardVarABI = */ true) {}
John McCall5d865c322010-08-31 07:33:07 +0000414
Craig Topper4f12f102014-03-12 06:41:41 +0000415 bool HasThisReturn(GlobalDecl GD) const override {
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000416 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
417 isa<CXXDestructorDecl>(GD.getDecl()) &&
418 GD.getDtorType() != Dtor_Deleting));
419 }
John McCall5d865c322010-08-31 07:33:07 +0000420
Craig Topper4f12f102014-03-12 06:41:41 +0000421 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
422 QualType ResTy) override;
John McCall5d865c322010-08-31 07:33:07 +0000423
Craig Topper4f12f102014-03-12 06:41:41 +0000424 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
John McCall7f416cc2015-09-08 08:05:57 +0000425 Address InitializeArrayCookie(CodeGenFunction &CGF,
426 Address NewPtr,
427 llvm::Value *NumElements,
428 const CXXNewExpr *expr,
429 QualType ElementType) override;
430 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000431 CharUnits cookieSize) override;
John McCall86353412010-08-21 22:46:04 +0000432};
Tim Northovera2ee4332014-03-29 15:09:45 +0000433
434class iOS64CXXABI : public ARMCXXABI {
435public:
436 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
Tim Northover65f582f2014-03-30 17:32:48 +0000437
438 // ARM64 libraries are prepared for non-unique RTTI.
David Majnemere2cb8d12014-07-07 06:20:47 +0000439 bool shouldRTTIBeUnique() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +0000440};
Dan Gohmanc2853072015-09-03 22:51:53 +0000441
442class WebAssemblyCXXABI final : public ItaniumCXXABI {
443public:
444 explicit WebAssemblyCXXABI(CodeGen::CodeGenModule &CGM)
445 : ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
446 /*UseARMGuardVarABI=*/true) {}
447
448private:
449 bool HasThisReturn(GlobalDecl GD) const override {
450 return isa<CXXConstructorDecl>(GD.getDecl()) ||
451 (isa<CXXDestructorDecl>(GD.getDecl()) &&
452 GD.getDtorType() != Dtor_Deleting);
453 }
454};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000455}
Charles Davis4e786dd2010-05-25 19:52:27 +0000456
Charles Davis53c59df2010-08-16 03:33:14 +0000457CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
John McCallc8e01702013-04-16 22:48:15 +0000458 switch (CGM.getTarget().getCXXABI().getKind()) {
John McCall57625922013-01-25 23:36:14 +0000459 // For IR-generation purposes, there's no significant difference
460 // between the ARM and iOS ABIs.
461 case TargetCXXABI::GenericARM:
462 case TargetCXXABI::iOS:
Tim Northover756447a2015-10-30 16:30:36 +0000463 case TargetCXXABI::WatchOS:
John McCall57625922013-01-25 23:36:14 +0000464 return new ARMCXXABI(CGM);
Charles Davis4e786dd2010-05-25 19:52:27 +0000465
Tim Northovera2ee4332014-03-29 15:09:45 +0000466 case TargetCXXABI::iOS64:
467 return new iOS64CXXABI(CGM);
468
Tim Northover9bb857a2013-01-31 12:13:10 +0000469 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
470 // include the other 32-bit ARM oddities: constructor/destructor return values
471 // and array cookies.
472 case TargetCXXABI::GenericAArch64:
Mark Seabornedf0d382013-07-24 16:25:13 +0000473 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
474 /* UseARMGuardVarABI = */ true);
Tim Northover9bb857a2013-01-31 12:13:10 +0000475
Zoran Jovanovic26a12162015-02-18 15:21:35 +0000476 case TargetCXXABI::GenericMIPS:
477 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true);
478
Dan Gohmanc2853072015-09-03 22:51:53 +0000479 case TargetCXXABI::WebAssembly:
480 return new WebAssemblyCXXABI(CGM);
481
John McCall57625922013-01-25 23:36:14 +0000482 case TargetCXXABI::GenericItanium:
Mark Seabornedf0d382013-07-24 16:25:13 +0000483 if (CGM.getContext().getTargetInfo().getTriple().getArch()
484 == llvm::Triple::le32) {
485 // For PNaCl, use ARM-style method pointers so that PNaCl code
486 // does not assume anything about the alignment of function
487 // pointers.
488 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
489 /* UseARMGuardVarABI = */ false);
490 }
John McCall57625922013-01-25 23:36:14 +0000491 return new ItaniumCXXABI(CGM);
492
493 case TargetCXXABI::Microsoft:
494 llvm_unreachable("Microsoft ABI is not Itanium-based");
495 }
496 llvm_unreachable("bad ABI kind");
John McCall86353412010-08-21 22:46:04 +0000497}
498
Chris Lattnera5f58b02011-07-09 17:41:47 +0000499llvm::Type *
John McCall7a9aac22010-08-23 01:21:21 +0000500ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
501 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000502 return CGM.PtrDiffTy;
Reid Kleckneree7cf842014-12-01 22:02:27 +0000503 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, nullptr);
John McCall1c456c82010-08-22 06:43:33 +0000504}
505
John McCalld9c6c0b2010-08-22 00:59:17 +0000506/// In the Itanium and ARM ABIs, method pointers have the form:
507/// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
508///
509/// In the Itanium ABI:
510/// - method pointers are virtual if (memptr.ptr & 1) is nonzero
511/// - the this-adjustment is (memptr.adj)
512/// - the virtual offset is (memptr.ptr - 1)
513///
514/// In the ARM ABI:
515/// - method pointers are virtual if (memptr.adj & 1) is nonzero
516/// - the this-adjustment is (memptr.adj >> 1)
517/// - the virtual offset is (memptr.ptr)
518/// ARM uses 'adj' for the virtual flag because Thumb functions
519/// may be only single-byte aligned.
520///
521/// If the member is virtual, the adjusted 'this' pointer points
522/// to a vtable pointer from which the virtual offset is applied.
523///
524/// If the member is non-virtual, memptr.ptr is the address of
525/// the function to call.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000526llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
John McCall7f416cc2015-09-08 08:05:57 +0000527 CodeGenFunction &CGF, const Expr *E, Address ThisAddr,
528 llvm::Value *&ThisPtrForCall,
David Majnemer2b0d66d2014-02-20 23:22:07 +0000529 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
John McCall475999d2010-08-22 00:05:51 +0000530 CGBuilderTy &Builder = CGF.Builder;
531
532 const FunctionProtoType *FPT =
533 MPT->getPointeeType()->getAs<FunctionProtoType>();
534 const CXXRecordDecl *RD =
535 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
536
George Burgess IV3e3bb95b2015-12-02 21:58:08 +0000537 llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(
538 CGM.getTypes().arrangeCXXMethodType(RD, FPT, /*FD=*/nullptr));
John McCall475999d2010-08-22 00:05:51 +0000539
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000540 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
John McCall475999d2010-08-22 00:05:51 +0000541
John McCalld9c6c0b2010-08-22 00:59:17 +0000542 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
543 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
544 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
545
John McCalla1dee5302010-08-22 10:59:02 +0000546 // Extract memptr.adj, which is in the second field.
547 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
John McCalld9c6c0b2010-08-22 00:59:17 +0000548
549 // Compute the true adjustment.
550 llvm::Value *Adj = RawAdj;
Mark Seabornedf0d382013-07-24 16:25:13 +0000551 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000552 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
John McCall475999d2010-08-22 00:05:51 +0000553
554 // Apply the adjustment and cast back to the original struct type
555 // for consistency.
John McCall7f416cc2015-09-08 08:05:57 +0000556 llvm::Value *This = ThisAddr.getPointer();
John McCalld9c6c0b2010-08-22 00:59:17 +0000557 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
558 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
559 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
John McCall7f416cc2015-09-08 08:05:57 +0000560 ThisPtrForCall = This;
John McCall475999d2010-08-22 00:05:51 +0000561
562 // Load the function pointer.
John McCalla1dee5302010-08-22 10:59:02 +0000563 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
John McCall475999d2010-08-22 00:05:51 +0000564
565 // If the LSB in the function pointer is 1, the function pointer points to
566 // a virtual function.
John McCalld9c6c0b2010-08-22 00:59:17 +0000567 llvm::Value *IsVirtual;
Mark Seabornedf0d382013-07-24 16:25:13 +0000568 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000569 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
570 else
571 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
572 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
John McCall475999d2010-08-22 00:05:51 +0000573 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
574
575 // In the virtual path, the adjustment left 'This' pointing to the
576 // vtable of the correct base subobject. The "function pointer" is an
John McCalld9c6c0b2010-08-22 00:59:17 +0000577 // offset within the vtable (+1 for the virtual flag on non-ARM).
John McCall475999d2010-08-22 00:05:51 +0000578 CGF.EmitBlock(FnVirtual);
579
580 // Cast the adjusted this to a pointer to vtable pointer and load.
Chris Lattner2192fe52011-07-18 04:24:23 +0000581 llvm::Type *VTableTy = Builder.getInt8PtrTy();
John McCall7f416cc2015-09-08 08:05:57 +0000582 CharUnits VTablePtrAlign =
583 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD,
584 CGF.getPointerAlign());
585 llvm::Value *VTable =
Piotr Padlewski4b1ac722015-09-15 21:46:55 +0000586 CGF.GetVTablePtr(Address(This, VTablePtrAlign), VTableTy, RD);
John McCall475999d2010-08-22 00:05:51 +0000587
588 // Apply the offset.
John McCalld9c6c0b2010-08-22 00:59:17 +0000589 llvm::Value *VTableOffset = FnAsInt;
Mark Seabornedf0d382013-07-24 16:25:13 +0000590 if (!UseARMMethodPtrABI)
591 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
John McCalld9c6c0b2010-08-22 00:59:17 +0000592 VTable = Builder.CreateGEP(VTable, VTableOffset);
John McCall475999d2010-08-22 00:05:51 +0000593
594 // Load the virtual function to call.
595 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
John McCall7f416cc2015-09-08 08:05:57 +0000596 llvm::Value *VirtualFn =
597 Builder.CreateAlignedLoad(VTable, CGF.getPointerAlign(),
598 "memptr.virtualfn");
John McCall475999d2010-08-22 00:05:51 +0000599 CGF.EmitBranch(FnEnd);
600
601 // In the non-virtual path, the function pointer is actually a
602 // function pointer.
603 CGF.EmitBlock(FnNonVirtual);
604 llvm::Value *NonVirtualFn =
John McCalld9c6c0b2010-08-22 00:59:17 +0000605 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
John McCall475999d2010-08-22 00:05:51 +0000606
607 // We're done.
608 CGF.EmitBlock(FnEnd);
Jay Foad20c0f022011-03-30 11:28:58 +0000609 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
John McCall475999d2010-08-22 00:05:51 +0000610 Callee->addIncoming(VirtualFn, FnVirtual);
611 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
612 return Callee;
613}
John McCalla8bbb822010-08-22 03:04:22 +0000614
John McCallc134eb52010-08-31 21:07:20 +0000615/// Compute an l-value by applying the given pointer-to-member to a
616/// base object.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000617llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
John McCall7f416cc2015-09-08 08:05:57 +0000618 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
David Majnemer2b0d66d2014-02-20 23:22:07 +0000619 const MemberPointerType *MPT) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000620 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCallc134eb52010-08-31 21:07:20 +0000621
622 CGBuilderTy &Builder = CGF.Builder;
623
John McCallc134eb52010-08-31 21:07:20 +0000624 // Cast to char*.
John McCall7f416cc2015-09-08 08:05:57 +0000625 Base = Builder.CreateElementBitCast(Base, CGF.Int8Ty);
John McCallc134eb52010-08-31 21:07:20 +0000626
627 // Apply the offset, which we assume is non-null.
John McCall7f416cc2015-09-08 08:05:57 +0000628 llvm::Value *Addr =
629 Builder.CreateInBoundsGEP(Base.getPointer(), MemPtr, "memptr.offset");
John McCallc134eb52010-08-31 21:07:20 +0000630
631 // Cast the address to the appropriate pointer type, adopting the
632 // address space of the base pointer.
John McCall7f416cc2015-09-08 08:05:57 +0000633 llvm::Type *PType = CGF.ConvertTypeForMem(MPT->getPointeeType())
634 ->getPointerTo(Base.getAddressSpace());
John McCallc134eb52010-08-31 21:07:20 +0000635 return Builder.CreateBitCast(Addr, PType);
636}
637
John McCallc62bb392012-02-15 01:22:51 +0000638/// Perform a bitcast, derived-to-base, or base-to-derived member pointer
639/// conversion.
640///
641/// Bitcast conversions are always a no-op under Itanium.
John McCall7a9aac22010-08-23 01:21:21 +0000642///
643/// Obligatory offset/adjustment diagram:
644/// <-- offset --> <-- adjustment -->
645/// |--------------------------|----------------------|--------------------|
646/// ^Derived address point ^Base address point ^Member address point
647///
648/// So when converting a base member pointer to a derived member pointer,
649/// we add the offset to the adjustment because the address point has
650/// decreased; and conversely, when converting a derived MP to a base MP
651/// we subtract the offset from the adjustment because the address point
652/// has increased.
653///
654/// The standard forbids (at compile time) conversion to and from
655/// virtual bases, which is why we don't have to consider them here.
656///
657/// The standard forbids (at run time) casting a derived MP to a base
658/// MP when the derived MP does not point to a member of the base.
659/// This is why -1 is a reasonable choice for null data member
660/// pointers.
John McCalla1dee5302010-08-22 10:59:02 +0000661llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000662ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
663 const CastExpr *E,
John McCallc62bb392012-02-15 01:22:51 +0000664 llvm::Value *src) {
John McCalle3027922010-08-25 11:45:40 +0000665 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
John McCallc62bb392012-02-15 01:22:51 +0000666 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
667 E->getCastKind() == CK_ReinterpretMemberPointer);
668
669 // Under Itanium, reinterprets don't require any additional processing.
670 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
671
672 // Use constant emission if we can.
673 if (isa<llvm::Constant>(src))
674 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
675
676 llvm::Constant *adj = getMemberPointerAdjustment(E);
677 if (!adj) return src;
John McCalla8bbb822010-08-22 03:04:22 +0000678
679 CGBuilderTy &Builder = CGF.Builder;
John McCallc62bb392012-02-15 01:22:51 +0000680 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
John McCalla8bbb822010-08-22 03:04:22 +0000681
John McCallc62bb392012-02-15 01:22:51 +0000682 const MemberPointerType *destTy =
683 E->getType()->castAs<MemberPointerType>();
John McCall1c456c82010-08-22 06:43:33 +0000684
John McCall7a9aac22010-08-23 01:21:21 +0000685 // For member data pointers, this is just a matter of adding the
686 // offset if the source is non-null.
John McCallc62bb392012-02-15 01:22:51 +0000687 if (destTy->isMemberDataPointer()) {
688 llvm::Value *dst;
689 if (isDerivedToBase)
690 dst = Builder.CreateNSWSub(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000691 else
John McCallc62bb392012-02-15 01:22:51 +0000692 dst = Builder.CreateNSWAdd(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000693
694 // Null check.
John McCallc62bb392012-02-15 01:22:51 +0000695 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
696 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
697 return Builder.CreateSelect(isNull, src, dst);
John McCall7a9aac22010-08-23 01:21:21 +0000698 }
699
John McCalla1dee5302010-08-22 10:59:02 +0000700 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000701 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000702 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
703 offset <<= 1;
704 adj = llvm::ConstantInt::get(adj->getType(), offset);
John McCalla1dee5302010-08-22 10:59:02 +0000705 }
706
John McCallc62bb392012-02-15 01:22:51 +0000707 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
708 llvm::Value *dstAdj;
709 if (isDerivedToBase)
710 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000711 else
John McCallc62bb392012-02-15 01:22:51 +0000712 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000713
John McCallc62bb392012-02-15 01:22:51 +0000714 return Builder.CreateInsertValue(src, dstAdj, 1);
715}
716
717llvm::Constant *
718ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
719 llvm::Constant *src) {
720 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
721 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
722 E->getCastKind() == CK_ReinterpretMemberPointer);
723
724 // Under Itanium, reinterprets don't require any additional processing.
725 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
726
727 // If the adjustment is trivial, we don't need to do anything.
728 llvm::Constant *adj = getMemberPointerAdjustment(E);
729 if (!adj) return src;
730
731 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
732
733 const MemberPointerType *destTy =
734 E->getType()->castAs<MemberPointerType>();
735
736 // For member data pointers, this is just a matter of adding the
737 // offset if the source is non-null.
738 if (destTy->isMemberDataPointer()) {
739 // null maps to null.
740 if (src->isAllOnesValue()) return src;
741
742 if (isDerivedToBase)
743 return llvm::ConstantExpr::getNSWSub(src, adj);
744 else
745 return llvm::ConstantExpr::getNSWAdd(src, adj);
746 }
747
748 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000749 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000750 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
751 offset <<= 1;
752 adj = llvm::ConstantInt::get(adj->getType(), offset);
753 }
754
755 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
756 llvm::Constant *dstAdj;
757 if (isDerivedToBase)
758 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
759 else
760 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
761
762 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
John McCalla8bbb822010-08-22 03:04:22 +0000763}
John McCall84fa5102010-08-22 04:16:24 +0000764
765llvm::Constant *
John McCall7a9aac22010-08-23 01:21:21 +0000766ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
John McCall7a9aac22010-08-23 01:21:21 +0000767 // Itanium C++ ABI 2.3:
768 // A NULL pointer is represented as -1.
769 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000770 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
John McCalla1dee5302010-08-22 10:59:02 +0000771
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000772 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
John McCalla1dee5302010-08-22 10:59:02 +0000773 llvm::Constant *Values[2] = { Zero, Zero };
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000774 return llvm::ConstantStruct::getAnon(Values);
John McCall84fa5102010-08-22 04:16:24 +0000775}
776
John McCallf3a88602011-02-03 08:15:49 +0000777llvm::Constant *
778ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
779 CharUnits offset) {
John McCall7a9aac22010-08-23 01:21:21 +0000780 // Itanium C++ ABI 2.3:
781 // A pointer to data member is an offset from the base address of
782 // the class object containing it, represented as a ptrdiff_t
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000783 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
John McCall7a9aac22010-08-23 01:21:21 +0000784}
785
David Majnemere2be95b2015-06-23 07:31:01 +0000786llvm::Constant *
787ItaniumCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
Richard Smithdafff942012-01-14 04:30:29 +0000788 return BuildMemberPointer(MD, CharUnits::Zero());
789}
790
791llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
792 CharUnits ThisAdjustment) {
John McCalla1dee5302010-08-22 10:59:02 +0000793 assert(MD->isInstance() && "Member function must not be static!");
794 MD = MD->getCanonicalDecl();
795
796 CodeGenTypes &Types = CGM.getTypes();
John McCalla1dee5302010-08-22 10:59:02 +0000797
798 // Get the function pointer (or index if this is a virtual function).
799 llvm::Constant *MemPtr[2];
800 if (MD->isVirtual()) {
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000801 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
John McCalla1dee5302010-08-22 10:59:02 +0000802
Ken Dyckdf016282011-04-09 01:30:02 +0000803 const ASTContext &Context = getContext();
804 CharUnits PointerWidth =
Douglas Gregore8bbc122011-09-02 00:18:52 +0000805 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
Ken Dyckdf016282011-04-09 01:30:02 +0000806 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000807
Mark Seabornedf0d382013-07-24 16:25:13 +0000808 if (UseARMMethodPtrABI) {
John McCalla1dee5302010-08-22 10:59:02 +0000809 // ARM C++ ABI 3.2.1:
810 // This ABI specifies that adj contains twice the this
811 // adjustment, plus 1 if the member function is virtual. The
812 // least significant bit of adj then makes exactly the same
813 // discrimination as the least significant bit of ptr does for
814 // Itanium.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000815 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
816 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000817 2 * ThisAdjustment.getQuantity() + 1);
John McCalla1dee5302010-08-22 10:59:02 +0000818 } else {
819 // Itanium C++ ABI 2.3:
820 // For a virtual function, [the pointer field] is 1 plus the
821 // virtual table offset (in bytes) of the function,
822 // represented as a ptrdiff_t.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000823 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
824 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000825 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000826 }
827 } else {
John McCall2979fe02011-04-12 00:42:48 +0000828 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
Chris Lattner2192fe52011-07-18 04:24:23 +0000829 llvm::Type *Ty;
John McCall2979fe02011-04-12 00:42:48 +0000830 // Check whether the function has a computable LLVM signature.
Chris Lattner8806e322011-07-10 00:18:59 +0000831 if (Types.isFuncTypeConvertible(FPT)) {
John McCall2979fe02011-04-12 00:42:48 +0000832 // The function has a computable LLVM signature; use the correct type.
John McCalla729c622012-02-17 03:33:10 +0000833 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
John McCalla1dee5302010-08-22 10:59:02 +0000834 } else {
John McCall2979fe02011-04-12 00:42:48 +0000835 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
836 // function type is incomplete.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000837 Ty = CGM.PtrDiffTy;
John McCalla1dee5302010-08-22 10:59:02 +0000838 }
John McCall2979fe02011-04-12 00:42:48 +0000839 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
John McCalla1dee5302010-08-22 10:59:02 +0000840
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000841 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
Mark Seabornedf0d382013-07-24 16:25:13 +0000842 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
843 (UseARMMethodPtrABI ? 2 : 1) *
Richard Smithdafff942012-01-14 04:30:29 +0000844 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000845 }
John McCall1c456c82010-08-22 06:43:33 +0000846
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000847 return llvm::ConstantStruct::getAnon(MemPtr);
John McCall1c456c82010-08-22 06:43:33 +0000848}
849
Richard Smithdafff942012-01-14 04:30:29 +0000850llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
851 QualType MPType) {
852 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
853 const ValueDecl *MPD = MP.getMemberPointerDecl();
854 if (!MPD)
855 return EmitNullMemberPointer(MPT);
856
Reid Kleckner452abac2013-05-09 21:01:17 +0000857 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
Richard Smithdafff942012-01-14 04:30:29 +0000858
859 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
860 return BuildMemberPointer(MD, ThisAdjustment);
861
862 CharUnits FieldOffset =
863 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
864 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
865}
866
John McCall131d97d2010-08-22 08:30:07 +0000867/// The comparison algorithm is pretty easy: the member pointers are
868/// the same if they're either bitwise identical *or* both null.
869///
870/// ARM is different here only because null-ness is more complicated.
871llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000872ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
873 llvm::Value *L,
874 llvm::Value *R,
875 const MemberPointerType *MPT,
876 bool Inequality) {
John McCall131d97d2010-08-22 08:30:07 +0000877 CGBuilderTy &Builder = CGF.Builder;
878
John McCall131d97d2010-08-22 08:30:07 +0000879 llvm::ICmpInst::Predicate Eq;
880 llvm::Instruction::BinaryOps And, Or;
881 if (Inequality) {
882 Eq = llvm::ICmpInst::ICMP_NE;
883 And = llvm::Instruction::Or;
884 Or = llvm::Instruction::And;
885 } else {
886 Eq = llvm::ICmpInst::ICMP_EQ;
887 And = llvm::Instruction::And;
888 Or = llvm::Instruction::Or;
889 }
890
John McCall7a9aac22010-08-23 01:21:21 +0000891 // Member data pointers are easy because there's a unique null
892 // value, so it just comes down to bitwise equality.
893 if (MPT->isMemberDataPointer())
894 return Builder.CreateICmp(Eq, L, R);
895
896 // For member function pointers, the tautologies are more complex.
897 // The Itanium tautology is:
John McCall61a14882010-08-23 06:56:36 +0000898 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
John McCall7a9aac22010-08-23 01:21:21 +0000899 // The ARM tautology is:
John McCall61a14882010-08-23 06:56:36 +0000900 // (L == R) <==> (L.ptr == R.ptr &&
901 // (L.adj == R.adj ||
902 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
John McCall7a9aac22010-08-23 01:21:21 +0000903 // The inequality tautologies have exactly the same structure, except
904 // applying De Morgan's laws.
905
906 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
907 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
908
John McCall131d97d2010-08-22 08:30:07 +0000909 // This condition tests whether L.ptr == R.ptr. This must always be
910 // true for equality to hold.
911 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
912
913 // This condition, together with the assumption that L.ptr == R.ptr,
914 // tests whether the pointers are both null. ARM imposes an extra
915 // condition.
916 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
917 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
918
919 // This condition tests whether L.adj == R.adj. If this isn't
920 // true, the pointers are unequal unless they're both null.
John McCalla1dee5302010-08-22 10:59:02 +0000921 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
922 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000923 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
924
925 // Null member function pointers on ARM clear the low bit of Adj,
926 // so the zero condition has to check that neither low bit is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000927 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000928 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
929
930 // Compute (l.adj | r.adj) & 1 and test it against zero.
931 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
932 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
933 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
934 "cmp.or.adj");
935 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
936 }
937
938 // Tie together all our conditions.
939 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
940 Result = Builder.CreateBinOp(And, PtrEq, Result,
941 Inequality ? "memptr.ne" : "memptr.eq");
942 return Result;
943}
944
945llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000946ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
947 llvm::Value *MemPtr,
948 const MemberPointerType *MPT) {
John McCall131d97d2010-08-22 08:30:07 +0000949 CGBuilderTy &Builder = CGF.Builder;
John McCall7a9aac22010-08-23 01:21:21 +0000950
951 /// For member data pointers, this is just a check against -1.
952 if (MPT->isMemberDataPointer()) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000953 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCall7a9aac22010-08-23 01:21:21 +0000954 llvm::Value *NegativeOne =
955 llvm::Constant::getAllOnesValue(MemPtr->getType());
956 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
957 }
John McCall131d97d2010-08-22 08:30:07 +0000958
Daniel Dunbar914bc412011-04-19 23:10:47 +0000959 // In Itanium, a member function pointer is not null if 'ptr' is not null.
John McCalla1dee5302010-08-22 10:59:02 +0000960 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
John McCall131d97d2010-08-22 08:30:07 +0000961
962 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
963 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
964
Daniel Dunbar914bc412011-04-19 23:10:47 +0000965 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
966 // (the virtual bit) is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000967 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000968 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
John McCalla1dee5302010-08-22 10:59:02 +0000969 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000970 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
Daniel Dunbar914bc412011-04-19 23:10:47 +0000971 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
972 "memptr.isvirtual");
973 Result = Builder.CreateOr(Result, IsVirtual);
John McCall131d97d2010-08-22 08:30:07 +0000974 }
975
976 return Result;
977}
John McCall1c456c82010-08-22 06:43:33 +0000978
Reid Kleckner40ca9132014-05-13 22:05:45 +0000979bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
980 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
981 if (!RD)
982 return false;
983
Reid Klecknerd355ca72014-05-15 01:26:32 +0000984 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
985 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
986 // special members.
987 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
John McCall7f416cc2015-09-08 08:05:57 +0000988 auto Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
989 FI.getReturnInfo() = ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
Reid Kleckner40ca9132014-05-13 22:05:45 +0000990 return true;
991 }
Reid Kleckner40ca9132014-05-13 22:05:45 +0000992 return false;
993}
994
John McCall614dbdc2010-08-22 21:01:12 +0000995/// The Itanium ABI requires non-zero initialization only for data
996/// member pointers, for which '0' is a valid offset.
997bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
David Majnemer5fd33e02015-04-24 01:25:08 +0000998 return MPT->isMemberFunctionPointer();
John McCall84fa5102010-08-22 04:16:24 +0000999}
John McCall5d865c322010-08-31 07:33:07 +00001000
John McCall82fb8922012-09-25 10:10:39 +00001001/// The Itanium ABI always places an offset to the complete object
1002/// at entry -2 in the vtable.
David Majnemer08681372014-11-01 07:37:17 +00001003void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
1004 const CXXDeleteExpr *DE,
John McCall7f416cc2015-09-08 08:05:57 +00001005 Address Ptr,
David Majnemer08681372014-11-01 07:37:17 +00001006 QualType ElementType,
1007 const CXXDestructorDecl *Dtor) {
1008 bool UseGlobalDelete = DE->isGlobalDelete();
David Majnemer0c0b6d92014-10-31 20:09:12 +00001009 if (UseGlobalDelete) {
1010 // Derive the complete-object pointer, which is what we need
1011 // to pass to the deallocation function.
John McCall82fb8922012-09-25 10:10:39 +00001012
David Majnemer0c0b6d92014-10-31 20:09:12 +00001013 // Grab the vtable pointer as an intptr_t*.
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001014 auto *ClassDecl =
1015 cast<CXXRecordDecl>(ElementType->getAs<RecordType>()->getDecl());
1016 llvm::Value *VTable =
1017 CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo(), ClassDecl);
John McCall82fb8922012-09-25 10:10:39 +00001018
David Majnemer0c0b6d92014-10-31 20:09:12 +00001019 // Track back to entry -2 and pull out the offset there.
1020 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
1021 VTable, -2, "complete-offset.ptr");
John McCall7f416cc2015-09-08 08:05:57 +00001022 llvm::Value *Offset =
1023 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
David Majnemer0c0b6d92014-10-31 20:09:12 +00001024
1025 // Apply the offset.
John McCall7f416cc2015-09-08 08:05:57 +00001026 llvm::Value *CompletePtr =
1027 CGF.Builder.CreateBitCast(Ptr.getPointer(), CGF.Int8PtrTy);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001028 CompletePtr = CGF.Builder.CreateInBoundsGEP(CompletePtr, Offset);
1029
1030 // If we're supposed to call the global delete, make sure we do so
1031 // even if the destructor throws.
David Majnemer08681372014-11-01 07:37:17 +00001032 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
1033 ElementType);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001034 }
1035
1036 // FIXME: Provide a source location here even though there's no
1037 // CXXMemberCallExpr for dtor call.
1038 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
1039 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr);
1040
1041 if (UseGlobalDelete)
1042 CGF.PopCleanupBlock();
John McCall82fb8922012-09-25 10:10:39 +00001043}
1044
David Majnemer442d0a22014-11-25 07:20:20 +00001045void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
1046 // void __cxa_rethrow();
1047
1048 llvm::FunctionType *FTy =
1049 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
1050
1051 llvm::Constant *Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
1052
1053 if (isNoReturn)
1054 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, None);
1055 else
1056 CGF.EmitRuntimeCallOrInvoke(Fn);
1057}
1058
David Majnemer7c237072015-03-05 00:46:22 +00001059static llvm::Constant *getAllocateExceptionFn(CodeGenModule &CGM) {
1060 // void *__cxa_allocate_exception(size_t thrown_size);
1061
1062 llvm::FunctionType *FTy =
1063 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*IsVarArgs=*/false);
1064
1065 return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
1066}
1067
1068static llvm::Constant *getThrowFn(CodeGenModule &CGM) {
1069 // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
1070 // void (*dest) (void *));
1071
1072 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.Int8PtrTy, CGM.Int8PtrTy };
1073 llvm::FunctionType *FTy =
1074 llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false);
1075
1076 return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
1077}
1078
1079void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
1080 QualType ThrowType = E->getSubExpr()->getType();
1081 // Now allocate the exception object.
1082 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType());
1083 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
1084
1085 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM);
1086 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall(
1087 AllocExceptionFn, llvm::ConstantInt::get(SizeTy, TypeSize), "exception");
1088
John McCall7f416cc2015-09-08 08:05:57 +00001089 CharUnits ExnAlign = getAlignmentOfExnObject();
1090 CGF.EmitAnyExprToExn(E->getSubExpr(), Address(ExceptionPtr, ExnAlign));
David Majnemer7c237072015-03-05 00:46:22 +00001091
1092 // Now throw the exception.
1093 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
1094 /*ForEH=*/true);
1095
1096 // The address of the destructor. If the exception type has a
1097 // trivial destructor (or isn't a record), we just pass null.
1098 llvm::Constant *Dtor = nullptr;
1099 if (const RecordType *RecordTy = ThrowType->getAs<RecordType>()) {
1100 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
1101 if (!Record->hasTrivialDestructor()) {
1102 CXXDestructorDecl *DtorD = Record->getDestructor();
1103 Dtor = CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete);
1104 Dtor = llvm::ConstantExpr::getBitCast(Dtor, CGM.Int8PtrTy);
1105 }
1106 }
1107 if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
1108
1109 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
1110 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args);
1111}
1112
David Majnemer1162d252014-06-22 19:05:33 +00001113static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
1114 // void *__dynamic_cast(const void *sub,
1115 // const abi::__class_type_info *src,
1116 // const abi::__class_type_info *dst,
1117 // std::ptrdiff_t src2dst_offset);
1118
1119 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1120 llvm::Type *PtrDiffTy =
1121 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1122
1123 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
1124
1125 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
1126
1127 // Mark the function as nounwind readonly.
1128 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
1129 llvm::Attribute::ReadOnly };
1130 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
1131 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
1132
1133 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1134}
1135
1136static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1137 // void __cxa_bad_cast();
1138 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1139 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1140}
1141
1142/// \brief Compute the src2dst_offset hint as described in the
1143/// Itanium C++ ABI [2.9.7]
1144static CharUnits computeOffsetHint(ASTContext &Context,
1145 const CXXRecordDecl *Src,
1146 const CXXRecordDecl *Dst) {
1147 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1148 /*DetectVirtual=*/false);
1149
1150 // If Dst is not derived from Src we can skip the whole computation below and
1151 // return that Src is not a public base of Dst. Record all inheritance paths.
1152 if (!Dst->isDerivedFrom(Src, Paths))
1153 return CharUnits::fromQuantity(-2ULL);
1154
1155 unsigned NumPublicPaths = 0;
1156 CharUnits Offset;
1157
1158 // Now walk all possible inheritance paths.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001159 for (const CXXBasePath &Path : Paths) {
1160 if (Path.Access != AS_public) // Ignore non-public inheritance.
David Majnemer1162d252014-06-22 19:05:33 +00001161 continue;
1162
1163 ++NumPublicPaths;
1164
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001165 for (const CXXBasePathElement &PathElement : Path) {
David Majnemer1162d252014-06-22 19:05:33 +00001166 // If the path contains a virtual base class we can't give any hint.
1167 // -1: no hint.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001168 if (PathElement.Base->isVirtual())
David Majnemer1162d252014-06-22 19:05:33 +00001169 return CharUnits::fromQuantity(-1ULL);
1170
1171 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1172 continue;
1173
1174 // Accumulate the base class offsets.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001175 const ASTRecordLayout &L = Context.getASTRecordLayout(PathElement.Class);
1176 Offset += L.getBaseClassOffset(
1177 PathElement.Base->getType()->getAsCXXRecordDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001178 }
1179 }
1180
1181 // -2: Src is not a public base of Dst.
1182 if (NumPublicPaths == 0)
1183 return CharUnits::fromQuantity(-2ULL);
1184
1185 // -3: Src is a multiple public base type but never a virtual base type.
1186 if (NumPublicPaths > 1)
1187 return CharUnits::fromQuantity(-3ULL);
1188
1189 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1190 // Return the offset of Src from the origin of Dst.
1191 return Offset;
1192}
1193
1194static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
1195 // void __cxa_bad_typeid();
1196 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1197
1198 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1199}
1200
1201bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
1202 QualType SrcRecordTy) {
1203 return IsDeref;
1204}
1205
1206void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1207 llvm::Value *Fn = getBadTypeidFn(CGF);
1208 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1209 CGF.Builder.CreateUnreachable();
1210}
1211
1212llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1213 QualType SrcRecordTy,
John McCall7f416cc2015-09-08 08:05:57 +00001214 Address ThisPtr,
David Majnemer1162d252014-06-22 19:05:33 +00001215 llvm::Type *StdTypeInfoPtrTy) {
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001216 auto *ClassDecl =
1217 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001218 llvm::Value *Value =
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001219 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo(), ClassDecl);
David Majnemer1162d252014-06-22 19:05:33 +00001220
1221 // Load the type info.
1222 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
John McCall7f416cc2015-09-08 08:05:57 +00001223 return CGF.Builder.CreateAlignedLoad(Value, CGF.getPointerAlign());
David Majnemer1162d252014-06-22 19:05:33 +00001224}
1225
1226bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1227 QualType SrcRecordTy) {
1228 return SrcIsPtr;
1229}
1230
1231llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
John McCall7f416cc2015-09-08 08:05:57 +00001232 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy,
David Majnemer1162d252014-06-22 19:05:33 +00001233 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1234 llvm::Type *PtrDiffLTy =
1235 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1236 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1237
1238 llvm::Value *SrcRTTI =
1239 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1240 llvm::Value *DestRTTI =
1241 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1242
1243 // Compute the offset hint.
1244 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1245 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1246 llvm::Value *OffsetHint = llvm::ConstantInt::get(
1247 PtrDiffLTy,
1248 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1249
1250 // Emit the call to __dynamic_cast.
John McCall7f416cc2015-09-08 08:05:57 +00001251 llvm::Value *Value = ThisAddr.getPointer();
David Majnemer1162d252014-06-22 19:05:33 +00001252 Value = CGF.EmitCastToVoidPtr(Value);
1253
1254 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1255 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
1256 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1257
1258 /// C++ [expr.dynamic.cast]p9:
1259 /// A failed cast to reference type throws std::bad_cast
1260 if (DestTy->isReferenceType()) {
1261 llvm::BasicBlock *BadCastBlock =
1262 CGF.createBasicBlock("dynamic_cast.bad_cast");
1263
1264 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1265 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1266
1267 CGF.EmitBlock(BadCastBlock);
1268 EmitBadCastCall(CGF);
1269 }
1270
1271 return Value;
1272}
1273
1274llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001275 Address ThisAddr,
David Majnemer1162d252014-06-22 19:05:33 +00001276 QualType SrcRecordTy,
1277 QualType DestTy) {
1278 llvm::Type *PtrDiffLTy =
1279 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1280 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1281
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001282 auto *ClassDecl =
1283 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001284 // Get the vtable pointer.
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001285 llvm::Value *VTable = CGF.GetVTablePtr(ThisAddr, PtrDiffLTy->getPointerTo(),
1286 ClassDecl);
David Majnemer1162d252014-06-22 19:05:33 +00001287
1288 // Get the offset-to-top from the vtable.
1289 llvm::Value *OffsetToTop =
1290 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
John McCall7f416cc2015-09-08 08:05:57 +00001291 OffsetToTop =
1292 CGF.Builder.CreateAlignedLoad(OffsetToTop, CGF.getPointerAlign(),
1293 "offset.to.top");
David Majnemer1162d252014-06-22 19:05:33 +00001294
1295 // Finally, add the offset to the pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001296 llvm::Value *Value = ThisAddr.getPointer();
David Majnemer1162d252014-06-22 19:05:33 +00001297 Value = CGF.EmitCastToVoidPtr(Value);
1298 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1299
1300 return CGF.Builder.CreateBitCast(Value, DestLTy);
1301}
1302
1303bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1304 llvm::Value *Fn = getBadCastFn(CGF);
1305 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1306 CGF.Builder.CreateUnreachable();
1307 return true;
1308}
1309
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001310llvm::Value *
1311ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001312 Address This,
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001313 const CXXRecordDecl *ClassDecl,
1314 const CXXRecordDecl *BaseClassDecl) {
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001315 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001316 CharUnits VBaseOffsetOffset =
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001317 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1318 BaseClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001319
1320 llvm::Value *VBaseOffsetPtr =
1321 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1322 "vbase.offset.ptr");
1323 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1324 CGM.PtrDiffTy->getPointerTo());
1325
1326 llvm::Value *VBaseOffset =
John McCall7f416cc2015-09-08 08:05:57 +00001327 CGF.Builder.CreateAlignedLoad(VBaseOffsetPtr, CGF.getPointerAlign(),
1328 "vbase.offset");
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001329
1330 return VBaseOffset;
1331}
1332
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001333void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1334 // Just make sure we're in sync with TargetCXXABI.
1335 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1336
Rafael Espindolac3cde362013-12-09 14:51:17 +00001337 // The constructor used for constructing this as a base class;
1338 // ignores virtual bases.
1339 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1340
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001341 // The constructor used for constructing this as a complete class;
Nico Weber4c2ffb22015-01-07 05:25:05 +00001342 // constructs the virtual bases, then calls the base constructor.
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001343 if (!D->getParent()->isAbstract()) {
1344 // We don't need to emit the complete ctor if the class is abstract.
1345 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1346 }
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001347}
1348
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001349void
1350ItaniumCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
1351 SmallVectorImpl<CanQualType> &ArgTys) {
John McCall9bca9232010-09-02 10:25:57 +00001352 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001353
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001354 // All parameters are already in place except VTT, which goes after 'this'.
1355 // These are Clang types, so we don't need to worry about sret yet.
John McCall5d865c322010-08-31 07:33:07 +00001356
1357 // Check if we need to add a VTT parameter (which has type void **).
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001358 if (T == StructorType::Base && MD->getParent()->getNumVBases() != 0)
1359 ArgTys.insert(ArgTys.begin() + 1,
1360 Context.getPointerType(Context.VoidPtrTy));
John McCall5d865c322010-08-31 07:33:07 +00001361}
1362
Reid Klecknere7de47e2013-07-22 13:51:44 +00001363void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
Rafael Espindolac3cde362013-12-09 14:51:17 +00001364 // The destructor used for destructing this as a base class; ignores
1365 // virtual bases.
1366 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001367
1368 // The destructor used for destructing this as a most-derived class;
1369 // call the base destructor and then destructs any virtual bases.
1370 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1371
Rafael Espindolac3cde362013-12-09 14:51:17 +00001372 // The destructor in a virtual table is always a 'deleting'
1373 // destructor, which calls the complete destructor and then uses the
1374 // appropriate operator delete.
1375 if (D->isVirtual())
1376 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001377}
1378
Reid Kleckner89077a12013-12-17 19:46:40 +00001379void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1380 QualType &ResTy,
1381 FunctionArgList &Params) {
John McCall5d865c322010-08-31 07:33:07 +00001382 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
Reid Kleckner89077a12013-12-17 19:46:40 +00001383 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
John McCall5d865c322010-08-31 07:33:07 +00001384
1385 // Check if we need a VTT parameter as well.
Peter Collingbourne66f82e62013-06-28 20:45:28 +00001386 if (NeedsVTTParameter(CGF.CurGD)) {
John McCall9bca9232010-09-02 10:25:57 +00001387 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001388
1389 // FIXME: avoid the fake decl
1390 QualType T = Context.getPointerType(Context.VoidPtrTy);
1391 ImplicitParamDecl *VTTDecl
Craig Topper8a13c412014-05-21 05:09:00 +00001392 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
John McCall5d865c322010-08-31 07:33:07 +00001393 &Context.Idents.get("vtt"), T);
Reid Kleckner89077a12013-12-17 19:46:40 +00001394 Params.insert(Params.begin() + 1, VTTDecl);
Reid Kleckner2af6d732013-12-13 00:09:59 +00001395 getStructorImplicitParamDecl(CGF) = VTTDecl;
John McCall5d865c322010-08-31 07:33:07 +00001396 }
1397}
1398
John McCall5d865c322010-08-31 07:33:07 +00001399void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1400 /// Initialize the 'this' slot.
1401 EmitThisParam(CGF);
1402
1403 /// Initialize the 'vtt' slot if needed.
Reid Kleckner2af6d732013-12-13 00:09:59 +00001404 if (getStructorImplicitParamDecl(CGF)) {
1405 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1406 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
John McCall5d865c322010-08-31 07:33:07 +00001407 }
John McCall5d865c322010-08-31 07:33:07 +00001408
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001409 /// If this is a function that the ABI specifies returns 'this', initialize
1410 /// the return slot to 'this' at the start of the function.
1411 ///
1412 /// Unlike the setting of return types, this is done within the ABI
1413 /// implementation instead of by clients of CGCXXABI because:
1414 /// 1) getThisValue is currently protected
1415 /// 2) in theory, an ABI could implement 'this' returns some other way;
1416 /// HasThisReturn only specifies a contract, not the implementation
John McCall5d865c322010-08-31 07:33:07 +00001417 if (HasThisReturn(CGF.CurGD))
Eli Friedman9fbeba02012-02-11 02:57:39 +00001418 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
John McCall5d865c322010-08-31 07:33:07 +00001419}
1420
Reid Kleckner89077a12013-12-17 19:46:40 +00001421unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1422 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1423 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1424 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1425 return 0;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001426
Reid Kleckner89077a12013-12-17 19:46:40 +00001427 // Insert the implicit 'vtt' argument as the second argument.
1428 llvm::Value *VTT =
1429 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1430 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1431 Args.insert(Args.begin() + 1,
1432 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1433 return 1; // Added one arg.
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001434}
1435
1436void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1437 const CXXDestructorDecl *DD,
1438 CXXDtorType Type, bool ForVirtualBase,
John McCall7f416cc2015-09-08 08:05:57 +00001439 bool Delegating, Address This) {
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001440 GlobalDecl GD(DD, Type);
1441 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1442 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1443
Craig Topper8a13c412014-05-21 05:09:00 +00001444 llvm::Value *Callee = nullptr;
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001445 if (getContext().getLangOpts().AppleKext)
1446 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1447
1448 if (!Callee)
Rafael Espindola1ac0ec82014-09-11 15:42:06 +00001449 Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type));
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001450
John McCall7f416cc2015-09-08 08:05:57 +00001451 CGF.EmitCXXMemberOrOperatorCall(DD, Callee, ReturnValueSlot(),
1452 This.getPointer(), VTT, VTTTy, nullptr);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001453}
1454
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001455void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1456 const CXXRecordDecl *RD) {
1457 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1458 if (VTable->hasInitializer())
1459 return;
1460
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001461 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001462 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1463 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
David Majnemerd905da42014-07-01 20:30:31 +00001464 llvm::Constant *RTTI =
1465 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001466
1467 // Create and set the initializer.
1468 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1469 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
David Majnemerd905da42014-07-01 20:30:31 +00001470 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001471 VTable->setInitializer(Init);
1472
1473 // Set the correct linkage.
1474 VTable->setLinkage(Linkage);
1475
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00001476 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
1477 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
Rafael Espindolacb92c192015-01-15 23:18:01 +00001478
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001479 // Set the right visibility.
John McCall8f80a612014-02-08 00:41:16 +00001480 CGM.setGlobalVisibility(VTable, RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001481
Benjamin Kramer5d34a2b2014-09-10 12:50:59 +00001482 // Use pointer alignment for the vtable. Otherwise we would align them based
1483 // on the size of the initializer which doesn't make sense as only single
1484 // values are read.
1485 unsigned PAlign = CGM.getTarget().getPointerAlign(0);
1486 VTable->setAlignment(getContext().toCharUnitsFromBits(PAlign).getQuantity());
1487
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001488 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1489 // we will emit the typeinfo for the fundamental types. This is the
1490 // same behaviour as GCC.
1491 const DeclContext *DC = RD->getDeclContext();
1492 if (RD->getIdentifier() &&
1493 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1494 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1495 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1496 DC->getParent()->isTranslationUnit())
David Majnemere2cb8d12014-07-07 06:20:47 +00001497 EmitFundamentalRTTIDescriptors();
Peter Collingbournea4ccff32015-02-20 20:30:56 +00001498
1499 CGM.EmitVTableBitSetEntries(VTable, VTLayout);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001500}
1501
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001502bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField(
1503 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) {
1504 if (Vptr.NearestVBase == nullptr)
1505 return false;
1506 return NeedsVTTParameter(CGF.CurGD);
Piotr Padlewski255652e2015-09-09 22:20:28 +00001507}
1508
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001509llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1510 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1511 const CXXRecordDecl *NearestVBase) {
1512
1513 if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1514 NeedsVTTParameter(CGF.CurGD)) {
1515 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base,
1516 NearestVBase);
1517 }
1518 return getVTableAddressPoint(Base, VTableClass);
1519}
1520
1521llvm::Constant *
1522ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base,
1523 const CXXRecordDecl *VTableClass) {
1524 llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, CharUnits());
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001525
1526 // Find the appropriate vtable within the vtable group.
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001527 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1528 .getVTableLayout(VTableClass)
1529 .getAddressPoint(Base);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001530 llvm::Value *Indices[] = {
1531 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1532 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1533 };
1534
David Blaikiee3b172a2015-04-02 18:55:21 +00001535 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable->getValueType(),
1536 VTable, Indices);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001537}
1538
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001539llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
1540 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1541 const CXXRecordDecl *NearestVBase) {
1542 assert((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1543 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT");
1544
1545 // Get the secondary vpointer index.
1546 uint64_t VirtualPointerIndex =
1547 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1548
1549 /// Load the VTT.
1550 llvm::Value *VTT = CGF.LoadCXXVTT();
1551 if (VirtualPointerIndex)
1552 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1553
1554 // And load the address point from the VTT.
1555 return CGF.Builder.CreateAlignedLoad(VTT, CGF.getPointerAlign());
1556}
1557
1558llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1559 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1560 return getVTableAddressPoint(Base, VTableClass);
1561}
1562
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001563llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1564 CharUnits VPtrOffset) {
1565 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1566
1567 llvm::GlobalVariable *&VTable = VTables[RD];
1568 if (VTable)
1569 return VTable;
1570
1571 // Queue up this v-table for possible deferred emission.
1572 CGM.addDeferredVTable(RD);
1573
Yaron Kerene46f7ed2015-07-29 14:21:47 +00001574 SmallString<256> Name;
1575 llvm::raw_svector_ostream Out(Name);
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001576 getMangleContext().mangleCXXVTable(RD, Out);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001577
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001578 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001579 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1580 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1581
1582 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1583 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1584 VTable->setUnnamedAddr(true);
Hans Wennborgda24e9c2014-06-02 23:13:03 +00001585
1586 if (RD->hasAttr<DLLImportAttr>())
1587 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1588 else if (RD->hasAttr<DLLExportAttr>())
1589 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1590
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001591 return VTable;
1592}
1593
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001594llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1595 GlobalDecl GD,
John McCall7f416cc2015-09-08 08:05:57 +00001596 Address This,
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001597 llvm::Type *Ty,
1598 SourceLocation Loc) {
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001599 GD = GD.getCanonicalDecl();
1600 Ty = Ty->getPointerTo()->getPointerTo();
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001601 auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl());
1602 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty, MethodDecl->getParent());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001603
Peter Collingbourne1a7488a2015-04-02 00:23:30 +00001604 if (CGF.SanOpts.has(SanitizerKind::CFIVCall))
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001605 CGF.EmitVTablePtrCheckForCall(MethodDecl, VTable,
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001606 CodeGenFunction::CFITCK_VCall, Loc);
Peter Collingbournea4ccff32015-02-20 20:30:56 +00001607
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001608 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001609 llvm::Value *VFuncPtr =
1610 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
Renato Golin41106182015-10-01 12:58:41 +00001611 return CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.getPointerAlign());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001612}
1613
David Majnemer0c0b6d92014-10-31 20:09:12 +00001614llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
1615 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
John McCall7f416cc2015-09-08 08:05:57 +00001616 Address This, const CXXMemberCallExpr *CE) {
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001617 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001618 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1619
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001620 const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
1621 Dtor, getFromDtorType(DtorType));
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001622 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001623 llvm::Value *Callee =
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001624 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty,
1625 CE ? CE->getLocStart() : SourceLocation());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001626
John McCall7f416cc2015-09-08 08:05:57 +00001627 CGF.EmitCXXMemberOrOperatorCall(Dtor, Callee, ReturnValueSlot(),
1628 This.getPointer(), /*ImplicitParam=*/nullptr,
1629 QualType(), CE);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001630 return nullptr;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001631}
1632
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001633void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
Reid Kleckner7810af02013-06-19 15:20:38 +00001634 CodeGenVTables &VTables = CGM.getVTables();
1635 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001636 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
Reid Kleckner7810af02013-06-19 15:20:38 +00001637}
1638
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001639bool ItaniumCXXABI::canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const {
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001640 // We don't emit available_externally vtables if we are in -fapple-kext mode
1641 // because kext mode does not permit devirtualization.
1642 if (CGM.getLangOpts().AppleKext)
1643 return false;
1644
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001645 // If we don't have any inline virtual functions, and if vtable is not hidden,
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001646 // then we are safe to emit available_externally copy of vtable.
1647 // FIXME we can still emit a copy of the vtable if we
1648 // can emit definition of the inline functions.
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001649 return !hasAnyUsedVirtualInlineFunction(RD) && !isVTableHidden(RD);
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001650}
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001651static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001652 Address InitialPtr,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001653 int64_t NonVirtualAdjustment,
1654 int64_t VirtualAdjustment,
1655 bool IsReturnAdjustment) {
1656 if (!NonVirtualAdjustment && !VirtualAdjustment)
John McCall7f416cc2015-09-08 08:05:57 +00001657 return InitialPtr.getPointer();
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001658
John McCall7f416cc2015-09-08 08:05:57 +00001659 Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001660
John McCall7f416cc2015-09-08 08:05:57 +00001661 // In a base-to-derived cast, the non-virtual adjustment is applied first.
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001662 if (NonVirtualAdjustment && !IsReturnAdjustment) {
John McCall7f416cc2015-09-08 08:05:57 +00001663 V = CGF.Builder.CreateConstInBoundsByteGEP(V,
1664 CharUnits::fromQuantity(NonVirtualAdjustment));
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001665 }
1666
John McCall7f416cc2015-09-08 08:05:57 +00001667 // Perform the virtual adjustment if we have one.
1668 llvm::Value *ResultPtr;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001669 if (VirtualAdjustment) {
1670 llvm::Type *PtrDiffTy =
1671 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1672
John McCall7f416cc2015-09-08 08:05:57 +00001673 Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001674 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1675
1676 llvm::Value *OffsetPtr =
1677 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1678
1679 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1680
1681 // Load the adjustment offset from the vtable.
John McCall7f416cc2015-09-08 08:05:57 +00001682 llvm::Value *Offset =
1683 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001684
1685 // Adjust our pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001686 ResultPtr = CGF.Builder.CreateInBoundsGEP(V.getPointer(), Offset);
1687 } else {
1688 ResultPtr = V.getPointer();
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001689 }
1690
John McCall7f416cc2015-09-08 08:05:57 +00001691 // In a derived-to-base conversion, the non-virtual adjustment is
1692 // applied second.
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001693 if (NonVirtualAdjustment && IsReturnAdjustment) {
John McCall7f416cc2015-09-08 08:05:57 +00001694 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(ResultPtr,
1695 NonVirtualAdjustment);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001696 }
1697
1698 // Cast back to the original type.
John McCall7f416cc2015-09-08 08:05:57 +00001699 return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType());
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001700}
1701
1702llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001703 Address This,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001704 const ThisAdjustment &TA) {
Timur Iskhodzhanov053142a2013-11-06 06:24:31 +00001705 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1706 TA.Virtual.Itanium.VCallOffsetOffset,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001707 /*IsReturnAdjustment=*/false);
1708}
1709
1710llvm::Value *
John McCall7f416cc2015-09-08 08:05:57 +00001711ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001712 const ReturnAdjustment &RA) {
1713 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1714 RA.Virtual.Itanium.VBaseOffsetOffset,
1715 /*IsReturnAdjustment=*/true);
1716}
1717
John McCall5d865c322010-08-31 07:33:07 +00001718void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1719 RValue RV, QualType ResultType) {
1720 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1721 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1722
1723 // Destructor thunks in the ARM ABI have indeterminate results.
John McCall7f416cc2015-09-08 08:05:57 +00001724 llvm::Type *T = CGF.ReturnValue.getElementType();
John McCall5d865c322010-08-31 07:33:07 +00001725 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1726 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1727}
John McCall8ed55a52010-09-02 09:58:18 +00001728
1729/************************** Array allocation cookies **************************/
1730
John McCallb91cd662012-05-01 05:23:51 +00001731CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1732 // The array cookie is a size_t; pad that up to the element alignment.
1733 // The cookie is actually right-justified in that space.
1734 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1735 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001736}
1737
John McCall7f416cc2015-09-08 08:05:57 +00001738Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1739 Address NewPtr,
1740 llvm::Value *NumElements,
1741 const CXXNewExpr *expr,
1742 QualType ElementType) {
John McCallb91cd662012-05-01 05:23:51 +00001743 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001744
John McCall7f416cc2015-09-08 08:05:57 +00001745 unsigned AS = NewPtr.getAddressSpace();
John McCall8ed55a52010-09-02 09:58:18 +00001746
John McCall9bca9232010-09-02 10:25:57 +00001747 ASTContext &Ctx = getContext();
John McCall7f416cc2015-09-08 08:05:57 +00001748 CharUnits SizeSize = CGF.getSizeSize();
John McCall8ed55a52010-09-02 09:58:18 +00001749
1750 // The size of the cookie.
1751 CharUnits CookieSize =
1752 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
John McCallb91cd662012-05-01 05:23:51 +00001753 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
John McCall8ed55a52010-09-02 09:58:18 +00001754
1755 // Compute an offset to the cookie.
John McCall7f416cc2015-09-08 08:05:57 +00001756 Address CookiePtr = NewPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001757 CharUnits CookieOffset = CookieSize - SizeSize;
1758 if (!CookieOffset.isZero())
John McCall7f416cc2015-09-08 08:05:57 +00001759 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset);
John McCall8ed55a52010-09-02 09:58:18 +00001760
1761 // Write the number of elements into the appropriate slot.
John McCall7f416cc2015-09-08 08:05:57 +00001762 Address NumElementsPtr =
1763 CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy);
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001764 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
John McCall7f416cc2015-09-08 08:05:57 +00001765
1766 // Handle the array cookie specially in ASan.
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001767 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001768 expr->getOperatorNew()->isReplaceableGlobalAllocationFunction()) {
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001769 // The store to the CookiePtr does not need to be instrumented.
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001770 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
1771 llvm::FunctionType *FTy =
John McCall7f416cc2015-09-08 08:05:57 +00001772 llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false);
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001773 llvm::Constant *F =
1774 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
John McCall7f416cc2015-09-08 08:05:57 +00001775 CGF.Builder.CreateCall(F, NumElementsPtr.getPointer());
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001776 }
John McCall8ed55a52010-09-02 09:58:18 +00001777
1778 // Finally, compute a pointer to the actual data buffer by skipping
1779 // over the cookie completely.
John McCall7f416cc2015-09-08 08:05:57 +00001780 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize);
John McCall8ed55a52010-09-02 09:58:18 +00001781}
1782
John McCallb91cd662012-05-01 05:23:51 +00001783llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001784 Address allocPtr,
John McCallb91cd662012-05-01 05:23:51 +00001785 CharUnits cookieSize) {
1786 // The element size is right-justified in the cookie.
John McCall7f416cc2015-09-08 08:05:57 +00001787 Address numElementsPtr = allocPtr;
1788 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize();
John McCallb91cd662012-05-01 05:23:51 +00001789 if (!numElementsOffset.isZero())
1790 numElementsPtr =
John McCall7f416cc2015-09-08 08:05:57 +00001791 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset);
John McCall8ed55a52010-09-02 09:58:18 +00001792
John McCall7f416cc2015-09-08 08:05:57 +00001793 unsigned AS = allocPtr.getAddressSpace();
1794 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001795 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001796 return CGF.Builder.CreateLoad(numElementsPtr);
1797 // In asan mode emit a function call instead of a regular load and let the
1798 // run-time deal with it: if the shadow is properly poisoned return the
1799 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
1800 // We can't simply ignore this load using nosanitize metadata because
1801 // the metadata may be lost.
1802 llvm::FunctionType *FTy =
1803 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
1804 llvm::Constant *F =
1805 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
John McCall7f416cc2015-09-08 08:05:57 +00001806 return CGF.Builder.CreateCall(F, numElementsPtr.getPointer());
John McCall8ed55a52010-09-02 09:58:18 +00001807}
1808
John McCallb91cd662012-05-01 05:23:51 +00001809CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
John McCallc19c7062013-01-25 23:36:19 +00001810 // ARM says that the cookie is always:
John McCall8ed55a52010-09-02 09:58:18 +00001811 // struct array_cookie {
1812 // std::size_t element_size; // element_size != 0
1813 // std::size_t element_count;
1814 // };
John McCallc19c7062013-01-25 23:36:19 +00001815 // But the base ABI doesn't give anything an alignment greater than
1816 // 8, so we can dismiss this as typical ABI-author blindness to
1817 // actual language complexity and round up to the element alignment.
1818 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1819 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001820}
1821
John McCall7f416cc2015-09-08 08:05:57 +00001822Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1823 Address newPtr,
1824 llvm::Value *numElements,
1825 const CXXNewExpr *expr,
1826 QualType elementType) {
John McCallb91cd662012-05-01 05:23:51 +00001827 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001828
John McCall8ed55a52010-09-02 09:58:18 +00001829 // The cookie is always at the start of the buffer.
John McCall7f416cc2015-09-08 08:05:57 +00001830 Address cookie = newPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001831
1832 // The first element is the element size.
John McCall7f416cc2015-09-08 08:05:57 +00001833 cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy);
John McCallc19c7062013-01-25 23:36:19 +00001834 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1835 getContext().getTypeSizeInChars(elementType).getQuantity());
1836 CGF.Builder.CreateStore(elementSize, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001837
1838 // The second element is the element count.
John McCall7f416cc2015-09-08 08:05:57 +00001839 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1, CGF.getSizeSize());
John McCallc19c7062013-01-25 23:36:19 +00001840 CGF.Builder.CreateStore(numElements, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001841
1842 // Finally, compute a pointer to the actual data buffer by skipping
1843 // over the cookie completely.
John McCallc19c7062013-01-25 23:36:19 +00001844 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
John McCall7f416cc2015-09-08 08:05:57 +00001845 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize);
John McCall8ed55a52010-09-02 09:58:18 +00001846}
1847
John McCallb91cd662012-05-01 05:23:51 +00001848llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001849 Address allocPtr,
John McCallb91cd662012-05-01 05:23:51 +00001850 CharUnits cookieSize) {
1851 // The number of elements is at offset sizeof(size_t) relative to
1852 // the allocated pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001853 Address numElementsPtr
1854 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize());
John McCall8ed55a52010-09-02 09:58:18 +00001855
John McCall7f416cc2015-09-08 08:05:57 +00001856 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
John McCallb91cd662012-05-01 05:23:51 +00001857 return CGF.Builder.CreateLoad(numElementsPtr);
John McCall8ed55a52010-09-02 09:58:18 +00001858}
1859
John McCall68ff0372010-09-08 01:44:27 +00001860/*********************** Static local initialization **************************/
1861
1862static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001863 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001864 // int __cxa_guard_acquire(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001865 llvm::FunctionType *FTy =
John McCall68ff0372010-09-08 01:44:27 +00001866 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
Jay Foad5709f7c2011-07-29 13:56:53 +00001867 GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001868 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001869 llvm::AttributeSet::get(CGM.getLLVMContext(),
1870 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001871 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001872}
1873
1874static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001875 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001876 // void __cxa_guard_release(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001877 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001878 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001879 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001880 llvm::AttributeSet::get(CGM.getLLVMContext(),
1881 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001882 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001883}
1884
1885static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001886 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001887 // void __cxa_guard_abort(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001888 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001889 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001890 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001891 llvm::AttributeSet::get(CGM.getLLVMContext(),
1892 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001893 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001894}
1895
1896namespace {
David Blaikie7e70d682015-08-18 22:40:54 +00001897 struct CallGuardAbort final : EHScopeStack::Cleanup {
John McCall68ff0372010-09-08 01:44:27 +00001898 llvm::GlobalVariable *Guard;
Chandler Carruth84537952012-03-30 19:44:53 +00001899 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
John McCall68ff0372010-09-08 01:44:27 +00001900
Craig Topper4f12f102014-03-12 06:41:41 +00001901 void Emit(CodeGenFunction &CGF, Flags flags) override {
John McCall882987f2013-02-28 19:01:20 +00001902 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1903 Guard);
John McCall68ff0372010-09-08 01:44:27 +00001904 }
1905 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +00001906}
John McCall68ff0372010-09-08 01:44:27 +00001907
1908/// The ARM code here follows the Itanium code closely enough that we
1909/// just special-case it at particular places.
John McCallcdf7ef52010-11-06 09:44:32 +00001910void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1911 const VarDecl &D,
John McCallb88a5662012-03-30 21:00:39 +00001912 llvm::GlobalVariable *var,
1913 bool shouldPerformInit) {
John McCall68ff0372010-09-08 01:44:27 +00001914 CGBuilderTy &Builder = CGF.Builder;
John McCallcdf7ef52010-11-06 09:44:32 +00001915
Richard Smithdbf74ba2013-04-14 23:01:42 +00001916 // We only need to use thread-safe statics for local non-TLS variables;
John McCallcdf7ef52010-11-06 09:44:32 +00001917 // global initialization is always single-threaded.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001918 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1919 D.isLocalVarDecl() && !D.getTLSKind();
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001920
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001921 // If we have a global variable with internal linkage and thread-safe statics
1922 // are disabled, we can just let the guard variable be of type i8.
John McCallb88a5662012-03-30 21:00:39 +00001923 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1924
1925 llvm::IntegerType *guardTy;
John McCall7f416cc2015-09-08 08:05:57 +00001926 CharUnits guardAlignment;
John McCall5aa52592011-06-17 07:33:57 +00001927 if (useInt8GuardVariable) {
John McCallb88a5662012-03-30 21:00:39 +00001928 guardTy = CGF.Int8Ty;
John McCall7f416cc2015-09-08 08:05:57 +00001929 guardAlignment = CharUnits::One();
John McCall5aa52592011-06-17 07:33:57 +00001930 } else {
Tim Northover9bb857a2013-01-31 12:13:10 +00001931 // Guard variables are 64 bits in the generic ABI and size width on ARM
1932 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
John McCall7f416cc2015-09-08 08:05:57 +00001933 if (UseARMGuardVarABI) {
1934 guardTy = CGF.SizeTy;
1935 guardAlignment = CGF.getSizeAlign();
1936 } else {
1937 guardTy = CGF.Int64Ty;
1938 guardAlignment = CharUnits::fromQuantity(
1939 CGM.getDataLayout().getABITypeAlignment(guardTy));
1940 }
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001941 }
John McCallb88a5662012-03-30 21:00:39 +00001942 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
John McCall68ff0372010-09-08 01:44:27 +00001943
John McCallb88a5662012-03-30 21:00:39 +00001944 // Create the guard variable if we don't already have it (as we
1945 // might if we're double-emitting this function body).
1946 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1947 if (!guard) {
1948 // Mangle the name for the guard.
1949 SmallString<256> guardName;
1950 {
1951 llvm::raw_svector_ostream out(guardName);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001952 getMangleContext().mangleStaticGuardVariable(&D, out);
John McCallb88a5662012-03-30 21:00:39 +00001953 }
John McCall8e7cb6d2010-11-02 21:04:24 +00001954
John McCallb88a5662012-03-30 21:00:39 +00001955 // Create the guard variable with a zero-initializer.
1956 // Just absorb linkage and visibility from the guarded variable.
1957 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1958 false, var->getLinkage(),
1959 llvm::ConstantInt::get(guardTy, 0),
1960 guardName.str());
1961 guard->setVisibility(var->getVisibility());
Richard Smithdbf74ba2013-04-14 23:01:42 +00001962 // If the variable is thread-local, so is its guard variable.
1963 guard->setThreadLocalMode(var->getThreadLocalMode());
John McCall7f416cc2015-09-08 08:05:57 +00001964 guard->setAlignment(guardAlignment.getQuantity());
John McCallb88a5662012-03-30 21:00:39 +00001965
Yaron Keren5bfa1082015-09-03 20:33:29 +00001966 // The ABI says: "It is suggested that it be emitted in the same COMDAT
1967 // group as the associated data object." In practice, this doesn't work for
1968 // non-ELF object formats, so only do it for ELF.
Rafael Espindola0d4fb982015-01-12 22:13:53 +00001969 llvm::Comdat *C = var->getComdat();
Yaron Keren5bfa1082015-09-03 20:33:29 +00001970 if (!D.isLocalVarDecl() && C &&
1971 CGM.getTarget().getTriple().isOSBinFormatELF()) {
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001972 guard->setComdat(C);
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001973 CGF.CurFn->setComdat(C);
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00001974 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
1975 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001976 }
1977
John McCallb88a5662012-03-30 21:00:39 +00001978 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1979 }
John McCall87590e62012-03-30 07:09:50 +00001980
John McCall7f416cc2015-09-08 08:05:57 +00001981 Address guardAddr = Address(guard, guardAlignment);
1982
John McCall68ff0372010-09-08 01:44:27 +00001983 // Test whether the variable has completed initialization.
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001984 //
John McCall68ff0372010-09-08 01:44:27 +00001985 // Itanium C++ ABI 3.3.2:
1986 // The following is pseudo-code showing how these functions can be used:
1987 // if (obj_guard.first_byte == 0) {
1988 // if ( __cxa_guard_acquire (&obj_guard) ) {
1989 // try {
1990 // ... initialize the object ...;
1991 // } catch (...) {
1992 // __cxa_guard_abort (&obj_guard);
1993 // throw;
1994 // }
1995 // ... queue object destructor with __cxa_atexit() ...;
1996 // __cxa_guard_release (&obj_guard);
1997 // }
1998 // }
Tim Northovera2ee4332014-03-29 15:09:45 +00001999
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002000 // Load the first byte of the guard variable.
2001 llvm::LoadInst *LI =
John McCall7f416cc2015-09-08 08:05:57 +00002002 Builder.CreateLoad(Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty));
John McCall68ff0372010-09-08 01:44:27 +00002003
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002004 // Itanium ABI:
2005 // An implementation supporting thread-safety on multiprocessor
2006 // systems must also guarantee that references to the initialized
2007 // object do not occur before the load of the initialization flag.
2008 //
2009 // In LLVM, we do this by marking the load Acquire.
2010 if (threadsafe)
2011 LI->setAtomic(llvm::Acquire);
Eli Friedman84d28122011-09-13 22:21:56 +00002012
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002013 // For ARM, we should only check the first bit, rather than the entire byte:
2014 //
2015 // ARM C++ ABI 3.2.3.1:
2016 // To support the potential use of initialization guard variables
2017 // as semaphores that are the target of ARM SWP and LDREX/STREX
2018 // synchronizing instructions we define a static initialization
2019 // guard variable to be a 4-byte aligned, 4-byte word with the
2020 // following inline access protocol.
2021 // #define INITIALIZED 1
2022 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
2023 // if (__cxa_guard_acquire(&obj_guard))
2024 // ...
2025 // }
2026 //
2027 // and similarly for ARM64:
2028 //
2029 // ARM64 C++ ABI 3.2.2:
2030 // This ABI instead only specifies the value bit 0 of the static guard
2031 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
2032 // variable is not initialized and 1 when it is.
2033 llvm::Value *V =
2034 (UseARMGuardVarABI && !useInt8GuardVariable)
2035 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
2036 : LI;
2037 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
John McCall68ff0372010-09-08 01:44:27 +00002038
2039 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
2040 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2041
2042 // Check if the first byte of the guard variable is zero.
John McCallb88a5662012-03-30 21:00:39 +00002043 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
John McCall68ff0372010-09-08 01:44:27 +00002044
2045 CGF.EmitBlock(InitCheckBlock);
2046
2047 // Variables used when coping with thread-safe statics and exceptions.
John McCall5aa52592011-06-17 07:33:57 +00002048 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00002049 // Call __cxa_guard_acquire.
2050 llvm::Value *V
John McCall882987f2013-02-28 19:01:20 +00002051 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
John McCall68ff0372010-09-08 01:44:27 +00002052
2053 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2054
2055 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
2056 InitBlock, EndBlock);
2057
2058 // Call __cxa_guard_abort along the exceptional edge.
John McCallb88a5662012-03-30 21:00:39 +00002059 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
John McCall68ff0372010-09-08 01:44:27 +00002060
2061 CGF.EmitBlock(InitBlock);
2062 }
2063
2064 // Emit the initializer and add a global destructor if appropriate.
John McCallb88a5662012-03-30 21:00:39 +00002065 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
John McCall68ff0372010-09-08 01:44:27 +00002066
John McCall5aa52592011-06-17 07:33:57 +00002067 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00002068 // Pop the guard-abort cleanup if we pushed one.
2069 CGF.PopCleanupBlock();
2070
2071 // Call __cxa_guard_release. This cannot throw.
John McCall7f416cc2015-09-08 08:05:57 +00002072 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy),
2073 guardAddr.getPointer());
John McCall68ff0372010-09-08 01:44:27 +00002074 } else {
John McCall7f416cc2015-09-08 08:05:57 +00002075 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guardAddr);
John McCall68ff0372010-09-08 01:44:27 +00002076 }
2077
2078 CGF.EmitBlock(EndBlock);
2079}
John McCallc84ed6a2012-05-01 06:13:13 +00002080
2081/// Register a global destructor using __cxa_atexit.
2082static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
2083 llvm::Constant *dtor,
Richard Smithdbf74ba2013-04-14 23:01:42 +00002084 llvm::Constant *addr,
2085 bool TLS) {
Bill Wendling95cae882013-05-02 19:18:03 +00002086 const char *Name = "__cxa_atexit";
2087 if (TLS) {
2088 const llvm::Triple &T = CGF.getTarget().getTriple();
Manman Renf93fff22015-11-11 23:08:18 +00002089 Name = T.isOSDarwin() ? "_tlv_atexit" : "__cxa_thread_atexit";
Bill Wendling95cae882013-05-02 19:18:03 +00002090 }
Richard Smithdbf74ba2013-04-14 23:01:42 +00002091
John McCallc84ed6a2012-05-01 06:13:13 +00002092 // We're assuming that the destructor function is something we can
2093 // reasonably call with the default CC. Go ahead and cast it to the
2094 // right prototype.
2095 llvm::Type *dtorTy =
2096 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
2097
2098 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
2099 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
2100 llvm::FunctionType *atexitTy =
2101 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
2102
2103 // Fetch the actual function.
Richard Smithdbf74ba2013-04-14 23:01:42 +00002104 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
John McCallc84ed6a2012-05-01 06:13:13 +00002105 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
2106 fn->setDoesNotThrow();
2107
2108 // Create a variable that binds the atexit to this shared object.
2109 llvm::Constant *handle =
2110 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
2111
2112 llvm::Value *args[] = {
2113 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
2114 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
2115 handle
2116 };
John McCall882987f2013-02-28 19:01:20 +00002117 CGF.EmitNounwindRuntimeCall(atexit, args);
John McCallc84ed6a2012-05-01 06:13:13 +00002118}
2119
2120/// Register a global destructor as best as we know how.
2121void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
Richard Smithdbf74ba2013-04-14 23:01:42 +00002122 const VarDecl &D,
John McCallc84ed6a2012-05-01 06:13:13 +00002123 llvm::Constant *dtor,
2124 llvm::Constant *addr) {
2125 // Use __cxa_atexit if available.
Richard Smithdbf74ba2013-04-14 23:01:42 +00002126 if (CGM.getCodeGenOpts().CXAAtExit)
2127 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
2128
2129 if (D.getTLSKind())
2130 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
John McCallc84ed6a2012-05-01 06:13:13 +00002131
2132 // In Apple kexts, we want to add a global destructor entry.
2133 // FIXME: shouldn't this be guarded by some variable?
Richard Smith9c6890a2012-11-01 22:30:59 +00002134 if (CGM.getLangOpts().AppleKext) {
John McCallc84ed6a2012-05-01 06:13:13 +00002135 // Generate a global destructor entry.
2136 return CGM.AddCXXDtorEntry(dtor, addr);
2137 }
2138
David Blaikieebe87e12013-08-27 23:57:18 +00002139 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
John McCallc84ed6a2012-05-01 06:13:13 +00002140}
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002141
David Majnemer9b21c332014-07-11 20:28:10 +00002142static bool isThreadWrapperReplaceable(const VarDecl *VD,
2143 CodeGen::CodeGenModule &CGM) {
2144 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
Manman Renf93fff22015-11-11 23:08:18 +00002145 // Darwin prefers to have references to thread local variables to go through
David Majnemer9b21c332014-07-11 20:28:10 +00002146 // the thread wrapper instead of directly referencing the backing variable.
2147 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
Manman Renf93fff22015-11-11 23:08:18 +00002148 CGM.getTarget().getTriple().isOSDarwin();
David Majnemer9b21c332014-07-11 20:28:10 +00002149}
2150
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002151/// Get the appropriate linkage for the wrapper function. This is essentially
David Majnemer4632e1e2014-06-27 16:56:27 +00002152/// the weak form of the variable's linkage; every translation unit which needs
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002153/// the wrapper emits a copy, and we want the linker to merge them.
David Majnemer35ab3282014-06-11 04:08:55 +00002154static llvm::GlobalValue::LinkageTypes
2155getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
2156 llvm::GlobalValue::LinkageTypes VarLinkage =
2157 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
2158
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002159 // For internal linkage variables, we don't need an external or weak wrapper.
2160 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
2161 return VarLinkage;
David Majnemer35ab3282014-06-11 04:08:55 +00002162
David Majnemer9b21c332014-07-11 20:28:10 +00002163 // If the thread wrapper is replaceable, give it appropriate linkage.
Manman Ren68150262015-11-11 22:42:31 +00002164 if (isThreadWrapperReplaceable(VD, CGM))
2165 if (!llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) &&
2166 !llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
2167 return VarLinkage;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002168 return llvm::GlobalValue::WeakODRLinkage;
2169}
2170
2171llvm::Function *
2172ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
Alexander Musmanf94c3182014-09-26 06:28:25 +00002173 llvm::Value *Val) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002174 // Mangle the name for the thread_local wrapper function.
2175 SmallString<256> WrapperName;
2176 {
2177 llvm::raw_svector_ostream Out(WrapperName);
2178 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002179 }
2180
Akira Hatanaka26907f92016-01-15 03:34:06 +00002181 // FIXME: If VD is a definition, we should regenerate the function attributes
2182 // before returning.
Alexander Musmanf94c3182014-09-26 06:28:25 +00002183 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002184 return cast<llvm::Function>(V);
2185
Akira Hatanaka26907f92016-01-15 03:34:06 +00002186 QualType RetQT = VD->getType();
2187 if (RetQT->isReferenceType())
2188 RetQT = RetQT.getNonReferenceType();
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002189
Akira Hatanaka26907f92016-01-15 03:34:06 +00002190 const CGFunctionInfo &FI = CGM.getTypes().arrangeFreeFunctionDeclaration(
2191 getContext().getPointerType(RetQT), FunctionArgList(),
2192 FunctionType::ExtInfo(), false);
2193
2194 llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FI);
David Majnemer35ab3282014-06-11 04:08:55 +00002195 llvm::Function *Wrapper =
2196 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
2197 WrapperName.str(), &CGM.getModule());
Akira Hatanaka26907f92016-01-15 03:34:06 +00002198
2199 CGM.SetLLVMFunctionAttributes(nullptr, FI, Wrapper);
2200
2201 if (VD->hasDefinition())
2202 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Wrapper);
2203
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002204 // Always resolve references to the wrapper at link time.
Manman Ren68150262015-11-11 22:42:31 +00002205 if (!Wrapper->hasLocalLinkage() && !(isThreadWrapperReplaceable(VD, CGM) &&
2206 !llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) &&
2207 !llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage())))
Duncan P. N. Exon Smith4434d362014-05-07 22:36:11 +00002208 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
Manman Renb0b3af72015-12-17 00:42:36 +00002209
2210 if (isThreadWrapperReplaceable(VD, CGM)) {
2211 Wrapper->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2212 Wrapper->addFnAttr(llvm::Attribute::NoUnwind);
2213 }
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002214 return Wrapper;
2215}
2216
2217void ItaniumCXXABI::EmitThreadLocalInitFuncs(
Richard Smith5a99c492015-12-01 01:10:48 +00002218 CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals,
2219 ArrayRef<llvm::Function *> CXXThreadLocalInits,
2220 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) {
David Majnemerb3341ea2014-10-05 05:05:40 +00002221 llvm::Function *InitFunc = nullptr;
2222 if (!CXXThreadLocalInits.empty()) {
2223 // Generate a guarded initialization function.
2224 llvm::FunctionType *FTy =
2225 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
Akira Hatanaka7791f1a42015-10-31 01:28:07 +00002226 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
2227 InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init", FI,
Alexey Samsonov1444bb92014-10-17 00:20:19 +00002228 SourceLocation(),
David Majnemerb3341ea2014-10-05 05:05:40 +00002229 /*TLS=*/true);
2230 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
2231 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
2232 llvm::GlobalVariable::InternalLinkage,
2233 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
2234 Guard->setThreadLocal(true);
John McCall7f416cc2015-09-08 08:05:57 +00002235
2236 CharUnits GuardAlign = CharUnits::One();
2237 Guard->setAlignment(GuardAlign.getQuantity());
2238
David Majnemerb3341ea2014-10-05 05:05:40 +00002239 CodeGenFunction(CGM)
John McCall7f416cc2015-09-08 08:05:57 +00002240 .GenerateCXXGlobalInitFunc(InitFunc, CXXThreadLocalInits,
2241 Address(Guard, GuardAlign));
David Majnemerb3341ea2014-10-05 05:05:40 +00002242 }
Richard Smith5a99c492015-12-01 01:10:48 +00002243 for (const VarDecl *VD : CXXThreadLocals) {
2244 llvm::GlobalVariable *Var =
2245 cast<llvm::GlobalVariable>(CGM.GetGlobalValue(CGM.getMangledName(VD)));
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002246
David Majnemer9b21c332014-07-11 20:28:10 +00002247 // Some targets require that all access to thread local variables go through
2248 // the thread wrapper. This means that we cannot attempt to create a thread
2249 // wrapper or a thread helper.
2250 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
2251 continue;
2252
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002253 // Mangle the name for the thread_local initialization function.
2254 SmallString<256> InitFnName;
2255 {
2256 llvm::raw_svector_ostream Out(InitFnName);
2257 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002258 }
2259
2260 // If we have a definition for the variable, emit the initialization
2261 // function as an alias to the global Init function (if any). Otherwise,
2262 // produce a declaration of the initialization function.
Craig Topper8a13c412014-05-21 05:09:00 +00002263 llvm::GlobalValue *Init = nullptr;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002264 bool InitIsInitFunc = false;
2265 if (VD->hasDefinition()) {
2266 InitIsInitFunc = true;
2267 if (InitFunc)
Rafael Espindola234405b2014-05-17 21:30:14 +00002268 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
2269 InitFunc);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002270 } else {
2271 // Emit a weak global function referring to the initialization function.
2272 // This function will not exist if the TU defining the thread_local
2273 // variable in question does not need any dynamic initialization for
2274 // its thread_local variables.
2275 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
2276 Init = llvm::Function::Create(
2277 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
2278 &CGM.getModule());
Akira Hatanaka26907f92016-01-15 03:34:06 +00002279 const CGFunctionInfo &FI = CGM.getTypes().arrangeFreeFunctionDeclaration(
2280 CGM.getContext().VoidTy, FunctionArgList(), FunctionType::ExtInfo(),
2281 false);
2282 CGM.SetLLVMFunctionAttributes(nullptr, FI, cast<llvm::Function>(Init));
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002283 }
2284
2285 if (Init)
2286 Init->setVisibility(Var->getVisibility());
2287
2288 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
2289 llvm::LLVMContext &Context = CGM.getModule().getContext();
2290 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
John McCall7f416cc2015-09-08 08:05:57 +00002291 CGBuilderTy Builder(CGM, Entry);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002292 if (InitIsInitFunc) {
2293 if (Init)
David Blaikie4ba525b2015-07-14 17:27:39 +00002294 Builder.CreateCall(Init);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002295 } else {
2296 // Don't know whether we have an init function. Call it if it exists.
2297 llvm::Value *Have = Builder.CreateIsNotNull(Init);
2298 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2299 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2300 Builder.CreateCondBr(Have, InitBB, ExitBB);
2301
2302 Builder.SetInsertPoint(InitBB);
David Blaikie4ba525b2015-07-14 17:27:39 +00002303 Builder.CreateCall(Init);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002304 Builder.CreateBr(ExitBB);
2305
2306 Builder.SetInsertPoint(ExitBB);
2307 }
2308
2309 // For a reference, the result of the wrapper function is a pointer to
2310 // the referenced object.
2311 llvm::Value *Val = Var;
2312 if (VD->getType()->isReferenceType()) {
John McCall7f416cc2015-09-08 08:05:57 +00002313 CharUnits Align = CGM.getContext().getDeclAlign(VD);
2314 Val = Builder.CreateAlignedLoad(Val, Align);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002315 }
Alexander Musmanf94c3182014-09-26 06:28:25 +00002316 if (Val->getType() != Wrapper->getReturnType())
2317 Val = Builder.CreatePointerBitCastOrAddrSpaceCast(
2318 Val, Wrapper->getReturnType(), "");
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002319 Builder.CreateRet(Val);
2320 }
2321}
2322
Richard Smith0f383742014-03-26 22:48:22 +00002323LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2324 const VarDecl *VD,
2325 QualType LValType) {
Richard Smith5a99c492015-12-01 01:10:48 +00002326 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD);
Alexander Musmanf94c3182014-09-26 06:28:25 +00002327 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002328
Manman Renb0b3af72015-12-17 00:42:36 +00002329 llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper);
2330 if (isThreadWrapperReplaceable(VD, CGF.CGM))
2331 CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002332
2333 LValue LV;
2334 if (VD->getType()->isReferenceType())
Manman Renb0b3af72015-12-17 00:42:36 +00002335 LV = CGF.MakeNaturalAlignAddrLValue(CallVal, LValType);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002336 else
Manman Renb0b3af72015-12-17 00:42:36 +00002337 LV = CGF.MakeAddrLValue(CallVal, LValType,
2338 CGF.getContext().getDeclAlign(VD));
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002339 // FIXME: need setObjCGCLValueClass?
2340 return LV;
2341}
Peter Collingbourne66f82e62013-06-28 20:45:28 +00002342
2343/// Return whether the given global decl needs a VTT parameter, which it does
2344/// if it's a base constructor or destructor with virtual bases.
2345bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
2346 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
2347
2348 // We don't have any virtual bases, just return early.
2349 if (!MD->getParent()->getNumVBases())
2350 return false;
2351
2352 // Check if we have a base constructor.
2353 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
2354 return true;
2355
2356 // Check if we have a base destructor.
2357 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2358 return true;
2359
2360 return false;
2361}
David Majnemere2cb8d12014-07-07 06:20:47 +00002362
2363namespace {
2364class ItaniumRTTIBuilder {
2365 CodeGenModule &CGM; // Per-module state.
2366 llvm::LLVMContext &VMContext;
2367 const ItaniumCXXABI &CXXABI; // Per-module state.
2368
2369 /// Fields - The fields of the RTTI descriptor currently being built.
2370 SmallVector<llvm::Constant *, 16> Fields;
2371
2372 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2373 llvm::GlobalVariable *
2374 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2375
2376 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2377 /// descriptor of the given type.
2378 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2379
2380 /// BuildVTablePointer - Build the vtable pointer for the given type.
2381 void BuildVTablePointer(const Type *Ty);
2382
2383 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2384 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2385 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2386
2387 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2388 /// classes with bases that do not satisfy the abi::__si_class_type_info
2389 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2390 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2391
2392 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2393 /// for pointer types.
2394 void BuildPointerTypeInfo(QualType PointeeTy);
2395
2396 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2397 /// type_info for an object type.
2398 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2399
2400 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2401 /// struct, used for member pointer types.
2402 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2403
2404public:
2405 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2406 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2407
2408 // Pointer type info flags.
2409 enum {
2410 /// PTI_Const - Type has const qualifier.
2411 PTI_Const = 0x1,
2412
2413 /// PTI_Volatile - Type has volatile qualifier.
2414 PTI_Volatile = 0x2,
2415
2416 /// PTI_Restrict - Type has restrict qualifier.
2417 PTI_Restrict = 0x4,
2418
2419 /// PTI_Incomplete - Type is incomplete.
2420 PTI_Incomplete = 0x8,
2421
2422 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2423 /// (in pointer to member).
2424 PTI_ContainingClassIncomplete = 0x10
2425 };
2426
2427 // VMI type info flags.
2428 enum {
2429 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2430 VMI_NonDiamondRepeat = 0x1,
2431
2432 /// VMI_DiamondShaped - Class is diamond shaped.
2433 VMI_DiamondShaped = 0x2
2434 };
2435
2436 // Base class type info flags.
2437 enum {
2438 /// BCTI_Virtual - Base class is virtual.
2439 BCTI_Virtual = 0x1,
2440
2441 /// BCTI_Public - Base class is public.
2442 BCTI_Public = 0x2
2443 };
2444
2445 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2446 ///
2447 /// \param Force - true to force the creation of this RTTI value
2448 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2449};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002450}
David Majnemere2cb8d12014-07-07 06:20:47 +00002451
2452llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2453 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002454 SmallString<256> Name;
2455 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002456 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002457
2458 // We know that the mangled name of the type starts at index 4 of the
2459 // mangled name of the typename, so we can just index into it in order to
2460 // get the mangled name of the type.
2461 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2462 Name.substr(4));
2463
2464 llvm::GlobalVariable *GV =
2465 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2466
2467 GV->setInitializer(Init);
2468
2469 return GV;
2470}
2471
2472llvm::Constant *
2473ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2474 // Mangle the RTTI name.
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002475 SmallString<256> Name;
2476 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002477 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002478
2479 // Look for an existing global.
2480 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2481
2482 if (!GV) {
2483 // Create a new global variable.
2484 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2485 /*Constant=*/true,
2486 llvm::GlobalValue::ExternalLinkage, nullptr,
2487 Name);
David Majnemer1fb1a042014-11-07 07:26:38 +00002488 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2489 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2490 if (RD->hasAttr<DLLImportAttr>())
2491 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2492 }
David Majnemere2cb8d12014-07-07 06:20:47 +00002493 }
2494
2495 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2496}
2497
2498/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2499/// info for that type is defined in the standard library.
2500static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2501 // Itanium C++ ABI 2.9.2:
2502 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2503 // the run-time support library. Specifically, the run-time support
2504 // library should contain type_info objects for the types X, X* and
2505 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2506 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2507 // long, unsigned long, long long, unsigned long long, float, double,
2508 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2509 // half-precision floating point types.
2510 switch (Ty->getKind()) {
2511 case BuiltinType::Void:
2512 case BuiltinType::NullPtr:
2513 case BuiltinType::Bool:
2514 case BuiltinType::WChar_S:
2515 case BuiltinType::WChar_U:
2516 case BuiltinType::Char_U:
2517 case BuiltinType::Char_S:
2518 case BuiltinType::UChar:
2519 case BuiltinType::SChar:
2520 case BuiltinType::Short:
2521 case BuiltinType::UShort:
2522 case BuiltinType::Int:
2523 case BuiltinType::UInt:
2524 case BuiltinType::Long:
2525 case BuiltinType::ULong:
2526 case BuiltinType::LongLong:
2527 case BuiltinType::ULongLong:
2528 case BuiltinType::Half:
2529 case BuiltinType::Float:
2530 case BuiltinType::Double:
2531 case BuiltinType::LongDouble:
2532 case BuiltinType::Char16:
2533 case BuiltinType::Char32:
2534 case BuiltinType::Int128:
2535 case BuiltinType::UInt128:
2536 case BuiltinType::OCLImage1d:
2537 case BuiltinType::OCLImage1dArray:
2538 case BuiltinType::OCLImage1dBuffer:
2539 case BuiltinType::OCLImage2d:
2540 case BuiltinType::OCLImage2dArray:
Alexey Bader9c8453f2015-09-15 11:18:52 +00002541 case BuiltinType::OCLImage2dDepth:
2542 case BuiltinType::OCLImage2dArrayDepth:
2543 case BuiltinType::OCLImage2dMSAA:
2544 case BuiltinType::OCLImage2dArrayMSAA:
2545 case BuiltinType::OCLImage2dMSAADepth:
2546 case BuiltinType::OCLImage2dArrayMSAADepth:
David Majnemere2cb8d12014-07-07 06:20:47 +00002547 case BuiltinType::OCLImage3d:
2548 case BuiltinType::OCLSampler:
2549 case BuiltinType::OCLEvent:
Alexey Bader9c8453f2015-09-15 11:18:52 +00002550 case BuiltinType::OCLClkEvent:
2551 case BuiltinType::OCLQueue:
2552 case BuiltinType::OCLNDRange:
2553 case BuiltinType::OCLReserveID:
David Majnemere2cb8d12014-07-07 06:20:47 +00002554 return true;
2555
2556 case BuiltinType::Dependent:
2557#define BUILTIN_TYPE(Id, SingletonId)
2558#define PLACEHOLDER_TYPE(Id, SingletonId) \
2559 case BuiltinType::Id:
2560#include "clang/AST/BuiltinTypes.def"
2561 llvm_unreachable("asking for RRTI for a placeholder type!");
2562
2563 case BuiltinType::ObjCId:
2564 case BuiltinType::ObjCClass:
2565 case BuiltinType::ObjCSel:
2566 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2567 }
2568
2569 llvm_unreachable("Invalid BuiltinType Kind!");
2570}
2571
2572static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2573 QualType PointeeTy = PointerTy->getPointeeType();
2574 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2575 if (!BuiltinTy)
2576 return false;
2577
2578 // Check the qualifiers.
2579 Qualifiers Quals = PointeeTy.getQualifiers();
2580 Quals.removeConst();
2581
2582 if (!Quals.empty())
2583 return false;
2584
2585 return TypeInfoIsInStandardLibrary(BuiltinTy);
2586}
2587
2588/// IsStandardLibraryRTTIDescriptor - Returns whether the type
2589/// information for the given type exists in the standard library.
2590static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2591 // Type info for builtin types is defined in the standard library.
2592 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2593 return TypeInfoIsInStandardLibrary(BuiltinTy);
2594
2595 // Type info for some pointer types to builtin types is defined in the
2596 // standard library.
2597 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2598 return TypeInfoIsInStandardLibrary(PointerTy);
2599
2600 return false;
2601}
2602
2603/// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2604/// the given type exists somewhere else, and that we should not emit the type
2605/// information in this translation unit. Assumes that it is not a
2606/// standard-library type.
2607static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2608 QualType Ty) {
2609 ASTContext &Context = CGM.getContext();
2610
2611 // If RTTI is disabled, assume it might be disabled in the
2612 // translation unit that defines any potential key function, too.
2613 if (!Context.getLangOpts().RTTI) return false;
2614
2615 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2616 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2617 if (!RD->hasDefinition())
2618 return false;
2619
2620 if (!RD->isDynamicClass())
2621 return false;
2622
2623 // FIXME: this may need to be reconsidered if the key function
2624 // changes.
David Majnemerbe9022c2015-08-06 20:56:55 +00002625 // N.B. We must always emit the RTTI data ourselves if there exists a key
2626 // function.
2627 bool IsDLLImport = RD->hasAttr<DLLImportAttr>();
David Majnemer1fb1a042014-11-07 07:26:38 +00002628 if (CGM.getVTables().isVTableExternal(RD))
David Majnemerbe9022c2015-08-06 20:56:55 +00002629 return IsDLLImport ? false : true;
David Majnemer1fb1a042014-11-07 07:26:38 +00002630
David Majnemerbe9022c2015-08-06 20:56:55 +00002631 if (IsDLLImport)
David Majnemer1fb1a042014-11-07 07:26:38 +00002632 return true;
David Majnemere2cb8d12014-07-07 06:20:47 +00002633 }
2634
2635 return false;
2636}
2637
2638/// IsIncompleteClassType - Returns whether the given record type is incomplete.
2639static bool IsIncompleteClassType(const RecordType *RecordTy) {
2640 return !RecordTy->getDecl()->isCompleteDefinition();
2641}
2642
2643/// ContainsIncompleteClassType - Returns whether the given type contains an
2644/// incomplete class type. This is true if
2645///
2646/// * The given type is an incomplete class type.
2647/// * The given type is a pointer type whose pointee type contains an
2648/// incomplete class type.
2649/// * The given type is a member pointer type whose class is an incomplete
2650/// class type.
2651/// * The given type is a member pointer type whoise pointee type contains an
2652/// incomplete class type.
2653/// is an indirect or direct pointer to an incomplete class type.
2654static bool ContainsIncompleteClassType(QualType Ty) {
2655 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2656 if (IsIncompleteClassType(RecordTy))
2657 return true;
2658 }
2659
2660 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2661 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2662
2663 if (const MemberPointerType *MemberPointerTy =
2664 dyn_cast<MemberPointerType>(Ty)) {
2665 // Check if the class type is incomplete.
2666 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2667 if (IsIncompleteClassType(ClassType))
2668 return true;
2669
2670 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2671 }
2672
2673 return false;
2674}
2675
2676// CanUseSingleInheritance - Return whether the given record decl has a "single,
2677// public, non-virtual base at offset zero (i.e. the derived class is dynamic
2678// iff the base is)", according to Itanium C++ ABI, 2.95p6b.
2679static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2680 // Check the number of bases.
2681 if (RD->getNumBases() != 1)
2682 return false;
2683
2684 // Get the base.
2685 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2686
2687 // Check that the base is not virtual.
2688 if (Base->isVirtual())
2689 return false;
2690
2691 // Check that the base is public.
2692 if (Base->getAccessSpecifier() != AS_public)
2693 return false;
2694
2695 // Check that the class is dynamic iff the base is.
2696 const CXXRecordDecl *BaseDecl =
2697 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2698 if (!BaseDecl->isEmpty() &&
2699 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2700 return false;
2701
2702 return true;
2703}
2704
2705void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2706 // abi::__class_type_info.
2707 static const char * const ClassTypeInfo =
2708 "_ZTVN10__cxxabiv117__class_type_infoE";
2709 // abi::__si_class_type_info.
2710 static const char * const SIClassTypeInfo =
2711 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2712 // abi::__vmi_class_type_info.
2713 static const char * const VMIClassTypeInfo =
2714 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2715
2716 const char *VTableName = nullptr;
2717
2718 switch (Ty->getTypeClass()) {
2719#define TYPE(Class, Base)
2720#define ABSTRACT_TYPE(Class, Base)
2721#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2722#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2723#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2724#include "clang/AST/TypeNodes.def"
2725 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2726
2727 case Type::LValueReference:
2728 case Type::RValueReference:
2729 llvm_unreachable("References shouldn't get here");
2730
2731 case Type::Auto:
2732 llvm_unreachable("Undeduced auto type shouldn't get here");
2733
Xiuli Pan9c14e282016-01-09 12:53:17 +00002734 case Type::Pipe:
2735 llvm_unreachable("Pipe types shouldn't get here");
2736
David Majnemere2cb8d12014-07-07 06:20:47 +00002737 case Type::Builtin:
2738 // GCC treats vector and complex types as fundamental types.
2739 case Type::Vector:
2740 case Type::ExtVector:
2741 case Type::Complex:
2742 case Type::Atomic:
2743 // FIXME: GCC treats block pointers as fundamental types?!
2744 case Type::BlockPointer:
2745 // abi::__fundamental_type_info.
2746 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2747 break;
2748
2749 case Type::ConstantArray:
2750 case Type::IncompleteArray:
2751 case Type::VariableArray:
2752 // abi::__array_type_info.
2753 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2754 break;
2755
2756 case Type::FunctionNoProto:
2757 case Type::FunctionProto:
2758 // abi::__function_type_info.
2759 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2760 break;
2761
2762 case Type::Enum:
2763 // abi::__enum_type_info.
2764 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2765 break;
2766
2767 case Type::Record: {
2768 const CXXRecordDecl *RD =
2769 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2770
2771 if (!RD->hasDefinition() || !RD->getNumBases()) {
2772 VTableName = ClassTypeInfo;
2773 } else if (CanUseSingleInheritance(RD)) {
2774 VTableName = SIClassTypeInfo;
2775 } else {
2776 VTableName = VMIClassTypeInfo;
2777 }
2778
2779 break;
2780 }
2781
2782 case Type::ObjCObject:
2783 // Ignore protocol qualifiers.
2784 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2785
2786 // Handle id and Class.
2787 if (isa<BuiltinType>(Ty)) {
2788 VTableName = ClassTypeInfo;
2789 break;
2790 }
2791
2792 assert(isa<ObjCInterfaceType>(Ty));
2793 // Fall through.
2794
2795 case Type::ObjCInterface:
2796 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2797 VTableName = SIClassTypeInfo;
2798 } else {
2799 VTableName = ClassTypeInfo;
2800 }
2801 break;
2802
2803 case Type::ObjCObjectPointer:
2804 case Type::Pointer:
2805 // abi::__pointer_type_info.
2806 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2807 break;
2808
2809 case Type::MemberPointer:
2810 // abi::__pointer_to_member_type_info.
2811 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2812 break;
2813 }
2814
2815 llvm::Constant *VTable =
2816 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2817
2818 llvm::Type *PtrDiffTy =
2819 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2820
2821 // The vtable address point is 2.
2822 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
David Blaikiee3b172a2015-04-02 18:55:21 +00002823 VTable =
2824 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two);
David Majnemere2cb8d12014-07-07 06:20:47 +00002825 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2826
2827 Fields.push_back(VTable);
2828}
2829
2830/// \brief Return the linkage that the type info and type info name constants
2831/// should have for the given type.
2832static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2833 QualType Ty) {
2834 // Itanium C++ ABI 2.9.5p7:
2835 // In addition, it and all of the intermediate abi::__pointer_type_info
2836 // structs in the chain down to the abi::__class_type_info for the
2837 // incomplete class type must be prevented from resolving to the
2838 // corresponding type_info structs for the complete class type, possibly
2839 // by making them local static objects. Finally, a dummy class RTTI is
2840 // generated for the incomplete type that will not resolve to the final
2841 // complete class RTTI (because the latter need not exist), possibly by
2842 // making it a local static object.
2843 if (ContainsIncompleteClassType(Ty))
2844 return llvm::GlobalValue::InternalLinkage;
2845
2846 switch (Ty->getLinkage()) {
2847 case NoLinkage:
2848 case InternalLinkage:
2849 case UniqueExternalLinkage:
2850 return llvm::GlobalValue::InternalLinkage;
2851
2852 case VisibleNoLinkage:
2853 case ExternalLinkage:
2854 if (!CGM.getLangOpts().RTTI) {
2855 // RTTI is not enabled, which means that this type info struct is going
2856 // to be used for exception handling. Give it linkonce_odr linkage.
2857 return llvm::GlobalValue::LinkOnceODRLinkage;
2858 }
2859
2860 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2861 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2862 if (RD->hasAttr<WeakAttr>())
2863 return llvm::GlobalValue::WeakODRLinkage;
David Majnemerbe9022c2015-08-06 20:56:55 +00002864 if (RD->isDynamicClass()) {
2865 llvm::GlobalValue::LinkageTypes LT = CGM.getVTableLinkage(RD);
2866 // MinGW won't export the RTTI information when there is a key function.
2867 // Make sure we emit our own copy instead of attempting to dllimport it.
2868 if (RD->hasAttr<DLLImportAttr>() &&
2869 llvm::GlobalValue::isAvailableExternallyLinkage(LT))
2870 LT = llvm::GlobalValue::LinkOnceODRLinkage;
2871 return LT;
2872 }
David Majnemere2cb8d12014-07-07 06:20:47 +00002873 }
2874
2875 return llvm::GlobalValue::LinkOnceODRLinkage;
2876 }
2877
2878 llvm_unreachable("Invalid linkage!");
2879}
2880
2881llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2882 // We want to operate on the canonical type.
2883 Ty = CGM.getContext().getCanonicalType(Ty);
2884
2885 // Check if we've already emitted an RTTI descriptor for this type.
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002886 SmallString<256> Name;
2887 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002888 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002889
2890 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2891 if (OldGV && !OldGV->isDeclaration()) {
2892 assert(!OldGV->hasAvailableExternallyLinkage() &&
2893 "available_externally typeinfos not yet implemented");
2894
2895 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2896 }
2897
2898 // Check if there is already an external RTTI descriptor for this type.
2899 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2900 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2901 return GetAddrOfExternalRTTIDescriptor(Ty);
2902
2903 // Emit the standard library with external linkage.
2904 llvm::GlobalVariable::LinkageTypes Linkage;
2905 if (IsStdLib)
2906 Linkage = llvm::GlobalValue::ExternalLinkage;
2907 else
2908 Linkage = getTypeInfoLinkage(CGM, Ty);
2909
2910 // Add the vtable pointer.
2911 BuildVTablePointer(cast<Type>(Ty));
2912
2913 // And the name.
2914 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2915 llvm::Constant *TypeNameField;
2916
2917 // If we're supposed to demote the visibility, be sure to set a flag
2918 // to use a string comparison for type_info comparisons.
2919 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2920 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2921 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2922 // The flag is the sign bit, which on ARM64 is defined to be clear
2923 // for global pointers. This is very ARM64-specific.
2924 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2925 llvm::Constant *flag =
2926 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2927 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2928 TypeNameField =
2929 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2930 } else {
2931 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2932 }
2933 Fields.push_back(TypeNameField);
2934
2935 switch (Ty->getTypeClass()) {
2936#define TYPE(Class, Base)
2937#define ABSTRACT_TYPE(Class, Base)
2938#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2939#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2940#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2941#include "clang/AST/TypeNodes.def"
2942 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2943
2944 // GCC treats vector types as fundamental types.
2945 case Type::Builtin:
2946 case Type::Vector:
2947 case Type::ExtVector:
2948 case Type::Complex:
2949 case Type::BlockPointer:
2950 // Itanium C++ ABI 2.9.5p4:
2951 // abi::__fundamental_type_info adds no data members to std::type_info.
2952 break;
2953
2954 case Type::LValueReference:
2955 case Type::RValueReference:
2956 llvm_unreachable("References shouldn't get here");
2957
2958 case Type::Auto:
2959 llvm_unreachable("Undeduced auto type shouldn't get here");
2960
Xiuli Pan9c14e282016-01-09 12:53:17 +00002961 case Type::Pipe:
2962 llvm_unreachable("Pipe type shouldn't get here");
2963
David Majnemere2cb8d12014-07-07 06:20:47 +00002964 case Type::ConstantArray:
2965 case Type::IncompleteArray:
2966 case Type::VariableArray:
2967 // Itanium C++ ABI 2.9.5p5:
2968 // abi::__array_type_info adds no data members to std::type_info.
2969 break;
2970
2971 case Type::FunctionNoProto:
2972 case Type::FunctionProto:
2973 // Itanium C++ ABI 2.9.5p5:
2974 // abi::__function_type_info adds no data members to std::type_info.
2975 break;
2976
2977 case Type::Enum:
2978 // Itanium C++ ABI 2.9.5p5:
2979 // abi::__enum_type_info adds no data members to std::type_info.
2980 break;
2981
2982 case Type::Record: {
2983 const CXXRecordDecl *RD =
2984 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2985 if (!RD->hasDefinition() || !RD->getNumBases()) {
2986 // We don't need to emit any fields.
2987 break;
2988 }
2989
2990 if (CanUseSingleInheritance(RD))
2991 BuildSIClassTypeInfo(RD);
2992 else
2993 BuildVMIClassTypeInfo(RD);
2994
2995 break;
2996 }
2997
2998 case Type::ObjCObject:
2999 case Type::ObjCInterface:
3000 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
3001 break;
3002
3003 case Type::ObjCObjectPointer:
3004 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
3005 break;
3006
3007 case Type::Pointer:
3008 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
3009 break;
3010
3011 case Type::MemberPointer:
3012 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
3013 break;
3014
3015 case Type::Atomic:
3016 // No fields, at least for the moment.
3017 break;
3018 }
3019
3020 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
3021
Rafael Espindolacb92c192015-01-15 23:18:01 +00003022 llvm::Module &M = CGM.getModule();
David Majnemere2cb8d12014-07-07 06:20:47 +00003023 llvm::GlobalVariable *GV =
Rafael Espindolacb92c192015-01-15 23:18:01 +00003024 new llvm::GlobalVariable(M, Init->getType(),
3025 /*Constant=*/true, Linkage, Init, Name);
3026
David Majnemere2cb8d12014-07-07 06:20:47 +00003027 // If there's already an old global variable, replace it with the new one.
3028 if (OldGV) {
3029 GV->takeName(OldGV);
3030 llvm::Constant *NewPtr =
3031 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
3032 OldGV->replaceAllUsesWith(NewPtr);
3033 OldGV->eraseFromParent();
3034 }
3035
Yaron Keren04da2382015-07-29 15:42:28 +00003036 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
3037 GV->setComdat(M.getOrInsertComdat(GV->getName()));
3038
David Majnemere2cb8d12014-07-07 06:20:47 +00003039 // The Itanium ABI specifies that type_info objects must be globally
3040 // unique, with one exception: if the type is an incomplete class
3041 // type or a (possibly indirect) pointer to one. That exception
3042 // affects the general case of comparing type_info objects produced
3043 // by the typeid operator, which is why the comparison operators on
3044 // std::type_info generally use the type_info name pointers instead
3045 // of the object addresses. However, the language's built-in uses
3046 // of RTTI generally require class types to be complete, even when
3047 // manipulating pointers to those class types. This allows the
3048 // implementation of dynamic_cast to rely on address equality tests,
3049 // which is much faster.
3050
3051 // All of this is to say that it's important that both the type_info
3052 // object and the type_info name be uniqued when weakly emitted.
3053
3054 // Give the type_info object and name the formal visibility of the
3055 // type itself.
3056 llvm::GlobalValue::VisibilityTypes llvmVisibility;
3057 if (llvm::GlobalValue::isLocalLinkage(Linkage))
3058 // If the linkage is local, only default visibility makes sense.
3059 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
3060 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
3061 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
3062 else
3063 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
3064 TypeName->setVisibility(llvmVisibility);
3065 GV->setVisibility(llvmVisibility);
3066
3067 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3068}
3069
3070/// ComputeQualifierFlags - Compute the pointer type info flags from the
3071/// given qualifier.
3072static unsigned ComputeQualifierFlags(Qualifiers Quals) {
3073 unsigned Flags = 0;
3074
3075 if (Quals.hasConst())
3076 Flags |= ItaniumRTTIBuilder::PTI_Const;
3077 if (Quals.hasVolatile())
3078 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
3079 if (Quals.hasRestrict())
3080 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
3081
3082 return Flags;
3083}
3084
3085/// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
3086/// for the given Objective-C object type.
3087void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
3088 // Drop qualifiers.
3089 const Type *T = OT->getBaseType().getTypePtr();
3090 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
3091
3092 // The builtin types are abi::__class_type_infos and don't require
3093 // extra fields.
3094 if (isa<BuiltinType>(T)) return;
3095
3096 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
3097 ObjCInterfaceDecl *Super = Class->getSuperClass();
3098
3099 // Root classes are also __class_type_info.
3100 if (!Super) return;
3101
3102 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
3103
3104 // Everything else is single inheritance.
3105 llvm::Constant *BaseTypeInfo =
3106 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
3107 Fields.push_back(BaseTypeInfo);
3108}
3109
3110/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3111/// inheritance, according to the Itanium C++ ABI, 2.95p6b.
3112void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
3113 // Itanium C++ ABI 2.9.5p6b:
3114 // It adds to abi::__class_type_info a single member pointing to the
3115 // type_info structure for the base type,
3116 llvm::Constant *BaseTypeInfo =
3117 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
3118 Fields.push_back(BaseTypeInfo);
3119}
3120
3121namespace {
3122 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
3123 /// a class hierarchy.
3124 struct SeenBases {
3125 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
3126 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
3127 };
3128}
3129
3130/// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
3131/// abi::__vmi_class_type_info.
3132///
3133static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
3134 SeenBases &Bases) {
3135
3136 unsigned Flags = 0;
3137
3138 const CXXRecordDecl *BaseDecl =
3139 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
3140
3141 if (Base->isVirtual()) {
3142 // Mark the virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00003143 if (!Bases.VirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003144 // If this virtual base has been seen before, then the class is diamond
3145 // shaped.
3146 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
3147 } else {
3148 if (Bases.NonVirtualBases.count(BaseDecl))
3149 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3150 }
3151 } else {
3152 // Mark the non-virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00003153 if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003154 // If this non-virtual base has been seen before, then the class has non-
3155 // diamond shaped repeated inheritance.
3156 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3157 } else {
3158 if (Bases.VirtualBases.count(BaseDecl))
3159 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3160 }
3161 }
3162
3163 // Walk all bases.
3164 for (const auto &I : BaseDecl->bases())
3165 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3166
3167 return Flags;
3168}
3169
3170static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
3171 unsigned Flags = 0;
3172 SeenBases Bases;
3173
3174 // Walk all bases.
3175 for (const auto &I : RD->bases())
3176 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3177
3178 return Flags;
3179}
3180
3181/// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
3182/// classes with bases that do not satisfy the abi::__si_class_type_info
3183/// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
3184void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
3185 llvm::Type *UnsignedIntLTy =
3186 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3187
3188 // Itanium C++ ABI 2.9.5p6c:
3189 // __flags is a word with flags describing details about the class
3190 // structure, which may be referenced by using the __flags_masks
3191 // enumeration. These flags refer to both direct and indirect bases.
3192 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
3193 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3194
3195 // Itanium C++ ABI 2.9.5p6c:
3196 // __base_count is a word with the number of direct proper base class
3197 // descriptions that follow.
3198 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
3199
3200 if (!RD->getNumBases())
3201 return;
3202
3203 llvm::Type *LongLTy =
3204 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
3205
3206 // Now add the base class descriptions.
3207
3208 // Itanium C++ ABI 2.9.5p6c:
3209 // __base_info[] is an array of base class descriptions -- one for every
3210 // direct proper base. Each description is of the type:
3211 //
3212 // struct abi::__base_class_type_info {
3213 // public:
3214 // const __class_type_info *__base_type;
3215 // long __offset_flags;
3216 //
3217 // enum __offset_flags_masks {
3218 // __virtual_mask = 0x1,
3219 // __public_mask = 0x2,
3220 // __offset_shift = 8
3221 // };
3222 // };
3223 for (const auto &Base : RD->bases()) {
3224 // The __base_type member points to the RTTI for the base type.
3225 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
3226
3227 const CXXRecordDecl *BaseDecl =
3228 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
3229
3230 int64_t OffsetFlags = 0;
3231
3232 // All but the lower 8 bits of __offset_flags are a signed offset.
3233 // For a non-virtual base, this is the offset in the object of the base
3234 // subobject. For a virtual base, this is the offset in the virtual table of
3235 // the virtual base offset for the virtual base referenced (negative).
3236 CharUnits Offset;
3237 if (Base.isVirtual())
3238 Offset =
3239 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
3240 else {
3241 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
3242 Offset = Layout.getBaseClassOffset(BaseDecl);
3243 };
3244
3245 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
3246
3247 // The low-order byte of __offset_flags contains flags, as given by the
3248 // masks from the enumeration __offset_flags_masks.
3249 if (Base.isVirtual())
3250 OffsetFlags |= BCTI_Virtual;
3251 if (Base.getAccessSpecifier() == AS_public)
3252 OffsetFlags |= BCTI_Public;
3253
3254 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
3255 }
3256}
3257
3258/// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
3259/// used for pointer types.
3260void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
3261 Qualifiers Quals;
3262 QualType UnqualifiedPointeeTy =
3263 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3264
3265 // Itanium C++ ABI 2.9.5p7:
3266 // __flags is a flag word describing the cv-qualification and other
3267 // attributes of the type pointed to
3268 unsigned Flags = ComputeQualifierFlags(Quals);
3269
3270 // Itanium C++ ABI 2.9.5p7:
3271 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3272 // incomplete class type, the incomplete target type flag is set.
3273 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3274 Flags |= PTI_Incomplete;
3275
3276 llvm::Type *UnsignedIntLTy =
3277 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3278 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3279
3280 // Itanium C++ ABI 2.9.5p7:
3281 // __pointee is a pointer to the std::type_info derivation for the
3282 // unqualified type being pointed to.
3283 llvm::Constant *PointeeTypeInfo =
3284 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3285 Fields.push_back(PointeeTypeInfo);
3286}
3287
3288/// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
3289/// struct, used for member pointer types.
3290void
3291ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
3292 QualType PointeeTy = Ty->getPointeeType();
3293
3294 Qualifiers Quals;
3295 QualType UnqualifiedPointeeTy =
3296 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3297
3298 // Itanium C++ ABI 2.9.5p7:
3299 // __flags is a flag word describing the cv-qualification and other
3300 // attributes of the type pointed to.
3301 unsigned Flags = ComputeQualifierFlags(Quals);
3302
3303 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
3304
3305 // Itanium C++ ABI 2.9.5p7:
3306 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3307 // incomplete class type, the incomplete target type flag is set.
3308 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3309 Flags |= PTI_Incomplete;
3310
3311 if (IsIncompleteClassType(ClassType))
3312 Flags |= PTI_ContainingClassIncomplete;
3313
3314 llvm::Type *UnsignedIntLTy =
3315 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3316 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3317
3318 // Itanium C++ ABI 2.9.5p7:
3319 // __pointee is a pointer to the std::type_info derivation for the
3320 // unqualified type being pointed to.
3321 llvm::Constant *PointeeTypeInfo =
3322 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3323 Fields.push_back(PointeeTypeInfo);
3324
3325 // Itanium C++ ABI 2.9.5p9:
3326 // __context is a pointer to an abi::__class_type_info corresponding to the
3327 // class type containing the member pointed to
3328 // (e.g., the "A" in "int A::*").
3329 Fields.push_back(
3330 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
3331}
3332
David Majnemer443250f2015-03-17 20:35:00 +00003333llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003334 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
3335}
3336
3337void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
3338 QualType PointerType = getContext().getPointerType(Type);
3339 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
3340 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
3341 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
3342 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
3343}
3344
3345void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
3346 QualType FundamentalTypes[] = {
3347 getContext().VoidTy, getContext().NullPtrTy,
3348 getContext().BoolTy, getContext().WCharTy,
3349 getContext().CharTy, getContext().UnsignedCharTy,
3350 getContext().SignedCharTy, getContext().ShortTy,
3351 getContext().UnsignedShortTy, getContext().IntTy,
3352 getContext().UnsignedIntTy, getContext().LongTy,
3353 getContext().UnsignedLongTy, getContext().LongLongTy,
3354 getContext().UnsignedLongLongTy, getContext().HalfTy,
3355 getContext().FloatTy, getContext().DoubleTy,
3356 getContext().LongDoubleTy, getContext().Char16Ty,
3357 getContext().Char32Ty,
3358 };
3359 for (const QualType &FundamentalType : FundamentalTypes)
3360 EmitFundamentalRTTIDescriptor(FundamentalType);
3361}
3362
3363/// What sort of uniqueness rules should we use for the RTTI for the
3364/// given type?
3365ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
3366 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
3367 if (shouldRTTIBeUnique())
3368 return RUK_Unique;
3369
3370 // It's only necessary for linkonce_odr or weak_odr linkage.
3371 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
3372 Linkage != llvm::GlobalValue::WeakODRLinkage)
3373 return RUK_Unique;
3374
3375 // It's only necessary with default visibility.
3376 if (CanTy->getVisibility() != DefaultVisibility)
3377 return RUK_Unique;
3378
3379 // If we're not required to publish this symbol, hide it.
3380 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3381 return RUK_NonUniqueHidden;
3382
3383 // If we're required to publish this symbol, as we might be under an
3384 // explicit instantiation, leave it with default visibility but
3385 // enable string-comparisons.
3386 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
3387 return RUK_NonUniqueVisible;
3388}
Rafael Espindola91f68b42014-09-15 19:20:10 +00003389
Rafael Espindola1e4df922014-09-16 15:18:21 +00003390// Find out how to codegen the complete destructor and constructor
3391namespace {
3392enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
3393}
3394static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
3395 const CXXMethodDecl *MD) {
3396 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
3397 return StructorCodegen::Emit;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003398
Rafael Espindola1e4df922014-09-16 15:18:21 +00003399 // The complete and base structors are not equivalent if there are any virtual
3400 // bases, so emit separate functions.
3401 if (MD->getParent()->getNumVBases())
3402 return StructorCodegen::Emit;
3403
3404 GlobalDecl AliasDecl;
3405 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
3406 AliasDecl = GlobalDecl(DD, Dtor_Complete);
3407 } else {
3408 const auto *CD = cast<CXXConstructorDecl>(MD);
3409 AliasDecl = GlobalDecl(CD, Ctor_Complete);
3410 }
3411 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3412
3413 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
3414 return StructorCodegen::RAUW;
3415
3416 // FIXME: Should we allow available_externally aliases?
3417 if (!llvm::GlobalAlias::isValidLinkage(Linkage))
3418 return StructorCodegen::RAUW;
3419
Rafael Espindola0806f982014-09-16 20:19:43 +00003420 if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
3421 // Only ELF supports COMDATs with arbitrary names (C5/D5).
3422 if (CGM.getTarget().getTriple().isOSBinFormatELF())
3423 return StructorCodegen::COMDAT;
3424 return StructorCodegen::Emit;
3425 }
Rafael Espindola1e4df922014-09-16 15:18:21 +00003426
3427 return StructorCodegen::Alias;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003428}
3429
Rafael Espindola1e4df922014-09-16 15:18:21 +00003430static void emitConstructorDestructorAlias(CodeGenModule &CGM,
3431 GlobalDecl AliasDecl,
3432 GlobalDecl TargetDecl) {
3433 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3434
3435 StringRef MangledName = CGM.getMangledName(AliasDecl);
3436 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
3437 if (Entry && !Entry->isDeclaration())
3438 return;
3439
3440 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
Rafael Espindola1e4df922014-09-16 15:18:21 +00003441
3442 // Create the alias with no name.
David Blaikie2a791d72015-09-14 18:38:22 +00003443 auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003444
3445 // Switch any previous uses to the alias.
3446 if (Entry) {
NAKAMURA Takumie9621042015-09-15 01:39:27 +00003447 assert(Entry->getType() == Aliasee->getType() &&
Rafael Espindola1e4df922014-09-16 15:18:21 +00003448 "declaration exists with different type");
3449 Alias->takeName(Entry);
3450 Entry->replaceAllUsesWith(Alias);
3451 Entry->eraseFromParent();
3452 } else {
3453 Alias->setName(MangledName);
3454 }
3455
3456 // Finally, set up the alias with its proper name and attributes.
Dario Domiziolic4fb8ca72014-09-19 22:06:24 +00003457 CGM.setAliasAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003458}
3459
3460void ItaniumCXXABI::emitCXXStructor(const CXXMethodDecl *MD,
3461 StructorType Type) {
3462 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
3463 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
3464
3465 StructorCodegen CGType = getCodegenToUse(CGM, MD);
3466
3467 if (Type == StructorType::Complete) {
3468 GlobalDecl CompleteDecl;
3469 GlobalDecl BaseDecl;
3470 if (CD) {
3471 CompleteDecl = GlobalDecl(CD, Ctor_Complete);
3472 BaseDecl = GlobalDecl(CD, Ctor_Base);
3473 } else {
3474 CompleteDecl = GlobalDecl(DD, Dtor_Complete);
3475 BaseDecl = GlobalDecl(DD, Dtor_Base);
3476 }
3477
3478 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
3479 emitConstructorDestructorAlias(CGM, CompleteDecl, BaseDecl);
3480 return;
3481 }
3482
3483 if (CGType == StructorCodegen::RAUW) {
3484 StringRef MangledName = CGM.getMangledName(CompleteDecl);
Andrey Bokhankocab58582015-08-31 13:20:44 +00003485 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003486 CGM.addReplacement(MangledName, Aliasee);
3487 return;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003488 }
3489 }
3490
3491 // The base destructor is equivalent to the base destructor of its
3492 // base class if there is exactly one non-virtual base class with a
3493 // non-trivial destructor, there are no fields with a non-trivial
3494 // destructor, and the body of the destructor is trivial.
Rafael Espindola1e4df922014-09-16 15:18:21 +00003495 if (DD && Type == StructorType::Base && CGType != StructorCodegen::COMDAT &&
3496 !CGM.TryEmitBaseDestructorAsAlias(DD))
Rafael Espindola91f68b42014-09-15 19:20:10 +00003497 return;
3498
Rafael Espindola1e4df922014-09-16 15:18:21 +00003499 llvm::Function *Fn = CGM.codegenCXXStructor(MD, Type);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003500
Rafael Espindola1e4df922014-09-16 15:18:21 +00003501 if (CGType == StructorCodegen::COMDAT) {
3502 SmallString<256> Buffer;
3503 llvm::raw_svector_ostream Out(Buffer);
3504 if (DD)
3505 getMangleContext().mangleCXXDtorComdat(DD, Out);
3506 else
3507 getMangleContext().mangleCXXCtorComdat(CD, Out);
3508 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
3509 Fn->setComdat(C);
Rafael Espindoladbee8a72015-01-15 21:36:08 +00003510 } else {
3511 CGM.maybeSetTrivialComdat(*MD, *Fn);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003512 }
Rafael Espindola91f68b42014-09-15 19:20:10 +00003513}
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003514
3515static llvm::Constant *getBeginCatchFn(CodeGenModule &CGM) {
3516 // void *__cxa_begin_catch(void*);
3517 llvm::FunctionType *FTy = llvm::FunctionType::get(
3518 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3519
3520 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
3521}
3522
3523static llvm::Constant *getEndCatchFn(CodeGenModule &CGM) {
3524 // void __cxa_end_catch();
3525 llvm::FunctionType *FTy =
3526 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
3527
3528 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
3529}
3530
3531static llvm::Constant *getGetExceptionPtrFn(CodeGenModule &CGM) {
3532 // void *__cxa_get_exception_ptr(void*);
3533 llvm::FunctionType *FTy = llvm::FunctionType::get(
3534 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3535
3536 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
3537}
3538
3539namespace {
3540 /// A cleanup to call __cxa_end_catch. In many cases, the caught
3541 /// exception type lets us state definitively that the thrown exception
3542 /// type does not have a destructor. In particular:
3543 /// - Catch-alls tell us nothing, so we have to conservatively
3544 /// assume that the thrown exception might have a destructor.
3545 /// - Catches by reference behave according to their base types.
3546 /// - Catches of non-record types will only trigger for exceptions
3547 /// of non-record types, which never have destructors.
3548 /// - Catches of record types can trigger for arbitrary subclasses
3549 /// of the caught type, so we have to assume the actual thrown
3550 /// exception type might have a throwing destructor, even if the
3551 /// caught type's destructor is trivial or nothrow.
David Blaikie7e70d682015-08-18 22:40:54 +00003552 struct CallEndCatch final : EHScopeStack::Cleanup {
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003553 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
3554 bool MightThrow;
3555
3556 void Emit(CodeGenFunction &CGF, Flags flags) override {
3557 if (!MightThrow) {
3558 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
3559 return;
3560 }
3561
3562 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
3563 }
3564 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +00003565}
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003566
3567/// Emits a call to __cxa_begin_catch and enters a cleanup to call
3568/// __cxa_end_catch.
3569///
3570/// \param EndMightThrow - true if __cxa_end_catch might throw
3571static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
3572 llvm::Value *Exn,
3573 bool EndMightThrow) {
3574 llvm::CallInst *call =
3575 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
3576
3577 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
3578
3579 return call;
3580}
3581
3582/// A "special initializer" callback for initializing a catch
3583/// parameter during catch initialization.
3584static void InitCatchParam(CodeGenFunction &CGF,
3585 const VarDecl &CatchParam,
John McCall7f416cc2015-09-08 08:05:57 +00003586 Address ParamAddr,
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003587 SourceLocation Loc) {
3588 // Load the exception from where the landing pad saved it.
3589 llvm::Value *Exn = CGF.getExceptionFromSlot();
3590
3591 CanQualType CatchType =
3592 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
3593 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
3594
3595 // If we're catching by reference, we can just cast the object
3596 // pointer to the appropriate pointer.
3597 if (isa<ReferenceType>(CatchType)) {
3598 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
3599 bool EndCatchMightThrow = CaughtType->isRecordType();
3600
3601 // __cxa_begin_catch returns the adjusted object pointer.
3602 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
3603
3604 // We have no way to tell the personality function that we're
3605 // catching by reference, so if we're catching a pointer,
3606 // __cxa_begin_catch will actually return that pointer by value.
3607 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
3608 QualType PointeeType = PT->getPointeeType();
3609
3610 // When catching by reference, generally we should just ignore
3611 // this by-value pointer and use the exception object instead.
3612 if (!PointeeType->isRecordType()) {
3613
3614 // Exn points to the struct _Unwind_Exception header, which
3615 // we have to skip past in order to reach the exception data.
3616 unsigned HeaderSize =
3617 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
3618 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize);
3619
3620 // However, if we're catching a pointer-to-record type that won't
3621 // work, because the personality function might have adjusted
3622 // the pointer. There's actually no way for us to fully satisfy
3623 // the language/ABI contract here: we can't use Exn because it
3624 // might have the wrong adjustment, but we can't use the by-value
3625 // pointer because it's off by a level of abstraction.
3626 //
3627 // The current solution is to dump the adjusted pointer into an
3628 // alloca, which breaks language semantics (because changing the
3629 // pointer doesn't change the exception) but at least works.
3630 // The better solution would be to filter out non-exact matches
3631 // and rethrow them, but this is tricky because the rethrow
3632 // really needs to be catchable by other sites at this landing
3633 // pad. The best solution is to fix the personality function.
3634 } else {
3635 // Pull the pointer for the reference type off.
3636 llvm::Type *PtrTy =
3637 cast<llvm::PointerType>(LLVMCatchTy)->getElementType();
3638
3639 // Create the temporary and write the adjusted pointer into it.
John McCall7f416cc2015-09-08 08:05:57 +00003640 Address ExnPtrTmp =
3641 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp");
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003642 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3643 CGF.Builder.CreateStore(Casted, ExnPtrTmp);
3644
3645 // Bind the reference to the temporary.
John McCall7f416cc2015-09-08 08:05:57 +00003646 AdjustedExn = ExnPtrTmp.getPointer();
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003647 }
3648 }
3649
3650 llvm::Value *ExnCast =
3651 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
3652 CGF.Builder.CreateStore(ExnCast, ParamAddr);
3653 return;
3654 }
3655
3656 // Scalars and complexes.
3657 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
3658 if (TEK != TEK_Aggregate) {
3659 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
3660
3661 // If the catch type is a pointer type, __cxa_begin_catch returns
3662 // the pointer by value.
3663 if (CatchType->hasPointerRepresentation()) {
3664 llvm::Value *CastExn =
3665 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
3666
3667 switch (CatchType.getQualifiers().getObjCLifetime()) {
3668 case Qualifiers::OCL_Strong:
3669 CastExn = CGF.EmitARCRetainNonBlock(CastExn);
3670 // fallthrough
3671
3672 case Qualifiers::OCL_None:
3673 case Qualifiers::OCL_ExplicitNone:
3674 case Qualifiers::OCL_Autoreleasing:
3675 CGF.Builder.CreateStore(CastExn, ParamAddr);
3676 return;
3677
3678 case Qualifiers::OCL_Weak:
3679 CGF.EmitARCInitWeak(ParamAddr, CastExn);
3680 return;
3681 }
3682 llvm_unreachable("bad ownership qualifier!");
3683 }
3684
3685 // Otherwise, it returns a pointer into the exception object.
3686
3687 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3688 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3689
3690 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType);
John McCall7f416cc2015-09-08 08:05:57 +00003691 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003692 switch (TEK) {
3693 case TEK_Complex:
3694 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
3695 /*init*/ true);
3696 return;
3697 case TEK_Scalar: {
3698 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
3699 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
3700 return;
3701 }
3702 case TEK_Aggregate:
3703 llvm_unreachable("evaluation kind filtered out!");
3704 }
3705 llvm_unreachable("bad evaluation kind");
3706 }
3707
3708 assert(isa<RecordType>(CatchType) && "unexpected catch type!");
John McCall7f416cc2015-09-08 08:05:57 +00003709 auto catchRD = CatchType->getAsCXXRecordDecl();
3710 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003711
3712 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3713
3714 // Check for a copy expression. If we don't have a copy expression,
3715 // that means a trivial copy is okay.
3716 const Expr *copyExpr = CatchParam.getInit();
3717 if (!copyExpr) {
3718 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
John McCall7f416cc2015-09-08 08:05:57 +00003719 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3720 caughtExnAlignment);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003721 CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType);
3722 return;
3723 }
3724
3725 // We have to call __cxa_get_exception_ptr to get the adjusted
3726 // pointer before copying.
3727 llvm::CallInst *rawAdjustedExn =
3728 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
3729
3730 // Cast that to the appropriate type.
John McCall7f416cc2015-09-08 08:05:57 +00003731 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3732 caughtExnAlignment);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003733
3734 // The copy expression is defined in terms of an OpaqueValueExpr.
3735 // Find it and map it to the adjusted expression.
3736 CodeGenFunction::OpaqueValueMapping
3737 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
3738 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
3739
3740 // Call the copy ctor in a terminate scope.
3741 CGF.EHStack.pushTerminate();
3742
3743 // Perform the copy construction.
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003744 CGF.EmitAggExpr(copyExpr,
John McCall7f416cc2015-09-08 08:05:57 +00003745 AggValueSlot::forAddr(ParamAddr, Qualifiers(),
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003746 AggValueSlot::IsNotDestructed,
3747 AggValueSlot::DoesNotNeedGCBarriers,
3748 AggValueSlot::IsNotAliased));
3749
3750 // Leave the terminate scope.
3751 CGF.EHStack.popTerminate();
3752
3753 // Undo the opaque value mapping.
3754 opaque.pop();
3755
3756 // Finally we can call __cxa_begin_catch.
3757 CallBeginCatch(CGF, Exn, true);
3758}
3759
3760/// Begins a catch statement by initializing the catch variable and
3761/// calling __cxa_begin_catch.
3762void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF,
3763 const CXXCatchStmt *S) {
3764 // We have to be very careful with the ordering of cleanups here:
3765 // C++ [except.throw]p4:
3766 // The destruction [of the exception temporary] occurs
3767 // immediately after the destruction of the object declared in
3768 // the exception-declaration in the handler.
3769 //
3770 // So the precise ordering is:
3771 // 1. Construct catch variable.
3772 // 2. __cxa_begin_catch
3773 // 3. Enter __cxa_end_catch cleanup
3774 // 4. Enter dtor cleanup
3775 //
3776 // We do this by using a slightly abnormal initialization process.
3777 // Delegation sequence:
3778 // - ExitCXXTryStmt opens a RunCleanupsScope
3779 // - EmitAutoVarAlloca creates the variable and debug info
3780 // - InitCatchParam initializes the variable from the exception
3781 // - CallBeginCatch calls __cxa_begin_catch
3782 // - CallBeginCatch enters the __cxa_end_catch cleanup
3783 // - EmitAutoVarCleanups enters the variable destructor cleanup
3784 // - EmitCXXTryStmt emits the code for the catch body
3785 // - EmitCXXTryStmt close the RunCleanupsScope
3786
3787 VarDecl *CatchParam = S->getExceptionDecl();
3788 if (!CatchParam) {
3789 llvm::Value *Exn = CGF.getExceptionFromSlot();
3790 CallBeginCatch(CGF, Exn, true);
3791 return;
3792 }
3793
3794 // Emit the local.
3795 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
3796 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart());
3797 CGF.EmitAutoVarCleanups(var);
3798}
3799
3800/// Get or define the following function:
3801/// void @__clang_call_terminate(i8* %exn) nounwind noreturn
3802/// This code is used only in C++.
3803static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) {
3804 llvm::FunctionType *fnTy =
3805 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3806 llvm::Constant *fnRef =
3807 CGM.CreateRuntimeFunction(fnTy, "__clang_call_terminate");
3808
3809 llvm::Function *fn = dyn_cast<llvm::Function>(fnRef);
3810 if (fn && fn->empty()) {
3811 fn->setDoesNotThrow();
3812 fn->setDoesNotReturn();
3813
3814 // What we really want is to massively penalize inlining without
3815 // forbidding it completely. The difference between that and
3816 // 'noinline' is negligible.
3817 fn->addFnAttr(llvm::Attribute::NoInline);
3818
3819 // Allow this function to be shared across translation units, but
3820 // we don't want it to turn into an exported symbol.
3821 fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
3822 fn->setVisibility(llvm::Function::HiddenVisibility);
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00003823 if (CGM.supportsCOMDAT())
3824 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003825
3826 // Set up the function.
3827 llvm::BasicBlock *entry =
3828 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
John McCall7f416cc2015-09-08 08:05:57 +00003829 CGBuilderTy builder(CGM, entry);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003830
3831 // Pull the exception pointer out of the parameter list.
3832 llvm::Value *exn = &*fn->arg_begin();
3833
3834 // Call __cxa_begin_catch(exn).
3835 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
3836 catchCall->setDoesNotThrow();
3837 catchCall->setCallingConv(CGM.getRuntimeCC());
3838
3839 // Call std::terminate().
David Blaikie4ba525b2015-07-14 17:27:39 +00003840 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn());
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003841 termCall->setDoesNotThrow();
3842 termCall->setDoesNotReturn();
3843 termCall->setCallingConv(CGM.getRuntimeCC());
3844
3845 // std::terminate cannot return.
3846 builder.CreateUnreachable();
3847 }
3848
3849 return fnRef;
3850}
3851
3852llvm::CallInst *
3853ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
3854 llvm::Value *Exn) {
3855 // In C++, we want to call __cxa_begin_catch() before terminating.
3856 if (Exn) {
3857 assert(CGF.CGM.getLangOpts().CPlusPlus);
3858 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn);
3859 }
3860 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
3861}