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 "CGRecordLayout.h"
23 #include "CGVTables.h"
24 #include "CodeGenFunction.h"
25 #include "CodeGenModule.h"
26 #include "clang/AST/Mangle.h"
27 #include "clang/AST/Type.h"
28 #include "llvm/IR/CallSite.h"
29 #include "llvm/IR/DataLayout.h"
30 #include "llvm/IR/Intrinsics.h"
31 #include "llvm/IR/Value.h"
32
33 using namespace clang;
34 using namespace CodeGen;
35
36 namespace {
37 class ItaniumCXXABI : public CodeGen::CGCXXABI {
38 /// VTables - All the vtables which have been defined.
39 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
40
41 protected:
42 bool UseARMMethodPtrABI;
43 bool UseARMGuardVarABI;
44
getMangleContext()45 ItaniumMangleContext &getMangleContext() {
46 return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext());
47 }
48
49 public:
ItaniumCXXABI(CodeGen::CodeGenModule & CGM,bool UseARMMethodPtrABI=false,bool UseARMGuardVarABI=false)50 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
51 bool UseARMMethodPtrABI = false,
52 bool UseARMGuardVarABI = false) :
53 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
54 UseARMGuardVarABI(UseARMGuardVarABI) { }
55
56 bool classifyReturnType(CGFunctionInfo &FI) const override;
57
getRecordArgABI(const CXXRecordDecl * RD) const58 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
59 // Structures with either a non-trivial destructor or a non-trivial
60 // copy constructor are always indirect.
61 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
62 // special members.
63 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor())
64 return RAA_Indirect;
65 return RAA_Default;
66 }
67
68 bool isZeroInitializable(const MemberPointerType *MPT) override;
69
70 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
71
72 llvm::Value *
73 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
74 const Expr *E,
75 llvm::Value *&This,
76 llvm::Value *MemFnPtr,
77 const MemberPointerType *MPT) override;
78
79 llvm::Value *
80 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
81 llvm::Value *Base,
82 llvm::Value *MemPtr,
83 const MemberPointerType *MPT) override;
84
85 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
86 const CastExpr *E,
87 llvm::Value *Src) override;
88 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
89 llvm::Constant *Src) override;
90
91 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
92
93 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override;
94 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
95 CharUnits offset) override;
96 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
97 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
98 CharUnits ThisAdjustment);
99
100 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
101 llvm::Value *L, llvm::Value *R,
102 const MemberPointerType *MPT,
103 bool Inequality) override;
104
105 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
106 llvm::Value *Addr,
107 const MemberPointerType *MPT) override;
108
109 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF, llvm::Value *ptr,
110 QualType type) override;
111
112 void EmitFundamentalRTTIDescriptor(QualType Type);
113 void EmitFundamentalRTTIDescriptors();
114 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
115
116 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
117 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
118 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
119 llvm::Value *ThisPtr,
120 llvm::Type *StdTypeInfoPtrTy) override;
121
122 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
123 QualType SrcRecordTy) override;
124
125 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
126 QualType SrcRecordTy, QualType DestTy,
127 QualType DestRecordTy,
128 llvm::BasicBlock *CastEnd) override;
129
130 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
131 QualType SrcRecordTy,
132 QualType DestTy) override;
133
134 bool EmitBadCastCall(CodeGenFunction &CGF) override;
135
136 llvm::Value *
137 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
138 const CXXRecordDecl *ClassDecl,
139 const CXXRecordDecl *BaseClassDecl) override;
140
141 void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
142 CXXCtorType T, CanQualType &ResTy,
143 SmallVectorImpl<CanQualType> &ArgTys) override;
144
145 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
146
147 void BuildDestructorSignature(const CXXDestructorDecl *Dtor,
148 CXXDtorType T, CanQualType &ResTy,
149 SmallVectorImpl<CanQualType> &ArgTys) override;
150
useThunkForDtorVariant(const CXXDestructorDecl * Dtor,CXXDtorType DT) const151 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
152 CXXDtorType DT) const override {
153 // Itanium does not emit any destructor variant as an inline thunk.
154 // Delegating may occur as an optimization, but all variants are either
155 // emitted with external linkage or as linkonce if they are inline and used.
156 return false;
157 }
158
159 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
160
161 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
162 FunctionArgList &Params) override;
163
164 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
165
166 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
167 const CXXConstructorDecl *D,
168 CXXCtorType Type, bool ForVirtualBase,
169 bool Delegating,
170 CallArgList &Args) override;
171
172 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
173 CXXDtorType Type, bool ForVirtualBase,
174 bool Delegating, llvm::Value *This) override;
175
176 void emitVTableDefinitions(CodeGenVTables &CGVT,
177 const CXXRecordDecl *RD) override;
178
179 llvm::Value *getVTableAddressPointInStructor(
180 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
181 BaseSubobject Base, const CXXRecordDecl *NearestVBase,
182 bool &NeedsVirtualOffset) override;
183
184 llvm::Constant *
185 getVTableAddressPointForConstExpr(BaseSubobject Base,
186 const CXXRecordDecl *VTableClass) override;
187
188 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
189 CharUnits VPtrOffset) override;
190
191 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
192 llvm::Value *This,
193 llvm::Type *Ty) override;
194
195 void EmitVirtualDestructorCall(CodeGenFunction &CGF,
196 const CXXDestructorDecl *Dtor,
197 CXXDtorType DtorType, SourceLocation CallLoc,
198 llvm::Value *This) override;
199
200 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
201
setThunkLinkage(llvm::Function * Thunk,bool ForVTable,GlobalDecl GD,bool ReturnAdjustment)202 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
203 bool ReturnAdjustment) override {
204 // Allow inlining of thunks by emitting them with available_externally
205 // linkage together with vtables when needed.
206 if (ForVTable)
207 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
208 }
209
210 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
211 const ThisAdjustment &TA) override;
212
213 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
214 const ReturnAdjustment &RA) override;
215
GetPureVirtualCallName()216 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
GetDeletedVirtualCallName()217 StringRef GetDeletedVirtualCallName() override
218 { return "__cxa_deleted_virtual"; }
219
220 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
221 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
222 llvm::Value *NewPtr,
223 llvm::Value *NumElements,
224 const CXXNewExpr *expr,
225 QualType ElementType) override;
226 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
227 llvm::Value *allocPtr,
228 CharUnits cookieSize) override;
229
230 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
231 llvm::GlobalVariable *DeclPtr,
232 bool PerformInit) override;
233 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
234 llvm::Constant *dtor, llvm::Constant *addr) override;
235
236 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
237 llvm::GlobalVariable *Var);
238 void EmitThreadLocalInitFuncs(
239 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
240 llvm::Function *InitFunc) override;
241 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
242 QualType LValType) override;
243
244 bool NeedsVTTParameter(GlobalDecl GD) override;
245
246 /**************************** RTTI Uniqueness ******************************/
247
248 protected:
249 /// Returns true if the ABI requires RTTI type_info objects to be unique
250 /// across a program.
shouldRTTIBeUnique() const251 virtual bool shouldRTTIBeUnique() const { return true; }
252
253 public:
254 /// What sort of unique-RTTI behavior should we use?
255 enum RTTIUniquenessKind {
256 /// We are guaranteeing, or need to guarantee, that the RTTI string
257 /// is unique.
258 RUK_Unique,
259
260 /// We are not guaranteeing uniqueness for the RTTI string, so we
261 /// can demote to hidden visibility but must use string comparisons.
262 RUK_NonUniqueHidden,
263
264 /// We are not guaranteeing uniqueness for the RTTI string, so we
265 /// have to use string comparisons, but we also have to emit it with
266 /// non-hidden visibility.
267 RUK_NonUniqueVisible
268 };
269
270 /// Return the required visibility status for the given type and linkage in
271 /// the current ABI.
272 RTTIUniquenessKind
273 classifyRTTIUniqueness(QualType CanTy,
274 llvm::GlobalValue::LinkageTypes Linkage) const;
275 friend class ItaniumRTTIBuilder;
276 };
277
278 class ARMCXXABI : public ItaniumCXXABI {
279 public:
ARMCXXABI(CodeGen::CodeGenModule & CGM)280 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
281 ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
282 /* UseARMGuardVarABI = */ true) {}
283
HasThisReturn(GlobalDecl GD) const284 bool HasThisReturn(GlobalDecl GD) const override {
285 return (isa<CXXConstructorDecl>(GD.getDecl()) || (
286 isa<CXXDestructorDecl>(GD.getDecl()) &&
287 GD.getDtorType() != Dtor_Deleting));
288 }
289
290 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
291 QualType ResTy) override;
292
293 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
294 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
295 llvm::Value *NewPtr,
296 llvm::Value *NumElements,
297 const CXXNewExpr *expr,
298 QualType ElementType) override;
299 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, llvm::Value *allocPtr,
300 CharUnits cookieSize) override;
301 };
302
303 class iOS64CXXABI : public ARMCXXABI {
304 public:
iOS64CXXABI(CodeGen::CodeGenModule & CGM)305 iOS64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {}
306
307 // ARM64 libraries are prepared for non-unique RTTI.
shouldRTTIBeUnique() const308 bool shouldRTTIBeUnique() const override { return false; }
309 };
310 }
311
CreateItaniumCXXABI(CodeGenModule & CGM)312 CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
313 switch (CGM.getTarget().getCXXABI().getKind()) {
314 // For IR-generation purposes, there's no significant difference
315 // between the ARM and iOS ABIs.
316 case TargetCXXABI::GenericARM:
317 case TargetCXXABI::iOS:
318 return new ARMCXXABI(CGM);
319
320 case TargetCXXABI::iOS64:
321 return new iOS64CXXABI(CGM);
322
323 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
324 // include the other 32-bit ARM oddities: constructor/destructor return values
325 // and array cookies.
326 case TargetCXXABI::GenericAArch64:
327 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
328 /* UseARMGuardVarABI = */ true);
329
330 case TargetCXXABI::GenericItanium:
331 if (CGM.getContext().getTargetInfo().getTriple().getArch()
332 == llvm::Triple::le32) {
333 // For PNaCl, use ARM-style method pointers so that PNaCl code
334 // does not assume anything about the alignment of function
335 // pointers.
336 return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,
337 /* UseARMGuardVarABI = */ false);
338 }
339 return new ItaniumCXXABI(CGM);
340
341 case TargetCXXABI::Microsoft:
342 llvm_unreachable("Microsoft ABI is not Itanium-based");
343 }
344 llvm_unreachable("bad ABI kind");
345 }
346
347 llvm::Type *
ConvertMemberPointerType(const MemberPointerType * MPT)348 ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
349 if (MPT->isMemberDataPointer())
350 return CGM.PtrDiffTy;
351 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy, NULL);
352 }
353
354 /// In the Itanium and ARM ABIs, method pointers have the form:
355 /// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
356 ///
357 /// In the Itanium ABI:
358 /// - method pointers are virtual if (memptr.ptr & 1) is nonzero
359 /// - the this-adjustment is (memptr.adj)
360 /// - the virtual offset is (memptr.ptr - 1)
361 ///
362 /// In the ARM ABI:
363 /// - method pointers are virtual if (memptr.adj & 1) is nonzero
364 /// - the this-adjustment is (memptr.adj >> 1)
365 /// - the virtual offset is (memptr.ptr)
366 /// ARM uses 'adj' for the virtual flag because Thumb functions
367 /// may be only single-byte aligned.
368 ///
369 /// If the member is virtual, the adjusted 'this' pointer points
370 /// to a vtable pointer from which the virtual offset is applied.
371 ///
372 /// If the member is non-virtual, memptr.ptr is the address of
373 /// the function to call.
EmitLoadOfMemberFunctionPointer(CodeGenFunction & CGF,const Expr * E,llvm::Value * & This,llvm::Value * MemFnPtr,const MemberPointerType * MPT)374 llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
375 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
376 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
377 CGBuilderTy &Builder = CGF.Builder;
378
379 const FunctionProtoType *FPT =
380 MPT->getPointeeType()->getAs<FunctionProtoType>();
381 const CXXRecordDecl *RD =
382 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
383
384 llvm::FunctionType *FTy =
385 CGM.getTypes().GetFunctionType(
386 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
387
388 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
389
390 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
391 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
392 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
393
394 // Extract memptr.adj, which is in the second field.
395 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
396
397 // Compute the true adjustment.
398 llvm::Value *Adj = RawAdj;
399 if (UseARMMethodPtrABI)
400 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
401
402 // Apply the adjustment and cast back to the original struct type
403 // for consistency.
404 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
405 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
406 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
407
408 // Load the function pointer.
409 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
410
411 // If the LSB in the function pointer is 1, the function pointer points to
412 // a virtual function.
413 llvm::Value *IsVirtual;
414 if (UseARMMethodPtrABI)
415 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
416 else
417 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
418 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
419 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
420
421 // In the virtual path, the adjustment left 'This' pointing to the
422 // vtable of the correct base subobject. The "function pointer" is an
423 // offset within the vtable (+1 for the virtual flag on non-ARM).
424 CGF.EmitBlock(FnVirtual);
425
426 // Cast the adjusted this to a pointer to vtable pointer and load.
427 llvm::Type *VTableTy = Builder.getInt8PtrTy();
428 llvm::Value *VTable = CGF.GetVTablePtr(This, VTableTy);
429
430 // Apply the offset.
431 llvm::Value *VTableOffset = FnAsInt;
432 if (!UseARMMethodPtrABI)
433 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
434 VTable = Builder.CreateGEP(VTable, VTableOffset);
435
436 // Load the virtual function to call.
437 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
438 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn");
439 CGF.EmitBranch(FnEnd);
440
441 // In the non-virtual path, the function pointer is actually a
442 // function pointer.
443 CGF.EmitBlock(FnNonVirtual);
444 llvm::Value *NonVirtualFn =
445 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
446
447 // We're done.
448 CGF.EmitBlock(FnEnd);
449 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
450 Callee->addIncoming(VirtualFn, FnVirtual);
451 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
452 return Callee;
453 }
454
455 /// Compute an l-value by applying the given pointer-to-member to a
456 /// base object.
EmitMemberDataPointerAddress(CodeGenFunction & CGF,const Expr * E,llvm::Value * Base,llvm::Value * MemPtr,const MemberPointerType * MPT)457 llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
458 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
459 const MemberPointerType *MPT) {
460 assert(MemPtr->getType() == CGM.PtrDiffTy);
461
462 CGBuilderTy &Builder = CGF.Builder;
463
464 unsigned AS = Base->getType()->getPointerAddressSpace();
465
466 // Cast to char*.
467 Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
468
469 // Apply the offset, which we assume is non-null.
470 llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, MemPtr, "memptr.offset");
471
472 // Cast the address to the appropriate pointer type, adopting the
473 // address space of the base pointer.
474 llvm::Type *PType
475 = CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
476 return Builder.CreateBitCast(Addr, PType);
477 }
478
479 /// Perform a bitcast, derived-to-base, or base-to-derived member pointer
480 /// conversion.
481 ///
482 /// Bitcast conversions are always a no-op under Itanium.
483 ///
484 /// Obligatory offset/adjustment diagram:
485 /// <-- offset --> <-- adjustment -->
486 /// |--------------------------|----------------------|--------------------|
487 /// ^Derived address point ^Base address point ^Member address point
488 ///
489 /// So when converting a base member pointer to a derived member pointer,
490 /// we add the offset to the adjustment because the address point has
491 /// decreased; and conversely, when converting a derived MP to a base MP
492 /// we subtract the offset from the adjustment because the address point
493 /// has increased.
494 ///
495 /// The standard forbids (at compile time) conversion to and from
496 /// virtual bases, which is why we don't have to consider them here.
497 ///
498 /// The standard forbids (at run time) casting a derived MP to a base
499 /// MP when the derived MP does not point to a member of the base.
500 /// This is why -1 is a reasonable choice for null data member
501 /// pointers.
502 llvm::Value *
EmitMemberPointerConversion(CodeGenFunction & CGF,const CastExpr * E,llvm::Value * src)503 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
504 const CastExpr *E,
505 llvm::Value *src) {
506 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
507 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
508 E->getCastKind() == CK_ReinterpretMemberPointer);
509
510 // Under Itanium, reinterprets don't require any additional processing.
511 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
512
513 // Use constant emission if we can.
514 if (isa<llvm::Constant>(src))
515 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
516
517 llvm::Constant *adj = getMemberPointerAdjustment(E);
518 if (!adj) return src;
519
520 CGBuilderTy &Builder = CGF.Builder;
521 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
522
523 const MemberPointerType *destTy =
524 E->getType()->castAs<MemberPointerType>();
525
526 // For member data pointers, this is just a matter of adding the
527 // offset if the source is non-null.
528 if (destTy->isMemberDataPointer()) {
529 llvm::Value *dst;
530 if (isDerivedToBase)
531 dst = Builder.CreateNSWSub(src, adj, "adj");
532 else
533 dst = Builder.CreateNSWAdd(src, adj, "adj");
534
535 // Null check.
536 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
537 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
538 return Builder.CreateSelect(isNull, src, dst);
539 }
540
541 // The this-adjustment is left-shifted by 1 on ARM.
542 if (UseARMMethodPtrABI) {
543 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
544 offset <<= 1;
545 adj = llvm::ConstantInt::get(adj->getType(), offset);
546 }
547
548 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
549 llvm::Value *dstAdj;
550 if (isDerivedToBase)
551 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
552 else
553 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
554
555 return Builder.CreateInsertValue(src, dstAdj, 1);
556 }
557
558 llvm::Constant *
EmitMemberPointerConversion(const CastExpr * E,llvm::Constant * src)559 ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
560 llvm::Constant *src) {
561 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
562 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
563 E->getCastKind() == CK_ReinterpretMemberPointer);
564
565 // Under Itanium, reinterprets don't require any additional processing.
566 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
567
568 // If the adjustment is trivial, we don't need to do anything.
569 llvm::Constant *adj = getMemberPointerAdjustment(E);
570 if (!adj) return src;
571
572 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
573
574 const MemberPointerType *destTy =
575 E->getType()->castAs<MemberPointerType>();
576
577 // For member data pointers, this is just a matter of adding the
578 // offset if the source is non-null.
579 if (destTy->isMemberDataPointer()) {
580 // null maps to null.
581 if (src->isAllOnesValue()) return src;
582
583 if (isDerivedToBase)
584 return llvm::ConstantExpr::getNSWSub(src, adj);
585 else
586 return llvm::ConstantExpr::getNSWAdd(src, adj);
587 }
588
589 // The this-adjustment is left-shifted by 1 on ARM.
590 if (UseARMMethodPtrABI) {
591 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
592 offset <<= 1;
593 adj = llvm::ConstantInt::get(adj->getType(), offset);
594 }
595
596 llvm::Constant *srcAdj = llvm::ConstantExpr::getExtractValue(src, 1);
597 llvm::Constant *dstAdj;
598 if (isDerivedToBase)
599 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
600 else
601 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
602
603 return llvm::ConstantExpr::getInsertValue(src, dstAdj, 1);
604 }
605
606 llvm::Constant *
EmitNullMemberPointer(const MemberPointerType * MPT)607 ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
608 // Itanium C++ ABI 2.3:
609 // A NULL pointer is represented as -1.
610 if (MPT->isMemberDataPointer())
611 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
612
613 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
614 llvm::Constant *Values[2] = { Zero, Zero };
615 return llvm::ConstantStruct::getAnon(Values);
616 }
617
618 llvm::Constant *
EmitMemberDataPointer(const MemberPointerType * MPT,CharUnits offset)619 ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
620 CharUnits offset) {
621 // Itanium C++ ABI 2.3:
622 // A pointer to data member is an offset from the base address of
623 // the class object containing it, represented as a ptrdiff_t
624 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
625 }
626
EmitMemberPointer(const CXXMethodDecl * MD)627 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
628 return BuildMemberPointer(MD, CharUnits::Zero());
629 }
630
BuildMemberPointer(const CXXMethodDecl * MD,CharUnits ThisAdjustment)631 llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
632 CharUnits ThisAdjustment) {
633 assert(MD->isInstance() && "Member function must not be static!");
634 MD = MD->getCanonicalDecl();
635
636 CodeGenTypes &Types = CGM.getTypes();
637
638 // Get the function pointer (or index if this is a virtual function).
639 llvm::Constant *MemPtr[2];
640 if (MD->isVirtual()) {
641 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
642
643 const ASTContext &Context = getContext();
644 CharUnits PointerWidth =
645 Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
646 uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
647
648 if (UseARMMethodPtrABI) {
649 // ARM C++ ABI 3.2.1:
650 // This ABI specifies that adj contains twice the this
651 // adjustment, plus 1 if the member function is virtual. The
652 // least significant bit of adj then makes exactly the same
653 // discrimination as the least significant bit of ptr does for
654 // Itanium.
655 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
656 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
657 2 * ThisAdjustment.getQuantity() + 1);
658 } else {
659 // Itanium C++ ABI 2.3:
660 // For a virtual function, [the pointer field] is 1 plus the
661 // virtual table offset (in bytes) of the function,
662 // represented as a ptrdiff_t.
663 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
664 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
665 ThisAdjustment.getQuantity());
666 }
667 } else {
668 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
669 llvm::Type *Ty;
670 // Check whether the function has a computable LLVM signature.
671 if (Types.isFuncTypeConvertible(FPT)) {
672 // The function has a computable LLVM signature; use the correct type.
673 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
674 } else {
675 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
676 // function type is incomplete.
677 Ty = CGM.PtrDiffTy;
678 }
679 llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
680
681 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
682 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
683 (UseARMMethodPtrABI ? 2 : 1) *
684 ThisAdjustment.getQuantity());
685 }
686
687 return llvm::ConstantStruct::getAnon(MemPtr);
688 }
689
EmitMemberPointer(const APValue & MP,QualType MPType)690 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
691 QualType MPType) {
692 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
693 const ValueDecl *MPD = MP.getMemberPointerDecl();
694 if (!MPD)
695 return EmitNullMemberPointer(MPT);
696
697 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
698
699 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
700 return BuildMemberPointer(MD, ThisAdjustment);
701
702 CharUnits FieldOffset =
703 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
704 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
705 }
706
707 /// The comparison algorithm is pretty easy: the member pointers are
708 /// the same if they're either bitwise identical *or* both null.
709 ///
710 /// ARM is different here only because null-ness is more complicated.
711 llvm::Value *
EmitMemberPointerComparison(CodeGenFunction & CGF,llvm::Value * L,llvm::Value * R,const MemberPointerType * MPT,bool Inequality)712 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
713 llvm::Value *L,
714 llvm::Value *R,
715 const MemberPointerType *MPT,
716 bool Inequality) {
717 CGBuilderTy &Builder = CGF.Builder;
718
719 llvm::ICmpInst::Predicate Eq;
720 llvm::Instruction::BinaryOps And, Or;
721 if (Inequality) {
722 Eq = llvm::ICmpInst::ICMP_NE;
723 And = llvm::Instruction::Or;
724 Or = llvm::Instruction::And;
725 } else {
726 Eq = llvm::ICmpInst::ICMP_EQ;
727 And = llvm::Instruction::And;
728 Or = llvm::Instruction::Or;
729 }
730
731 // Member data pointers are easy because there's a unique null
732 // value, so it just comes down to bitwise equality.
733 if (MPT->isMemberDataPointer())
734 return Builder.CreateICmp(Eq, L, R);
735
736 // For member function pointers, the tautologies are more complex.
737 // The Itanium tautology is:
738 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
739 // The ARM tautology is:
740 // (L == R) <==> (L.ptr == R.ptr &&
741 // (L.adj == R.adj ||
742 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
743 // The inequality tautologies have exactly the same structure, except
744 // applying De Morgan's laws.
745
746 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
747 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
748
749 // This condition tests whether L.ptr == R.ptr. This must always be
750 // true for equality to hold.
751 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
752
753 // This condition, together with the assumption that L.ptr == R.ptr,
754 // tests whether the pointers are both null. ARM imposes an extra
755 // condition.
756 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
757 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
758
759 // This condition tests whether L.adj == R.adj. If this isn't
760 // true, the pointers are unequal unless they're both null.
761 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
762 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
763 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
764
765 // Null member function pointers on ARM clear the low bit of Adj,
766 // so the zero condition has to check that neither low bit is set.
767 if (UseARMMethodPtrABI) {
768 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
769
770 // Compute (l.adj | r.adj) & 1 and test it against zero.
771 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
772 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
773 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
774 "cmp.or.adj");
775 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
776 }
777
778 // Tie together all our conditions.
779 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
780 Result = Builder.CreateBinOp(And, PtrEq, Result,
781 Inequality ? "memptr.ne" : "memptr.eq");
782 return Result;
783 }
784
785 llvm::Value *
EmitMemberPointerIsNotNull(CodeGenFunction & CGF,llvm::Value * MemPtr,const MemberPointerType * MPT)786 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
787 llvm::Value *MemPtr,
788 const MemberPointerType *MPT) {
789 CGBuilderTy &Builder = CGF.Builder;
790
791 /// For member data pointers, this is just a check against -1.
792 if (MPT->isMemberDataPointer()) {
793 assert(MemPtr->getType() == CGM.PtrDiffTy);
794 llvm::Value *NegativeOne =
795 llvm::Constant::getAllOnesValue(MemPtr->getType());
796 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
797 }
798
799 // In Itanium, a member function pointer is not null if 'ptr' is not null.
800 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
801
802 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
803 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
804
805 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
806 // (the virtual bit) is set.
807 if (UseARMMethodPtrABI) {
808 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
809 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
810 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
811 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
812 "memptr.isvirtual");
813 Result = Builder.CreateOr(Result, IsVirtual);
814 }
815
816 return Result;
817 }
818
classifyReturnType(CGFunctionInfo & FI) const819 bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
820 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
821 if (!RD)
822 return false;
823
824 // Return indirectly if we have a non-trivial copy ctor or non-trivial dtor.
825 // FIXME: Use canCopyArgument() when it is fixed to handle lazily declared
826 // special members.
827 if (RD->hasNonTrivialDestructor() || RD->hasNonTrivialCopyConstructor()) {
828 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
829 return true;
830 }
831 return false;
832 }
833
834 /// The Itanium ABI requires non-zero initialization only for data
835 /// member pointers, for which '0' is a valid offset.
isZeroInitializable(const MemberPointerType * MPT)836 bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
837 return MPT->getPointeeType()->isFunctionType();
838 }
839
840 /// The Itanium ABI always places an offset to the complete object
841 /// at entry -2 in the vtable.
adjustToCompleteObject(CodeGenFunction & CGF,llvm::Value * ptr,QualType type)842 llvm::Value *ItaniumCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
843 llvm::Value *ptr,
844 QualType type) {
845 // Grab the vtable pointer as an intptr_t*.
846 llvm::Value *vtable = CGF.GetVTablePtr(ptr, CGF.IntPtrTy->getPointerTo());
847
848 // Track back to entry -2 and pull out the offset there.
849 llvm::Value *offsetPtr =
850 CGF.Builder.CreateConstInBoundsGEP1_64(vtable, -2, "complete-offset.ptr");
851 llvm::LoadInst *offset = CGF.Builder.CreateLoad(offsetPtr);
852 offset->setAlignment(CGF.PointerAlignInBytes);
853
854 // Apply the offset.
855 ptr = CGF.Builder.CreateBitCast(ptr, CGF.Int8PtrTy);
856 return CGF.Builder.CreateInBoundsGEP(ptr, offset);
857 }
858
getItaniumDynamicCastFn(CodeGenFunction & CGF)859 static llvm::Constant *getItaniumDynamicCastFn(CodeGenFunction &CGF) {
860 // void *__dynamic_cast(const void *sub,
861 // const abi::__class_type_info *src,
862 // const abi::__class_type_info *dst,
863 // std::ptrdiff_t src2dst_offset);
864
865 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
866 llvm::Type *PtrDiffTy =
867 CGF.ConvertType(CGF.getContext().getPointerDiffType());
868
869 llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
870
871 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
872
873 // Mark the function as nounwind readonly.
874 llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
875 llvm::Attribute::ReadOnly };
876 llvm::AttributeSet Attrs = llvm::AttributeSet::get(
877 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
878
879 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
880 }
881
getBadCastFn(CodeGenFunction & CGF)882 static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
883 // void __cxa_bad_cast();
884 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
885 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
886 }
887
888 /// \brief Compute the src2dst_offset hint as described in the
889 /// Itanium C++ ABI [2.9.7]
computeOffsetHint(ASTContext & Context,const CXXRecordDecl * Src,const CXXRecordDecl * Dst)890 static CharUnits computeOffsetHint(ASTContext &Context,
891 const CXXRecordDecl *Src,
892 const CXXRecordDecl *Dst) {
893 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
894 /*DetectVirtual=*/false);
895
896 // If Dst is not derived from Src we can skip the whole computation below and
897 // return that Src is not a public base of Dst. Record all inheritance paths.
898 if (!Dst->isDerivedFrom(Src, Paths))
899 return CharUnits::fromQuantity(-2ULL);
900
901 unsigned NumPublicPaths = 0;
902 CharUnits Offset;
903
904 // Now walk all possible inheritance paths.
905 for (CXXBasePaths::paths_iterator I = Paths.begin(), E = Paths.end(); I != E;
906 ++I) {
907 if (I->Access != AS_public) // Ignore non-public inheritance.
908 continue;
909
910 ++NumPublicPaths;
911
912 for (CXXBasePath::iterator J = I->begin(), JE = I->end(); J != JE; ++J) {
913 // If the path contains a virtual base class we can't give any hint.
914 // -1: no hint.
915 if (J->Base->isVirtual())
916 return CharUnits::fromQuantity(-1ULL);
917
918 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
919 continue;
920
921 // Accumulate the base class offsets.
922 const ASTRecordLayout &L = Context.getASTRecordLayout(J->Class);
923 Offset += L.getBaseClassOffset(J->Base->getType()->getAsCXXRecordDecl());
924 }
925 }
926
927 // -2: Src is not a public base of Dst.
928 if (NumPublicPaths == 0)
929 return CharUnits::fromQuantity(-2ULL);
930
931 // -3: Src is a multiple public base type but never a virtual base type.
932 if (NumPublicPaths > 1)
933 return CharUnits::fromQuantity(-3ULL);
934
935 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
936 // Return the offset of Src from the origin of Dst.
937 return Offset;
938 }
939
getBadTypeidFn(CodeGenFunction & CGF)940 static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
941 // void __cxa_bad_typeid();
942 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
943
944 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
945 }
946
shouldTypeidBeNullChecked(bool IsDeref,QualType SrcRecordTy)947 bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
948 QualType SrcRecordTy) {
949 return IsDeref;
950 }
951
EmitBadTypeidCall(CodeGenFunction & CGF)952 void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
953 llvm::Value *Fn = getBadTypeidFn(CGF);
954 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
955 CGF.Builder.CreateUnreachable();
956 }
957
EmitTypeid(CodeGenFunction & CGF,QualType SrcRecordTy,llvm::Value * ThisPtr,llvm::Type * StdTypeInfoPtrTy)958 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
959 QualType SrcRecordTy,
960 llvm::Value *ThisPtr,
961 llvm::Type *StdTypeInfoPtrTy) {
962 llvm::Value *Value =
963 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo());
964
965 // Load the type info.
966 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
967 return CGF.Builder.CreateLoad(Value);
968 }
969
shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,QualType SrcRecordTy)970 bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
971 QualType SrcRecordTy) {
972 return SrcIsPtr;
973 }
974
EmitDynamicCastCall(CodeGenFunction & CGF,llvm::Value * Value,QualType SrcRecordTy,QualType DestTy,QualType DestRecordTy,llvm::BasicBlock * CastEnd)975 llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
976 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
977 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
978 llvm::Type *PtrDiffLTy =
979 CGF.ConvertType(CGF.getContext().getPointerDiffType());
980 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
981
982 llvm::Value *SrcRTTI =
983 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
984 llvm::Value *DestRTTI =
985 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
986
987 // Compute the offset hint.
988 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
989 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
990 llvm::Value *OffsetHint = llvm::ConstantInt::get(
991 PtrDiffLTy,
992 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
993
994 // Emit the call to __dynamic_cast.
995 Value = CGF.EmitCastToVoidPtr(Value);
996
997 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
998 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
999 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1000
1001 /// C++ [expr.dynamic.cast]p9:
1002 /// A failed cast to reference type throws std::bad_cast
1003 if (DestTy->isReferenceType()) {
1004 llvm::BasicBlock *BadCastBlock =
1005 CGF.createBasicBlock("dynamic_cast.bad_cast");
1006
1007 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1008 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1009
1010 CGF.EmitBlock(BadCastBlock);
1011 EmitBadCastCall(CGF);
1012 }
1013
1014 return Value;
1015 }
1016
EmitDynamicCastToVoid(CodeGenFunction & CGF,llvm::Value * Value,QualType SrcRecordTy,QualType DestTy)1017 llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1018 llvm::Value *Value,
1019 QualType SrcRecordTy,
1020 QualType DestTy) {
1021 llvm::Type *PtrDiffLTy =
1022 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1023 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1024
1025 // Get the vtable pointer.
1026 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1027
1028 // Get the offset-to-top from the vtable.
1029 llvm::Value *OffsetToTop =
1030 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1031 OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1032
1033 // Finally, add the offset to the pointer.
1034 Value = CGF.EmitCastToVoidPtr(Value);
1035 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1036
1037 return CGF.Builder.CreateBitCast(Value, DestLTy);
1038 }
1039
EmitBadCastCall(CodeGenFunction & CGF)1040 bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1041 llvm::Value *Fn = getBadCastFn(CGF);
1042 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1043 CGF.Builder.CreateUnreachable();
1044 return true;
1045 }
1046
1047 llvm::Value *
GetVirtualBaseClassOffset(CodeGenFunction & CGF,llvm::Value * This,const CXXRecordDecl * ClassDecl,const CXXRecordDecl * BaseClassDecl)1048 ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1049 llvm::Value *This,
1050 const CXXRecordDecl *ClassDecl,
1051 const CXXRecordDecl *BaseClassDecl) {
1052 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy);
1053 CharUnits VBaseOffsetOffset =
1054 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1055 BaseClassDecl);
1056
1057 llvm::Value *VBaseOffsetPtr =
1058 CGF.Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(),
1059 "vbase.offset.ptr");
1060 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1061 CGM.PtrDiffTy->getPointerTo());
1062
1063 llvm::Value *VBaseOffset =
1064 CGF.Builder.CreateLoad(VBaseOffsetPtr, "vbase.offset");
1065
1066 return VBaseOffset;
1067 }
1068
1069 /// The generic ABI passes 'this', plus a VTT if it's initializing a
1070 /// base subobject.
1071 void
BuildConstructorSignature(const CXXConstructorDecl * Ctor,CXXCtorType Type,CanQualType & ResTy,SmallVectorImpl<CanQualType> & ArgTys)1072 ItaniumCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
1073 CXXCtorType Type, CanQualType &ResTy,
1074 SmallVectorImpl<CanQualType> &ArgTys) {
1075 ASTContext &Context = getContext();
1076
1077 // All parameters are already in place except VTT, which goes after 'this'.
1078 // These are Clang types, so we don't need to worry about sret yet.
1079
1080 // Check if we need to add a VTT parameter (which has type void **).
1081 if (Type == Ctor_Base && Ctor->getParent()->getNumVBases() != 0)
1082 ArgTys.insert(ArgTys.begin() + 1,
1083 Context.getPointerType(Context.VoidPtrTy));
1084 }
1085
EmitCXXConstructors(const CXXConstructorDecl * D)1086 void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1087 // Just make sure we're in sync with TargetCXXABI.
1088 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1089
1090 // The constructor used for constructing this as a base class;
1091 // ignores virtual bases.
1092 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1093
1094 // The constructor used for constructing this as a complete class;
1095 // constucts the virtual bases, then calls the base constructor.
1096 if (!D->getParent()->isAbstract()) {
1097 // We don't need to emit the complete ctor if the class is abstract.
1098 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1099 }
1100 }
1101
1102 /// The generic ABI passes 'this', plus a VTT if it's destroying a
1103 /// base subobject.
BuildDestructorSignature(const CXXDestructorDecl * Dtor,CXXDtorType Type,CanQualType & ResTy,SmallVectorImpl<CanQualType> & ArgTys)1104 void ItaniumCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
1105 CXXDtorType Type,
1106 CanQualType &ResTy,
1107 SmallVectorImpl<CanQualType> &ArgTys) {
1108 ASTContext &Context = getContext();
1109
1110 // 'this' parameter is already there, as well as 'this' return if
1111 // HasThisReturn(GlobalDecl(Dtor, Type)) is true
1112
1113 // Check if we need to add a VTT parameter (which has type void **).
1114 if (Type == Dtor_Base && Dtor->getParent()->getNumVBases() != 0)
1115 ArgTys.push_back(Context.getPointerType(Context.VoidPtrTy));
1116 }
1117
EmitCXXDestructors(const CXXDestructorDecl * D)1118 void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1119 // The destructor used for destructing this as a base class; ignores
1120 // virtual bases.
1121 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1122
1123 // The destructor used for destructing this as a most-derived class;
1124 // call the base destructor and then destructs any virtual bases.
1125 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1126
1127 // The destructor in a virtual table is always a 'deleting'
1128 // destructor, which calls the complete destructor and then uses the
1129 // appropriate operator delete.
1130 if (D->isVirtual())
1131 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
1132 }
1133
addImplicitStructorParams(CodeGenFunction & CGF,QualType & ResTy,FunctionArgList & Params)1134 void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1135 QualType &ResTy,
1136 FunctionArgList &Params) {
1137 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1138 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
1139
1140 // Check if we need a VTT parameter as well.
1141 if (NeedsVTTParameter(CGF.CurGD)) {
1142 ASTContext &Context = getContext();
1143
1144 // FIXME: avoid the fake decl
1145 QualType T = Context.getPointerType(Context.VoidPtrTy);
1146 ImplicitParamDecl *VTTDecl
1147 = ImplicitParamDecl::Create(Context, nullptr, MD->getLocation(),
1148 &Context.Idents.get("vtt"), T);
1149 Params.insert(Params.begin() + 1, VTTDecl);
1150 getStructorImplicitParamDecl(CGF) = VTTDecl;
1151 }
1152 }
1153
EmitInstanceFunctionProlog(CodeGenFunction & CGF)1154 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1155 /// Initialize the 'this' slot.
1156 EmitThisParam(CGF);
1157
1158 /// Initialize the 'vtt' slot if needed.
1159 if (getStructorImplicitParamDecl(CGF)) {
1160 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1161 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
1162 }
1163
1164 /// If this is a function that the ABI specifies returns 'this', initialize
1165 /// the return slot to 'this' at the start of the function.
1166 ///
1167 /// Unlike the setting of return types, this is done within the ABI
1168 /// implementation instead of by clients of CGCXXABI because:
1169 /// 1) getThisValue is currently protected
1170 /// 2) in theory, an ABI could implement 'this' returns some other way;
1171 /// HasThisReturn only specifies a contract, not the implementation
1172 if (HasThisReturn(CGF.CurGD))
1173 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1174 }
1175
addImplicitConstructorArgs(CodeGenFunction & CGF,const CXXConstructorDecl * D,CXXCtorType Type,bool ForVirtualBase,bool Delegating,CallArgList & Args)1176 unsigned ItaniumCXXABI::addImplicitConstructorArgs(
1177 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1178 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1179 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1180 return 0;
1181
1182 // Insert the implicit 'vtt' argument as the second argument.
1183 llvm::Value *VTT =
1184 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1185 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1186 Args.insert(Args.begin() + 1,
1187 CallArg(RValue::get(VTT), VTTTy, /*needscopy=*/false));
1188 return 1; // Added one arg.
1189 }
1190
EmitDestructorCall(CodeGenFunction & CGF,const CXXDestructorDecl * DD,CXXDtorType Type,bool ForVirtualBase,bool Delegating,llvm::Value * This)1191 void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1192 const CXXDestructorDecl *DD,
1193 CXXDtorType Type, bool ForVirtualBase,
1194 bool Delegating, llvm::Value *This) {
1195 GlobalDecl GD(DD, Type);
1196 llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1197 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1198
1199 llvm::Value *Callee = nullptr;
1200 if (getContext().getLangOpts().AppleKext)
1201 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1202
1203 if (!Callee)
1204 Callee = CGM.GetAddrOfCXXDestructor(DD, Type);
1205
1206 // FIXME: Provide a source location here.
1207 CGF.EmitCXXMemberCall(DD, SourceLocation(), Callee, ReturnValueSlot(), This,
1208 VTT, VTTTy, nullptr, nullptr);
1209 }
1210
emitVTableDefinitions(CodeGenVTables & CGVT,const CXXRecordDecl * RD)1211 void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1212 const CXXRecordDecl *RD) {
1213 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1214 if (VTable->hasInitializer())
1215 return;
1216
1217 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1218 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1219 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1220 llvm::Constant *RTTI =
1221 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
1222
1223 // Create and set the initializer.
1224 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1225 RD, VTLayout.vtable_component_begin(), VTLayout.getNumVTableComponents(),
1226 VTLayout.vtable_thunk_begin(), VTLayout.getNumVTableThunks(), RTTI);
1227 VTable->setInitializer(Init);
1228
1229 // Set the correct linkage.
1230 VTable->setLinkage(Linkage);
1231
1232 // Set the right visibility.
1233 CGM.setGlobalVisibility(VTable, RD);
1234
1235 // If this is the magic class __cxxabiv1::__fundamental_type_info,
1236 // we will emit the typeinfo for the fundamental types. This is the
1237 // same behaviour as GCC.
1238 const DeclContext *DC = RD->getDeclContext();
1239 if (RD->getIdentifier() &&
1240 RD->getIdentifier()->isStr("__fundamental_type_info") &&
1241 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1242 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1243 DC->getParent()->isTranslationUnit())
1244 EmitFundamentalRTTIDescriptors();
1245 }
1246
getVTableAddressPointInStructor(CodeGenFunction & CGF,const CXXRecordDecl * VTableClass,BaseSubobject Base,const CXXRecordDecl * NearestVBase,bool & NeedsVirtualOffset)1247 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1248 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1249 const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) {
1250 bool NeedsVTTParam = CGM.getCXXABI().NeedsVTTParameter(CGF.CurGD);
1251 NeedsVirtualOffset = (NeedsVTTParam && NearestVBase);
1252
1253 llvm::Value *VTableAddressPoint;
1254 if (NeedsVTTParam && (Base.getBase()->getNumVBases() || NearestVBase)) {
1255 // Get the secondary vpointer index.
1256 uint64_t VirtualPointerIndex =
1257 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1258
1259 /// Load the VTT.
1260 llvm::Value *VTT = CGF.LoadCXXVTT();
1261 if (VirtualPointerIndex)
1262 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex);
1263
1264 // And load the address point from the VTT.
1265 VTableAddressPoint = CGF.Builder.CreateLoad(VTT);
1266 } else {
1267 llvm::Constant *VTable =
1268 CGM.getCXXABI().getAddrOfVTable(VTableClass, CharUnits());
1269 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1270 .getVTableLayout(VTableClass)
1271 .getAddressPoint(Base);
1272 VTableAddressPoint =
1273 CGF.Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint);
1274 }
1275
1276 return VTableAddressPoint;
1277 }
1278
getVTableAddressPointForConstExpr(BaseSubobject Base,const CXXRecordDecl * VTableClass)1279 llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1280 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1281 llvm::Constant *VTable = getAddrOfVTable(VTableClass, CharUnits());
1282
1283 // Find the appropriate vtable within the vtable group.
1284 uint64_t AddressPoint = CGM.getItaniumVTableContext()
1285 .getVTableLayout(VTableClass)
1286 .getAddressPoint(Base);
1287 llvm::Value *Indices[] = {
1288 llvm::ConstantInt::get(CGM.Int64Ty, 0),
1289 llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
1290 };
1291
1292 return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Indices);
1293 }
1294
getAddrOfVTable(const CXXRecordDecl * RD,CharUnits VPtrOffset)1295 llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1296 CharUnits VPtrOffset) {
1297 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1298
1299 llvm::GlobalVariable *&VTable = VTables[RD];
1300 if (VTable)
1301 return VTable;
1302
1303 // Queue up this v-table for possible deferred emission.
1304 CGM.addDeferredVTable(RD);
1305
1306 SmallString<256> OutName;
1307 llvm::raw_svector_ostream Out(OutName);
1308 getMangleContext().mangleCXXVTable(RD, Out);
1309 Out.flush();
1310 StringRef Name = OutName.str();
1311
1312 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1313 llvm::ArrayType *ArrayType = llvm::ArrayType::get(
1314 CGM.Int8PtrTy, VTContext.getVTableLayout(RD).getNumVTableComponents());
1315
1316 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1317 Name, ArrayType, llvm::GlobalValue::ExternalLinkage);
1318 VTable->setUnnamedAddr(true);
1319
1320 if (RD->hasAttr<DLLImportAttr>())
1321 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1322 else if (RD->hasAttr<DLLExportAttr>())
1323 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1324
1325 return VTable;
1326 }
1327
getVirtualFunctionPointer(CodeGenFunction & CGF,GlobalDecl GD,llvm::Value * This,llvm::Type * Ty)1328 llvm::Value *ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1329 GlobalDecl GD,
1330 llvm::Value *This,
1331 llvm::Type *Ty) {
1332 GD = GD.getCanonicalDecl();
1333 Ty = Ty->getPointerTo()->getPointerTo();
1334 llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
1335
1336 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
1337 llvm::Value *VFuncPtr =
1338 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
1339 return CGF.Builder.CreateLoad(VFuncPtr);
1340 }
1341
EmitVirtualDestructorCall(CodeGenFunction & CGF,const CXXDestructorDecl * Dtor,CXXDtorType DtorType,SourceLocation CallLoc,llvm::Value * This)1342 void ItaniumCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
1343 const CXXDestructorDecl *Dtor,
1344 CXXDtorType DtorType,
1345 SourceLocation CallLoc,
1346 llvm::Value *This) {
1347 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1348
1349 const CGFunctionInfo *FInfo
1350 = &CGM.getTypes().arrangeCXXDestructor(Dtor, DtorType);
1351 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1352 llvm::Value *Callee =
1353 getVirtualFunctionPointer(CGF, GlobalDecl(Dtor, DtorType), This, Ty);
1354
1355 CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValueSlot(), This,
1356 /*ImplicitParam=*/nullptr, QualType(), nullptr,
1357 nullptr);
1358 }
1359
emitVirtualInheritanceTables(const CXXRecordDecl * RD)1360 void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
1361 CodeGenVTables &VTables = CGM.getVTables();
1362 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
1363 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
1364 }
1365
performTypeAdjustment(CodeGenFunction & CGF,llvm::Value * Ptr,int64_t NonVirtualAdjustment,int64_t VirtualAdjustment,bool IsReturnAdjustment)1366 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
1367 llvm::Value *Ptr,
1368 int64_t NonVirtualAdjustment,
1369 int64_t VirtualAdjustment,
1370 bool IsReturnAdjustment) {
1371 if (!NonVirtualAdjustment && !VirtualAdjustment)
1372 return Ptr;
1373
1374 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1375 llvm::Value *V = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy);
1376
1377 if (NonVirtualAdjustment && !IsReturnAdjustment) {
1378 // Perform the non-virtual adjustment for a base-to-derived cast.
1379 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1380 }
1381
1382 if (VirtualAdjustment) {
1383 llvm::Type *PtrDiffTy =
1384 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1385
1386 // Perform the virtual adjustment.
1387 llvm::Value *VTablePtrPtr =
1388 CGF.Builder.CreateBitCast(V, Int8PtrTy->getPointerTo());
1389
1390 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
1391
1392 llvm::Value *OffsetPtr =
1393 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment);
1394
1395 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
1396
1397 // Load the adjustment offset from the vtable.
1398 llvm::Value *Offset = CGF.Builder.CreateLoad(OffsetPtr);
1399
1400 // Adjust our pointer.
1401 V = CGF.Builder.CreateInBoundsGEP(V, Offset);
1402 }
1403
1404 if (NonVirtualAdjustment && IsReturnAdjustment) {
1405 // Perform the non-virtual adjustment for a derived-to-base cast.
1406 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment);
1407 }
1408
1409 // Cast back to the original type.
1410 return CGF.Builder.CreateBitCast(V, Ptr->getType());
1411 }
1412
performThisAdjustment(CodeGenFunction & CGF,llvm::Value * This,const ThisAdjustment & TA)1413 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1414 llvm::Value *This,
1415 const ThisAdjustment &TA) {
1416 return performTypeAdjustment(CGF, This, TA.NonVirtual,
1417 TA.Virtual.Itanium.VCallOffsetOffset,
1418 /*IsReturnAdjustment=*/false);
1419 }
1420
1421 llvm::Value *
performReturnAdjustment(CodeGenFunction & CGF,llvm::Value * Ret,const ReturnAdjustment & RA)1422 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1423 const ReturnAdjustment &RA) {
1424 return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
1425 RA.Virtual.Itanium.VBaseOffsetOffset,
1426 /*IsReturnAdjustment=*/true);
1427 }
1428
EmitReturnFromThunk(CodeGenFunction & CGF,RValue RV,QualType ResultType)1429 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
1430 RValue RV, QualType ResultType) {
1431 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
1432 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
1433
1434 // Destructor thunks in the ARM ABI have indeterminate results.
1435 llvm::Type *T =
1436 cast<llvm::PointerType>(CGF.ReturnValue->getType())->getElementType();
1437 RValue Undef = RValue::get(llvm::UndefValue::get(T));
1438 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
1439 }
1440
1441 /************************** Array allocation cookies **************************/
1442
getArrayCookieSizeImpl(QualType elementType)1443 CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1444 // The array cookie is a size_t; pad that up to the element alignment.
1445 // The cookie is actually right-justified in that space.
1446 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
1447 CGM.getContext().getTypeAlignInChars(elementType));
1448 }
1449
InitializeArrayCookie(CodeGenFunction & CGF,llvm::Value * NewPtr,llvm::Value * NumElements,const CXXNewExpr * expr,QualType ElementType)1450 llvm::Value *ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1451 llvm::Value *NewPtr,
1452 llvm::Value *NumElements,
1453 const CXXNewExpr *expr,
1454 QualType ElementType) {
1455 assert(requiresArrayCookie(expr));
1456
1457 unsigned AS = NewPtr->getType()->getPointerAddressSpace();
1458
1459 ASTContext &Ctx = getContext();
1460 QualType SizeTy = Ctx.getSizeType();
1461 CharUnits SizeSize = Ctx.getTypeSizeInChars(SizeTy);
1462
1463 // The size of the cookie.
1464 CharUnits CookieSize =
1465 std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
1466 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
1467
1468 // Compute an offset to the cookie.
1469 llvm::Value *CookiePtr = NewPtr;
1470 CharUnits CookieOffset = CookieSize - SizeSize;
1471 if (!CookieOffset.isZero())
1472 CookiePtr = CGF.Builder.CreateConstInBoundsGEP1_64(CookiePtr,
1473 CookieOffset.getQuantity());
1474
1475 // Write the number of elements into the appropriate slot.
1476 llvm::Value *NumElementsPtr
1477 = CGF.Builder.CreateBitCast(CookiePtr,
1478 CGF.ConvertType(SizeTy)->getPointerTo(AS));
1479 CGF.Builder.CreateStore(NumElements, NumElementsPtr);
1480
1481 // Finally, compute a pointer to the actual data buffer by skipping
1482 // over the cookie completely.
1483 return CGF.Builder.CreateConstInBoundsGEP1_64(NewPtr,
1484 CookieSize.getQuantity());
1485 }
1486
readArrayCookieImpl(CodeGenFunction & CGF,llvm::Value * allocPtr,CharUnits cookieSize)1487 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1488 llvm::Value *allocPtr,
1489 CharUnits cookieSize) {
1490 // The element size is right-justified in the cookie.
1491 llvm::Value *numElementsPtr = allocPtr;
1492 CharUnits numElementsOffset =
1493 cookieSize - CharUnits::fromQuantity(CGF.SizeSizeInBytes);
1494 if (!numElementsOffset.isZero())
1495 numElementsPtr =
1496 CGF.Builder.CreateConstInBoundsGEP1_64(numElementsPtr,
1497 numElementsOffset.getQuantity());
1498
1499 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
1500 numElementsPtr =
1501 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1502 return CGF.Builder.CreateLoad(numElementsPtr);
1503 }
1504
getArrayCookieSizeImpl(QualType elementType)1505 CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
1506 // ARM says that the cookie is always:
1507 // struct array_cookie {
1508 // std::size_t element_size; // element_size != 0
1509 // std::size_t element_count;
1510 // };
1511 // But the base ABI doesn't give anything an alignment greater than
1512 // 8, so we can dismiss this as typical ABI-author blindness to
1513 // actual language complexity and round up to the element alignment.
1514 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
1515 CGM.getContext().getTypeAlignInChars(elementType));
1516 }
1517
InitializeArrayCookie(CodeGenFunction & CGF,llvm::Value * newPtr,llvm::Value * numElements,const CXXNewExpr * expr,QualType elementType)1518 llvm::Value *ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1519 llvm::Value *newPtr,
1520 llvm::Value *numElements,
1521 const CXXNewExpr *expr,
1522 QualType elementType) {
1523 assert(requiresArrayCookie(expr));
1524
1525 // NewPtr is a char*, but we generalize to arbitrary addrspaces.
1526 unsigned AS = newPtr->getType()->getPointerAddressSpace();
1527
1528 // The cookie is always at the start of the buffer.
1529 llvm::Value *cookie = newPtr;
1530
1531 // The first element is the element size.
1532 cookie = CGF.Builder.CreateBitCast(cookie, CGF.SizeTy->getPointerTo(AS));
1533 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
1534 getContext().getTypeSizeInChars(elementType).getQuantity());
1535 CGF.Builder.CreateStore(elementSize, cookie);
1536
1537 // The second element is the element count.
1538 cookie = CGF.Builder.CreateConstInBoundsGEP1_32(cookie, 1);
1539 CGF.Builder.CreateStore(numElements, cookie);
1540
1541 // Finally, compute a pointer to the actual data buffer by skipping
1542 // over the cookie completely.
1543 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
1544 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
1545 cookieSize.getQuantity());
1546 }
1547
readArrayCookieImpl(CodeGenFunction & CGF,llvm::Value * allocPtr,CharUnits cookieSize)1548 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1549 llvm::Value *allocPtr,
1550 CharUnits cookieSize) {
1551 // The number of elements is at offset sizeof(size_t) relative to
1552 // the allocated pointer.
1553 llvm::Value *numElementsPtr
1554 = CGF.Builder.CreateConstInBoundsGEP1_64(allocPtr, CGF.SizeSizeInBytes);
1555
1556 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
1557 numElementsPtr =
1558 CGF.Builder.CreateBitCast(numElementsPtr, CGF.SizeTy->getPointerTo(AS));
1559 return CGF.Builder.CreateLoad(numElementsPtr);
1560 }
1561
1562 /*********************** Static local initialization **************************/
1563
getGuardAcquireFn(CodeGenModule & CGM,llvm::PointerType * GuardPtrTy)1564 static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
1565 llvm::PointerType *GuardPtrTy) {
1566 // int __cxa_guard_acquire(__guard *guard_object);
1567 llvm::FunctionType *FTy =
1568 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
1569 GuardPtrTy, /*isVarArg=*/false);
1570 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire",
1571 llvm::AttributeSet::get(CGM.getLLVMContext(),
1572 llvm::AttributeSet::FunctionIndex,
1573 llvm::Attribute::NoUnwind));
1574 }
1575
getGuardReleaseFn(CodeGenModule & CGM,llvm::PointerType * GuardPtrTy)1576 static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
1577 llvm::PointerType *GuardPtrTy) {
1578 // void __cxa_guard_release(__guard *guard_object);
1579 llvm::FunctionType *FTy =
1580 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1581 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release",
1582 llvm::AttributeSet::get(CGM.getLLVMContext(),
1583 llvm::AttributeSet::FunctionIndex,
1584 llvm::Attribute::NoUnwind));
1585 }
1586
getGuardAbortFn(CodeGenModule & CGM,llvm::PointerType * GuardPtrTy)1587 static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
1588 llvm::PointerType *GuardPtrTy) {
1589 // void __cxa_guard_abort(__guard *guard_object);
1590 llvm::FunctionType *FTy =
1591 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
1592 return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort",
1593 llvm::AttributeSet::get(CGM.getLLVMContext(),
1594 llvm::AttributeSet::FunctionIndex,
1595 llvm::Attribute::NoUnwind));
1596 }
1597
1598 namespace {
1599 struct CallGuardAbort : EHScopeStack::Cleanup {
1600 llvm::GlobalVariable *Guard;
CallGuardAbort__anondd4beb4d0211::CallGuardAbort1601 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
1602
Emit__anondd4beb4d0211::CallGuardAbort1603 void Emit(CodeGenFunction &CGF, Flags flags) override {
1604 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
1605 Guard);
1606 }
1607 };
1608 }
1609
1610 /// The ARM code here follows the Itanium code closely enough that we
1611 /// just special-case it at particular places.
EmitGuardedInit(CodeGenFunction & CGF,const VarDecl & D,llvm::GlobalVariable * var,bool shouldPerformInit)1612 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1613 const VarDecl &D,
1614 llvm::GlobalVariable *var,
1615 bool shouldPerformInit) {
1616 CGBuilderTy &Builder = CGF.Builder;
1617
1618 // We only need to use thread-safe statics for local non-TLS variables;
1619 // global initialization is always single-threaded.
1620 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
1621 D.isLocalVarDecl() && !D.getTLSKind();
1622
1623 // If we have a global variable with internal linkage and thread-safe statics
1624 // are disabled, we can just let the guard variable be of type i8.
1625 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
1626
1627 llvm::IntegerType *guardTy;
1628 if (useInt8GuardVariable) {
1629 guardTy = CGF.Int8Ty;
1630 } else {
1631 // Guard variables are 64 bits in the generic ABI and size width on ARM
1632 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
1633 guardTy = (UseARMGuardVarABI ? CGF.SizeTy : CGF.Int64Ty);
1634 }
1635 llvm::PointerType *guardPtrTy = guardTy->getPointerTo();
1636
1637 // Create the guard variable if we don't already have it (as we
1638 // might if we're double-emitting this function body).
1639 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
1640 if (!guard) {
1641 // Mangle the name for the guard.
1642 SmallString<256> guardName;
1643 {
1644 llvm::raw_svector_ostream out(guardName);
1645 getMangleContext().mangleStaticGuardVariable(&D, out);
1646 out.flush();
1647 }
1648
1649 // Create the guard variable with a zero-initializer.
1650 // Just absorb linkage and visibility from the guarded variable.
1651 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
1652 false, var->getLinkage(),
1653 llvm::ConstantInt::get(guardTy, 0),
1654 guardName.str());
1655 guard->setVisibility(var->getVisibility());
1656 // If the variable is thread-local, so is its guard variable.
1657 guard->setThreadLocalMode(var->getThreadLocalMode());
1658
1659 CGM.setStaticLocalDeclGuardAddress(&D, guard);
1660 }
1661
1662 // Test whether the variable has completed initialization.
1663 //
1664 // Itanium C++ ABI 3.3.2:
1665 // The following is pseudo-code showing how these functions can be used:
1666 // if (obj_guard.first_byte == 0) {
1667 // if ( __cxa_guard_acquire (&obj_guard) ) {
1668 // try {
1669 // ... initialize the object ...;
1670 // } catch (...) {
1671 // __cxa_guard_abort (&obj_guard);
1672 // throw;
1673 // }
1674 // ... queue object destructor with __cxa_atexit() ...;
1675 // __cxa_guard_release (&obj_guard);
1676 // }
1677 // }
1678
1679 // Load the first byte of the guard variable.
1680 llvm::LoadInst *LI =
1681 Builder.CreateLoad(Builder.CreateBitCast(guard, CGM.Int8PtrTy));
1682 LI->setAlignment(1);
1683
1684 // Itanium ABI:
1685 // An implementation supporting thread-safety on multiprocessor
1686 // systems must also guarantee that references to the initialized
1687 // object do not occur before the load of the initialization flag.
1688 //
1689 // In LLVM, we do this by marking the load Acquire.
1690 if (threadsafe)
1691 LI->setAtomic(llvm::Acquire);
1692
1693 // For ARM, we should only check the first bit, rather than the entire byte:
1694 //
1695 // ARM C++ ABI 3.2.3.1:
1696 // To support the potential use of initialization guard variables
1697 // as semaphores that are the target of ARM SWP and LDREX/STREX
1698 // synchronizing instructions we define a static initialization
1699 // guard variable to be a 4-byte aligned, 4-byte word with the
1700 // following inline access protocol.
1701 // #define INITIALIZED 1
1702 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
1703 // if (__cxa_guard_acquire(&obj_guard))
1704 // ...
1705 // }
1706 //
1707 // and similarly for ARM64:
1708 //
1709 // ARM64 C++ ABI 3.2.2:
1710 // This ABI instead only specifies the value bit 0 of the static guard
1711 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
1712 // variable is not initialized and 1 when it is.
1713 llvm::Value *V =
1714 (UseARMGuardVarABI && !useInt8GuardVariable)
1715 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
1716 : LI;
1717 llvm::Value *isInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
1718
1719 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
1720 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1721
1722 // Check if the first byte of the guard variable is zero.
1723 Builder.CreateCondBr(isInitialized, InitCheckBlock, EndBlock);
1724
1725 CGF.EmitBlock(InitCheckBlock);
1726
1727 // Variables used when coping with thread-safe statics and exceptions.
1728 if (threadsafe) {
1729 // Call __cxa_guard_acquire.
1730 llvm::Value *V
1731 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
1732
1733 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1734
1735 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
1736 InitBlock, EndBlock);
1737
1738 // Call __cxa_guard_abort along the exceptional edge.
1739 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
1740
1741 CGF.EmitBlock(InitBlock);
1742 }
1743
1744 // Emit the initializer and add a global destructor if appropriate.
1745 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
1746
1747 if (threadsafe) {
1748 // Pop the guard-abort cleanup if we pushed one.
1749 CGF.PopCleanupBlock();
1750
1751 // Call __cxa_guard_release. This cannot throw.
1752 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), guard);
1753 } else {
1754 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guard);
1755 }
1756
1757 CGF.EmitBlock(EndBlock);
1758 }
1759
1760 /// Register a global destructor using __cxa_atexit.
emitGlobalDtorWithCXAAtExit(CodeGenFunction & CGF,llvm::Constant * dtor,llvm::Constant * addr,bool TLS)1761 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
1762 llvm::Constant *dtor,
1763 llvm::Constant *addr,
1764 bool TLS) {
1765 const char *Name = "__cxa_atexit";
1766 if (TLS) {
1767 const llvm::Triple &T = CGF.getTarget().getTriple();
1768 Name = T.isMacOSX() ? "_tlv_atexit" : "__cxa_thread_atexit";
1769 }
1770
1771 // We're assuming that the destructor function is something we can
1772 // reasonably call with the default CC. Go ahead and cast it to the
1773 // right prototype.
1774 llvm::Type *dtorTy =
1775 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
1776
1777 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
1778 llvm::Type *paramTys[] = { dtorTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
1779 llvm::FunctionType *atexitTy =
1780 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
1781
1782 // Fetch the actual function.
1783 llvm::Constant *atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
1784 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit))
1785 fn->setDoesNotThrow();
1786
1787 // Create a variable that binds the atexit to this shared object.
1788 llvm::Constant *handle =
1789 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
1790
1791 llvm::Value *args[] = {
1792 llvm::ConstantExpr::getBitCast(dtor, dtorTy),
1793 llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy),
1794 handle
1795 };
1796 CGF.EmitNounwindRuntimeCall(atexit, args);
1797 }
1798
1799 /// Register a global destructor as best as we know how.
registerGlobalDtor(CodeGenFunction & CGF,const VarDecl & D,llvm::Constant * dtor,llvm::Constant * addr)1800 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF,
1801 const VarDecl &D,
1802 llvm::Constant *dtor,
1803 llvm::Constant *addr) {
1804 // Use __cxa_atexit if available.
1805 if (CGM.getCodeGenOpts().CXAAtExit)
1806 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
1807
1808 if (D.getTLSKind())
1809 CGM.ErrorUnsupported(&D, "non-trivial TLS destruction");
1810
1811 // In Apple kexts, we want to add a global destructor entry.
1812 // FIXME: shouldn't this be guarded by some variable?
1813 if (CGM.getLangOpts().AppleKext) {
1814 // Generate a global destructor entry.
1815 return CGM.AddCXXDtorEntry(dtor, addr);
1816 }
1817
1818 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
1819 }
1820
1821 /// Get the appropriate linkage for the wrapper function. This is essentially
1822 /// the weak form of the variable's linkage; every translation unit which needs
1823 /// the wrapper emits a copy, and we want the linker to merge them.
1824 static llvm::GlobalValue::LinkageTypes
getThreadLocalWrapperLinkage(const VarDecl * VD,CodeGen::CodeGenModule & CGM)1825 getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
1826 llvm::GlobalValue::LinkageTypes VarLinkage =
1827 CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false);
1828
1829 // For internal linkage variables, we don't need an external or weak wrapper.
1830 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
1831 return VarLinkage;
1832
1833 // All accesses to the thread_local variable go through the thread wrapper.
1834 // However, this means that we cannot allow the thread wrapper to get inlined
1835 // into any functions.
1836 if (VD->getTLSKind() == VarDecl::TLS_Dynamic &&
1837 CGM.getTarget().getTriple().isMacOSX())
1838 return llvm::GlobalValue::WeakAnyLinkage;
1839 return llvm::GlobalValue::WeakODRLinkage;
1840 }
1841
1842 llvm::Function *
getOrCreateThreadLocalWrapper(const VarDecl * VD,llvm::GlobalVariable * Var)1843 ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
1844 llvm::GlobalVariable *Var) {
1845 // Mangle the name for the thread_local wrapper function.
1846 SmallString<256> WrapperName;
1847 {
1848 llvm::raw_svector_ostream Out(WrapperName);
1849 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
1850 Out.flush();
1851 }
1852
1853 if (llvm::Value *V = Var->getParent()->getNamedValue(WrapperName))
1854 return cast<llvm::Function>(V);
1855
1856 llvm::Type *RetTy = Var->getType();
1857 if (VD->getType()->isReferenceType())
1858 RetTy = RetTy->getPointerElementType();
1859
1860 llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, false);
1861 llvm::Function *Wrapper =
1862 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
1863 WrapperName.str(), &CGM.getModule());
1864 // Always resolve references to the wrapper at link time.
1865 if (!Wrapper->hasLocalLinkage())
1866 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
1867 return Wrapper;
1868 }
1869
EmitThreadLocalInitFuncs(ArrayRef<std::pair<const VarDecl *,llvm::GlobalVariable * >> Decls,llvm::Function * InitFunc)1870 void ItaniumCXXABI::EmitThreadLocalInitFuncs(
1871 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *> > Decls,
1872 llvm::Function *InitFunc) {
1873 for (unsigned I = 0, N = Decls.size(); I != N; ++I) {
1874 const VarDecl *VD = Decls[I].first;
1875 llvm::GlobalVariable *Var = Decls[I].second;
1876
1877 // Mangle the name for the thread_local initialization function.
1878 SmallString<256> InitFnName;
1879 {
1880 llvm::raw_svector_ostream Out(InitFnName);
1881 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
1882 Out.flush();
1883 }
1884
1885 // If we have a definition for the variable, emit the initialization
1886 // function as an alias to the global Init function (if any). Otherwise,
1887 // produce a declaration of the initialization function.
1888 llvm::GlobalValue *Init = nullptr;
1889 bool InitIsInitFunc = false;
1890 if (VD->hasDefinition()) {
1891 InitIsInitFunc = true;
1892 if (InitFunc)
1893 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
1894 InitFunc);
1895 } else {
1896 // Emit a weak global function referring to the initialization function.
1897 // This function will not exist if the TU defining the thread_local
1898 // variable in question does not need any dynamic initialization for
1899 // its thread_local variables.
1900 llvm::FunctionType *FnTy = llvm::FunctionType::get(CGM.VoidTy, false);
1901 Init = llvm::Function::Create(
1902 FnTy, llvm::GlobalVariable::ExternalWeakLinkage, InitFnName.str(),
1903 &CGM.getModule());
1904 }
1905
1906 if (Init)
1907 Init->setVisibility(Var->getVisibility());
1908
1909 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Var);
1910 llvm::LLVMContext &Context = CGM.getModule().getContext();
1911 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
1912 CGBuilderTy Builder(Entry);
1913 if (InitIsInitFunc) {
1914 if (Init)
1915 Builder.CreateCall(Init);
1916 } else {
1917 // Don't know whether we have an init function. Call it if it exists.
1918 llvm::Value *Have = Builder.CreateIsNotNull(Init);
1919 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1920 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
1921 Builder.CreateCondBr(Have, InitBB, ExitBB);
1922
1923 Builder.SetInsertPoint(InitBB);
1924 Builder.CreateCall(Init);
1925 Builder.CreateBr(ExitBB);
1926
1927 Builder.SetInsertPoint(ExitBB);
1928 }
1929
1930 // For a reference, the result of the wrapper function is a pointer to
1931 // the referenced object.
1932 llvm::Value *Val = Var;
1933 if (VD->getType()->isReferenceType()) {
1934 llvm::LoadInst *LI = Builder.CreateLoad(Val);
1935 LI->setAlignment(CGM.getContext().getDeclAlign(VD).getQuantity());
1936 Val = LI;
1937 }
1938
1939 Builder.CreateRet(Val);
1940 }
1941 }
1942
EmitThreadLocalVarDeclLValue(CodeGenFunction & CGF,const VarDecl * VD,QualType LValType)1943 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
1944 const VarDecl *VD,
1945 QualType LValType) {
1946 QualType T = VD->getType();
1947 llvm::Type *Ty = CGF.getTypes().ConvertTypeForMem(T);
1948 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD, Ty);
1949 llvm::Function *Wrapper =
1950 getOrCreateThreadLocalWrapper(VD, cast<llvm::GlobalVariable>(Val));
1951
1952 Val = CGF.Builder.CreateCall(Wrapper);
1953
1954 LValue LV;
1955 if (VD->getType()->isReferenceType())
1956 LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType);
1957 else
1958 LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD));
1959 // FIXME: need setObjCGCLValueClass?
1960 return LV;
1961 }
1962
1963 /// Return whether the given global decl needs a VTT parameter, which it does
1964 /// if it's a base constructor or destructor with virtual bases.
NeedsVTTParameter(GlobalDecl GD)1965 bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
1966 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
1967
1968 // We don't have any virtual bases, just return early.
1969 if (!MD->getParent()->getNumVBases())
1970 return false;
1971
1972 // Check if we have a base constructor.
1973 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
1974 return true;
1975
1976 // Check if we have a base destructor.
1977 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
1978 return true;
1979
1980 return false;
1981 }
1982
1983 namespace {
1984 class ItaniumRTTIBuilder {
1985 CodeGenModule &CGM; // Per-module state.
1986 llvm::LLVMContext &VMContext;
1987 const ItaniumCXXABI &CXXABI; // Per-module state.
1988
1989 /// Fields - The fields of the RTTI descriptor currently being built.
1990 SmallVector<llvm::Constant *, 16> Fields;
1991
1992 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
1993 llvm::GlobalVariable *
1994 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
1995
1996 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
1997 /// descriptor of the given type.
1998 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
1999
2000 /// BuildVTablePointer - Build the vtable pointer for the given type.
2001 void BuildVTablePointer(const Type *Ty);
2002
2003 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2004 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
2005 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
2006
2007 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2008 /// classes with bases that do not satisfy the abi::__si_class_type_info
2009 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
2010 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
2011
2012 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
2013 /// for pointer types.
2014 void BuildPointerTypeInfo(QualType PointeeTy);
2015
2016 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
2017 /// type_info for an object type.
2018 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
2019
2020 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2021 /// struct, used for member pointer types.
2022 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
2023
2024 public:
ItaniumRTTIBuilder(const ItaniumCXXABI & ABI)2025 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
2026 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
2027
2028 // Pointer type info flags.
2029 enum {
2030 /// PTI_Const - Type has const qualifier.
2031 PTI_Const = 0x1,
2032
2033 /// PTI_Volatile - Type has volatile qualifier.
2034 PTI_Volatile = 0x2,
2035
2036 /// PTI_Restrict - Type has restrict qualifier.
2037 PTI_Restrict = 0x4,
2038
2039 /// PTI_Incomplete - Type is incomplete.
2040 PTI_Incomplete = 0x8,
2041
2042 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
2043 /// (in pointer to member).
2044 PTI_ContainingClassIncomplete = 0x10
2045 };
2046
2047 // VMI type info flags.
2048 enum {
2049 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
2050 VMI_NonDiamondRepeat = 0x1,
2051
2052 /// VMI_DiamondShaped - Class is diamond shaped.
2053 VMI_DiamondShaped = 0x2
2054 };
2055
2056 // Base class type info flags.
2057 enum {
2058 /// BCTI_Virtual - Base class is virtual.
2059 BCTI_Virtual = 0x1,
2060
2061 /// BCTI_Public - Base class is public.
2062 BCTI_Public = 0x2
2063 };
2064
2065 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
2066 ///
2067 /// \param Force - true to force the creation of this RTTI value
2068 llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false);
2069 };
2070 }
2071
GetAddrOfTypeName(QualType Ty,llvm::GlobalVariable::LinkageTypes Linkage)2072 llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
2073 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
2074 SmallString<256> OutName;
2075 llvm::raw_svector_ostream Out(OutName);
2076 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
2077 Out.flush();
2078 StringRef Name = OutName.str();
2079
2080 // We know that the mangled name of the type starts at index 4 of the
2081 // mangled name of the typename, so we can just index into it in order to
2082 // get the mangled name of the type.
2083 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
2084 Name.substr(4));
2085
2086 llvm::GlobalVariable *GV =
2087 CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage);
2088
2089 GV->setInitializer(Init);
2090
2091 return GV;
2092 }
2093
2094 llvm::Constant *
GetAddrOfExternalRTTIDescriptor(QualType Ty)2095 ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
2096 // Mangle the RTTI name.
2097 SmallString<256> OutName;
2098 llvm::raw_svector_ostream Out(OutName);
2099 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2100 Out.flush();
2101 StringRef Name = OutName.str();
2102
2103 // Look for an existing global.
2104 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
2105
2106 if (!GV) {
2107 // Create a new global variable.
2108 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2109 /*Constant=*/true,
2110 llvm::GlobalValue::ExternalLinkage, nullptr,
2111 Name);
2112 }
2113
2114 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2115 }
2116
2117 /// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
2118 /// info for that type is defined in the standard library.
TypeInfoIsInStandardLibrary(const BuiltinType * Ty)2119 static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
2120 // Itanium C++ ABI 2.9.2:
2121 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
2122 // the run-time support library. Specifically, the run-time support
2123 // library should contain type_info objects for the types X, X* and
2124 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
2125 // unsigned char, signed char, short, unsigned short, int, unsigned int,
2126 // long, unsigned long, long long, unsigned long long, float, double,
2127 // long double, char16_t, char32_t, and the IEEE 754r decimal and
2128 // half-precision floating point types.
2129 switch (Ty->getKind()) {
2130 case BuiltinType::Void:
2131 case BuiltinType::NullPtr:
2132 case BuiltinType::Bool:
2133 case BuiltinType::WChar_S:
2134 case BuiltinType::WChar_U:
2135 case BuiltinType::Char_U:
2136 case BuiltinType::Char_S:
2137 case BuiltinType::UChar:
2138 case BuiltinType::SChar:
2139 case BuiltinType::Short:
2140 case BuiltinType::UShort:
2141 case BuiltinType::Int:
2142 case BuiltinType::UInt:
2143 case BuiltinType::Long:
2144 case BuiltinType::ULong:
2145 case BuiltinType::LongLong:
2146 case BuiltinType::ULongLong:
2147 case BuiltinType::Half:
2148 case BuiltinType::Float:
2149 case BuiltinType::Double:
2150 case BuiltinType::LongDouble:
2151 case BuiltinType::Char16:
2152 case BuiltinType::Char32:
2153 case BuiltinType::Int128:
2154 case BuiltinType::UInt128:
2155 case BuiltinType::OCLImage1d:
2156 case BuiltinType::OCLImage1dArray:
2157 case BuiltinType::OCLImage1dBuffer:
2158 case BuiltinType::OCLImage2d:
2159 case BuiltinType::OCLImage2dArray:
2160 case BuiltinType::OCLImage3d:
2161 case BuiltinType::OCLSampler:
2162 case BuiltinType::OCLEvent:
2163 return true;
2164
2165 case BuiltinType::Dependent:
2166 #define BUILTIN_TYPE(Id, SingletonId)
2167 #define PLACEHOLDER_TYPE(Id, SingletonId) \
2168 case BuiltinType::Id:
2169 #include "clang/AST/BuiltinTypes.def"
2170 llvm_unreachable("asking for RRTI for a placeholder type!");
2171
2172 case BuiltinType::ObjCId:
2173 case BuiltinType::ObjCClass:
2174 case BuiltinType::ObjCSel:
2175 llvm_unreachable("FIXME: Objective-C types are unsupported!");
2176 }
2177
2178 llvm_unreachable("Invalid BuiltinType Kind!");
2179 }
2180
TypeInfoIsInStandardLibrary(const PointerType * PointerTy)2181 static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
2182 QualType PointeeTy = PointerTy->getPointeeType();
2183 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
2184 if (!BuiltinTy)
2185 return false;
2186
2187 // Check the qualifiers.
2188 Qualifiers Quals = PointeeTy.getQualifiers();
2189 Quals.removeConst();
2190
2191 if (!Quals.empty())
2192 return false;
2193
2194 return TypeInfoIsInStandardLibrary(BuiltinTy);
2195 }
2196
2197 /// IsStandardLibraryRTTIDescriptor - Returns whether the type
2198 /// information for the given type exists in the standard library.
IsStandardLibraryRTTIDescriptor(QualType Ty)2199 static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
2200 // Type info for builtin types is defined in the standard library.
2201 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
2202 return TypeInfoIsInStandardLibrary(BuiltinTy);
2203
2204 // Type info for some pointer types to builtin types is defined in the
2205 // standard library.
2206 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2207 return TypeInfoIsInStandardLibrary(PointerTy);
2208
2209 return false;
2210 }
2211
2212 /// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
2213 /// the given type exists somewhere else, and that we should not emit the type
2214 /// information in this translation unit. Assumes that it is not a
2215 /// standard-library type.
ShouldUseExternalRTTIDescriptor(CodeGenModule & CGM,QualType Ty)2216 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
2217 QualType Ty) {
2218 ASTContext &Context = CGM.getContext();
2219
2220 // If RTTI is disabled, assume it might be disabled in the
2221 // translation unit that defines any potential key function, too.
2222 if (!Context.getLangOpts().RTTI) return false;
2223
2224 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2225 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
2226 if (!RD->hasDefinition())
2227 return false;
2228
2229 if (!RD->isDynamicClass())
2230 return false;
2231
2232 // FIXME: this may need to be reconsidered if the key function
2233 // changes.
2234 return CGM.getVTables().isVTableExternal(RD);
2235 }
2236
2237 return false;
2238 }
2239
2240 /// IsIncompleteClassType - Returns whether the given record type is incomplete.
IsIncompleteClassType(const RecordType * RecordTy)2241 static bool IsIncompleteClassType(const RecordType *RecordTy) {
2242 return !RecordTy->getDecl()->isCompleteDefinition();
2243 }
2244
2245 /// ContainsIncompleteClassType - Returns whether the given type contains an
2246 /// incomplete class type. This is true if
2247 ///
2248 /// * The given type is an incomplete class type.
2249 /// * The given type is a pointer type whose pointee type contains an
2250 /// incomplete class type.
2251 /// * The given type is a member pointer type whose class is an incomplete
2252 /// class type.
2253 /// * The given type is a member pointer type whoise pointee type contains an
2254 /// incomplete class type.
2255 /// is an indirect or direct pointer to an incomplete class type.
ContainsIncompleteClassType(QualType Ty)2256 static bool ContainsIncompleteClassType(QualType Ty) {
2257 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
2258 if (IsIncompleteClassType(RecordTy))
2259 return true;
2260 }
2261
2262 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
2263 return ContainsIncompleteClassType(PointerTy->getPointeeType());
2264
2265 if (const MemberPointerType *MemberPointerTy =
2266 dyn_cast<MemberPointerType>(Ty)) {
2267 // Check if the class type is incomplete.
2268 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
2269 if (IsIncompleteClassType(ClassType))
2270 return true;
2271
2272 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
2273 }
2274
2275 return false;
2276 }
2277
2278 // CanUseSingleInheritance - Return whether the given record decl has a "single,
2279 // public, non-virtual base at offset zero (i.e. the derived class is dynamic
2280 // iff the base is)", according to Itanium C++ ABI, 2.95p6b.
CanUseSingleInheritance(const CXXRecordDecl * RD)2281 static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
2282 // Check the number of bases.
2283 if (RD->getNumBases() != 1)
2284 return false;
2285
2286 // Get the base.
2287 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
2288
2289 // Check that the base is not virtual.
2290 if (Base->isVirtual())
2291 return false;
2292
2293 // Check that the base is public.
2294 if (Base->getAccessSpecifier() != AS_public)
2295 return false;
2296
2297 // Check that the class is dynamic iff the base is.
2298 const CXXRecordDecl *BaseDecl =
2299 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2300 if (!BaseDecl->isEmpty() &&
2301 BaseDecl->isDynamicClass() != RD->isDynamicClass())
2302 return false;
2303
2304 return true;
2305 }
2306
BuildVTablePointer(const Type * Ty)2307 void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
2308 // abi::__class_type_info.
2309 static const char * const ClassTypeInfo =
2310 "_ZTVN10__cxxabiv117__class_type_infoE";
2311 // abi::__si_class_type_info.
2312 static const char * const SIClassTypeInfo =
2313 "_ZTVN10__cxxabiv120__si_class_type_infoE";
2314 // abi::__vmi_class_type_info.
2315 static const char * const VMIClassTypeInfo =
2316 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
2317
2318 const char *VTableName = nullptr;
2319
2320 switch (Ty->getTypeClass()) {
2321 #define TYPE(Class, Base)
2322 #define ABSTRACT_TYPE(Class, Base)
2323 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2324 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2325 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2326 #include "clang/AST/TypeNodes.def"
2327 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2328
2329 case Type::LValueReference:
2330 case Type::RValueReference:
2331 llvm_unreachable("References shouldn't get here");
2332
2333 case Type::Auto:
2334 llvm_unreachable("Undeduced auto type shouldn't get here");
2335
2336 case Type::Builtin:
2337 // GCC treats vector and complex types as fundamental types.
2338 case Type::Vector:
2339 case Type::ExtVector:
2340 case Type::Complex:
2341 case Type::Atomic:
2342 // FIXME: GCC treats block pointers as fundamental types?!
2343 case Type::BlockPointer:
2344 // abi::__fundamental_type_info.
2345 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
2346 break;
2347
2348 case Type::ConstantArray:
2349 case Type::IncompleteArray:
2350 case Type::VariableArray:
2351 // abi::__array_type_info.
2352 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
2353 break;
2354
2355 case Type::FunctionNoProto:
2356 case Type::FunctionProto:
2357 // abi::__function_type_info.
2358 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
2359 break;
2360
2361 case Type::Enum:
2362 // abi::__enum_type_info.
2363 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
2364 break;
2365
2366 case Type::Record: {
2367 const CXXRecordDecl *RD =
2368 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2369
2370 if (!RD->hasDefinition() || !RD->getNumBases()) {
2371 VTableName = ClassTypeInfo;
2372 } else if (CanUseSingleInheritance(RD)) {
2373 VTableName = SIClassTypeInfo;
2374 } else {
2375 VTableName = VMIClassTypeInfo;
2376 }
2377
2378 break;
2379 }
2380
2381 case Type::ObjCObject:
2382 // Ignore protocol qualifiers.
2383 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
2384
2385 // Handle id and Class.
2386 if (isa<BuiltinType>(Ty)) {
2387 VTableName = ClassTypeInfo;
2388 break;
2389 }
2390
2391 assert(isa<ObjCInterfaceType>(Ty));
2392 // Fall through.
2393
2394 case Type::ObjCInterface:
2395 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
2396 VTableName = SIClassTypeInfo;
2397 } else {
2398 VTableName = ClassTypeInfo;
2399 }
2400 break;
2401
2402 case Type::ObjCObjectPointer:
2403 case Type::Pointer:
2404 // abi::__pointer_type_info.
2405 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
2406 break;
2407
2408 case Type::MemberPointer:
2409 // abi::__pointer_to_member_type_info.
2410 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
2411 break;
2412 }
2413
2414 llvm::Constant *VTable =
2415 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
2416
2417 llvm::Type *PtrDiffTy =
2418 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
2419
2420 // The vtable address point is 2.
2421 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
2422 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Two);
2423 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
2424
2425 Fields.push_back(VTable);
2426 }
2427
2428 /// \brief Return the linkage that the type info and type info name constants
2429 /// should have for the given type.
getTypeInfoLinkage(CodeGenModule & CGM,QualType Ty)2430 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
2431 QualType Ty) {
2432 // Itanium C++ ABI 2.9.5p7:
2433 // In addition, it and all of the intermediate abi::__pointer_type_info
2434 // structs in the chain down to the abi::__class_type_info for the
2435 // incomplete class type must be prevented from resolving to the
2436 // corresponding type_info structs for the complete class type, possibly
2437 // by making them local static objects. Finally, a dummy class RTTI is
2438 // generated for the incomplete type that will not resolve to the final
2439 // complete class RTTI (because the latter need not exist), possibly by
2440 // making it a local static object.
2441 if (ContainsIncompleteClassType(Ty))
2442 return llvm::GlobalValue::InternalLinkage;
2443
2444 switch (Ty->getLinkage()) {
2445 case NoLinkage:
2446 case InternalLinkage:
2447 case UniqueExternalLinkage:
2448 return llvm::GlobalValue::InternalLinkage;
2449
2450 case VisibleNoLinkage:
2451 case ExternalLinkage:
2452 if (!CGM.getLangOpts().RTTI) {
2453 // RTTI is not enabled, which means that this type info struct is going
2454 // to be used for exception handling. Give it linkonce_odr linkage.
2455 return llvm::GlobalValue::LinkOnceODRLinkage;
2456 }
2457
2458 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
2459 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2460 if (RD->hasAttr<WeakAttr>())
2461 return llvm::GlobalValue::WeakODRLinkage;
2462 if (RD->isDynamicClass())
2463 return CGM.getVTableLinkage(RD);
2464 }
2465
2466 return llvm::GlobalValue::LinkOnceODRLinkage;
2467 }
2468
2469 llvm_unreachable("Invalid linkage!");
2470 }
2471
BuildTypeInfo(QualType Ty,bool Force)2472 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
2473 // We want to operate on the canonical type.
2474 Ty = CGM.getContext().getCanonicalType(Ty);
2475
2476 // Check if we've already emitted an RTTI descriptor for this type.
2477 SmallString<256> OutName;
2478 llvm::raw_svector_ostream Out(OutName);
2479 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
2480 Out.flush();
2481 StringRef Name = OutName.str();
2482
2483 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
2484 if (OldGV && !OldGV->isDeclaration()) {
2485 assert(!OldGV->hasAvailableExternallyLinkage() &&
2486 "available_externally typeinfos not yet implemented");
2487
2488 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
2489 }
2490
2491 // Check if there is already an external RTTI descriptor for this type.
2492 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty);
2493 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty)))
2494 return GetAddrOfExternalRTTIDescriptor(Ty);
2495
2496 // Emit the standard library with external linkage.
2497 llvm::GlobalVariable::LinkageTypes Linkage;
2498 if (IsStdLib)
2499 Linkage = llvm::GlobalValue::ExternalLinkage;
2500 else
2501 Linkage = getTypeInfoLinkage(CGM, Ty);
2502
2503 // Add the vtable pointer.
2504 BuildVTablePointer(cast<Type>(Ty));
2505
2506 // And the name.
2507 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
2508 llvm::Constant *TypeNameField;
2509
2510 // If we're supposed to demote the visibility, be sure to set a flag
2511 // to use a string comparison for type_info comparisons.
2512 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
2513 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
2514 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
2515 // The flag is the sign bit, which on ARM64 is defined to be clear
2516 // for global pointers. This is very ARM64-specific.
2517 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
2518 llvm::Constant *flag =
2519 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
2520 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
2521 TypeNameField =
2522 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
2523 } else {
2524 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
2525 }
2526 Fields.push_back(TypeNameField);
2527
2528 switch (Ty->getTypeClass()) {
2529 #define TYPE(Class, Base)
2530 #define ABSTRACT_TYPE(Class, Base)
2531 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
2532 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2533 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
2534 #include "clang/AST/TypeNodes.def"
2535 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
2536
2537 // GCC treats vector types as fundamental types.
2538 case Type::Builtin:
2539 case Type::Vector:
2540 case Type::ExtVector:
2541 case Type::Complex:
2542 case Type::BlockPointer:
2543 // Itanium C++ ABI 2.9.5p4:
2544 // abi::__fundamental_type_info adds no data members to std::type_info.
2545 break;
2546
2547 case Type::LValueReference:
2548 case Type::RValueReference:
2549 llvm_unreachable("References shouldn't get here");
2550
2551 case Type::Auto:
2552 llvm_unreachable("Undeduced auto type shouldn't get here");
2553
2554 case Type::ConstantArray:
2555 case Type::IncompleteArray:
2556 case Type::VariableArray:
2557 // Itanium C++ ABI 2.9.5p5:
2558 // abi::__array_type_info adds no data members to std::type_info.
2559 break;
2560
2561 case Type::FunctionNoProto:
2562 case Type::FunctionProto:
2563 // Itanium C++ ABI 2.9.5p5:
2564 // abi::__function_type_info adds no data members to std::type_info.
2565 break;
2566
2567 case Type::Enum:
2568 // Itanium C++ ABI 2.9.5p5:
2569 // abi::__enum_type_info adds no data members to std::type_info.
2570 break;
2571
2572 case Type::Record: {
2573 const CXXRecordDecl *RD =
2574 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
2575 if (!RD->hasDefinition() || !RD->getNumBases()) {
2576 // We don't need to emit any fields.
2577 break;
2578 }
2579
2580 if (CanUseSingleInheritance(RD))
2581 BuildSIClassTypeInfo(RD);
2582 else
2583 BuildVMIClassTypeInfo(RD);
2584
2585 break;
2586 }
2587
2588 case Type::ObjCObject:
2589 case Type::ObjCInterface:
2590 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
2591 break;
2592
2593 case Type::ObjCObjectPointer:
2594 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
2595 break;
2596
2597 case Type::Pointer:
2598 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
2599 break;
2600
2601 case Type::MemberPointer:
2602 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
2603 break;
2604
2605 case Type::Atomic:
2606 // No fields, at least for the moment.
2607 break;
2608 }
2609
2610 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
2611
2612 llvm::GlobalVariable *GV =
2613 new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
2614 /*Constant=*/true, Linkage, Init, Name);
2615
2616 // If there's already an old global variable, replace it with the new one.
2617 if (OldGV) {
2618 GV->takeName(OldGV);
2619 llvm::Constant *NewPtr =
2620 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
2621 OldGV->replaceAllUsesWith(NewPtr);
2622 OldGV->eraseFromParent();
2623 }
2624
2625 // The Itanium ABI specifies that type_info objects must be globally
2626 // unique, with one exception: if the type is an incomplete class
2627 // type or a (possibly indirect) pointer to one. That exception
2628 // affects the general case of comparing type_info objects produced
2629 // by the typeid operator, which is why the comparison operators on
2630 // std::type_info generally use the type_info name pointers instead
2631 // of the object addresses. However, the language's built-in uses
2632 // of RTTI generally require class types to be complete, even when
2633 // manipulating pointers to those class types. This allows the
2634 // implementation of dynamic_cast to rely on address equality tests,
2635 // which is much faster.
2636
2637 // All of this is to say that it's important that both the type_info
2638 // object and the type_info name be uniqued when weakly emitted.
2639
2640 // Give the type_info object and name the formal visibility of the
2641 // type itself.
2642 llvm::GlobalValue::VisibilityTypes llvmVisibility;
2643 if (llvm::GlobalValue::isLocalLinkage(Linkage))
2644 // If the linkage is local, only default visibility makes sense.
2645 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
2646 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden)
2647 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
2648 else
2649 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
2650 TypeName->setVisibility(llvmVisibility);
2651 GV->setVisibility(llvmVisibility);
2652
2653 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2654 }
2655
2656 /// ComputeQualifierFlags - Compute the pointer type info flags from the
2657 /// given qualifier.
ComputeQualifierFlags(Qualifiers Quals)2658 static unsigned ComputeQualifierFlags(Qualifiers Quals) {
2659 unsigned Flags = 0;
2660
2661 if (Quals.hasConst())
2662 Flags |= ItaniumRTTIBuilder::PTI_Const;
2663 if (Quals.hasVolatile())
2664 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
2665 if (Quals.hasRestrict())
2666 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
2667
2668 return Flags;
2669 }
2670
2671 /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
2672 /// for the given Objective-C object type.
BuildObjCObjectTypeInfo(const ObjCObjectType * OT)2673 void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
2674 // Drop qualifiers.
2675 const Type *T = OT->getBaseType().getTypePtr();
2676 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
2677
2678 // The builtin types are abi::__class_type_infos and don't require
2679 // extra fields.
2680 if (isa<BuiltinType>(T)) return;
2681
2682 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
2683 ObjCInterfaceDecl *Super = Class->getSuperClass();
2684
2685 // Root classes are also __class_type_info.
2686 if (!Super) return;
2687
2688 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
2689
2690 // Everything else is single inheritance.
2691 llvm::Constant *BaseTypeInfo =
2692 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
2693 Fields.push_back(BaseTypeInfo);
2694 }
2695
2696 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
2697 /// inheritance, according to the Itanium C++ ABI, 2.95p6b.
BuildSIClassTypeInfo(const CXXRecordDecl * RD)2698 void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
2699 // Itanium C++ ABI 2.9.5p6b:
2700 // It adds to abi::__class_type_info a single member pointing to the
2701 // type_info structure for the base type,
2702 llvm::Constant *BaseTypeInfo =
2703 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
2704 Fields.push_back(BaseTypeInfo);
2705 }
2706
2707 namespace {
2708 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
2709 /// a class hierarchy.
2710 struct SeenBases {
2711 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
2712 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
2713 };
2714 }
2715
2716 /// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
2717 /// abi::__vmi_class_type_info.
2718 ///
ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier * Base,SeenBases & Bases)2719 static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
2720 SeenBases &Bases) {
2721
2722 unsigned Flags = 0;
2723
2724 const CXXRecordDecl *BaseDecl =
2725 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
2726
2727 if (Base->isVirtual()) {
2728 // Mark the virtual base as seen.
2729 if (!Bases.VirtualBases.insert(BaseDecl)) {
2730 // If this virtual base has been seen before, then the class is diamond
2731 // shaped.
2732 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
2733 } else {
2734 if (Bases.NonVirtualBases.count(BaseDecl))
2735 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2736 }
2737 } else {
2738 // Mark the non-virtual base as seen.
2739 if (!Bases.NonVirtualBases.insert(BaseDecl)) {
2740 // If this non-virtual base has been seen before, then the class has non-
2741 // diamond shaped repeated inheritance.
2742 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2743 } else {
2744 if (Bases.VirtualBases.count(BaseDecl))
2745 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
2746 }
2747 }
2748
2749 // Walk all bases.
2750 for (const auto &I : BaseDecl->bases())
2751 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2752
2753 return Flags;
2754 }
2755
ComputeVMIClassTypeInfoFlags(const CXXRecordDecl * RD)2756 static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
2757 unsigned Flags = 0;
2758 SeenBases Bases;
2759
2760 // Walk all bases.
2761 for (const auto &I : RD->bases())
2762 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
2763
2764 return Flags;
2765 }
2766
2767 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
2768 /// classes with bases that do not satisfy the abi::__si_class_type_info
2769 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
BuildVMIClassTypeInfo(const CXXRecordDecl * RD)2770 void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
2771 llvm::Type *UnsignedIntLTy =
2772 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2773
2774 // Itanium C++ ABI 2.9.5p6c:
2775 // __flags is a word with flags describing details about the class
2776 // structure, which may be referenced by using the __flags_masks
2777 // enumeration. These flags refer to both direct and indirect bases.
2778 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
2779 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2780
2781 // Itanium C++ ABI 2.9.5p6c:
2782 // __base_count is a word with the number of direct proper base class
2783 // descriptions that follow.
2784 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
2785
2786 if (!RD->getNumBases())
2787 return;
2788
2789 llvm::Type *LongLTy =
2790 CGM.getTypes().ConvertType(CGM.getContext().LongTy);
2791
2792 // Now add the base class descriptions.
2793
2794 // Itanium C++ ABI 2.9.5p6c:
2795 // __base_info[] is an array of base class descriptions -- one for every
2796 // direct proper base. Each description is of the type:
2797 //
2798 // struct abi::__base_class_type_info {
2799 // public:
2800 // const __class_type_info *__base_type;
2801 // long __offset_flags;
2802 //
2803 // enum __offset_flags_masks {
2804 // __virtual_mask = 0x1,
2805 // __public_mask = 0x2,
2806 // __offset_shift = 8
2807 // };
2808 // };
2809 for (const auto &Base : RD->bases()) {
2810 // The __base_type member points to the RTTI for the base type.
2811 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
2812
2813 const CXXRecordDecl *BaseDecl =
2814 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
2815
2816 int64_t OffsetFlags = 0;
2817
2818 // All but the lower 8 bits of __offset_flags are a signed offset.
2819 // For a non-virtual base, this is the offset in the object of the base
2820 // subobject. For a virtual base, this is the offset in the virtual table of
2821 // the virtual base offset for the virtual base referenced (negative).
2822 CharUnits Offset;
2823 if (Base.isVirtual())
2824 Offset =
2825 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
2826 else {
2827 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
2828 Offset = Layout.getBaseClassOffset(BaseDecl);
2829 };
2830
2831 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
2832
2833 // The low-order byte of __offset_flags contains flags, as given by the
2834 // masks from the enumeration __offset_flags_masks.
2835 if (Base.isVirtual())
2836 OffsetFlags |= BCTI_Virtual;
2837 if (Base.getAccessSpecifier() == AS_public)
2838 OffsetFlags |= BCTI_Public;
2839
2840 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags));
2841 }
2842 }
2843
2844 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
2845 /// used for pointer types.
BuildPointerTypeInfo(QualType PointeeTy)2846 void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
2847 Qualifiers Quals;
2848 QualType UnqualifiedPointeeTy =
2849 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2850
2851 // Itanium C++ ABI 2.9.5p7:
2852 // __flags is a flag word describing the cv-qualification and other
2853 // attributes of the type pointed to
2854 unsigned Flags = ComputeQualifierFlags(Quals);
2855
2856 // Itanium C++ ABI 2.9.5p7:
2857 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
2858 // incomplete class type, the incomplete target type flag is set.
2859 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
2860 Flags |= PTI_Incomplete;
2861
2862 llvm::Type *UnsignedIntLTy =
2863 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2864 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2865
2866 // Itanium C++ ABI 2.9.5p7:
2867 // __pointee is a pointer to the std::type_info derivation for the
2868 // unqualified type being pointed to.
2869 llvm::Constant *PointeeTypeInfo =
2870 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
2871 Fields.push_back(PointeeTypeInfo);
2872 }
2873
2874 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
2875 /// struct, used for member pointer types.
2876 void
BuildPointerToMemberTypeInfo(const MemberPointerType * Ty)2877 ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
2878 QualType PointeeTy = Ty->getPointeeType();
2879
2880 Qualifiers Quals;
2881 QualType UnqualifiedPointeeTy =
2882 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
2883
2884 // Itanium C++ ABI 2.9.5p7:
2885 // __flags is a flag word describing the cv-qualification and other
2886 // attributes of the type pointed to.
2887 unsigned Flags = ComputeQualifierFlags(Quals);
2888
2889 const RecordType *ClassType = cast<RecordType>(Ty->getClass());
2890
2891 // Itanium C++ ABI 2.9.5p7:
2892 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
2893 // incomplete class type, the incomplete target type flag is set.
2894 if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
2895 Flags |= PTI_Incomplete;
2896
2897 if (IsIncompleteClassType(ClassType))
2898 Flags |= PTI_ContainingClassIncomplete;
2899
2900 llvm::Type *UnsignedIntLTy =
2901 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
2902 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
2903
2904 // Itanium C++ ABI 2.9.5p7:
2905 // __pointee is a pointer to the std::type_info derivation for the
2906 // unqualified type being pointed to.
2907 llvm::Constant *PointeeTypeInfo =
2908 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy);
2909 Fields.push_back(PointeeTypeInfo);
2910
2911 // Itanium C++ ABI 2.9.5p9:
2912 // __context is a pointer to an abi::__class_type_info corresponding to the
2913 // class type containing the member pointed to
2914 // (e.g., the "A" in "int A::*").
2915 Fields.push_back(
2916 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
2917 }
2918
getAddrOfRTTIDescriptor(QualType Ty)2919 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
2920 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
2921 }
2922
EmitFundamentalRTTIDescriptor(QualType Type)2923 void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) {
2924 QualType PointerType = getContext().getPointerType(Type);
2925 QualType PointerTypeConst = getContext().getPointerType(Type.withConst());
2926 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true);
2927 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true);
2928 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true);
2929 }
2930
EmitFundamentalRTTIDescriptors()2931 void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() {
2932 QualType FundamentalTypes[] = {
2933 getContext().VoidTy, getContext().NullPtrTy,
2934 getContext().BoolTy, getContext().WCharTy,
2935 getContext().CharTy, getContext().UnsignedCharTy,
2936 getContext().SignedCharTy, getContext().ShortTy,
2937 getContext().UnsignedShortTy, getContext().IntTy,
2938 getContext().UnsignedIntTy, getContext().LongTy,
2939 getContext().UnsignedLongTy, getContext().LongLongTy,
2940 getContext().UnsignedLongLongTy, getContext().HalfTy,
2941 getContext().FloatTy, getContext().DoubleTy,
2942 getContext().LongDoubleTy, getContext().Char16Ty,
2943 getContext().Char32Ty,
2944 };
2945 for (const QualType &FundamentalType : FundamentalTypes)
2946 EmitFundamentalRTTIDescriptor(FundamentalType);
2947 }
2948
2949 /// What sort of uniqueness rules should we use for the RTTI for the
2950 /// given type?
classifyRTTIUniqueness(QualType CanTy,llvm::GlobalValue::LinkageTypes Linkage) const2951 ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
2952 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
2953 if (shouldRTTIBeUnique())
2954 return RUK_Unique;
2955
2956 // It's only necessary for linkonce_odr or weak_odr linkage.
2957 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
2958 Linkage != llvm::GlobalValue::WeakODRLinkage)
2959 return RUK_Unique;
2960
2961 // It's only necessary with default visibility.
2962 if (CanTy->getVisibility() != DefaultVisibility)
2963 return RUK_Unique;
2964
2965 // If we're not required to publish this symbol, hide it.
2966 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
2967 return RUK_NonUniqueHidden;
2968
2969 // If we're required to publish this symbol, as we might be under an
2970 // explicit instantiation, leave it with default visibility but
2971 // enable string-comparisons.
2972 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
2973 return RUK_NonUniqueVisible;
2974 }
2975