1 //===------- 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 //
10 // This provides C++ code generation targeting the Itanium C++ ABI. The class
11 // 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
15 //
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 //
19 //===----------------------------------------------------------------------===//
20
21 #include "CGCXXABI.h"
22 #include "CGCleanup.h"
23 #include "CGRecordLayout.h"
24 #include "CGVTables.h"
25 #include "CodeGenFunction.h"
26 #include "CodeGenModule.h"
27 #include "TargetInfo.h"
28 #include "clang/AST/Mangle.h"
29 #include "clang/AST/Type.h"
30 #include "clang/AST/StmtCXX.h"
31 #include "llvm/IR/CallSite.h"
32 #include "llvm/IR/DataLayout.h"
33 #include "llvm/IR/Instructions.h"
34 #include "llvm/IR/Intrinsics.h"
35 #include "llvm/IR/Value.h"
36
37 using namespace clang;
38 using namespace CodeGen;
39
40 namespace {
41 class ItaniumCXXABI : public CodeGen::CGCXXABI {
42 /// VTables - All the vtables which have been defined.
43 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
44
45 protected:
46 bool UseARMMethodPtrABI;
47 bool UseARMGuardVarABI;
48
getMangleContext()49 ItaniumMangleContext &getMangleContext() {
50 return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext());
51 }
52
53 public:
ItaniumCXXABI(CodeGen::CodeGenModule & CGM,bool UseARMMethodPtrABI=false,bool UseARMGuardVarABI=false)54 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
55 bool UseARMMethodPtrABI = false,
56 bool UseARMGuardVarABI = false) :
57 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
58 UseARMGuardVarABI(UseARMGuardVarABI) { }
59
60 bool classifyReturnType(CGFunctionInfo &FI) const override;
61
getRecordArgABI(const CXXRecordDecl * RD) const62 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
63 // 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())
68 return RAA_Indirect;
69 return RAA_Default;
70 }
71
isThisCompleteObject(GlobalDecl GD) const72 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
111 bool isZeroInitializable(const MemberPointerType *MPT) override;
112
113 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
114
115 llvm::Value *
116 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
117 const Expr *E,
118 Address This,
119 llvm::Value *&ThisPtrForCall,
120 llvm::Value *MemFnPtr,
121 const MemberPointerType *MPT) override;
122
123 llvm::Value *
124 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
125 Address Base,
126 llvm::Value *MemPtr,
127 const MemberPointerType *MPT) override;
128
129 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
130 const CastExpr *E,
131 llvm::Value *Src) override;
132 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
133 llvm::Constant *Src) override;
134
135 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
136
137 llvm::Constant *EmitMemberFunctionPointer(const CXXMethodDecl *MD) override;
138 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
139 CharUnits offset) override;
140 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
141 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
142 CharUnits ThisAdjustment);
143
144 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
145 llvm::Value *L, llvm::Value *R,
146 const MemberPointerType *MPT,
147 bool Inequality) override;
148
149 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
150 llvm::Value *Addr,
151 const MemberPointerType *MPT) override;
152
153 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
154 Address Ptr, QualType ElementType,
155 const CXXDestructorDecl *Dtor) override;
156
getAlignmentOfExnObject()157 CharUnits getAlignmentOfExnObject() {
158 unsigned Align = CGM.getContext().getTargetInfo().getExnObjectAlignment();
159 return CGM.getContext().toCharUnitsFromBits(Align);
160 }
161
162 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
163 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
164
165 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
166
167 llvm::CallInst *
168 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
169 llvm::Value *Exn) override;
170
171 void EmitFundamentalRTTIDescriptor(QualType Type);
172 void EmitFundamentalRTTIDescriptors();
173 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
174 CatchTypeInfo
getAddrOfCXXCatchHandlerType(QualType Ty,QualType CatchHandlerType)175 getAddrOfCXXCatchHandlerType(QualType Ty,
176 QualType CatchHandlerType) override {
177 return CatchTypeInfo{getAddrOfRTTIDescriptor(Ty), 0};
178 }
179
180 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
181 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
182 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
183 Address ThisPtr,
184 llvm::Type *StdTypeInfoPtrTy) override;
185
186 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
187 QualType SrcRecordTy) override;
188
189 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, Address Value,
190 QualType SrcRecordTy, QualType DestTy,
191 QualType DestRecordTy,
192 llvm::BasicBlock *CastEnd) override;
193
194 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
195 QualType SrcRecordTy,
196 QualType DestTy) override;
197
198 bool EmitBadCastCall(CodeGenFunction &CGF) override;
199
200 llvm::Value *
201 GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
202 const CXXRecordDecl *ClassDecl,
203 const CXXRecordDecl *BaseClassDecl) override;
204
205 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
206
207 void buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
208 SmallVectorImpl<CanQualType> &ArgTys) override;
209
useThunkForDtorVariant(const CXXDestructorDecl * Dtor,CXXDtorType DT) const210 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
211 CXXDtorType DT) const override {
212 // Itanium does not emit any destructor variant as an inline thunk.
213 // Delegating may occur as an optimization, but all variants are either
214 // emitted with external linkage or as linkonce if they are inline and used.
215 return false;
216 }
217
218 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
219
220 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
221 FunctionArgList &Params) override;
222
223 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
224
225 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
226 const CXXConstructorDecl *D,
227 CXXCtorType Type, bool ForVirtualBase,
228 bool Delegating,
229 CallArgList &Args) override;
230
231 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
232 CXXDtorType Type, bool ForVirtualBase,
233 bool Delegating, Address This) override;
234
235 void emitVTableDefinitions(CodeGenVTables &CGVT,
236 const CXXRecordDecl *RD) override;
237
238 bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
239 CodeGenFunction::VPtr Vptr) override;
240
doStructorsInitializeVPtrs(const CXXRecordDecl * VTableClass)241 bool doStructorsInitializeVPtrs(const CXXRecordDecl *VTableClass) override {
242 return true;
243 }
244
245 llvm::Constant *
246 getVTableAddressPoint(BaseSubobject Base,
247 const CXXRecordDecl *VTableClass) override;
248
249 llvm::Value *getVTableAddressPointInStructor(
250 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
251 BaseSubobject Base, const CXXRecordDecl *NearestVBase) override;
252
253 llvm::Value *getVTableAddressPointInStructorWithVTT(
254 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
255 BaseSubobject Base, const CXXRecordDecl *NearestVBase);
256
257 llvm::Constant *
258 getVTableAddressPointForConstExpr(BaseSubobject Base,
259 const CXXRecordDecl *VTableClass) override;
260
261 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
262 CharUnits VPtrOffset) override;
263
264 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
265 Address This, llvm::Type *Ty,
266 SourceLocation Loc) override;
267
268 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
269 const CXXDestructorDecl *Dtor,
270 CXXDtorType DtorType,
271 Address This,
272 const CXXMemberCallExpr *CE) override;
273
274 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
275
276 bool canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const override;
277
setThunkLinkage(llvm::Function * Thunk,bool ForVTable,GlobalDecl GD,bool ReturnAdjustment)278 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
279 bool ReturnAdjustment) override {
280 // Allow inlining of thunks by emitting them with available_externally
281 // linkage together with vtables when needed.
282 if (ForVTable && !Thunk->hasLocalLinkage())
283 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
284 }
285
286 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
287 const ThisAdjustment &TA) override;
288
289 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
290 const ReturnAdjustment &RA) override;
291
getSrcArgforCopyCtor(const CXXConstructorDecl *,FunctionArgList & Args) const292 size_t getSrcArgforCopyCtor(const CXXConstructorDecl *,
293 FunctionArgList &Args) const override {
294 assert(!Args.empty() && "expected the arglist to not be empty!");
295 return Args.size() - 1;
296 }
297
GetPureVirtualCallName()298 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
GetDeletedVirtualCallName()299 StringRef GetDeletedVirtualCallName() override
300 { return "__cxa_deleted_virtual"; }
301
302 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
303 Address InitializeArrayCookie(CodeGenFunction &CGF,
304 Address NewPtr,
305 llvm::Value *NumElements,
306 const CXXNewExpr *expr,
307 QualType ElementType) override;
308 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
309 Address allocPtr,
310 CharUnits cookieSize) override;
311
312 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
313 llvm::GlobalVariable *DeclPtr,
314 bool PerformInit) override;
315 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
316 llvm::Constant *dtor, llvm::Constant *addr) override;
317
318 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
319 llvm::Value *Val);
320 void EmitThreadLocalInitFuncs(
321 CodeGenModule &CGM,
322 ArrayRef<const VarDecl *> CXXThreadLocals,
323 ArrayRef<llvm::Function *> CXXThreadLocalInits,
324 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) override;
325
usesThreadWrapperFunction() const326 bool usesThreadWrapperFunction() const override { return true; }
327 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
328 QualType LValType) override;
329
330 bool NeedsVTTParameter(GlobalDecl GD) override;
331
332 /**************************** RTTI Uniqueness ******************************/
333
334 protected:
335 /// Returns true if the ABI requires RTTI type_info objects to be unique
336 /// across a program.
shouldRTTIBeUnique() const337 virtual bool shouldRTTIBeUnique() const { return true; }
338
339 public:
340 /// What sort of unique-RTTI behavior should we use?
341 enum RTTIUniquenessKind {
342 /// We are guaranteeing, or need to guarantee, that the RTTI string
343 /// is unique.
344 RUK_Unique,
345
346 /// We are not guaranteeing uniqueness for the RTTI string, so we
347 /// can demote to hidden visibility but must use string comparisons.
348 RUK_NonUniqueHidden,
349
350 /// We are not guaranteeing uniqueness for the RTTI string, so we
351 /// have to use string comparisons, but we also have to emit it with
352 /// non-hidden visibility.
353 RUK_NonUniqueVisible
354 };
355
356 /// Return the required visibility status for the given type and linkage in
357 /// the current ABI.
358 RTTIUniquenessKind
359 classifyRTTIUniqueness(QualType CanTy,
360 llvm::GlobalValue::LinkageTypes Linkage) const;
361 friend class ItaniumRTTIBuilder;
362
363 void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override;
364
365 private:
hasAnyUsedVirtualInlineFunction(const CXXRecordDecl * RD) const366 bool hasAnyUsedVirtualInlineFunction(const CXXRecordDecl *RD) const {
367 const auto &VtableLayout =
368 CGM.getItaniumVTableContext().getVTableLayout(RD);
369
370 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
371 if (!VtableComponent.isUsedFunctionPointerKind())
372 continue;
373
374 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
375 if (Method->getCanonicalDecl()->isInlined())
376 return true;
377 }
378 return false;
379 }
380
isVTableHidden(const CXXRecordDecl * RD) const381 bool isVTableHidden(const CXXRecordDecl *RD) const {
382 const auto &VtableLayout =
383 CGM.getItaniumVTableContext().getVTableLayout(RD);
384
385 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
386 if (VtableComponent.isRTTIKind()) {
387 const CXXRecordDecl *RTTIDecl = VtableComponent.getRTTIDecl();
388 if (RTTIDecl->getVisibility() == Visibility::HiddenVisibility)
389 return true;
390 } else if (VtableComponent.isUsedFunctionPointerKind()) {
391 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
392 if (Method->getVisibility() == Visibility::HiddenVisibility &&
393 !Method->isDefined())
394 return true;
395 }
396 }
397 return false;
398 }
399 };
400
401 class ARMCXXABI : public ItaniumCXXABI {
402 public:
ARMCXXABI(CodeGen::CodeGenModule & CGM)403 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
404 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
405 /* UseARMGuardVarABI = */ true) {}
406
HasThisReturn(GlobalDecl GD) const407 bool HasThisReturn(GlobalDecl GD) const override {
408 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
409 isa<CXXDestructorDecl>(GD.getDecl()) &&
410 GD.getDtorType() != Dtor_Deleting));
411 }
412
413 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
414 QualType ResTy) override;
415
416 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
417 Address InitializeArrayCookie(CodeGenFunction &CGF,
418 Address NewPtr,
419 llvm::Value *NumElements,
420 const CXXNewExpr *expr,
421 QualType ElementType) override;
422 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr,
423 CharUnits cookieSize) override;
424 };
425
426 class iOS64CXXABI : public ARMCXXABI {
427 public:
iOS64CXXABI(CodeGen::CodeGenModule & CGM)428 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
429
430 // ARM64 libraries are prepared for non-unique RTTI.
shouldRTTIBeUnique() const431 bool shouldRTTIBeUnique() const override { return false; }
432 };
433
434 class WebAssemblyCXXABI final : public ItaniumCXXABI {
435 public:
WebAssemblyCXXABI(CodeGen::CodeGenModule & CGM)436 explicit WebAssemblyCXXABI(CodeGen::CodeGenModule &CGM)
437 : ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
438 /*UseARMGuardVarABI=*/true) {}
439
440 private:
HasThisReturn(GlobalDecl GD) const441 bool HasThisReturn(GlobalDecl GD) const override {
442 return isa<CXXConstructorDecl>(GD.getDecl()) ||
443 (isa<CXXDestructorDecl>(GD.getDecl()) &&
444 GD.getDtorType() != Dtor_Deleting);
445 }
canCallMismatchedFunctionType() const446 bool canCallMismatchedFunctionType() const override { return false; }
447 };
448 }
449
CreateItaniumCXXABI(CodeGenModule & CGM)450 CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
451 switch (CGM.getTarget().getCXXABI().getKind()) {
452 // For IR-generation purposes, there's no significant difference
453 // between the ARM and iOS ABIs.
454 case TargetCXXABI::GenericARM:
455 case TargetCXXABI::iOS:
456 case TargetCXXABI::WatchOS:
457 return new ARMCXXABI(CGM);
458
459 case TargetCXXABI::iOS64:
460 return new iOS64CXXABI(CGM);
461
462 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
463 // include the other 32-bit ARM oddities: constructor/destructor return values
464 // and array cookies.
465 case TargetCXXABI::GenericAArch64:
466 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
467 /* UseARMGuardVarABI = */ true);
468
469 case TargetCXXABI::GenericMIPS:
470 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true);
471
472 case TargetCXXABI::WebAssembly:
473 return new WebAssemblyCXXABI(CGM);
474
475 case TargetCXXABI::GenericItanium:
476 if (CGM.getContext().getTargetInfo().getTriple().getArch()
477 == llvm::Triple::le32) {
478 // For PNaCl, use ARM-style method pointers so that PNaCl code
479 // does not assume anything about the alignment of function
480 // pointers.
481 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
482 /* UseARMGuardVarABI = */ false);
483 }
484 return new ItaniumCXXABI(CGM);
485
486 case TargetCXXABI::Microsoft:
487 llvm_unreachable("Microsoft ABI is not Itanium-based");
488 }
489 llvm_unreachable("bad ABI kind");
490 }
491
492 llvm::Type *
ConvertMemberPointerType(const MemberPointerType * MPT)493 ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
494 if (MPT->isMemberDataPointer())
495 return CGM.PtrDiffTy;
496 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, nullptr);
497 }
498
499 /// In the Itanium and ARM ABIs, method pointers have the form:
500 /// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
501 ///
502 /// In the Itanium ABI:
503 /// - method pointers are virtual if (memptr.ptr & 1) is nonzero
504 /// - the this-adjustment is (memptr.adj)
505 /// - the virtual offset is (memptr.ptr - 1)
506 ///
507 /// In the ARM ABI:
508 /// - method pointers are virtual if (memptr.adj & 1) is nonzero
509 /// - the this-adjustment is (memptr.adj >> 1)
510 /// - the virtual offset is (memptr.ptr)
511 /// ARM uses 'adj' for the virtual flag because Thumb functions
512 /// may be only single-byte aligned.
513 ///
514 /// If the member is virtual, the adjusted 'this' pointer points
515 /// to a vtable pointer from which the virtual offset is applied.
516 ///
517 /// If the member is non-virtual, memptr.ptr is the address of
518 /// the function to call.
EmitLoadOfMemberFunctionPointer(CodeGenFunction & CGF,const Expr * E,Address ThisAddr,llvm::Value * & ThisPtrForCall,llvm::Value * MemFnPtr,const MemberPointerType * MPT)519 llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
520 CodeGenFunction &CGF, const Expr *E, Address ThisAddr,
521 llvm::Value *&ThisPtrForCall,
522 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
523 CGBuilderTy &Builder = CGF.Builder;
524
525 const FunctionProtoType *FPT =
526 MPT->getPointeeType()->getAs<FunctionProtoType>();
527 const CXXRecordDecl *RD =
528 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
529
530 llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(
531 CGM.getTypes().arrangeCXXMethodType(RD, FPT, /*FD=*/nullptr));
532
533 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
534
535 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
536 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
537 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
538
539 // Extract memptr.adj, which is in the second field.
540 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
541
542 // Compute the true adjustment.
543 llvm::Value *Adj = RawAdj;
544 if (UseARMMethodPtrABI)
545 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
546
547 // Apply the adjustment and cast back to the original struct type
548 // for consistency.
549 llvm::Value *This = ThisAddr.getPointer();
550 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
551 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
552 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
553 ThisPtrForCall = This;
554
555 // Load the function pointer.
556 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
557
558 // If the LSB in the function pointer is 1, the function pointer points to
559 // a virtual function.
560 llvm::Value *IsVirtual;
561 if (UseARMMethodPtrABI)
562 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
563 else
564 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
565 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
566 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
567
568 // In the virtual path, the adjustment left 'This' pointing to the
569 // vtable of the correct base subobject. The "function pointer" is an
570 // offset within the vtable (+1 for the virtual flag on non-ARM).
571 CGF.EmitBlock(FnVirtual);
572
573 // Cast the adjusted this to a pointer to vtable pointer and load.
574 llvm::Type *VTableTy = Builder.getInt8PtrTy();
575 CharUnits VTablePtrAlign =
576 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD,
577 CGF.getPointerAlign());
578 llvm::Value *VTable =
579 CGF.GetVTablePtr(Address(This, VTablePtrAlign), VTableTy, RD);
580
581 // Apply the offset.
582 llvm::Value *VTableOffset = FnAsInt;
583 if (!UseARMMethodPtrABI)
584 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
585 VTable = Builder.CreateGEP(VTable, VTableOffset);
586
587 // Load the virtual function to call.
588 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
589 llvm::Value *VirtualFn =
590 Builder.CreateAlignedLoad(VTable, CGF.getPointerAlign(),
591 "memptr.virtualfn");
592 CGF.EmitBranch(FnEnd);
593
594 // In the non-virtual path, the function pointer is actually a
595 // function pointer.
596 CGF.EmitBlock(FnNonVirtual);
597 llvm::Value *NonVirtualFn =
598 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
599
600 // We're done.
601 CGF.EmitBlock(FnEnd);
602 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
603 Callee->addIncoming(VirtualFn, FnVirtual);
604 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
605 return Callee;
606 }
607
608 /// Compute an l-value by applying the given pointer-to-member to a
609 /// base object.
EmitMemberDataPointerAddress(CodeGenFunction & CGF,const Expr * E,Address Base,llvm::Value * MemPtr,const MemberPointerType * MPT)610 llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
611 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
612 const MemberPointerType *MPT) {
613 assert(MemPtr->getType() == CGM.PtrDiffTy);
614
615 CGBuilderTy &Builder = CGF.Builder;
616
617 // Cast to char*.
618 Base = Builder.CreateElementBitCast(Base, CGF.Int8Ty);
619
620 // Apply the offset, which we assume is non-null.
621 llvm::Value *Addr =
622 Builder.CreateInBoundsGEP(Base.getPointer(), MemPtr, "memptr.offset");
623
624 // Cast the address to the appropriate pointer type, adopting the
625 // address space of the base pointer.
626 llvm::Type *PType = CGF.ConvertTypeForMem(MPT->getPointeeType())
627 ->getPointerTo(Base.getAddressSpace());
628 return Builder.CreateBitCast(Addr, PType);
629 }
630
631 /// Perform a bitcast, derived-to-base, or base-to-derived member pointer
632 /// conversion.
633 ///
634 /// Bitcast conversions are always a no-op under Itanium.
635 ///
636 /// Obligatory offset/adjustment diagram:
637 /// <-- offset --> <-- adjustment -->
638 /// |--------------------------|----------------------|--------------------|
639 /// ^Derived address point ^Base address point ^Member address point
640 ///
641 /// So when converting a base member pointer to a derived member pointer,
642 /// we add the offset to the adjustment because the address point has
643 /// decreased; and conversely, when converting a derived MP to a base MP
644 /// we subtract the offset from the adjustment because the address point
645 /// has increased.
646 ///
647 /// The standard forbids (at compile time) conversion to and from
648 /// virtual bases, which is why we don't have to consider them here.
649 ///
650 /// The standard forbids (at run time) casting a derived MP to a base
651 /// MP when the derived MP does not point to a member of the base.
652 /// This is why -1 is a reasonable choice for null data member
653 /// pointers.
654 llvm::Value *
EmitMemberPointerConversion(CodeGenFunction & CGF,const CastExpr * E,llvm::Value * src)655 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
656 const CastExpr *E,
657 llvm::Value *src) {
658 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
659 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
660 E->getCastKind() == CK_ReinterpretMemberPointer);
661
662 // Under Itanium, reinterprets don't require any additional processing.
663 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
664
665 // Use constant emission if we can.
666 if (isa<llvm::Constant>(src))
667 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
668
669 llvm::Constant *adj = getMemberPointerAdjustment(E);
670 if (!adj) return src;
671
672 CGBuilderTy &Builder = CGF.Builder;
673 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
674
675 const MemberPointerType *destTy =
676 E->getType()->castAs<MemberPointerType>();
677
678 // For member data pointers, this is just a matter of adding the
679 // offset if the source is non-null.
680 if (destTy->isMemberDataPointer()) {
681 llvm::Value *dst;
682 if (isDerivedToBase)
683 dst = Builder.CreateNSWSub(src, adj, "adj");
684 else
685 dst = Builder.CreateNSWAdd(src, adj, "adj");
686
687 // Null check.
688 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
689 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
690 return Builder.CreateSelect(isNull, src, dst);
691 }
692
693 // The this-adjustment is left-shifted by 1 on ARM.
694 if (UseARMMethodPtrABI) {
695 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
696 offset <<= 1;
697 adj = llvm::ConstantInt::get(adj->getType(), offset);
698 }
699
700 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
701 llvm::Value *dstAdj;
702 if (isDerivedToBase)
703 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
704 else
705 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
706
707 return Builder.CreateInsertValue(src, dstAdj, 1);
708 }
709
710 llvm::Constant *
EmitMemberPointerConversion(const CastExpr * E,llvm::Constant * src)711 ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
712 llvm::Constant *src) {
713 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
714 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
715 E->getCastKind() == CK_ReinterpretMemberPointer);
716
717 // Under Itanium, reinterprets don't require any additional processing.
718 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
719
720 // If the adjustment is trivial, we don't need to do anything.
721 llvm::Constant *adj = getMemberPointerAdjustment(E);
722 if (!adj) return src;
723
724 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
725
726 const MemberPointerType *destTy =
727 E->getType()->castAs<MemberPointerType>();
728
729 // For member data pointers, this is just a matter of adding the
730 // offset if the source is non-null.
731 if (destTy->isMemberDataPointer()) {
732 // null maps to null.
733 if (src->isAllOnesValue()) return src;
734
735 if (isDerivedToBase)
736 return llvm::ConstantExpr::getNSWSub(src, adj);
737 else
738 return llvm::ConstantExpr::getNSWAdd(src, adj);
739 }
740
741 // The this-adjustment is left-shifted by 1 on ARM.
742 if (UseARMMethodPtrABI) {
743 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
744 offset <<= 1;
745 adj = llvm::ConstantInt::get(adj->getType(), offset);
746 }
747
748 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
749 llvm::Constant *dstAdj;
750 if (isDerivedToBase)
751 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
752 else
753 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
754
755 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
756 }
757
758 llvm::Constant *
EmitNullMemberPointer(const MemberPointerType * MPT)759 ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
760 // Itanium C++ ABI 2.3:
761 // A NULL pointer is represented as -1.
762 if (MPT->isMemberDataPointer())
763 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
764
765 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
766 llvm::Constant *Values[2] = { Zero, Zero };
767 return llvm::ConstantStruct::getAnon(Values);
768 }
769
770 llvm::Constant *
EmitMemberDataPointer(const MemberPointerType * MPT,CharUnits offset)771 ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
772 CharUnits offset) {
773 // Itanium C++ ABI 2.3:
774 // A pointer to data member is an offset from the base address of
775 // the class object containing it, represented as a ptrdiff_t
776 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
777 }
778
779 llvm::Constant *
EmitMemberFunctionPointer(const CXXMethodDecl * MD)780 ItaniumCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
781 return BuildMemberPointer(MD, CharUnits::Zero());
782 }
783
BuildMemberPointer(const CXXMethodDecl * MD,CharUnits ThisAdjustment)784 llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
785 CharUnits ThisAdjustment) {
786 assert(MD->isInstance() && "Member function must not be static!");
787 MD = MD->getCanonicalDecl();
788
789 CodeGenTypes &Types = CGM.getTypes();
790
791 // Get the function pointer (or index if this is a virtual function).
792 llvm::Constant *MemPtr[2];
793 if (MD->isVirtual()) {
794 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
795
796 const ASTContext &Context = getContext();
797 CharUnits PointerWidth =
798 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
799 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
800
801 if (UseARMMethodPtrABI) {
802 // ARM C++ ABI 3.2.1:
803 // This ABI specifies that adj contains twice the this
804 // adjustment, plus 1 if the member function is virtual. The
805 // least significant bit of adj then makes exactly the same
806 // discrimination as the least significant bit of ptr does for
807 // Itanium.
808 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
809 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
810 2 * ThisAdjustment.getQuantity() + 1);
811 } else {
812 // Itanium C++ ABI 2.3:
813 // For a virtual function, [the pointer field] is 1 plus the
814 // virtual table offset (in bytes) of the function,
815 // represented as a ptrdiff_t.
816 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
817 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
818 ThisAdjustment.getQuantity());
819 }
820 } else {
821 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
822 llvm::Type *Ty;
823 // Check whether the function has a computable LLVM signature.
824 if (Types.isFuncTypeConvertible(FPT)) {
825 // The function has a computable LLVM signature; use the correct type.
826 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
827 } else {
828 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
829 // function type is incomplete.
830 Ty = CGM.PtrDiffTy;
831 }
832 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
833
834 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
835 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
836 (UseARMMethodPtrABI ? 2 : 1) *
837 ThisAdjustment.getQuantity());
838 }
839
840 return llvm::ConstantStruct::getAnon(MemPtr);
841 }
842
EmitMemberPointer(const APValue & MP,QualType MPType)843 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
844 QualType MPType) {
845 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
846 const ValueDecl *MPD = MP.getMemberPointerDecl();
847 if (!MPD)
848 return EmitNullMemberPointer(MPT);
849
850 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
851
852 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
853 return BuildMemberPointer(MD, ThisAdjustment);
854
855 CharUnits FieldOffset =
856 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
857 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
858 }
859
860 /// The comparison algorithm is pretty easy: the member pointers are
861 /// the same if they're either bitwise identical *or* both null.
862 ///
863 /// ARM is different here only because null-ness is more complicated.
864 llvm::Value *
EmitMemberPointerComparison(CodeGenFunction & CGF,llvm::Value * L,llvm::Value * R,const MemberPointerType * MPT,bool Inequality)865 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
866 llvm::Value *L,
867 llvm::Value *R,
868 const MemberPointerType *MPT,
869 bool Inequality) {
870 CGBuilderTy &Builder = CGF.Builder;
871
872 llvm::ICmpInst::Predicate Eq;
873 llvm::Instruction::BinaryOps And, Or;
874 if (Inequality) {
875 Eq = llvm::ICmpInst::ICMP_NE;
876 And = llvm::Instruction::Or;
877 Or = llvm::Instruction::And;
878 } else {
879 Eq = llvm::ICmpInst::ICMP_EQ;
880 And = llvm::Instruction::And;
881 Or = llvm::Instruction::Or;
882 }
883
884 // Member data pointers are easy because there's a unique null
885 // value, so it just comes down to bitwise equality.
886 if (MPT->isMemberDataPointer())
887 return Builder.CreateICmp(Eq, L, R);
888
889 // For member function pointers, the tautologies are more complex.
890 // The Itanium tautology is:
891 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
892 // The ARM tautology is:
893 // (L == R) <==> (L.ptr == R.ptr &&
894 // (L.adj == R.adj ||
895 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
896 // The inequality tautologies have exactly the same structure, except
897 // applying De Morgan's laws.
898
899 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
900 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
901
902 // This condition tests whether L.ptr == R.ptr. This must always be
903 // true for equality to hold.
904 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
905
906 // This condition, together with the assumption that L.ptr == R.ptr,
907 // tests whether the pointers are both null. ARM imposes an extra
908 // condition.
909 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
910 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
911
912 // This condition tests whether L.adj == R.adj. If this isn't
913 // true, the pointers are unequal unless they're both null.
914 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
915 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
916 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
917
918 // Null member function pointers on ARM clear the low bit of Adj,
919 // so the zero condition has to check that neither low bit is set.
920 if (UseARMMethodPtrABI) {
921 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
922
923 // Compute (l.adj | r.adj) & 1 and test it against zero.
924 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
925 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
926 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
927 "cmp.or.adj");
928 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
929 }
930
931 // Tie together all our conditions.
932 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
933 Result = Builder.CreateBinOp(And, PtrEq, Result,
934 Inequality ? "memptr.ne" : "memptr.eq");
935 return Result;
936 }
937
938 llvm::Value *
EmitMemberPointerIsNotNull(CodeGenFunction & CGF,llvm::Value * MemPtr,const MemberPointerType * MPT)939 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
940 llvm::Value *MemPtr,
941 const MemberPointerType *MPT) {
942 CGBuilderTy &Builder = CGF.Builder;
943
944 /// For member data pointers, this is just a check against -1.
945 if (MPT->isMemberDataPointer()) {
946 assert(MemPtr->getType() == CGM.PtrDiffTy);
947 llvm::Value *NegativeOne =
948 llvm::Constant::getAllOnesValue(MemPtr->getType());
949 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
950 }
951
952 // In Itanium, a member function pointer is not null if 'ptr' is not null.
953 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
954
955 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
956 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
957
958 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
959 // (the virtual bit) is set.
960 if (UseARMMethodPtrABI) {
961 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
962 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
963 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
964 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
965 "memptr.isvirtual");
966 Result = Builder.CreateOr(Result, IsVirtual);
967 }
968
969 return Result;
970 }
971
classifyReturnType(CGFunctionInfo & FI) const972 bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
973 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
974 if (!RD)
975 return false;
976
977 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
978 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
979 // special members.
980 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
981 auto Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
982 FI.getReturnInfo() = ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
983 return true;
984 }
985 return false;
986 }
987
988 /// The Itanium ABI requires non-zero initialization only for data
989 /// member pointers, for which '0' is a valid offset.
isZeroInitializable(const MemberPointerType * MPT)990 bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
991 return MPT->isMemberFunctionPointer();
992 }
993
994 /// The Itanium ABI always places an offset to the complete object
995 /// at entry -2 in the vtable.
emitVirtualObjectDelete(CodeGenFunction & CGF,const CXXDeleteExpr * DE,Address Ptr,QualType ElementType,const CXXDestructorDecl * Dtor)996 void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
997 const CXXDeleteExpr *DE,
998 Address Ptr,
999 QualType ElementType,
1000 const CXXDestructorDecl *Dtor) {
1001 bool UseGlobalDelete = DE->isGlobalDelete();
1002 if (UseGlobalDelete) {
1003 // Derive the complete-object pointer, which is what we need
1004 // to pass to the deallocation function.
1005
1006 // Grab the vtable pointer as an intptr_t*.
1007 auto *ClassDecl =
1008 cast<CXXRecordDecl>(ElementType->getAs<RecordType>()->getDecl());
1009 llvm::Value *VTable =
1010 CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo(), ClassDecl);
1011
1012 // Track back to entry -2 and pull out the offset there.
1013 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
1014 VTable, -2, "complete-offset.ptr");
1015 llvm::Value *Offset =
1016 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
1017
1018 // Apply the offset.
1019 llvm::Value *CompletePtr =
1020 CGF.Builder.CreateBitCast(Ptr.getPointer(), CGF.Int8PtrTy);
1021 CompletePtr = CGF.Builder.CreateInBoundsGEP(CompletePtr, Offset);
1022
1023 // If we're supposed to call the global delete, make sure we do so
1024 // even if the destructor throws.
1025 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
1026 ElementType);
1027 }
1028
1029 // FIXME: Provide a source location here even though there's no
1030 // CXXMemberCallExpr for dtor call.
1031 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
1032 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr);
1033
1034 if (UseGlobalDelete)
1035 CGF.PopCleanupBlock();
1036 }
1037
emitRethrow(CodeGenFunction & CGF,bool isNoReturn)1038 void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
1039 // void __cxa_rethrow();
1040
1041 llvm::FunctionType *FTy =
1042 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
1043
1044 llvm::Constant *Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
1045
1046 if (isNoReturn)
1047 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, None);
1048 else
1049 CGF.EmitRuntimeCallOrInvoke(Fn);
1050 }
1051
getAllocateExceptionFn(CodeGenModule & CGM)1052 static llvm::Constant *getAllocateExceptionFn(CodeGenModule &CGM) {
1053 // void *__cxa_allocate_exception(size_t thrown_size);
1054
1055 llvm::FunctionType *FTy =
1056 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*IsVarArgs=*/false);
1057
1058 return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
1059 }
1060
getThrowFn(CodeGenModule & CGM)1061 static llvm::Constant *getThrowFn(CodeGenModule &CGM) {
1062 // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
1063 // void (*dest) (void *));
1064
1065 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.Int8PtrTy, CGM.Int8PtrTy };
1066 llvm::FunctionType *FTy =
1067 llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false);
1068
1069 return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
1070 }
1071
emitThrow(CodeGenFunction & CGF,const CXXThrowExpr * E)1072 void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
1073 QualType ThrowType = E->getSubExpr()->getType();
1074 // Now allocate the exception object.
1075 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType());
1076 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
1077
1078 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM);
1079 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall(
1080 AllocExceptionFn, llvm::ConstantInt::get(SizeTy, TypeSize), "exception");
1081
1082 CharUnits ExnAlign = getAlignmentOfExnObject();
1083 CGF.EmitAnyExprToExn(E->getSubExpr(), Address(ExceptionPtr, ExnAlign));
1084
1085 // Now throw the exception.
1086 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
1087 /*ForEH=*/true);
1088
1089 // The address of the destructor. If the exception type has a
1090 // trivial destructor (or isn't a record), we just pass null.
1091 llvm::Constant *Dtor = nullptr;
1092 if (const RecordType *RecordTy = ThrowType->getAs<RecordType>()) {
1093 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
1094 if (!Record->hasTrivialDestructor()) {
1095 CXXDestructorDecl *DtorD = Record->getDestructor();
1096 Dtor = CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete);
1097 Dtor = llvm::ConstantExpr::getBitCast(Dtor, CGM.Int8PtrTy);
1098 }
1099 }
1100 if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
1101
1102 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
1103 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args);
1104 }
1105
getItaniumDynamicCastFn(CodeGenFunction & CGF)1106 static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
1107 // void *__dynamic_cast(const void *sub,
1108 // const abi::__class_type_info *src,
1109 // const abi::__class_type_info *dst,
1110 // std::ptrdiff_t src2dst_offset);
1111
1112 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1113 llvm::Type *PtrDiffTy =
1114 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1115
1116 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
1117
1118 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
1119
1120 // Mark the function as nounwind readonly.
1121 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
1122 llvm::Attribute::ReadOnly };
1123 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
1124 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
1125
1126 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1127 }
1128
getBadCastFn(CodeGenFunction & CGF)1129 static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1130 // void __cxa_bad_cast();
1131 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1132 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1133 }
1134
1135 /// \brief Compute the src2dst_offset hint as described in the
1136 /// Itanium C++ ABI [2.9.7]
computeOffsetHint(ASTContext & Context,const CXXRecordDecl * Src,const CXXRecordDecl * Dst)1137 static CharUnits computeOffsetHint(ASTContext &Context,
1138 const CXXRecordDecl *Src,
1139 const CXXRecordDecl *Dst) {
1140 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1141 /*DetectVirtual=*/false);
1142
1143 // If Dst is not derived from Src we can skip the whole computation below and
1144 // return that Src is not a public base of Dst. Record all inheritance paths.
1145 if (!Dst->isDerivedFrom(Src, Paths))
1146 return CharUnits::fromQuantity(-2ULL);
1147
1148 unsigned NumPublicPaths = 0;
1149 CharUnits Offset;
1150
1151 // Now walk all possible inheritance paths.
1152 for (const CXXBasePath &Path : Paths) {
1153 if (Path.Access != AS_public) // Ignore non-public inheritance.
1154 continue;
1155
1156 ++NumPublicPaths;
1157
1158 for (const CXXBasePathElement &PathElement : Path) {
1159 // If the path contains a virtual base class we can't give any hint.
1160 // -1: no hint.
1161 if (PathElement.Base->isVirtual())
1162 return CharUnits::fromQuantity(-1ULL);
1163
1164 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1165 continue;
1166
1167 // Accumulate the base class offsets.
1168 const ASTRecordLayout &L = Context.getASTRecordLayout(PathElement.Class);
1169 Offset += L.getBaseClassOffset(
1170 PathElement.Base->getType()->getAsCXXRecordDecl());
1171 }
1172 }
1173
1174 // -2: Src is not a public base of Dst.
1175 if (NumPublicPaths == 0)
1176 return CharUnits::fromQuantity(-2ULL);
1177
1178 // -3: Src is a multiple public base type but never a virtual base type.
1179 if (NumPublicPaths > 1)
1180 return CharUnits::fromQuantity(-3ULL);
1181
1182 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1183 // Return the offset of Src from the origin of Dst.
1184 return Offset;
1185 }
1186
getBadTypeidFn(CodeGenFunction & CGF)1187 static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
1188 // void __cxa_bad_typeid();
1189 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1190
1191 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1192 }
1193
shouldTypeidBeNullChecked(bool IsDeref,QualType SrcRecordTy)1194 bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
1195 QualType SrcRecordTy) {
1196 return IsDeref;
1197 }
1198
EmitBadTypeidCall(CodeGenFunction & CGF)1199 void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1200 llvm::Value *Fn = getBadTypeidFn(CGF);
1201 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1202 CGF.Builder.CreateUnreachable();
1203 }
1204
EmitTypeid(CodeGenFunction & CGF,QualType SrcRecordTy,Address ThisPtr,llvm::Type * StdTypeInfoPtrTy)1205 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1206 QualType SrcRecordTy,
1207 Address ThisPtr,
1208 llvm::Type *StdTypeInfoPtrTy) {
1209 auto *ClassDecl =
1210 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
1211 llvm::Value *Value =
1212 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo(), ClassDecl);
1213
1214 // Load the type info.
1215 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
1216 return CGF.Builder.CreateAlignedLoad(Value, CGF.getPointerAlign());
1217 }
1218
shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,QualType SrcRecordTy)1219 bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1220 QualType SrcRecordTy) {
1221 return SrcIsPtr;
1222 }
1223
EmitDynamicCastCall(CodeGenFunction & CGF,Address ThisAddr,QualType SrcRecordTy,QualType DestTy,QualType DestRecordTy,llvm::BasicBlock * CastEnd)1224 llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
1225 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy,
1226 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1227 llvm::Type *PtrDiffLTy =
1228 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1229 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1230
1231 llvm::Value *SrcRTTI =
1232 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1233 llvm::Value *DestRTTI =
1234 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1235
1236 // Compute the offset hint.
1237 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1238 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1239 llvm::Value *OffsetHint = llvm::ConstantInt::get(
1240 PtrDiffLTy,
1241 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1242
1243 // Emit the call to __dynamic_cast.
1244 llvm::Value *Value = ThisAddr.getPointer();
1245 Value = CGF.EmitCastToVoidPtr(Value);
1246
1247 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1248 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
1249 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1250
1251 /// C++ [expr.dynamic.cast]p9:
1252 /// A failed cast to reference type throws std::bad_cast
1253 if (DestTy->isReferenceType()) {
1254 llvm::BasicBlock *BadCastBlock =
1255 CGF.createBasicBlock("dynamic_cast.bad_cast");
1256
1257 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1258 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1259
1260 CGF.EmitBlock(BadCastBlock);
1261 EmitBadCastCall(CGF);
1262 }
1263
1264 return Value;
1265 }
1266
EmitDynamicCastToVoid(CodeGenFunction & CGF,Address ThisAddr,QualType SrcRecordTy,QualType DestTy)1267 llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1268 Address ThisAddr,
1269 QualType SrcRecordTy,
1270 QualType DestTy) {
1271 llvm::Type *PtrDiffLTy =
1272 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1273 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1274
1275 auto *ClassDecl =
1276 cast<CXXRecordDecl>(SrcRecordTy->getAs<RecordType>()->getDecl());
1277 // Get the vtable pointer.
1278 llvm::Value *VTable = CGF.GetVTablePtr(ThisAddr, PtrDiffLTy->getPointerTo(),
1279 ClassDecl);
1280
1281 // Get the offset-to-top from the vtable.
1282 llvm::Value *OffsetToTop =
1283 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1284 OffsetToTop =
1285 CGF.Builder.CreateAlignedLoad(OffsetToTop, CGF.getPointerAlign(),
1286 "offset.to.top");
1287
1288 // Finally, add the offset to the pointer.
1289 llvm::Value *Value = ThisAddr.getPointer();
1290 Value = CGF.EmitCastToVoidPtr(Value);
1291 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1292
1293 return CGF.Builder.CreateBitCast(Value, DestLTy);
1294 }
1295
EmitBadCastCall(CodeGenFunction & CGF)1296 bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1297 llvm::Value *Fn = getBadCastFn(CGF);
1298 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1299 CGF.Builder.CreateUnreachable();
1300 return true;
1301 }
1302
1303 llvm::Value *
GetVirtualBaseClassOffset(CodeGenFunction & CGF,Address This,const CXXRecordDecl * ClassDecl,const CXXRecordDecl * BaseClassDecl)1304 ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1305 Address This,
1306 const CXXRecordDecl *ClassDecl,
1307 const CXXRecordDecl *BaseClassDecl) {
1308 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl);
1309 CharUnits VBaseOffsetOffset =
1310 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1311 BaseClassDecl);
1312
1313 llvm::Value *VBaseOffsetPtr =
1314 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1315 "vbase.offset.ptr");
1316 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1317 CGM.PtrDiffTy->getPointerTo());
1318
1319 llvm::Value *VBaseOffset =
1320 CGF.Builder.CreateAlignedLoad(VBaseOffsetPtr, CGF.getPointerAlign(),
1321 "vbase.offset");
1322
1323 return VBaseOffset;
1324 }
1325
EmitCXXConstructors(const CXXConstructorDecl * D)1326 void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1327 // Just make sure we're in sync with TargetCXXABI.
1328 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1329
1330 // The constructor used for constructing this as a base class;
1331 // ignores virtual bases.
1332 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1333
1334 // The constructor used for constructing this as a complete class;
1335 // constructs the virtual bases, then calls the base constructor.
1336 if (!D->getParent()->isAbstract()) {
1337 // We don't need to emit the complete ctor if the class is abstract.
1338 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1339 }
1340 }
1341
1342 void
buildStructorSignature(const CXXMethodDecl * MD,StructorType T,SmallVectorImpl<CanQualType> & ArgTys)1343 ItaniumCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
1344 SmallVectorImpl<CanQualType> &ArgTys) {
1345 ASTContext &Context = getContext();
1346
1347 // All parameters are already in place except VTT, which goes after 'this'.
1348 // These are Clang types, so we don't need to worry about sret yet.
1349
1350 // Check if we need to add a VTT parameter (which has type void **).
1351 if (T == StructorType::Base && MD->getParent()->getNumVBases() != 0)
1352 ArgTys.insert(ArgTys.begin() + 1,
1353 Context.getPointerType(Context.VoidPtrTy));
1354 }
1355
EmitCXXDestructors(const CXXDestructorDecl * D)1356 void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1357 // The destructor used for destructing this as a base class; ignores
1358 // virtual bases.
1359 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1360
1361 // The destructor used for destructing this as a most-derived class;
1362 // call the base destructor and then destructs any virtual bases.
1363 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1364
1365 // The destructor in a virtual table is always a 'deleting'
1366 // destructor, which calls the complete destructor and then uses the
1367 // appropriate operator delete.
1368 if (D->isVirtual())
1369 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
1370 }
1371
addImplicitStructorParams(CodeGenFunction & CGF,QualType & ResTy,FunctionArgList & Params)1372 void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1373 QualType &ResTy,
1374 FunctionArgList &Params) {
1375 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1376 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
1377
1378 // Check if we need a VTT parameter as well.
1379 if (NeedsVTTParameter(CGF.CurGD)) {
1380 ASTContext &Context = getContext();
1381
1382 // FIXME: avoid the fake decl
1383 QualType T = Context.getPointerType(Context.VoidPtrTy);
1384 ImplicitParamDecl *VTTDecl
1385 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
1386 &Context.Idents.get("vtt"), T);
1387 Params.insert(Params.begin() + 1, VTTDecl);
1388 getStructorImplicitParamDecl(CGF) = VTTDecl;
1389 }
1390 }
1391
EmitInstanceFunctionProlog(CodeGenFunction & CGF)1392 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1393 /// Initialize the 'this' slot.
1394 EmitThisParam(CGF);
1395
1396 /// Initialize the 'vtt' slot if needed.
1397 if (getStructorImplicitParamDecl(CGF)) {
1398 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1399 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
1400 }
1401
1402 /// If this is a function that the ABI specifies returns 'this', initialize
1403 /// the return slot to 'this' at the start of the function.
1404 ///
1405 /// Unlike the setting of return types, this is done within the ABI
1406 /// implementation instead of by clients of CGCXXABI because:
1407 /// 1) getThisValue is currently protected
1408 /// 2) in theory, an ABI could implement 'this' returns some other way;
1409 /// HasThisReturn only specifies a contract, not the implementation
1410 if (HasThisReturn(CGF.CurGD))
1411 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1412 }
1413
addImplicitConstructorArgs(CodeGenFunction & CGF,const CXXConstructorDecl * D,CXXCtorType Type,bool ForVirtualBase,bool Delegating,CallArgList & Args)1414 unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1415 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1416 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1417 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1418 return 0;
1419
1420 // Insert the implicit 'vtt' argument as the second argument.
1421 llvm::Value *VTT =
1422 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1423 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1424 Args.insert(Args.begin() + 1,
1425 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1426 return 1; // Added one arg.
1427 }
1428
EmitDestructorCall(CodeGenFunction & CGF,const CXXDestructorDecl * DD,CXXDtorType Type,bool ForVirtualBase,bool Delegating,Address This)1429 void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1430 const CXXDestructorDecl *DD,
1431 CXXDtorType Type, bool ForVirtualBase,
1432 bool Delegating, Address This) {
1433 GlobalDecl GD(DD, Type);
1434 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1435 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1436
1437 llvm::Value *Callee = nullptr;
1438 if (getContext().getLangOpts().AppleKext)
1439 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1440
1441 if (!Callee)
1442 Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type));
1443
1444 CGF.EmitCXXMemberOrOperatorCall(DD, Callee, ReturnValueSlot(),
1445 This.getPointer(), VTT, VTTTy, nullptr);
1446 }
1447
emitVTableDefinitions(CodeGenVTables & CGVT,const CXXRecordDecl * RD)1448 void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1449 const CXXRecordDecl *RD) {
1450 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1451 if (VTable->hasInitializer())
1452 return;
1453
1454 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1455 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1456 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1457 llvm::Constant *RTTI =
1458 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
1459
1460 // Create and set the initializer.
1461 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1462 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
1463 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
1464 VTable->setInitializer(Init);
1465
1466 // Set the correct linkage.
1467 VTable->setLinkage(Linkage);
1468
1469 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
1470 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
1471
1472 // Set the right visibility.
1473 CGM.setGlobalVisibility(VTable, RD);
1474
1475 // Use pointer alignment for the vtable. Otherwise we would align them based
1476 // on the size of the initializer which doesn't make sense as only single
1477 // values are read.
1478 unsigned PAlign = CGM.getTarget().getPointerAlign(0);
1479 VTable->setAlignment(getContext().toCharUnitsFromBits(PAlign).getQuantity());
1480
1481 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1482 // we will emit the typeinfo for the fundamental types. This is the
1483 // same behaviour as GCC.
1484 const DeclContext *DC = RD->getDeclContext();
1485 if (RD->getIdentifier() &&
1486 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1487 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1488 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1489 DC->getParent()->isTranslationUnit())
1490 EmitFundamentalRTTIDescriptors();
1491
1492 if (!VTable->isDeclarationForLinker())
1493 CGM.EmitVTableTypeMetadata(VTable, VTLayout);
1494 }
1495
isVirtualOffsetNeededForVTableField(CodeGenFunction & CGF,CodeGenFunction::VPtr Vptr)1496 bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField(
1497 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) {
1498 if (Vptr.NearestVBase == nullptr)
1499 return false;
1500 return NeedsVTTParameter(CGF.CurGD);
1501 }
1502
getVTableAddressPointInStructor(CodeGenFunction & CGF,const CXXRecordDecl * VTableClass,BaseSubobject Base,const CXXRecordDecl * NearestVBase)1503 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1504 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1505 const CXXRecordDecl *NearestVBase) {
1506
1507 if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1508 NeedsVTTParameter(CGF.CurGD)) {
1509 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base,
1510 NearestVBase);
1511 }
1512 return getVTableAddressPoint(Base, VTableClass);
1513 }
1514
1515 llvm::Constant *
getVTableAddressPoint(BaseSubobject Base,const CXXRecordDecl * VTableClass)1516 ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base,
1517 const CXXRecordDecl *VTableClass) {
1518 llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, CharUnits());
1519
1520 // Find the appropriate vtable within the vtable group.
1521 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1522 .getVTableLayout(VTableClass)
1523 .getAddressPoint(Base);
1524 llvm::Value *Indices[] = {
1525 llvm::ConstantInt::get(CGM.Int32Ty, 0),
1526 llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint)
1527 };
1528
1529 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable->getValueType(),
1530 VTable, Indices);
1531 }
1532
getVTableAddressPointInStructorWithVTT(CodeGenFunction & CGF,const CXXRecordDecl * VTableClass,BaseSubobject Base,const CXXRecordDecl * NearestVBase)1533 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
1534 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1535 const CXXRecordDecl *NearestVBase) {
1536 assert((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1537 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT");
1538
1539 // Get the secondary vpointer index.
1540 uint64_t VirtualPointerIndex =
1541 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1542
1543 /// Load the VTT.
1544 llvm::Value *VTT = CGF.LoadCXXVTT();
1545 if (VirtualPointerIndex)
1546 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1547
1548 // And load the address point from the VTT.
1549 return CGF.Builder.CreateAlignedLoad(VTT, CGF.getPointerAlign());
1550 }
1551
getVTableAddressPointForConstExpr(BaseSubobject Base,const CXXRecordDecl * VTableClass)1552 llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1553 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1554 return getVTableAddressPoint(Base, VTableClass);
1555 }
1556
getAddrOfVTable(const CXXRecordDecl * RD,CharUnits VPtrOffset)1557 llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1558 CharUnits VPtrOffset) {
1559 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1560
1561 llvm::GlobalVariable *&VTable = VTables[RD];
1562 if (VTable)
1563 return VTable;
1564
1565 // Queue up this vtable for possible deferred emission.
1566 CGM.addDeferredVTable(RD);
1567
1568 SmallString<256> Name;
1569 llvm::raw_svector_ostream Out(Name);
1570 getMangleContext().mangleCXXVTable(RD, Out);
1571
1572 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1573 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1574 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1575
1576 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1577 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1578 VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1579
1580 if (RD->hasAttr<DLLImportAttr>())
1581 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1582 else if (RD->hasAttr<DLLExportAttr>())
1583 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1584
1585 return VTable;
1586 }
1587
getVirtualFunctionPointer(CodeGenFunction & CGF,GlobalDecl GD,Address This,llvm::Type * Ty,SourceLocation Loc)1588 llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1589 GlobalDecl GD,
1590 Address This,
1591 llvm::Type *Ty,
1592 SourceLocation Loc) {
1593 GD = GD.getCanonicalDecl();
1594 Ty = Ty->getPointerTo()->getPointerTo();
1595 auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl());
1596 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty, MethodDecl->getParent());
1597
1598 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
1599 if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) {
1600 return CGF.EmitVTableTypeCheckedLoad(
1601 MethodDecl->getParent(), VTable,
1602 VTableIndex * CGM.getContext().getTargetInfo().getPointerWidth(0) / 8);
1603 } else {
1604 CGF.EmitTypeMetadataCodeForVCall(MethodDecl->getParent(), VTable, Loc);
1605
1606 llvm::Value *VFuncPtr =
1607 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
1608 return CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.getPointerAlign());
1609 }
1610 }
1611
EmitVirtualDestructorCall(CodeGenFunction & CGF,const CXXDestructorDecl * Dtor,CXXDtorType DtorType,Address This,const CXXMemberCallExpr * CE)1612 llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
1613 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
1614 Address This, const CXXMemberCallExpr *CE) {
1615 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
1616 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1617
1618 const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
1619 Dtor, getFromDtorType(DtorType));
1620 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1621 llvm::Value *Callee =
1622 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty,
1623 CE ? CE->getLocStart() : SourceLocation());
1624
1625 CGF.EmitCXXMemberOrOperatorCall(Dtor, Callee, ReturnValueSlot(),
1626 This.getPointer(), /*ImplicitParam=*/nullptr,
1627 QualType(), CE);
1628 return nullptr;
1629 }
1630
emitVirtualInheritanceTables(const CXXRecordDecl * RD)1631 void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
1632 CodeGenVTables &VTables = CGM.getVTables();
1633 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
1634 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
1635 }
1636
canSpeculativelyEmitVTable(const CXXRecordDecl * RD) const1637 bool ItaniumCXXABI::canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const {
1638 // We don't emit available_externally vtables if we are in -fapple-kext mode
1639 // because kext mode does not permit devirtualization.
1640 if (CGM.getLangOpts().AppleKext)
1641 return false;
1642
1643 // If we don't have any inline virtual functions, and if vtable is not hidden,
1644 // then we are safe to emit available_externally copy of vtable.
1645 // FIXME we can still emit a copy of the vtable if we
1646 // can emit definition of the inline functions.
1647 return !hasAnyUsedVirtualInlineFunction(RD) && !isVTableHidden(RD);
1648 }
performTypeAdjustment(CodeGenFunction & CGF,Address InitialPtr,int64_t NonVirtualAdjustment,int64_t VirtualAdjustment,bool IsReturnAdjustment)1649 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
1650 Address InitialPtr,
1651 int64_t NonVirtualAdjustment,
1652 int64_t VirtualAdjustment,
1653 bool IsReturnAdjustment) {
1654 if (!NonVirtualAdjustment && !VirtualAdjustment)
1655 return InitialPtr.getPointer();
1656
1657 Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty);
1658
1659 // In a base-to-derived cast, the non-virtual adjustment is applied first.
1660 if (NonVirtualAdjustment && !IsReturnAdjustment) {
1661 V = CGF.Builder.CreateConstInBoundsByteGEP(V,
1662 CharUnits::fromQuantity(NonVirtualAdjustment));
1663 }
1664
1665 // Perform the virtual adjustment if we have one.
1666 llvm::Value *ResultPtr;
1667 if (VirtualAdjustment) {
1668 llvm::Type *PtrDiffTy =
1669 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1670
1671 Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy);
1672 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1673
1674 llvm::Value *OffsetPtr =
1675 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1676
1677 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1678
1679 // Load the adjustment offset from the vtable.
1680 llvm::Value *Offset =
1681 CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign());
1682
1683 // Adjust our pointer.
1684 ResultPtr = CGF.Builder.CreateInBoundsGEP(V.getPointer(), Offset);
1685 } else {
1686 ResultPtr = V.getPointer();
1687 }
1688
1689 // In a derived-to-base conversion, the non-virtual adjustment is
1690 // applied second.
1691 if (NonVirtualAdjustment && IsReturnAdjustment) {
1692 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(ResultPtr,
1693 NonVirtualAdjustment);
1694 }
1695
1696 // Cast back to the original type.
1697 return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType());
1698 }
1699
performThisAdjustment(CodeGenFunction & CGF,Address This,const ThisAdjustment & TA)1700 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1701 Address This,
1702 const ThisAdjustment &TA) {
1703 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1704 TA.Virtual.Itanium.VCallOffsetOffset,
1705 /*IsReturnAdjustment=*/false);
1706 }
1707
1708 llvm::Value *
performReturnAdjustment(CodeGenFunction & CGF,Address Ret,const ReturnAdjustment & RA)1709 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
1710 const ReturnAdjustment &RA) {
1711 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1712 RA.Virtual.Itanium.VBaseOffsetOffset,
1713 /*IsReturnAdjustment=*/true);
1714 }
1715
EmitReturnFromThunk(CodeGenFunction & CGF,RValue RV,QualType ResultType)1716 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1717 RValue RV, QualType ResultType) {
1718 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1719 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1720
1721 // Destructor thunks in the ARM ABI have indeterminate results.
1722 llvm::Type *T = CGF.ReturnValue.getElementType();
1723 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1724 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1725 }
1726
1727 /************************** Array allocation cookies **************************/
1728
getArrayCookieSizeImpl(QualType elementType)1729 CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1730 // The array cookie is a size_t; pad that up to the element alignment.
1731 // The cookie is actually right-justified in that space.
1732 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1733 CGM.getContext().getTypeAlignInChars(elementType));
1734 }
1735
InitializeArrayCookie(CodeGenFunction & CGF,Address NewPtr,llvm::Value * NumElements,const CXXNewExpr * expr,QualType ElementType)1736 Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1737 Address NewPtr,
1738 llvm::Value *NumElements,
1739 const CXXNewExpr *expr,
1740 QualType ElementType) {
1741 assert(requiresArrayCookie(expr));
1742
1743 unsigned AS = NewPtr.getAddressSpace();
1744
1745 ASTContext &Ctx = getContext();
1746 CharUnits SizeSize = CGF.getSizeSize();
1747
1748 // The size of the cookie.
1749 CharUnits CookieSize =
1750 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
1751 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
1752
1753 // Compute an offset to the cookie.
1754 Address CookiePtr = NewPtr;
1755 CharUnits CookieOffset = CookieSize - SizeSize;
1756 if (!CookieOffset.isZero())
1757 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset);
1758
1759 // Write the number of elements into the appropriate slot.
1760 Address NumElementsPtr =
1761 CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy);
1762 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
1763
1764 // Handle the array cookie specially in ASan.
1765 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
1766 expr->getOperatorNew()->isReplaceableGlobalAllocationFunction()) {
1767 // The store to the CookiePtr does not need to be instrumented.
1768 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
1769 llvm::FunctionType *FTy =
1770 llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false);
1771 llvm::Constant *F =
1772 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
1773 CGF.Builder.CreateCall(F, NumElementsPtr.getPointer());
1774 }
1775
1776 // Finally, compute a pointer to the actual data buffer by skipping
1777 // over the cookie completely.
1778 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize);
1779 }
1780
readArrayCookieImpl(CodeGenFunction & CGF,Address allocPtr,CharUnits cookieSize)1781 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1782 Address allocPtr,
1783 CharUnits cookieSize) {
1784 // The element size is right-justified in the cookie.
1785 Address numElementsPtr = allocPtr;
1786 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize();
1787 if (!numElementsOffset.isZero())
1788 numElementsPtr =
1789 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset);
1790
1791 unsigned AS = allocPtr.getAddressSpace();
1792 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
1793 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
1794 return CGF.Builder.CreateLoad(numElementsPtr);
1795 // In asan mode emit a function call instead of a regular load and let the
1796 // run-time deal with it: if the shadow is properly poisoned return the
1797 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
1798 // We can't simply ignore this load using nosanitize metadata because
1799 // the metadata may be lost.
1800 llvm::FunctionType *FTy =
1801 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
1802 llvm::Constant *F =
1803 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
1804 return CGF.Builder.CreateCall(F, numElementsPtr.getPointer());
1805 }
1806
getArrayCookieSizeImpl(QualType elementType)1807 CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1808 // ARM says that the cookie is always:
1809 // struct array_cookie {
1810 // std::size_t element_size; // element_size != 0
1811 // std::size_t element_count;
1812 // };
1813 // But the base ABI doesn't give anything an alignment greater than
1814 // 8, so we can dismiss this as typical ABI-author blindness to
1815 // actual language complexity and round up to the element alignment.
1816 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1817 CGM.getContext().getTypeAlignInChars(elementType));
1818 }
1819
InitializeArrayCookie(CodeGenFunction & CGF,Address newPtr,llvm::Value * numElements,const CXXNewExpr * expr,QualType elementType)1820 Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1821 Address newPtr,
1822 llvm::Value *numElements,
1823 const CXXNewExpr *expr,
1824 QualType elementType) {
1825 assert(requiresArrayCookie(expr));
1826
1827 // The cookie is always at the start of the buffer.
1828 Address cookie = newPtr;
1829
1830 // The first element is the element size.
1831 cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy);
1832 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1833 getContext().getTypeSizeInChars(elementType).getQuantity());
1834 CGF.Builder.CreateStore(elementSize, cookie);
1835
1836 // The second element is the element count.
1837 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1, CGF.getSizeSize());
1838 CGF.Builder.CreateStore(numElements, cookie);
1839
1840 // Finally, compute a pointer to the actual data buffer by skipping
1841 // over the cookie completely.
1842 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
1843 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize);
1844 }
1845
readArrayCookieImpl(CodeGenFunction & CGF,Address allocPtr,CharUnits cookieSize)1846 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1847 Address allocPtr,
1848 CharUnits cookieSize) {
1849 // The number of elements is at offset sizeof(size_t) relative to
1850 // the allocated pointer.
1851 Address numElementsPtr
1852 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize());
1853
1854 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
1855 return CGF.Builder.CreateLoad(numElementsPtr);
1856 }
1857
1858 /*********************** Static local initialization **************************/
1859
getGuardAcquireFn(CodeGenModule & CGM,llvm::PointerType * GuardPtrTy)1860 static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
1861 llvm::PointerType *GuardPtrTy) {
1862 // int __cxa_guard_acquire(__guard *guard_object);
1863 llvm::FunctionType *FTy =
1864 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
1865 GuardPtrTy, /*isVarArg=*/false);
1866 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
1867 llvm::AttributeSet::get(CGM.getLLVMContext(),
1868 llvm::AttributeSet::FunctionIndex,
1869 llvm::Attribute::NoUnwind));
1870 }
1871
getGuardReleaseFn(CodeGenModule & CGM,llvm::PointerType * GuardPtrTy)1872 static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
1873 llvm::PointerType *GuardPtrTy) {
1874 // void __cxa_guard_release(__guard *guard_object);
1875 llvm::FunctionType *FTy =
1876 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1877 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
1878 llvm::AttributeSet::get(CGM.getLLVMContext(),
1879 llvm::AttributeSet::FunctionIndex,
1880 llvm::Attribute::NoUnwind));
1881 }
1882
getGuardAbortFn(CodeGenModule & CGM,llvm::PointerType * GuardPtrTy)1883 static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
1884 llvm::PointerType *GuardPtrTy) {
1885 // void __cxa_guard_abort(__guard *guard_object);
1886 llvm::FunctionType *FTy =
1887 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1888 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
1889 llvm::AttributeSet::get(CGM.getLLVMContext(),
1890 llvm::AttributeSet::FunctionIndex,
1891 llvm::Attribute::NoUnwind));
1892 }
1893
1894 namespace {
1895 struct CallGuardAbort final : EHScopeStack::Cleanup {
1896 llvm::GlobalVariable *Guard;
CallGuardAbort__anon2a20dafb0211::CallGuardAbort1897 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
1898
Emit__anon2a20dafb0211::CallGuardAbort1899 void Emit(CodeGenFunction &CGF, Flags flags) override {
1900 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1901 Guard);
1902 }
1903 };
1904 }
1905
1906 /// The ARM code here follows the Itanium code closely enough that we
1907 /// just special-case it at particular places.
EmitGuardedInit(CodeGenFunction & CGF,const VarDecl & D,llvm::GlobalVariable * var,bool shouldPerformInit)1908 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1909 const VarDecl &D,
1910 llvm::GlobalVariable *var,
1911 bool shouldPerformInit) {
1912 CGBuilderTy &Builder = CGF.Builder;
1913
1914 // Inline variables that weren't instantiated from variable templates have
1915 // partially-ordered initialization within their translation unit.
1916 bool NonTemplateInline =
1917 D.isInline() &&
1918 !isTemplateInstantiation(D.getTemplateSpecializationKind());
1919
1920 // We only need to use thread-safe statics for local non-TLS variables and
1921 // inline variables; other global initialization is always single-threaded
1922 // or (through lazy dynamic loading in multiple threads) unsequenced.
1923 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1924 (D.isLocalVarDecl() || NonTemplateInline) &&
1925 !D.getTLSKind();
1926
1927 // If we have a global variable with internal linkage and thread-safe statics
1928 // are disabled, we can just let the guard variable be of type i8.
1929 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1930
1931 llvm::IntegerType *guardTy;
1932 CharUnits guardAlignment;
1933 if (useInt8GuardVariable) {
1934 guardTy = CGF.Int8Ty;
1935 guardAlignment = CharUnits::One();
1936 } else {
1937 // Guard variables are 64 bits in the generic ABI and size width on ARM
1938 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
1939 if (UseARMGuardVarABI) {
1940 guardTy = CGF.SizeTy;
1941 guardAlignment = CGF.getSizeAlign();
1942 } else {
1943 guardTy = CGF.Int64Ty;
1944 guardAlignment = CharUnits::fromQuantity(
1945 CGM.getDataLayout().getABITypeAlignment(guardTy));
1946 }
1947 }
1948 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
1949
1950 // Create the guard variable if we don't already have it (as we
1951 // might if we're double-emitting this function body).
1952 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1953 if (!guard) {
1954 // Mangle the name for the guard.
1955 SmallString<256> guardName;
1956 {
1957 llvm::raw_svector_ostream out(guardName);
1958 getMangleContext().mangleStaticGuardVariable(&D, out);
1959 }
1960
1961 // Create the guard variable with a zero-initializer.
1962 // Just absorb linkage and visibility from the guarded variable.
1963 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1964 false, var->getLinkage(),
1965 llvm::ConstantInt::get(guardTy, 0),
1966 guardName.str());
1967 guard->setVisibility(var->getVisibility());
1968 // If the variable is thread-local, so is its guard variable.
1969 guard->setThreadLocalMode(var->getThreadLocalMode());
1970 guard->setAlignment(guardAlignment.getQuantity());
1971
1972 // The ABI says: "It is suggested that it be emitted in the same COMDAT
1973 // group as the associated data object." In practice, this doesn't work for
1974 // non-ELF object formats, so only do it for ELF.
1975 llvm::Comdat *C = var->getComdat();
1976 if (!D.isLocalVarDecl() && C &&
1977 CGM.getTarget().getTriple().isOSBinFormatELF()) {
1978 guard->setComdat(C);
1979 // An inline variable's guard function is run from the per-TU
1980 // initialization function, not via a dedicated global ctor function, so
1981 // we can't put it in a comdat.
1982 if (!NonTemplateInline)
1983 CGF.CurFn->setComdat(C);
1984 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
1985 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
1986 }
1987
1988 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1989 }
1990
1991 Address guardAddr = Address(guard, guardAlignment);
1992
1993 // Test whether the variable has completed initialization.
1994 //
1995 // Itanium C++ ABI 3.3.2:
1996 // The following is pseudo-code showing how these functions can be used:
1997 // if (obj_guard.first_byte == 0) {
1998 // if ( __cxa_guard_acquire (&obj_guard) ) {
1999 // try {
2000 // ... initialize the object ...;
2001 // } catch (...) {
2002 // __cxa_guard_abort (&obj_guard);
2003 // throw;
2004 // }
2005 // ... queue object destructor with __cxa_atexit() ...;
2006 // __cxa_guard_release (&obj_guard);
2007 // }
2008 // }
2009
2010 // Load the first byte of the guard variable.
2011 llvm::LoadInst *LI =
2012 Builder.CreateLoad(Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty));
2013
2014 // Itanium ABI:
2015 // An implementation supporting thread-safety on multiprocessor
2016 // systems must also guarantee that references to the initialized
2017 // object do not occur before the load of the initialization flag.
2018 //
2019 // In LLVM, we do this by marking the load Acquire.
2020 if (threadsafe)
2021 LI->setAtomic(llvm::AtomicOrdering::Acquire);
2022
2023 // For ARM, we should only check the first bit, rather than the entire byte:
2024 //
2025 // ARM C++ ABI 3.2.3.1:
2026 // To support the potential use of initialization guard variables
2027 // as semaphores that are the target of ARM SWP and LDREX/STREX
2028 // synchronizing instructions we define a static initialization
2029 // guard variable to be a 4-byte aligned, 4-byte word with the
2030 // following inline access protocol.
2031 // #define INITIALIZED 1
2032 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
2033 // if (__cxa_guard_acquire(&obj_guard))
2034 // ...
2035 // }
2036 //
2037 // and similarly for ARM64:
2038 //
2039 // ARM64 C++ ABI 3.2.2:
2040 // This ABI instead only specifies the value bit 0 of the static guard
2041 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
2042 // variable is not initialized and 1 when it is.
2043 llvm::Value *V =
2044 (UseARMGuardVarABI && !useInt8GuardVariable)
2045 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
2046 : LI;
2047 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
2048
2049 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
2050 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2051
2052 // Check if the first byte of the guard variable is zero.
2053 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
2054
2055 CGF.EmitBlock(InitCheckBlock);
2056
2057 // Variables used when coping with thread-safe statics and exceptions.
2058 if (threadsafe) {
2059 // Call __cxa_guard_acquire.
2060 llvm::Value *V
2061 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
2062
2063 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2064
2065 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
2066 InitBlock, EndBlock);
2067
2068 // Call __cxa_guard_abort along the exceptional edge.
2069 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
2070
2071 CGF.EmitBlock(InitBlock);
2072 }
2073
2074 // Emit the initializer and add a global destructor if appropriate.
2075 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
2076
2077 if (threadsafe) {
2078 // Pop the guard-abort cleanup if we pushed one.
2079 CGF.PopCleanupBlock();
2080
2081 // Call __cxa_guard_release. This cannot throw.
2082 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy),
2083 guardAddr.getPointer());
2084 } else {
2085 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guardAddr);
2086 }
2087
2088 CGF.EmitBlock(EndBlock);
2089 }
2090
2091 /// Register a global destructor using __cxa_atexit.
emitGlobalDtorWithCXAAtExit(CodeGenFunction & CGF,llvm::Constant * dtor,llvm::Constant * addr,bool TLS)2092 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
2093 llvm::Constant *dtor,
2094 llvm::Constant *addr,
2095 bool TLS) {
2096 const char *Name = "__cxa_atexit";
2097 if (TLS) {
2098 const llvm::Triple &T = CGF.getTarget().getTriple();
2099 Name = T.isOSDarwin() ? "_tlv_atexit" : "__cxa_thread_atexit";
2100 }
2101
2102 // We're assuming that the destructor function is something we can
2103 // reasonably call with the default CC. Go ahead and cast it to the
2104 // right prototype.
2105 llvm::Type *dtorTy =
2106 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
2107
2108 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
2109 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
2110 llvm::FunctionType *atexitTy =
2111 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
2112
2113 // Fetch the actual function.
2114 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
2115 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
2116 fn->setDoesNotThrow();
2117
2118 // Create a variable that binds the atexit to this shared object.
2119 llvm::Constant *handle =
2120 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
2121
2122 llvm::Value *args[] = {
2123 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
2124 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
2125 handle
2126 };
2127 CGF.EmitNounwindRuntimeCall(atexit, args);
2128 }
2129
2130 /// Register a global destructor as best as we know how.
registerGlobalDtor(CodeGenFunction & CGF,const VarDecl & D,llvm::Constant * dtor,llvm::Constant * addr)2131 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
2132 const VarDecl &D,
2133 llvm::Constant *dtor,
2134 llvm::Constant *addr) {
2135 // Use __cxa_atexit if available.
2136 if (CGM.getCodeGenOpts().CXAAtExit)
2137 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
2138
2139 if (D.getTLSKind())
2140 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
2141
2142 // In Apple kexts, we want to add a global destructor entry.
2143 // FIXME: shouldn't this be guarded by some variable?
2144 if (CGM.getLangOpts().AppleKext) {
2145 // Generate a global destructor entry.
2146 return CGM.AddCXXDtorEntry(dtor, addr);
2147 }
2148
2149 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
2150 }
2151
isThreadWrapperReplaceable(const VarDecl * VD,CodeGen::CodeGenModule & CGM)2152 static bool isThreadWrapperReplaceable(const VarDecl *VD,
2153 CodeGen::CodeGenModule &CGM) {
2154 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
2155 // Darwin prefers to have references to thread local variables to go through
2156 // the thread wrapper instead of directly referencing the backing variable.
2157 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
2158 CGM.getTarget().getTriple().isOSDarwin();
2159 }
2160
2161 /// Get the appropriate linkage for the wrapper function. This is essentially
2162 /// the weak form of the variable's linkage; every translation unit which needs
2163 /// the wrapper emits a copy, and we want the linker to merge them.
2164 static llvm::GlobalValue::LinkageTypes
getThreadLocalWrapperLinkage(const VarDecl * VD,CodeGen::CodeGenModule & CGM)2165 getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
2166 llvm::GlobalValue::LinkageTypes VarLinkage =
2167 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
2168
2169 // For internal linkage variables, we don't need an external or weak wrapper.
2170 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
2171 return VarLinkage;
2172
2173 // If the thread wrapper is replaceable, give it appropriate linkage.
2174 if (isThreadWrapperReplaceable(VD, CGM))
2175 if (!llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) &&
2176 !llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
2177 return VarLinkage;
2178 return llvm::GlobalValue::WeakODRLinkage;
2179 }
2180
2181 llvm::Function *
getOrCreateThreadLocalWrapper(const VarDecl * VD,llvm::Value * Val)2182 ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
2183 llvm::Value *Val) {
2184 // Mangle the name for the thread_local wrapper function.
2185 SmallString<256> WrapperName;
2186 {
2187 llvm::raw_svector_ostream Out(WrapperName);
2188 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
2189 }
2190
2191 // FIXME: If VD is a definition, we should regenerate the function attributes
2192 // before returning.
2193 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
2194 return cast<llvm::Function>(V);
2195
2196 QualType RetQT = VD->getType();
2197 if (RetQT->isReferenceType())
2198 RetQT = RetQT.getNonReferenceType();
2199
2200 const CGFunctionInfo &FI = CGM.getTypes().arrangeBuiltinFunctionDeclaration(
2201 getContext().getPointerType(RetQT), FunctionArgList());
2202
2203 llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FI);
2204 llvm::Function *Wrapper =
2205 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
2206 WrapperName.str(), &CGM.getModule());
2207
2208 CGM.SetLLVMFunctionAttributes(nullptr, FI, Wrapper);
2209
2210 if (VD->hasDefinition())
2211 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Wrapper);
2212
2213 // Always resolve references to the wrapper at link time.
2214 if (!Wrapper->hasLocalLinkage() && !(isThreadWrapperReplaceable(VD, CGM) &&
2215 !llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) &&
2216 !llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage())))
2217 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
2218
2219 if (isThreadWrapperReplaceable(VD, CGM)) {
2220 Wrapper->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2221 Wrapper->addFnAttr(llvm::Attribute::NoUnwind);
2222 }
2223 return Wrapper;
2224 }
2225
EmitThreadLocalInitFuncs(CodeGenModule & CGM,ArrayRef<const VarDecl * > CXXThreadLocals,ArrayRef<llvm::Function * > CXXThreadLocalInits,ArrayRef<const VarDecl * > CXXThreadLocalInitVars)2226 void ItaniumCXXABI::EmitThreadLocalInitFuncs(
2227 CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals,
2228 ArrayRef<llvm::Function *> CXXThreadLocalInits,
2229 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) {
2230 llvm::Function *InitFunc = nullptr;
2231 if (!CXXThreadLocalInits.empty()) {
2232 // Generate a guarded initialization function.
2233 llvm::FunctionType *FTy =
2234 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
2235 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
2236 InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init", FI,
2237 SourceLocation(),
2238 /*TLS=*/true);
2239 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
2240 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
2241 llvm::GlobalVariable::InternalLinkage,
2242 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
2243 Guard->setThreadLocal(true);
2244
2245 CharUnits GuardAlign = CharUnits::One();
2246 Guard->setAlignment(GuardAlign.getQuantity());
2247
2248 CodeGenFunction(CGM)
2249 .GenerateCXXGlobalInitFunc(InitFunc, CXXThreadLocalInits,
2250 Address(Guard, GuardAlign));
2251 // On Darwin platforms, use CXX_FAST_TLS calling convention.
2252 if (CGM.getTarget().getTriple().isOSDarwin()) {
2253 InitFunc->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2254 InitFunc->addFnAttr(llvm::Attribute::NoUnwind);
2255 }
2256 }
2257 for (const VarDecl *VD : CXXThreadLocals) {
2258 llvm::GlobalVariable *Var =
2259 cast<llvm::GlobalVariable>(CGM.GetGlobalValue(CGM.getMangledName(VD)));
2260
2261 // Some targets require that all access to thread local variables go through
2262 // the thread wrapper. This means that we cannot attempt to create a thread
2263 // wrapper or a thread helper.
2264 if (isThreadWrapperReplaceable(VD, CGM) && !VD->hasDefinition())
2265 continue;
2266
2267 // Mangle the name for the thread_local initialization function.
2268 SmallString<256> InitFnName;
2269 {
2270 llvm::raw_svector_ostream Out(InitFnName);
2271 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
2272 }
2273
2274 // If we have a definition for the variable, emit the initialization
2275 // function as an alias to the global Init function (if any). Otherwise,
2276 // produce a declaration of the initialization function.
2277 llvm::GlobalValue *Init = nullptr;
2278 bool InitIsInitFunc = false;
2279 if (VD->hasDefinition()) {
2280 InitIsInitFunc = true;
2281 if (InitFunc)
2282 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
2283 InitFunc);
2284 } else {
2285 // Emit a weak global function referring to the initialization function.
2286 // This function will not exist if the TU defining the thread_local
2287 // variable in question does not need any dynamic initialization for
2288 // its thread_local variables.
2289 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
2290 Init = llvm::Function::Create(
2291 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
2292 &CGM.getModule());
2293 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
2294 CGM.SetLLVMFunctionAttributes(nullptr, FI, cast<llvm::Function>(Init));
2295 }
2296
2297 if (Init)
2298 Init->setVisibility(Var->getVisibility());
2299
2300 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
2301 llvm::LLVMContext &Context = CGM.getModule().getContext();
2302 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
2303 CGBuilderTy Builder(CGM, Entry);
2304 if (InitIsInitFunc) {
2305 if (Init) {
2306 llvm::CallInst *CallVal = Builder.CreateCall(Init);
2307 if (isThreadWrapperReplaceable(VD, CGM))
2308 CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2309 }
2310 } else {
2311 // Don't know whether we have an init function. Call it if it exists.
2312 llvm::Value *Have = Builder.CreateIsNotNull(Init);
2313 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2314 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
2315 Builder.CreateCondBr(Have, InitBB, ExitBB);
2316
2317 Builder.SetInsertPoint(InitBB);
2318 Builder.CreateCall(Init);
2319 Builder.CreateBr(ExitBB);
2320
2321 Builder.SetInsertPoint(ExitBB);
2322 }
2323
2324 // For a reference, the result of the wrapper function is a pointer to
2325 // the referenced object.
2326 llvm::Value *Val = Var;
2327 if (VD->getType()->isReferenceType()) {
2328 CharUnits Align = CGM.getContext().getDeclAlign(VD);
2329 Val = Builder.CreateAlignedLoad(Val, Align);
2330 }
2331 if (Val->getType() != Wrapper->getReturnType())
2332 Val = Builder.CreatePointerBitCastOrAddrSpaceCast(
2333 Val, Wrapper->getReturnType(), "");
2334 Builder.CreateRet(Val);
2335 }
2336 }
2337
EmitThreadLocalVarDeclLValue(CodeGenFunction & CGF,const VarDecl * VD,QualType LValType)2338 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2339 const VarDecl *VD,
2340 QualType LValType) {
2341 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD);
2342 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
2343
2344 llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper);
2345 if (isThreadWrapperReplaceable(VD, CGF.CGM))
2346 CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2347
2348 LValue LV;
2349 if (VD->getType()->isReferenceType())
2350 LV = CGF.MakeNaturalAlignAddrLValue(CallVal, LValType);
2351 else
2352 LV = CGF.MakeAddrLValue(CallVal, LValType,
2353 CGF.getContext().getDeclAlign(VD));
2354 // FIXME: need setObjCGCLValueClass?
2355 return LV;
2356 }
2357
2358 /// Return whether the given global decl needs a VTT parameter, which it does
2359 /// if it's a base constructor or destructor with virtual bases.
NeedsVTTParameter(GlobalDecl GD)2360 bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
2361 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
2362
2363 // We don't have any virtual bases, just return early.
2364 if (!MD->getParent()->getNumVBases())
2365 return false;
2366
2367 // Check if we have a base constructor.
2368 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
2369 return true;
2370
2371 // Check if we have a base destructor.
2372 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
2373 return true;
2374
2375 return false;
2376 }
2377
2378 namespace {
2379 class ItaniumRTTIBuilder {
2380 CodeGenModule &CGM; // Per-module state.
2381 llvm::LLVMContext &VMContext;
2382 const ItaniumCXXABI &CXXABI; // Per-module state.
2383
2384 /// Fields - The fields of the RTTI descriptor currently being built.
2385 SmallVector<llvm::Constant *, 16> Fields;
2386
2387 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
2388 llvm::GlobalVariable *
2389 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
2390
2391 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
2392 /// descriptor of the given type.
2393 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
2394
2395 /// BuildVTablePointer - Build the vtable pointer for the given type.
2396 void BuildVTablePointer(const Type *Ty);
2397
2398 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2399 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2400 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2401
2402 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2403 /// classes with bases that do not satisfy the abi::__si_class_type_info
2404 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2405 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2406
2407 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2408 /// for pointer types.
2409 void BuildPointerTypeInfo(QualType PointeeTy);
2410
2411 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2412 /// type_info for an object type.
2413 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2414
2415 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2416 /// struct, used for member pointer types.
2417 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2418
2419 public:
ItaniumRTTIBuilder(const ItaniumCXXABI & ABI)2420 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2421 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2422
2423 // Pointer type info flags.
2424 enum {
2425 /// PTI_Const - Type has const qualifier.
2426 PTI_Const = 0x1,
2427
2428 /// PTI_Volatile - Type has volatile qualifier.
2429 PTI_Volatile = 0x2,
2430
2431 /// PTI_Restrict - Type has restrict qualifier.
2432 PTI_Restrict = 0x4,
2433
2434 /// PTI_Incomplete - Type is incomplete.
2435 PTI_Incomplete = 0x8,
2436
2437 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2438 /// (in pointer to member).
2439 PTI_ContainingClassIncomplete = 0x10
2440 };
2441
2442 // VMI type info flags.
2443 enum {
2444 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2445 VMI_NonDiamondRepeat = 0x1,
2446
2447 /// VMI_DiamondShaped - Class is diamond shaped.
2448 VMI_DiamondShaped = 0x2
2449 };
2450
2451 // Base class type info flags.
2452 enum {
2453 /// BCTI_Virtual - Base class is virtual.
2454 BCTI_Virtual = 0x1,
2455
2456 /// BCTI_Public - Base class is public.
2457 BCTI_Public = 0x2
2458 };
2459
2460 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2461 ///
2462 /// \param Force - true to force the creation of this RTTI value
2463 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2464 };
2465 }
2466
GetAddrOfTypeName(QualType Ty,llvm::GlobalVariable::LinkageTypes Linkage)2467 llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2468 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
2469 SmallString<256> Name;
2470 llvm::raw_svector_ostream Out(Name);
2471 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
2472
2473 // We know that the mangled name of the type starts at index 4 of the
2474 // mangled name of the typename, so we can just index into it in order to
2475 // get the mangled name of the type.
2476 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2477 Name.substr(4));
2478
2479 llvm::GlobalVariable *GV =
2480 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2481
2482 GV->setInitializer(Init);
2483
2484 return GV;
2485 }
2486
2487 llvm::Constant *
GetAddrOfExternalRTTIDescriptor(QualType Ty)2488 ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2489 // Mangle the RTTI name.
2490 SmallString<256> Name;
2491 llvm::raw_svector_ostream Out(Name);
2492 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2493
2494 // Look for an existing global.
2495 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2496
2497 if (!GV) {
2498 // Create a new global variable.
2499 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2500 /*Constant=*/true,
2501 llvm::GlobalValue::ExternalLinkage, nullptr,
2502 Name);
2503 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2504 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2505 if (RD->hasAttr<DLLImportAttr>())
2506 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
2507 }
2508 }
2509
2510 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2511 }
2512
2513 /// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2514 /// info for that type is defined in the standard library.
TypeInfoIsInStandardLibrary(const BuiltinType * Ty)2515 static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2516 // Itanium C++ ABI 2.9.2:
2517 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2518 // the run-time support library. Specifically, the run-time support
2519 // library should contain type_info objects for the types X, X* and
2520 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2521 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2522 // long, unsigned long, long long, unsigned long long, float, double,
2523 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2524 // half-precision floating point types.
2525 //
2526 // GCC also emits RTTI for __int128.
2527 // FIXME: We do not emit RTTI information for decimal types here.
2528
2529 // Types added here must also be added to EmitFundamentalRTTIDescriptors.
2530 switch (Ty->getKind()) {
2531 case BuiltinType::Void:
2532 case BuiltinType::NullPtr:
2533 case BuiltinType::Bool:
2534 case BuiltinType::WChar_S:
2535 case BuiltinType::WChar_U:
2536 case BuiltinType::Char_U:
2537 case BuiltinType::Char_S:
2538 case BuiltinType::UChar:
2539 case BuiltinType::SChar:
2540 case BuiltinType::Short:
2541 case BuiltinType::UShort:
2542 case BuiltinType::Int:
2543 case BuiltinType::UInt:
2544 case BuiltinType::Long:
2545 case BuiltinType::ULong:
2546 case BuiltinType::LongLong:
2547 case BuiltinType::ULongLong:
2548 case BuiltinType::Half:
2549 case BuiltinType::Float:
2550 case BuiltinType::Double:
2551 case BuiltinType::LongDouble:
2552 case BuiltinType::Float128:
2553 case BuiltinType::Char16:
2554 case BuiltinType::Char32:
2555 case BuiltinType::Int128:
2556 case BuiltinType::UInt128:
2557 return true;
2558
2559 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2560 case BuiltinType::Id:
2561 #include "clang/Basic/OpenCLImageTypes.def"
2562 case BuiltinType::OCLSampler:
2563 case BuiltinType::OCLEvent:
2564 case BuiltinType::OCLClkEvent:
2565 case BuiltinType::OCLQueue:
2566 case BuiltinType::OCLNDRange:
2567 case BuiltinType::OCLReserveID:
2568 return false;
2569
2570 case BuiltinType::Dependent:
2571 #define BUILTIN_TYPE(Id, SingletonId)
2572 #define PLACEHOLDER_TYPE(Id, SingletonId) \
2573 case BuiltinType::Id:
2574 #include "clang/AST/BuiltinTypes.def"
2575 llvm_unreachable("asking for RRTI for a placeholder type!");
2576
2577 case BuiltinType::ObjCId:
2578 case BuiltinType::ObjCClass:
2579 case BuiltinType::ObjCSel:
2580 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2581 }
2582
2583 llvm_unreachable("Invalid BuiltinType Kind!");
2584 }
2585
TypeInfoIsInStandardLibrary(const PointerType * PointerTy)2586 static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2587 QualType PointeeTy = PointerTy->getPointeeType();
2588 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2589 if (!BuiltinTy)
2590 return false;
2591
2592 // Check the qualifiers.
2593 Qualifiers Quals = PointeeTy.getQualifiers();
2594 Quals.removeConst();
2595
2596 if (!Quals.empty())
2597 return false;
2598
2599 return TypeInfoIsInStandardLibrary(BuiltinTy);
2600 }
2601
2602 /// IsStandardLibraryRTTIDescriptor - Returns whether the type
2603 /// information for the given type exists in the standard library.
IsStandardLibraryRTTIDescriptor(QualType Ty)2604 static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2605 // Type info for builtin types is defined in the standard library.
2606 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2607 return TypeInfoIsInStandardLibrary(BuiltinTy);
2608
2609 // Type info for some pointer types to builtin types is defined in the
2610 // standard library.
2611 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2612 return TypeInfoIsInStandardLibrary(PointerTy);
2613
2614 return false;
2615 }
2616
2617 /// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2618 /// the given type exists somewhere else, and that we should not emit the type
2619 /// information in this translation unit. Assumes that it is not a
2620 /// standard-library type.
ShouldUseExternalRTTIDescriptor(CodeGenModule & CGM,QualType Ty)2621 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2622 QualType Ty) {
2623 ASTContext &Context = CGM.getContext();
2624
2625 // If RTTI is disabled, assume it might be disabled in the
2626 // translation unit that defines any potential key function, too.
2627 if (!Context.getLangOpts().RTTI) return false;
2628
2629 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2630 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2631 if (!RD->hasDefinition())
2632 return false;
2633
2634 if (!RD->isDynamicClass())
2635 return false;
2636
2637 // FIXME: this may need to be reconsidered if the key function
2638 // changes.
2639 // N.B. We must always emit the RTTI data ourselves if there exists a key
2640 // function.
2641 bool IsDLLImport = RD->hasAttr<DLLImportAttr>();
2642 if (CGM.getVTables().isVTableExternal(RD))
2643 return IsDLLImport ? false : true;
2644
2645 if (IsDLLImport)
2646 return true;
2647 }
2648
2649 return false;
2650 }
2651
2652 /// IsIncompleteClassType - Returns whether the given record type is incomplete.
IsIncompleteClassType(const RecordType * RecordTy)2653 static bool IsIncompleteClassType(const RecordType *RecordTy) {
2654 return !RecordTy->getDecl()->isCompleteDefinition();
2655 }
2656
2657 /// ContainsIncompleteClassType - Returns whether the given type contains an
2658 /// incomplete class type. This is true if
2659 ///
2660 /// * The given type is an incomplete class type.
2661 /// * The given type is a pointer type whose pointee type contains an
2662 /// incomplete class type.
2663 /// * The given type is a member pointer type whose class is an incomplete
2664 /// class type.
2665 /// * The given type is a member pointer type whoise pointee type contains an
2666 /// incomplete class type.
2667 /// is an indirect or direct pointer to an incomplete class type.
ContainsIncompleteClassType(QualType Ty)2668 static bool ContainsIncompleteClassType(QualType Ty) {
2669 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2670 if (IsIncompleteClassType(RecordTy))
2671 return true;
2672 }
2673
2674 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2675 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2676
2677 if (const MemberPointerType *MemberPointerTy =
2678 dyn_cast<MemberPointerType>(Ty)) {
2679 // Check if the class type is incomplete.
2680 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2681 if (IsIncompleteClassType(ClassType))
2682 return true;
2683
2684 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2685 }
2686
2687 return false;
2688 }
2689
2690 // CanUseSingleInheritance - Return whether the given record decl has a "single,
2691 // public, non-virtual base at offset zero (i.e. the derived class is dynamic
2692 // iff the base is)", according to Itanium C++ ABI, 2.95p6b.
CanUseSingleInheritance(const CXXRecordDecl * RD)2693 static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2694 // Check the number of bases.
2695 if (RD->getNumBases() != 1)
2696 return false;
2697
2698 // Get the base.
2699 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2700
2701 // Check that the base is not virtual.
2702 if (Base->isVirtual())
2703 return false;
2704
2705 // Check that the base is public.
2706 if (Base->getAccessSpecifier() != AS_public)
2707 return false;
2708
2709 // Check that the class is dynamic iff the base is.
2710 const CXXRecordDecl *BaseDecl =
2711 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2712 if (!BaseDecl->isEmpty() &&
2713 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2714 return false;
2715
2716 return true;
2717 }
2718
BuildVTablePointer(const Type * Ty)2719 void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2720 // abi::__class_type_info.
2721 static const char * const ClassTypeInfo =
2722 "_ZTVN10__cxxabiv117__class_type_infoE";
2723 // abi::__si_class_type_info.
2724 static const char * const SIClassTypeInfo =
2725 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2726 // abi::__vmi_class_type_info.
2727 static const char * const VMIClassTypeInfo =
2728 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2729
2730 const char *VTableName = nullptr;
2731
2732 switch (Ty->getTypeClass()) {
2733 #define TYPE(Class, Base)
2734 #define ABSTRACT_TYPE(Class, Base)
2735 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2736 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2737 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2738 #include "clang/AST/TypeNodes.def"
2739 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2740
2741 case Type::LValueReference:
2742 case Type::RValueReference:
2743 llvm_unreachable("References shouldn't get here");
2744
2745 case Type::Auto:
2746 llvm_unreachable("Undeduced auto type shouldn't get here");
2747
2748 case Type::Pipe:
2749 llvm_unreachable("Pipe types shouldn't get here");
2750
2751 case Type::Builtin:
2752 // GCC treats vector and complex types as fundamental types.
2753 case Type::Vector:
2754 case Type::ExtVector:
2755 case Type::Complex:
2756 case Type::Atomic:
2757 // FIXME: GCC treats block pointers as fundamental types?!
2758 case Type::BlockPointer:
2759 // abi::__fundamental_type_info.
2760 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2761 break;
2762
2763 case Type::ConstantArray:
2764 case Type::IncompleteArray:
2765 case Type::VariableArray:
2766 // abi::__array_type_info.
2767 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2768 break;
2769
2770 case Type::FunctionNoProto:
2771 case Type::FunctionProto:
2772 // abi::__function_type_info.
2773 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2774 break;
2775
2776 case Type::Enum:
2777 // abi::__enum_type_info.
2778 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2779 break;
2780
2781 case Type::Record: {
2782 const CXXRecordDecl *RD =
2783 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2784
2785 if (!RD->hasDefinition() || !RD->getNumBases()) {
2786 VTableName = ClassTypeInfo;
2787 } else if (CanUseSingleInheritance(RD)) {
2788 VTableName = SIClassTypeInfo;
2789 } else {
2790 VTableName = VMIClassTypeInfo;
2791 }
2792
2793 break;
2794 }
2795
2796 case Type::ObjCObject:
2797 // Ignore protocol qualifiers.
2798 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2799
2800 // Handle id and Class.
2801 if (isa<BuiltinType>(Ty)) {
2802 VTableName = ClassTypeInfo;
2803 break;
2804 }
2805
2806 assert(isa<ObjCInterfaceType>(Ty));
2807 // Fall through.
2808
2809 case Type::ObjCInterface:
2810 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2811 VTableName = SIClassTypeInfo;
2812 } else {
2813 VTableName = ClassTypeInfo;
2814 }
2815 break;
2816
2817 case Type::ObjCObjectPointer:
2818 case Type::Pointer:
2819 // abi::__pointer_type_info.
2820 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2821 break;
2822
2823 case Type::MemberPointer:
2824 // abi::__pointer_to_member_type_info.
2825 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2826 break;
2827 }
2828
2829 llvm::Constant *VTable =
2830 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2831
2832 llvm::Type *PtrDiffTy =
2833 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2834
2835 // The vtable address point is 2.
2836 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
2837 VTable =
2838 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two);
2839 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2840
2841 Fields.push_back(VTable);
2842 }
2843
2844 /// \brief Return the linkage that the type info and type info name constants
2845 /// should have for the given type.
getTypeInfoLinkage(CodeGenModule & CGM,QualType Ty)2846 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2847 QualType Ty) {
2848 // Itanium C++ ABI 2.9.5p7:
2849 // In addition, it and all of the intermediate abi::__pointer_type_info
2850 // structs in the chain down to the abi::__class_type_info for the
2851 // incomplete class type must be prevented from resolving to the
2852 // corresponding type_info structs for the complete class type, possibly
2853 // by making them local static objects. Finally, a dummy class RTTI is
2854 // generated for the incomplete type that will not resolve to the final
2855 // complete class RTTI (because the latter need not exist), possibly by
2856 // making it a local static object.
2857 if (ContainsIncompleteClassType(Ty))
2858 return llvm::GlobalValue::InternalLinkage;
2859
2860 switch (Ty->getLinkage()) {
2861 case NoLinkage:
2862 case InternalLinkage:
2863 case UniqueExternalLinkage:
2864 return llvm::GlobalValue::InternalLinkage;
2865
2866 case VisibleNoLinkage:
2867 case ExternalLinkage:
2868 if (!CGM.getLangOpts().RTTI) {
2869 // RTTI is not enabled, which means that this type info struct is going
2870 // to be used for exception handling. Give it linkonce_odr linkage.
2871 return llvm::GlobalValue::LinkOnceODRLinkage;
2872 }
2873
2874 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2875 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2876 if (RD->hasAttr<WeakAttr>())
2877 return llvm::GlobalValue::WeakODRLinkage;
2878 if (RD->isDynamicClass()) {
2879 llvm::GlobalValue::LinkageTypes LT = CGM.getVTableLinkage(RD);
2880 // MinGW won't export the RTTI information when there is a key function.
2881 // Make sure we emit our own copy instead of attempting to dllimport it.
2882 if (RD->hasAttr<DLLImportAttr>() &&
2883 llvm::GlobalValue::isAvailableExternallyLinkage(LT))
2884 LT = llvm::GlobalValue::LinkOnceODRLinkage;
2885 return LT;
2886 }
2887 }
2888
2889 return llvm::GlobalValue::LinkOnceODRLinkage;
2890 }
2891
2892 llvm_unreachable("Invalid linkage!");
2893 }
2894
BuildTypeInfo(QualType Ty,bool Force)2895 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2896 // We want to operate on the canonical type.
2897 Ty = Ty.getCanonicalType();
2898
2899 // Check if we've already emitted an RTTI descriptor for this type.
2900 SmallString<256> Name;
2901 llvm::raw_svector_ostream Out(Name);
2902 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2903
2904 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2905 if (OldGV && !OldGV->isDeclaration()) {
2906 assert(!OldGV->hasAvailableExternallyLinkage() &&
2907 "available_externally typeinfos not yet implemented");
2908
2909 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2910 }
2911
2912 // Check if there is already an external RTTI descriptor for this type.
2913 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2914 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2915 return GetAddrOfExternalRTTIDescriptor(Ty);
2916
2917 // Emit the standard library with external linkage.
2918 llvm::GlobalVariable::LinkageTypes Linkage;
2919 if (IsStdLib)
2920 Linkage = llvm::GlobalValue::ExternalLinkage;
2921 else
2922 Linkage = getTypeInfoLinkage(CGM, Ty);
2923
2924 // Add the vtable pointer.
2925 BuildVTablePointer(cast<Type>(Ty));
2926
2927 // And the name.
2928 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2929 llvm::Constant *TypeNameField;
2930
2931 // If we're supposed to demote the visibility, be sure to set a flag
2932 // to use a string comparison for type_info comparisons.
2933 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2934 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2935 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2936 // The flag is the sign bit, which on ARM64 is defined to be clear
2937 // for global pointers. This is very ARM64-specific.
2938 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2939 llvm::Constant *flag =
2940 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2941 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2942 TypeNameField =
2943 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2944 } else {
2945 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2946 }
2947 Fields.push_back(TypeNameField);
2948
2949 switch (Ty->getTypeClass()) {
2950 #define TYPE(Class, Base)
2951 #define ABSTRACT_TYPE(Class, Base)
2952 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2953 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2954 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2955 #include "clang/AST/TypeNodes.def"
2956 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2957
2958 // GCC treats vector types as fundamental types.
2959 case Type::Builtin:
2960 case Type::Vector:
2961 case Type::ExtVector:
2962 case Type::Complex:
2963 case Type::BlockPointer:
2964 // Itanium C++ ABI 2.9.5p4:
2965 // abi::__fundamental_type_info adds no data members to std::type_info.
2966 break;
2967
2968 case Type::LValueReference:
2969 case Type::RValueReference:
2970 llvm_unreachable("References shouldn't get here");
2971
2972 case Type::Auto:
2973 llvm_unreachable("Undeduced auto type shouldn't get here");
2974
2975 case Type::Pipe:
2976 llvm_unreachable("Pipe type shouldn't get here");
2977
2978 case Type::ConstantArray:
2979 case Type::IncompleteArray:
2980 case Type::VariableArray:
2981 // Itanium C++ ABI 2.9.5p5:
2982 // abi::__array_type_info adds no data members to std::type_info.
2983 break;
2984
2985 case Type::FunctionNoProto:
2986 case Type::FunctionProto:
2987 // Itanium C++ ABI 2.9.5p5:
2988 // abi::__function_type_info adds no data members to std::type_info.
2989 break;
2990
2991 case Type::Enum:
2992 // Itanium C++ ABI 2.9.5p5:
2993 // abi::__enum_type_info adds no data members to std::type_info.
2994 break;
2995
2996 case Type::Record: {
2997 const CXXRecordDecl *RD =
2998 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2999 if (!RD->hasDefinition() || !RD->getNumBases()) {
3000 // We don't need to emit any fields.
3001 break;
3002 }
3003
3004 if (CanUseSingleInheritance(RD))
3005 BuildSIClassTypeInfo(RD);
3006 else
3007 BuildVMIClassTypeInfo(RD);
3008
3009 break;
3010 }
3011
3012 case Type::ObjCObject:
3013 case Type::ObjCInterface:
3014 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
3015 break;
3016
3017 case Type::ObjCObjectPointer:
3018 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
3019 break;
3020
3021 case Type::Pointer:
3022 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
3023 break;
3024
3025 case Type::MemberPointer:
3026 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
3027 break;
3028
3029 case Type::Atomic:
3030 // No fields, at least for the moment.
3031 break;
3032 }
3033
3034 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
3035
3036 llvm::Module &M = CGM.getModule();
3037 llvm::GlobalVariable *GV =
3038 new llvm::GlobalVariable(M, Init->getType(),
3039 /*Constant=*/true, Linkage, Init, Name);
3040
3041 // If there's already an old global variable, replace it with the new one.
3042 if (OldGV) {
3043 GV->takeName(OldGV);
3044 llvm::Constant *NewPtr =
3045 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
3046 OldGV->replaceAllUsesWith(NewPtr);
3047 OldGV->eraseFromParent();
3048 }
3049
3050 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
3051 GV->setComdat(M.getOrInsertComdat(GV->getName()));
3052
3053 // The Itanium ABI specifies that type_info objects must be globally
3054 // unique, with one exception: if the type is an incomplete class
3055 // type or a (possibly indirect) pointer to one. That exception
3056 // affects the general case of comparing type_info objects produced
3057 // by the typeid operator, which is why the comparison operators on
3058 // std::type_info generally use the type_info name pointers instead
3059 // of the object addresses. However, the language's built-in uses
3060 // of RTTI generally require class types to be complete, even when
3061 // manipulating pointers to those class types. This allows the
3062 // implementation of dynamic_cast to rely on address equality tests,
3063 // which is much faster.
3064
3065 // All of this is to say that it's important that both the type_info
3066 // object and the type_info name be uniqued when weakly emitted.
3067
3068 // Give the type_info object and name the formal visibility of the
3069 // type itself.
3070 llvm::GlobalValue::VisibilityTypes llvmVisibility;
3071 if (llvm::GlobalValue::isLocalLinkage(Linkage))
3072 // If the linkage is local, only default visibility makes sense.
3073 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
3074 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
3075 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
3076 else
3077 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
3078 TypeName->setVisibility(llvmVisibility);
3079 GV->setVisibility(llvmVisibility);
3080
3081 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3082 }
3083
3084 /// ComputeQualifierFlags - Compute the pointer type info flags from the
3085 /// given qualifier.
ComputeQualifierFlags(Qualifiers Quals)3086 static unsigned ComputeQualifierFlags(Qualifiers Quals) {
3087 unsigned Flags = 0;
3088
3089 if (Quals.hasConst())
3090 Flags |= ItaniumRTTIBuilder::PTI_Const;
3091 if (Quals.hasVolatile())
3092 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
3093 if (Quals.hasRestrict())
3094 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
3095
3096 return Flags;
3097 }
3098
3099 /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
3100 /// for the given Objective-C object type.
BuildObjCObjectTypeInfo(const ObjCObjectType * OT)3101 void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
3102 // Drop qualifiers.
3103 const Type *T = OT->getBaseType().getTypePtr();
3104 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
3105
3106 // The builtin types are abi::__class_type_infos and don't require
3107 // extra fields.
3108 if (isa<BuiltinType>(T)) return;
3109
3110 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
3111 ObjCInterfaceDecl *Super = Class->getSuperClass();
3112
3113 // Root classes are also __class_type_info.
3114 if (!Super) return;
3115
3116 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
3117
3118 // Everything else is single inheritance.
3119 llvm::Constant *BaseTypeInfo =
3120 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
3121 Fields.push_back(BaseTypeInfo);
3122 }
3123
3124 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3125 /// inheritance, according to the Itanium C++ ABI, 2.95p6b.
BuildSIClassTypeInfo(const CXXRecordDecl * RD)3126 void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
3127 // Itanium C++ ABI 2.9.5p6b:
3128 // It adds to abi::__class_type_info a single member pointing to the
3129 // type_info structure for the base type,
3130 llvm::Constant *BaseTypeInfo =
3131 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
3132 Fields.push_back(BaseTypeInfo);
3133 }
3134
3135 namespace {
3136 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
3137 /// a class hierarchy.
3138 struct SeenBases {
3139 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
3140 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
3141 };
3142 }
3143
3144 /// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
3145 /// abi::__vmi_class_type_info.
3146 ///
ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier * Base,SeenBases & Bases)3147 static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
3148 SeenBases &Bases) {
3149
3150 unsigned Flags = 0;
3151
3152 const CXXRecordDecl *BaseDecl =
3153 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
3154
3155 if (Base->isVirtual()) {
3156 // Mark the virtual base as seen.
3157 if (!Bases.VirtualBases.insert(BaseDecl).second) {
3158 // If this virtual base has been seen before, then the class is diamond
3159 // shaped.
3160 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
3161 } else {
3162 if (Bases.NonVirtualBases.count(BaseDecl))
3163 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3164 }
3165 } else {
3166 // Mark the non-virtual base as seen.
3167 if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
3168 // If this non-virtual base has been seen before, then the class has non-
3169 // diamond shaped repeated inheritance.
3170 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3171 } else {
3172 if (Bases.VirtualBases.count(BaseDecl))
3173 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3174 }
3175 }
3176
3177 // Walk all bases.
3178 for (const auto &I : BaseDecl->bases())
3179 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3180
3181 return Flags;
3182 }
3183
ComputeVMIClassTypeInfoFlags(const CXXRecordDecl * RD)3184 static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
3185 unsigned Flags = 0;
3186 SeenBases Bases;
3187
3188 // Walk all bases.
3189 for (const auto &I : RD->bases())
3190 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3191
3192 return Flags;
3193 }
3194
3195 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
3196 /// classes with bases that do not satisfy the abi::__si_class_type_info
3197 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
BuildVMIClassTypeInfo(const CXXRecordDecl * RD)3198 void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
3199 llvm::Type *UnsignedIntLTy =
3200 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3201
3202 // Itanium C++ ABI 2.9.5p6c:
3203 // __flags is a word with flags describing details about the class
3204 // structure, which may be referenced by using the __flags_masks
3205 // enumeration. These flags refer to both direct and indirect bases.
3206 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
3207 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3208
3209 // Itanium C++ ABI 2.9.5p6c:
3210 // __base_count is a word with the number of direct proper base class
3211 // descriptions that follow.
3212 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
3213
3214 if (!RD->getNumBases())
3215 return;
3216
3217 llvm::Type *LongLTy =
3218 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
3219
3220 // Now add the base class descriptions.
3221
3222 // Itanium C++ ABI 2.9.5p6c:
3223 // __base_info[] is an array of base class descriptions -- one for every
3224 // direct proper base. Each description is of the type:
3225 //
3226 // struct abi::__base_class_type_info {
3227 // public:
3228 // const __class_type_info *__base_type;
3229 // long __offset_flags;
3230 //
3231 // enum __offset_flags_masks {
3232 // __virtual_mask = 0x1,
3233 // __public_mask = 0x2,
3234 // __offset_shift = 8
3235 // };
3236 // };
3237 for (const auto &Base : RD->bases()) {
3238 // The __base_type member points to the RTTI for the base type.
3239 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
3240
3241 const CXXRecordDecl *BaseDecl =
3242 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
3243
3244 int64_t OffsetFlags = 0;
3245
3246 // All but the lower 8 bits of __offset_flags are a signed offset.
3247 // For a non-virtual base, this is the offset in the object of the base
3248 // subobject. For a virtual base, this is the offset in the virtual table of
3249 // the virtual base offset for the virtual base referenced (negative).
3250 CharUnits Offset;
3251 if (Base.isVirtual())
3252 Offset =
3253 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
3254 else {
3255 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
3256 Offset = Layout.getBaseClassOffset(BaseDecl);
3257 };
3258
3259 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
3260
3261 // The low-order byte of __offset_flags contains flags, as given by the
3262 // masks from the enumeration __offset_flags_masks.
3263 if (Base.isVirtual())
3264 OffsetFlags |= BCTI_Virtual;
3265 if (Base.getAccessSpecifier() == AS_public)
3266 OffsetFlags |= BCTI_Public;
3267
3268 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
3269 }
3270 }
3271
3272 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
3273 /// used for pointer types.
BuildPointerTypeInfo(QualType PointeeTy)3274 void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
3275 Qualifiers Quals;
3276 QualType UnqualifiedPointeeTy =
3277 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3278
3279 // Itanium C++ ABI 2.9.5p7:
3280 // __flags is a flag word describing the cv-qualification and other
3281 // attributes of the type pointed to
3282 unsigned Flags = ComputeQualifierFlags(Quals);
3283
3284 // Itanium C++ ABI 2.9.5p7:
3285 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3286 // incomplete class type, the incomplete target type flag is set.
3287 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3288 Flags |= PTI_Incomplete;
3289
3290 llvm::Type *UnsignedIntLTy =
3291 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3292 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3293
3294 // Itanium C++ ABI 2.9.5p7:
3295 // __pointee is a pointer to the std::type_info derivation for the
3296 // unqualified type being pointed to.
3297 llvm::Constant *PointeeTypeInfo =
3298 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3299 Fields.push_back(PointeeTypeInfo);
3300 }
3301
3302 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
3303 /// struct, used for member pointer types.
3304 void
BuildPointerToMemberTypeInfo(const MemberPointerType * Ty)3305 ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
3306 QualType PointeeTy = Ty->getPointeeType();
3307
3308 Qualifiers Quals;
3309 QualType UnqualifiedPointeeTy =
3310 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
3311
3312 // Itanium C++ ABI 2.9.5p7:
3313 // __flags is a flag word describing the cv-qualification and other
3314 // attributes of the type pointed to.
3315 unsigned Flags = ComputeQualifierFlags(Quals);
3316
3317 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
3318
3319 // Itanium C++ ABI 2.9.5p7:
3320 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
3321 // incomplete class type, the incomplete target type flag is set.
3322 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
3323 Flags |= PTI_Incomplete;
3324
3325 if (IsIncompleteClassType(ClassType))
3326 Flags |= PTI_ContainingClassIncomplete;
3327
3328 llvm::Type *UnsignedIntLTy =
3329 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
3330 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
3331
3332 // Itanium C++ ABI 2.9.5p7:
3333 // __pointee is a pointer to the std::type_info derivation for the
3334 // unqualified type being pointed to.
3335 llvm::Constant *PointeeTypeInfo =
3336 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
3337 Fields.push_back(PointeeTypeInfo);
3338
3339 // Itanium C++ ABI 2.9.5p9:
3340 // __context is a pointer to an abi::__class_type_info corresponding to the
3341 // class type containing the member pointed to
3342 // (e.g., the "A" in "int A::*").
3343 Fields.push_back(
3344 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
3345 }
3346
getAddrOfRTTIDescriptor(QualType Ty)3347 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
3348 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
3349 }
3350
EmitFundamentalRTTIDescriptor(QualType Type)3351 void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
3352 QualType PointerType = getContext().getPointerType(Type);
3353 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
3354 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
3355 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
3356 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
3357 }
3358
EmitFundamentalRTTIDescriptors()3359 void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
3360 // Types added here must also be added to TypeInfoIsInStandardLibrary.
3361 QualType FundamentalTypes[] = {
3362 getContext().VoidTy, getContext().NullPtrTy,
3363 getContext().BoolTy, getContext().WCharTy,
3364 getContext().CharTy, getContext().UnsignedCharTy,
3365 getContext().SignedCharTy, getContext().ShortTy,
3366 getContext().UnsignedShortTy, getContext().IntTy,
3367 getContext().UnsignedIntTy, getContext().LongTy,
3368 getContext().UnsignedLongTy, getContext().LongLongTy,
3369 getContext().UnsignedLongLongTy, getContext().Int128Ty,
3370 getContext().UnsignedInt128Ty, getContext().HalfTy,
3371 getContext().FloatTy, getContext().DoubleTy,
3372 getContext().LongDoubleTy, getContext().Float128Ty,
3373 getContext().Char16Ty, getContext().Char32Ty
3374 };
3375 for (const QualType &FundamentalType : FundamentalTypes)
3376 EmitFundamentalRTTIDescriptor(FundamentalType);
3377 }
3378
3379 /// What sort of uniqueness rules should we use for the RTTI for the
3380 /// given type?
classifyRTTIUniqueness(QualType CanTy,llvm::GlobalValue::LinkageTypes Linkage) const3381 ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
3382 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
3383 if (shouldRTTIBeUnique())
3384 return RUK_Unique;
3385
3386 // It's only necessary for linkonce_odr or weak_odr linkage.
3387 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
3388 Linkage != llvm::GlobalValue::WeakODRLinkage)
3389 return RUK_Unique;
3390
3391 // It's only necessary with default visibility.
3392 if (CanTy->getVisibility() != DefaultVisibility)
3393 return RUK_Unique;
3394
3395 // If we're not required to publish this symbol, hide it.
3396 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3397 return RUK_NonUniqueHidden;
3398
3399 // If we're required to publish this symbol, as we might be under an
3400 // explicit instantiation, leave it with default visibility but
3401 // enable string-comparisons.
3402 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
3403 return RUK_NonUniqueVisible;
3404 }
3405
3406 // Find out how to codegen the complete destructor and constructor
3407 namespace {
3408 enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
3409 }
getCodegenToUse(CodeGenModule & CGM,const CXXMethodDecl * MD)3410 static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
3411 const CXXMethodDecl *MD) {
3412 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
3413 return StructorCodegen::Emit;
3414
3415 // The complete and base structors are not equivalent if there are any virtual
3416 // bases, so emit separate functions.
3417 if (MD->getParent()->getNumVBases())
3418 return StructorCodegen::Emit;
3419
3420 GlobalDecl AliasDecl;
3421 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
3422 AliasDecl = GlobalDecl(DD, Dtor_Complete);
3423 } else {
3424 const auto *CD = cast<CXXConstructorDecl>(MD);
3425 AliasDecl = GlobalDecl(CD, Ctor_Complete);
3426 }
3427 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3428
3429 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
3430 return StructorCodegen::RAUW;
3431
3432 // FIXME: Should we allow available_externally aliases?
3433 if (!llvm::GlobalAlias::isValidLinkage(Linkage))
3434 return StructorCodegen::RAUW;
3435
3436 if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
3437 // Only ELF supports COMDATs with arbitrary names (C5/D5).
3438 if (CGM.getTarget().getTriple().isOSBinFormatELF())
3439 return StructorCodegen::COMDAT;
3440 return StructorCodegen::Emit;
3441 }
3442
3443 return StructorCodegen::Alias;
3444 }
3445
emitConstructorDestructorAlias(CodeGenModule & CGM,GlobalDecl AliasDecl,GlobalDecl TargetDecl)3446 static void emitConstructorDestructorAlias(CodeGenModule &CGM,
3447 GlobalDecl AliasDecl,
3448 GlobalDecl TargetDecl) {
3449 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
3450
3451 StringRef MangledName = CGM.getMangledName(AliasDecl);
3452 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
3453 if (Entry && !Entry->isDeclaration())
3454 return;
3455
3456 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
3457
3458 // Create the alias with no name.
3459 auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee);
3460
3461 // Switch any previous uses to the alias.
3462 if (Entry) {
3463 assert(Entry->getType() == Aliasee->getType() &&
3464 "declaration exists with different type");
3465 Alias->takeName(Entry);
3466 Entry->replaceAllUsesWith(Alias);
3467 Entry->eraseFromParent();
3468 } else {
3469 Alias->setName(MangledName);
3470 }
3471
3472 // Finally, set up the alias with its proper name and attributes.
3473 CGM.setAliasAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias);
3474 }
3475
emitCXXStructor(const CXXMethodDecl * MD,StructorType Type)3476 void ItaniumCXXABI::emitCXXStructor(const CXXMethodDecl *MD,
3477 StructorType Type) {
3478 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
3479 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
3480
3481 StructorCodegen CGType = getCodegenToUse(CGM, MD);
3482
3483 if (Type == StructorType::Complete) {
3484 GlobalDecl CompleteDecl;
3485 GlobalDecl BaseDecl;
3486 if (CD) {
3487 CompleteDecl = GlobalDecl(CD, Ctor_Complete);
3488 BaseDecl = GlobalDecl(CD, Ctor_Base);
3489 } else {
3490 CompleteDecl = GlobalDecl(DD, Dtor_Complete);
3491 BaseDecl = GlobalDecl(DD, Dtor_Base);
3492 }
3493
3494 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
3495 emitConstructorDestructorAlias(CGM, CompleteDecl, BaseDecl);
3496 return;
3497 }
3498
3499 if (CGType == StructorCodegen::RAUW) {
3500 StringRef MangledName = CGM.getMangledName(CompleteDecl);
3501 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl);
3502 CGM.addReplacement(MangledName, Aliasee);
3503 return;
3504 }
3505 }
3506
3507 // The base destructor is equivalent to the base destructor of its
3508 // base class if there is exactly one non-virtual base class with a
3509 // non-trivial destructor, there are no fields with a non-trivial
3510 // destructor, and the body of the destructor is trivial.
3511 if (DD && Type == StructorType::Base && CGType != StructorCodegen::COMDAT &&
3512 !CGM.TryEmitBaseDestructorAsAlias(DD))
3513 return;
3514
3515 llvm::Function *Fn = CGM.codegenCXXStructor(MD, Type);
3516
3517 if (CGType == StructorCodegen::COMDAT) {
3518 SmallString<256> Buffer;
3519 llvm::raw_svector_ostream Out(Buffer);
3520 if (DD)
3521 getMangleContext().mangleCXXDtorComdat(DD, Out);
3522 else
3523 getMangleContext().mangleCXXCtorComdat(CD, Out);
3524 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
3525 Fn->setComdat(C);
3526 } else {
3527 CGM.maybeSetTrivialComdat(*MD, *Fn);
3528 }
3529 }
3530
getBeginCatchFn(CodeGenModule & CGM)3531 static llvm::Constant *getBeginCatchFn(CodeGenModule &CGM) {
3532 // void *__cxa_begin_catch(void*);
3533 llvm::FunctionType *FTy = llvm::FunctionType::get(
3534 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3535
3536 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
3537 }
3538
getEndCatchFn(CodeGenModule & CGM)3539 static llvm::Constant *getEndCatchFn(CodeGenModule &CGM) {
3540 // void __cxa_end_catch();
3541 llvm::FunctionType *FTy =
3542 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
3543
3544 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
3545 }
3546
getGetExceptionPtrFn(CodeGenModule & CGM)3547 static llvm::Constant *getGetExceptionPtrFn(CodeGenModule &CGM) {
3548 // void *__cxa_get_exception_ptr(void*);
3549 llvm::FunctionType *FTy = llvm::FunctionType::get(
3550 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3551
3552 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
3553 }
3554
3555 namespace {
3556 /// A cleanup to call __cxa_end_catch. In many cases, the caught
3557 /// exception type lets us state definitively that the thrown exception
3558 /// type does not have a destructor. In particular:
3559 /// - Catch-alls tell us nothing, so we have to conservatively
3560 /// assume that the thrown exception might have a destructor.
3561 /// - Catches by reference behave according to their base types.
3562 /// - Catches of non-record types will only trigger for exceptions
3563 /// of non-record types, which never have destructors.
3564 /// - Catches of record types can trigger for arbitrary subclasses
3565 /// of the caught type, so we have to assume the actual thrown
3566 /// exception type might have a throwing destructor, even if the
3567 /// caught type's destructor is trivial or nothrow.
3568 struct CallEndCatch final : EHScopeStack::Cleanup {
CallEndCatch__anon2a20dafb0911::CallEndCatch3569 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
3570 bool MightThrow;
3571
Emit__anon2a20dafb0911::CallEndCatch3572 void Emit(CodeGenFunction &CGF, Flags flags) override {
3573 if (!MightThrow) {
3574 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
3575 return;
3576 }
3577
3578 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
3579 }
3580 };
3581 }
3582
3583 /// Emits a call to __cxa_begin_catch and enters a cleanup to call
3584 /// __cxa_end_catch.
3585 ///
3586 /// \param EndMightThrow - true if __cxa_end_catch might throw
CallBeginCatch(CodeGenFunction & CGF,llvm::Value * Exn,bool EndMightThrow)3587 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
3588 llvm::Value *Exn,
3589 bool EndMightThrow) {
3590 llvm::CallInst *call =
3591 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
3592
3593 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
3594
3595 return call;
3596 }
3597
3598 /// A "special initializer" callback for initializing a catch
3599 /// parameter during catch initialization.
InitCatchParam(CodeGenFunction & CGF,const VarDecl & CatchParam,Address ParamAddr,SourceLocation Loc)3600 static void InitCatchParam(CodeGenFunction &CGF,
3601 const VarDecl &CatchParam,
3602 Address ParamAddr,
3603 SourceLocation Loc) {
3604 // Load the exception from where the landing pad saved it.
3605 llvm::Value *Exn = CGF.getExceptionFromSlot();
3606
3607 CanQualType CatchType =
3608 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
3609 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
3610
3611 // If we're catching by reference, we can just cast the object
3612 // pointer to the appropriate pointer.
3613 if (isa<ReferenceType>(CatchType)) {
3614 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
3615 bool EndCatchMightThrow = CaughtType->isRecordType();
3616
3617 // __cxa_begin_catch returns the adjusted object pointer.
3618 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
3619
3620 // We have no way to tell the personality function that we're
3621 // catching by reference, so if we're catching a pointer,
3622 // __cxa_begin_catch will actually return that pointer by value.
3623 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
3624 QualType PointeeType = PT->getPointeeType();
3625
3626 // When catching by reference, generally we should just ignore
3627 // this by-value pointer and use the exception object instead.
3628 if (!PointeeType->isRecordType()) {
3629
3630 // Exn points to the struct _Unwind_Exception header, which
3631 // we have to skip past in order to reach the exception data.
3632 unsigned HeaderSize =
3633 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
3634 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize);
3635
3636 // However, if we're catching a pointer-to-record type that won't
3637 // work, because the personality function might have adjusted
3638 // the pointer. There's actually no way for us to fully satisfy
3639 // the language/ABI contract here: we can't use Exn because it
3640 // might have the wrong adjustment, but we can't use the by-value
3641 // pointer because it's off by a level of abstraction.
3642 //
3643 // The current solution is to dump the adjusted pointer into an
3644 // alloca, which breaks language semantics (because changing the
3645 // pointer doesn't change the exception) but at least works.
3646 // The better solution would be to filter out non-exact matches
3647 // and rethrow them, but this is tricky because the rethrow
3648 // really needs to be catchable by other sites at this landing
3649 // pad. The best solution is to fix the personality function.
3650 } else {
3651 // Pull the pointer for the reference type off.
3652 llvm::Type *PtrTy =
3653 cast<llvm::PointerType>(LLVMCatchTy)->getElementType();
3654
3655 // Create the temporary and write the adjusted pointer into it.
3656 Address ExnPtrTmp =
3657 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp");
3658 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3659 CGF.Builder.CreateStore(Casted, ExnPtrTmp);
3660
3661 // Bind the reference to the temporary.
3662 AdjustedExn = ExnPtrTmp.getPointer();
3663 }
3664 }
3665
3666 llvm::Value *ExnCast =
3667 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
3668 CGF.Builder.CreateStore(ExnCast, ParamAddr);
3669 return;
3670 }
3671
3672 // Scalars and complexes.
3673 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
3674 if (TEK != TEK_Aggregate) {
3675 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
3676
3677 // If the catch type is a pointer type, __cxa_begin_catch returns
3678 // the pointer by value.
3679 if (CatchType->hasPointerRepresentation()) {
3680 llvm::Value *CastExn =
3681 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
3682
3683 switch (CatchType.getQualifiers().getObjCLifetime()) {
3684 case Qualifiers::OCL_Strong:
3685 CastExn = CGF.EmitARCRetainNonBlock(CastExn);
3686 // fallthrough
3687
3688 case Qualifiers::OCL_None:
3689 case Qualifiers::OCL_ExplicitNone:
3690 case Qualifiers::OCL_Autoreleasing:
3691 CGF.Builder.CreateStore(CastExn, ParamAddr);
3692 return;
3693
3694 case Qualifiers::OCL_Weak:
3695 CGF.EmitARCInitWeak(ParamAddr, CastExn);
3696 return;
3697 }
3698 llvm_unreachable("bad ownership qualifier!");
3699 }
3700
3701 // Otherwise, it returns a pointer into the exception object.
3702
3703 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3704 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
3705
3706 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType);
3707 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType);
3708 switch (TEK) {
3709 case TEK_Complex:
3710 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
3711 /*init*/ true);
3712 return;
3713 case TEK_Scalar: {
3714 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
3715 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
3716 return;
3717 }
3718 case TEK_Aggregate:
3719 llvm_unreachable("evaluation kind filtered out!");
3720 }
3721 llvm_unreachable("bad evaluation kind");
3722 }
3723
3724 assert(isa<RecordType>(CatchType) && "unexpected catch type!");
3725 auto catchRD = CatchType->getAsCXXRecordDecl();
3726 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD);
3727
3728 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
3729
3730 // Check for a copy expression. If we don't have a copy expression,
3731 // that means a trivial copy is okay.
3732 const Expr *copyExpr = CatchParam.getInit();
3733 if (!copyExpr) {
3734 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
3735 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3736 caughtExnAlignment);
3737 CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType);
3738 return;
3739 }
3740
3741 // We have to call __cxa_get_exception_ptr to get the adjusted
3742 // pointer before copying.
3743 llvm::CallInst *rawAdjustedExn =
3744 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
3745
3746 // Cast that to the appropriate type.
3747 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
3748 caughtExnAlignment);
3749
3750 // The copy expression is defined in terms of an OpaqueValueExpr.
3751 // Find it and map it to the adjusted expression.
3752 CodeGenFunction::OpaqueValueMapping
3753 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
3754 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
3755
3756 // Call the copy ctor in a terminate scope.
3757 CGF.EHStack.pushTerminate();
3758
3759 // Perform the copy construction.
3760 CGF.EmitAggExpr(copyExpr,
3761 AggValueSlot::forAddr(ParamAddr, Qualifiers(),
3762 AggValueSlot::IsNotDestructed,
3763 AggValueSlot::DoesNotNeedGCBarriers,
3764 AggValueSlot::IsNotAliased));
3765
3766 // Leave the terminate scope.
3767 CGF.EHStack.popTerminate();
3768
3769 // Undo the opaque value mapping.
3770 opaque.pop();
3771
3772 // Finally we can call __cxa_begin_catch.
3773 CallBeginCatch(CGF, Exn, true);
3774 }
3775
3776 /// Begins a catch statement by initializing the catch variable and
3777 /// calling __cxa_begin_catch.
emitBeginCatch(CodeGenFunction & CGF,const CXXCatchStmt * S)3778 void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF,
3779 const CXXCatchStmt *S) {
3780 // We have to be very careful with the ordering of cleanups here:
3781 // C++ [except.throw]p4:
3782 // The destruction [of the exception temporary] occurs
3783 // immediately after the destruction of the object declared in
3784 // the exception-declaration in the handler.
3785 //
3786 // So the precise ordering is:
3787 // 1. Construct catch variable.
3788 // 2. __cxa_begin_catch
3789 // 3. Enter __cxa_end_catch cleanup
3790 // 4. Enter dtor cleanup
3791 //
3792 // We do this by using a slightly abnormal initialization process.
3793 // Delegation sequence:
3794 // - ExitCXXTryStmt opens a RunCleanupsScope
3795 // - EmitAutoVarAlloca creates the variable and debug info
3796 // - InitCatchParam initializes the variable from the exception
3797 // - CallBeginCatch calls __cxa_begin_catch
3798 // - CallBeginCatch enters the __cxa_end_catch cleanup
3799 // - EmitAutoVarCleanups enters the variable destructor cleanup
3800 // - EmitCXXTryStmt emits the code for the catch body
3801 // - EmitCXXTryStmt close the RunCleanupsScope
3802
3803 VarDecl *CatchParam = S->getExceptionDecl();
3804 if (!CatchParam) {
3805 llvm::Value *Exn = CGF.getExceptionFromSlot();
3806 CallBeginCatch(CGF, Exn, true);
3807 return;
3808 }
3809
3810 // Emit the local.
3811 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
3812 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart());
3813 CGF.EmitAutoVarCleanups(var);
3814 }
3815
3816 /// Get or define the following function:
3817 /// void @__clang_call_terminate(i8* %exn) nounwind noreturn
3818 /// This code is used only in C++.
getClangCallTerminateFn(CodeGenModule & CGM)3819 static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) {
3820 llvm::FunctionType *fnTy =
3821 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
3822 llvm::Constant *fnRef =
3823 CGM.CreateRuntimeFunction(fnTy, "__clang_call_terminate");
3824
3825 llvm::Function *fn = dyn_cast<llvm::Function>(fnRef);
3826 if (fn && fn->empty()) {
3827 fn->setDoesNotThrow();
3828 fn->setDoesNotReturn();
3829
3830 // What we really want is to massively penalize inlining without
3831 // forbidding it completely. The difference between that and
3832 // 'noinline' is negligible.
3833 fn->addFnAttr(llvm::Attribute::NoInline);
3834
3835 // Allow this function to be shared across translation units, but
3836 // we don't want it to turn into an exported symbol.
3837 fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
3838 fn->setVisibility(llvm::Function::HiddenVisibility);
3839 if (CGM.supportsCOMDAT())
3840 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
3841
3842 // Set up the function.
3843 llvm::BasicBlock *entry =
3844 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
3845 CGBuilderTy builder(CGM, entry);
3846
3847 // Pull the exception pointer out of the parameter list.
3848 llvm::Value *exn = &*fn->arg_begin();
3849
3850 // Call __cxa_begin_catch(exn).
3851 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
3852 catchCall->setDoesNotThrow();
3853 catchCall->setCallingConv(CGM.getRuntimeCC());
3854
3855 // Call std::terminate().
3856 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn());
3857 termCall->setDoesNotThrow();
3858 termCall->setDoesNotReturn();
3859 termCall->setCallingConv(CGM.getRuntimeCC());
3860
3861 // std::terminate cannot return.
3862 builder.CreateUnreachable();
3863 }
3864
3865 return fnRef;
3866 }
3867
3868 llvm::CallInst *
emitTerminateForUnexpectedException(CodeGenFunction & CGF,llvm::Value * Exn)3869 ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
3870 llvm::Value *Exn) {
3871 // In C++, we want to call __cxa_begin_catch() before terminating.
3872 if (Exn) {
3873 assert(CGF.CGM.getLangOpts().CPlusPlus);
3874 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn);
3875 }
3876 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
3877 }
3878