blob: 3b501c30e77ed2b9a14e62314a37685cc38c8be0 [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,
330 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
331 CXXThreadLocals,
332 ArrayRef<llvm::Function *> CXXThreadLocalInits,
333 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) override;
334
335 bool usesThreadWrapperFunction() const override { return true; }
Richard Smith0f383742014-03-26 22:48:22 +0000336 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
337 QualType LValType) override;
Peter Collingbourne66f82e62013-06-28 20:45:28 +0000338
Craig Topper4f12f102014-03-12 06:41:41 +0000339 bool NeedsVTTParameter(GlobalDecl GD) override;
David Majnemere2cb8d12014-07-07 06:20:47 +0000340
341 /**************************** RTTI Uniqueness ******************************/
342
343protected:
344 /// Returns true if the ABI requires RTTI type_info objects to be unique
345 /// across a program.
346 virtual bool shouldRTTIBeUnique() const { return true; }
347
348public:
349 /// What sort of unique-RTTI behavior should we use?
350 enum RTTIUniquenessKind {
351 /// We are guaranteeing, or need to guarantee, that the RTTI string
352 /// is unique.
353 RUK_Unique,
354
355 /// We are not guaranteeing uniqueness for the RTTI string, so we
356 /// can demote to hidden visibility but must use string comparisons.
357 RUK_NonUniqueHidden,
358
359 /// We are not guaranteeing uniqueness for the RTTI string, so we
360 /// have to use string comparisons, but we also have to emit it with
361 /// non-hidden visibility.
362 RUK_NonUniqueVisible
363 };
364
365 /// Return the required visibility status for the given type and linkage in
366 /// the current ABI.
367 RTTIUniquenessKind
368 classifyRTTIUniqueness(QualType CanTy,
369 llvm::GlobalValue::LinkageTypes Linkage) const;
370 friend class ItaniumRTTIBuilder;
Rafael Espindola91f68b42014-09-15 19:20:10 +0000371
372 void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override;
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000373
374 private:
Piotr Padlewski1d02f682015-08-19 20:09:09 +0000375 bool hasAnyUsedVirtualInlineFunction(const CXXRecordDecl *RD) const {
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000376 const auto &VtableLayout =
377 CGM.getItaniumVTableContext().getVTableLayout(RD);
378
379 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
Piotr Padlewski1d02f682015-08-19 20:09:09 +0000380 if (!VtableComponent.isUsedFunctionPointerKind())
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000381 continue;
382
Piotr Padlewski1d02f682015-08-19 20:09:09 +0000383 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
Piotr Padlewskia68a7872015-07-24 04:04:49 +0000384 if (Method->getCanonicalDecl()->isInlined())
385 return true;
386 }
387 return false;
388 }
Piotr Padlewskid679d7e2015-09-15 00:37:06 +0000389
390 bool isVTableHidden(const CXXRecordDecl *RD) const {
391 const auto &VtableLayout =
392 CGM.getItaniumVTableContext().getVTableLayout(RD);
393
394 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
395 if (VtableComponent.isRTTIKind()) {
396 const CXXRecordDecl *RTTIDecl = VtableComponent.getRTTIDecl();
397 if (RTTIDecl->getVisibility() == Visibility::HiddenVisibility)
398 return true;
399 } else if (VtableComponent.isUsedFunctionPointerKind()) {
400 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
401 if (Method->getVisibility() == Visibility::HiddenVisibility &&
402 !Method->isDefined())
403 return true;
404 }
405 }
406 return false;
407 }
Charles Davis4e786dd2010-05-25 19:52:27 +0000408};
John McCall86353412010-08-21 22:46:04 +0000409
410class ARMCXXABI : public ItaniumCXXABI {
411public:
Mark Seabornedf0d382013-07-24 16:25:13 +0000412 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
413 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
414 /* UseARMGuardVarABI = */ true) {}
John McCall5d865c322010-08-31 07:33:07 +0000415
Craig Topper4f12f102014-03-12 06:41:41 +0000416 bool HasThisReturn(GlobalDecl GD) const override {
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000417 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
418 isa<CXXDestructorDecl>(GD.getDecl()) &&
419 GD.getDtorType() != Dtor_Deleting));
420 }
John McCall5d865c322010-08-31 07:33:07 +0000421
Craig Topper4f12f102014-03-12 06:41:41 +0000422 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
423 QualType ResTy) override;
John McCall5d865c322010-08-31 07:33:07 +0000424
Craig Topper4f12f102014-03-12 06:41:41 +0000425 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
John McCall7f416cc2015-09-08 08:05:57 +0000426 Address InitializeArrayCookie(CodeGenFunction &CGF,
427 Address NewPtr,
428 llvm::Value *NumElements,
429 const CXXNewExpr *expr,
430 QualType ElementType) override;
431 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000432 CharUnits cookieSize) override;
John McCall86353412010-08-21 22:46:04 +0000433};
Tim Northovera2ee4332014-03-29 15:09:45 +0000434
435class iOS64CXXABI : public ARMCXXABI {
436public:
437 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
Tim Northover65f582f2014-03-30 17:32:48 +0000438
439 // ARM64 libraries are prepared for non-unique RTTI.
David Majnemere2cb8d12014-07-07 06:20:47 +0000440 bool shouldRTTIBeUnique() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +0000441};
Dan Gohmanc2853072015-09-03 22:51:53 +0000442
443class WebAssemblyCXXABI final : public ItaniumCXXABI {
444public:
445 explicit WebAssemblyCXXABI(CodeGen::CodeGenModule &CGM)
446 : ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
447 /*UseARMGuardVarABI=*/true) {}
448
449private:
450 bool HasThisReturn(GlobalDecl GD) const override {
451 return isa<CXXConstructorDecl>(GD.getDecl()) ||
452 (isa<CXXDestructorDecl>(GD.getDecl()) &&
453 GD.getDtorType() != Dtor_Deleting);
454 }
455};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000456}
Charles Davis4e786dd2010-05-25 19:52:27 +0000457
Charles Davis53c59df2010-08-16 03:33:14 +0000458CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
John McCallc8e01702013-04-16 22:48:15 +0000459 switch (CGM.getTarget().getCXXABI().getKind()) {
John McCall57625922013-01-25 23:36:14 +0000460 // For IR-generation purposes, there's no significant difference
461 // between the ARM and iOS ABIs.
462 case TargetCXXABI::GenericARM:
463 case TargetCXXABI::iOS:
Tim Northover756447a2015-10-30 16:30:36 +0000464 case TargetCXXABI::WatchOS:
John McCall57625922013-01-25 23:36:14 +0000465 return new ARMCXXABI(CGM);
Charles Davis4e786dd2010-05-25 19:52:27 +0000466
Tim Northovera2ee4332014-03-29 15:09:45 +0000467 case TargetCXXABI::iOS64:
468 return new iOS64CXXABI(CGM);
469
Tim Northover9bb857a2013-01-31 12:13:10 +0000470 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
471 // include the other 32-bit ARM oddities: constructor/destructor return values
472 // and array cookies.
473 case TargetCXXABI::GenericAArch64:
Mark Seabornedf0d382013-07-24 16:25:13 +0000474 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
475 /* UseARMGuardVarABI = */ true);
Tim Northover9bb857a2013-01-31 12:13:10 +0000476
Zoran Jovanovic26a12162015-02-18 15:21:35 +0000477 case TargetCXXABI::GenericMIPS:
478 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true);
479
Dan Gohmanc2853072015-09-03 22:51:53 +0000480 case TargetCXXABI::WebAssembly:
481 return new WebAssemblyCXXABI(CGM);
482
John McCall57625922013-01-25 23:36:14 +0000483 case TargetCXXABI::GenericItanium:
Mark Seabornedf0d382013-07-24 16:25:13 +0000484 if (CGM.getContext().getTargetInfo().getTriple().getArch()
485 == llvm::Triple::le32) {
486 // For PNaCl, use ARM-style method pointers so that PNaCl code
487 // does not assume anything about the alignment of function
488 // pointers.
489 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
490 /* UseARMGuardVarABI = */ false);
491 }
John McCall57625922013-01-25 23:36:14 +0000492 return new ItaniumCXXABI(CGM);
493
494 case TargetCXXABI::Microsoft:
495 llvm_unreachable("Microsoft ABI is not Itanium-based");
496 }
497 llvm_unreachable("bad ABI kind");
John McCall86353412010-08-21 22:46:04 +0000498}
499
Chris Lattnera5f58b02011-07-09 17:41:47 +0000500llvm::Type *
John McCall7a9aac22010-08-23 01:21:21 +0000501ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
502 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000503 return CGM.PtrDiffTy;
Reid Kleckneree7cf842014-12-01 22:02:27 +0000504 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, nullptr);
John McCall1c456c82010-08-22 06:43:33 +0000505}
506
John McCalld9c6c0b2010-08-22 00:59:17 +0000507/// In the Itanium and ARM ABIs, method pointers have the form:
508/// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
509///
510/// In the Itanium ABI:
511/// - method pointers are virtual if (memptr.ptr & 1) is nonzero
512/// - the this-adjustment is (memptr.adj)
513/// - the virtual offset is (memptr.ptr - 1)
514///
515/// In the ARM ABI:
516/// - method pointers are virtual if (memptr.adj & 1) is nonzero
517/// - the this-adjustment is (memptr.adj >> 1)
518/// - the virtual offset is (memptr.ptr)
519/// ARM uses 'adj' for the virtual flag because Thumb functions
520/// may be only single-byte aligned.
521///
522/// If the member is virtual, the adjusted 'this' pointer points
523/// to a vtable pointer from which the virtual offset is applied.
524///
525/// If the member is non-virtual, memptr.ptr is the address of
526/// the function to call.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000527llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
John McCall7f416cc2015-09-08 08:05:57 +0000528 CodeGenFunction &CGF, const Expr *E, Address ThisAddr,
529 llvm::Value *&ThisPtrForCall,
David Majnemer2b0d66d2014-02-20 23:22:07 +0000530 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
John McCall475999d2010-08-22 00:05:51 +0000531 CGBuilderTy &Builder = CGF.Builder;
532
533 const FunctionProtoType *FPT =
534 MPT->getPointeeType()->getAs<FunctionProtoType>();
535 const CXXRecordDecl *RD =
536 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
537
Chris Lattner2192fe52011-07-18 04:24:23 +0000538 llvm::FunctionType *FTy =
John McCalla729c622012-02-17 03:33:10 +0000539 CGM.getTypes().GetFunctionType(
540 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
John McCall475999d2010-08-22 00:05:51 +0000541
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000542 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
John McCall475999d2010-08-22 00:05:51 +0000543
John McCalld9c6c0b2010-08-22 00:59:17 +0000544 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
545 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
546 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
547
John McCalla1dee5302010-08-22 10:59:02 +0000548 // Extract memptr.adj, which is in the second field.
549 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
John McCalld9c6c0b2010-08-22 00:59:17 +0000550
551 // Compute the true adjustment.
552 llvm::Value *Adj = RawAdj;
Mark Seabornedf0d382013-07-24 16:25:13 +0000553 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000554 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
John McCall475999d2010-08-22 00:05:51 +0000555
556 // Apply the adjustment and cast back to the original struct type
557 // for consistency.
John McCall7f416cc2015-09-08 08:05:57 +0000558 llvm::Value *This = ThisAddr.getPointer();
John McCalld9c6c0b2010-08-22 00:59:17 +0000559 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
560 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
561 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
John McCall7f416cc2015-09-08 08:05:57 +0000562 ThisPtrForCall = This;
John McCall475999d2010-08-22 00:05:51 +0000563
564 // Load the function pointer.
John McCalla1dee5302010-08-22 10:59:02 +0000565 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
John McCall475999d2010-08-22 00:05:51 +0000566
567 // If the LSB in the function pointer is 1, the function pointer points to
568 // a virtual function.
John McCalld9c6c0b2010-08-22 00:59:17 +0000569 llvm::Value *IsVirtual;
Mark Seabornedf0d382013-07-24 16:25:13 +0000570 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000571 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
572 else
573 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
574 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
John McCall475999d2010-08-22 00:05:51 +0000575 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
576
577 // In the virtual path, the adjustment left 'This' pointing to the
578 // vtable of the correct base subobject. The "function pointer" is an
John McCalld9c6c0b2010-08-22 00:59:17 +0000579 // offset within the vtable (+1 for the virtual flag on non-ARM).
John McCall475999d2010-08-22 00:05:51 +0000580 CGF.EmitBlock(FnVirtual);
581
582 // Cast the adjusted this to a pointer to vtable pointer and load.
Chris Lattner2192fe52011-07-18 04:24:23 +0000583 llvm::Type *VTableTy = Builder.getInt8PtrTy();
John McCall7f416cc2015-09-08 08:05:57 +0000584 CharUnits VTablePtrAlign =
585 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD,
586 CGF.getPointerAlign());
587 llvm::Value *VTable =
Piotr Padlewski4b1ac722015-09-15 21:46:55 +0000588 CGF.GetVTablePtr(Address(This, VTablePtrAlign), VTableTy, RD);
John McCall475999d2010-08-22 00:05:51 +0000589
590 // Apply the offset.
John McCalld9c6c0b2010-08-22 00:59:17 +0000591 llvm::Value *VTableOffset = FnAsInt;
Mark Seabornedf0d382013-07-24 16:25:13 +0000592 if (!UseARMMethodPtrABI)
593 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
John McCalld9c6c0b2010-08-22 00:59:17 +0000594 VTable = Builder.CreateGEP(VTable, VTableOffset);
John McCall475999d2010-08-22 00:05:51 +0000595
596 // Load the virtual function to call.
597 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
John McCall7f416cc2015-09-08 08:05:57 +0000598 llvm::Value *VirtualFn =
599 Builder.CreateAlignedLoad(VTable, CGF.getPointerAlign(),
600 "memptr.virtualfn");
John McCall475999d2010-08-22 00:05:51 +0000601 CGF.EmitBranch(FnEnd);
602
603 // In the non-virtual path, the function pointer is actually a
604 // function pointer.
605 CGF.EmitBlock(FnNonVirtual);
606 llvm::Value *NonVirtualFn =
John McCalld9c6c0b2010-08-22 00:59:17 +0000607 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
John McCall475999d2010-08-22 00:05:51 +0000608
609 // We're done.
610 CGF.EmitBlock(FnEnd);
Jay Foad20c0f022011-03-30 11:28:58 +0000611 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
John McCall475999d2010-08-22 00:05:51 +0000612 Callee->addIncoming(VirtualFn, FnVirtual);
613 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
614 return Callee;
615}
John McCalla8bbb822010-08-22 03:04:22 +0000616
John McCallc134eb52010-08-31 21:07:20 +0000617/// Compute an l-value by applying the given pointer-to-member to a
618/// base object.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000619llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
John McCall7f416cc2015-09-08 08:05:57 +0000620 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
David Majnemer2b0d66d2014-02-20 23:22:07 +0000621 const MemberPointerType *MPT) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000622 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCallc134eb52010-08-31 21:07:20 +0000623
624 CGBuilderTy &Builder = CGF.Builder;
625
John McCallc134eb52010-08-31 21:07:20 +0000626 // Cast to char*.
John McCall7f416cc2015-09-08 08:05:57 +0000627 Base = Builder.CreateElementBitCast(Base, CGF.Int8Ty);
John McCallc134eb52010-08-31 21:07:20 +0000628
629 // Apply the offset, which we assume is non-null.
John McCall7f416cc2015-09-08 08:05:57 +0000630 llvm::Value *Addr =
631 Builder.CreateInBoundsGEP(Base.getPointer(), MemPtr, "memptr.offset");
John McCallc134eb52010-08-31 21:07:20 +0000632
633 // Cast the address to the appropriate pointer type, adopting the
634 // address space of the base pointer.
John McCall7f416cc2015-09-08 08:05:57 +0000635 llvm::Type *PType = CGF.ConvertTypeForMem(MPT->getPointeeType())
636 ->getPointerTo(Base.getAddressSpace());
John McCallc134eb52010-08-31 21:07:20 +0000637 return Builder.CreateBitCast(Addr, PType);
638}
639
John McCallc62bb392012-02-15 01:22:51 +0000640/// Perform a bitcast, derived-to-base, or base-to-derived member pointer
641/// conversion.
642///
643/// Bitcast conversions are always a no-op under Itanium.
John McCall7a9aac22010-08-23 01:21:21 +0000644///
645/// Obligatory offset/adjustment diagram:
646/// <-- offset --> <-- adjustment -->
647/// |--------------------------|----------------------|--------------------|
648/// ^Derived address point ^Base address point ^Member address point
649///
650/// So when converting a base member pointer to a derived member pointer,
651/// we add the offset to the adjustment because the address point has
652/// decreased; and conversely, when converting a derived MP to a base MP
653/// we subtract the offset from the adjustment because the address point
654/// has increased.
655///
656/// The standard forbids (at compile time) conversion to and from
657/// virtual bases, which is why we don't have to consider them here.
658///
659/// The standard forbids (at run time) casting a derived MP to a base
660/// MP when the derived MP does not point to a member of the base.
661/// This is why -1 is a reasonable choice for null data member
662/// pointers.
John McCalla1dee5302010-08-22 10:59:02 +0000663llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000664ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
665 const CastExpr *E,
John McCallc62bb392012-02-15 01:22:51 +0000666 llvm::Value *src) {
John McCalle3027922010-08-25 11:45:40 +0000667 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
John McCallc62bb392012-02-15 01:22:51 +0000668 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
669 E->getCastKind() == CK_ReinterpretMemberPointer);
670
671 // Under Itanium, reinterprets don't require any additional processing.
672 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
673
674 // Use constant emission if we can.
675 if (isa<llvm::Constant>(src))
676 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
677
678 llvm::Constant *adj = getMemberPointerAdjustment(E);
679 if (!adj) return src;
John McCalla8bbb822010-08-22 03:04:22 +0000680
681 CGBuilderTy &Builder = CGF.Builder;
John McCallc62bb392012-02-15 01:22:51 +0000682 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
John McCalla8bbb822010-08-22 03:04:22 +0000683
John McCallc62bb392012-02-15 01:22:51 +0000684 const MemberPointerType *destTy =
685 E->getType()->castAs<MemberPointerType>();
John McCall1c456c82010-08-22 06:43:33 +0000686
John McCall7a9aac22010-08-23 01:21:21 +0000687 // For member data pointers, this is just a matter of adding the
688 // offset if the source is non-null.
John McCallc62bb392012-02-15 01:22:51 +0000689 if (destTy->isMemberDataPointer()) {
690 llvm::Value *dst;
691 if (isDerivedToBase)
692 dst = Builder.CreateNSWSub(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000693 else
John McCallc62bb392012-02-15 01:22:51 +0000694 dst = Builder.CreateNSWAdd(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000695
696 // Null check.
John McCallc62bb392012-02-15 01:22:51 +0000697 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
698 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
699 return Builder.CreateSelect(isNull, src, dst);
John McCall7a9aac22010-08-23 01:21:21 +0000700 }
701
John McCalla1dee5302010-08-22 10:59:02 +0000702 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000703 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000704 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
705 offset <<= 1;
706 adj = llvm::ConstantInt::get(adj->getType(), offset);
John McCalla1dee5302010-08-22 10:59:02 +0000707 }
708
John McCallc62bb392012-02-15 01:22:51 +0000709 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
710 llvm::Value *dstAdj;
711 if (isDerivedToBase)
712 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000713 else
John McCallc62bb392012-02-15 01:22:51 +0000714 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000715
John McCallc62bb392012-02-15 01:22:51 +0000716 return Builder.CreateInsertValue(src, dstAdj, 1);
717}
718
719llvm::Constant *
720ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
721 llvm::Constant *src) {
722 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
723 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
724 E->getCastKind() == CK_ReinterpretMemberPointer);
725
726 // Under Itanium, reinterprets don't require any additional processing.
727 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
728
729 // If the adjustment is trivial, we don't need to do anything.
730 llvm::Constant *adj = getMemberPointerAdjustment(E);
731 if (!adj) return src;
732
733 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
734
735 const MemberPointerType *destTy =
736 E->getType()->castAs<MemberPointerType>();
737
738 // For member data pointers, this is just a matter of adding the
739 // offset if the source is non-null.
740 if (destTy->isMemberDataPointer()) {
741 // null maps to null.
742 if (src->isAllOnesValue()) return src;
743
744 if (isDerivedToBase)
745 return llvm::ConstantExpr::getNSWSub(src, adj);
746 else
747 return llvm::ConstantExpr::getNSWAdd(src, adj);
748 }
749
750 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000751 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000752 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
753 offset <<= 1;
754 adj = llvm::ConstantInt::get(adj->getType(), offset);
755 }
756
757 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
758 llvm::Constant *dstAdj;
759 if (isDerivedToBase)
760 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
761 else
762 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
763
764 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
John McCalla8bbb822010-08-22 03:04:22 +0000765}
John McCall84fa5102010-08-22 04:16:24 +0000766
767llvm::Constant *
John McCall7a9aac22010-08-23 01:21:21 +0000768ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
John McCall7a9aac22010-08-23 01:21:21 +0000769 // Itanium C++ ABI 2.3:
770 // A NULL pointer is represented as -1.
771 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000772 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
John McCalla1dee5302010-08-22 10:59:02 +0000773
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000774 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
John McCalla1dee5302010-08-22 10:59:02 +0000775 llvm::Constant *Values[2] = { Zero, Zero };
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000776 return llvm::ConstantStruct::getAnon(Values);
John McCall84fa5102010-08-22 04:16:24 +0000777}
778
John McCallf3a88602011-02-03 08:15:49 +0000779llvm::Constant *
780ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
781 CharUnits offset) {
John McCall7a9aac22010-08-23 01:21:21 +0000782 // Itanium C++ ABI 2.3:
783 // A pointer to data member is an offset from the base address of
784 // the class object containing it, represented as a ptrdiff_t
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000785 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
John McCall7a9aac22010-08-23 01:21:21 +0000786}
787
David Majnemere2be95b2015-06-23 07:31:01 +0000788llvm::Constant *
789ItaniumCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
Richard Smithdafff942012-01-14 04:30:29 +0000790 return BuildMemberPointer(MD, CharUnits::Zero());
791}
792
793llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
794 CharUnits ThisAdjustment) {
John McCalla1dee5302010-08-22 10:59:02 +0000795 assert(MD->isInstance() && "Member function must not be static!");
796 MD = MD->getCanonicalDecl();
797
798 CodeGenTypes &Types = CGM.getTypes();
John McCalla1dee5302010-08-22 10:59:02 +0000799
800 // Get the function pointer (or index if this is a virtual function).
801 llvm::Constant *MemPtr[2];
802 if (MD->isVirtual()) {
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000803 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
John McCalla1dee5302010-08-22 10:59:02 +0000804
Ken Dyckdf016282011-04-09 01:30:02 +0000805 const ASTContext &Context = getContext();
806 CharUnits PointerWidth =
Douglas Gregore8bbc122011-09-02 00:18:52 +0000807 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
Ken Dyckdf016282011-04-09 01:30:02 +0000808 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000809
Mark Seabornedf0d382013-07-24 16:25:13 +0000810 if (UseARMMethodPtrABI) {
John McCalla1dee5302010-08-22 10:59:02 +0000811 // ARM C++ ABI 3.2.1:
812 // This ABI specifies that adj contains twice the this
813 // adjustment, plus 1 if the member function is virtual. The
814 // least significant bit of adj then makes exactly the same
815 // discrimination as the least significant bit of ptr does for
816 // Itanium.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000817 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
818 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000819 2 * ThisAdjustment.getQuantity() + 1);
John McCalla1dee5302010-08-22 10:59:02 +0000820 } else {
821 // Itanium C++ ABI 2.3:
822 // For a virtual function, [the pointer field] is 1 plus the
823 // virtual table offset (in bytes) of the function,
824 // represented as a ptrdiff_t.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000825 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
826 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000827 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000828 }
829 } else {
John McCall2979fe02011-04-12 00:42:48 +0000830 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
Chris Lattner2192fe52011-07-18 04:24:23 +0000831 llvm::Type *Ty;
John McCall2979fe02011-04-12 00:42:48 +0000832 // Check whether the function has a computable LLVM signature.
Chris Lattner8806e322011-07-10 00:18:59 +0000833 if (Types.isFuncTypeConvertible(FPT)) {
John McCall2979fe02011-04-12 00:42:48 +0000834 // The function has a computable LLVM signature; use the correct type.
John McCalla729c622012-02-17 03:33:10 +0000835 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
John McCalla1dee5302010-08-22 10:59:02 +0000836 } else {
John McCall2979fe02011-04-12 00:42:48 +0000837 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
838 // function type is incomplete.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000839 Ty = CGM.PtrDiffTy;
John McCalla1dee5302010-08-22 10:59:02 +0000840 }
John McCall2979fe02011-04-12 00:42:48 +0000841 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
John McCalla1dee5302010-08-22 10:59:02 +0000842
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000843 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
Mark Seabornedf0d382013-07-24 16:25:13 +0000844 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
845 (UseARMMethodPtrABI ? 2 : 1) *
Richard Smithdafff942012-01-14 04:30:29 +0000846 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000847 }
John McCall1c456c82010-08-22 06:43:33 +0000848
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000849 return llvm::ConstantStruct::getAnon(MemPtr);
John McCall1c456c82010-08-22 06:43:33 +0000850}
851
Richard Smithdafff942012-01-14 04:30:29 +0000852llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
853 QualType MPType) {
854 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
855 const ValueDecl *MPD = MP.getMemberPointerDecl();
856 if (!MPD)
857 return EmitNullMemberPointer(MPT);
858
Reid Kleckner452abac2013-05-09 21:01:17 +0000859 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
Richard Smithdafff942012-01-14 04:30:29 +0000860
861 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
862 return BuildMemberPointer(MD, ThisAdjustment);
863
864 CharUnits FieldOffset =
865 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
866 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
867}
868
John McCall131d97d2010-08-22 08:30:07 +0000869/// The comparison algorithm is pretty easy: the member pointers are
870/// the same if they're either bitwise identical *or* both null.
871///
872/// ARM is different here only because null-ness is more complicated.
873llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000874ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
875 llvm::Value *L,
876 llvm::Value *R,
877 const MemberPointerType *MPT,
878 bool Inequality) {
John McCall131d97d2010-08-22 08:30:07 +0000879 CGBuilderTy &Builder = CGF.Builder;
880
John McCall131d97d2010-08-22 08:30:07 +0000881 llvm::ICmpInst::Predicate Eq;
882 llvm::Instruction::BinaryOps And, Or;
883 if (Inequality) {
884 Eq = llvm::ICmpInst::ICMP_NE;
885 And = llvm::Instruction::Or;
886 Or = llvm::Instruction::And;
887 } else {
888 Eq = llvm::ICmpInst::ICMP_EQ;
889 And = llvm::Instruction::And;
890 Or = llvm::Instruction::Or;
891 }
892
John McCall7a9aac22010-08-23 01:21:21 +0000893 // Member data pointers are easy because there's a unique null
894 // value, so it just comes down to bitwise equality.
895 if (MPT->isMemberDataPointer())
896 return Builder.CreateICmp(Eq, L, R);
897
898 // For member function pointers, the tautologies are more complex.
899 // The Itanium tautology is:
John McCall61a14882010-08-23 06:56:36 +0000900 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
John McCall7a9aac22010-08-23 01:21:21 +0000901 // The ARM tautology is:
John McCall61a14882010-08-23 06:56:36 +0000902 // (L == R) <==> (L.ptr == R.ptr &&
903 // (L.adj == R.adj ||
904 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
John McCall7a9aac22010-08-23 01:21:21 +0000905 // The inequality tautologies have exactly the same structure, except
906 // applying De Morgan's laws.
907
908 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
909 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
910
John McCall131d97d2010-08-22 08:30:07 +0000911 // This condition tests whether L.ptr == R.ptr. This must always be
912 // true for equality to hold.
913 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
914
915 // This condition, together with the assumption that L.ptr == R.ptr,
916 // tests whether the pointers are both null. ARM imposes an extra
917 // condition.
918 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
919 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
920
921 // This condition tests whether L.adj == R.adj. If this isn't
922 // true, the pointers are unequal unless they're both null.
John McCalla1dee5302010-08-22 10:59:02 +0000923 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
924 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000925 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
926
927 // Null member function pointers on ARM clear the low bit of Adj,
928 // so the zero condition has to check that neither low bit is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000929 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000930 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
931
932 // Compute (l.adj | r.adj) & 1 and test it against zero.
933 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
934 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
935 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
936 "cmp.or.adj");
937 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
938 }
939
940 // Tie together all our conditions.
941 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
942 Result = Builder.CreateBinOp(And, PtrEq, Result,
943 Inequality ? "memptr.ne" : "memptr.eq");
944 return Result;
945}
946
947llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000948ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
949 llvm::Value *MemPtr,
950 const MemberPointerType *MPT) {
John McCall131d97d2010-08-22 08:30:07 +0000951 CGBuilderTy &Builder = CGF.Builder;
John McCall7a9aac22010-08-23 01:21:21 +0000952
953 /// For member data pointers, this is just a check against -1.
954 if (MPT->isMemberDataPointer()) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000955 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCall7a9aac22010-08-23 01:21:21 +0000956 llvm::Value *NegativeOne =
957 llvm::Constant::getAllOnesValue(MemPtr->getType());
958 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
959 }
John McCall131d97d2010-08-22 08:30:07 +0000960
Daniel Dunbar914bc412011-04-19 23:10:47 +0000961 // In Itanium, a member function pointer is not null if 'ptr' is not null.
John McCalla1dee5302010-08-22 10:59:02 +0000962 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
John McCall131d97d2010-08-22 08:30:07 +0000963
964 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
965 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
966
Daniel Dunbar914bc412011-04-19 23:10:47 +0000967 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
968 // (the virtual bit) is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000969 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000970 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
John McCalla1dee5302010-08-22 10:59:02 +0000971 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000972 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
Daniel Dunbar914bc412011-04-19 23:10:47 +0000973 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
974 "memptr.isvirtual");
975 Result = Builder.CreateOr(Result, IsVirtual);
John McCall131d97d2010-08-22 08:30:07 +0000976 }
977
978 return Result;
979}
John McCall1c456c82010-08-22 06:43:33 +0000980
Reid Kleckner40ca9132014-05-13 22:05:45 +0000981bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
982 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
983 if (!RD)
984 return false;
985
Reid Klecknerd355ca72014-05-15 01:26:32 +0000986 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
987 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
988 // special members.
989 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
John McCall7f416cc2015-09-08 08:05:57 +0000990 auto Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
991 FI.getReturnInfo() = ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
Reid Kleckner40ca9132014-05-13 22:05:45 +0000992 return true;
993 }
Reid Kleckner40ca9132014-05-13 22:05:45 +0000994 return false;
995}
996
John McCall614dbdc2010-08-22 21:01:12 +0000997/// The Itanium ABI requires non-zero initialization only for data
998/// member pointers, for which '0' is a valid offset.
999bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
David Majnemer5fd33e02015-04-24 01:25:08 +00001000 return MPT->isMemberFunctionPointer();
John McCall84fa5102010-08-22 04:16:24 +00001001}
John McCall5d865c322010-08-31 07:33:07 +00001002
John McCall82fb8922012-09-25 10:10:39 +00001003/// The Itanium ABI always places an offset to the complete object
1004/// at entry -2 in the vtable.
David Majnemer08681372014-11-01 07:37:17 +00001005void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
1006 const CXXDeleteExpr *DE,
John McCall7f416cc2015-09-08 08:05:57 +00001007 Address Ptr,
David Majnemer08681372014-11-01 07:37:17 +00001008 QualType ElementType,
1009 const CXXDestructorDecl *Dtor) {
1010 bool UseGlobalDelete = DE->isGlobalDelete();
David Majnemer0c0b6d92014-10-31 20:09:12 +00001011 if (UseGlobalDelete) {
1012 // Derive the complete-object pointer, which is what we need
1013 // to pass to the deallocation function.
John McCall82fb8922012-09-25 10:10:39 +00001014
David Majnemer0c0b6d92014-10-31 20:09:12 +00001015 // Grab the vtable pointer as an intptr_t*.
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001016 auto *ClassDecl =
1017 cast<CXXRecordDecl>(ElementType->getAs<RecordType>()->getDecl());
1018 llvm::Value *VTable =
1019 CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo(), ClassDecl);
John McCall82fb8922012-09-25 10:10:39 +00001020
David Majnemer0c0b6d92014-10-31 20:09:12 +00001021 // Track back to entry -2 and pull out the offset there.
1022 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
1023 VTable, -2, "complete-offset.ptr");
John McCall7f416cc2015-09-08 08:05:57 +00001024 llvm::Value *Offset =
1025 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
David Majnemer0c0b6d92014-10-31 20:09:12 +00001026
1027 // Apply the offset.
John McCall7f416cc2015-09-08 08:05:57 +00001028 llvm::Value *CompletePtr =
1029 CGF.Builder.CreateBitCast(Ptr.getPointer(), CGF.Int8PtrTy);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001030 CompletePtr = CGF.Builder.CreateInBoundsGEP(CompletePtr, Offset);
1031
1032 // If we're supposed to call the global delete, make sure we do so
1033 // even if the destructor throws.
David Majnemer08681372014-11-01 07:37:17 +00001034 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
1035 ElementType);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001036 }
1037
1038 // FIXME: Provide a source location here even though there's no
1039 // CXXMemberCallExpr for dtor call.
1040 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
1041 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr);
1042
1043 if (UseGlobalDelete)
1044 CGF.PopCleanupBlock();
John McCall82fb8922012-09-25 10:10:39 +00001045}
1046
David Majnemer442d0a22014-11-25 07:20:20 +00001047void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
1048 // void __cxa_rethrow();
1049
1050 llvm::FunctionType *FTy =
1051 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
1052
1053 llvm::Constant *Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
1054
1055 if (isNoReturn)
1056 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, None);
1057 else
1058 CGF.EmitRuntimeCallOrInvoke(Fn);
1059}
1060
David Majnemer7c237072015-03-05 00:46:22 +00001061static llvm::Constant *getAllocateExceptionFn(CodeGenModule &CGM) {
1062 // void *__cxa_allocate_exception(size_t thrown_size);
1063
1064 llvm::FunctionType *FTy =
1065 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*IsVarArgs=*/false);
1066
1067 return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
1068}
1069
1070static llvm::Constant *getThrowFn(CodeGenModule &CGM) {
1071 // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
1072 // void (*dest) (void *));
1073
1074 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.Int8PtrTy, CGM.Int8PtrTy };
1075 llvm::FunctionType *FTy =
1076 llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false);
1077
1078 return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
1079}
1080
1081void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
1082 QualType ThrowType = E->getSubExpr()->getType();
1083 // Now allocate the exception object.
1084 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType());
1085 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
1086
1087 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM);
1088 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall(
1089 AllocExceptionFn, llvm::ConstantInt::get(SizeTy, TypeSize), "exception");
1090
John McCall7f416cc2015-09-08 08:05:57 +00001091 CharUnits ExnAlign = getAlignmentOfExnObject();
1092 CGF.EmitAnyExprToExn(E->getSubExpr(), Address(ExceptionPtr, ExnAlign));
David Majnemer7c237072015-03-05 00:46:22 +00001093
1094 // Now throw the exception.
1095 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
1096 /*ForEH=*/true);
1097
1098 // The address of the destructor. If the exception type has a
1099 // trivial destructor (or isn't a record), we just pass null.
1100 llvm::Constant *Dtor = nullptr;
1101 if (const RecordType *RecordTy = ThrowType->getAs<RecordType>()) {
1102 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
1103 if (!Record->hasTrivialDestructor()) {
1104 CXXDestructorDecl *DtorD = Record->getDestructor();
1105 Dtor = CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete);
1106 Dtor = llvm::ConstantExpr::getBitCast(Dtor, CGM.Int8PtrTy);
1107 }
1108 }
1109 if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
1110
1111 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
1112 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args);
1113}
1114
David Majnemer1162d252014-06-22 19:05:33 +00001115static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
1116 // void *__dynamic_cast(const void *sub,
1117 // const abi::__class_type_info *src,
1118 // const abi::__class_type_info *dst,
1119 // std::ptrdiff_t src2dst_offset);
1120
1121 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1122 llvm::Type *PtrDiffTy =
1123 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1124
1125 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
1126
1127 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
1128
1129 // Mark the function as nounwind readonly.
1130 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
1131 llvm::Attribute::ReadOnly };
1132 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
1133 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
1134
1135 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1136}
1137
1138static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1139 // void __cxa_bad_cast();
1140 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1141 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1142}
1143
1144/// \brief Compute the src2dst_offset hint as described in the
1145/// Itanium C++ ABI [2.9.7]
1146static CharUnits computeOffsetHint(ASTContext &Context,
1147 const CXXRecordDecl *Src,
1148 const CXXRecordDecl *Dst) {
1149 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1150 /*DetectVirtual=*/false);
1151
1152 // If Dst is not derived from Src we can skip the whole computation below and
1153 // return that Src is not a public base of Dst. Record all inheritance paths.
1154 if (!Dst->isDerivedFrom(Src, Paths))
1155 return CharUnits::fromQuantity(-2ULL);
1156
1157 unsigned NumPublicPaths = 0;
1158 CharUnits Offset;
1159
1160 // Now walk all possible inheritance paths.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001161 for (const CXXBasePath &Path : Paths) {
1162 if (Path.Access != AS_public) // Ignore non-public inheritance.
David Majnemer1162d252014-06-22 19:05:33 +00001163 continue;
1164
1165 ++NumPublicPaths;
1166
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001167 for (const CXXBasePathElement &PathElement : Path) {
David Majnemer1162d252014-06-22 19:05:33 +00001168 // If the path contains a virtual base class we can't give any hint.
1169 // -1: no hint.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001170 if (PathElement.Base->isVirtual())
David Majnemer1162d252014-06-22 19:05:33 +00001171 return CharUnits::fromQuantity(-1ULL);
1172
1173 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1174 continue;
1175
1176 // Accumulate the base class offsets.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001177 const ASTRecordLayout &L = Context.getASTRecordLayout(PathElement.Class);
1178 Offset += L.getBaseClassOffset(
1179 PathElement.Base->getType()->getAsCXXRecordDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001180 }
1181 }
1182
1183 // -2: Src is not a public base of Dst.
1184 if (NumPublicPaths == 0)
1185 return CharUnits::fromQuantity(-2ULL);
1186
1187 // -3: Src is a multiple public base type but never a virtual base type.
1188 if (NumPublicPaths > 1)
1189 return CharUnits::fromQuantity(-3ULL);
1190
1191 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1192 // Return the offset of Src from the origin of Dst.
1193 return Offset;
1194}
1195
1196static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
1197 // void __cxa_bad_typeid();
1198 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1199
1200 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1201}
1202
1203bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
1204 QualType SrcRecordTy) {
1205 return IsDeref;
1206}
1207
1208void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1209 llvm::Value *Fn = getBadTypeidFn(CGF);
1210 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1211 CGF.Builder.CreateUnreachable();
1212}
1213
1214llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1215 QualType SrcRecordTy,
John McCall7f416cc2015-09-08 08:05:57 +00001216 Address ThisPtr,
David Majnemer1162d252014-06-22 19:05:33 +00001217 llvm::Type *StdTypeInfoPtrTy) {
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001218 auto *ClassDecl =
1219 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001220 llvm::Value *Value =
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001221 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo(), ClassDecl);
David Majnemer1162d252014-06-22 19:05:33 +00001222
1223 // Load the type info.
1224 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
John McCall7f416cc2015-09-08 08:05:57 +00001225 return CGF.Builder.CreateAlignedLoad(Value, CGF.getPointerAlign());
David Majnemer1162d252014-06-22 19:05:33 +00001226}
1227
1228bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1229 QualType SrcRecordTy) {
1230 return SrcIsPtr;
1231}
1232
1233llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
John McCall7f416cc2015-09-08 08:05:57 +00001234 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy,
David Majnemer1162d252014-06-22 19:05:33 +00001235 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1236 llvm::Type *PtrDiffLTy =
1237 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1238 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1239
1240 llvm::Value *SrcRTTI =
1241 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1242 llvm::Value *DestRTTI =
1243 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1244
1245 // Compute the offset hint.
1246 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1247 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1248 llvm::Value *OffsetHint = llvm::ConstantInt::get(
1249 PtrDiffLTy,
1250 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1251
1252 // Emit the call to __dynamic_cast.
John McCall7f416cc2015-09-08 08:05:57 +00001253 llvm::Value *Value = ThisAddr.getPointer();
David Majnemer1162d252014-06-22 19:05:33 +00001254 Value = CGF.EmitCastToVoidPtr(Value);
1255
1256 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1257 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
1258 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1259
1260 /// C++ [expr.dynamic.cast]p9:
1261 /// A failed cast to reference type throws std::bad_cast
1262 if (DestTy->isReferenceType()) {
1263 llvm::BasicBlock *BadCastBlock =
1264 CGF.createBasicBlock("dynamic_cast.bad_cast");
1265
1266 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1267 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1268
1269 CGF.EmitBlock(BadCastBlock);
1270 EmitBadCastCall(CGF);
1271 }
1272
1273 return Value;
1274}
1275
1276llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001277 Address ThisAddr,
David Majnemer1162d252014-06-22 19:05:33 +00001278 QualType SrcRecordTy,
1279 QualType DestTy) {
1280 llvm::Type *PtrDiffLTy =
1281 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1282 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1283
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001284 auto *ClassDecl =
1285 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001286 // Get the vtable pointer.
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001287 llvm::Value *VTable = CGF.GetVTablePtr(ThisAddr, PtrDiffLTy->getPointerTo(),
1288 ClassDecl);
David Majnemer1162d252014-06-22 19:05:33 +00001289
1290 // Get the offset-to-top from the vtable.
1291 llvm::Value *OffsetToTop =
1292 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
John McCall7f416cc2015-09-08 08:05:57 +00001293 OffsetToTop =
1294 CGF.Builder.CreateAlignedLoad(OffsetToTop, CGF.getPointerAlign(),
1295 "offset.to.top");
David Majnemer1162d252014-06-22 19:05:33 +00001296
1297 // Finally, add the offset to the pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001298 llvm::Value *Value = ThisAddr.getPointer();
David Majnemer1162d252014-06-22 19:05:33 +00001299 Value = CGF.EmitCastToVoidPtr(Value);
1300 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1301
1302 return CGF.Builder.CreateBitCast(Value, DestLTy);
1303}
1304
1305bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1306 llvm::Value *Fn = getBadCastFn(CGF);
1307 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1308 CGF.Builder.CreateUnreachable();
1309 return true;
1310}
1311
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001312llvm::Value *
1313ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001314 Address This,
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001315 const CXXRecordDecl *ClassDecl,
1316 const CXXRecordDecl *BaseClassDecl) {
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001317 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001318 CharUnits VBaseOffsetOffset =
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001319 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1320 BaseClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001321
1322 llvm::Value *VBaseOffsetPtr =
1323 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1324 "vbase.offset.ptr");
1325 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1326 CGM.PtrDiffTy->getPointerTo());
1327
1328 llvm::Value *VBaseOffset =
John McCall7f416cc2015-09-08 08:05:57 +00001329 CGF.Builder.CreateAlignedLoad(VBaseOffsetPtr, CGF.getPointerAlign(),
1330 "vbase.offset");
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001331
1332 return VBaseOffset;
1333}
1334
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001335void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1336 // Just make sure we're in sync with TargetCXXABI.
1337 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1338
Rafael Espindolac3cde362013-12-09 14:51:17 +00001339 // The constructor used for constructing this as a base class;
1340 // ignores virtual bases.
1341 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1342
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001343 // The constructor used for constructing this as a complete class;
Nico Weber4c2ffb22015-01-07 05:25:05 +00001344 // constructs the virtual bases, then calls the base constructor.
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001345 if (!D->getParent()->isAbstract()) {
1346 // We don't need to emit the complete ctor if the class is abstract.
1347 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1348 }
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001349}
1350
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001351void
1352ItaniumCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
1353 SmallVectorImpl<CanQualType> &ArgTys) {
John McCall9bca9232010-09-02 10:25:57 +00001354 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001355
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001356 // All parameters are already in place except VTT, which goes after 'this'.
1357 // These are Clang types, so we don't need to worry about sret yet.
John McCall5d865c322010-08-31 07:33:07 +00001358
1359 // Check if we need to add a VTT parameter (which has type void **).
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001360 if (T == StructorType::Base && MD->getParent()->getNumVBases() != 0)
1361 ArgTys.insert(ArgTys.begin() + 1,
1362 Context.getPointerType(Context.VoidPtrTy));
John McCall5d865c322010-08-31 07:33:07 +00001363}
1364
Reid Klecknere7de47e2013-07-22 13:51:44 +00001365void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
Rafael Espindolac3cde362013-12-09 14:51:17 +00001366 // The destructor used for destructing this as a base class; ignores
1367 // virtual bases.
1368 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001369
1370 // The destructor used for destructing this as a most-derived class;
1371 // call the base destructor and then destructs any virtual bases.
1372 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1373
Rafael Espindolac3cde362013-12-09 14:51:17 +00001374 // The destructor in a virtual table is always a 'deleting'
1375 // destructor, which calls the complete destructor and then uses the
1376 // appropriate operator delete.
1377 if (D->isVirtual())
1378 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001379}
1380
Reid Kleckner89077a12013-12-17 19:46:40 +00001381void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1382 QualType &ResTy,
1383 FunctionArgList &Params) {
John McCall5d865c322010-08-31 07:33:07 +00001384 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
Reid Kleckner89077a12013-12-17 19:46:40 +00001385 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
John McCall5d865c322010-08-31 07:33:07 +00001386
1387 // Check if we need a VTT parameter as well.
Peter Collingbourne66f82e62013-06-28 20:45:28 +00001388 if (NeedsVTTParameter(CGF.CurGD)) {
John McCall9bca9232010-09-02 10:25:57 +00001389 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001390
1391 // FIXME: avoid the fake decl
1392 QualType T = Context.getPointerType(Context.VoidPtrTy);
1393 ImplicitParamDecl *VTTDecl
Craig Topper8a13c412014-05-21 05:09:00 +00001394 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
John McCall5d865c322010-08-31 07:33:07 +00001395 &Context.Idents.get("vtt"), T);
Reid Kleckner89077a12013-12-17 19:46:40 +00001396 Params.insert(Params.begin() + 1, VTTDecl);
Reid Kleckner2af6d732013-12-13 00:09:59 +00001397 getStructorImplicitParamDecl(CGF) = VTTDecl;
John McCall5d865c322010-08-31 07:33:07 +00001398 }
1399}
1400
John McCall5d865c322010-08-31 07:33:07 +00001401void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1402 /// Initialize the 'this' slot.
1403 EmitThisParam(CGF);
1404
1405 /// Initialize the 'vtt' slot if needed.
Reid Kleckner2af6d732013-12-13 00:09:59 +00001406 if (getStructorImplicitParamDecl(CGF)) {
1407 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1408 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
John McCall5d865c322010-08-31 07:33:07 +00001409 }
John McCall5d865c322010-08-31 07:33:07 +00001410
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001411 /// If this is a function that the ABI specifies returns 'this', initialize
1412 /// the return slot to 'this' at the start of the function.
1413 ///
1414 /// Unlike the setting of return types, this is done within the ABI
1415 /// implementation instead of by clients of CGCXXABI because:
1416 /// 1) getThisValue is currently protected
1417 /// 2) in theory, an ABI could implement 'this' returns some other way;
1418 /// HasThisReturn only specifies a contract, not the implementation
John McCall5d865c322010-08-31 07:33:07 +00001419 if (HasThisReturn(CGF.CurGD))
Eli Friedman9fbeba02012-02-11 02:57:39 +00001420 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
John McCall5d865c322010-08-31 07:33:07 +00001421}
1422
Reid Kleckner89077a12013-12-17 19:46:40 +00001423unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1424 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1425 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1426 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1427 return 0;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001428
Reid Kleckner89077a12013-12-17 19:46:40 +00001429 // Insert the implicit 'vtt' argument as the second argument.
1430 llvm::Value *VTT =
1431 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1432 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1433 Args.insert(Args.begin() + 1,
1434 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1435 return 1; // Added one arg.
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001436}
1437
1438void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1439 const CXXDestructorDecl *DD,
1440 CXXDtorType Type, bool ForVirtualBase,
John McCall7f416cc2015-09-08 08:05:57 +00001441 bool Delegating, Address This) {
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001442 GlobalDecl GD(DD, Type);
1443 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1444 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1445
Craig Topper8a13c412014-05-21 05:09:00 +00001446 llvm::Value *Callee = nullptr;
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001447 if (getContext().getLangOpts().AppleKext)
1448 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1449
1450 if (!Callee)
Rafael Espindola1ac0ec82014-09-11 15:42:06 +00001451 Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type));
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001452
John McCall7f416cc2015-09-08 08:05:57 +00001453 CGF.EmitCXXMemberOrOperatorCall(DD, Callee, ReturnValueSlot(),
1454 This.getPointer(), VTT, VTTTy, nullptr);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001455}
1456
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001457void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1458 const CXXRecordDecl *RD) {
1459 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1460 if (VTable->hasInitializer())
1461 return;
1462
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001463 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001464 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1465 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
David Majnemerd905da42014-07-01 20:30:31 +00001466 llvm::Constant *RTTI =
1467 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001468
1469 // Create and set the initializer.
1470 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1471 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
David Majnemerd905da42014-07-01 20:30:31 +00001472 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001473 VTable->setInitializer(Init);
1474
1475 // Set the correct linkage.
1476 VTable->setLinkage(Linkage);
1477
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00001478 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
1479 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
Rafael Espindolacb92c192015-01-15 23:18:01 +00001480
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001481 // Set the right visibility.
John McCall8f80a612014-02-08 00:41:16 +00001482 CGM.setGlobalVisibility(VTable, RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001483
Benjamin Kramer5d34a2b2014-09-10 12:50:59 +00001484 // Use pointer alignment for the vtable. Otherwise we would align them based
1485 // on the size of the initializer which doesn't make sense as only single
1486 // values are read.
1487 unsigned PAlign = CGM.getTarget().getPointerAlign(0);
1488 VTable->setAlignment(getContext().toCharUnitsFromBits(PAlign).getQuantity());
1489
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001490 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1491 // we will emit the typeinfo for the fundamental types. This is the
1492 // same behaviour as GCC.
1493 const DeclContext *DC = RD->getDeclContext();
1494 if (RD->getIdentifier() &&
1495 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1496 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1497 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1498 DC->getParent()->isTranslationUnit())
David Majnemere2cb8d12014-07-07 06:20:47 +00001499 EmitFundamentalRTTIDescriptors();
Peter Collingbournea4ccff32015-02-20 20:30:56 +00001500
1501 CGM.EmitVTableBitSetEntries(VTable, VTLayout);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001502}
1503
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001504bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField(
1505 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) {
1506 if (Vptr.NearestVBase == nullptr)
1507 return false;
1508 return NeedsVTTParameter(CGF.CurGD);
Piotr Padlewski255652e2015-09-09 22:20:28 +00001509}
1510
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001511llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1512 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1513 const CXXRecordDecl *NearestVBase) {
1514
1515 if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1516 NeedsVTTParameter(CGF.CurGD)) {
1517 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base,
1518 NearestVBase);
1519 }
1520 return getVTableAddressPoint(Base, VTableClass);
1521}
1522
1523llvm::Constant *
1524ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base,
1525 const CXXRecordDecl *VTableClass) {
1526 llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, CharUnits());
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001527
1528 // Find the appropriate vtable within the vtable group.
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001529 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1530 .getVTableLayout(VTableClass)
1531 .getAddressPoint(Base);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001532 llvm::Value *Indices[] = {
1533 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1534 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1535 };
1536
David Blaikiee3b172a2015-04-02 18:55:21 +00001537 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable->getValueType(),
1538 VTable, Indices);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001539}
1540
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001541llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
1542 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1543 const CXXRecordDecl *NearestVBase) {
1544 assert((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1545 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT");
1546
1547 // Get the secondary vpointer index.
1548 uint64_t VirtualPointerIndex =
1549 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1550
1551 /// Load the VTT.
1552 llvm::Value *VTT = CGF.LoadCXXVTT();
1553 if (VirtualPointerIndex)
1554 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1555
1556 // And load the address point from the VTT.
1557 return CGF.Builder.CreateAlignedLoad(VTT, CGF.getPointerAlign());
1558}
1559
1560llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1561 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1562 return getVTableAddressPoint(Base, VTableClass);
1563}
1564
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001565llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1566 CharUnits VPtrOffset) {
1567 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1568
1569 llvm::GlobalVariable *&VTable = VTables[RD];
1570 if (VTable)
1571 return VTable;
1572
1573 // Queue up this v-table for possible deferred emission.
1574 CGM.addDeferredVTable(RD);
1575
Yaron Kerene46f7ed2015-07-29 14:21:47 +00001576 SmallString<256> Name;
1577 llvm::raw_svector_ostream Out(Name);
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001578 getMangleContext().mangleCXXVTable(RD, Out);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001579
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001580 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001581 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1582 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1583
1584 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1585 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1586 VTable->setUnnamedAddr(true);
Hans Wennborgda24e9c2014-06-02 23:13:03 +00001587
1588 if (RD->hasAttr<DLLImportAttr>())
1589 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1590 else if (RD->hasAttr<DLLExportAttr>())
1591 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1592
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001593 return VTable;
1594}
1595
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001596llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1597 GlobalDecl GD,
John McCall7f416cc2015-09-08 08:05:57 +00001598 Address This,
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001599 llvm::Type *Ty,
1600 SourceLocation Loc) {
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001601 GD = GD.getCanonicalDecl();
1602 Ty = Ty->getPointerTo()->getPointerTo();
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001603 auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl());
1604 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty, MethodDecl->getParent());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001605
Peter Collingbourne1a7488a2015-04-02 00:23:30 +00001606 if (CGF.SanOpts.has(SanitizerKind::CFIVCall))
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001607 CGF.EmitVTablePtrCheckForCall(MethodDecl, VTable,
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001608 CodeGenFunction::CFITCK_VCall, Loc);
Peter Collingbournea4ccff32015-02-20 20:30:56 +00001609
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001610 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001611 llvm::Value *VFuncPtr =
1612 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
Renato Golin41106182015-10-01 12:58:41 +00001613 return CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.getPointerAlign());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001614}
1615
David Majnemer0c0b6d92014-10-31 20:09:12 +00001616llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
1617 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
John McCall7f416cc2015-09-08 08:05:57 +00001618 Address This, const CXXMemberCallExpr *CE) {
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001619 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001620 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1621
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001622 const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
1623 Dtor, getFromDtorType(DtorType));
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001624 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001625 llvm::Value *Callee =
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001626 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty,
1627 CE ? CE->getLocStart() : SourceLocation());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001628
John McCall7f416cc2015-09-08 08:05:57 +00001629 CGF.EmitCXXMemberOrOperatorCall(Dtor, Callee, ReturnValueSlot(),
1630 This.getPointer(), /*ImplicitParam=*/nullptr,
1631 QualType(), CE);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001632 return nullptr;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001633}
1634
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001635void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
Reid Kleckner7810af02013-06-19 15:20:38 +00001636 CodeGenVTables &VTables = CGM.getVTables();
1637 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001638 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
Reid Kleckner7810af02013-06-19 15:20:38 +00001639}
1640
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001641bool ItaniumCXXABI::canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const {
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001642 // We don't emit available_externally vtables if we are in -fapple-kext mode
1643 // because kext mode does not permit devirtualization.
1644 if (CGM.getLangOpts().AppleKext)
1645 return false;
1646
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001647 // If we don't have any inline virtual functions, and if vtable is not hidden,
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001648 // then we are safe to emit available_externally copy of vtable.
1649 // FIXME we can still emit a copy of the vtable if we
1650 // can emit definition of the inline functions.
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001651 return !hasAnyUsedVirtualInlineFunction(RD) && !isVTableHidden(RD);
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001652}
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001653static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001654 Address InitialPtr,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001655 int64_t NonVirtualAdjustment,
1656 int64_t VirtualAdjustment,
1657 bool IsReturnAdjustment) {
1658 if (!NonVirtualAdjustment && !VirtualAdjustment)
John McCall7f416cc2015-09-08 08:05:57 +00001659 return InitialPtr.getPointer();
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001660
John McCall7f416cc2015-09-08 08:05:57 +00001661 Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001662
John McCall7f416cc2015-09-08 08:05:57 +00001663 // In a base-to-derived cast, the non-virtual adjustment is applied first.
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001664 if (NonVirtualAdjustment && !IsReturnAdjustment) {
John McCall7f416cc2015-09-08 08:05:57 +00001665 V = CGF.Builder.CreateConstInBoundsByteGEP(V,
1666 CharUnits::fromQuantity(NonVirtualAdjustment));
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001667 }
1668
John McCall7f416cc2015-09-08 08:05:57 +00001669 // Perform the virtual adjustment if we have one.
1670 llvm::Value *ResultPtr;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001671 if (VirtualAdjustment) {
1672 llvm::Type *PtrDiffTy =
1673 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1674
John McCall7f416cc2015-09-08 08:05:57 +00001675 Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001676 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1677
1678 llvm::Value *OffsetPtr =
1679 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1680
1681 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1682
1683 // Load the adjustment offset from the vtable.
John McCall7f416cc2015-09-08 08:05:57 +00001684 llvm::Value *Offset =
1685 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001686
1687 // Adjust our pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001688 ResultPtr = CGF.Builder.CreateInBoundsGEP(V.getPointer(), Offset);
1689 } else {
1690 ResultPtr = V.getPointer();
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001691 }
1692
John McCall7f416cc2015-09-08 08:05:57 +00001693 // In a derived-to-base conversion, the non-virtual adjustment is
1694 // applied second.
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001695 if (NonVirtualAdjustment && IsReturnAdjustment) {
John McCall7f416cc2015-09-08 08:05:57 +00001696 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(ResultPtr,
1697 NonVirtualAdjustment);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001698 }
1699
1700 // Cast back to the original type.
John McCall7f416cc2015-09-08 08:05:57 +00001701 return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType());
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001702}
1703
1704llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001705 Address This,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001706 const ThisAdjustment &TA) {
Timur Iskhodzhanov053142a2013-11-06 06:24:31 +00001707 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1708 TA.Virtual.Itanium.VCallOffsetOffset,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001709 /*IsReturnAdjustment=*/false);
1710}
1711
1712llvm::Value *
John McCall7f416cc2015-09-08 08:05:57 +00001713ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001714 const ReturnAdjustment &RA) {
1715 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1716 RA.Virtual.Itanium.VBaseOffsetOffset,
1717 /*IsReturnAdjustment=*/true);
1718}
1719
John McCall5d865c322010-08-31 07:33:07 +00001720void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1721 RValue RV, QualType ResultType) {
1722 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1723 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1724
1725 // Destructor thunks in the ARM ABI have indeterminate results.
John McCall7f416cc2015-09-08 08:05:57 +00001726 llvm::Type *T = CGF.ReturnValue.getElementType();
John McCall5d865c322010-08-31 07:33:07 +00001727 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1728 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1729}
John McCall8ed55a52010-09-02 09:58:18 +00001730
1731/************************** Array allocation cookies **************************/
1732
John McCallb91cd662012-05-01 05:23:51 +00001733CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1734 // The array cookie is a size_t; pad that up to the element alignment.
1735 // The cookie is actually right-justified in that space.
1736 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1737 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001738}
1739
John McCall7f416cc2015-09-08 08:05:57 +00001740Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1741 Address NewPtr,
1742 llvm::Value *NumElements,
1743 const CXXNewExpr *expr,
1744 QualType ElementType) {
John McCallb91cd662012-05-01 05:23:51 +00001745 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001746
John McCall7f416cc2015-09-08 08:05:57 +00001747 unsigned AS = NewPtr.getAddressSpace();
John McCall8ed55a52010-09-02 09:58:18 +00001748
John McCall9bca9232010-09-02 10:25:57 +00001749 ASTContext &Ctx = getContext();
John McCall7f416cc2015-09-08 08:05:57 +00001750 CharUnits SizeSize = CGF.getSizeSize();
John McCall8ed55a52010-09-02 09:58:18 +00001751
1752 // The size of the cookie.
1753 CharUnits CookieSize =
1754 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
John McCallb91cd662012-05-01 05:23:51 +00001755 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
John McCall8ed55a52010-09-02 09:58:18 +00001756
1757 // Compute an offset to the cookie.
John McCall7f416cc2015-09-08 08:05:57 +00001758 Address CookiePtr = NewPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001759 CharUnits CookieOffset = CookieSize - SizeSize;
1760 if (!CookieOffset.isZero())
John McCall7f416cc2015-09-08 08:05:57 +00001761 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset);
John McCall8ed55a52010-09-02 09:58:18 +00001762
1763 // Write the number of elements into the appropriate slot.
John McCall7f416cc2015-09-08 08:05:57 +00001764 Address NumElementsPtr =
1765 CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy);
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001766 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
John McCall7f416cc2015-09-08 08:05:57 +00001767
1768 // Handle the array cookie specially in ASan.
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001769 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001770 expr->getOperatorNew()->isReplaceableGlobalAllocationFunction()) {
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001771 // The store to the CookiePtr does not need to be instrumented.
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001772 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
1773 llvm::FunctionType *FTy =
John McCall7f416cc2015-09-08 08:05:57 +00001774 llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false);
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001775 llvm::Constant *F =
1776 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
John McCall7f416cc2015-09-08 08:05:57 +00001777 CGF.Builder.CreateCall(F, NumElementsPtr.getPointer());
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001778 }
John McCall8ed55a52010-09-02 09:58:18 +00001779
1780 // Finally, compute a pointer to the actual data buffer by skipping
1781 // over the cookie completely.
John McCall7f416cc2015-09-08 08:05:57 +00001782 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize);
John McCall8ed55a52010-09-02 09:58:18 +00001783}
1784
John McCallb91cd662012-05-01 05:23:51 +00001785llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001786 Address allocPtr,
John McCallb91cd662012-05-01 05:23:51 +00001787 CharUnits cookieSize) {
1788 // The element size is right-justified in the cookie.
John McCall7f416cc2015-09-08 08:05:57 +00001789 Address numElementsPtr = allocPtr;
1790 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize();
John McCallb91cd662012-05-01 05:23:51 +00001791 if (!numElementsOffset.isZero())
1792 numElementsPtr =
John McCall7f416cc2015-09-08 08:05:57 +00001793 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset);
John McCall8ed55a52010-09-02 09:58:18 +00001794
John McCall7f416cc2015-09-08 08:05:57 +00001795 unsigned AS = allocPtr.getAddressSpace();
1796 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001797 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001798 return CGF.Builder.CreateLoad(numElementsPtr);
1799 // In asan mode emit a function call instead of a regular load and let the
1800 // run-time deal with it: if the shadow is properly poisoned return the
1801 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
1802 // We can't simply ignore this load using nosanitize metadata because
1803 // the metadata may be lost.
1804 llvm::FunctionType *FTy =
1805 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
1806 llvm::Constant *F =
1807 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
John McCall7f416cc2015-09-08 08:05:57 +00001808 return CGF.Builder.CreateCall(F, numElementsPtr.getPointer());
John McCall8ed55a52010-09-02 09:58:18 +00001809}
1810
John McCallb91cd662012-05-01 05:23:51 +00001811CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
John McCallc19c7062013-01-25 23:36:19 +00001812 // ARM says that the cookie is always:
John McCall8ed55a52010-09-02 09:58:18 +00001813 // struct array_cookie {
1814 // std::size_t element_size; // element_size != 0
1815 // std::size_t element_count;
1816 // };
John McCallc19c7062013-01-25 23:36:19 +00001817 // But the base ABI doesn't give anything an alignment greater than
1818 // 8, so we can dismiss this as typical ABI-author blindness to
1819 // actual language complexity and round up to the element alignment.
1820 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1821 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001822}
1823
John McCall7f416cc2015-09-08 08:05:57 +00001824Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1825 Address newPtr,
1826 llvm::Value *numElements,
1827 const CXXNewExpr *expr,
1828 QualType elementType) {
John McCallb91cd662012-05-01 05:23:51 +00001829 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001830
John McCall8ed55a52010-09-02 09:58:18 +00001831 // The cookie is always at the start of the buffer.
John McCall7f416cc2015-09-08 08:05:57 +00001832 Address cookie = newPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001833
1834 // The first element is the element size.
John McCall7f416cc2015-09-08 08:05:57 +00001835 cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy);
John McCallc19c7062013-01-25 23:36:19 +00001836 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1837 getContext().getTypeSizeInChars(elementType).getQuantity());
1838 CGF.Builder.CreateStore(elementSize, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001839
1840 // The second element is the element count.
John McCall7f416cc2015-09-08 08:05:57 +00001841 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1, CGF.getSizeSize());
John McCallc19c7062013-01-25 23:36:19 +00001842 CGF.Builder.CreateStore(numElements, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001843
1844 // Finally, compute a pointer to the actual data buffer by skipping
1845 // over the cookie completely.
John McCallc19c7062013-01-25 23:36:19 +00001846 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
John McCall7f416cc2015-09-08 08:05:57 +00001847 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize);
John McCall8ed55a52010-09-02 09:58:18 +00001848}
1849
John McCallb91cd662012-05-01 05:23:51 +00001850llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001851 Address allocPtr,
John McCallb91cd662012-05-01 05:23:51 +00001852 CharUnits cookieSize) {
1853 // The number of elements is at offset sizeof(size_t) relative to
1854 // the allocated pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001855 Address numElementsPtr
1856 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize());
John McCall8ed55a52010-09-02 09:58:18 +00001857
John McCall7f416cc2015-09-08 08:05:57 +00001858 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
John McCallb91cd662012-05-01 05:23:51 +00001859 return CGF.Builder.CreateLoad(numElementsPtr);
John McCall8ed55a52010-09-02 09:58:18 +00001860}
1861
John McCall68ff0372010-09-08 01:44:27 +00001862/*********************** Static local initialization **************************/
1863
1864static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001865 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001866 // int __cxa_guard_acquire(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001867 llvm::FunctionType *FTy =
John McCall68ff0372010-09-08 01:44:27 +00001868 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
Jay Foad5709f7c2011-07-29 13:56:53 +00001869 GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001870 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001871 llvm::AttributeSet::get(CGM.getLLVMContext(),
1872 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001873 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001874}
1875
1876static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001877 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001878 // void __cxa_guard_release(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001879 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001880 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001881 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001882 llvm::AttributeSet::get(CGM.getLLVMContext(),
1883 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001884 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001885}
1886
1887static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001888 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001889 // void __cxa_guard_abort(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001890 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001891 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001892 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001893 llvm::AttributeSet::get(CGM.getLLVMContext(),
1894 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001895 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001896}
1897
1898namespace {
David Blaikie7e70d682015-08-18 22:40:54 +00001899 struct CallGuardAbort final : EHScopeStack::Cleanup {
John McCall68ff0372010-09-08 01:44:27 +00001900 llvm::GlobalVariable *Guard;
Chandler Carruth84537952012-03-30 19:44:53 +00001901 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
John McCall68ff0372010-09-08 01:44:27 +00001902
Craig Topper4f12f102014-03-12 06:41:41 +00001903 void Emit(CodeGenFunction &CGF, Flags flags) override {
John McCall882987f2013-02-28 19:01:20 +00001904 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1905 Guard);
John McCall68ff0372010-09-08 01:44:27 +00001906 }
1907 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +00001908}
John McCall68ff0372010-09-08 01:44:27 +00001909
1910/// The ARM code here follows the Itanium code closely enough that we
1911/// just special-case it at particular places.
John McCallcdf7ef52010-11-06 09:44:32 +00001912void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1913 const VarDecl &D,
John McCallb88a5662012-03-30 21:00:39 +00001914 llvm::GlobalVariable *var,
1915 bool shouldPerformInit) {
John McCall68ff0372010-09-08 01:44:27 +00001916 CGBuilderTy &Builder = CGF.Builder;
John McCallcdf7ef52010-11-06 09:44:32 +00001917
Richard Smithdbf74ba2013-04-14 23:01:42 +00001918 // We only need to use thread-safe statics for local non-TLS variables;
John McCallcdf7ef52010-11-06 09:44:32 +00001919 // global initialization is always single-threaded.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001920 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1921 D.isLocalVarDecl() && !D.getTLSKind();
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001922
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001923 // If we have a global variable with internal linkage and thread-safe statics
1924 // are disabled, we can just let the guard variable be of type i8.
John McCallb88a5662012-03-30 21:00:39 +00001925 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1926
1927 llvm::IntegerType *guardTy;
John McCall7f416cc2015-09-08 08:05:57 +00001928 CharUnits guardAlignment;
John McCall5aa52592011-06-17 07:33:57 +00001929 if (useInt8GuardVariable) {
John McCallb88a5662012-03-30 21:00:39 +00001930 guardTy = CGF.Int8Ty;
John McCall7f416cc2015-09-08 08:05:57 +00001931 guardAlignment = CharUnits::One();
John McCall5aa52592011-06-17 07:33:57 +00001932 } else {
Tim Northover9bb857a2013-01-31 12:13:10 +00001933 // Guard variables are 64 bits in the generic ABI and size width on ARM
1934 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
John McCall7f416cc2015-09-08 08:05:57 +00001935 if (UseARMGuardVarABI) {
1936 guardTy = CGF.SizeTy;
1937 guardAlignment = CGF.getSizeAlign();
1938 } else {
1939 guardTy = CGF.Int64Ty;
1940 guardAlignment = CharUnits::fromQuantity(
1941 CGM.getDataLayout().getABITypeAlignment(guardTy));
1942 }
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001943 }
John McCallb88a5662012-03-30 21:00:39 +00001944 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
John McCall68ff0372010-09-08 01:44:27 +00001945
John McCallb88a5662012-03-30 21:00:39 +00001946 // Create the guard variable if we don't already have it (as we
1947 // might if we're double-emitting this function body).
1948 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1949 if (!guard) {
1950 // Mangle the name for the guard.
1951 SmallString<256> guardName;
1952 {
1953 llvm::raw_svector_ostream out(guardName);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001954 getMangleContext().mangleStaticGuardVariable(&D, out);
John McCallb88a5662012-03-30 21:00:39 +00001955 }
John McCall8e7cb6d2010-11-02 21:04:24 +00001956
John McCallb88a5662012-03-30 21:00:39 +00001957 // Create the guard variable with a zero-initializer.
1958 // Just absorb linkage and visibility from the guarded variable.
1959 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1960 false, var->getLinkage(),
1961 llvm::ConstantInt::get(guardTy, 0),
1962 guardName.str());
1963 guard->setVisibility(var->getVisibility());
Richard Smithdbf74ba2013-04-14 23:01:42 +00001964 // If the variable is thread-local, so is its guard variable.
1965 guard->setThreadLocalMode(var->getThreadLocalMode());
John McCall7f416cc2015-09-08 08:05:57 +00001966 guard->setAlignment(guardAlignment.getQuantity());
John McCallb88a5662012-03-30 21:00:39 +00001967
Yaron Keren5bfa1082015-09-03 20:33:29 +00001968 // The ABI says: "It is suggested that it be emitted in the same COMDAT
1969 // group as the associated data object." In practice, this doesn't work for
1970 // non-ELF object formats, so only do it for ELF.
Rafael Espindola0d4fb982015-01-12 22:13:53 +00001971 llvm::Comdat *C = var->getComdat();
Yaron Keren5bfa1082015-09-03 20:33:29 +00001972 if (!D.isLocalVarDecl() && C &&
1973 CGM.getTarget().getTriple().isOSBinFormatELF()) {
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001974 guard->setComdat(C);
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001975 CGF.CurFn->setComdat(C);
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00001976 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
1977 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001978 }
1979
John McCallb88a5662012-03-30 21:00:39 +00001980 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1981 }
John McCall87590e62012-03-30 07:09:50 +00001982
John McCall7f416cc2015-09-08 08:05:57 +00001983 Address guardAddr = Address(guard, guardAlignment);
1984
John McCall68ff0372010-09-08 01:44:27 +00001985 // Test whether the variable has completed initialization.
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001986 //
John McCall68ff0372010-09-08 01:44:27 +00001987 // Itanium C++ ABI 3.3.2:
1988 // The following is pseudo-code showing how these functions can be used:
1989 // if (obj_guard.first_byte == 0) {
1990 // if ( __cxa_guard_acquire (&obj_guard) ) {
1991 // try {
1992 // ... initialize the object ...;
1993 // } catch (...) {
1994 // __cxa_guard_abort (&obj_guard);
1995 // throw;
1996 // }
1997 // ... queue object destructor with __cxa_atexit() ...;
1998 // __cxa_guard_release (&obj_guard);
1999 // }
2000 // }
Tim Northovera2ee4332014-03-29 15:09:45 +00002001
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002002 // Load the first byte of the guard variable.
2003 llvm::LoadInst *LI =
John McCall7f416cc2015-09-08 08:05:57 +00002004 Builder.CreateLoad(Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty));
John McCall68ff0372010-09-08 01:44:27 +00002005
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002006 // Itanium ABI:
2007 // An implementation supporting thread-safety on multiprocessor
2008 // systems must also guarantee that references to the initialized
2009 // object do not occur before the load of the initialization flag.
2010 //
2011 // In LLVM, we do this by marking the load Acquire.
2012 if (threadsafe)
2013 LI->setAtomic(llvm::Acquire);
Eli Friedman84d28122011-09-13 22:21:56 +00002014
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002015 // For ARM, we should only check the first bit, rather than the entire byte:
2016 //
2017 // ARM C++ ABI 3.2.3.1:
2018 // To support the potential use of initialization guard variables
2019 // as semaphores that are the target of ARM SWP and LDREX/STREX
2020 // synchronizing instructions we define a static initialization
2021 // guard variable to be a 4-byte aligned, 4-byte word with the
2022 // following inline access protocol.
2023 // #define INITIALIZED 1
2024 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
2025 // if (__cxa_guard_acquire(&obj_guard))
2026 // ...
2027 // }
2028 //
2029 // and similarly for ARM64:
2030 //
2031 // ARM64 C++ ABI 3.2.2:
2032 // This ABI instead only specifies the value bit 0 of the static guard
2033 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
2034 // variable is not initialized and 1 when it is.
2035 llvm::Value *V =
2036 (UseARMGuardVarABI && !useInt8GuardVariable)
2037 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
2038 : LI;
2039 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
John McCall68ff0372010-09-08 01:44:27 +00002040
2041 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
2042 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2043
2044 // Check if the first byte of the guard variable is zero.
John McCallb88a5662012-03-30 21:00:39 +00002045 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
John McCall68ff0372010-09-08 01:44:27 +00002046
2047 CGF.EmitBlock(InitCheckBlock);
2048
2049 // Variables used when coping with thread-safe statics and exceptions.
John McCall5aa52592011-06-17 07:33:57 +00002050 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00002051 // Call __cxa_guard_acquire.
2052 llvm::Value *V
John McCall882987f2013-02-28 19:01:20 +00002053 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
John McCall68ff0372010-09-08 01:44:27 +00002054
2055 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2056
2057 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
2058 InitBlock, EndBlock);
2059
2060 // Call __cxa_guard_abort along the exceptional edge.
John McCallb88a5662012-03-30 21:00:39 +00002061 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
John McCall68ff0372010-09-08 01:44:27 +00002062
2063 CGF.EmitBlock(InitBlock);
2064 }
2065
2066 // Emit the initializer and add a global destructor if appropriate.
John McCallb88a5662012-03-30 21:00:39 +00002067 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
John McCall68ff0372010-09-08 01:44:27 +00002068
John McCall5aa52592011-06-17 07:33:57 +00002069 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00002070 // Pop the guard-abort cleanup if we pushed one.
2071 CGF.PopCleanupBlock();
2072
2073 // Call __cxa_guard_release. This cannot throw.
John McCall7f416cc2015-09-08 08:05:57 +00002074 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy),
2075 guardAddr.getPointer());
John McCall68ff0372010-09-08 01:44:27 +00002076 } else {
John McCall7f416cc2015-09-08 08:05:57 +00002077 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guardAddr);
John McCall68ff0372010-09-08 01:44:27 +00002078 }
2079
2080 CGF.EmitBlock(EndBlock);
2081}
John McCallc84ed6a2012-05-01 06:13:13 +00002082
2083/// Register a global destructor using __cxa_atexit.
2084static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
2085 llvm::Constant *dtor,
Richard Smithdbf74ba2013-04-14 23:01:42 +00002086 llvm::Constant *addr,
2087 bool TLS) {
Bill Wendling95cae882013-05-02 19:18:03 +00002088 const char *Name = "__cxa_atexit";
2089 if (TLS) {
2090 const llvm::Triple &T = CGF.getTarget().getTriple();
Manman Renf93fff22015-11-11 23:08:18 +00002091 Name = T.isOSDarwin() ? "_tlv_atexit" : "__cxa_thread_atexit";
Bill Wendling95cae882013-05-02 19:18:03 +00002092 }
Richard Smithdbf74ba2013-04-14 23:01:42 +00002093
John McCallc84ed6a2012-05-01 06:13:13 +00002094 // We're assuming that the destructor function is something we can
2095 // reasonably call with the default CC. Go ahead and cast it to the
2096 // right prototype.
2097 llvm::Type *dtorTy =
2098 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
2099
2100 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
2101 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
2102 llvm::FunctionType *atexitTy =
2103 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
2104
2105 // Fetch the actual function.
Richard Smithdbf74ba2013-04-14 23:01:42 +00002106 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
John McCallc84ed6a2012-05-01 06:13:13 +00002107 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
2108 fn->setDoesNotThrow();
2109
2110 // Create a variable that binds the atexit to this shared object.
2111 llvm::Constant *handle =
2112 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
2113
2114 llvm::Value *args[] = {
2115 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
2116 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
2117 handle
2118 };
John McCall882987f2013-02-28 19:01:20 +00002119 CGF.EmitNounwindRuntimeCall(atexit, args);
John McCallc84ed6a2012-05-01 06:13:13 +00002120}
2121
2122/// Register a global destructor as best as we know how.
2123void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
Richard Smithdbf74ba2013-04-14 23:01:42 +00002124 const VarDecl &D,
John McCallc84ed6a2012-05-01 06:13:13 +00002125 llvm::Constant *dtor,
2126 llvm::Constant *addr) {
2127 // Use __cxa_atexit if available.
Richard Smithdbf74ba2013-04-14 23:01:42 +00002128 if (CGM.getCodeGenOpts().CXAAtExit)
2129 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
2130
2131 if (D.getTLSKind())
2132 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
John McCallc84ed6a2012-05-01 06:13:13 +00002133
2134 // In Apple kexts, we want to add a global destructor entry.
2135 // FIXME: shouldn't this be guarded by some variable?
Richard Smith9c6890a2012-11-01 22:30:59 +00002136 if (CGM.getLangOpts().AppleKext) {
John McCallc84ed6a2012-05-01 06:13:13 +00002137 // Generate a global destructor entry.
2138 return CGM.AddCXXDtorEntry(dtor, addr);
2139 }
2140
David Blaikieebe87e12013-08-27 23:57:18 +00002141 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
John McCallc84ed6a2012-05-01 06:13:13 +00002142}
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002143
David Majnemer9b21c332014-07-11 20:28:10 +00002144static bool isThreadWrapperReplaceable(const VarDecl *VD,
2145 CodeGen::CodeGenModule &CGM) {
2146 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
Manman Renf93fff22015-11-11 23:08:18 +00002147 // Darwin prefers to have references to thread local variables to go through
David Majnemer9b21c332014-07-11 20:28:10 +00002148 // the thread wrapper instead of directly referencing the backing variable.
2149 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
Manman Renf93fff22015-11-11 23:08:18 +00002150 CGM.getTarget().getTriple().isOSDarwin();
David Majnemer9b21c332014-07-11 20:28:10 +00002151}
2152
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002153/// Get the appropriate linkage for the wrapper function. This is essentially
David Majnemer4632e1e2014-06-27 16:56:27 +00002154/// the weak form of the variable's linkage; every translation unit which needs
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002155/// the wrapper emits a copy, and we want the linker to merge them.
David Majnemer35ab3282014-06-11 04:08:55 +00002156static llvm::GlobalValue::LinkageTypes
2157getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
2158 llvm::GlobalValue::LinkageTypes VarLinkage =
2159 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
2160
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002161 // For internal linkage variables, we don't need an external or weak wrapper.
2162 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
2163 return VarLinkage;
David Majnemer35ab3282014-06-11 04:08:55 +00002164
David Majnemer9b21c332014-07-11 20:28:10 +00002165 // If the thread wrapper is replaceable, give it appropriate linkage.
Manman Ren68150262015-11-11 22:42:31 +00002166 if (isThreadWrapperReplaceable(VD, CGM))
2167 if (!llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) &&
2168 !llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
2169 return VarLinkage;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002170 return llvm::GlobalValue::WeakODRLinkage;
2171}
2172
2173llvm::Function *
2174ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
Alexander Musmanf94c3182014-09-26 06:28:25 +00002175 llvm::Value *Val) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002176 // Mangle the name for the thread_local wrapper function.
2177 SmallString<256> WrapperName;
2178 {
2179 llvm::raw_svector_ostream Out(WrapperName);
2180 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002181 }
2182
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
Alexander Musmanf94c3182014-09-26 06:28:25 +00002186 llvm::Type *RetTy = Val->getType();
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002187 if (VD->getType()->isReferenceType())
2188 RetTy = RetTy->getPointerElementType();
2189
2190 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
David Majnemer35ab3282014-06-11 04:08:55 +00002191 llvm::Function *Wrapper =
2192 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
2193 WrapperName.str(), &CGM.getModule());
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002194 // Always resolve references to the wrapper at link time.
Manman Ren68150262015-11-11 22:42:31 +00002195 if (!Wrapper->hasLocalLinkage() && !(isThreadWrapperReplaceable(VD, CGM) &&
2196 !llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) &&
2197 !llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage())))
Duncan P. N. Exon Smith4434d362014-05-07 22:36:11 +00002198 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002199 return Wrapper;
2200}
2201
2202void ItaniumCXXABI::EmitThreadLocalInitFuncs(
David Majnemerb3341ea2014-10-05 05:05:40 +00002203 CodeGenModule &CGM,
2204 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
2205 CXXThreadLocals, ArrayRef<llvm::Function *> CXXThreadLocalInits,
2206 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) {
2207 llvm::Function *InitFunc = nullptr;
2208 if (!CXXThreadLocalInits.empty()) {
2209 // Generate a guarded initialization function.
2210 llvm::FunctionType *FTy =
2211 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
Akira Hatanaka7791f1a42015-10-31 01:28:07 +00002212 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
2213 InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init", FI,
Alexey Samsonov1444bb92014-10-17 00:20:19 +00002214 SourceLocation(),
David Majnemerb3341ea2014-10-05 05:05:40 +00002215 /*TLS=*/true);
2216 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
2217 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
2218 llvm::GlobalVariable::InternalLinkage,
2219 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
2220 Guard->setThreadLocal(true);
John McCall7f416cc2015-09-08 08:05:57 +00002221
2222 CharUnits GuardAlign = CharUnits::One();
2223 Guard->setAlignment(GuardAlign.getQuantity());
2224
David Majnemerb3341ea2014-10-05 05:05:40 +00002225 CodeGenFunction(CGM)
John McCall7f416cc2015-09-08 08:05:57 +00002226 .GenerateCXXGlobalInitFunc(InitFunc, CXXThreadLocalInits,
2227 Address(Guard, GuardAlign));
David Majnemerb3341ea2014-10-05 05:05:40 +00002228 }
Yaron Kerenede60302015-08-01 19:11:36 +00002229 for (auto &I : CXXThreadLocals) {
2230 const VarDecl *VD = I.first;
2231 llvm::GlobalVariable *Var = I.second;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002232
David Majnemer9b21c332014-07-11 20:28:10 +00002233 // Some targets require that all access to thread local variables go through
2234 // the thread wrapper. This means that we cannot attempt to create a thread
2235 // wrapper or a thread helper.
2236 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
2237 continue;
2238
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002239 // Mangle the name for the thread_local initialization function.
2240 SmallString<256> InitFnName;
2241 {
2242 llvm::raw_svector_ostream Out(InitFnName);
2243 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002244 }
2245
2246 // If we have a definition for the variable, emit the initialization
2247 // function as an alias to the global Init function (if any). Otherwise,
2248 // produce a declaration of the initialization function.
Craig Topper8a13c412014-05-21 05:09:00 +00002249 llvm::GlobalValue *Init = nullptr;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002250 bool InitIsInitFunc = false;
2251 if (VD->hasDefinition()) {
2252 InitIsInitFunc = true;
2253 if (InitFunc)
Rafael Espindola234405b2014-05-17 21:30:14 +00002254 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
2255 InitFunc);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002256 } else {
2257 // Emit a weak global function referring to the initialization function.
2258 // This function will not exist if the TU defining the thread_local
2259 // variable in question does not need any dynamic initialization for
2260 // its thread_local variables.
2261 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
2262 Init = llvm::Function::Create(
2263 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
2264 &CGM.getModule());
2265 }
2266
2267 if (Init)
2268 Init->setVisibility(Var->getVisibility());
2269
2270 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
2271 llvm::LLVMContext &Context = CGM.getModule().getContext();
2272 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
John McCall7f416cc2015-09-08 08:05:57 +00002273 CGBuilderTy Builder(CGM, Entry);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002274 if (InitIsInitFunc) {
2275 if (Init)
David Blaikie4ba525b2015-07-14 17:27:39 +00002276 Builder.CreateCall(Init);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002277 } else {
2278 // Don't know whether we have an init function. Call it if it exists.
2279 llvm::Value *Have = Builder.CreateIsNotNull(Init);
2280 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2281 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2282 Builder.CreateCondBr(Have, InitBB, ExitBB);
2283
2284 Builder.SetInsertPoint(InitBB);
David Blaikie4ba525b2015-07-14 17:27:39 +00002285 Builder.CreateCall(Init);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002286 Builder.CreateBr(ExitBB);
2287
2288 Builder.SetInsertPoint(ExitBB);
2289 }
2290
2291 // For a reference, the result of the wrapper function is a pointer to
2292 // the referenced object.
2293 llvm::Value *Val = Var;
2294 if (VD->getType()->isReferenceType()) {
John McCall7f416cc2015-09-08 08:05:57 +00002295 CharUnits Align = CGM.getContext().getDeclAlign(VD);
2296 Val = Builder.CreateAlignedLoad(Val, Align);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002297 }
Alexander Musmanf94c3182014-09-26 06:28:25 +00002298 if (Val->getType() != Wrapper->getReturnType())
2299 Val = Builder.CreatePointerBitCastOrAddrSpaceCast(
2300 Val, Wrapper->getReturnType(), "");
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002301 Builder.CreateRet(Val);
2302 }
2303}
2304
Richard Smith0f383742014-03-26 22:48:22 +00002305LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2306 const VarDecl *VD,
2307 QualType LValType) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002308 QualType T = VD->getType();
2309 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
2310 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
Alexander Musmanf94c3182014-09-26 06:28:25 +00002311 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002312
David Blaikie4ba525b2015-07-14 17:27:39 +00002313 Val = CGF.Builder.CreateCall(Wrapper);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002314
2315 LValue LV;
2316 if (VD->getType()->isReferenceType())
Richard Smith0f383742014-03-26 22:48:22 +00002317 LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002318 else
Richard Smith0f383742014-03-26 22:48:22 +00002319 LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD));
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002320 // FIXME: need setObjCGCLValueClass?
2321 return LV;
2322}
Peter Collingbourne66f82e62013-06-28 20:45:28 +00002323
2324/// Return whether the given global decl needs a VTT parameter, which it does
2325/// if it's a base constructor or destructor with virtual bases.
2326bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
2327 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
2328
2329 // We don't have any virtual bases, just return early.
2330 if (!MD->getParent()->getNumVBases())
2331 return false;
2332
2333 // Check if we have a base constructor.
2334 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
2335 return true;
2336
2337 // Check if we have a base destructor.
2338 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2339 return true;
2340
2341 return false;
2342}
David Majnemere2cb8d12014-07-07 06:20:47 +00002343
2344namespace {
2345class ItaniumRTTIBuilder {
2346 CodeGenModule &CGM; // Per-module state.
2347 llvm::LLVMContext &VMContext;
2348 const ItaniumCXXABI &CXXABI; // Per-module state.
2349
2350 /// Fields - The fields of the RTTI descriptor currently being built.
2351 SmallVector<llvm::Constant *, 16> Fields;
2352
2353 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2354 llvm::GlobalVariable *
2355 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2356
2357 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2358 /// descriptor of the given type.
2359 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2360
2361 /// BuildVTablePointer - Build the vtable pointer for the given type.
2362 void BuildVTablePointer(const Type *Ty);
2363
2364 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2365 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2366 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2367
2368 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2369 /// classes with bases that do not satisfy the abi::__si_class_type_info
2370 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2371 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2372
2373 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2374 /// for pointer types.
2375 void BuildPointerTypeInfo(QualType PointeeTy);
2376
2377 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2378 /// type_info for an object type.
2379 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2380
2381 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2382 /// struct, used for member pointer types.
2383 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2384
2385public:
2386 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2387 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2388
2389 // Pointer type info flags.
2390 enum {
2391 /// PTI_Const - Type has const qualifier.
2392 PTI_Const = 0x1,
2393
2394 /// PTI_Volatile - Type has volatile qualifier.
2395 PTI_Volatile = 0x2,
2396
2397 /// PTI_Restrict - Type has restrict qualifier.
2398 PTI_Restrict = 0x4,
2399
2400 /// PTI_Incomplete - Type is incomplete.
2401 PTI_Incomplete = 0x8,
2402
2403 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2404 /// (in pointer to member).
2405 PTI_ContainingClassIncomplete = 0x10
2406 };
2407
2408 // VMI type info flags.
2409 enum {
2410 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2411 VMI_NonDiamondRepeat = 0x1,
2412
2413 /// VMI_DiamondShaped - Class is diamond shaped.
2414 VMI_DiamondShaped = 0x2
2415 };
2416
2417 // Base class type info flags.
2418 enum {
2419 /// BCTI_Virtual - Base class is virtual.
2420 BCTI_Virtual = 0x1,
2421
2422 /// BCTI_Public - Base class is public.
2423 BCTI_Public = 0x2
2424 };
2425
2426 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2427 ///
2428 /// \param Force - true to force the creation of this RTTI value
2429 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2430};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002431}
David Majnemere2cb8d12014-07-07 06:20:47 +00002432
2433llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2434 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002435 SmallString<256> Name;
2436 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002437 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002438
2439 // We know that the mangled name of the type starts at index 4 of the
2440 // mangled name of the typename, so we can just index into it in order to
2441 // get the mangled name of the type.
2442 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2443 Name.substr(4));
2444
2445 llvm::GlobalVariable *GV =
2446 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2447
2448 GV->setInitializer(Init);
2449
2450 return GV;
2451}
2452
2453llvm::Constant *
2454ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2455 // Mangle the RTTI name.
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002456 SmallString<256> Name;
2457 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002458 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002459
2460 // Look for an existing global.
2461 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2462
2463 if (!GV) {
2464 // Create a new global variable.
2465 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2466 /*Constant=*/true,
2467 llvm::GlobalValue::ExternalLinkage, nullptr,
2468 Name);
David Majnemer1fb1a042014-11-07 07:26:38 +00002469 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2470 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2471 if (RD->hasAttr<DLLImportAttr>())
2472 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2473 }
David Majnemere2cb8d12014-07-07 06:20:47 +00002474 }
2475
2476 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2477}
2478
2479/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2480/// info for that type is defined in the standard library.
2481static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2482 // Itanium C++ ABI 2.9.2:
2483 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2484 // the run-time support library. Specifically, the run-time support
2485 // library should contain type_info objects for the types X, X* and
2486 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2487 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2488 // long, unsigned long, long long, unsigned long long, float, double,
2489 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2490 // half-precision floating point types.
2491 switch (Ty->getKind()) {
2492 case BuiltinType::Void:
2493 case BuiltinType::NullPtr:
2494 case BuiltinType::Bool:
2495 case BuiltinType::WChar_S:
2496 case BuiltinType::WChar_U:
2497 case BuiltinType::Char_U:
2498 case BuiltinType::Char_S:
2499 case BuiltinType::UChar:
2500 case BuiltinType::SChar:
2501 case BuiltinType::Short:
2502 case BuiltinType::UShort:
2503 case BuiltinType::Int:
2504 case BuiltinType::UInt:
2505 case BuiltinType::Long:
2506 case BuiltinType::ULong:
2507 case BuiltinType::LongLong:
2508 case BuiltinType::ULongLong:
2509 case BuiltinType::Half:
2510 case BuiltinType::Float:
2511 case BuiltinType::Double:
2512 case BuiltinType::LongDouble:
2513 case BuiltinType::Char16:
2514 case BuiltinType::Char32:
2515 case BuiltinType::Int128:
2516 case BuiltinType::UInt128:
2517 case BuiltinType::OCLImage1d:
2518 case BuiltinType::OCLImage1dArray:
2519 case BuiltinType::OCLImage1dBuffer:
2520 case BuiltinType::OCLImage2d:
2521 case BuiltinType::OCLImage2dArray:
Alexey Bader9c8453f2015-09-15 11:18:52 +00002522 case BuiltinType::OCLImage2dDepth:
2523 case BuiltinType::OCLImage2dArrayDepth:
2524 case BuiltinType::OCLImage2dMSAA:
2525 case BuiltinType::OCLImage2dArrayMSAA:
2526 case BuiltinType::OCLImage2dMSAADepth:
2527 case BuiltinType::OCLImage2dArrayMSAADepth:
David Majnemere2cb8d12014-07-07 06:20:47 +00002528 case BuiltinType::OCLImage3d:
2529 case BuiltinType::OCLSampler:
2530 case BuiltinType::OCLEvent:
Alexey Bader9c8453f2015-09-15 11:18:52 +00002531 case BuiltinType::OCLClkEvent:
2532 case BuiltinType::OCLQueue:
2533 case BuiltinType::OCLNDRange:
2534 case BuiltinType::OCLReserveID:
David Majnemere2cb8d12014-07-07 06:20:47 +00002535 return true;
2536
2537 case BuiltinType::Dependent:
2538#define BUILTIN_TYPE(Id, SingletonId)
2539#define PLACEHOLDER_TYPE(Id, SingletonId) \
2540 case BuiltinType::Id:
2541#include "clang/AST/BuiltinTypes.def"
2542 llvm_unreachable("asking for RRTI for a placeholder type!");
2543
2544 case BuiltinType::ObjCId:
2545 case BuiltinType::ObjCClass:
2546 case BuiltinType::ObjCSel:
2547 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2548 }
2549
2550 llvm_unreachable("Invalid BuiltinType Kind!");
2551}
2552
2553static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2554 QualType PointeeTy = PointerTy->getPointeeType();
2555 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2556 if (!BuiltinTy)
2557 return false;
2558
2559 // Check the qualifiers.
2560 Qualifiers Quals = PointeeTy.getQualifiers();
2561 Quals.removeConst();
2562
2563 if (!Quals.empty())
2564 return false;
2565
2566 return TypeInfoIsInStandardLibrary(BuiltinTy);
2567}
2568
2569/// IsStandardLibraryRTTIDescriptor - Returns whether the type
2570/// information for the given type exists in the standard library.
2571static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2572 // Type info for builtin types is defined in the standard library.
2573 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2574 return TypeInfoIsInStandardLibrary(BuiltinTy);
2575
2576 // Type info for some pointer types to builtin types is defined in the
2577 // standard library.
2578 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2579 return TypeInfoIsInStandardLibrary(PointerTy);
2580
2581 return false;
2582}
2583
2584/// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2585/// the given type exists somewhere else, and that we should not emit the type
2586/// information in this translation unit. Assumes that it is not a
2587/// standard-library type.
2588static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2589 QualType Ty) {
2590 ASTContext &Context = CGM.getContext();
2591
2592 // If RTTI is disabled, assume it might be disabled in the
2593 // translation unit that defines any potential key function, too.
2594 if (!Context.getLangOpts().RTTI) return false;
2595
2596 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2597 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2598 if (!RD->hasDefinition())
2599 return false;
2600
2601 if (!RD->isDynamicClass())
2602 return false;
2603
2604 // FIXME: this may need to be reconsidered if the key function
2605 // changes.
David Majnemerbe9022c2015-08-06 20:56:55 +00002606 // N.B. We must always emit the RTTI data ourselves if there exists a key
2607 // function.
2608 bool IsDLLImport = RD->hasAttr<DLLImportAttr>();
David Majnemer1fb1a042014-11-07 07:26:38 +00002609 if (CGM.getVTables().isVTableExternal(RD))
David Majnemerbe9022c2015-08-06 20:56:55 +00002610 return IsDLLImport ? false : true;
David Majnemer1fb1a042014-11-07 07:26:38 +00002611
David Majnemerbe9022c2015-08-06 20:56:55 +00002612 if (IsDLLImport)
David Majnemer1fb1a042014-11-07 07:26:38 +00002613 return true;
David Majnemere2cb8d12014-07-07 06:20:47 +00002614 }
2615
2616 return false;
2617}
2618
2619/// IsIncompleteClassType - Returns whether the given record type is incomplete.
2620static bool IsIncompleteClassType(const RecordType *RecordTy) {
2621 return !RecordTy->getDecl()->isCompleteDefinition();
2622}
2623
2624/// ContainsIncompleteClassType - Returns whether the given type contains an
2625/// incomplete class type. This is true if
2626///
2627/// * The given type is an incomplete class type.
2628/// * The given type is a pointer type whose pointee type contains an
2629/// incomplete class type.
2630/// * The given type is a member pointer type whose class is an incomplete
2631/// class type.
2632/// * The given type is a member pointer type whoise pointee type contains an
2633/// incomplete class type.
2634/// is an indirect or direct pointer to an incomplete class type.
2635static bool ContainsIncompleteClassType(QualType Ty) {
2636 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2637 if (IsIncompleteClassType(RecordTy))
2638 return true;
2639 }
2640
2641 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2642 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2643
2644 if (const MemberPointerType *MemberPointerTy =
2645 dyn_cast<MemberPointerType>(Ty)) {
2646 // Check if the class type is incomplete.
2647 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2648 if (IsIncompleteClassType(ClassType))
2649 return true;
2650
2651 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2652 }
2653
2654 return false;
2655}
2656
2657// CanUseSingleInheritance - Return whether the given record decl has a "single,
2658// public, non-virtual base at offset zero (i.e. the derived class is dynamic
2659// iff the base is)", according to Itanium C++ ABI, 2.95p6b.
2660static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2661 // Check the number of bases.
2662 if (RD->getNumBases() != 1)
2663 return false;
2664
2665 // Get the base.
2666 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2667
2668 // Check that the base is not virtual.
2669 if (Base->isVirtual())
2670 return false;
2671
2672 // Check that the base is public.
2673 if (Base->getAccessSpecifier() != AS_public)
2674 return false;
2675
2676 // Check that the class is dynamic iff the base is.
2677 const CXXRecordDecl *BaseDecl =
2678 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2679 if (!BaseDecl->isEmpty() &&
2680 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2681 return false;
2682
2683 return true;
2684}
2685
2686void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2687 // abi::__class_type_info.
2688 static const char * const ClassTypeInfo =
2689 "_ZTVN10__cxxabiv117__class_type_infoE";
2690 // abi::__si_class_type_info.
2691 static const char * const SIClassTypeInfo =
2692 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2693 // abi::__vmi_class_type_info.
2694 static const char * const VMIClassTypeInfo =
2695 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2696
2697 const char *VTableName = nullptr;
2698
2699 switch (Ty->getTypeClass()) {
2700#define TYPE(Class, Base)
2701#define ABSTRACT_TYPE(Class, Base)
2702#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2703#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2704#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2705#include "clang/AST/TypeNodes.def"
2706 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2707
2708 case Type::LValueReference:
2709 case Type::RValueReference:
2710 llvm_unreachable("References shouldn't get here");
2711
2712 case Type::Auto:
2713 llvm_unreachable("Undeduced auto type shouldn't get here");
2714
2715 case Type::Builtin:
2716 // GCC treats vector and complex types as fundamental types.
2717 case Type::Vector:
2718 case Type::ExtVector:
2719 case Type::Complex:
2720 case Type::Atomic:
2721 // FIXME: GCC treats block pointers as fundamental types?!
2722 case Type::BlockPointer:
2723 // abi::__fundamental_type_info.
2724 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2725 break;
2726
2727 case Type::ConstantArray:
2728 case Type::IncompleteArray:
2729 case Type::VariableArray:
2730 // abi::__array_type_info.
2731 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2732 break;
2733
2734 case Type::FunctionNoProto:
2735 case Type::FunctionProto:
2736 // abi::__function_type_info.
2737 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2738 break;
2739
2740 case Type::Enum:
2741 // abi::__enum_type_info.
2742 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2743 break;
2744
2745 case Type::Record: {
2746 const CXXRecordDecl *RD =
2747 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2748
2749 if (!RD->hasDefinition() || !RD->getNumBases()) {
2750 VTableName = ClassTypeInfo;
2751 } else if (CanUseSingleInheritance(RD)) {
2752 VTableName = SIClassTypeInfo;
2753 } else {
2754 VTableName = VMIClassTypeInfo;
2755 }
2756
2757 break;
2758 }
2759
2760 case Type::ObjCObject:
2761 // Ignore protocol qualifiers.
2762 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2763
2764 // Handle id and Class.
2765 if (isa<BuiltinType>(Ty)) {
2766 VTableName = ClassTypeInfo;
2767 break;
2768 }
2769
2770 assert(isa<ObjCInterfaceType>(Ty));
2771 // Fall through.
2772
2773 case Type::ObjCInterface:
2774 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2775 VTableName = SIClassTypeInfo;
2776 } else {
2777 VTableName = ClassTypeInfo;
2778 }
2779 break;
2780
2781 case Type::ObjCObjectPointer:
2782 case Type::Pointer:
2783 // abi::__pointer_type_info.
2784 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2785 break;
2786
2787 case Type::MemberPointer:
2788 // abi::__pointer_to_member_type_info.
2789 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2790 break;
2791 }
2792
2793 llvm::Constant *VTable =
2794 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2795
2796 llvm::Type *PtrDiffTy =
2797 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2798
2799 // The vtable address point is 2.
2800 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
David Blaikiee3b172a2015-04-02 18:55:21 +00002801 VTable =
2802 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two);
David Majnemere2cb8d12014-07-07 06:20:47 +00002803 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2804
2805 Fields.push_back(VTable);
2806}
2807
2808/// \brief Return the linkage that the type info and type info name constants
2809/// should have for the given type.
2810static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2811 QualType Ty) {
2812 // Itanium C++ ABI 2.9.5p7:
2813 // In addition, it and all of the intermediate abi::__pointer_type_info
2814 // structs in the chain down to the abi::__class_type_info for the
2815 // incomplete class type must be prevented from resolving to the
2816 // corresponding type_info structs for the complete class type, possibly
2817 // by making them local static objects. Finally, a dummy class RTTI is
2818 // generated for the incomplete type that will not resolve to the final
2819 // complete class RTTI (because the latter need not exist), possibly by
2820 // making it a local static object.
2821 if (ContainsIncompleteClassType(Ty))
2822 return llvm::GlobalValue::InternalLinkage;
2823
2824 switch (Ty->getLinkage()) {
2825 case NoLinkage:
2826 case InternalLinkage:
2827 case UniqueExternalLinkage:
2828 return llvm::GlobalValue::InternalLinkage;
2829
2830 case VisibleNoLinkage:
2831 case ExternalLinkage:
2832 if (!CGM.getLangOpts().RTTI) {
2833 // RTTI is not enabled, which means that this type info struct is going
2834 // to be used for exception handling. Give it linkonce_odr linkage.
2835 return llvm::GlobalValue::LinkOnceODRLinkage;
2836 }
2837
2838 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2839 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2840 if (RD->hasAttr<WeakAttr>())
2841 return llvm::GlobalValue::WeakODRLinkage;
David Majnemerbe9022c2015-08-06 20:56:55 +00002842 if (RD->isDynamicClass()) {
2843 llvm::GlobalValue::LinkageTypes LT = CGM.getVTableLinkage(RD);
2844 // MinGW won't export the RTTI information when there is a key function.
2845 // Make sure we emit our own copy instead of attempting to dllimport it.
2846 if (RD->hasAttr<DLLImportAttr>() &&
2847 llvm::GlobalValue::isAvailableExternallyLinkage(LT))
2848 LT = llvm::GlobalValue::LinkOnceODRLinkage;
2849 return LT;
2850 }
David Majnemere2cb8d12014-07-07 06:20:47 +00002851 }
2852
2853 return llvm::GlobalValue::LinkOnceODRLinkage;
2854 }
2855
2856 llvm_unreachable("Invalid linkage!");
2857}
2858
2859llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2860 // We want to operate on the canonical type.
2861 Ty = CGM.getContext().getCanonicalType(Ty);
2862
2863 // Check if we've already emitted an RTTI descriptor for this type.
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002864 SmallString<256> Name;
2865 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002866 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002867
2868 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2869 if (OldGV && !OldGV->isDeclaration()) {
2870 assert(!OldGV->hasAvailableExternallyLinkage() &&
2871 "available_externally typeinfos not yet implemented");
2872
2873 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2874 }
2875
2876 // Check if there is already an external RTTI descriptor for this type.
2877 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2878 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2879 return GetAddrOfExternalRTTIDescriptor(Ty);
2880
2881 // Emit the standard library with external linkage.
2882 llvm::GlobalVariable::LinkageTypes Linkage;
2883 if (IsStdLib)
2884 Linkage = llvm::GlobalValue::ExternalLinkage;
2885 else
2886 Linkage = getTypeInfoLinkage(CGM, Ty);
2887
2888 // Add the vtable pointer.
2889 BuildVTablePointer(cast<Type>(Ty));
2890
2891 // And the name.
2892 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2893 llvm::Constant *TypeNameField;
2894
2895 // If we're supposed to demote the visibility, be sure to set a flag
2896 // to use a string comparison for type_info comparisons.
2897 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2898 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2899 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2900 // The flag is the sign bit, which on ARM64 is defined to be clear
2901 // for global pointers. This is very ARM64-specific.
2902 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2903 llvm::Constant *flag =
2904 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2905 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2906 TypeNameField =
2907 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2908 } else {
2909 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2910 }
2911 Fields.push_back(TypeNameField);
2912
2913 switch (Ty->getTypeClass()) {
2914#define TYPE(Class, Base)
2915#define ABSTRACT_TYPE(Class, Base)
2916#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2917#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2918#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2919#include "clang/AST/TypeNodes.def"
2920 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2921
2922 // GCC treats vector types as fundamental types.
2923 case Type::Builtin:
2924 case Type::Vector:
2925 case Type::ExtVector:
2926 case Type::Complex:
2927 case Type::BlockPointer:
2928 // Itanium C++ ABI 2.9.5p4:
2929 // abi::__fundamental_type_info adds no data members to std::type_info.
2930 break;
2931
2932 case Type::LValueReference:
2933 case Type::RValueReference:
2934 llvm_unreachable("References shouldn't get here");
2935
2936 case Type::Auto:
2937 llvm_unreachable("Undeduced auto type shouldn't get here");
2938
2939 case Type::ConstantArray:
2940 case Type::IncompleteArray:
2941 case Type::VariableArray:
2942 // Itanium C++ ABI 2.9.5p5:
2943 // abi::__array_type_info adds no data members to std::type_info.
2944 break;
2945
2946 case Type::FunctionNoProto:
2947 case Type::FunctionProto:
2948 // Itanium C++ ABI 2.9.5p5:
2949 // abi::__function_type_info adds no data members to std::type_info.
2950 break;
2951
2952 case Type::Enum:
2953 // Itanium C++ ABI 2.9.5p5:
2954 // abi::__enum_type_info adds no data members to std::type_info.
2955 break;
2956
2957 case Type::Record: {
2958 const CXXRecordDecl *RD =
2959 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2960 if (!RD->hasDefinition() || !RD->getNumBases()) {
2961 // We don't need to emit any fields.
2962 break;
2963 }
2964
2965 if (CanUseSingleInheritance(RD))
2966 BuildSIClassTypeInfo(RD);
2967 else
2968 BuildVMIClassTypeInfo(RD);
2969
2970 break;
2971 }
2972
2973 case Type::ObjCObject:
2974 case Type::ObjCInterface:
2975 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
2976 break;
2977
2978 case Type::ObjCObjectPointer:
2979 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
2980 break;
2981
2982 case Type::Pointer:
2983 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
2984 break;
2985
2986 case Type::MemberPointer:
2987 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
2988 break;
2989
2990 case Type::Atomic:
2991 // No fields, at least for the moment.
2992 break;
2993 }
2994
2995 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2996
Rafael Espindolacb92c192015-01-15 23:18:01 +00002997 llvm::Module &M = CGM.getModule();
David Majnemere2cb8d12014-07-07 06:20:47 +00002998 llvm::GlobalVariable *GV =
Rafael Espindolacb92c192015-01-15 23:18:01 +00002999 new llvm::GlobalVariable(M, Init->getType(),
3000 /*Constant=*/true, Linkage, Init, Name);
3001
David Majnemere2cb8d12014-07-07 06:20:47 +00003002 // If there's already an old global variable, replace it with the new one.
3003 if (OldGV) {
3004 GV->takeName(OldGV);
3005 llvm::Constant *NewPtr =
3006 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
3007 OldGV->replaceAllUsesWith(NewPtr);
3008 OldGV->eraseFromParent();
3009 }
3010
Yaron Keren04da2382015-07-29 15:42:28 +00003011 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
3012 GV->setComdat(M.getOrInsertComdat(GV->getName()));
3013
David Majnemere2cb8d12014-07-07 06:20:47 +00003014 // The Itanium ABI specifies that type_info objects must be globally
3015 // unique, with one exception: if the type is an incomplete class
3016 // type or a (possibly indirect) pointer to one. That exception
3017 // affects the general case of comparing type_info objects produced
3018 // by the typeid operator, which is why the comparison operators on
3019 // std::type_info generally use the type_info name pointers instead
3020 // of the object addresses. However, the language's built-in uses
3021 // of RTTI generally require class types to be complete, even when
3022 // manipulating pointers to those class types. This allows the
3023 // implementation of dynamic_cast to rely on address equality tests,
3024 // which is much faster.
3025
3026 // All of this is to say that it's important that both the type_info
3027 // object and the type_info name be uniqued when weakly emitted.
3028
3029 // Give the type_info object and name the formal visibility of the
3030 // type itself.
3031 llvm::GlobalValue::VisibilityTypes llvmVisibility;
3032 if (llvm::GlobalValue::isLocalLinkage(Linkage))
3033 // If the linkage is local, only default visibility makes sense.
3034 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
3035 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
3036 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
3037 else
3038 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
3039 TypeName->setVisibility(llvmVisibility);
3040 GV->setVisibility(llvmVisibility);
3041
3042 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3043}
3044
3045/// ComputeQualifierFlags - Compute the pointer type info flags from the
3046/// given qualifier.
3047static unsigned ComputeQualifierFlags(Qualifiers Quals) {
3048 unsigned Flags = 0;
3049
3050 if (Quals.hasConst())
3051 Flags |= ItaniumRTTIBuilder::PTI_Const;
3052 if (Quals.hasVolatile())
3053 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
3054 if (Quals.hasRestrict())
3055 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
3056
3057 return Flags;
3058}
3059
3060/// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
3061/// for the given Objective-C object type.
3062void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
3063 // Drop qualifiers.
3064 const Type *T = OT->getBaseType().getTypePtr();
3065 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
3066
3067 // The builtin types are abi::__class_type_infos and don't require
3068 // extra fields.
3069 if (isa<BuiltinType>(T)) return;
3070
3071 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
3072 ObjCInterfaceDecl *Super = Class->getSuperClass();
3073
3074 // Root classes are also __class_type_info.
3075 if (!Super) return;
3076
3077 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
3078
3079 // Everything else is single inheritance.
3080 llvm::Constant *BaseTypeInfo =
3081 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
3082 Fields.push_back(BaseTypeInfo);
3083}
3084
3085/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3086/// inheritance, according to the Itanium C++ ABI, 2.95p6b.
3087void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
3088 // Itanium C++ ABI 2.9.5p6b:
3089 // It adds to abi::__class_type_info a single member pointing to the
3090 // type_info structure for the base type,
3091 llvm::Constant *BaseTypeInfo =
3092 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
3093 Fields.push_back(BaseTypeInfo);
3094}
3095
3096namespace {
3097 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
3098 /// a class hierarchy.
3099 struct SeenBases {
3100 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
3101 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
3102 };
3103}
3104
3105/// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
3106/// abi::__vmi_class_type_info.
3107///
3108static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
3109 SeenBases &Bases) {
3110
3111 unsigned Flags = 0;
3112
3113 const CXXRecordDecl *BaseDecl =
3114 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
3115
3116 if (Base->isVirtual()) {
3117 // Mark the virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00003118 if (!Bases.VirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003119 // If this virtual base has been seen before, then the class is diamond
3120 // shaped.
3121 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
3122 } else {
3123 if (Bases.NonVirtualBases.count(BaseDecl))
3124 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3125 }
3126 } else {
3127 // Mark the non-virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00003128 if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003129 // If this non-virtual base has been seen before, then the class has non-
3130 // diamond shaped repeated inheritance.
3131 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3132 } else {
3133 if (Bases.VirtualBases.count(BaseDecl))
3134 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3135 }
3136 }
3137
3138 // Walk all bases.
3139 for (const auto &I : BaseDecl->bases())
3140 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3141
3142 return Flags;
3143}
3144
3145static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
3146 unsigned Flags = 0;
3147 SeenBases Bases;
3148
3149 // Walk all bases.
3150 for (const auto &I : RD->bases())
3151 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3152
3153 return Flags;
3154}
3155
3156/// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
3157/// classes with bases that do not satisfy the abi::__si_class_type_info
3158/// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
3159void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
3160 llvm::Type *UnsignedIntLTy =
3161 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3162
3163 // Itanium C++ ABI 2.9.5p6c:
3164 // __flags is a word with flags describing details about the class
3165 // structure, which may be referenced by using the __flags_masks
3166 // enumeration. These flags refer to both direct and indirect bases.
3167 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
3168 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3169
3170 // Itanium C++ ABI 2.9.5p6c:
3171 // __base_count is a word with the number of direct proper base class
3172 // descriptions that follow.
3173 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
3174
3175 if (!RD->getNumBases())
3176 return;
3177
3178 llvm::Type *LongLTy =
3179 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
3180
3181 // Now add the base class descriptions.
3182
3183 // Itanium C++ ABI 2.9.5p6c:
3184 // __base_info[] is an array of base class descriptions -- one for every
3185 // direct proper base. Each description is of the type:
3186 //
3187 // struct abi::__base_class_type_info {
3188 // public:
3189 // const __class_type_info *__base_type;
3190 // long __offset_flags;
3191 //
3192 // enum __offset_flags_masks {
3193 // __virtual_mask = 0x1,
3194 // __public_mask = 0x2,
3195 // __offset_shift = 8
3196 // };
3197 // };
3198 for (const auto &Base : RD->bases()) {
3199 // The __base_type member points to the RTTI for the base type.
3200 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
3201
3202 const CXXRecordDecl *BaseDecl =
3203 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
3204
3205 int64_t OffsetFlags = 0;
3206
3207 // All but the lower 8 bits of __offset_flags are a signed offset.
3208 // For a non-virtual base, this is the offset in the object of the base
3209 // subobject. For a virtual base, this is the offset in the virtual table of
3210 // the virtual base offset for the virtual base referenced (negative).
3211 CharUnits Offset;
3212 if (Base.isVirtual())
3213 Offset =
3214 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
3215 else {
3216 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
3217 Offset = Layout.getBaseClassOffset(BaseDecl);
3218 };
3219
3220 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
3221
3222 // The low-order byte of __offset_flags contains flags, as given by the
3223 // masks from the enumeration __offset_flags_masks.
3224 if (Base.isVirtual())
3225 OffsetFlags |= BCTI_Virtual;
3226 if (Base.getAccessSpecifier() == AS_public)
3227 OffsetFlags |= BCTI_Public;
3228
3229 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
3230 }
3231}
3232
3233/// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
3234/// used for pointer types.
3235void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
3236 Qualifiers Quals;
3237 QualType UnqualifiedPointeeTy =
3238 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3239
3240 // Itanium C++ ABI 2.9.5p7:
3241 // __flags is a flag word describing the cv-qualification and other
3242 // attributes of the type pointed to
3243 unsigned Flags = ComputeQualifierFlags(Quals);
3244
3245 // Itanium C++ ABI 2.9.5p7:
3246 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3247 // incomplete class type, the incomplete target type flag is set.
3248 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3249 Flags |= PTI_Incomplete;
3250
3251 llvm::Type *UnsignedIntLTy =
3252 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3253 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3254
3255 // Itanium C++ ABI 2.9.5p7:
3256 // __pointee is a pointer to the std::type_info derivation for the
3257 // unqualified type being pointed to.
3258 llvm::Constant *PointeeTypeInfo =
3259 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3260 Fields.push_back(PointeeTypeInfo);
3261}
3262
3263/// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
3264/// struct, used for member pointer types.
3265void
3266ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
3267 QualType PointeeTy = Ty->getPointeeType();
3268
3269 Qualifiers Quals;
3270 QualType UnqualifiedPointeeTy =
3271 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3272
3273 // Itanium C++ ABI 2.9.5p7:
3274 // __flags is a flag word describing the cv-qualification and other
3275 // attributes of the type pointed to.
3276 unsigned Flags = ComputeQualifierFlags(Quals);
3277
3278 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
3279
3280 // Itanium C++ ABI 2.9.5p7:
3281 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3282 // incomplete class type, the incomplete target type flag is set.
3283 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3284 Flags |= PTI_Incomplete;
3285
3286 if (IsIncompleteClassType(ClassType))
3287 Flags |= PTI_ContainingClassIncomplete;
3288
3289 llvm::Type *UnsignedIntLTy =
3290 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3291 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3292
3293 // Itanium C++ ABI 2.9.5p7:
3294 // __pointee is a pointer to the std::type_info derivation for the
3295 // unqualified type being pointed to.
3296 llvm::Constant *PointeeTypeInfo =
3297 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3298 Fields.push_back(PointeeTypeInfo);
3299
3300 // Itanium C++ ABI 2.9.5p9:
3301 // __context is a pointer to an abi::__class_type_info corresponding to the
3302 // class type containing the member pointed to
3303 // (e.g., the "A" in "int A::*").
3304 Fields.push_back(
3305 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
3306}
3307
David Majnemer443250f2015-03-17 20:35:00 +00003308llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003309 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
3310}
3311
3312void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
3313 QualType PointerType = getContext().getPointerType(Type);
3314 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
3315 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
3316 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
3317 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
3318}
3319
3320void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
3321 QualType FundamentalTypes[] = {
3322 getContext().VoidTy, getContext().NullPtrTy,
3323 getContext().BoolTy, getContext().WCharTy,
3324 getContext().CharTy, getContext().UnsignedCharTy,
3325 getContext().SignedCharTy, getContext().ShortTy,
3326 getContext().UnsignedShortTy, getContext().IntTy,
3327 getContext().UnsignedIntTy, getContext().LongTy,
3328 getContext().UnsignedLongTy, getContext().LongLongTy,
3329 getContext().UnsignedLongLongTy, getContext().HalfTy,
3330 getContext().FloatTy, getContext().DoubleTy,
3331 getContext().LongDoubleTy, getContext().Char16Ty,
3332 getContext().Char32Ty,
3333 };
3334 for (const QualType &FundamentalType : FundamentalTypes)
3335 EmitFundamentalRTTIDescriptor(FundamentalType);
3336}
3337
3338/// What sort of uniqueness rules should we use for the RTTI for the
3339/// given type?
3340ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
3341 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
3342 if (shouldRTTIBeUnique())
3343 return RUK_Unique;
3344
3345 // It's only necessary for linkonce_odr or weak_odr linkage.
3346 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
3347 Linkage != llvm::GlobalValue::WeakODRLinkage)
3348 return RUK_Unique;
3349
3350 // It's only necessary with default visibility.
3351 if (CanTy->getVisibility() != DefaultVisibility)
3352 return RUK_Unique;
3353
3354 // If we're not required to publish this symbol, hide it.
3355 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3356 return RUK_NonUniqueHidden;
3357
3358 // If we're required to publish this symbol, as we might be under an
3359 // explicit instantiation, leave it with default visibility but
3360 // enable string-comparisons.
3361 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
3362 return RUK_NonUniqueVisible;
3363}
Rafael Espindola91f68b42014-09-15 19:20:10 +00003364
Rafael Espindola1e4df922014-09-16 15:18:21 +00003365// Find out how to codegen the complete destructor and constructor
3366namespace {
3367enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
3368}
3369static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
3370 const CXXMethodDecl *MD) {
3371 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
3372 return StructorCodegen::Emit;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003373
Rafael Espindola1e4df922014-09-16 15:18:21 +00003374 // The complete and base structors are not equivalent if there are any virtual
3375 // bases, so emit separate functions.
3376 if (MD->getParent()->getNumVBases())
3377 return StructorCodegen::Emit;
3378
3379 GlobalDecl AliasDecl;
3380 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
3381 AliasDecl = GlobalDecl(DD, Dtor_Complete);
3382 } else {
3383 const auto *CD = cast<CXXConstructorDecl>(MD);
3384 AliasDecl = GlobalDecl(CD, Ctor_Complete);
3385 }
3386 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3387
3388 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
3389 return StructorCodegen::RAUW;
3390
3391 // FIXME: Should we allow available_externally aliases?
3392 if (!llvm::GlobalAlias::isValidLinkage(Linkage))
3393 return StructorCodegen::RAUW;
3394
Rafael Espindola0806f982014-09-16 20:19:43 +00003395 if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
3396 // Only ELF supports COMDATs with arbitrary names (C5/D5).
3397 if (CGM.getTarget().getTriple().isOSBinFormatELF())
3398 return StructorCodegen::COMDAT;
3399 return StructorCodegen::Emit;
3400 }
Rafael Espindola1e4df922014-09-16 15:18:21 +00003401
3402 return StructorCodegen::Alias;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003403}
3404
Rafael Espindola1e4df922014-09-16 15:18:21 +00003405static void emitConstructorDestructorAlias(CodeGenModule &CGM,
3406 GlobalDecl AliasDecl,
3407 GlobalDecl TargetDecl) {
3408 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3409
3410 StringRef MangledName = CGM.getMangledName(AliasDecl);
3411 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
3412 if (Entry && !Entry->isDeclaration())
3413 return;
3414
3415 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
Rafael Espindola1e4df922014-09-16 15:18:21 +00003416
3417 // Create the alias with no name.
David Blaikie2a791d72015-09-14 18:38:22 +00003418 auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003419
3420 // Switch any previous uses to the alias.
3421 if (Entry) {
NAKAMURA Takumie9621042015-09-15 01:39:27 +00003422 assert(Entry->getType() == Aliasee->getType() &&
Rafael Espindola1e4df922014-09-16 15:18:21 +00003423 "declaration exists with different type");
3424 Alias->takeName(Entry);
3425 Entry->replaceAllUsesWith(Alias);
3426 Entry->eraseFromParent();
3427 } else {
3428 Alias->setName(MangledName);
3429 }
3430
3431 // Finally, set up the alias with its proper name and attributes.
Dario Domiziolic4fb8ca72014-09-19 22:06:24 +00003432 CGM.setAliasAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003433}
3434
3435void ItaniumCXXABI::emitCXXStructor(const CXXMethodDecl *MD,
3436 StructorType Type) {
3437 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
3438 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
3439
3440 StructorCodegen CGType = getCodegenToUse(CGM, MD);
3441
3442 if (Type == StructorType::Complete) {
3443 GlobalDecl CompleteDecl;
3444 GlobalDecl BaseDecl;
3445 if (CD) {
3446 CompleteDecl = GlobalDecl(CD, Ctor_Complete);
3447 BaseDecl = GlobalDecl(CD, Ctor_Base);
3448 } else {
3449 CompleteDecl = GlobalDecl(DD, Dtor_Complete);
3450 BaseDecl = GlobalDecl(DD, Dtor_Base);
3451 }
3452
3453 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
3454 emitConstructorDestructorAlias(CGM, CompleteDecl, BaseDecl);
3455 return;
3456 }
3457
3458 if (CGType == StructorCodegen::RAUW) {
3459 StringRef MangledName = CGM.getMangledName(CompleteDecl);
Andrey Bokhankocab58582015-08-31 13:20:44 +00003460 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003461 CGM.addReplacement(MangledName, Aliasee);
3462 return;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003463 }
3464 }
3465
3466 // The base destructor is equivalent to the base destructor of its
3467 // base class if there is exactly one non-virtual base class with a
3468 // non-trivial destructor, there are no fields with a non-trivial
3469 // destructor, and the body of the destructor is trivial.
Rafael Espindola1e4df922014-09-16 15:18:21 +00003470 if (DD && Type == StructorType::Base && CGType != StructorCodegen::COMDAT &&
3471 !CGM.TryEmitBaseDestructorAsAlias(DD))
Rafael Espindola91f68b42014-09-15 19:20:10 +00003472 return;
3473
Rafael Espindola1e4df922014-09-16 15:18:21 +00003474 llvm::Function *Fn = CGM.codegenCXXStructor(MD, Type);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003475
Rafael Espindola1e4df922014-09-16 15:18:21 +00003476 if (CGType == StructorCodegen::COMDAT) {
3477 SmallString<256> Buffer;
3478 llvm::raw_svector_ostream Out(Buffer);
3479 if (DD)
3480 getMangleContext().mangleCXXDtorComdat(DD, Out);
3481 else
3482 getMangleContext().mangleCXXCtorComdat(CD, Out);
3483 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
3484 Fn->setComdat(C);
Rafael Espindoladbee8a72015-01-15 21:36:08 +00003485 } else {
3486 CGM.maybeSetTrivialComdat(*MD, *Fn);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003487 }
Rafael Espindola91f68b42014-09-15 19:20:10 +00003488}
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003489
3490static llvm::Constant *getBeginCatchFn(CodeGenModule &CGM) {
3491 // void *__cxa_begin_catch(void*);
3492 llvm::FunctionType *FTy = llvm::FunctionType::get(
3493 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3494
3495 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
3496}
3497
3498static llvm::Constant *getEndCatchFn(CodeGenModule &CGM) {
3499 // void __cxa_end_catch();
3500 llvm::FunctionType *FTy =
3501 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
3502
3503 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
3504}
3505
3506static llvm::Constant *getGetExceptionPtrFn(CodeGenModule &CGM) {
3507 // void *__cxa_get_exception_ptr(void*);
3508 llvm::FunctionType *FTy = llvm::FunctionType::get(
3509 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3510
3511 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
3512}
3513
3514namespace {
3515 /// A cleanup to call __cxa_end_catch. In many cases, the caught
3516 /// exception type lets us state definitively that the thrown exception
3517 /// type does not have a destructor. In particular:
3518 /// - Catch-alls tell us nothing, so we have to conservatively
3519 /// assume that the thrown exception might have a destructor.
3520 /// - Catches by reference behave according to their base types.
3521 /// - Catches of non-record types will only trigger for exceptions
3522 /// of non-record types, which never have destructors.
3523 /// - Catches of record types can trigger for arbitrary subclasses
3524 /// of the caught type, so we have to assume the actual thrown
3525 /// exception type might have a throwing destructor, even if the
3526 /// caught type's destructor is trivial or nothrow.
David Blaikie7e70d682015-08-18 22:40:54 +00003527 struct CallEndCatch final : EHScopeStack::Cleanup {
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003528 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
3529 bool MightThrow;
3530
3531 void Emit(CodeGenFunction &CGF, Flags flags) override {
3532 if (!MightThrow) {
3533 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
3534 return;
3535 }
3536
3537 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
3538 }
3539 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +00003540}
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003541
3542/// Emits a call to __cxa_begin_catch and enters a cleanup to call
3543/// __cxa_end_catch.
3544///
3545/// \param EndMightThrow - true if __cxa_end_catch might throw
3546static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
3547 llvm::Value *Exn,
3548 bool EndMightThrow) {
3549 llvm::CallInst *call =
3550 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
3551
3552 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
3553
3554 return call;
3555}
3556
3557/// A "special initializer" callback for initializing a catch
3558/// parameter during catch initialization.
3559static void InitCatchParam(CodeGenFunction &CGF,
3560 const VarDecl &CatchParam,
John McCall7f416cc2015-09-08 08:05:57 +00003561 Address ParamAddr,
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003562 SourceLocation Loc) {
3563 // Load the exception from where the landing pad saved it.
3564 llvm::Value *Exn = CGF.getExceptionFromSlot();
3565
3566 CanQualType CatchType =
3567 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
3568 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
3569
3570 // If we're catching by reference, we can just cast the object
3571 // pointer to the appropriate pointer.
3572 if (isa<ReferenceType>(CatchType)) {
3573 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
3574 bool EndCatchMightThrow = CaughtType->isRecordType();
3575
3576 // __cxa_begin_catch returns the adjusted object pointer.
3577 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
3578
3579 // We have no way to tell the personality function that we're
3580 // catching by reference, so if we're catching a pointer,
3581 // __cxa_begin_catch will actually return that pointer by value.
3582 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
3583 QualType PointeeType = PT->getPointeeType();
3584
3585 // When catching by reference, generally we should just ignore
3586 // this by-value pointer and use the exception object instead.
3587 if (!PointeeType->isRecordType()) {
3588
3589 // Exn points to the struct _Unwind_Exception header, which
3590 // we have to skip past in order to reach the exception data.
3591 unsigned HeaderSize =
3592 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
3593 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize);
3594
3595 // However, if we're catching a pointer-to-record type that won't
3596 // work, because the personality function might have adjusted
3597 // the pointer. There's actually no way for us to fully satisfy
3598 // the language/ABI contract here: we can't use Exn because it
3599 // might have the wrong adjustment, but we can't use the by-value
3600 // pointer because it's off by a level of abstraction.
3601 //
3602 // The current solution is to dump the adjusted pointer into an
3603 // alloca, which breaks language semantics (because changing the
3604 // pointer doesn't change the exception) but at least works.
3605 // The better solution would be to filter out non-exact matches
3606 // and rethrow them, but this is tricky because the rethrow
3607 // really needs to be catchable by other sites at this landing
3608 // pad. The best solution is to fix the personality function.
3609 } else {
3610 // Pull the pointer for the reference type off.
3611 llvm::Type *PtrTy =
3612 cast<llvm::PointerType>(LLVMCatchTy)->getElementType();
3613
3614 // Create the temporary and write the adjusted pointer into it.
John McCall7f416cc2015-09-08 08:05:57 +00003615 Address ExnPtrTmp =
3616 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp");
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003617 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3618 CGF.Builder.CreateStore(Casted, ExnPtrTmp);
3619
3620 // Bind the reference to the temporary.
John McCall7f416cc2015-09-08 08:05:57 +00003621 AdjustedExn = ExnPtrTmp.getPointer();
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003622 }
3623 }
3624
3625 llvm::Value *ExnCast =
3626 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
3627 CGF.Builder.CreateStore(ExnCast, ParamAddr);
3628 return;
3629 }
3630
3631 // Scalars and complexes.
3632 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
3633 if (TEK != TEK_Aggregate) {
3634 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
3635
3636 // If the catch type is a pointer type, __cxa_begin_catch returns
3637 // the pointer by value.
3638 if (CatchType->hasPointerRepresentation()) {
3639 llvm::Value *CastExn =
3640 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
3641
3642 switch (CatchType.getQualifiers().getObjCLifetime()) {
3643 case Qualifiers::OCL_Strong:
3644 CastExn = CGF.EmitARCRetainNonBlock(CastExn);
3645 // fallthrough
3646
3647 case Qualifiers::OCL_None:
3648 case Qualifiers::OCL_ExplicitNone:
3649 case Qualifiers::OCL_Autoreleasing:
3650 CGF.Builder.CreateStore(CastExn, ParamAddr);
3651 return;
3652
3653 case Qualifiers::OCL_Weak:
3654 CGF.EmitARCInitWeak(ParamAddr, CastExn);
3655 return;
3656 }
3657 llvm_unreachable("bad ownership qualifier!");
3658 }
3659
3660 // Otherwise, it returns a pointer into the exception object.
3661
3662 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3663 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3664
3665 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType);
John McCall7f416cc2015-09-08 08:05:57 +00003666 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003667 switch (TEK) {
3668 case TEK_Complex:
3669 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
3670 /*init*/ true);
3671 return;
3672 case TEK_Scalar: {
3673 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
3674 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
3675 return;
3676 }
3677 case TEK_Aggregate:
3678 llvm_unreachable("evaluation kind filtered out!");
3679 }
3680 llvm_unreachable("bad evaluation kind");
3681 }
3682
3683 assert(isa<RecordType>(CatchType) && "unexpected catch type!");
John McCall7f416cc2015-09-08 08:05:57 +00003684 auto catchRD = CatchType->getAsCXXRecordDecl();
3685 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003686
3687 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3688
3689 // Check for a copy expression. If we don't have a copy expression,
3690 // that means a trivial copy is okay.
3691 const Expr *copyExpr = CatchParam.getInit();
3692 if (!copyExpr) {
3693 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
John McCall7f416cc2015-09-08 08:05:57 +00003694 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3695 caughtExnAlignment);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003696 CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType);
3697 return;
3698 }
3699
3700 // We have to call __cxa_get_exception_ptr to get the adjusted
3701 // pointer before copying.
3702 llvm::CallInst *rawAdjustedExn =
3703 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
3704
3705 // Cast that to the appropriate type.
John McCall7f416cc2015-09-08 08:05:57 +00003706 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3707 caughtExnAlignment);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003708
3709 // The copy expression is defined in terms of an OpaqueValueExpr.
3710 // Find it and map it to the adjusted expression.
3711 CodeGenFunction::OpaqueValueMapping
3712 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
3713 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
3714
3715 // Call the copy ctor in a terminate scope.
3716 CGF.EHStack.pushTerminate();
3717
3718 // Perform the copy construction.
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003719 CGF.EmitAggExpr(copyExpr,
John McCall7f416cc2015-09-08 08:05:57 +00003720 AggValueSlot::forAddr(ParamAddr, Qualifiers(),
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003721 AggValueSlot::IsNotDestructed,
3722 AggValueSlot::DoesNotNeedGCBarriers,
3723 AggValueSlot::IsNotAliased));
3724
3725 // Leave the terminate scope.
3726 CGF.EHStack.popTerminate();
3727
3728 // Undo the opaque value mapping.
3729 opaque.pop();
3730
3731 // Finally we can call __cxa_begin_catch.
3732 CallBeginCatch(CGF, Exn, true);
3733}
3734
3735/// Begins a catch statement by initializing the catch variable and
3736/// calling __cxa_begin_catch.
3737void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF,
3738 const CXXCatchStmt *S) {
3739 // We have to be very careful with the ordering of cleanups here:
3740 // C++ [except.throw]p4:
3741 // The destruction [of the exception temporary] occurs
3742 // immediately after the destruction of the object declared in
3743 // the exception-declaration in the handler.
3744 //
3745 // So the precise ordering is:
3746 // 1. Construct catch variable.
3747 // 2. __cxa_begin_catch
3748 // 3. Enter __cxa_end_catch cleanup
3749 // 4. Enter dtor cleanup
3750 //
3751 // We do this by using a slightly abnormal initialization process.
3752 // Delegation sequence:
3753 // - ExitCXXTryStmt opens a RunCleanupsScope
3754 // - EmitAutoVarAlloca creates the variable and debug info
3755 // - InitCatchParam initializes the variable from the exception
3756 // - CallBeginCatch calls __cxa_begin_catch
3757 // - CallBeginCatch enters the __cxa_end_catch cleanup
3758 // - EmitAutoVarCleanups enters the variable destructor cleanup
3759 // - EmitCXXTryStmt emits the code for the catch body
3760 // - EmitCXXTryStmt close the RunCleanupsScope
3761
3762 VarDecl *CatchParam = S->getExceptionDecl();
3763 if (!CatchParam) {
3764 llvm::Value *Exn = CGF.getExceptionFromSlot();
3765 CallBeginCatch(CGF, Exn, true);
3766 return;
3767 }
3768
3769 // Emit the local.
3770 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
3771 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart());
3772 CGF.EmitAutoVarCleanups(var);
3773}
3774
3775/// Get or define the following function:
3776/// void @__clang_call_terminate(i8* %exn) nounwind noreturn
3777/// This code is used only in C++.
3778static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) {
3779 llvm::FunctionType *fnTy =
3780 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3781 llvm::Constant *fnRef =
3782 CGM.CreateRuntimeFunction(fnTy, "__clang_call_terminate");
3783
3784 llvm::Function *fn = dyn_cast<llvm::Function>(fnRef);
3785 if (fn && fn->empty()) {
3786 fn->setDoesNotThrow();
3787 fn->setDoesNotReturn();
3788
3789 // What we really want is to massively penalize inlining without
3790 // forbidding it completely. The difference between that and
3791 // 'noinline' is negligible.
3792 fn->addFnAttr(llvm::Attribute::NoInline);
3793
3794 // Allow this function to be shared across translation units, but
3795 // we don't want it to turn into an exported symbol.
3796 fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
3797 fn->setVisibility(llvm::Function::HiddenVisibility);
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00003798 if (CGM.supportsCOMDAT())
3799 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003800
3801 // Set up the function.
3802 llvm::BasicBlock *entry =
3803 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
John McCall7f416cc2015-09-08 08:05:57 +00003804 CGBuilderTy builder(CGM, entry);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003805
3806 // Pull the exception pointer out of the parameter list.
3807 llvm::Value *exn = &*fn->arg_begin();
3808
3809 // Call __cxa_begin_catch(exn).
3810 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
3811 catchCall->setDoesNotThrow();
3812 catchCall->setCallingConv(CGM.getRuntimeCC());
3813
3814 // Call std::terminate().
David Blaikie4ba525b2015-07-14 17:27:39 +00003815 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn());
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003816 termCall->setDoesNotThrow();
3817 termCall->setDoesNotReturn();
3818 termCall->setCallingConv(CGM.getRuntimeCC());
3819
3820 // std::terminate cannot return.
3821 builder.CreateUnreachable();
3822 }
3823
3824 return fnRef;
3825}
3826
3827llvm::CallInst *
3828ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
3829 llvm::Value *Exn) {
3830 // In C++, we want to call __cxa_begin_catch() before terminating.
3831 if (Exn) {
3832 assert(CGF.CGM.getLangOpts().CPlusPlus);
3833 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn);
3834 }
3835 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
3836}