blob: 8392f6a7ba2e1cd709ab606653d1080e1181d94a [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:
464 return new ARMCXXABI(CGM);
Charles Davis4e786dd2010-05-25 19:52:27 +0000465
Tim Northovera2ee4332014-03-29 15:09:45 +0000466 case TargetCXXABI::iOS64:
467 return new iOS64CXXABI(CGM);
468
Tim Northover9bb857a2013-01-31 12:13:10 +0000469 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
470 // include the other 32-bit ARM oddities: constructor/destructor return values
471 // and array cookies.
472 case TargetCXXABI::GenericAArch64:
Mark Seabornedf0d382013-07-24 16:25:13 +0000473 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
474 /* UseARMGuardVarABI = */ true);
Tim Northover9bb857a2013-01-31 12:13:10 +0000475
Zoran Jovanovic26a12162015-02-18 15:21:35 +0000476 case TargetCXXABI::GenericMIPS:
477 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true);
478
Dan Gohmanc2853072015-09-03 22:51:53 +0000479 case TargetCXXABI::WebAssembly:
480 return new WebAssemblyCXXABI(CGM);
481
John McCall57625922013-01-25 23:36:14 +0000482 case TargetCXXABI::GenericItanium:
Mark Seabornedf0d382013-07-24 16:25:13 +0000483 if (CGM.getContext().getTargetInfo().getTriple().getArch()
484 == llvm::Triple::le32) {
485 // For PNaCl, use ARM-style method pointers so that PNaCl code
486 // does not assume anything about the alignment of function
487 // pointers.
488 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
489 /* UseARMGuardVarABI = */ false);
490 }
John McCall57625922013-01-25 23:36:14 +0000491 return new ItaniumCXXABI(CGM);
492
493 case TargetCXXABI::Microsoft:
494 llvm_unreachable("Microsoft ABI is not Itanium-based");
495 }
496 llvm_unreachable("bad ABI kind");
John McCall86353412010-08-21 22:46:04 +0000497}
498
Chris Lattnera5f58b02011-07-09 17:41:47 +0000499llvm::Type *
John McCall7a9aac22010-08-23 01:21:21 +0000500ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
501 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000502 return CGM.PtrDiffTy;
Reid Kleckneree7cf842014-12-01 22:02:27 +0000503 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, nullptr);
John McCall1c456c82010-08-22 06:43:33 +0000504}
505
John McCalld9c6c0b2010-08-22 00:59:17 +0000506/// In the Itanium and ARM ABIs, method pointers have the form:
507/// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
508///
509/// In the Itanium ABI:
510/// - method pointers are virtual if (memptr.ptr & 1) is nonzero
511/// - the this-adjustment is (memptr.adj)
512/// - the virtual offset is (memptr.ptr - 1)
513///
514/// In the ARM ABI:
515/// - method pointers are virtual if (memptr.adj & 1) is nonzero
516/// - the this-adjustment is (memptr.adj >> 1)
517/// - the virtual offset is (memptr.ptr)
518/// ARM uses 'adj' for the virtual flag because Thumb functions
519/// may be only single-byte aligned.
520///
521/// If the member is virtual, the adjusted 'this' pointer points
522/// to a vtable pointer from which the virtual offset is applied.
523///
524/// If the member is non-virtual, memptr.ptr is the address of
525/// the function to call.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000526llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
John McCall7f416cc2015-09-08 08:05:57 +0000527 CodeGenFunction &CGF, const Expr *E, Address ThisAddr,
528 llvm::Value *&ThisPtrForCall,
David Majnemer2b0d66d2014-02-20 23:22:07 +0000529 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
John McCall475999d2010-08-22 00:05:51 +0000530 CGBuilderTy &Builder = CGF.Builder;
531
532 const FunctionProtoType *FPT =
533 MPT->getPointeeType()->getAs<FunctionProtoType>();
534 const CXXRecordDecl *RD =
535 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
536
Chris Lattner2192fe52011-07-18 04:24:23 +0000537 llvm::FunctionType *FTy =
John McCalla729c622012-02-17 03:33:10 +0000538 CGM.getTypes().GetFunctionType(
539 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
John McCall475999d2010-08-22 00:05:51 +0000540
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000541 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
John McCall475999d2010-08-22 00:05:51 +0000542
John McCalld9c6c0b2010-08-22 00:59:17 +0000543 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
544 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
545 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
546
John McCalla1dee5302010-08-22 10:59:02 +0000547 // Extract memptr.adj, which is in the second field.
548 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
John McCalld9c6c0b2010-08-22 00:59:17 +0000549
550 // Compute the true adjustment.
551 llvm::Value *Adj = RawAdj;
Mark Seabornedf0d382013-07-24 16:25:13 +0000552 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000553 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
John McCall475999d2010-08-22 00:05:51 +0000554
555 // Apply the adjustment and cast back to the original struct type
556 // for consistency.
John McCall7f416cc2015-09-08 08:05:57 +0000557 llvm::Value *This = ThisAddr.getPointer();
John McCalld9c6c0b2010-08-22 00:59:17 +0000558 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
559 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
560 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
John McCall7f416cc2015-09-08 08:05:57 +0000561 ThisPtrForCall = This;
John McCall475999d2010-08-22 00:05:51 +0000562
563 // Load the function pointer.
John McCalla1dee5302010-08-22 10:59:02 +0000564 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
John McCall475999d2010-08-22 00:05:51 +0000565
566 // If the LSB in the function pointer is 1, the function pointer points to
567 // a virtual function.
John McCalld9c6c0b2010-08-22 00:59:17 +0000568 llvm::Value *IsVirtual;
Mark Seabornedf0d382013-07-24 16:25:13 +0000569 if (UseARMMethodPtrABI)
John McCalld9c6c0b2010-08-22 00:59:17 +0000570 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
571 else
572 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
573 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
John McCall475999d2010-08-22 00:05:51 +0000574 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
575
576 // In the virtual path, the adjustment left 'This' pointing to the
577 // vtable of the correct base subobject. The "function pointer" is an
John McCalld9c6c0b2010-08-22 00:59:17 +0000578 // offset within the vtable (+1 for the virtual flag on non-ARM).
John McCall475999d2010-08-22 00:05:51 +0000579 CGF.EmitBlock(FnVirtual);
580
581 // Cast the adjusted this to a pointer to vtable pointer and load.
Chris Lattner2192fe52011-07-18 04:24:23 +0000582 llvm::Type *VTableTy = Builder.getInt8PtrTy();
John McCall7f416cc2015-09-08 08:05:57 +0000583 CharUnits VTablePtrAlign =
584 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD,
585 CGF.getPointerAlign());
586 llvm::Value *VTable =
Piotr Padlewski4b1ac722015-09-15 21:46:55 +0000587 CGF.GetVTablePtr(Address(This, VTablePtrAlign), VTableTy, RD);
John McCall475999d2010-08-22 00:05:51 +0000588
589 // Apply the offset.
John McCalld9c6c0b2010-08-22 00:59:17 +0000590 llvm::Value *VTableOffset = FnAsInt;
Mark Seabornedf0d382013-07-24 16:25:13 +0000591 if (!UseARMMethodPtrABI)
592 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
John McCalld9c6c0b2010-08-22 00:59:17 +0000593 VTable = Builder.CreateGEP(VTable, VTableOffset);
John McCall475999d2010-08-22 00:05:51 +0000594
595 // Load the virtual function to call.
596 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
John McCall7f416cc2015-09-08 08:05:57 +0000597 llvm::Value *VirtualFn =
598 Builder.CreateAlignedLoad(VTable, CGF.getPointerAlign(),
599 "memptr.virtualfn");
John McCall475999d2010-08-22 00:05:51 +0000600 CGF.EmitBranch(FnEnd);
601
602 // In the non-virtual path, the function pointer is actually a
603 // function pointer.
604 CGF.EmitBlock(FnNonVirtual);
605 llvm::Value *NonVirtualFn =
John McCalld9c6c0b2010-08-22 00:59:17 +0000606 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
John McCall475999d2010-08-22 00:05:51 +0000607
608 // We're done.
609 CGF.EmitBlock(FnEnd);
Jay Foad20c0f022011-03-30 11:28:58 +0000610 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
John McCall475999d2010-08-22 00:05:51 +0000611 Callee->addIncoming(VirtualFn, FnVirtual);
612 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
613 return Callee;
614}
John McCalla8bbb822010-08-22 03:04:22 +0000615
John McCallc134eb52010-08-31 21:07:20 +0000616/// Compute an l-value by applying the given pointer-to-member to a
617/// base object.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000618llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
John McCall7f416cc2015-09-08 08:05:57 +0000619 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
David Majnemer2b0d66d2014-02-20 23:22:07 +0000620 const MemberPointerType *MPT) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000621 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCallc134eb52010-08-31 21:07:20 +0000622
623 CGBuilderTy &Builder = CGF.Builder;
624
John McCallc134eb52010-08-31 21:07:20 +0000625 // Cast to char*.
John McCall7f416cc2015-09-08 08:05:57 +0000626 Base = Builder.CreateElementBitCast(Base, CGF.Int8Ty);
John McCallc134eb52010-08-31 21:07:20 +0000627
628 // Apply the offset, which we assume is non-null.
John McCall7f416cc2015-09-08 08:05:57 +0000629 llvm::Value *Addr =
630 Builder.CreateInBoundsGEP(Base.getPointer(), MemPtr, "memptr.offset");
John McCallc134eb52010-08-31 21:07:20 +0000631
632 // Cast the address to the appropriate pointer type, adopting the
633 // address space of the base pointer.
John McCall7f416cc2015-09-08 08:05:57 +0000634 llvm::Type *PType = CGF.ConvertTypeForMem(MPT->getPointeeType())
635 ->getPointerTo(Base.getAddressSpace());
John McCallc134eb52010-08-31 21:07:20 +0000636 return Builder.CreateBitCast(Addr, PType);
637}
638
John McCallc62bb392012-02-15 01:22:51 +0000639/// Perform a bitcast, derived-to-base, or base-to-derived member pointer
640/// conversion.
641///
642/// Bitcast conversions are always a no-op under Itanium.
John McCall7a9aac22010-08-23 01:21:21 +0000643///
644/// Obligatory offset/adjustment diagram:
645/// <-- offset --> <-- adjustment -->
646/// |--------------------------|----------------------|--------------------|
647/// ^Derived address point ^Base address point ^Member address point
648///
649/// So when converting a base member pointer to a derived member pointer,
650/// we add the offset to the adjustment because the address point has
651/// decreased; and conversely, when converting a derived MP to a base MP
652/// we subtract the offset from the adjustment because the address point
653/// has increased.
654///
655/// The standard forbids (at compile time) conversion to and from
656/// virtual bases, which is why we don't have to consider them here.
657///
658/// The standard forbids (at run time) casting a derived MP to a base
659/// MP when the derived MP does not point to a member of the base.
660/// This is why -1 is a reasonable choice for null data member
661/// pointers.
John McCalla1dee5302010-08-22 10:59:02 +0000662llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000663ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
664 const CastExpr *E,
John McCallc62bb392012-02-15 01:22:51 +0000665 llvm::Value *src) {
John McCalle3027922010-08-25 11:45:40 +0000666 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
John McCallc62bb392012-02-15 01:22:51 +0000667 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
668 E->getCastKind() == CK_ReinterpretMemberPointer);
669
670 // Under Itanium, reinterprets don't require any additional processing.
671 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
672
673 // Use constant emission if we can.
674 if (isa<llvm::Constant>(src))
675 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
676
677 llvm::Constant *adj = getMemberPointerAdjustment(E);
678 if (!adj) return src;
John McCalla8bbb822010-08-22 03:04:22 +0000679
680 CGBuilderTy &Builder = CGF.Builder;
John McCallc62bb392012-02-15 01:22:51 +0000681 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
John McCalla8bbb822010-08-22 03:04:22 +0000682
John McCallc62bb392012-02-15 01:22:51 +0000683 const MemberPointerType *destTy =
684 E->getType()->castAs<MemberPointerType>();
John McCall1c456c82010-08-22 06:43:33 +0000685
John McCall7a9aac22010-08-23 01:21:21 +0000686 // For member data pointers, this is just a matter of adding the
687 // offset if the source is non-null.
John McCallc62bb392012-02-15 01:22:51 +0000688 if (destTy->isMemberDataPointer()) {
689 llvm::Value *dst;
690 if (isDerivedToBase)
691 dst = Builder.CreateNSWSub(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000692 else
John McCallc62bb392012-02-15 01:22:51 +0000693 dst = Builder.CreateNSWAdd(src, adj, "adj");
John McCall7a9aac22010-08-23 01:21:21 +0000694
695 // Null check.
John McCallc62bb392012-02-15 01:22:51 +0000696 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
697 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
698 return Builder.CreateSelect(isNull, src, dst);
John McCall7a9aac22010-08-23 01:21:21 +0000699 }
700
John McCalla1dee5302010-08-22 10:59:02 +0000701 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000702 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000703 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
704 offset <<= 1;
705 adj = llvm::ConstantInt::get(adj->getType(), offset);
John McCalla1dee5302010-08-22 10:59:02 +0000706 }
707
John McCallc62bb392012-02-15 01:22:51 +0000708 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
709 llvm::Value *dstAdj;
710 if (isDerivedToBase)
711 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000712 else
John McCallc62bb392012-02-15 01:22:51 +0000713 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
John McCalla1dee5302010-08-22 10:59:02 +0000714
John McCallc62bb392012-02-15 01:22:51 +0000715 return Builder.CreateInsertValue(src, dstAdj, 1);
716}
717
718llvm::Constant *
719ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
720 llvm::Constant *src) {
721 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
722 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
723 E->getCastKind() == CK_ReinterpretMemberPointer);
724
725 // Under Itanium, reinterprets don't require any additional processing.
726 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
727
728 // If the adjustment is trivial, we don't need to do anything.
729 llvm::Constant *adj = getMemberPointerAdjustment(E);
730 if (!adj) return src;
731
732 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
733
734 const MemberPointerType *destTy =
735 E->getType()->castAs<MemberPointerType>();
736
737 // For member data pointers, this is just a matter of adding the
738 // offset if the source is non-null.
739 if (destTy->isMemberDataPointer()) {
740 // null maps to null.
741 if (src->isAllOnesValue()) return src;
742
743 if (isDerivedToBase)
744 return llvm::ConstantExpr::getNSWSub(src, adj);
745 else
746 return llvm::ConstantExpr::getNSWAdd(src, adj);
747 }
748
749 // The this-adjustment is left-shifted by 1 on ARM.
Mark Seabornedf0d382013-07-24 16:25:13 +0000750 if (UseARMMethodPtrABI) {
John McCallc62bb392012-02-15 01:22:51 +0000751 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
752 offset <<= 1;
753 adj = llvm::ConstantInt::get(adj->getType(), offset);
754 }
755
756 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
757 llvm::Constant *dstAdj;
758 if (isDerivedToBase)
759 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
760 else
761 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
762
763 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
John McCalla8bbb822010-08-22 03:04:22 +0000764}
John McCall84fa5102010-08-22 04:16:24 +0000765
766llvm::Constant *
John McCall7a9aac22010-08-23 01:21:21 +0000767ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
John McCall7a9aac22010-08-23 01:21:21 +0000768 // Itanium C++ ABI 2.3:
769 // A NULL pointer is represented as -1.
770 if (MPT->isMemberDataPointer())
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000771 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
John McCalla1dee5302010-08-22 10:59:02 +0000772
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000773 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
John McCalla1dee5302010-08-22 10:59:02 +0000774 llvm::Constant *Values[2] = { Zero, Zero };
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000775 return llvm::ConstantStruct::getAnon(Values);
John McCall84fa5102010-08-22 04:16:24 +0000776}
777
John McCallf3a88602011-02-03 08:15:49 +0000778llvm::Constant *
779ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
780 CharUnits offset) {
John McCall7a9aac22010-08-23 01:21:21 +0000781 // Itanium C++ ABI 2.3:
782 // A pointer to data member is an offset from the base address of
783 // the class object containing it, represented as a ptrdiff_t
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000784 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
John McCall7a9aac22010-08-23 01:21:21 +0000785}
786
David Majnemere2be95b2015-06-23 07:31:01 +0000787llvm::Constant *
788ItaniumCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
Richard Smithdafff942012-01-14 04:30:29 +0000789 return BuildMemberPointer(MD, CharUnits::Zero());
790}
791
792llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
793 CharUnits ThisAdjustment) {
John McCalla1dee5302010-08-22 10:59:02 +0000794 assert(MD->isInstance() && "Member function must not be static!");
795 MD = MD->getCanonicalDecl();
796
797 CodeGenTypes &Types = CGM.getTypes();
John McCalla1dee5302010-08-22 10:59:02 +0000798
799 // Get the function pointer (or index if this is a virtual function).
800 llvm::Constant *MemPtr[2];
801 if (MD->isVirtual()) {
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000802 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
John McCalla1dee5302010-08-22 10:59:02 +0000803
Ken Dyckdf016282011-04-09 01:30:02 +0000804 const ASTContext &Context = getContext();
805 CharUnits PointerWidth =
Douglas Gregore8bbc122011-09-02 00:18:52 +0000806 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
Ken Dyckdf016282011-04-09 01:30:02 +0000807 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000808
Mark Seabornedf0d382013-07-24 16:25:13 +0000809 if (UseARMMethodPtrABI) {
John McCalla1dee5302010-08-22 10:59:02 +0000810 // ARM C++ ABI 3.2.1:
811 // This ABI specifies that adj contains twice the this
812 // adjustment, plus 1 if the member function is virtual. The
813 // least significant bit of adj then makes exactly the same
814 // discrimination as the least significant bit of ptr does for
815 // Itanium.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000816 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
817 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000818 2 * ThisAdjustment.getQuantity() + 1);
John McCalla1dee5302010-08-22 10:59:02 +0000819 } else {
820 // Itanium C++ ABI 2.3:
821 // For a virtual function, [the pointer field] is 1 plus the
822 // virtual table offset (in bytes) of the function,
823 // represented as a ptrdiff_t.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000824 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
825 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
Richard Smithdafff942012-01-14 04:30:29 +0000826 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000827 }
828 } else {
John McCall2979fe02011-04-12 00:42:48 +0000829 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
Chris Lattner2192fe52011-07-18 04:24:23 +0000830 llvm::Type *Ty;
John McCall2979fe02011-04-12 00:42:48 +0000831 // Check whether the function has a computable LLVM signature.
Chris Lattner8806e322011-07-10 00:18:59 +0000832 if (Types.isFuncTypeConvertible(FPT)) {
John McCall2979fe02011-04-12 00:42:48 +0000833 // The function has a computable LLVM signature; use the correct type.
John McCalla729c622012-02-17 03:33:10 +0000834 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
John McCalla1dee5302010-08-22 10:59:02 +0000835 } else {
John McCall2979fe02011-04-12 00:42:48 +0000836 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
837 // function type is incomplete.
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000838 Ty = CGM.PtrDiffTy;
John McCalla1dee5302010-08-22 10:59:02 +0000839 }
John McCall2979fe02011-04-12 00:42:48 +0000840 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
John McCalla1dee5302010-08-22 10:59:02 +0000841
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000842 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
Mark Seabornedf0d382013-07-24 16:25:13 +0000843 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
844 (UseARMMethodPtrABI ? 2 : 1) *
Richard Smithdafff942012-01-14 04:30:29 +0000845 ThisAdjustment.getQuantity());
John McCalla1dee5302010-08-22 10:59:02 +0000846 }
John McCall1c456c82010-08-22 06:43:33 +0000847
Chris Lattnere64d7ba2011-06-20 04:01:35 +0000848 return llvm::ConstantStruct::getAnon(MemPtr);
John McCall1c456c82010-08-22 06:43:33 +0000849}
850
Richard Smithdafff942012-01-14 04:30:29 +0000851llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
852 QualType MPType) {
853 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
854 const ValueDecl *MPD = MP.getMemberPointerDecl();
855 if (!MPD)
856 return EmitNullMemberPointer(MPT);
857
Reid Kleckner452abac2013-05-09 21:01:17 +0000858 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
Richard Smithdafff942012-01-14 04:30:29 +0000859
860 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
861 return BuildMemberPointer(MD, ThisAdjustment);
862
863 CharUnits FieldOffset =
864 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
865 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
866}
867
John McCall131d97d2010-08-22 08:30:07 +0000868/// The comparison algorithm is pretty easy: the member pointers are
869/// the same if they're either bitwise identical *or* both null.
870///
871/// ARM is different here only because null-ness is more complicated.
872llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000873ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
874 llvm::Value *L,
875 llvm::Value *R,
876 const MemberPointerType *MPT,
877 bool Inequality) {
John McCall131d97d2010-08-22 08:30:07 +0000878 CGBuilderTy &Builder = CGF.Builder;
879
John McCall131d97d2010-08-22 08:30:07 +0000880 llvm::ICmpInst::Predicate Eq;
881 llvm::Instruction::BinaryOps And, Or;
882 if (Inequality) {
883 Eq = llvm::ICmpInst::ICMP_NE;
884 And = llvm::Instruction::Or;
885 Or = llvm::Instruction::And;
886 } else {
887 Eq = llvm::ICmpInst::ICMP_EQ;
888 And = llvm::Instruction::And;
889 Or = llvm::Instruction::Or;
890 }
891
John McCall7a9aac22010-08-23 01:21:21 +0000892 // Member data pointers are easy because there's a unique null
893 // value, so it just comes down to bitwise equality.
894 if (MPT->isMemberDataPointer())
895 return Builder.CreateICmp(Eq, L, R);
896
897 // For member function pointers, the tautologies are more complex.
898 // The Itanium tautology is:
John McCall61a14882010-08-23 06:56:36 +0000899 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
John McCall7a9aac22010-08-23 01:21:21 +0000900 // The ARM tautology is:
John McCall61a14882010-08-23 06:56:36 +0000901 // (L == R) <==> (L.ptr == R.ptr &&
902 // (L.adj == R.adj ||
903 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
John McCall7a9aac22010-08-23 01:21:21 +0000904 // The inequality tautologies have exactly the same structure, except
905 // applying De Morgan's laws.
906
907 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
908 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
909
John McCall131d97d2010-08-22 08:30:07 +0000910 // This condition tests whether L.ptr == R.ptr. This must always be
911 // true for equality to hold.
912 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
913
914 // This condition, together with the assumption that L.ptr == R.ptr,
915 // tests whether the pointers are both null. ARM imposes an extra
916 // condition.
917 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
918 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
919
920 // This condition tests whether L.adj == R.adj. If this isn't
921 // true, the pointers are unequal unless they're both null.
John McCalla1dee5302010-08-22 10:59:02 +0000922 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
923 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000924 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
925
926 // Null member function pointers on ARM clear the low bit of Adj,
927 // so the zero condition has to check that neither low bit is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000928 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000929 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
930
931 // Compute (l.adj | r.adj) & 1 and test it against zero.
932 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
933 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
934 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
935 "cmp.or.adj");
936 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
937 }
938
939 // Tie together all our conditions.
940 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
941 Result = Builder.CreateBinOp(And, PtrEq, Result,
942 Inequality ? "memptr.ne" : "memptr.eq");
943 return Result;
944}
945
946llvm::Value *
John McCall7a9aac22010-08-23 01:21:21 +0000947ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
948 llvm::Value *MemPtr,
949 const MemberPointerType *MPT) {
John McCall131d97d2010-08-22 08:30:07 +0000950 CGBuilderTy &Builder = CGF.Builder;
John McCall7a9aac22010-08-23 01:21:21 +0000951
952 /// For member data pointers, this is just a check against -1.
953 if (MPT->isMemberDataPointer()) {
Reid Kleckner9cffbc12013-03-22 16:13:10 +0000954 assert(MemPtr->getType() == CGM.PtrDiffTy);
John McCall7a9aac22010-08-23 01:21:21 +0000955 llvm::Value *NegativeOne =
956 llvm::Constant::getAllOnesValue(MemPtr->getType());
957 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
958 }
John McCall131d97d2010-08-22 08:30:07 +0000959
Daniel Dunbar914bc412011-04-19 23:10:47 +0000960 // In Itanium, a member function pointer is not null if 'ptr' is not null.
John McCalla1dee5302010-08-22 10:59:02 +0000961 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
John McCall131d97d2010-08-22 08:30:07 +0000962
963 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
964 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
965
Daniel Dunbar914bc412011-04-19 23:10:47 +0000966 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
967 // (the virtual bit) is set.
Mark Seabornedf0d382013-07-24 16:25:13 +0000968 if (UseARMMethodPtrABI) {
John McCall131d97d2010-08-22 08:30:07 +0000969 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
John McCalla1dee5302010-08-22 10:59:02 +0000970 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
John McCall131d97d2010-08-22 08:30:07 +0000971 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
Daniel Dunbar914bc412011-04-19 23:10:47 +0000972 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
973 "memptr.isvirtual");
974 Result = Builder.CreateOr(Result, IsVirtual);
John McCall131d97d2010-08-22 08:30:07 +0000975 }
976
977 return Result;
978}
John McCall1c456c82010-08-22 06:43:33 +0000979
Reid Kleckner40ca9132014-05-13 22:05:45 +0000980bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
981 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
982 if (!RD)
983 return false;
984
Reid Klecknerd355ca72014-05-15 01:26:32 +0000985 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
986 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
987 // special members.
988 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
John McCall7f416cc2015-09-08 08:05:57 +0000989 auto Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
990 FI.getReturnInfo() = ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
Reid Kleckner40ca9132014-05-13 22:05:45 +0000991 return true;
992 }
Reid Kleckner40ca9132014-05-13 22:05:45 +0000993 return false;
994}
995
John McCall614dbdc2010-08-22 21:01:12 +0000996/// The Itanium ABI requires non-zero initialization only for data
997/// member pointers, for which '0' is a valid offset.
998bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
David Majnemer5fd33e02015-04-24 01:25:08 +0000999 return MPT->isMemberFunctionPointer();
John McCall84fa5102010-08-22 04:16:24 +00001000}
John McCall5d865c322010-08-31 07:33:07 +00001001
John McCall82fb8922012-09-25 10:10:39 +00001002/// The Itanium ABI always places an offset to the complete object
1003/// at entry -2 in the vtable.
David Majnemer08681372014-11-01 07:37:17 +00001004void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
1005 const CXXDeleteExpr *DE,
John McCall7f416cc2015-09-08 08:05:57 +00001006 Address Ptr,
David Majnemer08681372014-11-01 07:37:17 +00001007 QualType ElementType,
1008 const CXXDestructorDecl *Dtor) {
1009 bool UseGlobalDelete = DE->isGlobalDelete();
David Majnemer0c0b6d92014-10-31 20:09:12 +00001010 if (UseGlobalDelete) {
1011 // Derive the complete-object pointer, which is what we need
1012 // to pass to the deallocation function.
John McCall82fb8922012-09-25 10:10:39 +00001013
David Majnemer0c0b6d92014-10-31 20:09:12 +00001014 // Grab the vtable pointer as an intptr_t*.
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001015 auto *ClassDecl =
1016 cast<CXXRecordDecl>(ElementType->getAs<RecordType>()->getDecl());
1017 llvm::Value *VTable =
1018 CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo(), ClassDecl);
John McCall82fb8922012-09-25 10:10:39 +00001019
David Majnemer0c0b6d92014-10-31 20:09:12 +00001020 // Track back to entry -2 and pull out the offset there.
1021 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
1022 VTable, -2, "complete-offset.ptr");
John McCall7f416cc2015-09-08 08:05:57 +00001023 llvm::Value *Offset =
1024 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
David Majnemer0c0b6d92014-10-31 20:09:12 +00001025
1026 // Apply the offset.
John McCall7f416cc2015-09-08 08:05:57 +00001027 llvm::Value *CompletePtr =
1028 CGF.Builder.CreateBitCast(Ptr.getPointer(), CGF.Int8PtrTy);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001029 CompletePtr = CGF.Builder.CreateInBoundsGEP(CompletePtr, Offset);
1030
1031 // If we're supposed to call the global delete, make sure we do so
1032 // even if the destructor throws.
David Majnemer08681372014-11-01 07:37:17 +00001033 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
1034 ElementType);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001035 }
1036
1037 // FIXME: Provide a source location here even though there's no
1038 // CXXMemberCallExpr for dtor call.
1039 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
1040 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr);
1041
1042 if (UseGlobalDelete)
1043 CGF.PopCleanupBlock();
John McCall82fb8922012-09-25 10:10:39 +00001044}
1045
David Majnemer442d0a22014-11-25 07:20:20 +00001046void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
1047 // void __cxa_rethrow();
1048
1049 llvm::FunctionType *FTy =
1050 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
1051
1052 llvm::Constant *Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
1053
1054 if (isNoReturn)
1055 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, None);
1056 else
1057 CGF.EmitRuntimeCallOrInvoke(Fn);
1058}
1059
David Majnemer7c237072015-03-05 00:46:22 +00001060static llvm::Constant *getAllocateExceptionFn(CodeGenModule &CGM) {
1061 // void *__cxa_allocate_exception(size_t thrown_size);
1062
1063 llvm::FunctionType *FTy =
1064 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*IsVarArgs=*/false);
1065
1066 return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
1067}
1068
1069static llvm::Constant *getThrowFn(CodeGenModule &CGM) {
1070 // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
1071 // void (*dest) (void *));
1072
1073 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.Int8PtrTy, CGM.Int8PtrTy };
1074 llvm::FunctionType *FTy =
1075 llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false);
1076
1077 return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
1078}
1079
1080void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
1081 QualType ThrowType = E->getSubExpr()->getType();
1082 // Now allocate the exception object.
1083 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType());
1084 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
1085
1086 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM);
1087 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall(
1088 AllocExceptionFn, llvm::ConstantInt::get(SizeTy, TypeSize), "exception");
1089
John McCall7f416cc2015-09-08 08:05:57 +00001090 CharUnits ExnAlign = getAlignmentOfExnObject();
1091 CGF.EmitAnyExprToExn(E->getSubExpr(), Address(ExceptionPtr, ExnAlign));
David Majnemer7c237072015-03-05 00:46:22 +00001092
1093 // Now throw the exception.
1094 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
1095 /*ForEH=*/true);
1096
1097 // The address of the destructor. If the exception type has a
1098 // trivial destructor (or isn't a record), we just pass null.
1099 llvm::Constant *Dtor = nullptr;
1100 if (const RecordType *RecordTy = ThrowType->getAs<RecordType>()) {
1101 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
1102 if (!Record->hasTrivialDestructor()) {
1103 CXXDestructorDecl *DtorD = Record->getDestructor();
1104 Dtor = CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete);
1105 Dtor = llvm::ConstantExpr::getBitCast(Dtor, CGM.Int8PtrTy);
1106 }
1107 }
1108 if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
1109
1110 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
1111 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args);
1112}
1113
David Majnemer1162d252014-06-22 19:05:33 +00001114static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
1115 // void *__dynamic_cast(const void *sub,
1116 // const abi::__class_type_info *src,
1117 // const abi::__class_type_info *dst,
1118 // std::ptrdiff_t src2dst_offset);
1119
1120 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1121 llvm::Type *PtrDiffTy =
1122 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1123
1124 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
1125
1126 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
1127
1128 // Mark the function as nounwind readonly.
1129 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
1130 llvm::Attribute::ReadOnly };
1131 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
1132 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
1133
1134 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1135}
1136
1137static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1138 // void __cxa_bad_cast();
1139 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1140 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1141}
1142
1143/// \brief Compute the src2dst_offset hint as described in the
1144/// Itanium C++ ABI [2.9.7]
1145static CharUnits computeOffsetHint(ASTContext &Context,
1146 const CXXRecordDecl *Src,
1147 const CXXRecordDecl *Dst) {
1148 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1149 /*DetectVirtual=*/false);
1150
1151 // If Dst is not derived from Src we can skip the whole computation below and
1152 // return that Src is not a public base of Dst. Record all inheritance paths.
1153 if (!Dst->isDerivedFrom(Src, Paths))
1154 return CharUnits::fromQuantity(-2ULL);
1155
1156 unsigned NumPublicPaths = 0;
1157 CharUnits Offset;
1158
1159 // Now walk all possible inheritance paths.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001160 for (const CXXBasePath &Path : Paths) {
1161 if (Path.Access != AS_public) // Ignore non-public inheritance.
David Majnemer1162d252014-06-22 19:05:33 +00001162 continue;
1163
1164 ++NumPublicPaths;
1165
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001166 for (const CXXBasePathElement &PathElement : Path) {
David Majnemer1162d252014-06-22 19:05:33 +00001167 // If the path contains a virtual base class we can't give any hint.
1168 // -1: no hint.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001169 if (PathElement.Base->isVirtual())
David Majnemer1162d252014-06-22 19:05:33 +00001170 return CharUnits::fromQuantity(-1ULL);
1171
1172 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1173 continue;
1174
1175 // Accumulate the base class offsets.
Piotr Padlewski44b4ce82015-07-28 16:10:58 +00001176 const ASTRecordLayout &L = Context.getASTRecordLayout(PathElement.Class);
1177 Offset += L.getBaseClassOffset(
1178 PathElement.Base->getType()->getAsCXXRecordDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001179 }
1180 }
1181
1182 // -2: Src is not a public base of Dst.
1183 if (NumPublicPaths == 0)
1184 return CharUnits::fromQuantity(-2ULL);
1185
1186 // -3: Src is a multiple public base type but never a virtual base type.
1187 if (NumPublicPaths > 1)
1188 return CharUnits::fromQuantity(-3ULL);
1189
1190 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1191 // Return the offset of Src from the origin of Dst.
1192 return Offset;
1193}
1194
1195static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
1196 // void __cxa_bad_typeid();
1197 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1198
1199 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1200}
1201
1202bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
1203 QualType SrcRecordTy) {
1204 return IsDeref;
1205}
1206
1207void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1208 llvm::Value *Fn = getBadTypeidFn(CGF);
1209 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1210 CGF.Builder.CreateUnreachable();
1211}
1212
1213llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1214 QualType SrcRecordTy,
John McCall7f416cc2015-09-08 08:05:57 +00001215 Address ThisPtr,
David Majnemer1162d252014-06-22 19:05:33 +00001216 llvm::Type *StdTypeInfoPtrTy) {
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001217 auto *ClassDecl =
1218 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001219 llvm::Value *Value =
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001220 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo(), ClassDecl);
David Majnemer1162d252014-06-22 19:05:33 +00001221
1222 // Load the type info.
1223 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
John McCall7f416cc2015-09-08 08:05:57 +00001224 return CGF.Builder.CreateAlignedLoad(Value, CGF.getPointerAlign());
David Majnemer1162d252014-06-22 19:05:33 +00001225}
1226
1227bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1228 QualType SrcRecordTy) {
1229 return SrcIsPtr;
1230}
1231
1232llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
John McCall7f416cc2015-09-08 08:05:57 +00001233 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy,
David Majnemer1162d252014-06-22 19:05:33 +00001234 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1235 llvm::Type *PtrDiffLTy =
1236 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1237 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1238
1239 llvm::Value *SrcRTTI =
1240 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1241 llvm::Value *DestRTTI =
1242 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1243
1244 // Compute the offset hint.
1245 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1246 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1247 llvm::Value *OffsetHint = llvm::ConstantInt::get(
1248 PtrDiffLTy,
1249 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1250
1251 // Emit the call to __dynamic_cast.
John McCall7f416cc2015-09-08 08:05:57 +00001252 llvm::Value *Value = ThisAddr.getPointer();
David Majnemer1162d252014-06-22 19:05:33 +00001253 Value = CGF.EmitCastToVoidPtr(Value);
1254
1255 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1256 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
1257 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1258
1259 /// C++ [expr.dynamic.cast]p9:
1260 /// A failed cast to reference type throws std::bad_cast
1261 if (DestTy->isReferenceType()) {
1262 llvm::BasicBlock *BadCastBlock =
1263 CGF.createBasicBlock("dynamic_cast.bad_cast");
1264
1265 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1266 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1267
1268 CGF.EmitBlock(BadCastBlock);
1269 EmitBadCastCall(CGF);
1270 }
1271
1272 return Value;
1273}
1274
1275llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001276 Address ThisAddr,
David Majnemer1162d252014-06-22 19:05:33 +00001277 QualType SrcRecordTy,
1278 QualType DestTy) {
1279 llvm::Type *PtrDiffLTy =
1280 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1281 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1282
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001283 auto *ClassDecl =
1284 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
David Majnemer1162d252014-06-22 19:05:33 +00001285 // Get the vtable pointer.
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001286 llvm::Value *VTable = CGF.GetVTablePtr(ThisAddr, PtrDiffLTy->getPointerTo(),
1287 ClassDecl);
David Majnemer1162d252014-06-22 19:05:33 +00001288
1289 // Get the offset-to-top from the vtable.
1290 llvm::Value *OffsetToTop =
1291 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
John McCall7f416cc2015-09-08 08:05:57 +00001292 OffsetToTop =
1293 CGF.Builder.CreateAlignedLoad(OffsetToTop, CGF.getPointerAlign(),
1294 "offset.to.top");
David Majnemer1162d252014-06-22 19:05:33 +00001295
1296 // Finally, add the offset to the pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001297 llvm::Value *Value = ThisAddr.getPointer();
David Majnemer1162d252014-06-22 19:05:33 +00001298 Value = CGF.EmitCastToVoidPtr(Value);
1299 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1300
1301 return CGF.Builder.CreateBitCast(Value, DestLTy);
1302}
1303
1304bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1305 llvm::Value *Fn = getBadCastFn(CGF);
1306 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1307 CGF.Builder.CreateUnreachable();
1308 return true;
1309}
1310
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001311llvm::Value *
1312ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001313 Address This,
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001314 const CXXRecordDecl *ClassDecl,
1315 const CXXRecordDecl *BaseClassDecl) {
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001316 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001317 CharUnits VBaseOffsetOffset =
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001318 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1319 BaseClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001320
1321 llvm::Value *VBaseOffsetPtr =
1322 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1323 "vbase.offset.ptr");
1324 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1325 CGM.PtrDiffTy->getPointerTo());
1326
1327 llvm::Value *VBaseOffset =
John McCall7f416cc2015-09-08 08:05:57 +00001328 CGF.Builder.CreateAlignedLoad(VBaseOffsetPtr, CGF.getPointerAlign(),
1329 "vbase.offset");
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00001330
1331 return VBaseOffset;
1332}
1333
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001334void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1335 // Just make sure we're in sync with TargetCXXABI.
1336 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1337
Rafael Espindolac3cde362013-12-09 14:51:17 +00001338 // The constructor used for constructing this as a base class;
1339 // ignores virtual bases.
1340 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1341
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001342 // The constructor used for constructing this as a complete class;
Nico Weber4c2ffb22015-01-07 05:25:05 +00001343 // constructs the virtual bases, then calls the base constructor.
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001344 if (!D->getParent()->isAbstract()) {
1345 // We don't need to emit the complete ctor if the class is abstract.
1346 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1347 }
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +00001348}
1349
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001350void
1351ItaniumCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
1352 SmallVectorImpl<CanQualType> &ArgTys) {
John McCall9bca9232010-09-02 10:25:57 +00001353 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001354
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001355 // All parameters are already in place except VTT, which goes after 'this'.
1356 // These are Clang types, so we don't need to worry about sret yet.
John McCall5d865c322010-08-31 07:33:07 +00001357
1358 // Check if we need to add a VTT parameter (which has type void **).
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001359 if (T == StructorType::Base && MD->getParent()->getNumVBases() != 0)
1360 ArgTys.insert(ArgTys.begin() + 1,
1361 Context.getPointerType(Context.VoidPtrTy));
John McCall5d865c322010-08-31 07:33:07 +00001362}
1363
Reid Klecknere7de47e2013-07-22 13:51:44 +00001364void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
Rafael Espindolac3cde362013-12-09 14:51:17 +00001365 // The destructor used for destructing this as a base class; ignores
1366 // virtual bases.
1367 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001368
1369 // The destructor used for destructing this as a most-derived class;
1370 // call the base destructor and then destructs any virtual bases.
1371 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1372
Rafael Espindolac3cde362013-12-09 14:51:17 +00001373 // The destructor in a virtual table is always a 'deleting'
1374 // destructor, which calls the complete destructor and then uses the
1375 // appropriate operator delete.
1376 if (D->isVirtual())
1377 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
Reid Klecknere7de47e2013-07-22 13:51:44 +00001378}
1379
Reid Kleckner89077a12013-12-17 19:46:40 +00001380void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1381 QualType &ResTy,
1382 FunctionArgList &Params) {
John McCall5d865c322010-08-31 07:33:07 +00001383 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
Reid Kleckner89077a12013-12-17 19:46:40 +00001384 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
John McCall5d865c322010-08-31 07:33:07 +00001385
1386 // Check if we need a VTT parameter as well.
Peter Collingbourne66f82e62013-06-28 20:45:28 +00001387 if (NeedsVTTParameter(CGF.CurGD)) {
John McCall9bca9232010-09-02 10:25:57 +00001388 ASTContext &Context = getContext();
John McCall5d865c322010-08-31 07:33:07 +00001389
1390 // FIXME: avoid the fake decl
1391 QualType T = Context.getPointerType(Context.VoidPtrTy);
1392 ImplicitParamDecl *VTTDecl
Craig Topper8a13c412014-05-21 05:09:00 +00001393 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
John McCall5d865c322010-08-31 07:33:07 +00001394 &Context.Idents.get("vtt"), T);
Reid Kleckner89077a12013-12-17 19:46:40 +00001395 Params.insert(Params.begin() + 1, VTTDecl);
Reid Kleckner2af6d732013-12-13 00:09:59 +00001396 getStructorImplicitParamDecl(CGF) = VTTDecl;
John McCall5d865c322010-08-31 07:33:07 +00001397 }
1398}
1399
John McCall5d865c322010-08-31 07:33:07 +00001400void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1401 /// Initialize the 'this' slot.
1402 EmitThisParam(CGF);
1403
1404 /// Initialize the 'vtt' slot if needed.
Reid Kleckner2af6d732013-12-13 00:09:59 +00001405 if (getStructorImplicitParamDecl(CGF)) {
1406 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1407 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
John McCall5d865c322010-08-31 07:33:07 +00001408 }
John McCall5d865c322010-08-31 07:33:07 +00001409
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001410 /// If this is a function that the ABI specifies returns 'this', initialize
1411 /// the return slot to 'this' at the start of the function.
1412 ///
1413 /// Unlike the setting of return types, this is done within the ABI
1414 /// implementation instead of by clients of CGCXXABI because:
1415 /// 1) getThisValue is currently protected
1416 /// 2) in theory, an ABI could implement 'this' returns some other way;
1417 /// HasThisReturn only specifies a contract, not the implementation
John McCall5d865c322010-08-31 07:33:07 +00001418 if (HasThisReturn(CGF.CurGD))
Eli Friedman9fbeba02012-02-11 02:57:39 +00001419 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
John McCall5d865c322010-08-31 07:33:07 +00001420}
1421
Reid Kleckner89077a12013-12-17 19:46:40 +00001422unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1423 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1424 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1425 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1426 return 0;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001427
Reid Kleckner89077a12013-12-17 19:46:40 +00001428 // Insert the implicit 'vtt' argument as the second argument.
1429 llvm::Value *VTT =
1430 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1431 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1432 Args.insert(Args.begin() + 1,
1433 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1434 return 1; // Added one arg.
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001435}
1436
1437void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1438 const CXXDestructorDecl *DD,
1439 CXXDtorType Type, bool ForVirtualBase,
John McCall7f416cc2015-09-08 08:05:57 +00001440 bool Delegating, Address This) {
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001441 GlobalDecl GD(DD, Type);
1442 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1443 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1444
Craig Topper8a13c412014-05-21 05:09:00 +00001445 llvm::Value *Callee = nullptr;
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001446 if (getContext().getLangOpts().AppleKext)
1447 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1448
1449 if (!Callee)
Rafael Espindola1ac0ec82014-09-11 15:42:06 +00001450 Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type));
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001451
John McCall7f416cc2015-09-08 08:05:57 +00001452 CGF.EmitCXXMemberOrOperatorCall(DD, Callee, ReturnValueSlot(),
1453 This.getPointer(), VTT, VTTTy, nullptr);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001454}
1455
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001456void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1457 const CXXRecordDecl *RD) {
1458 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1459 if (VTable->hasInitializer())
1460 return;
1461
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001462 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001463 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1464 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
David Majnemerd905da42014-07-01 20:30:31 +00001465 llvm::Constant *RTTI =
1466 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001467
1468 // Create and set the initializer.
1469 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1470 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
David Majnemerd905da42014-07-01 20:30:31 +00001471 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001472 VTable->setInitializer(Init);
1473
1474 // Set the correct linkage.
1475 VTable->setLinkage(Linkage);
1476
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00001477 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
1478 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
Rafael Espindolacb92c192015-01-15 23:18:01 +00001479
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001480 // Set the right visibility.
John McCall8f80a612014-02-08 00:41:16 +00001481 CGM.setGlobalVisibility(VTable, RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001482
Benjamin Kramer5d34a2b2014-09-10 12:50:59 +00001483 // Use pointer alignment for the vtable. Otherwise we would align them based
1484 // on the size of the initializer which doesn't make sense as only single
1485 // values are read.
1486 unsigned PAlign = CGM.getTarget().getPointerAlign(0);
1487 VTable->setAlignment(getContext().toCharUnitsFromBits(PAlign).getQuantity());
1488
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001489 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1490 // we will emit the typeinfo for the fundamental types. This is the
1491 // same behaviour as GCC.
1492 const DeclContext *DC = RD->getDeclContext();
1493 if (RD->getIdentifier() &&
1494 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1495 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1496 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1497 DC->getParent()->isTranslationUnit())
David Majnemere2cb8d12014-07-07 06:20:47 +00001498 EmitFundamentalRTTIDescriptors();
Peter Collingbournea4ccff32015-02-20 20:30:56 +00001499
1500 CGM.EmitVTableBitSetEntries(VTable, VTLayout);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001501}
1502
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001503bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField(
1504 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) {
1505 if (Vptr.NearestVBase == nullptr)
1506 return false;
1507 return NeedsVTTParameter(CGF.CurGD);
Piotr Padlewski255652e2015-09-09 22:20:28 +00001508}
1509
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001510llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1511 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1512 const CXXRecordDecl *NearestVBase) {
1513
1514 if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1515 NeedsVTTParameter(CGF.CurGD)) {
1516 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base,
1517 NearestVBase);
1518 }
1519 return getVTableAddressPoint(Base, VTableClass);
1520}
1521
1522llvm::Constant *
1523ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base,
1524 const CXXRecordDecl *VTableClass) {
1525 llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, CharUnits());
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001526
1527 // Find the appropriate vtable within the vtable group.
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001528 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1529 .getVTableLayout(VTableClass)
1530 .getAddressPoint(Base);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001531 llvm::Value *Indices[] = {
1532 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1533 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1534 };
1535
David Blaikiee3b172a2015-04-02 18:55:21 +00001536 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable->getValueType(),
1537 VTable, Indices);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001538}
1539
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001540llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
1541 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1542 const CXXRecordDecl *NearestVBase) {
1543 assert((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1544 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT");
1545
1546 // Get the secondary vpointer index.
1547 uint64_t VirtualPointerIndex =
1548 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1549
1550 /// Load the VTT.
1551 llvm::Value *VTT = CGF.LoadCXXVTT();
1552 if (VirtualPointerIndex)
1553 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1554
1555 // And load the address point from the VTT.
1556 return CGF.Builder.CreateAlignedLoad(VTT, CGF.getPointerAlign());
1557}
1558
1559llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1560 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1561 return getVTableAddressPoint(Base, VTableClass);
1562}
1563
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001564llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1565 CharUnits VPtrOffset) {
1566 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1567
1568 llvm::GlobalVariable *&VTable = VTables[RD];
1569 if (VTable)
1570 return VTable;
1571
1572 // Queue up this v-table for possible deferred emission.
1573 CGM.addDeferredVTable(RD);
1574
Yaron Kerene46f7ed2015-07-29 14:21:47 +00001575 SmallString<256> Name;
1576 llvm::raw_svector_ostream Out(Name);
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001577 getMangleContext().mangleCXXVTable(RD, Out);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001578
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001579 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001580 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1581 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1582
1583 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1584 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1585 VTable->setUnnamedAddr(true);
Hans Wennborgda24e9c2014-06-02 23:13:03 +00001586
1587 if (RD->hasAttr<DLLImportAttr>())
1588 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1589 else if (RD->hasAttr<DLLExportAttr>())
1590 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1591
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001592 return VTable;
1593}
1594
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001595llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1596 GlobalDecl GD,
John McCall7f416cc2015-09-08 08:05:57 +00001597 Address This,
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001598 llvm::Type *Ty,
1599 SourceLocation Loc) {
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001600 GD = GD.getCanonicalDecl();
1601 Ty = Ty->getPointerTo()->getPointerTo();
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001602 auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl());
1603 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty, MethodDecl->getParent());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001604
Peter Collingbourne1a7488a2015-04-02 00:23:30 +00001605 if (CGF.SanOpts.has(SanitizerKind::CFIVCall))
Piotr Padlewski4b1ac722015-09-15 21:46:55 +00001606 CGF.EmitVTablePtrCheckForCall(MethodDecl, VTable,
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001607 CodeGenFunction::CFITCK_VCall, Loc);
Peter Collingbournea4ccff32015-02-20 20:30:56 +00001608
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001609 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001610 llvm::Value *VFuncPtr =
1611 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
John McCall7f416cc2015-09-08 08:05:57 +00001612 return CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.getPointerAlign());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001613}
1614
David Majnemer0c0b6d92014-10-31 20:09:12 +00001615llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
1616 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
John McCall7f416cc2015-09-08 08:05:57 +00001617 Address This, const CXXMemberCallExpr *CE) {
Alexey Samsonova5bf76b2014-08-25 20:17:35 +00001618 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001619 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1620
Rafael Espindola8d2a19b2014-09-08 16:01:27 +00001621 const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
1622 Dtor, getFromDtorType(DtorType));
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001623 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001624 llvm::Value *Callee =
Peter Collingbourne6708c4a2015-06-19 01:51:54 +00001625 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty,
1626 CE ? CE->getLocStart() : SourceLocation());
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001627
John McCall7f416cc2015-09-08 08:05:57 +00001628 CGF.EmitCXXMemberOrOperatorCall(Dtor, Callee, ReturnValueSlot(),
1629 This.getPointer(), /*ImplicitParam=*/nullptr,
1630 QualType(), CE);
David Majnemer0c0b6d92014-10-31 20:09:12 +00001631 return nullptr;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001632}
1633
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001634void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
Reid Kleckner7810af02013-06-19 15:20:38 +00001635 CodeGenVTables &VTables = CGM.getVTables();
1636 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001637 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
Reid Kleckner7810af02013-06-19 15:20:38 +00001638}
1639
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001640bool ItaniumCXXABI::canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const {
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001641 // We don't emit available_externally vtables if we are in -fapple-kext mode
1642 // because kext mode does not permit devirtualization.
1643 if (CGM.getLangOpts().AppleKext)
1644 return false;
1645
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001646 // If we don't have any inline virtual functions, and if vtable is not hidden,
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001647 // then we are safe to emit available_externally copy of vtable.
1648 // FIXME we can still emit a copy of the vtable if we
1649 // can emit definition of the inline functions.
Piotr Padlewskid679d7e2015-09-15 00:37:06 +00001650 return !hasAnyUsedVirtualInlineFunction(RD) && !isVTableHidden(RD);
Piotr Padlewskia68a7872015-07-24 04:04:49 +00001651}
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001652static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001653 Address InitialPtr,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001654 int64_t NonVirtualAdjustment,
1655 int64_t VirtualAdjustment,
1656 bool IsReturnAdjustment) {
1657 if (!NonVirtualAdjustment && !VirtualAdjustment)
John McCall7f416cc2015-09-08 08:05:57 +00001658 return InitialPtr.getPointer();
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001659
John McCall7f416cc2015-09-08 08:05:57 +00001660 Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001661
John McCall7f416cc2015-09-08 08:05:57 +00001662 // In a base-to-derived cast, the non-virtual adjustment is applied first.
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001663 if (NonVirtualAdjustment && !IsReturnAdjustment) {
John McCall7f416cc2015-09-08 08:05:57 +00001664 V = CGF.Builder.CreateConstInBoundsByteGEP(V,
1665 CharUnits::fromQuantity(NonVirtualAdjustment));
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001666 }
1667
John McCall7f416cc2015-09-08 08:05:57 +00001668 // Perform the virtual adjustment if we have one.
1669 llvm::Value *ResultPtr;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001670 if (VirtualAdjustment) {
1671 llvm::Type *PtrDiffTy =
1672 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1673
John McCall7f416cc2015-09-08 08:05:57 +00001674 Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001675 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1676
1677 llvm::Value *OffsetPtr =
1678 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1679
1680 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1681
1682 // Load the adjustment offset from the vtable.
John McCall7f416cc2015-09-08 08:05:57 +00001683 llvm::Value *Offset =
1684 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001685
1686 // Adjust our pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001687 ResultPtr = CGF.Builder.CreateInBoundsGEP(V.getPointer(), Offset);
1688 } else {
1689 ResultPtr = V.getPointer();
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001690 }
1691
John McCall7f416cc2015-09-08 08:05:57 +00001692 // In a derived-to-base conversion, the non-virtual adjustment is
1693 // applied second.
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001694 if (NonVirtualAdjustment && IsReturnAdjustment) {
John McCall7f416cc2015-09-08 08:05:57 +00001695 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(ResultPtr,
1696 NonVirtualAdjustment);
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001697 }
1698
1699 // Cast back to the original type.
John McCall7f416cc2015-09-08 08:05:57 +00001700 return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType());
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001701}
1702
1703llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001704 Address This,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001705 const ThisAdjustment &TA) {
Timur Iskhodzhanov053142a2013-11-06 06:24:31 +00001706 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1707 TA.Virtual.Itanium.VCallOffsetOffset,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001708 /*IsReturnAdjustment=*/false);
1709}
1710
1711llvm::Value *
John McCall7f416cc2015-09-08 08:05:57 +00001712ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001713 const ReturnAdjustment &RA) {
1714 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1715 RA.Virtual.Itanium.VBaseOffsetOffset,
1716 /*IsReturnAdjustment=*/true);
1717}
1718
John McCall5d865c322010-08-31 07:33:07 +00001719void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1720 RValue RV, QualType ResultType) {
1721 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1722 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1723
1724 // Destructor thunks in the ARM ABI have indeterminate results.
John McCall7f416cc2015-09-08 08:05:57 +00001725 llvm::Type *T = CGF.ReturnValue.getElementType();
John McCall5d865c322010-08-31 07:33:07 +00001726 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1727 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1728}
John McCall8ed55a52010-09-02 09:58:18 +00001729
1730/************************** Array allocation cookies **************************/
1731
John McCallb91cd662012-05-01 05:23:51 +00001732CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1733 // The array cookie is a size_t; pad that up to the element alignment.
1734 // The cookie is actually right-justified in that space.
1735 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1736 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001737}
1738
John McCall7f416cc2015-09-08 08:05:57 +00001739Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1740 Address NewPtr,
1741 llvm::Value *NumElements,
1742 const CXXNewExpr *expr,
1743 QualType ElementType) {
John McCallb91cd662012-05-01 05:23:51 +00001744 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001745
John McCall7f416cc2015-09-08 08:05:57 +00001746 unsigned AS = NewPtr.getAddressSpace();
John McCall8ed55a52010-09-02 09:58:18 +00001747
John McCall9bca9232010-09-02 10:25:57 +00001748 ASTContext &Ctx = getContext();
John McCall7f416cc2015-09-08 08:05:57 +00001749 CharUnits SizeSize = CGF.getSizeSize();
John McCall8ed55a52010-09-02 09:58:18 +00001750
1751 // The size of the cookie.
1752 CharUnits CookieSize =
1753 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
John McCallb91cd662012-05-01 05:23:51 +00001754 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
John McCall8ed55a52010-09-02 09:58:18 +00001755
1756 // Compute an offset to the cookie.
John McCall7f416cc2015-09-08 08:05:57 +00001757 Address CookiePtr = NewPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001758 CharUnits CookieOffset = CookieSize - SizeSize;
1759 if (!CookieOffset.isZero())
John McCall7f416cc2015-09-08 08:05:57 +00001760 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset);
John McCall8ed55a52010-09-02 09:58:18 +00001761
1762 // Write the number of elements into the appropriate slot.
John McCall7f416cc2015-09-08 08:05:57 +00001763 Address NumElementsPtr =
1764 CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy);
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001765 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
John McCall7f416cc2015-09-08 08:05:57 +00001766
1767 // Handle the array cookie specially in ASan.
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001768 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001769 expr->getOperatorNew()->isReplaceableGlobalAllocationFunction()) {
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001770 // The store to the CookiePtr does not need to be instrumented.
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001771 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
1772 llvm::FunctionType *FTy =
John McCall7f416cc2015-09-08 08:05:57 +00001773 llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false);
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001774 llvm::Constant *F =
1775 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
John McCall7f416cc2015-09-08 08:05:57 +00001776 CGF.Builder.CreateCall(F, NumElementsPtr.getPointer());
Kostya Serebryany4ee69042014-08-26 02:29:59 +00001777 }
John McCall8ed55a52010-09-02 09:58:18 +00001778
1779 // Finally, compute a pointer to the actual data buffer by skipping
1780 // over the cookie completely.
John McCall7f416cc2015-09-08 08:05:57 +00001781 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize);
John McCall8ed55a52010-09-02 09:58:18 +00001782}
1783
John McCallb91cd662012-05-01 05:23:51 +00001784llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001785 Address allocPtr,
John McCallb91cd662012-05-01 05:23:51 +00001786 CharUnits cookieSize) {
1787 // The element size is right-justified in the cookie.
John McCall7f416cc2015-09-08 08:05:57 +00001788 Address numElementsPtr = allocPtr;
1789 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize();
John McCallb91cd662012-05-01 05:23:51 +00001790 if (!numElementsOffset.isZero())
1791 numElementsPtr =
John McCall7f416cc2015-09-08 08:05:57 +00001792 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset);
John McCall8ed55a52010-09-02 09:58:18 +00001793
John McCall7f416cc2015-09-08 08:05:57 +00001794 unsigned AS = allocPtr.getAddressSpace();
1795 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
Alexey Samsonovedf99a92014-11-07 22:29:38 +00001796 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
Kostya Serebryany4a9187a2014-08-29 01:01:32 +00001797 return CGF.Builder.CreateLoad(numElementsPtr);
1798 // In asan mode emit a function call instead of a regular load and let the
1799 // run-time deal with it: if the shadow is properly poisoned return the
1800 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
1801 // We can't simply ignore this load using nosanitize metadata because
1802 // the metadata may be lost.
1803 llvm::FunctionType *FTy =
1804 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
1805 llvm::Constant *F =
1806 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
John McCall7f416cc2015-09-08 08:05:57 +00001807 return CGF.Builder.CreateCall(F, numElementsPtr.getPointer());
John McCall8ed55a52010-09-02 09:58:18 +00001808}
1809
John McCallb91cd662012-05-01 05:23:51 +00001810CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
John McCallc19c7062013-01-25 23:36:19 +00001811 // ARM says that the cookie is always:
John McCall8ed55a52010-09-02 09:58:18 +00001812 // struct array_cookie {
1813 // std::size_t element_size; // element_size != 0
1814 // std::size_t element_count;
1815 // };
John McCallc19c7062013-01-25 23:36:19 +00001816 // But the base ABI doesn't give anything an alignment greater than
1817 // 8, so we can dismiss this as typical ABI-author blindness to
1818 // actual language complexity and round up to the element alignment.
1819 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1820 CGM.getContext().getTypeAlignInChars(elementType));
John McCall8ed55a52010-09-02 09:58:18 +00001821}
1822
John McCall7f416cc2015-09-08 08:05:57 +00001823Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1824 Address newPtr,
1825 llvm::Value *numElements,
1826 const CXXNewExpr *expr,
1827 QualType elementType) {
John McCallb91cd662012-05-01 05:23:51 +00001828 assert(requiresArrayCookie(expr));
John McCall8ed55a52010-09-02 09:58:18 +00001829
John McCall8ed55a52010-09-02 09:58:18 +00001830 // The cookie is always at the start of the buffer.
John McCall7f416cc2015-09-08 08:05:57 +00001831 Address cookie = newPtr;
John McCall8ed55a52010-09-02 09:58:18 +00001832
1833 // The first element is the element size.
John McCall7f416cc2015-09-08 08:05:57 +00001834 cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy);
John McCallc19c7062013-01-25 23:36:19 +00001835 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1836 getContext().getTypeSizeInChars(elementType).getQuantity());
1837 CGF.Builder.CreateStore(elementSize, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001838
1839 // The second element is the element count.
John McCall7f416cc2015-09-08 08:05:57 +00001840 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1, CGF.getSizeSize());
John McCallc19c7062013-01-25 23:36:19 +00001841 CGF.Builder.CreateStore(numElements, cookie);
John McCall8ed55a52010-09-02 09:58:18 +00001842
1843 // Finally, compute a pointer to the actual data buffer by skipping
1844 // over the cookie completely.
John McCallc19c7062013-01-25 23:36:19 +00001845 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
John McCall7f416cc2015-09-08 08:05:57 +00001846 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize);
John McCall8ed55a52010-09-02 09:58:18 +00001847}
1848
John McCallb91cd662012-05-01 05:23:51 +00001849llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
John McCall7f416cc2015-09-08 08:05:57 +00001850 Address allocPtr,
John McCallb91cd662012-05-01 05:23:51 +00001851 CharUnits cookieSize) {
1852 // The number of elements is at offset sizeof(size_t) relative to
1853 // the allocated pointer.
John McCall7f416cc2015-09-08 08:05:57 +00001854 Address numElementsPtr
1855 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize());
John McCall8ed55a52010-09-02 09:58:18 +00001856
John McCall7f416cc2015-09-08 08:05:57 +00001857 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
John McCallb91cd662012-05-01 05:23:51 +00001858 return CGF.Builder.CreateLoad(numElementsPtr);
John McCall8ed55a52010-09-02 09:58:18 +00001859}
1860
John McCall68ff0372010-09-08 01:44:27 +00001861/*********************** Static local initialization **************************/
1862
1863static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001864 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001865 // int __cxa_guard_acquire(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001866 llvm::FunctionType *FTy =
John McCall68ff0372010-09-08 01:44:27 +00001867 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
Jay Foad5709f7c2011-07-29 13:56:53 +00001868 GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001869 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001870 llvm::AttributeSet::get(CGM.getLLVMContext(),
1871 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001872 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001873}
1874
1875static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001876 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001877 // void __cxa_guard_release(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001878 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001879 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001880 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001881 llvm::AttributeSet::get(CGM.getLLVMContext(),
1882 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001883 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001884}
1885
1886static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
Chris Lattnera5f58b02011-07-09 17:41:47 +00001887 llvm::PointerType *GuardPtrTy) {
John McCall68ff0372010-09-08 01:44:27 +00001888 // void __cxa_guard_abort(__guard *guard_object);
Chris Lattner2192fe52011-07-18 04:24:23 +00001889 llvm::FunctionType *FTy =
Chris Lattnerece04092012-02-07 00:39:47 +00001890 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
Nick Lewyckyadcec492012-02-13 23:45:02 +00001891 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
Bill Wendling8594fcb2013-01-31 00:30:05 +00001892 llvm::AttributeSet::get(CGM.getLLVMContext(),
1893 llvm::AttributeSet::FunctionIndex,
Bill Wendling207f0532012-12-20 19:27:06 +00001894 llvm::Attribute::NoUnwind));
John McCall68ff0372010-09-08 01:44:27 +00001895}
1896
1897namespace {
David Blaikie7e70d682015-08-18 22:40:54 +00001898 struct CallGuardAbort final : EHScopeStack::Cleanup {
John McCall68ff0372010-09-08 01:44:27 +00001899 llvm::GlobalVariable *Guard;
Chandler Carruth84537952012-03-30 19:44:53 +00001900 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
John McCall68ff0372010-09-08 01:44:27 +00001901
Craig Topper4f12f102014-03-12 06:41:41 +00001902 void Emit(CodeGenFunction &CGF, Flags flags) override {
John McCall882987f2013-02-28 19:01:20 +00001903 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1904 Guard);
John McCall68ff0372010-09-08 01:44:27 +00001905 }
1906 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +00001907}
John McCall68ff0372010-09-08 01:44:27 +00001908
1909/// The ARM code here follows the Itanium code closely enough that we
1910/// just special-case it at particular places.
John McCallcdf7ef52010-11-06 09:44:32 +00001911void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1912 const VarDecl &D,
John McCallb88a5662012-03-30 21:00:39 +00001913 llvm::GlobalVariable *var,
1914 bool shouldPerformInit) {
John McCall68ff0372010-09-08 01:44:27 +00001915 CGBuilderTy &Builder = CGF.Builder;
John McCallcdf7ef52010-11-06 09:44:32 +00001916
Richard Smithdbf74ba2013-04-14 23:01:42 +00001917 // We only need to use thread-safe statics for local non-TLS variables;
John McCallcdf7ef52010-11-06 09:44:32 +00001918 // global initialization is always single-threaded.
Richard Smithdbf74ba2013-04-14 23:01:42 +00001919 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1920 D.isLocalVarDecl() && !D.getTLSKind();
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001921
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001922 // If we have a global variable with internal linkage and thread-safe statics
1923 // are disabled, we can just let the guard variable be of type i8.
John McCallb88a5662012-03-30 21:00:39 +00001924 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1925
1926 llvm::IntegerType *guardTy;
John McCall7f416cc2015-09-08 08:05:57 +00001927 CharUnits guardAlignment;
John McCall5aa52592011-06-17 07:33:57 +00001928 if (useInt8GuardVariable) {
John McCallb88a5662012-03-30 21:00:39 +00001929 guardTy = CGF.Int8Ty;
John McCall7f416cc2015-09-08 08:05:57 +00001930 guardAlignment = CharUnits::One();
John McCall5aa52592011-06-17 07:33:57 +00001931 } else {
Tim Northover9bb857a2013-01-31 12:13:10 +00001932 // Guard variables are 64 bits in the generic ABI and size width on ARM
1933 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
John McCall7f416cc2015-09-08 08:05:57 +00001934 if (UseARMGuardVarABI) {
1935 guardTy = CGF.SizeTy;
1936 guardAlignment = CGF.getSizeAlign();
1937 } else {
1938 guardTy = CGF.Int64Ty;
1939 guardAlignment = CharUnits::fromQuantity(
1940 CGM.getDataLayout().getABITypeAlignment(guardTy));
1941 }
Anders Carlssonc5d3ba12011-04-27 04:37:08 +00001942 }
John McCallb88a5662012-03-30 21:00:39 +00001943 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
John McCall68ff0372010-09-08 01:44:27 +00001944
John McCallb88a5662012-03-30 21:00:39 +00001945 // Create the guard variable if we don't already have it (as we
1946 // might if we're double-emitting this function body).
1947 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1948 if (!guard) {
1949 // Mangle the name for the guard.
1950 SmallString<256> guardName;
1951 {
1952 llvm::raw_svector_ostream out(guardName);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001953 getMangleContext().mangleStaticGuardVariable(&D, out);
John McCallb88a5662012-03-30 21:00:39 +00001954 }
John McCall8e7cb6d2010-11-02 21:04:24 +00001955
John McCallb88a5662012-03-30 21:00:39 +00001956 // Create the guard variable with a zero-initializer.
1957 // Just absorb linkage and visibility from the guarded variable.
1958 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1959 false, var->getLinkage(),
1960 llvm::ConstantInt::get(guardTy, 0),
1961 guardName.str());
1962 guard->setVisibility(var->getVisibility());
Richard Smithdbf74ba2013-04-14 23:01:42 +00001963 // If the variable is thread-local, so is its guard variable.
1964 guard->setThreadLocalMode(var->getThreadLocalMode());
John McCall7f416cc2015-09-08 08:05:57 +00001965 guard->setAlignment(guardAlignment.getQuantity());
John McCallb88a5662012-03-30 21:00:39 +00001966
Yaron Keren5bfa1082015-09-03 20:33:29 +00001967 // The ABI says: "It is suggested that it be emitted in the same COMDAT
1968 // group as the associated data object." In practice, this doesn't work for
1969 // non-ELF object formats, so only do it for ELF.
Rafael Espindola0d4fb982015-01-12 22:13:53 +00001970 llvm::Comdat *C = var->getComdat();
Yaron Keren5bfa1082015-09-03 20:33:29 +00001971 if (!D.isLocalVarDecl() && C &&
1972 CGM.getTarget().getTriple().isOSBinFormatELF()) {
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001973 guard->setComdat(C);
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001974 CGF.CurFn->setComdat(C);
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00001975 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
1976 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
Rafael Espindola2ae4b632014-09-19 19:43:18 +00001977 }
1978
John McCallb88a5662012-03-30 21:00:39 +00001979 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1980 }
John McCall87590e62012-03-30 07:09:50 +00001981
John McCall7f416cc2015-09-08 08:05:57 +00001982 Address guardAddr = Address(guard, guardAlignment);
1983
John McCall68ff0372010-09-08 01:44:27 +00001984 // Test whether the variable has completed initialization.
Justin Bogner0cbb6d82014-04-23 01:50:10 +00001985 //
John McCall68ff0372010-09-08 01:44:27 +00001986 // Itanium C++ ABI 3.3.2:
1987 // The following is pseudo-code showing how these functions can be used:
1988 // if (obj_guard.first_byte == 0) {
1989 // if ( __cxa_guard_acquire (&obj_guard) ) {
1990 // try {
1991 // ... initialize the object ...;
1992 // } catch (...) {
1993 // __cxa_guard_abort (&obj_guard);
1994 // throw;
1995 // }
1996 // ... queue object destructor with __cxa_atexit() ...;
1997 // __cxa_guard_release (&obj_guard);
1998 // }
1999 // }
Tim Northovera2ee4332014-03-29 15:09:45 +00002000
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002001 // Load the first byte of the guard variable.
2002 llvm::LoadInst *LI =
John McCall7f416cc2015-09-08 08:05:57 +00002003 Builder.CreateLoad(Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty));
John McCall68ff0372010-09-08 01:44:27 +00002004
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002005 // Itanium ABI:
2006 // An implementation supporting thread-safety on multiprocessor
2007 // systems must also guarantee that references to the initialized
2008 // object do not occur before the load of the initialization flag.
2009 //
2010 // In LLVM, we do this by marking the load Acquire.
2011 if (threadsafe)
2012 LI->setAtomic(llvm::Acquire);
Eli Friedman84d28122011-09-13 22:21:56 +00002013
Justin Bogner0cbb6d82014-04-23 01:50:10 +00002014 // For ARM, we should only check the first bit, rather than the entire byte:
2015 //
2016 // ARM C++ ABI 3.2.3.1:
2017 // To support the potential use of initialization guard variables
2018 // as semaphores that are the target of ARM SWP and LDREX/STREX
2019 // synchronizing instructions we define a static initialization
2020 // guard variable to be a 4-byte aligned, 4-byte word with the
2021 // following inline access protocol.
2022 // #define INITIALIZED 1
2023 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
2024 // if (__cxa_guard_acquire(&obj_guard))
2025 // ...
2026 // }
2027 //
2028 // and similarly for ARM64:
2029 //
2030 // ARM64 C++ ABI 3.2.2:
2031 // This ABI instead only specifies the value bit 0 of the static guard
2032 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
2033 // variable is not initialized and 1 when it is.
2034 llvm::Value *V =
2035 (UseARMGuardVarABI && !useInt8GuardVariable)
2036 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
2037 : LI;
2038 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
John McCall68ff0372010-09-08 01:44:27 +00002039
2040 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
2041 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2042
2043 // Check if the first byte of the guard variable is zero.
John McCallb88a5662012-03-30 21:00:39 +00002044 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
John McCall68ff0372010-09-08 01:44:27 +00002045
2046 CGF.EmitBlock(InitCheckBlock);
2047
2048 // Variables used when coping with thread-safe statics and exceptions.
John McCall5aa52592011-06-17 07:33:57 +00002049 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00002050 // Call __cxa_guard_acquire.
2051 llvm::Value *V
John McCall882987f2013-02-28 19:01:20 +00002052 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
John McCall68ff0372010-09-08 01:44:27 +00002053
2054 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2055
2056 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
2057 InitBlock, EndBlock);
2058
2059 // Call __cxa_guard_abort along the exceptional edge.
John McCallb88a5662012-03-30 21:00:39 +00002060 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
John McCall68ff0372010-09-08 01:44:27 +00002061
2062 CGF.EmitBlock(InitBlock);
2063 }
2064
2065 // Emit the initializer and add a global destructor if appropriate.
John McCallb88a5662012-03-30 21:00:39 +00002066 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
John McCall68ff0372010-09-08 01:44:27 +00002067
John McCall5aa52592011-06-17 07:33:57 +00002068 if (threadsafe) {
John McCall68ff0372010-09-08 01:44:27 +00002069 // Pop the guard-abort cleanup if we pushed one.
2070 CGF.PopCleanupBlock();
2071
2072 // Call __cxa_guard_release. This cannot throw.
John McCall7f416cc2015-09-08 08:05:57 +00002073 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy),
2074 guardAddr.getPointer());
John McCall68ff0372010-09-08 01:44:27 +00002075 } else {
John McCall7f416cc2015-09-08 08:05:57 +00002076 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guardAddr);
John McCall68ff0372010-09-08 01:44:27 +00002077 }
2078
2079 CGF.EmitBlock(EndBlock);
2080}
John McCallc84ed6a2012-05-01 06:13:13 +00002081
2082/// Register a global destructor using __cxa_atexit.
2083static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
2084 llvm::Constant *dtor,
Richard Smithdbf74ba2013-04-14 23:01:42 +00002085 llvm::Constant *addr,
2086 bool TLS) {
Bill Wendling95cae882013-05-02 19:18:03 +00002087 const char *Name = "__cxa_atexit";
2088 if (TLS) {
2089 const llvm::Triple &T = CGF.getTarget().getTriple();
2090 Name = T.isMacOSX() ? "_tlv_atexit" : "__cxa_thread_atexit";
2091 }
Richard Smithdbf74ba2013-04-14 23:01:42 +00002092
John McCallc84ed6a2012-05-01 06:13:13 +00002093 // We're assuming that the destructor function is something we can
2094 // reasonably call with the default CC. Go ahead and cast it to the
2095 // right prototype.
2096 llvm::Type *dtorTy =
2097 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
2098
2099 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
2100 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
2101 llvm::FunctionType *atexitTy =
2102 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
2103
2104 // Fetch the actual function.
Richard Smithdbf74ba2013-04-14 23:01:42 +00002105 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
John McCallc84ed6a2012-05-01 06:13:13 +00002106 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
2107 fn->setDoesNotThrow();
2108
2109 // Create a variable that binds the atexit to this shared object.
2110 llvm::Constant *handle =
2111 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
2112
2113 llvm::Value *args[] = {
2114 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
2115 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
2116 handle
2117 };
John McCall882987f2013-02-28 19:01:20 +00002118 CGF.EmitNounwindRuntimeCall(atexit, args);
John McCallc84ed6a2012-05-01 06:13:13 +00002119}
2120
2121/// Register a global destructor as best as we know how.
2122void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
Richard Smithdbf74ba2013-04-14 23:01:42 +00002123 const VarDecl &D,
John McCallc84ed6a2012-05-01 06:13:13 +00002124 llvm::Constant *dtor,
2125 llvm::Constant *addr) {
2126 // Use __cxa_atexit if available.
Richard Smithdbf74ba2013-04-14 23:01:42 +00002127 if (CGM.getCodeGenOpts().CXAAtExit)
2128 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
2129
2130 if (D.getTLSKind())
2131 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
John McCallc84ed6a2012-05-01 06:13:13 +00002132
2133 // In Apple kexts, we want to add a global destructor entry.
2134 // FIXME: shouldn't this be guarded by some variable?
Richard Smith9c6890a2012-11-01 22:30:59 +00002135 if (CGM.getLangOpts().AppleKext) {
John McCallc84ed6a2012-05-01 06:13:13 +00002136 // Generate a global destructor entry.
2137 return CGM.AddCXXDtorEntry(dtor, addr);
2138 }
2139
David Blaikieebe87e12013-08-27 23:57:18 +00002140 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
John McCallc84ed6a2012-05-01 06:13:13 +00002141}
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002142
David Majnemer9b21c332014-07-11 20:28:10 +00002143static bool isThreadWrapperReplaceable(const VarDecl *VD,
2144 CodeGen::CodeGenModule &CGM) {
2145 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
2146 // OS X prefers to have references to thread local variables to go through
2147 // the thread wrapper instead of directly referencing the backing variable.
2148 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
2149 CGM.getTarget().getTriple().isMacOSX();
2150}
2151
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002152/// Get the appropriate linkage for the wrapper function. This is essentially
David Majnemer4632e1e2014-06-27 16:56:27 +00002153/// the weak form of the variable's linkage; every translation unit which needs
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002154/// the wrapper emits a copy, and we want the linker to merge them.
David Majnemer35ab3282014-06-11 04:08:55 +00002155static llvm::GlobalValue::LinkageTypes
2156getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
2157 llvm::GlobalValue::LinkageTypes VarLinkage =
2158 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
2159
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002160 // For internal linkage variables, we don't need an external or weak wrapper.
2161 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
2162 return VarLinkage;
David Majnemer35ab3282014-06-11 04:08:55 +00002163
David Majnemer9b21c332014-07-11 20:28:10 +00002164 // If the thread wrapper is replaceable, give it appropriate linkage.
2165 if (isThreadWrapperReplaceable(VD, CGM)) {
2166 if (llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) ||
2167 llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
2168 return llvm::GlobalVariable::WeakAnyLinkage;
2169 return VarLinkage;
2170 }
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002171 return llvm::GlobalValue::WeakODRLinkage;
2172}
2173
2174llvm::Function *
2175ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
Alexander Musmanf94c3182014-09-26 06:28:25 +00002176 llvm::Value *Val) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002177 // Mangle the name for the thread_local wrapper function.
2178 SmallString<256> WrapperName;
2179 {
2180 llvm::raw_svector_ostream Out(WrapperName);
2181 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002182 }
2183
Alexander Musmanf94c3182014-09-26 06:28:25 +00002184 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002185 return cast<llvm::Function>(V);
2186
Alexander Musmanf94c3182014-09-26 06:28:25 +00002187 llvm::Type *RetTy = Val->getType();
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002188 if (VD->getType()->isReferenceType())
2189 RetTy = RetTy->getPointerElementType();
2190
2191 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
David Majnemer35ab3282014-06-11 04:08:55 +00002192 llvm::Function *Wrapper =
2193 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
2194 WrapperName.str(), &CGM.getModule());
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002195 // Always resolve references to the wrapper at link time.
David Majnemer9b21c332014-07-11 20:28:10 +00002196 if (!Wrapper->hasLocalLinkage() && !isThreadWrapperReplaceable(VD, CGM))
Duncan P. N. Exon Smith4434d362014-05-07 22:36:11 +00002197 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002198 return Wrapper;
2199}
2200
2201void ItaniumCXXABI::EmitThreadLocalInitFuncs(
David Majnemerb3341ea2014-10-05 05:05:40 +00002202 CodeGenModule &CGM,
2203 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
2204 CXXThreadLocals, ArrayRef<llvm::Function *> CXXThreadLocalInits,
2205 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) {
2206 llvm::Function *InitFunc = nullptr;
2207 if (!CXXThreadLocalInits.empty()) {
2208 // Generate a guarded initialization function.
2209 llvm::FunctionType *FTy =
2210 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
2211 InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init",
Alexey Samsonov1444bb92014-10-17 00:20:19 +00002212 SourceLocation(),
David Majnemerb3341ea2014-10-05 05:05:40 +00002213 /*TLS=*/true);
2214 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
2215 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
2216 llvm::GlobalVariable::InternalLinkage,
2217 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
2218 Guard->setThreadLocal(true);
John McCall7f416cc2015-09-08 08:05:57 +00002219
2220 CharUnits GuardAlign = CharUnits::One();
2221 Guard->setAlignment(GuardAlign.getQuantity());
2222
David Majnemerb3341ea2014-10-05 05:05:40 +00002223 CodeGenFunction(CGM)
John McCall7f416cc2015-09-08 08:05:57 +00002224 .GenerateCXXGlobalInitFunc(InitFunc, CXXThreadLocalInits,
2225 Address(Guard, GuardAlign));
David Majnemerb3341ea2014-10-05 05:05:40 +00002226 }
Yaron Kerenede60302015-08-01 19:11:36 +00002227 for (auto &I : CXXThreadLocals) {
2228 const VarDecl *VD = I.first;
2229 llvm::GlobalVariable *Var = I.second;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002230
David Majnemer9b21c332014-07-11 20:28:10 +00002231 // Some targets require that all access to thread local variables go through
2232 // the thread wrapper. This means that we cannot attempt to create a thread
2233 // wrapper or a thread helper.
2234 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
2235 continue;
2236
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002237 // Mangle the name for the thread_local initialization function.
2238 SmallString<256> InitFnName;
2239 {
2240 llvm::raw_svector_ostream Out(InitFnName);
2241 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002242 }
2243
2244 // If we have a definition for the variable, emit the initialization
2245 // function as an alias to the global Init function (if any). Otherwise,
2246 // produce a declaration of the initialization function.
Craig Topper8a13c412014-05-21 05:09:00 +00002247 llvm::GlobalValue *Init = nullptr;
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002248 bool InitIsInitFunc = false;
2249 if (VD->hasDefinition()) {
2250 InitIsInitFunc = true;
2251 if (InitFunc)
Rafael Espindola234405b2014-05-17 21:30:14 +00002252 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
2253 InitFunc);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002254 } else {
2255 // Emit a weak global function referring to the initialization function.
2256 // This function will not exist if the TU defining the thread_local
2257 // variable in question does not need any dynamic initialization for
2258 // its thread_local variables.
2259 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
2260 Init = llvm::Function::Create(
2261 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
2262 &CGM.getModule());
2263 }
2264
2265 if (Init)
2266 Init->setVisibility(Var->getVisibility());
2267
2268 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
2269 llvm::LLVMContext &Context = CGM.getModule().getContext();
2270 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
John McCall7f416cc2015-09-08 08:05:57 +00002271 CGBuilderTy Builder(CGM, Entry);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002272 if (InitIsInitFunc) {
2273 if (Init)
David Blaikie4ba525b2015-07-14 17:27:39 +00002274 Builder.CreateCall(Init);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002275 } else {
2276 // Don't know whether we have an init function. Call it if it exists.
2277 llvm::Value *Have = Builder.CreateIsNotNull(Init);
2278 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2279 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2280 Builder.CreateCondBr(Have, InitBB, ExitBB);
2281
2282 Builder.SetInsertPoint(InitBB);
David Blaikie4ba525b2015-07-14 17:27:39 +00002283 Builder.CreateCall(Init);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002284 Builder.CreateBr(ExitBB);
2285
2286 Builder.SetInsertPoint(ExitBB);
2287 }
2288
2289 // For a reference, the result of the wrapper function is a pointer to
2290 // the referenced object.
2291 llvm::Value *Val = Var;
2292 if (VD->getType()->isReferenceType()) {
John McCall7f416cc2015-09-08 08:05:57 +00002293 CharUnits Align = CGM.getContext().getDeclAlign(VD);
2294 Val = Builder.CreateAlignedLoad(Val, Align);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002295 }
Alexander Musmanf94c3182014-09-26 06:28:25 +00002296 if (Val->getType() != Wrapper->getReturnType())
2297 Val = Builder.CreatePointerBitCastOrAddrSpaceCast(
2298 Val, Wrapper->getReturnType(), "");
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002299 Builder.CreateRet(Val);
2300 }
2301}
2302
Richard Smith0f383742014-03-26 22:48:22 +00002303LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2304 const VarDecl *VD,
2305 QualType LValType) {
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002306 QualType T = VD->getType();
2307 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
2308 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
Alexander Musmanf94c3182014-09-26 06:28:25 +00002309 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002310
David Blaikie4ba525b2015-07-14 17:27:39 +00002311 Val = CGF.Builder.CreateCall(Wrapper);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002312
2313 LValue LV;
2314 if (VD->getType()->isReferenceType())
Richard Smith0f383742014-03-26 22:48:22 +00002315 LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType);
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002316 else
Richard Smith0f383742014-03-26 22:48:22 +00002317 LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD));
Richard Smith2fd1d7a2013-04-19 16:42:07 +00002318 // FIXME: need setObjCGCLValueClass?
2319 return LV;
2320}
Peter Collingbourne66f82e62013-06-28 20:45:28 +00002321
2322/// Return whether the given global decl needs a VTT parameter, which it does
2323/// if it's a base constructor or destructor with virtual bases.
2324bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
2325 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
2326
2327 // We don't have any virtual bases, just return early.
2328 if (!MD->getParent()->getNumVBases())
2329 return false;
2330
2331 // Check if we have a base constructor.
2332 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
2333 return true;
2334
2335 // Check if we have a base destructor.
2336 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2337 return true;
2338
2339 return false;
2340}
David Majnemere2cb8d12014-07-07 06:20:47 +00002341
2342namespace {
2343class ItaniumRTTIBuilder {
2344 CodeGenModule &CGM; // Per-module state.
2345 llvm::LLVMContext &VMContext;
2346 const ItaniumCXXABI &CXXABI; // Per-module state.
2347
2348 /// Fields - The fields of the RTTI descriptor currently being built.
2349 SmallVector<llvm::Constant *, 16> Fields;
2350
2351 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2352 llvm::GlobalVariable *
2353 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2354
2355 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2356 /// descriptor of the given type.
2357 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2358
2359 /// BuildVTablePointer - Build the vtable pointer for the given type.
2360 void BuildVTablePointer(const Type *Ty);
2361
2362 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2363 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2364 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2365
2366 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2367 /// classes with bases that do not satisfy the abi::__si_class_type_info
2368 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2369 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2370
2371 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2372 /// for pointer types.
2373 void BuildPointerTypeInfo(QualType PointeeTy);
2374
2375 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2376 /// type_info for an object type.
2377 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2378
2379 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2380 /// struct, used for member pointer types.
2381 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2382
2383public:
2384 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2385 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2386
2387 // Pointer type info flags.
2388 enum {
2389 /// PTI_Const - Type has const qualifier.
2390 PTI_Const = 0x1,
2391
2392 /// PTI_Volatile - Type has volatile qualifier.
2393 PTI_Volatile = 0x2,
2394
2395 /// PTI_Restrict - Type has restrict qualifier.
2396 PTI_Restrict = 0x4,
2397
2398 /// PTI_Incomplete - Type is incomplete.
2399 PTI_Incomplete = 0x8,
2400
2401 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2402 /// (in pointer to member).
2403 PTI_ContainingClassIncomplete = 0x10
2404 };
2405
2406 // VMI type info flags.
2407 enum {
2408 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2409 VMI_NonDiamondRepeat = 0x1,
2410
2411 /// VMI_DiamondShaped - Class is diamond shaped.
2412 VMI_DiamondShaped = 0x2
2413 };
2414
2415 // Base class type info flags.
2416 enum {
2417 /// BCTI_Virtual - Base class is virtual.
2418 BCTI_Virtual = 0x1,
2419
2420 /// BCTI_Public - Base class is public.
2421 BCTI_Public = 0x2
2422 };
2423
2424 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2425 ///
2426 /// \param Force - true to force the creation of this RTTI value
2427 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2428};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002429}
David Majnemere2cb8d12014-07-07 06:20:47 +00002430
2431llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2432 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002433 SmallString<256> Name;
2434 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002435 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002436
2437 // We know that the mangled name of the type starts at index 4 of the
2438 // mangled name of the typename, so we can just index into it in order to
2439 // get the mangled name of the type.
2440 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2441 Name.substr(4));
2442
2443 llvm::GlobalVariable *GV =
2444 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2445
2446 GV->setInitializer(Init);
2447
2448 return GV;
2449}
2450
2451llvm::Constant *
2452ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2453 // Mangle the RTTI name.
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002454 SmallString<256> Name;
2455 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002456 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002457
2458 // Look for an existing global.
2459 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2460
2461 if (!GV) {
2462 // Create a new global variable.
2463 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2464 /*Constant=*/true,
2465 llvm::GlobalValue::ExternalLinkage, nullptr,
2466 Name);
David Majnemer1fb1a042014-11-07 07:26:38 +00002467 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2468 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2469 if (RD->hasAttr<DLLImportAttr>())
2470 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2471 }
David Majnemere2cb8d12014-07-07 06:20:47 +00002472 }
2473
2474 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2475}
2476
2477/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2478/// info for that type is defined in the standard library.
2479static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2480 // Itanium C++ ABI 2.9.2:
2481 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2482 // the run-time support library. Specifically, the run-time support
2483 // library should contain type_info objects for the types X, X* and
2484 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2485 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2486 // long, unsigned long, long long, unsigned long long, float, double,
2487 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2488 // half-precision floating point types.
2489 switch (Ty->getKind()) {
2490 case BuiltinType::Void:
2491 case BuiltinType::NullPtr:
2492 case BuiltinType::Bool:
2493 case BuiltinType::WChar_S:
2494 case BuiltinType::WChar_U:
2495 case BuiltinType::Char_U:
2496 case BuiltinType::Char_S:
2497 case BuiltinType::UChar:
2498 case BuiltinType::SChar:
2499 case BuiltinType::Short:
2500 case BuiltinType::UShort:
2501 case BuiltinType::Int:
2502 case BuiltinType::UInt:
2503 case BuiltinType::Long:
2504 case BuiltinType::ULong:
2505 case BuiltinType::LongLong:
2506 case BuiltinType::ULongLong:
2507 case BuiltinType::Half:
2508 case BuiltinType::Float:
2509 case BuiltinType::Double:
2510 case BuiltinType::LongDouble:
2511 case BuiltinType::Char16:
2512 case BuiltinType::Char32:
2513 case BuiltinType::Int128:
2514 case BuiltinType::UInt128:
2515 case BuiltinType::OCLImage1d:
2516 case BuiltinType::OCLImage1dArray:
2517 case BuiltinType::OCLImage1dBuffer:
2518 case BuiltinType::OCLImage2d:
2519 case BuiltinType::OCLImage2dArray:
Alexey Bader9c8453f2015-09-15 11:18:52 +00002520 case BuiltinType::OCLImage2dDepth:
2521 case BuiltinType::OCLImage2dArrayDepth:
2522 case BuiltinType::OCLImage2dMSAA:
2523 case BuiltinType::OCLImage2dArrayMSAA:
2524 case BuiltinType::OCLImage2dMSAADepth:
2525 case BuiltinType::OCLImage2dArrayMSAADepth:
David Majnemere2cb8d12014-07-07 06:20:47 +00002526 case BuiltinType::OCLImage3d:
2527 case BuiltinType::OCLSampler:
2528 case BuiltinType::OCLEvent:
Alexey Bader9c8453f2015-09-15 11:18:52 +00002529 case BuiltinType::OCLClkEvent:
2530 case BuiltinType::OCLQueue:
2531 case BuiltinType::OCLNDRange:
2532 case BuiltinType::OCLReserveID:
David Majnemere2cb8d12014-07-07 06:20:47 +00002533 return true;
2534
2535 case BuiltinType::Dependent:
2536#define BUILTIN_TYPE(Id, SingletonId)
2537#define PLACEHOLDER_TYPE(Id, SingletonId) \
2538 case BuiltinType::Id:
2539#include "clang/AST/BuiltinTypes.def"
2540 llvm_unreachable("asking for RRTI for a placeholder type!");
2541
2542 case BuiltinType::ObjCId:
2543 case BuiltinType::ObjCClass:
2544 case BuiltinType::ObjCSel:
2545 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2546 }
2547
2548 llvm_unreachable("Invalid BuiltinType Kind!");
2549}
2550
2551static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2552 QualType PointeeTy = PointerTy->getPointeeType();
2553 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2554 if (!BuiltinTy)
2555 return false;
2556
2557 // Check the qualifiers.
2558 Qualifiers Quals = PointeeTy.getQualifiers();
2559 Quals.removeConst();
2560
2561 if (!Quals.empty())
2562 return false;
2563
2564 return TypeInfoIsInStandardLibrary(BuiltinTy);
2565}
2566
2567/// IsStandardLibraryRTTIDescriptor - Returns whether the type
2568/// information for the given type exists in the standard library.
2569static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2570 // Type info for builtin types is defined in the standard library.
2571 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2572 return TypeInfoIsInStandardLibrary(BuiltinTy);
2573
2574 // Type info for some pointer types to builtin types is defined in the
2575 // standard library.
2576 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2577 return TypeInfoIsInStandardLibrary(PointerTy);
2578
2579 return false;
2580}
2581
2582/// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2583/// the given type exists somewhere else, and that we should not emit the type
2584/// information in this translation unit. Assumes that it is not a
2585/// standard-library type.
2586static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2587 QualType Ty) {
2588 ASTContext &Context = CGM.getContext();
2589
2590 // If RTTI is disabled, assume it might be disabled in the
2591 // translation unit that defines any potential key function, too.
2592 if (!Context.getLangOpts().RTTI) return false;
2593
2594 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2595 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2596 if (!RD->hasDefinition())
2597 return false;
2598
2599 if (!RD->isDynamicClass())
2600 return false;
2601
2602 // FIXME: this may need to be reconsidered if the key function
2603 // changes.
David Majnemerbe9022c2015-08-06 20:56:55 +00002604 // N.B. We must always emit the RTTI data ourselves if there exists a key
2605 // function.
2606 bool IsDLLImport = RD->hasAttr<DLLImportAttr>();
David Majnemer1fb1a042014-11-07 07:26:38 +00002607 if (CGM.getVTables().isVTableExternal(RD))
David Majnemerbe9022c2015-08-06 20:56:55 +00002608 return IsDLLImport ? false : true;
David Majnemer1fb1a042014-11-07 07:26:38 +00002609
David Majnemerbe9022c2015-08-06 20:56:55 +00002610 if (IsDLLImport)
David Majnemer1fb1a042014-11-07 07:26:38 +00002611 return true;
David Majnemere2cb8d12014-07-07 06:20:47 +00002612 }
2613
2614 return false;
2615}
2616
2617/// IsIncompleteClassType - Returns whether the given record type is incomplete.
2618static bool IsIncompleteClassType(const RecordType *RecordTy) {
2619 return !RecordTy->getDecl()->isCompleteDefinition();
2620}
2621
2622/// ContainsIncompleteClassType - Returns whether the given type contains an
2623/// incomplete class type. This is true if
2624///
2625/// * The given type is an incomplete class type.
2626/// * The given type is a pointer type whose pointee type contains an
2627/// incomplete class type.
2628/// * The given type is a member pointer type whose class is an incomplete
2629/// class type.
2630/// * The given type is a member pointer type whoise pointee type contains an
2631/// incomplete class type.
2632/// is an indirect or direct pointer to an incomplete class type.
2633static bool ContainsIncompleteClassType(QualType Ty) {
2634 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2635 if (IsIncompleteClassType(RecordTy))
2636 return true;
2637 }
2638
2639 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2640 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2641
2642 if (const MemberPointerType *MemberPointerTy =
2643 dyn_cast<MemberPointerType>(Ty)) {
2644 // Check if the class type is incomplete.
2645 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2646 if (IsIncompleteClassType(ClassType))
2647 return true;
2648
2649 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2650 }
2651
2652 return false;
2653}
2654
2655// CanUseSingleInheritance - Return whether the given record decl has a "single,
2656// public, non-virtual base at offset zero (i.e. the derived class is dynamic
2657// iff the base is)", according to Itanium C++ ABI, 2.95p6b.
2658static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2659 // Check the number of bases.
2660 if (RD->getNumBases() != 1)
2661 return false;
2662
2663 // Get the base.
2664 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2665
2666 // Check that the base is not virtual.
2667 if (Base->isVirtual())
2668 return false;
2669
2670 // Check that the base is public.
2671 if (Base->getAccessSpecifier() != AS_public)
2672 return false;
2673
2674 // Check that the class is dynamic iff the base is.
2675 const CXXRecordDecl *BaseDecl =
2676 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2677 if (!BaseDecl->isEmpty() &&
2678 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2679 return false;
2680
2681 return true;
2682}
2683
2684void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2685 // abi::__class_type_info.
2686 static const char * const ClassTypeInfo =
2687 "_ZTVN10__cxxabiv117__class_type_infoE";
2688 // abi::__si_class_type_info.
2689 static const char * const SIClassTypeInfo =
2690 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2691 // abi::__vmi_class_type_info.
2692 static const char * const VMIClassTypeInfo =
2693 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2694
2695 const char *VTableName = nullptr;
2696
2697 switch (Ty->getTypeClass()) {
2698#define TYPE(Class, Base)
2699#define ABSTRACT_TYPE(Class, Base)
2700#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2701#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2702#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2703#include "clang/AST/TypeNodes.def"
2704 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2705
2706 case Type::LValueReference:
2707 case Type::RValueReference:
2708 llvm_unreachable("References shouldn't get here");
2709
2710 case Type::Auto:
2711 llvm_unreachable("Undeduced auto type shouldn't get here");
2712
2713 case Type::Builtin:
2714 // GCC treats vector and complex types as fundamental types.
2715 case Type::Vector:
2716 case Type::ExtVector:
2717 case Type::Complex:
2718 case Type::Atomic:
2719 // FIXME: GCC treats block pointers as fundamental types?!
2720 case Type::BlockPointer:
2721 // abi::__fundamental_type_info.
2722 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2723 break;
2724
2725 case Type::ConstantArray:
2726 case Type::IncompleteArray:
2727 case Type::VariableArray:
2728 // abi::__array_type_info.
2729 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2730 break;
2731
2732 case Type::FunctionNoProto:
2733 case Type::FunctionProto:
2734 // abi::__function_type_info.
2735 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2736 break;
2737
2738 case Type::Enum:
2739 // abi::__enum_type_info.
2740 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2741 break;
2742
2743 case Type::Record: {
2744 const CXXRecordDecl *RD =
2745 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2746
2747 if (!RD->hasDefinition() || !RD->getNumBases()) {
2748 VTableName = ClassTypeInfo;
2749 } else if (CanUseSingleInheritance(RD)) {
2750 VTableName = SIClassTypeInfo;
2751 } else {
2752 VTableName = VMIClassTypeInfo;
2753 }
2754
2755 break;
2756 }
2757
2758 case Type::ObjCObject:
2759 // Ignore protocol qualifiers.
2760 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2761
2762 // Handle id and Class.
2763 if (isa<BuiltinType>(Ty)) {
2764 VTableName = ClassTypeInfo;
2765 break;
2766 }
2767
2768 assert(isa<ObjCInterfaceType>(Ty));
2769 // Fall through.
2770
2771 case Type::ObjCInterface:
2772 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2773 VTableName = SIClassTypeInfo;
2774 } else {
2775 VTableName = ClassTypeInfo;
2776 }
2777 break;
2778
2779 case Type::ObjCObjectPointer:
2780 case Type::Pointer:
2781 // abi::__pointer_type_info.
2782 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2783 break;
2784
2785 case Type::MemberPointer:
2786 // abi::__pointer_to_member_type_info.
2787 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2788 break;
2789 }
2790
2791 llvm::Constant *VTable =
2792 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2793
2794 llvm::Type *PtrDiffTy =
2795 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2796
2797 // The vtable address point is 2.
2798 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
David Blaikiee3b172a2015-04-02 18:55:21 +00002799 VTable =
2800 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two);
David Majnemere2cb8d12014-07-07 06:20:47 +00002801 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2802
2803 Fields.push_back(VTable);
2804}
2805
2806/// \brief Return the linkage that the type info and type info name constants
2807/// should have for the given type.
2808static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2809 QualType Ty) {
2810 // Itanium C++ ABI 2.9.5p7:
2811 // In addition, it and all of the intermediate abi::__pointer_type_info
2812 // structs in the chain down to the abi::__class_type_info for the
2813 // incomplete class type must be prevented from resolving to the
2814 // corresponding type_info structs for the complete class type, possibly
2815 // by making them local static objects. Finally, a dummy class RTTI is
2816 // generated for the incomplete type that will not resolve to the final
2817 // complete class RTTI (because the latter need not exist), possibly by
2818 // making it a local static object.
2819 if (ContainsIncompleteClassType(Ty))
2820 return llvm::GlobalValue::InternalLinkage;
2821
2822 switch (Ty->getLinkage()) {
2823 case NoLinkage:
2824 case InternalLinkage:
2825 case UniqueExternalLinkage:
2826 return llvm::GlobalValue::InternalLinkage;
2827
2828 case VisibleNoLinkage:
2829 case ExternalLinkage:
2830 if (!CGM.getLangOpts().RTTI) {
2831 // RTTI is not enabled, which means that this type info struct is going
2832 // to be used for exception handling. Give it linkonce_odr linkage.
2833 return llvm::GlobalValue::LinkOnceODRLinkage;
2834 }
2835
2836 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2837 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2838 if (RD->hasAttr<WeakAttr>())
2839 return llvm::GlobalValue::WeakODRLinkage;
David Majnemerbe9022c2015-08-06 20:56:55 +00002840 if (RD->isDynamicClass()) {
2841 llvm::GlobalValue::LinkageTypes LT = CGM.getVTableLinkage(RD);
2842 // MinGW won't export the RTTI information when there is a key function.
2843 // Make sure we emit our own copy instead of attempting to dllimport it.
2844 if (RD->hasAttr<DLLImportAttr>() &&
2845 llvm::GlobalValue::isAvailableExternallyLinkage(LT))
2846 LT = llvm::GlobalValue::LinkOnceODRLinkage;
2847 return LT;
2848 }
David Majnemere2cb8d12014-07-07 06:20:47 +00002849 }
2850
2851 return llvm::GlobalValue::LinkOnceODRLinkage;
2852 }
2853
2854 llvm_unreachable("Invalid linkage!");
2855}
2856
2857llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2858 // We want to operate on the canonical type.
2859 Ty = CGM.getContext().getCanonicalType(Ty);
2860
2861 // Check if we've already emitted an RTTI descriptor for this type.
Yaron Kerene46f7ed2015-07-29 14:21:47 +00002862 SmallString<256> Name;
2863 llvm::raw_svector_ostream Out(Name);
David Majnemere2cb8d12014-07-07 06:20:47 +00002864 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002865
2866 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2867 if (OldGV && !OldGV->isDeclaration()) {
2868 assert(!OldGV->hasAvailableExternallyLinkage() &&
2869 "available_externally typeinfos not yet implemented");
2870
2871 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2872 }
2873
2874 // Check if there is already an external RTTI descriptor for this type.
2875 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2876 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2877 return GetAddrOfExternalRTTIDescriptor(Ty);
2878
2879 // Emit the standard library with external linkage.
2880 llvm::GlobalVariable::LinkageTypes Linkage;
2881 if (IsStdLib)
2882 Linkage = llvm::GlobalValue::ExternalLinkage;
2883 else
2884 Linkage = getTypeInfoLinkage(CGM, Ty);
2885
2886 // Add the vtable pointer.
2887 BuildVTablePointer(cast<Type>(Ty));
2888
2889 // And the name.
2890 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2891 llvm::Constant *TypeNameField;
2892
2893 // If we're supposed to demote the visibility, be sure to set a flag
2894 // to use a string comparison for type_info comparisons.
2895 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2896 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2897 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2898 // The flag is the sign bit, which on ARM64 is defined to be clear
2899 // for global pointers. This is very ARM64-specific.
2900 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2901 llvm::Constant *flag =
2902 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2903 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2904 TypeNameField =
2905 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2906 } else {
2907 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2908 }
2909 Fields.push_back(TypeNameField);
2910
2911 switch (Ty->getTypeClass()) {
2912#define TYPE(Class, Base)
2913#define ABSTRACT_TYPE(Class, Base)
2914#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2915#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2916#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2917#include "clang/AST/TypeNodes.def"
2918 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2919
2920 // GCC treats vector types as fundamental types.
2921 case Type::Builtin:
2922 case Type::Vector:
2923 case Type::ExtVector:
2924 case Type::Complex:
2925 case Type::BlockPointer:
2926 // Itanium C++ ABI 2.9.5p4:
2927 // abi::__fundamental_type_info adds no data members to std::type_info.
2928 break;
2929
2930 case Type::LValueReference:
2931 case Type::RValueReference:
2932 llvm_unreachable("References shouldn't get here");
2933
2934 case Type::Auto:
2935 llvm_unreachable("Undeduced auto type shouldn't get here");
2936
2937 case Type::ConstantArray:
2938 case Type::IncompleteArray:
2939 case Type::VariableArray:
2940 // Itanium C++ ABI 2.9.5p5:
2941 // abi::__array_type_info adds no data members to std::type_info.
2942 break;
2943
2944 case Type::FunctionNoProto:
2945 case Type::FunctionProto:
2946 // Itanium C++ ABI 2.9.5p5:
2947 // abi::__function_type_info adds no data members to std::type_info.
2948 break;
2949
2950 case Type::Enum:
2951 // Itanium C++ ABI 2.9.5p5:
2952 // abi::__enum_type_info adds no data members to std::type_info.
2953 break;
2954
2955 case Type::Record: {
2956 const CXXRecordDecl *RD =
2957 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2958 if (!RD->hasDefinition() || !RD->getNumBases()) {
2959 // We don't need to emit any fields.
2960 break;
2961 }
2962
2963 if (CanUseSingleInheritance(RD))
2964 BuildSIClassTypeInfo(RD);
2965 else
2966 BuildVMIClassTypeInfo(RD);
2967
2968 break;
2969 }
2970
2971 case Type::ObjCObject:
2972 case Type::ObjCInterface:
2973 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
2974 break;
2975
2976 case Type::ObjCObjectPointer:
2977 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
2978 break;
2979
2980 case Type::Pointer:
2981 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
2982 break;
2983
2984 case Type::MemberPointer:
2985 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
2986 break;
2987
2988 case Type::Atomic:
2989 // No fields, at least for the moment.
2990 break;
2991 }
2992
2993 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2994
Rafael Espindolacb92c192015-01-15 23:18:01 +00002995 llvm::Module &M = CGM.getModule();
David Majnemere2cb8d12014-07-07 06:20:47 +00002996 llvm::GlobalVariable *GV =
Rafael Espindolacb92c192015-01-15 23:18:01 +00002997 new llvm::GlobalVariable(M, Init->getType(),
2998 /*Constant=*/true, Linkage, Init, Name);
2999
David Majnemere2cb8d12014-07-07 06:20:47 +00003000 // If there's already an old global variable, replace it with the new one.
3001 if (OldGV) {
3002 GV->takeName(OldGV);
3003 llvm::Constant *NewPtr =
3004 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
3005 OldGV->replaceAllUsesWith(NewPtr);
3006 OldGV->eraseFromParent();
3007 }
3008
Yaron Keren04da2382015-07-29 15:42:28 +00003009 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
3010 GV->setComdat(M.getOrInsertComdat(GV->getName()));
3011
David Majnemere2cb8d12014-07-07 06:20:47 +00003012 // The Itanium ABI specifies that type_info objects must be globally
3013 // unique, with one exception: if the type is an incomplete class
3014 // type or a (possibly indirect) pointer to one. That exception
3015 // affects the general case of comparing type_info objects produced
3016 // by the typeid operator, which is why the comparison operators on
3017 // std::type_info generally use the type_info name pointers instead
3018 // of the object addresses. However, the language's built-in uses
3019 // of RTTI generally require class types to be complete, even when
3020 // manipulating pointers to those class types. This allows the
3021 // implementation of dynamic_cast to rely on address equality tests,
3022 // which is much faster.
3023
3024 // All of this is to say that it's important that both the type_info
3025 // object and the type_info name be uniqued when weakly emitted.
3026
3027 // Give the type_info object and name the formal visibility of the
3028 // type itself.
3029 llvm::GlobalValue::VisibilityTypes llvmVisibility;
3030 if (llvm::GlobalValue::isLocalLinkage(Linkage))
3031 // If the linkage is local, only default visibility makes sense.
3032 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
3033 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
3034 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
3035 else
3036 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
3037 TypeName->setVisibility(llvmVisibility);
3038 GV->setVisibility(llvmVisibility);
3039
3040 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3041}
3042
3043/// ComputeQualifierFlags - Compute the pointer type info flags from the
3044/// given qualifier.
3045static unsigned ComputeQualifierFlags(Qualifiers Quals) {
3046 unsigned Flags = 0;
3047
3048 if (Quals.hasConst())
3049 Flags |= ItaniumRTTIBuilder::PTI_Const;
3050 if (Quals.hasVolatile())
3051 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
3052 if (Quals.hasRestrict())
3053 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
3054
3055 return Flags;
3056}
3057
3058/// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
3059/// for the given Objective-C object type.
3060void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
3061 // Drop qualifiers.
3062 const Type *T = OT->getBaseType().getTypePtr();
3063 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
3064
3065 // The builtin types are abi::__class_type_infos and don't require
3066 // extra fields.
3067 if (isa<BuiltinType>(T)) return;
3068
3069 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
3070 ObjCInterfaceDecl *Super = Class->getSuperClass();
3071
3072 // Root classes are also __class_type_info.
3073 if (!Super) return;
3074
3075 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
3076
3077 // Everything else is single inheritance.
3078 llvm::Constant *BaseTypeInfo =
3079 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
3080 Fields.push_back(BaseTypeInfo);
3081}
3082
3083/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3084/// inheritance, according to the Itanium C++ ABI, 2.95p6b.
3085void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
3086 // Itanium C++ ABI 2.9.5p6b:
3087 // It adds to abi::__class_type_info a single member pointing to the
3088 // type_info structure for the base type,
3089 llvm::Constant *BaseTypeInfo =
3090 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
3091 Fields.push_back(BaseTypeInfo);
3092}
3093
3094namespace {
3095 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
3096 /// a class hierarchy.
3097 struct SeenBases {
3098 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
3099 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
3100 };
3101}
3102
3103/// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
3104/// abi::__vmi_class_type_info.
3105///
3106static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
3107 SeenBases &Bases) {
3108
3109 unsigned Flags = 0;
3110
3111 const CXXRecordDecl *BaseDecl =
3112 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
3113
3114 if (Base->isVirtual()) {
3115 // Mark the virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00003116 if (!Bases.VirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003117 // If this virtual base has been seen before, then the class is diamond
3118 // shaped.
3119 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
3120 } else {
3121 if (Bases.NonVirtualBases.count(BaseDecl))
3122 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3123 }
3124 } else {
3125 // Mark the non-virtual base as seen.
David Blaikie82e95a32014-11-19 07:49:47 +00003126 if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003127 // If this non-virtual base has been seen before, then the class has non-
3128 // diamond shaped repeated inheritance.
3129 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3130 } else {
3131 if (Bases.VirtualBases.count(BaseDecl))
3132 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3133 }
3134 }
3135
3136 // Walk all bases.
3137 for (const auto &I : BaseDecl->bases())
3138 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3139
3140 return Flags;
3141}
3142
3143static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
3144 unsigned Flags = 0;
3145 SeenBases Bases;
3146
3147 // Walk all bases.
3148 for (const auto &I : RD->bases())
3149 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3150
3151 return Flags;
3152}
3153
3154/// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
3155/// classes with bases that do not satisfy the abi::__si_class_type_info
3156/// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
3157void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
3158 llvm::Type *UnsignedIntLTy =
3159 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3160
3161 // Itanium C++ ABI 2.9.5p6c:
3162 // __flags is a word with flags describing details about the class
3163 // structure, which may be referenced by using the __flags_masks
3164 // enumeration. These flags refer to both direct and indirect bases.
3165 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
3166 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3167
3168 // Itanium C++ ABI 2.9.5p6c:
3169 // __base_count is a word with the number of direct proper base class
3170 // descriptions that follow.
3171 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
3172
3173 if (!RD->getNumBases())
3174 return;
3175
3176 llvm::Type *LongLTy =
3177 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
3178
3179 // Now add the base class descriptions.
3180
3181 // Itanium C++ ABI 2.9.5p6c:
3182 // __base_info[] is an array of base class descriptions -- one for every
3183 // direct proper base. Each description is of the type:
3184 //
3185 // struct abi::__base_class_type_info {
3186 // public:
3187 // const __class_type_info *__base_type;
3188 // long __offset_flags;
3189 //
3190 // enum __offset_flags_masks {
3191 // __virtual_mask = 0x1,
3192 // __public_mask = 0x2,
3193 // __offset_shift = 8
3194 // };
3195 // };
3196 for (const auto &Base : RD->bases()) {
3197 // The __base_type member points to the RTTI for the base type.
3198 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
3199
3200 const CXXRecordDecl *BaseDecl =
3201 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
3202
3203 int64_t OffsetFlags = 0;
3204
3205 // All but the lower 8 bits of __offset_flags are a signed offset.
3206 // For a non-virtual base, this is the offset in the object of the base
3207 // subobject. For a virtual base, this is the offset in the virtual table of
3208 // the virtual base offset for the virtual base referenced (negative).
3209 CharUnits Offset;
3210 if (Base.isVirtual())
3211 Offset =
3212 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
3213 else {
3214 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
3215 Offset = Layout.getBaseClassOffset(BaseDecl);
3216 };
3217
3218 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
3219
3220 // The low-order byte of __offset_flags contains flags, as given by the
3221 // masks from the enumeration __offset_flags_masks.
3222 if (Base.isVirtual())
3223 OffsetFlags |= BCTI_Virtual;
3224 if (Base.getAccessSpecifier() == AS_public)
3225 OffsetFlags |= BCTI_Public;
3226
3227 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
3228 }
3229}
3230
3231/// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
3232/// used for pointer types.
3233void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
3234 Qualifiers Quals;
3235 QualType UnqualifiedPointeeTy =
3236 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3237
3238 // Itanium C++ ABI 2.9.5p7:
3239 // __flags is a flag word describing the cv-qualification and other
3240 // attributes of the type pointed to
3241 unsigned Flags = ComputeQualifierFlags(Quals);
3242
3243 // Itanium C++ ABI 2.9.5p7:
3244 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3245 // incomplete class type, the incomplete target type flag is set.
3246 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3247 Flags |= PTI_Incomplete;
3248
3249 llvm::Type *UnsignedIntLTy =
3250 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3251 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3252
3253 // Itanium C++ ABI 2.9.5p7:
3254 // __pointee is a pointer to the std::type_info derivation for the
3255 // unqualified type being pointed to.
3256 llvm::Constant *PointeeTypeInfo =
3257 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3258 Fields.push_back(PointeeTypeInfo);
3259}
3260
3261/// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
3262/// struct, used for member pointer types.
3263void
3264ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
3265 QualType PointeeTy = Ty->getPointeeType();
3266
3267 Qualifiers Quals;
3268 QualType UnqualifiedPointeeTy =
3269 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3270
3271 // Itanium C++ ABI 2.9.5p7:
3272 // __flags is a flag word describing the cv-qualification and other
3273 // attributes of the type pointed to.
3274 unsigned Flags = ComputeQualifierFlags(Quals);
3275
3276 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
3277
3278 // Itanium C++ ABI 2.9.5p7:
3279 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3280 // incomplete class type, the incomplete target type flag is set.
3281 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3282 Flags |= PTI_Incomplete;
3283
3284 if (IsIncompleteClassType(ClassType))
3285 Flags |= PTI_ContainingClassIncomplete;
3286
3287 llvm::Type *UnsignedIntLTy =
3288 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3289 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3290
3291 // Itanium C++ ABI 2.9.5p7:
3292 // __pointee is a pointer to the std::type_info derivation for the
3293 // unqualified type being pointed to.
3294 llvm::Constant *PointeeTypeInfo =
3295 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3296 Fields.push_back(PointeeTypeInfo);
3297
3298 // Itanium C++ ABI 2.9.5p9:
3299 // __context is a pointer to an abi::__class_type_info corresponding to the
3300 // class type containing the member pointed to
3301 // (e.g., the "A" in "int A::*").
3302 Fields.push_back(
3303 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
3304}
3305
David Majnemer443250f2015-03-17 20:35:00 +00003306llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
David Majnemere2cb8d12014-07-07 06:20:47 +00003307 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
3308}
3309
3310void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
3311 QualType PointerType = getContext().getPointerType(Type);
3312 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
3313 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
3314 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
3315 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
3316}
3317
3318void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
3319 QualType FundamentalTypes[] = {
3320 getContext().VoidTy, getContext().NullPtrTy,
3321 getContext().BoolTy, getContext().WCharTy,
3322 getContext().CharTy, getContext().UnsignedCharTy,
3323 getContext().SignedCharTy, getContext().ShortTy,
3324 getContext().UnsignedShortTy, getContext().IntTy,
3325 getContext().UnsignedIntTy, getContext().LongTy,
3326 getContext().UnsignedLongTy, getContext().LongLongTy,
3327 getContext().UnsignedLongLongTy, getContext().HalfTy,
3328 getContext().FloatTy, getContext().DoubleTy,
3329 getContext().LongDoubleTy, getContext().Char16Ty,
3330 getContext().Char32Ty,
3331 };
3332 for (const QualType &FundamentalType : FundamentalTypes)
3333 EmitFundamentalRTTIDescriptor(FundamentalType);
3334}
3335
3336/// What sort of uniqueness rules should we use for the RTTI for the
3337/// given type?
3338ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
3339 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
3340 if (shouldRTTIBeUnique())
3341 return RUK_Unique;
3342
3343 // It's only necessary for linkonce_odr or weak_odr linkage.
3344 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
3345 Linkage != llvm::GlobalValue::WeakODRLinkage)
3346 return RUK_Unique;
3347
3348 // It's only necessary with default visibility.
3349 if (CanTy->getVisibility() != DefaultVisibility)
3350 return RUK_Unique;
3351
3352 // If we're not required to publish this symbol, hide it.
3353 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3354 return RUK_NonUniqueHidden;
3355
3356 // If we're required to publish this symbol, as we might be under an
3357 // explicit instantiation, leave it with default visibility but
3358 // enable string-comparisons.
3359 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
3360 return RUK_NonUniqueVisible;
3361}
Rafael Espindola91f68b42014-09-15 19:20:10 +00003362
Rafael Espindola1e4df922014-09-16 15:18:21 +00003363// Find out how to codegen the complete destructor and constructor
3364namespace {
3365enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
3366}
3367static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
3368 const CXXMethodDecl *MD) {
3369 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
3370 return StructorCodegen::Emit;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003371
Rafael Espindola1e4df922014-09-16 15:18:21 +00003372 // The complete and base structors are not equivalent if there are any virtual
3373 // bases, so emit separate functions.
3374 if (MD->getParent()->getNumVBases())
3375 return StructorCodegen::Emit;
3376
3377 GlobalDecl AliasDecl;
3378 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
3379 AliasDecl = GlobalDecl(DD, Dtor_Complete);
3380 } else {
3381 const auto *CD = cast<CXXConstructorDecl>(MD);
3382 AliasDecl = GlobalDecl(CD, Ctor_Complete);
3383 }
3384 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3385
3386 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
3387 return StructorCodegen::RAUW;
3388
3389 // FIXME: Should we allow available_externally aliases?
3390 if (!llvm::GlobalAlias::isValidLinkage(Linkage))
3391 return StructorCodegen::RAUW;
3392
Rafael Espindola0806f982014-09-16 20:19:43 +00003393 if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
3394 // Only ELF supports COMDATs with arbitrary names (C5/D5).
3395 if (CGM.getTarget().getTriple().isOSBinFormatELF())
3396 return StructorCodegen::COMDAT;
3397 return StructorCodegen::Emit;
3398 }
Rafael Espindola1e4df922014-09-16 15:18:21 +00003399
3400 return StructorCodegen::Alias;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003401}
3402
Rafael Espindola1e4df922014-09-16 15:18:21 +00003403static void emitConstructorDestructorAlias(CodeGenModule &CGM,
3404 GlobalDecl AliasDecl,
3405 GlobalDecl TargetDecl) {
3406 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3407
3408 StringRef MangledName = CGM.getMangledName(AliasDecl);
3409 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
3410 if (Entry && !Entry->isDeclaration())
3411 return;
3412
3413 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
Rafael Espindola1e4df922014-09-16 15:18:21 +00003414
3415 // Create the alias with no name.
David Blaikie2a791d72015-09-14 18:38:22 +00003416 auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003417
3418 // Switch any previous uses to the alias.
3419 if (Entry) {
NAKAMURA Takumie9621042015-09-15 01:39:27 +00003420 assert(Entry->getType() == Aliasee->getType() &&
Rafael Espindola1e4df922014-09-16 15:18:21 +00003421 "declaration exists with different type");
3422 Alias->takeName(Entry);
3423 Entry->replaceAllUsesWith(Alias);
3424 Entry->eraseFromParent();
3425 } else {
3426 Alias->setName(MangledName);
3427 }
3428
3429 // Finally, set up the alias with its proper name and attributes.
Dario Domiziolic4fb8ca72014-09-19 22:06:24 +00003430 CGM.setAliasAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003431}
3432
3433void ItaniumCXXABI::emitCXXStructor(const CXXMethodDecl *MD,
3434 StructorType Type) {
3435 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
3436 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
3437
3438 StructorCodegen CGType = getCodegenToUse(CGM, MD);
3439
3440 if (Type == StructorType::Complete) {
3441 GlobalDecl CompleteDecl;
3442 GlobalDecl BaseDecl;
3443 if (CD) {
3444 CompleteDecl = GlobalDecl(CD, Ctor_Complete);
3445 BaseDecl = GlobalDecl(CD, Ctor_Base);
3446 } else {
3447 CompleteDecl = GlobalDecl(DD, Dtor_Complete);
3448 BaseDecl = GlobalDecl(DD, Dtor_Base);
3449 }
3450
3451 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
3452 emitConstructorDestructorAlias(CGM, CompleteDecl, BaseDecl);
3453 return;
3454 }
3455
3456 if (CGType == StructorCodegen::RAUW) {
3457 StringRef MangledName = CGM.getMangledName(CompleteDecl);
Andrey Bokhankocab58582015-08-31 13:20:44 +00003458 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl);
Rafael Espindola1e4df922014-09-16 15:18:21 +00003459 CGM.addReplacement(MangledName, Aliasee);
3460 return;
Rafael Espindola91f68b42014-09-15 19:20:10 +00003461 }
3462 }
3463
3464 // The base destructor is equivalent to the base destructor of its
3465 // base class if there is exactly one non-virtual base class with a
3466 // non-trivial destructor, there are no fields with a non-trivial
3467 // destructor, and the body of the destructor is trivial.
Rafael Espindola1e4df922014-09-16 15:18:21 +00003468 if (DD && Type == StructorType::Base && CGType != StructorCodegen::COMDAT &&
3469 !CGM.TryEmitBaseDestructorAsAlias(DD))
Rafael Espindola91f68b42014-09-15 19:20:10 +00003470 return;
3471
Rafael Espindola1e4df922014-09-16 15:18:21 +00003472 llvm::Function *Fn = CGM.codegenCXXStructor(MD, Type);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003473
Rafael Espindola1e4df922014-09-16 15:18:21 +00003474 if (CGType == StructorCodegen::COMDAT) {
3475 SmallString<256> Buffer;
3476 llvm::raw_svector_ostream Out(Buffer);
3477 if (DD)
3478 getMangleContext().mangleCXXDtorComdat(DD, Out);
3479 else
3480 getMangleContext().mangleCXXCtorComdat(CD, Out);
3481 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
3482 Fn->setComdat(C);
Rafael Espindoladbee8a72015-01-15 21:36:08 +00003483 } else {
3484 CGM.maybeSetTrivialComdat(*MD, *Fn);
Rafael Espindola91f68b42014-09-15 19:20:10 +00003485 }
Rafael Espindola91f68b42014-09-15 19:20:10 +00003486}
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003487
3488static llvm::Constant *getBeginCatchFn(CodeGenModule &CGM) {
3489 // void *__cxa_begin_catch(void*);
3490 llvm::FunctionType *FTy = llvm::FunctionType::get(
3491 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3492
3493 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
3494}
3495
3496static llvm::Constant *getEndCatchFn(CodeGenModule &CGM) {
3497 // void __cxa_end_catch();
3498 llvm::FunctionType *FTy =
3499 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
3500
3501 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
3502}
3503
3504static llvm::Constant *getGetExceptionPtrFn(CodeGenModule &CGM) {
3505 // void *__cxa_get_exception_ptr(void*);
3506 llvm::FunctionType *FTy = llvm::FunctionType::get(
3507 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3508
3509 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
3510}
3511
3512namespace {
3513 /// A cleanup to call __cxa_end_catch. In many cases, the caught
3514 /// exception type lets us state definitively that the thrown exception
3515 /// type does not have a destructor. In particular:
3516 /// - Catch-alls tell us nothing, so we have to conservatively
3517 /// assume that the thrown exception might have a destructor.
3518 /// - Catches by reference behave according to their base types.
3519 /// - Catches of non-record types will only trigger for exceptions
3520 /// of non-record types, which never have destructors.
3521 /// - Catches of record types can trigger for arbitrary subclasses
3522 /// of the caught type, so we have to assume the actual thrown
3523 /// exception type might have a throwing destructor, even if the
3524 /// caught type's destructor is trivial or nothrow.
David Blaikie7e70d682015-08-18 22:40:54 +00003525 struct CallEndCatch final : EHScopeStack::Cleanup {
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003526 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
3527 bool MightThrow;
3528
3529 void Emit(CodeGenFunction &CGF, Flags flags) override {
3530 if (!MightThrow) {
3531 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
3532 return;
3533 }
3534
3535 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
3536 }
3537 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +00003538}
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003539
3540/// Emits a call to __cxa_begin_catch and enters a cleanup to call
3541/// __cxa_end_catch.
3542///
3543/// \param EndMightThrow - true if __cxa_end_catch might throw
3544static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
3545 llvm::Value *Exn,
3546 bool EndMightThrow) {
3547 llvm::CallInst *call =
3548 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
3549
3550 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
3551
3552 return call;
3553}
3554
3555/// A "special initializer" callback for initializing a catch
3556/// parameter during catch initialization.
3557static void InitCatchParam(CodeGenFunction &CGF,
3558 const VarDecl &CatchParam,
John McCall7f416cc2015-09-08 08:05:57 +00003559 Address ParamAddr,
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003560 SourceLocation Loc) {
3561 // Load the exception from where the landing pad saved it.
3562 llvm::Value *Exn = CGF.getExceptionFromSlot();
3563
3564 CanQualType CatchType =
3565 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
3566 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
3567
3568 // If we're catching by reference, we can just cast the object
3569 // pointer to the appropriate pointer.
3570 if (isa<ReferenceType>(CatchType)) {
3571 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
3572 bool EndCatchMightThrow = CaughtType->isRecordType();
3573
3574 // __cxa_begin_catch returns the adjusted object pointer.
3575 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
3576
3577 // We have no way to tell the personality function that we're
3578 // catching by reference, so if we're catching a pointer,
3579 // __cxa_begin_catch will actually return that pointer by value.
3580 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
3581 QualType PointeeType = PT->getPointeeType();
3582
3583 // When catching by reference, generally we should just ignore
3584 // this by-value pointer and use the exception object instead.
3585 if (!PointeeType->isRecordType()) {
3586
3587 // Exn points to the struct _Unwind_Exception header, which
3588 // we have to skip past in order to reach the exception data.
3589 unsigned HeaderSize =
3590 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
3591 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize);
3592
3593 // However, if we're catching a pointer-to-record type that won't
3594 // work, because the personality function might have adjusted
3595 // the pointer. There's actually no way for us to fully satisfy
3596 // the language/ABI contract here: we can't use Exn because it
3597 // might have the wrong adjustment, but we can't use the by-value
3598 // pointer because it's off by a level of abstraction.
3599 //
3600 // The current solution is to dump the adjusted pointer into an
3601 // alloca, which breaks language semantics (because changing the
3602 // pointer doesn't change the exception) but at least works.
3603 // The better solution would be to filter out non-exact matches
3604 // and rethrow them, but this is tricky because the rethrow
3605 // really needs to be catchable by other sites at this landing
3606 // pad. The best solution is to fix the personality function.
3607 } else {
3608 // Pull the pointer for the reference type off.
3609 llvm::Type *PtrTy =
3610 cast<llvm::PointerType>(LLVMCatchTy)->getElementType();
3611
3612 // Create the temporary and write the adjusted pointer into it.
John McCall7f416cc2015-09-08 08:05:57 +00003613 Address ExnPtrTmp =
3614 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp");
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003615 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3616 CGF.Builder.CreateStore(Casted, ExnPtrTmp);
3617
3618 // Bind the reference to the temporary.
John McCall7f416cc2015-09-08 08:05:57 +00003619 AdjustedExn = ExnPtrTmp.getPointer();
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003620 }
3621 }
3622
3623 llvm::Value *ExnCast =
3624 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
3625 CGF.Builder.CreateStore(ExnCast, ParamAddr);
3626 return;
3627 }
3628
3629 // Scalars and complexes.
3630 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
3631 if (TEK != TEK_Aggregate) {
3632 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
3633
3634 // If the catch type is a pointer type, __cxa_begin_catch returns
3635 // the pointer by value.
3636 if (CatchType->hasPointerRepresentation()) {
3637 llvm::Value *CastExn =
3638 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
3639
3640 switch (CatchType.getQualifiers().getObjCLifetime()) {
3641 case Qualifiers::OCL_Strong:
3642 CastExn = CGF.EmitARCRetainNonBlock(CastExn);
3643 // fallthrough
3644
3645 case Qualifiers::OCL_None:
3646 case Qualifiers::OCL_ExplicitNone:
3647 case Qualifiers::OCL_Autoreleasing:
3648 CGF.Builder.CreateStore(CastExn, ParamAddr);
3649 return;
3650
3651 case Qualifiers::OCL_Weak:
3652 CGF.EmitARCInitWeak(ParamAddr, CastExn);
3653 return;
3654 }
3655 llvm_unreachable("bad ownership qualifier!");
3656 }
3657
3658 // Otherwise, it returns a pointer into the exception object.
3659
3660 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3661 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3662
3663 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType);
John McCall7f416cc2015-09-08 08:05:57 +00003664 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003665 switch (TEK) {
3666 case TEK_Complex:
3667 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
3668 /*init*/ true);
3669 return;
3670 case TEK_Scalar: {
3671 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
3672 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
3673 return;
3674 }
3675 case TEK_Aggregate:
3676 llvm_unreachable("evaluation kind filtered out!");
3677 }
3678 llvm_unreachable("bad evaluation kind");
3679 }
3680
3681 assert(isa<RecordType>(CatchType) && "unexpected catch type!");
John McCall7f416cc2015-09-08 08:05:57 +00003682 auto catchRD = CatchType->getAsCXXRecordDecl();
3683 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003684
3685 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3686
3687 // Check for a copy expression. If we don't have a copy expression,
3688 // that means a trivial copy is okay.
3689 const Expr *copyExpr = CatchParam.getInit();
3690 if (!copyExpr) {
3691 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
John McCall7f416cc2015-09-08 08:05:57 +00003692 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3693 caughtExnAlignment);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003694 CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType);
3695 return;
3696 }
3697
3698 // We have to call __cxa_get_exception_ptr to get the adjusted
3699 // pointer before copying.
3700 llvm::CallInst *rawAdjustedExn =
3701 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
3702
3703 // Cast that to the appropriate type.
John McCall7f416cc2015-09-08 08:05:57 +00003704 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3705 caughtExnAlignment);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003706
3707 // The copy expression is defined in terms of an OpaqueValueExpr.
3708 // Find it and map it to the adjusted expression.
3709 CodeGenFunction::OpaqueValueMapping
3710 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
3711 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
3712
3713 // Call the copy ctor in a terminate scope.
3714 CGF.EHStack.pushTerminate();
3715
3716 // Perform the copy construction.
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003717 CGF.EmitAggExpr(copyExpr,
John McCall7f416cc2015-09-08 08:05:57 +00003718 AggValueSlot::forAddr(ParamAddr, Qualifiers(),
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003719 AggValueSlot::IsNotDestructed,
3720 AggValueSlot::DoesNotNeedGCBarriers,
3721 AggValueSlot::IsNotAliased));
3722
3723 // Leave the terminate scope.
3724 CGF.EHStack.popTerminate();
3725
3726 // Undo the opaque value mapping.
3727 opaque.pop();
3728
3729 // Finally we can call __cxa_begin_catch.
3730 CallBeginCatch(CGF, Exn, true);
3731}
3732
3733/// Begins a catch statement by initializing the catch variable and
3734/// calling __cxa_begin_catch.
3735void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF,
3736 const CXXCatchStmt *S) {
3737 // We have to be very careful with the ordering of cleanups here:
3738 // C++ [except.throw]p4:
3739 // The destruction [of the exception temporary] occurs
3740 // immediately after the destruction of the object declared in
3741 // the exception-declaration in the handler.
3742 //
3743 // So the precise ordering is:
3744 // 1. Construct catch variable.
3745 // 2. __cxa_begin_catch
3746 // 3. Enter __cxa_end_catch cleanup
3747 // 4. Enter dtor cleanup
3748 //
3749 // We do this by using a slightly abnormal initialization process.
3750 // Delegation sequence:
3751 // - ExitCXXTryStmt opens a RunCleanupsScope
3752 // - EmitAutoVarAlloca creates the variable and debug info
3753 // - InitCatchParam initializes the variable from the exception
3754 // - CallBeginCatch calls __cxa_begin_catch
3755 // - CallBeginCatch enters the __cxa_end_catch cleanup
3756 // - EmitAutoVarCleanups enters the variable destructor cleanup
3757 // - EmitCXXTryStmt emits the code for the catch body
3758 // - EmitCXXTryStmt close the RunCleanupsScope
3759
3760 VarDecl *CatchParam = S->getExceptionDecl();
3761 if (!CatchParam) {
3762 llvm::Value *Exn = CGF.getExceptionFromSlot();
3763 CallBeginCatch(CGF, Exn, true);
3764 return;
3765 }
3766
3767 // Emit the local.
3768 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
3769 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart());
3770 CGF.EmitAutoVarCleanups(var);
3771}
3772
3773/// Get or define the following function:
3774/// void @__clang_call_terminate(i8* %exn) nounwind noreturn
3775/// This code is used only in C++.
3776static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) {
3777 llvm::FunctionType *fnTy =
3778 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3779 llvm::Constant *fnRef =
3780 CGM.CreateRuntimeFunction(fnTy, "__clang_call_terminate");
3781
3782 llvm::Function *fn = dyn_cast<llvm::Function>(fnRef);
3783 if (fn && fn->empty()) {
3784 fn->setDoesNotThrow();
3785 fn->setDoesNotReturn();
3786
3787 // What we really want is to massively penalize inlining without
3788 // forbidding it completely. The difference between that and
3789 // 'noinline' is negligible.
3790 fn->addFnAttr(llvm::Attribute::NoInline);
3791
3792 // Allow this function to be shared across translation units, but
3793 // we don't want it to turn into an exported symbol.
3794 fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
3795 fn->setVisibility(llvm::Function::HiddenVisibility);
NAKAMURA Takumic7da6da2015-05-09 21:10:07 +00003796 if (CGM.supportsCOMDAT())
3797 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003798
3799 // Set up the function.
3800 llvm::BasicBlock *entry =
3801 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
John McCall7f416cc2015-09-08 08:05:57 +00003802 CGBuilderTy builder(CGM, entry);
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003803
3804 // Pull the exception pointer out of the parameter list.
3805 llvm::Value *exn = &*fn->arg_begin();
3806
3807 // Call __cxa_begin_catch(exn).
3808 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
3809 catchCall->setDoesNotThrow();
3810 catchCall->setCallingConv(CGM.getRuntimeCC());
3811
3812 // Call std::terminate().
David Blaikie4ba525b2015-07-14 17:27:39 +00003813 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn());
Reid Klecknerfff8e7f2015-03-03 19:21:04 +00003814 termCall->setDoesNotThrow();
3815 termCall->setDoesNotReturn();
3816 termCall->setCallingConv(CGM.getRuntimeCC());
3817
3818 // std::terminate cannot return.
3819 builder.CreateUnreachable();
3820 }
3821
3822 return fnRef;
3823}
3824
3825llvm::CallInst *
3826ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
3827 llvm::Value *Exn) {
3828 // In C++, we want to call __cxa_begin_catch() before terminating.
3829 if (Exn) {
3830 assert(CGF.CGM.getLangOpts().CPlusPlus);
3831 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn);
3832 }
3833 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
3834}