clang 22.0.0git
ItaniumCXXABI.cpp
Go to the documentation of this file.
1//===------- ItaniumCXXABI.cpp - Emit LLVM Code from ASTs for a Module ----===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This provides C++ code generation targeting the Itanium C++ ABI. The class
10// in this file generates structures that follow the Itanium C++ ABI, which is
11// documented at:
12// https://itanium-cxx-abi.github.io/cxx-abi/abi.html
13// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html
14//
15// It also supports the closely-related ARM ABI, documented at:
16// https://developer.arm.com/documentation/ihi0041/g/
17//
18//===----------------------------------------------------------------------===//
19
20#include "CGCXXABI.h"
21#include "CGCleanup.h"
22#include "CGDebugInfo.h"
23#include "CGRecordLayout.h"
24#include "CGVTables.h"
25#include "CodeGenFunction.h"
26#include "CodeGenModule.h"
27#include "TargetInfo.h"
28#include "clang/AST/Attr.h"
29#include "clang/AST/Mangle.h"
30#include "clang/AST/StmtCXX.h"
31#include "clang/AST/Type.h"
33#include "llvm/IR/DataLayout.h"
34#include "llvm/IR/GlobalValue.h"
35#include "llvm/IR/Instructions.h"
36#include "llvm/IR/Intrinsics.h"
37#include "llvm/IR/Value.h"
38#include "llvm/Support/ScopedPrinter.h"
39
40#include <optional>
41
42using namespace clang;
43using namespace CodeGen;
44
45namespace {
46class ItaniumCXXABI : public CodeGen::CGCXXABI {
47 /// VTables - All the vtables which have been defined.
48 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
49
50 /// All the thread wrapper functions that have been used.
51 llvm::SmallVector<std::pair<const VarDecl *, llvm::Function *>, 8>
52 ThreadWrappers;
53
54protected:
55 bool UseARMMethodPtrABI;
56 bool UseARMGuardVarABI;
57 bool Use32BitVTableOffsetABI;
58
59 ItaniumMangleContext &getMangleContext() {
61 }
62
63public:
64 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
65 bool UseARMMethodPtrABI = false,
66 bool UseARMGuardVarABI = false) :
67 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
68 UseARMGuardVarABI(UseARMGuardVarABI),
69 Use32BitVTableOffsetABI(false) { }
70
71 bool classifyReturnType(CGFunctionInfo &FI) const override;
72
73 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
74 // If C++ prohibits us from making a copy, pass by address.
75 if (!RD->canPassInRegisters())
76 return RAA_Indirect;
77 return RAA_Default;
78 }
79
80 bool isThisCompleteObject(GlobalDecl GD) const override {
81 // The Itanium ABI has separate complete-object vs. base-object
82 // variants of both constructors and destructors.
84 switch (GD.getDtorType()) {
85 case Dtor_Complete:
86 case Dtor_Deleting:
87 return true;
88
89 case Dtor_Base:
90 return false;
91
92 case Dtor_Comdat:
93 llvm_unreachable("emitting dtor comdat as function?");
94 case Dtor_Unified:
95 llvm_unreachable("emitting unified dtor as function?");
97 llvm_unreachable("unexpected dtor kind for this ABI");
98 }
99 llvm_unreachable("bad dtor kind");
100 }
102 switch (GD.getCtorType()) {
103 case Ctor_Complete:
104 return true;
105
106 case Ctor_Base:
107 return false;
108
111 llvm_unreachable("closure ctors in Itanium ABI?");
112
113 case Ctor_Comdat:
114 llvm_unreachable("emitting ctor comdat as function?");
115
116 case Ctor_Unified:
117 llvm_unreachable("emitting unified ctor as function?");
118 }
119 llvm_unreachable("bad dtor kind");
120 }
121
122 // No other kinds.
123 return false;
124 }
125
126 bool isZeroInitializable(const MemberPointerType *MPT) override;
127
128 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
129
130 CGCallee
131 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
132 const Expr *E,
133 Address This,
134 llvm::Value *&ThisPtrForCall,
135 llvm::Value *MemFnPtr,
136 const MemberPointerType *MPT) override;
137
138 llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
139 Address Base, llvm::Value *MemPtr,
140 const MemberPointerType *MPT,
141 bool IsInBounds) override;
142
143 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
144 const CastExpr *E,
145 llvm::Value *Src) override;
146 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
147 llvm::Constant *Src) override;
148
149 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
150
151 llvm::Constant *EmitMemberFunctionPointer(const CXXMethodDecl *MD) override;
152 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
153 CharUnits offset) override;
154 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
155 llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
156 CharUnits ThisAdjustment);
157
158 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
159 llvm::Value *L, llvm::Value *R,
160 const MemberPointerType *MPT,
161 bool Inequality) override;
162
163 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
164 llvm::Value *Addr,
165 const MemberPointerType *MPT) override;
166
167 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
168 Address Ptr, QualType ElementType,
169 const CXXDestructorDecl *Dtor) override;
170
171 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
172 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
173
174 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
175
176 llvm::CallInst *
177 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
178 llvm::Value *Exn) override;
179
180 void EmitFundamentalRTTIDescriptors(const CXXRecordDecl *RD);
181 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
182 CatchTypeInfo
183 getAddrOfCXXCatchHandlerType(QualType Ty,
184 QualType CatchHandlerType) override {
185 return CatchTypeInfo{getAddrOfRTTIDescriptor(Ty), 0};
186 }
187
188 bool shouldTypeidBeNullChecked(QualType SrcRecordTy) override;
189 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
190 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
191 Address ThisPtr,
192 llvm::Type *StdTypeInfoPtrTy) override;
193
194 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
195 QualType SrcRecordTy) override;
196
197 /// Determine whether we know that all instances of type RecordTy will have
198 /// the same vtable pointer values, that is distinct from all other vtable
199 /// pointers. While this is required by the Itanium ABI, it doesn't happen in
200 /// practice in some cases due to language extensions.
201 bool hasUniqueVTablePointer(QualType RecordTy) {
202 const CXXRecordDecl *RD = RecordTy->getAsCXXRecordDecl();
203
204 // Under -fapple-kext, multiple definitions of the same vtable may be
205 // emitted.
206 if (!CGM.getCodeGenOpts().AssumeUniqueVTables ||
207 getContext().getLangOpts().AppleKext)
208 return false;
209
210 // If the type_info* would be null, the vtable might be merged with that of
211 // another type.
212 if (!CGM.shouldEmitRTTI())
213 return false;
214
215 // If there's only one definition of the vtable in the program, it has a
216 // unique address.
217 if (!llvm::GlobalValue::isWeakForLinker(CGM.getVTableLinkage(RD)))
218 return true;
219
220 // Even if there are multiple definitions of the vtable, they are required
221 // by the ABI to use the same symbol name, so should be merged at load
222 // time. However, if the class has hidden visibility, there can be
223 // different versions of the class in different modules, and the ABI
224 // library might treat them as being the same.
225 if (CGM.GetLLVMVisibility(RD->getVisibility()) !=
226 llvm::GlobalValue::DefaultVisibility)
227 return false;
228
229 return true;
230 }
231
232 bool shouldEmitExactDynamicCast(QualType DestRecordTy) override {
233 return hasUniqueVTablePointer(DestRecordTy);
234 }
235
236 std::optional<ExactDynamicCastInfo>
237 getExactDynamicCastInfo(QualType SrcRecordTy, QualType DestTy,
238 QualType DestRecordTy) override;
239
240 llvm::Value *emitDynamicCastCall(CodeGenFunction &CGF, Address Value,
241 QualType SrcRecordTy, QualType DestTy,
242 QualType DestRecordTy,
243 llvm::BasicBlock *CastEnd) override;
244
245 llvm::Value *emitExactDynamicCast(CodeGenFunction &CGF, Address ThisAddr,
246 QualType SrcRecordTy, QualType DestTy,
247 QualType DestRecordTy,
248 const ExactDynamicCastInfo &CastInfo,
249 llvm::BasicBlock *CastSuccess,
250 llvm::BasicBlock *CastFail) override;
251
252 llvm::Value *emitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
253 QualType SrcRecordTy) override;
254
255 bool EmitBadCastCall(CodeGenFunction &CGF) override;
256
257 llvm::Value *
258 GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
259 const CXXRecordDecl *ClassDecl,
260 const CXXRecordDecl *BaseClassDecl) override;
261
262 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
263
264 AddedStructorArgCounts
265 buildStructorSignature(GlobalDecl GD,
266 SmallVectorImpl<CanQualType> &ArgTys) override;
267
268 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
269 CXXDtorType DT) const override {
270 // Itanium does not emit any destructor variant as an inline thunk.
271 // Delegating may occur as an optimization, but all variants are either
272 // emitted with external linkage or as linkonce if they are inline and used.
273 return false;
274 }
275
276 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
277
278 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
279 FunctionArgList &Params) override;
280
281 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
282
283 AddedStructorArgs getImplicitConstructorArgs(CodeGenFunction &CGF,
284 const CXXConstructorDecl *D,
286 bool ForVirtualBase,
287 bool Delegating) override;
288
289 llvm::Value *getCXXDestructorImplicitParam(CodeGenFunction &CGF,
290 const CXXDestructorDecl *DD,
292 bool ForVirtualBase,
293 bool Delegating) override;
294
295 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
296 CXXDtorType Type, bool ForVirtualBase,
297 bool Delegating, Address This,
298 QualType ThisTy) override;
299
300 void emitVTableDefinitions(CodeGenVTables &CGVT,
301 const CXXRecordDecl *RD) override;
302
303 bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
304 CodeGenFunction::VPtr Vptr) override;
305
306 bool doStructorsInitializeVPtrs(const CXXRecordDecl *VTableClass) override {
307 return true;
308 }
309
310 llvm::Constant *
311 getVTableAddressPoint(BaseSubobject Base,
312 const CXXRecordDecl *VTableClass) override;
313
314 llvm::Value *getVTableAddressPointInStructor(
315 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
316 BaseSubobject Base, const CXXRecordDecl *NearestVBase) override;
317
318 llvm::Value *getVTableAddressPointInStructorWithVTT(
319 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
320 BaseSubobject Base, const CXXRecordDecl *NearestVBase);
321
322 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
323 CharUnits VPtrOffset) override;
324
325 CGCallee getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
326 Address This, llvm::Type *Ty,
327 SourceLocation Loc) override;
328
329 llvm::Value *
330 EmitVirtualDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *Dtor,
331 CXXDtorType DtorType, Address This,
332 DeleteOrMemberCallExpr E,
333 llvm::CallBase **CallOrInvoke) override;
334
335 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
336
337 bool canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const override;
338 bool canSpeculativelyEmitVTableAsBaseClass(const CXXRecordDecl *RD) const;
339
340 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
341 bool ReturnAdjustment) override {
342 // Allow inlining of thunks by emitting them with available_externally
343 // linkage together with vtables when needed.
344 if (ForVTable && !Thunk->hasLocalLinkage())
345 Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
346 CGM.setGVProperties(Thunk, GD);
347 }
348
349 bool exportThunk() override { return true; }
350
351 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
352 const CXXRecordDecl *UnadjustedThisClass,
353 const ThunkInfo &TI) override;
354
355 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
356 const CXXRecordDecl *UnadjustedRetClass,
357 const ReturnAdjustment &RA) override;
358
359 size_t getSrcArgforCopyCtor(const CXXConstructorDecl *,
360 FunctionArgList &Args) const override {
361 assert(!Args.empty() && "expected the arglist to not be empty!");
362 return Args.size() - 1;
363 }
364
365 StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
366 StringRef GetDeletedVirtualCallName() override
367 { return "__cxa_deleted_virtual"; }
368
369 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
370 Address InitializeArrayCookie(CodeGenFunction &CGF,
371 Address NewPtr,
372 llvm::Value *NumElements,
373 const CXXNewExpr *expr,
374 QualType ElementType) override;
375 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
376 Address allocPtr,
377 CharUnits cookieSize) override;
378
379 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
380 llvm::GlobalVariable *DeclPtr,
381 bool PerformInit) override;
382 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
383 llvm::FunctionCallee dtor,
384 llvm::Constant *addr) override;
385
386 llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
387 llvm::Value *Val);
388 void EmitThreadLocalInitFuncs(
389 CodeGenModule &CGM,
390 ArrayRef<const VarDecl *> CXXThreadLocals,
391 ArrayRef<llvm::Function *> CXXThreadLocalInits,
392 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) override;
393
394 bool usesThreadWrapperFunction(const VarDecl *VD) const override {
395 return !isEmittedWithConstantInitializer(VD) ||
396 mayNeedDestruction(VD);
397 }
398 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
399 QualType LValType) override;
400
401 bool NeedsVTTParameter(GlobalDecl GD) override;
402
403 llvm::Constant *
404 getOrCreateVirtualFunctionPointerThunk(const CXXMethodDecl *MD);
405
406 /**************************** RTTI Uniqueness ******************************/
407
408protected:
409 /// Returns true if the ABI requires RTTI type_info objects to be unique
410 /// across a program.
411 virtual bool shouldRTTIBeUnique() const { return true; }
412
413public:
414 /// What sort of unique-RTTI behavior should we use?
415 enum RTTIUniquenessKind {
416 /// We are guaranteeing, or need to guarantee, that the RTTI string
417 /// is unique.
418 RUK_Unique,
419
420 /// We are not guaranteeing uniqueness for the RTTI string, so we
421 /// can demote to hidden visibility but must use string comparisons.
422 RUK_NonUniqueHidden,
423
424 /// We are not guaranteeing uniqueness for the RTTI string, so we
425 /// have to use string comparisons, but we also have to emit it with
426 /// non-hidden visibility.
427 RUK_NonUniqueVisible
428 };
429
430 /// Return the required visibility status for the given type and linkage in
431 /// the current ABI.
432 RTTIUniquenessKind
433 classifyRTTIUniqueness(QualType CanTy,
434 llvm::GlobalValue::LinkageTypes Linkage) const;
435 friend class ItaniumRTTIBuilder;
436
437 void emitCXXStructor(GlobalDecl GD) override;
438
439 std::pair<llvm::Value *, const CXXRecordDecl *>
440 LoadVTablePtr(CodeGenFunction &CGF, Address This,
441 const CXXRecordDecl *RD) override;
442
443 private:
444 llvm::Constant *
445 getSignedVirtualMemberFunctionPointer(const CXXMethodDecl *MD);
446
447 bool hasAnyUnusedVirtualInlineFunction(const CXXRecordDecl *RD) const {
448 const auto &VtableLayout =
449 CGM.getItaniumVTableContext().getVTableLayout(RD);
450
451 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
452 // Skip empty slot.
453 if (!VtableComponent.isUsedFunctionPointerKind())
454 continue;
455
456 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
457 const FunctionDecl *FD = Method->getDefinition();
458 const bool IsInlined =
459 Method->getCanonicalDecl()->isInlined() || (FD && FD->isInlined());
460 if (!IsInlined)
461 continue;
462
463 StringRef Name = CGM.getMangledName(
464 VtableComponent.getGlobalDecl(/*HasVectorDeletingDtors=*/false));
465 auto *Entry = CGM.GetGlobalValue(Name);
466 // This checks if virtual inline function has already been emitted.
467 // Note that it is possible that this inline function would be emitted
468 // after trying to emit vtable speculatively. Because of this we do
469 // an extra pass after emitting all deferred vtables to find and emit
470 // these vtables opportunistically.
471 if (!Entry || Entry->isDeclaration())
472 return true;
473 }
474 return false;
475 }
476
477 bool isVTableHidden(const CXXRecordDecl *RD) const {
478 const auto &VtableLayout =
479 CGM.getItaniumVTableContext().getVTableLayout(RD);
480
481 for (const auto &VtableComponent : VtableLayout.vtable_components()) {
482 if (VtableComponent.isRTTIKind()) {
483 const CXXRecordDecl *RTTIDecl = VtableComponent.getRTTIDecl();
484 if (RTTIDecl->getVisibility() == Visibility::HiddenVisibility)
485 return true;
486 } else if (VtableComponent.isUsedFunctionPointerKind()) {
487 const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
488 if (Method->getVisibility() == Visibility::HiddenVisibility &&
489 !Method->isDefined())
490 return true;
491 }
492 }
493 return false;
494 }
495};
496
497class ARMCXXABI : public ItaniumCXXABI {
498public:
499 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
500 ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
501 /*UseARMGuardVarABI=*/true) {}
502
503 bool constructorsAndDestructorsReturnThis() const override { return true; }
504
505 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
506 QualType ResTy) override;
507
508 CharUnits getArrayCookieSizeImpl(QualType elementType) override;
509 Address InitializeArrayCookie(CodeGenFunction &CGF,
510 Address NewPtr,
511 llvm::Value *NumElements,
512 const CXXNewExpr *expr,
513 QualType ElementType) override;
514 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr,
515 CharUnits cookieSize) override;
516};
517
518class AppleARM64CXXABI : public ARMCXXABI {
519public:
520 AppleARM64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {
521 Use32BitVTableOffsetABI = true;
522 }
523
524 // ARM64 libraries are prepared for non-unique RTTI.
525 bool shouldRTTIBeUnique() const override { return false; }
526};
527
528class FuchsiaCXXABI final : public ItaniumCXXABI {
529public:
530 explicit FuchsiaCXXABI(CodeGen::CodeGenModule &CGM)
531 : ItaniumCXXABI(CGM) {}
532
533private:
534 bool constructorsAndDestructorsReturnThis() const override { return true; }
535};
536
537class WebAssemblyCXXABI final : public ItaniumCXXABI {
538public:
539 explicit WebAssemblyCXXABI(CodeGen::CodeGenModule &CGM)
540 : ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
541 /*UseARMGuardVarABI=*/true) {}
542 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
543 llvm::CallInst *
544 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
545 llvm::Value *Exn) override;
546
547private:
548 bool constructorsAndDestructorsReturnThis() const override { return true; }
549 bool canCallMismatchedFunctionType() const override { return false; }
550};
551
552class XLCXXABI final : public ItaniumCXXABI {
553public:
554 explicit XLCXXABI(CodeGen::CodeGenModule &CGM)
555 : ItaniumCXXABI(CGM) {}
556
557 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
558 llvm::FunctionCallee dtor,
559 llvm::Constant *addr) override;
560
561 bool useSinitAndSterm() const override { return true; }
562
563private:
564 void emitCXXStermFinalizer(const VarDecl &D, llvm::Function *dtorStub,
565 llvm::Constant *addr);
566};
567}
568
570 switch (CGM.getContext().getCXXABIKind()) {
571 // For IR-generation purposes, there's no significant difference
572 // between the ARM and iOS ABIs.
573 case TargetCXXABI::GenericARM:
574 case TargetCXXABI::iOS:
575 case TargetCXXABI::WatchOS:
576 return new ARMCXXABI(CGM);
577
578 case TargetCXXABI::AppleARM64:
579 return new AppleARM64CXXABI(CGM);
580
581 case TargetCXXABI::Fuchsia:
582 return new FuchsiaCXXABI(CGM);
583
584 // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
585 // include the other 32-bit ARM oddities: constructor/destructor return values
586 // and array cookies.
587 case TargetCXXABI::GenericAArch64:
588 return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
589 /*UseARMGuardVarABI=*/true);
590
591 case TargetCXXABI::GenericMIPS:
592 return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true);
593
594 case TargetCXXABI::WebAssembly:
595 return new WebAssemblyCXXABI(CGM);
596
597 case TargetCXXABI::XL:
598 return new XLCXXABI(CGM);
599
600 case TargetCXXABI::GenericItanium:
601 return new ItaniumCXXABI(CGM);
602
603 case TargetCXXABI::Microsoft:
604 llvm_unreachable("Microsoft ABI is not Itanium-based");
605 }
606 llvm_unreachable("bad ABI kind");
607}
608
609llvm::Type *
610ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
611 if (MPT->isMemberDataPointer())
612 return CGM.PtrDiffTy;
613 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy);
614}
615
616/// In the Itanium and ARM ABIs, method pointers have the form:
617/// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
618///
619/// In the Itanium ABI:
620/// - method pointers are virtual if (memptr.ptr & 1) is nonzero
621/// - the this-adjustment is (memptr.adj)
622/// - the virtual offset is (memptr.ptr - 1)
623///
624/// In the ARM ABI:
625/// - method pointers are virtual if (memptr.adj & 1) is nonzero
626/// - the this-adjustment is (memptr.adj >> 1)
627/// - the virtual offset is (memptr.ptr)
628/// ARM uses 'adj' for the virtual flag because Thumb functions
629/// may be only single-byte aligned.
630///
631/// If the member is virtual, the adjusted 'this' pointer points
632/// to a vtable pointer from which the virtual offset is applied.
633///
634/// If the member is non-virtual, memptr.ptr is the address of
635/// the function to call.
636CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
637 CodeGenFunction &CGF, const Expr *E, Address ThisAddr,
638 llvm::Value *&ThisPtrForCall,
639 llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
640 CGBuilderTy &Builder = CGF.Builder;
641
642 const FunctionProtoType *FPT =
644 auto *RD = MPT->getMostRecentCXXRecordDecl();
645
646 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
647
648 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
649 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
650 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
651
652 // Extract memptr.adj, which is in the second field.
653 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
654
655 // Compute the true adjustment.
656 llvm::Value *Adj = RawAdj;
657 if (UseARMMethodPtrABI)
658 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
659
660 // Apply the adjustment and cast back to the original struct type
661 // for consistency.
662 llvm::Value *This = ThisAddr.emitRawPointer(CGF);
663 This = Builder.CreateInBoundsGEP(Builder.getInt8Ty(), This, Adj);
664 ThisPtrForCall = This;
665
666 // Load the function pointer.
667 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
668
669 // If the LSB in the function pointer is 1, the function pointer points to
670 // a virtual function.
671 llvm::Value *IsVirtual;
672 if (UseARMMethodPtrABI)
673 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
674 else
675 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
676 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
677 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
678
679 // In the virtual path, the adjustment left 'This' pointing to the
680 // vtable of the correct base subobject. The "function pointer" is an
681 // offset within the vtable (+1 for the virtual flag on non-ARM).
682 CGF.EmitBlock(FnVirtual);
683
684 // Cast the adjusted this to a pointer to vtable pointer and load.
685 llvm::Type *VTableTy = CGF.CGM.GlobalsInt8PtrTy;
686 CharUnits VTablePtrAlign =
687 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD,
688 CGF.getPointerAlign());
689 llvm::Value *VTable = CGF.GetVTablePtr(
690 Address(This, ThisAddr.getElementType(), VTablePtrAlign), VTableTy, RD);
691
692 // Apply the offset.
693 // On ARM64, to reserve extra space in virtual member function pointers,
694 // we only pay attention to the low 32 bits of the offset.
695 llvm::Value *VTableOffset = FnAsInt;
696 if (!UseARMMethodPtrABI)
697 VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
698 if (Use32BitVTableOffsetABI) {
699 VTableOffset = Builder.CreateTrunc(VTableOffset, CGF.Int32Ty);
700 VTableOffset = Builder.CreateZExt(VTableOffset, CGM.PtrDiffTy);
701 }
702
703 // Check the address of the function pointer if CFI on member function
704 // pointers is enabled.
705 llvm::Constant *CheckSourceLocation;
706 llvm::Constant *CheckTypeDesc;
707 bool ShouldEmitCFICheck = CGF.SanOpts.has(SanitizerKind::CFIMFCall) &&
708 CGM.HasHiddenLTOVisibility(RD);
709
710 if (ShouldEmitCFICheck) {
711 if (const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
712 if (BinOp->isPtrMemOp() &&
713 BinOp->getRHS()
714 ->getType()
715 ->hasPointeeToCFIUncheckedCalleeFunctionType())
716 ShouldEmitCFICheck = false;
717 }
718 }
719
720 bool ShouldEmitVFEInfo = CGM.getCodeGenOpts().VirtualFunctionElimination &&
721 CGM.HasHiddenLTOVisibility(RD);
722 // TODO: Update this name not to be restricted to WPD only
723 // as we now emit the vtable info info for speculative devirtualization as
724 // well.
725 bool ShouldEmitWPDInfo =
726 (CGM.getCodeGenOpts().WholeProgramVTables &&
727 // Don't insert type tests if we are forcing public visibility.
728 !CGM.AlwaysHasLTOVisibilityPublic(RD)) ||
729 CGM.getCodeGenOpts().DevirtualizeSpeculatively;
730 llvm::Value *VirtualFn = nullptr;
731
732 {
733 auto CheckOrdinal = SanitizerKind::SO_CFIMFCall;
734 auto CheckHandler = SanitizerHandler::CFICheckFail;
735 SanitizerDebugLocation SanScope(&CGF, {CheckOrdinal}, CheckHandler);
736
737 llvm::Value *TypeId = nullptr;
738 llvm::Value *CheckResult = nullptr;
739
740 if (ShouldEmitCFICheck || ShouldEmitVFEInfo || ShouldEmitWPDInfo) {
741 // If doing CFI, VFE or WPD, we will need the metadata node to check
742 // against.
743 llvm::Metadata *MD =
744 CGM.CreateMetadataIdentifierForVirtualMemPtrType(QualType(MPT, 0));
745 TypeId = llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD);
746 }
747
748 if (ShouldEmitVFEInfo) {
749 llvm::Value *VFPAddr =
750 Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset);
751
752 // If doing VFE, load from the vtable with a type.checked.load intrinsic
753 // call. Note that we use the GEP to calculate the address to load from
754 // and pass 0 as the offset to the intrinsic. This is because every
755 // vtable slot of the correct type is marked with matching metadata, and
756 // we know that the load must be from one of these slots.
757 llvm::Value *CheckedLoad = Builder.CreateCall(
758 CGM.getIntrinsic(llvm::Intrinsic::type_checked_load),
759 {VFPAddr, llvm::ConstantInt::get(CGM.Int32Ty, 0), TypeId});
760 CheckResult = Builder.CreateExtractValue(CheckedLoad, 1);
761 VirtualFn = Builder.CreateExtractValue(CheckedLoad, 0);
762 } else {
763 // When not doing VFE, emit a normal load, as it allows more
764 // optimisations than type.checked.load.
765 if (ShouldEmitCFICheck || ShouldEmitWPDInfo) {
766 llvm::Value *VFPAddr =
767 Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset);
768 llvm::Intrinsic::ID IID = CGM.HasHiddenLTOVisibility(RD)
769 ? llvm::Intrinsic::type_test
770 : llvm::Intrinsic::public_type_test;
771
772 CheckResult =
773 Builder.CreateCall(CGM.getIntrinsic(IID), {VFPAddr, TypeId});
774 }
775
776 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
777 VirtualFn = CGF.Builder.CreateCall(
778 CGM.getIntrinsic(llvm::Intrinsic::load_relative,
779 {VTableOffset->getType()}),
780 {VTable, VTableOffset});
781 } else {
782 llvm::Value *VFPAddr =
783 CGF.Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset);
784 VirtualFn = CGF.Builder.CreateAlignedLoad(CGF.DefaultPtrTy, VFPAddr,
785 CGF.getPointerAlign(),
786 "memptr.virtualfn");
787 }
788 }
789 assert(VirtualFn && "Virtual fuction pointer not created!");
790 assert((!ShouldEmitCFICheck || !ShouldEmitVFEInfo || !ShouldEmitWPDInfo ||
791 CheckResult) &&
792 "Check result required but not created!");
793
794 if (ShouldEmitCFICheck) {
795 // If doing CFI, emit the check.
796 CheckSourceLocation = CGF.EmitCheckSourceLocation(E->getBeginLoc());
797 CheckTypeDesc = CGF.EmitCheckTypeDescriptor(QualType(MPT, 0));
798 llvm::Constant *StaticData[] = {
799 llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_VMFCall),
800 CheckSourceLocation,
801 CheckTypeDesc,
802 };
803
804 if (CGM.getCodeGenOpts().SanitizeTrap.has(SanitizerKind::CFIMFCall)) {
805 CGF.EmitTrapCheck(CheckResult, CheckHandler);
806 } else {
807 llvm::Value *AllVtables = llvm::MetadataAsValue::get(
808 CGM.getLLVMContext(),
809 llvm::MDString::get(CGM.getLLVMContext(), "all-vtables"));
810 llvm::Value *ValidVtable = Builder.CreateCall(
811 CGM.getIntrinsic(llvm::Intrinsic::type_test), {VTable, AllVtables});
812 CGF.EmitCheck(std::make_pair(CheckResult, CheckOrdinal), CheckHandler,
813 StaticData, {VTable, ValidVtable});
814 }
815
816 FnVirtual = Builder.GetInsertBlock();
817 }
818 } // End of sanitizer scope
819
820 CGF.EmitBranch(FnEnd);
821
822 // In the non-virtual path, the function pointer is actually a
823 // function pointer.
824 CGF.EmitBlock(FnNonVirtual);
825 llvm::Value *NonVirtualFn =
826 Builder.CreateIntToPtr(FnAsInt, CGF.DefaultPtrTy, "memptr.nonvirtualfn");
827
828 // Check the function pointer if CFI on member function pointers is enabled.
829 if (ShouldEmitCFICheck) {
830 CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
831 if (RD->hasDefinition()) {
832 auto CheckOrdinal = SanitizerKind::SO_CFIMFCall;
833 auto CheckHandler = SanitizerHandler::CFICheckFail;
834 SanitizerDebugLocation SanScope(&CGF, {CheckOrdinal}, CheckHandler);
835
836 llvm::Constant *StaticData[] = {
837 llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_NVMFCall),
838 CheckSourceLocation,
839 CheckTypeDesc,
840 };
841
842 llvm::Value *Bit = Builder.getFalse();
843 for (const CXXRecordDecl *Base : CGM.getMostBaseClasses(RD)) {
844 llvm::Metadata *MD = CGM.CreateMetadataIdentifierForType(
845 getContext().getMemberPointerType(MPT->getPointeeType(),
846 /*Qualifier=*/std::nullopt,
847 Base->getCanonicalDecl()));
848 llvm::Value *TypeId =
849 llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD);
850
851 llvm::Value *TypeTest =
852 Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::type_test),
853 {NonVirtualFn, TypeId});
854 Bit = Builder.CreateOr(Bit, TypeTest);
855 }
856
857 CGF.EmitCheck(std::make_pair(Bit, CheckOrdinal), CheckHandler, StaticData,
858 {NonVirtualFn, llvm::UndefValue::get(CGF.IntPtrTy)});
859
860 FnNonVirtual = Builder.GetInsertBlock();
861 }
862 }
863
864 // We're done.
865 CGF.EmitBlock(FnEnd);
866 llvm::PHINode *CalleePtr = Builder.CreatePHI(CGF.DefaultPtrTy, 2);
867 CalleePtr->addIncoming(VirtualFn, FnVirtual);
868 CalleePtr->addIncoming(NonVirtualFn, FnNonVirtual);
869
870 CGPointerAuthInfo PointerAuth;
871
872 if (const auto &Schema =
873 CGM.getCodeGenOpts().PointerAuth.CXXMemberFunctionPointers) {
874 llvm::PHINode *DiscriminatorPHI = Builder.CreatePHI(CGF.IntPtrTy, 2);
875 DiscriminatorPHI->addIncoming(llvm::ConstantInt::get(CGF.IntPtrTy, 0),
876 FnVirtual);
877 const auto &AuthInfo =
878 CGM.getMemberFunctionPointerAuthInfo(QualType(MPT, 0));
879 assert(Schema.getKey() == AuthInfo.getKey() &&
880 "Keys for virtual and non-virtual member functions must match");
881 auto *NonVirtualDiscriminator = AuthInfo.getDiscriminator();
882 DiscriminatorPHI->addIncoming(NonVirtualDiscriminator, FnNonVirtual);
883 PointerAuth = CGPointerAuthInfo(
884 Schema.getKey(), Schema.getAuthenticationMode(), Schema.isIsaPointer(),
885 Schema.authenticatesNullValues(), DiscriminatorPHI);
886 }
887
888 CGCallee Callee(FPT, CalleePtr, PointerAuth);
889 return Callee;
890}
891
892/// Compute an l-value by applying the given pointer-to-member to a
893/// base object.
894llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
895 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
896 const MemberPointerType *MPT, bool IsInBounds) {
897 assert(MemPtr->getType() == CGM.PtrDiffTy);
898
899 CGBuilderTy &Builder = CGF.Builder;
900
901 // Apply the offset.
902 llvm::Value *BaseAddr = Base.emitRawPointer(CGF);
903 return Builder.CreateGEP(CGF.Int8Ty, BaseAddr, MemPtr, "memptr.offset",
904 IsInBounds ? llvm::GEPNoWrapFlags::inBounds()
905 : llvm::GEPNoWrapFlags::none());
906}
907
908// See if it's possible to return a constant signed pointer.
909static llvm::Constant *pointerAuthResignConstant(
910 llvm::Value *Ptr, const CGPointerAuthInfo &CurAuthInfo,
911 const CGPointerAuthInfo &NewAuthInfo, CodeGenModule &CGM) {
912 const auto *CPA = dyn_cast<llvm::ConstantPtrAuth>(Ptr);
913
914 if (!CPA)
915 return nullptr;
916
917 assert(CPA->getKey()->getZExtValue() == CurAuthInfo.getKey() &&
918 CPA->getAddrDiscriminator()->isZeroValue() &&
919 CPA->getDiscriminator() == CurAuthInfo.getDiscriminator() &&
920 "unexpected key or discriminators");
921
922 return CGM.getConstantSignedPointer(
923 CPA->getPointer(), NewAuthInfo.getKey(), nullptr,
925}
926
927/// Perform a bitcast, derived-to-base, or base-to-derived member pointer
928/// conversion.
929///
930/// Bitcast conversions are always a no-op under Itanium.
931///
932/// Obligatory offset/adjustment diagram:
933/// <-- offset --> <-- adjustment -->
934/// |--------------------------|----------------------|--------------------|
935/// ^Derived address point ^Base address point ^Member address point
936///
937/// So when converting a base member pointer to a derived member pointer,
938/// we add the offset to the adjustment because the address point has
939/// decreased; and conversely, when converting a derived MP to a base MP
940/// we subtract the offset from the adjustment because the address point
941/// has increased.
942///
943/// The standard forbids (at compile time) conversion to and from
944/// virtual bases, which is why we don't have to consider them here.
945///
946/// The standard forbids (at run time) casting a derived MP to a base
947/// MP when the derived MP does not point to a member of the base.
948/// This is why -1 is a reasonable choice for null data member
949/// pointers.
950llvm::Value *
951ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
952 const CastExpr *E,
953 llvm::Value *src) {
954 // Use constant emission if we can.
955 if (isa<llvm::Constant>(src))
956 return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
957
958 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
959 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
960 E->getCastKind() == CK_ReinterpretMemberPointer);
961
962 CGBuilderTy &Builder = CGF.Builder;
963 QualType DstType = E->getType();
964
965 if (DstType->isMemberFunctionPointerType()) {
966 if (const auto &NewAuthInfo =
967 CGM.getMemberFunctionPointerAuthInfo(DstType)) {
968 QualType SrcType = E->getSubExpr()->getType();
969 assert(SrcType->isMemberFunctionPointerType());
970 const auto &CurAuthInfo = CGM.getMemberFunctionPointerAuthInfo(SrcType);
971 llvm::Value *MemFnPtr = Builder.CreateExtractValue(src, 0, "memptr.ptr");
972 llvm::Type *OrigTy = MemFnPtr->getType();
973
974 llvm::BasicBlock *StartBB = Builder.GetInsertBlock();
975 llvm::BasicBlock *ResignBB = CGF.createBasicBlock("resign");
976 llvm::BasicBlock *MergeBB = CGF.createBasicBlock("merge");
977
978 // Check whether we have a virtual offset or a pointer to a function.
979 assert(UseARMMethodPtrABI && "ARM ABI expected");
980 llvm::Value *Adj = Builder.CreateExtractValue(src, 1, "memptr.adj");
981 llvm::Constant *Ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
982 llvm::Value *AndVal = Builder.CreateAnd(Adj, Ptrdiff_1);
983 llvm::Value *IsVirtualOffset =
984 Builder.CreateIsNotNull(AndVal, "is.virtual.offset");
985 Builder.CreateCondBr(IsVirtualOffset, MergeBB, ResignBB);
986
987 CGF.EmitBlock(ResignBB);
988 llvm::Type *PtrTy = llvm::PointerType::getUnqual(CGM.getLLVMContext());
989 MemFnPtr = Builder.CreateIntToPtr(MemFnPtr, PtrTy);
990 MemFnPtr =
991 CGF.emitPointerAuthResign(MemFnPtr, SrcType, CurAuthInfo, NewAuthInfo,
993 MemFnPtr = Builder.CreatePtrToInt(MemFnPtr, OrigTy);
994 llvm::Value *ResignedVal = Builder.CreateInsertValue(src, MemFnPtr, 0);
995 ResignBB = Builder.GetInsertBlock();
996
997 CGF.EmitBlock(MergeBB);
998 llvm::PHINode *NewSrc = Builder.CreatePHI(src->getType(), 2);
999 NewSrc->addIncoming(src, StartBB);
1000 NewSrc->addIncoming(ResignedVal, ResignBB);
1001 src = NewSrc;
1002 }
1003 }
1004
1005 // Under Itanium, reinterprets don't require any additional processing.
1006 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
1007
1008 llvm::Constant *adj = getMemberPointerAdjustment(E);
1009 if (!adj) return src;
1010
1011 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1012
1013 const MemberPointerType *destTy =
1014 E->getType()->castAs<MemberPointerType>();
1015
1016 // For member data pointers, this is just a matter of adding the
1017 // offset if the source is non-null.
1018 if (destTy->isMemberDataPointer()) {
1019 llvm::Value *dst;
1020 if (isDerivedToBase)
1021 dst = Builder.CreateNSWSub(src, adj, "adj");
1022 else
1023 dst = Builder.CreateNSWAdd(src, adj, "adj");
1024
1025 // Null check.
1026 llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
1027 llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
1028 return Builder.CreateSelect(isNull, src, dst);
1029 }
1030
1031 // The this-adjustment is left-shifted by 1 on ARM.
1032 if (UseARMMethodPtrABI) {
1033 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
1034 offset <<= 1;
1035 adj = llvm::ConstantInt::get(adj->getType(), offset);
1036 }
1037
1038 llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
1039 llvm::Value *dstAdj;
1040 if (isDerivedToBase)
1041 dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
1042 else
1043 dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
1044
1045 return Builder.CreateInsertValue(src, dstAdj, 1);
1046}
1047
1048static llvm::Constant *
1050 QualType SrcType, CodeGenModule &CGM) {
1051 assert(DestType->isMemberFunctionPointerType() &&
1052 SrcType->isMemberFunctionPointerType() &&
1053 "member function pointers expected");
1054 if (DestType == SrcType)
1055 return Src;
1056
1057 const auto &NewAuthInfo = CGM.getMemberFunctionPointerAuthInfo(DestType);
1058 const auto &CurAuthInfo = CGM.getMemberFunctionPointerAuthInfo(SrcType);
1059
1060 if (!NewAuthInfo && !CurAuthInfo)
1061 return Src;
1062
1063 llvm::Constant *MemFnPtr = Src->getAggregateElement(0u);
1064 if (MemFnPtr->getNumOperands() == 0) {
1065 // src must be a pair of null pointers.
1066 assert(isa<llvm::ConstantInt>(MemFnPtr) && "constant int expected");
1067 return Src;
1068 }
1069
1070 llvm::Constant *ConstPtr = pointerAuthResignConstant(
1071 cast<llvm::User>(MemFnPtr)->getOperand(0), CurAuthInfo, NewAuthInfo, CGM);
1072 ConstPtr = llvm::ConstantExpr::getPtrToInt(ConstPtr, MemFnPtr->getType());
1073 return ConstantFoldInsertValueInstruction(Src, ConstPtr, 0);
1074}
1075
1076llvm::Constant *
1077ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
1078 llvm::Constant *src) {
1079 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
1080 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
1081 E->getCastKind() == CK_ReinterpretMemberPointer);
1082
1083 QualType DstType = E->getType();
1084
1085 if (DstType->isMemberFunctionPointerType())
1087 src, DstType, E->getSubExpr()->getType(), CGM);
1088
1089 // Under Itanium, reinterprets don't require any additional processing.
1090 if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
1091
1092 // If the adjustment is trivial, we don't need to do anything.
1093 llvm::Constant *adj = getMemberPointerAdjustment(E);
1094 if (!adj) return src;
1095
1096 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1097
1098 const MemberPointerType *destTy =
1099 E->getType()->castAs<MemberPointerType>();
1100
1101 // For member data pointers, this is just a matter of adding the
1102 // offset if the source is non-null.
1103 if (destTy->isMemberDataPointer()) {
1104 // null maps to null.
1105 if (src->isAllOnesValue()) return src;
1106
1107 if (isDerivedToBase)
1108 return llvm::ConstantExpr::getNSWSub(src, adj);
1109 else
1110 return llvm::ConstantExpr::getNSWAdd(src, adj);
1111 }
1112
1113 // The this-adjustment is left-shifted by 1 on ARM.
1114 if (UseARMMethodPtrABI) {
1115 uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
1116 offset <<= 1;
1117 adj = llvm::ConstantInt::get(adj->getType(), offset);
1118 }
1119
1120 llvm::Constant *srcAdj = src->getAggregateElement(1);
1121 llvm::Constant *dstAdj;
1122 if (isDerivedToBase)
1123 dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
1124 else
1125 dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
1126
1127 llvm::Constant *res = ConstantFoldInsertValueInstruction(src, dstAdj, 1);
1128 assert(res != nullptr && "Folding must succeed");
1129 return res;
1130}
1131
1132llvm::Constant *
1133ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
1134 // Itanium C++ ABI 2.3:
1135 // A NULL pointer is represented as -1.
1136 if (MPT->isMemberDataPointer())
1137 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
1138
1139 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
1140 llvm::Constant *Values[2] = { Zero, Zero };
1141 return llvm::ConstantStruct::getAnon(Values);
1142}
1143
1144llvm::Constant *
1145ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
1146 CharUnits offset) {
1147 // Itanium C++ ABI 2.3:
1148 // A pointer to data member is an offset from the base address of
1149 // the class object containing it, represented as a ptrdiff_t
1150 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
1151}
1152
1153llvm::Constant *
1154ItaniumCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
1155 return BuildMemberPointer(MD, CharUnits::Zero());
1156}
1157
1158llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
1159 CharUnits ThisAdjustment) {
1160 assert(MD->isInstance() && "Member function must not be static!");
1161
1162 CodeGenTypes &Types = CGM.getTypes();
1163
1164 // Get the function pointer (or index if this is a virtual function).
1165 llvm::Constant *MemPtr[2];
1166 if (MD->isVirtual()) {
1167 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
1168 uint64_t VTableOffset;
1169 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1170 // Multiply by 4-byte relative offsets.
1171 VTableOffset = Index * 4;
1172 } else {
1173 const ASTContext &Context = getContext();
1174 CharUnits PointerWidth = Context.toCharUnitsFromBits(
1175 Context.getTargetInfo().getPointerWidth(LangAS::Default));
1176 VTableOffset = Index * PointerWidth.getQuantity();
1177 }
1178
1179 if (UseARMMethodPtrABI) {
1180 // ARM C++ ABI 3.2.1:
1181 // This ABI specifies that adj contains twice the this
1182 // adjustment, plus 1 if the member function is virtual. The
1183 // least significant bit of adj then makes exactly the same
1184 // discrimination as the least significant bit of ptr does for
1185 // Itanium.
1186
1187 // We cannot use the Itanium ABI's representation for virtual member
1188 // function pointers under pointer authentication because it would
1189 // require us to store both the virtual offset and the constant
1190 // discriminator in the pointer, which would be immediately vulnerable
1191 // to attack. Instead we introduce a thunk that does the virtual dispatch
1192 // and store it as if it were a non-virtual member function. This means
1193 // that virtual function pointers may not compare equal anymore, but
1194 // fortunately they aren't required to by the standard, and we do make
1195 // a best-effort attempt to re-use the thunk.
1196 //
1197 // To support interoperation with code in which pointer authentication
1198 // is disabled, derefencing a member function pointer must still handle
1199 // the virtual case, but it can use a discriminator which should never
1200 // be valid.
1201 const auto &Schema =
1202 CGM.getCodeGenOpts().PointerAuth.CXXMemberFunctionPointers;
1203 if (Schema)
1204 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(
1205 getSignedVirtualMemberFunctionPointer(MD), CGM.PtrDiffTy);
1206 else
1207 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
1208 // Don't set the LSB of adj to 1 if pointer authentication for member
1209 // function pointers is enabled.
1210 MemPtr[1] = llvm::ConstantInt::get(
1211 CGM.PtrDiffTy, 2 * ThisAdjustment.getQuantity() + !Schema);
1212 } else {
1213 // Itanium C++ ABI 2.3:
1214 // For a virtual function, [the pointer field] is 1 plus the
1215 // virtual table offset (in bytes) of the function,
1216 // represented as a ptrdiff_t.
1217 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
1218 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
1219 ThisAdjustment.getQuantity());
1220 }
1221 } else {
1222 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
1223 llvm::Type *Ty;
1224 // Check whether the function has a computable LLVM signature.
1225 if (Types.isFuncTypeConvertible(FPT)) {
1226 // The function has a computable LLVM signature; use the correct type.
1227 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
1228 } else {
1229 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
1230 // function type is incomplete.
1231 Ty = CGM.PtrDiffTy;
1232 }
1233 llvm::Constant *addr = CGM.getMemberFunctionPointer(MD, Ty);
1234
1235 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
1236 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
1237 (UseARMMethodPtrABI ? 2 : 1) *
1238 ThisAdjustment.getQuantity());
1239 }
1240
1241 return llvm::ConstantStruct::getAnon(MemPtr);
1242}
1243
1244llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
1245 QualType MPType) {
1246 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
1247 const ValueDecl *MPD = MP.getMemberPointerDecl();
1248 if (!MPD)
1249 return EmitNullMemberPointer(MPT);
1250
1251 CharUnits ThisAdjustment = getContext().getMemberPointerPathAdjustment(MP);
1252
1253 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD)) {
1254 llvm::Constant *Src = BuildMemberPointer(MD, ThisAdjustment);
1255 QualType SrcType = getContext().getMemberPointerType(
1256 MD->getType(), /*Qualifier=*/std::nullopt, MD->getParent());
1257 return pointerAuthResignMemberFunctionPointer(Src, MPType, SrcType, CGM);
1258 }
1259
1260 CharUnits FieldOffset =
1261 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
1262 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
1263}
1264
1265/// The comparison algorithm is pretty easy: the member pointers are
1266/// the same if they're either bitwise identical *or* both null.
1267///
1268/// ARM is different here only because null-ness is more complicated.
1269llvm::Value *
1270ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
1271 llvm::Value *L,
1272 llvm::Value *R,
1273 const MemberPointerType *MPT,
1274 bool Inequality) {
1275 CGBuilderTy &Builder = CGF.Builder;
1276
1277 llvm::ICmpInst::Predicate Eq;
1278 llvm::Instruction::BinaryOps And, Or;
1279 if (Inequality) {
1280 Eq = llvm::ICmpInst::ICMP_NE;
1281 And = llvm::Instruction::Or;
1282 Or = llvm::Instruction::And;
1283 } else {
1284 Eq = llvm::ICmpInst::ICMP_EQ;
1285 And = llvm::Instruction::And;
1286 Or = llvm::Instruction::Or;
1287 }
1288
1289 // Member data pointers are easy because there's a unique null
1290 // value, so it just comes down to bitwise equality.
1291 if (MPT->isMemberDataPointer())
1292 return Builder.CreateICmp(Eq, L, R);
1293
1294 // For member function pointers, the tautologies are more complex.
1295 // The Itanium tautology is:
1296 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
1297 // The ARM tautology is:
1298 // (L == R) <==> (L.ptr == R.ptr &&
1299 // (L.adj == R.adj ||
1300 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
1301 // The inequality tautologies have exactly the same structure, except
1302 // applying De Morgan's laws.
1303
1304 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
1305 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
1306
1307 // This condition tests whether L.ptr == R.ptr. This must always be
1308 // true for equality to hold.
1309 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
1310
1311 // This condition, together with the assumption that L.ptr == R.ptr,
1312 // tests whether the pointers are both null. ARM imposes an extra
1313 // condition.
1314 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
1315 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
1316
1317 // This condition tests whether L.adj == R.adj. If this isn't
1318 // true, the pointers are unequal unless they're both null.
1319 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
1320 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
1321 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
1322
1323 // Null member function pointers on ARM clear the low bit of Adj,
1324 // so the zero condition has to check that neither low bit is set.
1325 if (UseARMMethodPtrABI) {
1326 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
1327
1328 // Compute (l.adj | r.adj) & 1 and test it against zero.
1329 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
1330 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
1331 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
1332 "cmp.or.adj");
1333 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
1334 }
1335
1336 // Tie together all our conditions.
1337 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
1338 Result = Builder.CreateBinOp(And, PtrEq, Result,
1339 Inequality ? "memptr.ne" : "memptr.eq");
1340 return Result;
1341}
1342
1343llvm::Value *
1344ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
1345 llvm::Value *MemPtr,
1346 const MemberPointerType *MPT) {
1347 CGBuilderTy &Builder = CGF.Builder;
1348
1349 /// For member data pointers, this is just a check against -1.
1350 if (MPT->isMemberDataPointer()) {
1351 assert(MemPtr->getType() == CGM.PtrDiffTy);
1352 llvm::Value *NegativeOne =
1353 llvm::Constant::getAllOnesValue(MemPtr->getType());
1354 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
1355 }
1356
1357 // In Itanium, a member function pointer is not null if 'ptr' is not null.
1358 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
1359
1360 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
1361 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
1362
1363 // On ARM, a member function pointer is also non-null if the low bit of 'adj'
1364 // (the virtual bit) is set.
1365 if (UseARMMethodPtrABI) {
1366 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
1367 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
1368 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
1369 llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
1370 "memptr.isvirtual");
1371 Result = Builder.CreateOr(Result, IsVirtual);
1372 }
1373
1374 return Result;
1375}
1376
1377bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
1378 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
1379 if (!RD)
1380 return false;
1381
1382 // If C++ prohibits us from making a copy, return by address.
1383 if (!RD->canPassInRegisters()) {
1384 auto Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
1386 Align, /*AddrSpace=*/CGM.getDataLayout().getAllocaAddrSpace(),
1387 /*ByVal=*/false);
1388 return true;
1389 }
1390 return false;
1391}
1392
1393/// The Itanium ABI requires non-zero initialization only for data
1394/// member pointers, for which '0' is a valid offset.
1395bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
1396 return MPT->isMemberFunctionPointer();
1397}
1398
1399/// The Itanium ABI always places an offset to the complete object
1400/// at entry -2 in the vtable.
1401void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
1402 const CXXDeleteExpr *DE,
1403 Address Ptr,
1404 QualType ElementType,
1405 const CXXDestructorDecl *Dtor) {
1406 bool UseGlobalDelete = DE->isGlobalDelete();
1407 if (UseGlobalDelete) {
1408 // Derive the complete-object pointer, which is what we need
1409 // to pass to the deallocation function.
1410
1411 // Grab the vtable pointer as an intptr_t*.
1412 auto *ClassDecl = ElementType->castAsCXXRecordDecl();
1413 llvm::Value *VTable = CGF.GetVTablePtr(Ptr, CGF.DefaultPtrTy, ClassDecl);
1414
1415 // Track back to entry -2 and pull out the offset there.
1416 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
1417 CGF.IntPtrTy, VTable, -2, "complete-offset.ptr");
1418 llvm::Value *Offset = CGF.Builder.CreateAlignedLoad(CGF.IntPtrTy, OffsetPtr,
1419 CGF.getPointerAlign());
1420
1421 // Apply the offset.
1422 llvm::Value *CompletePtr = Ptr.emitRawPointer(CGF);
1423 CompletePtr =
1424 CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, CompletePtr, Offset);
1425
1426 // If we're supposed to call the global delete, make sure we do so
1427 // even if the destructor throws.
1428 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
1429 ElementType);
1430 }
1431
1432 // FIXME: Provide a source location here even though there's no
1433 // CXXMemberCallExpr for dtor call.
1434 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
1435 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE,
1436 /*CallOrInvoke=*/nullptr);
1437
1438 if (UseGlobalDelete)
1439 CGF.PopCleanupBlock();
1440}
1441
1442void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
1443 // void __cxa_rethrow();
1444
1445 llvm::FunctionType *FTy =
1446 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
1447
1448 llvm::FunctionCallee Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
1449
1450 if (isNoReturn)
1452 else
1454}
1455
1456static llvm::FunctionCallee getAllocateExceptionFn(CodeGenModule &CGM) {
1457 // void *__cxa_allocate_exception(size_t thrown_size);
1458
1459 llvm::FunctionType *FTy =
1460 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*isVarArg=*/false);
1461
1462 return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
1463}
1464
1465static llvm::FunctionCallee getThrowFn(CodeGenModule &CGM) {
1466 // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
1467 // void (*dest) (void *));
1468
1469 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.GlobalsInt8PtrTy, CGM.Int8PtrTy };
1470 llvm::FunctionType *FTy =
1471 llvm::FunctionType::get(CGM.VoidTy, Args, /*isVarArg=*/false);
1472
1473 return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
1474}
1475
1476void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
1477 QualType ThrowType = E->getSubExpr()->getType();
1478 // Now allocate the exception object.
1479 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType());
1480 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
1481
1482 llvm::FunctionCallee AllocExceptionFn = getAllocateExceptionFn(CGM);
1483 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall(
1484 AllocExceptionFn, llvm::ConstantInt::get(SizeTy, TypeSize), "exception");
1485
1486 CharUnits ExnAlign = CGF.getContext().getExnObjectAlignment();
1487 CGF.EmitAnyExprToExn(
1488 E->getSubExpr(), Address(ExceptionPtr, CGM.Int8Ty, ExnAlign));
1489
1490 // Now throw the exception.
1491 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
1492 /*ForEH=*/true);
1493
1494 // The address of the destructor. If the exception type has a
1495 // trivial destructor (or isn't a record), we just pass null.
1496 llvm::Constant *Dtor = nullptr;
1497 if (const auto *Record = ThrowType->getAsCXXRecordDecl();
1499 // __cxa_throw is declared to take its destructor as void (*)(void *). We
1500 // must match that if function pointers can be authenticated with a
1501 // discriminator based on their type.
1502 const ASTContext &Ctx = getContext();
1503 QualType DtorTy = Ctx.getFunctionType(Ctx.VoidTy, {Ctx.VoidPtrTy},
1504 FunctionProtoType::ExtProtoInfo());
1505
1506 CXXDestructorDecl *DtorD = Record->getDestructor();
1507 Dtor = CGM.getAddrOfCXXStructor(GlobalDecl(DtorD, Dtor_Complete));
1508 Dtor = CGM.getFunctionPointer(Dtor, DtorTy);
1509 }
1510 if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
1511
1512 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
1514}
1515
1516static llvm::FunctionCallee getItaniumDynamicCastFn(CodeGenFunction &CGF) {
1517 // void *__dynamic_cast(const void *sub,
1518 // global_as const abi::__class_type_info *src,
1519 // global_as const abi::__class_type_info *dst,
1520 // std::ptrdiff_t src2dst_offset);
1521
1522 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1523 llvm::Type *GlobInt8PtrTy = CGF.GlobalsInt8PtrTy;
1524 llvm::Type *PtrDiffTy =
1526
1527 llvm::Type *Args[4] = { Int8PtrTy, GlobInt8PtrTy, GlobInt8PtrTy, PtrDiffTy };
1528
1529 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
1530
1531 // Mark the function as nounwind willreturn readonly.
1532 llvm::AttrBuilder FuncAttrs(CGF.getLLVMContext());
1533 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
1534 FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
1535 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::readOnly());
1536 llvm::AttributeList Attrs = llvm::AttributeList::get(
1537 CGF.getLLVMContext(), llvm::AttributeList::FunctionIndex, FuncAttrs);
1538
1539 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1540}
1541
1542static llvm::FunctionCallee getBadCastFn(CodeGenFunction &CGF) {
1543 // void __cxa_bad_cast();
1544 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1545 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1546}
1547
1548/// Compute the src2dst_offset hint as described in the
1549/// Itanium C++ ABI [2.9.7]
1551 const CXXRecordDecl *Src,
1552 const CXXRecordDecl *Dst) {
1553 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1554 /*DetectVirtual=*/false);
1555
1556 // If Dst is not derived from Src we can skip the whole computation below and
1557 // return that Src is not a public base of Dst. Record all inheritance paths.
1558 if (!Dst->isDerivedFrom(Src, Paths))
1559 return CharUnits::fromQuantity(-2ULL);
1560
1561 unsigned NumPublicPaths = 0;
1562 CharUnits Offset;
1563
1564 // Now walk all possible inheritance paths.
1565 for (const CXXBasePath &Path : Paths) {
1566 if (Path.Access != AS_public) // Ignore non-public inheritance.
1567 continue;
1568
1569 ++NumPublicPaths;
1570
1571 for (const CXXBasePathElement &PathElement : Path) {
1572 // If the path contains a virtual base class we can't give any hint.
1573 // -1: no hint.
1574 if (PathElement.Base->isVirtual())
1575 return CharUnits::fromQuantity(-1ULL);
1576
1577 if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1578 continue;
1579
1580 // Accumulate the base class offsets.
1581 const ASTRecordLayout &L = Context.getASTRecordLayout(PathElement.Class);
1582 Offset += L.getBaseClassOffset(
1583 PathElement.Base->getType()->getAsCXXRecordDecl());
1584 }
1585 }
1586
1587 // -2: Src is not a public base of Dst.
1588 if (NumPublicPaths == 0)
1589 return CharUnits::fromQuantity(-2ULL);
1590
1591 // -3: Src is a multiple public base type but never a virtual base type.
1592 if (NumPublicPaths > 1)
1593 return CharUnits::fromQuantity(-3ULL);
1594
1595 // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1596 // Return the offset of Src from the origin of Dst.
1597 return Offset;
1598}
1599
1600static llvm::FunctionCallee getBadTypeidFn(CodeGenFunction &CGF) {
1601 // void __cxa_bad_typeid();
1602 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1603
1604 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1605}
1606
1607bool ItaniumCXXABI::shouldTypeidBeNullChecked(QualType SrcRecordTy) {
1608 return true;
1609}
1610
1611void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1612 llvm::FunctionCallee Fn = getBadTypeidFn(CGF);
1613 llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn);
1614 Call->setDoesNotReturn();
1615 CGF.Builder.CreateUnreachable();
1616}
1617
1618llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1619 QualType SrcRecordTy,
1620 Address ThisPtr,
1621 llvm::Type *StdTypeInfoPtrTy) {
1622 auto *ClassDecl = SrcRecordTy->castAsCXXRecordDecl();
1623 llvm::Value *Value = CGF.GetVTablePtr(ThisPtr, CGM.GlobalsInt8PtrTy,
1624 ClassDecl);
1625
1626 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1627 // Load the type info.
1628 Value = CGF.Builder.CreateCall(
1629 CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}),
1630 {Value, llvm::ConstantInt::get(CGM.Int32Ty, -4)});
1631 } else {
1632 // Load the type info.
1633 Value =
1634 CGF.Builder.CreateConstInBoundsGEP1_64(StdTypeInfoPtrTy, Value, -1ULL);
1635 }
1636 return CGF.Builder.CreateAlignedLoad(StdTypeInfoPtrTy, Value,
1637 CGF.getPointerAlign());
1638}
1639
1640bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1641 QualType SrcRecordTy) {
1642 return SrcIsPtr;
1643}
1644
1645llvm::Value *ItaniumCXXABI::emitDynamicCastCall(
1646 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy,
1647 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1648 llvm::Type *PtrDiffLTy =
1650
1651 llvm::Value *SrcRTTI =
1653 llvm::Value *DestRTTI =
1655
1656 // Compute the offset hint.
1657 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1658 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1659 llvm::Value *OffsetHint = llvm::ConstantInt::get(
1660 PtrDiffLTy,
1661 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1662
1663 // Emit the call to __dynamic_cast.
1664 llvm::Value *Value = ThisAddr.emitRawPointer(CGF);
1665 if (CGM.getCodeGenOpts().PointerAuth.CXXVTablePointers) {
1666 // We perform a no-op load of the vtable pointer here to force an
1667 // authentication. In environments that do not support pointer
1668 // authentication this is a an actual no-op that will be elided. When
1669 // pointer authentication is supported and enforced on vtable pointers this
1670 // load can trap.
1671 llvm::Value *Vtable =
1672 CGF.GetVTablePtr(ThisAddr, CGM.Int8PtrTy, SrcDecl,
1673 CodeGenFunction::VTableAuthMode::MustTrap);
1674 assert(Vtable);
1675 (void)Vtable;
1676 }
1677
1678 llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1680
1681 /// C++ [expr.dynamic.cast]p9:
1682 /// A failed cast to reference type throws std::bad_cast
1683 if (DestTy->isReferenceType()) {
1684 llvm::BasicBlock *BadCastBlock =
1685 CGF.createBasicBlock("dynamic_cast.bad_cast");
1686
1687 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1688 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1689
1690 CGF.EmitBlock(BadCastBlock);
1691 EmitBadCastCall(CGF);
1692 }
1693
1694 return Value;
1695}
1696
1697std::optional<CGCXXABI::ExactDynamicCastInfo>
1698ItaniumCXXABI::getExactDynamicCastInfo(QualType SrcRecordTy, QualType DestTy,
1699 QualType DestRecordTy) {
1700 assert(shouldEmitExactDynamicCast(DestRecordTy));
1701
1702 ASTContext &Context = getContext();
1703
1704 // Find all the inheritance paths.
1705 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1706 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1707 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1708 /*DetectVirtual=*/false);
1709 (void)DestDecl->isDerivedFrom(SrcDecl, Paths);
1710
1711 // Find an offset within `DestDecl` where a `SrcDecl` instance and its vptr
1712 // might appear.
1713 std::optional<CharUnits> Offset;
1714 for (const CXXBasePath &Path : Paths) {
1715 // dynamic_cast only finds public inheritance paths.
1716 if (Path.Access != AS_public)
1717 continue;
1718
1719 CharUnits PathOffset;
1720 for (const CXXBasePathElement &PathElement : Path) {
1721 // Find the offset along this inheritance step.
1722 const CXXRecordDecl *Base =
1723 PathElement.Base->getType()->getAsCXXRecordDecl();
1724 if (PathElement.Base->isVirtual()) {
1725 // For a virtual base class, we know that the derived class is exactly
1726 // DestDecl, so we can use the vbase offset from its layout.
1727 const ASTRecordLayout &L = Context.getASTRecordLayout(DestDecl);
1728 PathOffset = L.getVBaseClassOffset(Base);
1729 } else {
1730 const ASTRecordLayout &L =
1731 Context.getASTRecordLayout(PathElement.Class);
1732 PathOffset += L.getBaseClassOffset(Base);
1733 }
1734 }
1735
1736 if (!Offset)
1737 Offset = PathOffset;
1738 else if (Offset != PathOffset) {
1739 // Base appears in at least two different places.
1740 return ExactDynamicCastInfo{/*RequiresCastToPrimaryBase=*/true,
1741 CharUnits::Zero()};
1742 }
1743 }
1744 if (!Offset)
1745 return std::nullopt;
1746 return ExactDynamicCastInfo{/*RequiresCastToPrimaryBase=*/false, *Offset};
1747}
1748
1749llvm::Value *ItaniumCXXABI::emitExactDynamicCast(
1750 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy,
1751 QualType DestTy, QualType DestRecordTy,
1752 const ExactDynamicCastInfo &ExactCastInfo, llvm::BasicBlock *CastSuccess,
1753 llvm::BasicBlock *CastFail) {
1754 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1755 const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1756 auto AuthenticateVTable = [&](Address ThisAddr, const CXXRecordDecl *Decl) {
1757 if (!CGF.getLangOpts().PointerAuthCalls)
1758 return;
1759 (void)CGF.GetVTablePtr(ThisAddr, CGF.DefaultPtrTy, Decl,
1760 CodeGenFunction::VTableAuthMode::MustTrap);
1761 };
1762
1763 bool PerformPostCastAuthentication = false;
1764 llvm::Value *VTable = nullptr;
1765 if (ExactCastInfo.RequiresCastToPrimaryBase) {
1766 // Base appears in at least two different places. Find the most-derived
1767 // object and see if it's a DestDecl. Note that the most-derived object
1768 // must be at least as aligned as this base class subobject, and must
1769 // have a vptr at offset 0.
1770 llvm::Value *PrimaryBase =
1771 emitDynamicCastToVoid(CGF, ThisAddr, SrcRecordTy);
1772 ThisAddr = Address(PrimaryBase, CGF.VoidPtrTy, ThisAddr.getAlignment());
1773 SrcDecl = DestDecl;
1774 // This unauthenticated load is unavoidable, so we're relying on the
1775 // authenticated load in the dynamic cast to void, and we'll manually
1776 // authenticate the resulting v-table at the end of the cast check.
1777 PerformPostCastAuthentication = CGF.getLangOpts().PointerAuthCalls;
1778 CGPointerAuthInfo StrippingAuthInfo(0, PointerAuthenticationMode::Strip,
1779 false, false, nullptr);
1780 Address VTablePtrPtr = ThisAddr.withElementType(CGF.VoidPtrPtrTy);
1781 VTable = CGF.Builder.CreateLoad(VTablePtrPtr, "vtable");
1782 if (PerformPostCastAuthentication)
1783 VTable = CGF.EmitPointerAuthAuth(StrippingAuthInfo, VTable);
1784 } else
1785 VTable = CGF.GetVTablePtr(ThisAddr, CGF.DefaultPtrTy, SrcDecl);
1786
1787 // Compare the vptr against the expected vptr for the destination type at
1788 // this offset.
1789 llvm::Constant *ExpectedVTable = getVTableAddressPoint(
1790 BaseSubobject(SrcDecl, ExactCastInfo.Offset), DestDecl);
1791 llvm::Value *Success = CGF.Builder.CreateICmpEQ(VTable, ExpectedVTable);
1792 llvm::Value *AdjustedThisPtr = ThisAddr.emitRawPointer(CGF);
1793
1794 if (!ExactCastInfo.Offset.isZero()) {
1795 CharUnits::QuantityType Offset = ExactCastInfo.Offset.getQuantity();
1796 llvm::Constant *OffsetConstant =
1797 llvm::ConstantInt::get(CGF.PtrDiffTy, -Offset);
1798 AdjustedThisPtr = CGF.Builder.CreateInBoundsGEP(CGF.CharTy, AdjustedThisPtr,
1799 OffsetConstant);
1800 PerformPostCastAuthentication = CGF.getLangOpts().PointerAuthCalls;
1801 }
1802
1803 if (PerformPostCastAuthentication) {
1804 // If we've changed the object pointer we authenticate the vtable pointer
1805 // of the resulting object.
1806 llvm::BasicBlock *NonNullBlock = CGF.Builder.GetInsertBlock();
1807 llvm::BasicBlock *PostCastAuthSuccess =
1808 CGF.createBasicBlock("dynamic_cast.postauth.success");
1809 llvm::BasicBlock *PostCastAuthComplete =
1810 CGF.createBasicBlock("dynamic_cast.postauth.complete");
1811 CGF.Builder.CreateCondBr(Success, PostCastAuthSuccess,
1812 PostCastAuthComplete);
1813 CGF.EmitBlock(PostCastAuthSuccess);
1814 Address AdjustedThisAddr =
1815 Address(AdjustedThisPtr, CGF.IntPtrTy, CGF.getPointerAlign());
1816 AuthenticateVTable(AdjustedThisAddr, DestDecl);
1817 CGF.EmitBranch(PostCastAuthComplete);
1818 CGF.EmitBlock(PostCastAuthComplete);
1819 llvm::PHINode *PHI = CGF.Builder.CreatePHI(AdjustedThisPtr->getType(), 2);
1820 PHI->addIncoming(AdjustedThisPtr, PostCastAuthSuccess);
1821 llvm::Value *NullValue =
1822 llvm::Constant::getNullValue(AdjustedThisPtr->getType());
1823 PHI->addIncoming(NullValue, NonNullBlock);
1824 AdjustedThisPtr = PHI;
1825 }
1826 CGF.Builder.CreateCondBr(Success, CastSuccess, CastFail);
1827 return AdjustedThisPtr;
1828}
1829
1830llvm::Value *ItaniumCXXABI::emitDynamicCastToVoid(CodeGenFunction &CGF,
1831 Address ThisAddr,
1832 QualType SrcRecordTy) {
1833 auto *ClassDecl = SrcRecordTy->castAsCXXRecordDecl();
1834 llvm::Value *OffsetToTop;
1835 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1836 // Get the vtable pointer.
1837 llvm::Value *VTable =
1838 CGF.GetVTablePtr(ThisAddr, CGF.DefaultPtrTy, ClassDecl);
1839
1840 // Get the offset-to-top from the vtable.
1841 OffsetToTop =
1842 CGF.Builder.CreateConstInBoundsGEP1_32(CGM.Int32Ty, VTable, -2U);
1843 OffsetToTop = CGF.Builder.CreateAlignedLoad(
1844 CGM.Int32Ty, OffsetToTop, CharUnits::fromQuantity(4), "offset.to.top");
1845 } else {
1846 llvm::Type *PtrDiffLTy =
1848
1849 // Get the vtable pointer.
1850 llvm::Value *VTable =
1851 CGF.GetVTablePtr(ThisAddr, CGF.DefaultPtrTy, ClassDecl);
1852
1853 // Get the offset-to-top from the vtable.
1854 OffsetToTop =
1855 CGF.Builder.CreateConstInBoundsGEP1_64(PtrDiffLTy, VTable, -2ULL);
1856 OffsetToTop = CGF.Builder.CreateAlignedLoad(
1857 PtrDiffLTy, OffsetToTop, CGF.getPointerAlign(), "offset.to.top");
1858 }
1859 // Finally, add the offset to the pointer.
1860 return CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, ThisAddr.emitRawPointer(CGF),
1861 OffsetToTop);
1862}
1863
1864bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1865 llvm::FunctionCallee Fn = getBadCastFn(CGF);
1866 llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn);
1867 Call->setDoesNotReturn();
1868 CGF.Builder.CreateUnreachable();
1869 return true;
1870}
1871
1872llvm::Value *
1873ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1874 Address This,
1875 const CXXRecordDecl *ClassDecl,
1876 const CXXRecordDecl *BaseClassDecl) {
1877 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl);
1878 CharUnits VBaseOffsetOffset =
1879 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1880 BaseClassDecl);
1881 llvm::Value *VBaseOffsetPtr =
1882 CGF.Builder.CreateConstGEP1_64(
1883 CGF.Int8Ty, VTablePtr, VBaseOffsetOffset.getQuantity(),
1884 "vbase.offset.ptr");
1885
1886 llvm::Value *VBaseOffset;
1887 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1888 VBaseOffset = CGF.Builder.CreateAlignedLoad(
1889 CGF.Int32Ty, VBaseOffsetPtr, CharUnits::fromQuantity(4),
1890 "vbase.offset");
1891 } else {
1892 VBaseOffset = CGF.Builder.CreateAlignedLoad(
1893 CGM.PtrDiffTy, VBaseOffsetPtr, CGF.getPointerAlign(), "vbase.offset");
1894 }
1895 return VBaseOffset;
1896}
1897
1898void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1899 // Just make sure we're in sync with TargetCXXABI.
1900 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1901
1902 // The constructor used for constructing this as a base class;
1903 // ignores virtual bases.
1904 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1905
1906 // The constructor used for constructing this as a complete class;
1907 // constructs the virtual bases, then calls the base constructor.
1908 if (!D->getParent()->isAbstract()) {
1909 // We don't need to emit the complete ctor if the class is abstract.
1910 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1911 }
1912}
1913
1914CGCXXABI::AddedStructorArgCounts
1915ItaniumCXXABI::buildStructorSignature(GlobalDecl GD,
1916 SmallVectorImpl<CanQualType> &ArgTys) {
1917 ASTContext &Context = getContext();
1918
1919 // All parameters are already in place except VTT, which goes after 'this'.
1920 // These are Clang types, so we don't need to worry about sret yet.
1921
1922 // Check if we need to add a VTT parameter (which has type global void **).
1924 : GD.getDtorType() == Dtor_Base) &&
1925 cast<CXXMethodDecl>(GD.getDecl())->getParent()->getNumVBases() != 0) {
1926 LangAS AS = CGM.GetGlobalVarAddressSpace(nullptr);
1927 QualType Q = Context.getAddrSpaceQualType(Context.VoidPtrTy, AS);
1928 ArgTys.insert(ArgTys.begin() + 1,
1930 return AddedStructorArgCounts::prefix(1);
1931 }
1932 return AddedStructorArgCounts{};
1933}
1934
1935void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1936 // The destructor used for destructing this as a base class; ignores
1937 // virtual bases.
1938 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1939
1940 // The destructor used for destructing this as a most-derived class;
1941 // call the base destructor and then destructs any virtual bases.
1942 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1943
1944 // The destructor in a virtual table is always a 'deleting'
1945 // destructor, which calls the complete destructor and then uses the
1946 // appropriate operator delete.
1947 if (D->isVirtual())
1948 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
1949}
1950
1951void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1952 QualType &ResTy,
1953 FunctionArgList &Params) {
1954 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1956
1957 // Check if we need a VTT parameter as well.
1958 if (NeedsVTTParameter(CGF.CurGD)) {
1959 ASTContext &Context = getContext();
1960
1961 // FIXME: avoid the fake decl
1962 LangAS AS = CGM.GetGlobalVarAddressSpace(nullptr);
1963 QualType Q = Context.getAddrSpaceQualType(Context.VoidPtrTy, AS);
1964 QualType T = Context.getPointerType(Q);
1965 auto *VTTDecl = ImplicitParamDecl::Create(
1966 Context, /*DC=*/nullptr, MD->getLocation(), &Context.Idents.get("vtt"),
1967 T, ImplicitParamKind::CXXVTT);
1968 Params.insert(Params.begin() + 1, VTTDecl);
1969 getStructorImplicitParamDecl(CGF) = VTTDecl;
1970 }
1971}
1972
1973void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1974 // Naked functions have no prolog.
1975 if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>())
1976 return;
1977
1978 /// Initialize the 'this' slot. In the Itanium C++ ABI, no prologue
1979 /// adjustments are required, because they are all handled by thunks.
1980 setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF));
1981
1982 /// Initialize the 'vtt' slot if needed.
1983 if (getStructorImplicitParamDecl(CGF)) {
1984 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1985 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
1986 }
1987
1988 /// If this is a function that the ABI specifies returns 'this', initialize
1989 /// the return slot to 'this' at the start of the function.
1990 ///
1991 /// Unlike the setting of return types, this is done within the ABI
1992 /// implementation instead of by clients of CGCXXABI because:
1993 /// 1) getThisValue is currently protected
1994 /// 2) in theory, an ABI could implement 'this' returns some other way;
1995 /// HasThisReturn only specifies a contract, not the implementation
1996 if (HasThisReturn(CGF.CurGD))
1997 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1998}
1999
2000CGCXXABI::AddedStructorArgs ItaniumCXXABI::getImplicitConstructorArgs(
2001 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
2002 bool ForVirtualBase, bool Delegating) {
2003 if (!NeedsVTTParameter(GlobalDecl(D, Type)))
2004 return AddedStructorArgs{};
2005
2006 // Insert the implicit 'vtt' argument as the second argument. Make sure to
2007 // correctly reflect its address space, which can differ from generic on
2008 // some targets.
2009 llvm::Value *VTT =
2010 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
2011 LangAS AS = CGM.GetGlobalVarAddressSpace(nullptr);
2012 QualType Q = getContext().getAddrSpaceQualType(getContext().VoidPtrTy, AS);
2013 QualType VTTTy = getContext().getPointerType(Q);
2014 return AddedStructorArgs::prefix({{VTT, VTTTy}});
2015}
2016
2017llvm::Value *ItaniumCXXABI::getCXXDestructorImplicitParam(
2018 CodeGenFunction &CGF, const CXXDestructorDecl *DD, CXXDtorType Type,
2019 bool ForVirtualBase, bool Delegating) {
2020 GlobalDecl GD(DD, Type);
2021 return CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
2022}
2023
2024void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
2025 const CXXDestructorDecl *DD,
2026 CXXDtorType Type, bool ForVirtualBase,
2027 bool Delegating, Address This,
2028 QualType ThisTy) {
2029 GlobalDecl GD(DD, Type);
2030 llvm::Value *VTT =
2031 getCXXDestructorImplicitParam(CGF, DD, Type, ForVirtualBase, Delegating);
2032 QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
2033
2034 CGCallee Callee;
2035 if (getContext().getLangOpts().AppleKext &&
2036 Type != Dtor_Base && DD->isVirtual())
2038 else
2039 Callee = CGCallee::forDirect(CGM.getAddrOfCXXStructor(GD), GD);
2040
2041 CGF.EmitCXXDestructorCall(GD, Callee, CGF.getAsNaturalPointerTo(This, ThisTy),
2042 ThisTy, VTT, VTTTy, nullptr);
2043}
2044
2045// Check if any non-inline method has the specified attribute.
2046template <typename T>
2048 for (const auto *D : RD->noload_decls()) {
2049 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
2050 if (FD->isInlined() || FD->doesThisDeclarationHaveABody() ||
2051 FD->isPureVirtual())
2052 continue;
2053 if (D->hasAttr<T>())
2054 return true;
2055 }
2056 }
2057
2058 return false;
2059}
2060
2062 llvm::GlobalVariable *VTable,
2063 const CXXRecordDecl *RD) {
2064 if (VTable->getDLLStorageClass() !=
2065 llvm::GlobalVariable::DefaultStorageClass ||
2066 RD->hasAttr<DLLImportAttr>() || RD->hasAttr<DLLExportAttr>())
2067 return;
2068
2069 if (CGM.getVTables().isVTableExternal(RD)) {
2071 VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
2073 VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
2074}
2075
2076void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
2077 const CXXRecordDecl *RD) {
2078 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
2079 if (VTable->hasInitializer())
2080 return;
2081
2082 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
2083 const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
2084 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
2085 llvm::Constant *RTTI =
2086 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getCanonicalTagType(RD));
2087
2088 // Create and set the initializer.
2089 ConstantInitBuilder builder(CGM);
2090 auto components = builder.beginStruct();
2091 CGVT.createVTableInitializer(components, VTLayout, RTTI,
2092 llvm::GlobalValue::isLocalLinkage(Linkage));
2093 components.finishAndSetAsInitializer(VTable);
2094
2095 // Set the correct linkage.
2096 VTable->setLinkage(Linkage);
2097
2098 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
2099 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
2100
2101 if (CGM.getTarget().hasPS4DLLImportExport())
2102 setVTableSelectiveDLLImportExport(CGM, VTable, RD);
2103
2104 // Set the right visibility.
2105 CGM.setGVProperties(VTable, RD);
2106
2107 // If this is the magic class __cxxabiv1::__fundamental_type_info,
2108 // we will emit the typeinfo for the fundamental types. This is the
2109 // same behaviour as GCC.
2110 const DeclContext *DC = RD->getDeclContext();
2111 if (RD->getIdentifier() &&
2112 RD->getIdentifier()->isStr("__fundamental_type_info") &&
2113 isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
2114 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
2116 EmitFundamentalRTTIDescriptors(RD);
2117
2118 // Always emit type metadata on non-available_externally definitions, and on
2119 // available_externally definitions if we are performing whole program
2120 // devirtualization or speculative devirtualization. We need the type metadata
2121 // on all vtable definitions to ensure we associate derived classes with base
2122 // classes defined in headers but with a strong definition only in a shared
2123 // library.
2124 if (!VTable->isDeclarationForLinker() ||
2125 CGM.getCodeGenOpts().WholeProgramVTables ||
2126 CGM.getCodeGenOpts().DevirtualizeSpeculatively) {
2127 CGM.EmitVTableTypeMetadata(RD, VTable, VTLayout);
2128 // For available_externally definitions, add the vtable to
2129 // @llvm.compiler.used so that it isn't deleted before whole program
2130 // analysis.
2131 if (VTable->isDeclarationForLinker()) {
2132 assert(CGM.getCodeGenOpts().WholeProgramVTables ||
2133 CGM.getCodeGenOpts().DevirtualizeSpeculatively);
2134 CGM.addCompilerUsedGlobal(VTable);
2135 }
2136 }
2137
2138 if (VTContext.isRelativeLayout()) {
2139 CGVT.RemoveHwasanMetadata(VTable);
2140 if (!VTable->isDSOLocal())
2141 CGVT.GenerateRelativeVTableAlias(VTable, VTable->getName());
2142 }
2143
2144 // Emit symbol for debugger only if requested debug info.
2145 if (CGDebugInfo *DI = CGM.getModuleDebugInfo())
2146 DI->emitVTableSymbol(VTable, RD);
2147}
2148
2149bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField(
2150 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) {
2151 if (Vptr.NearestVBase == nullptr)
2152 return false;
2153 return NeedsVTTParameter(CGF.CurGD);
2154}
2155
2156llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
2157 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
2158 const CXXRecordDecl *NearestVBase) {
2159
2160 if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
2161 NeedsVTTParameter(CGF.CurGD)) {
2162 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base,
2163 NearestVBase);
2164 }
2165 return getVTableAddressPoint(Base, VTableClass);
2166}
2167
2168llvm::Constant *
2169ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base,
2170 const CXXRecordDecl *VTableClass) {
2171 llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, CharUnits());
2172
2173 // Find the appropriate vtable within the vtable group, and the address point
2174 // within that vtable.
2175 const VTableLayout &Layout =
2176 CGM.getItaniumVTableContext().getVTableLayout(VTableClass);
2177 VTableLayout::AddressPointLocation AddressPoint =
2178 Layout.getAddressPoint(Base);
2179 llvm::Value *Indices[] = {
2180 llvm::ConstantInt::get(CGM.Int32Ty, 0),
2181 llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.VTableIndex),
2182 llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.AddressPointIndex),
2183 };
2184
2185 // Add inrange attribute to indicate that only the VTableIndex can be
2186 // accessed.
2187 unsigned ComponentSize =
2188 CGM.getDataLayout().getTypeAllocSize(CGM.getVTableComponentType());
2189 unsigned VTableSize =
2190 ComponentSize * Layout.getVTableSize(AddressPoint.VTableIndex);
2191 unsigned Offset = ComponentSize * AddressPoint.AddressPointIndex;
2192 llvm::ConstantRange InRange(
2193 llvm::APInt(32, (int)-Offset, true),
2194 llvm::APInt(32, (int)(VTableSize - Offset), true));
2195 return llvm::ConstantExpr::getGetElementPtr(
2196 VTable->getValueType(), VTable, Indices, /*InBounds=*/true, InRange);
2197}
2198
2199llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
2200 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
2201 const CXXRecordDecl *NearestVBase) {
2202 assert((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
2203 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT");
2204
2205 // Get the secondary vpointer index.
2206 uint64_t VirtualPointerIndex =
2207 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
2208
2209 /// Load the VTT.
2210 llvm::Value *VTT = CGF.LoadCXXVTT();
2211 if (VirtualPointerIndex)
2212 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(CGF.GlobalsVoidPtrTy, VTT,
2213 VirtualPointerIndex);
2214
2215 // And load the address point from the VTT.
2216 llvm::Value *AP =
2218 CGF.getPointerAlign());
2219
2220 if (auto &Schema = CGF.CGM.getCodeGenOpts().PointerAuth.CXXVTTVTablePointers) {
2221 CGPointerAuthInfo PointerAuth = CGF.EmitPointerAuthInfo(Schema, VTT,
2222 GlobalDecl(),
2223 QualType());
2224 AP = CGF.EmitPointerAuthAuth(PointerAuth, AP);
2225 }
2226
2227 return AP;
2228}
2229
2230llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
2231 CharUnits VPtrOffset) {
2232 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
2233
2234 llvm::GlobalVariable *&VTable = VTables[RD];
2235 if (VTable)
2236 return VTable;
2237
2238 // Queue up this vtable for possible deferred emission.
2239 CGM.addDeferredVTable(RD);
2240
2241 SmallString<256> Name;
2242 llvm::raw_svector_ostream Out(Name);
2243 getMangleContext().mangleCXXVTable(RD, Out);
2244
2245 const VTableLayout &VTLayout =
2246 CGM.getItaniumVTableContext().getVTableLayout(RD);
2247 llvm::Type *VTableType = CGM.getVTables().getVTableType(VTLayout);
2248
2249 // Use pointer to global alignment for the vtable. Otherwise we would align
2250 // them based on the size of the initializer which doesn't make sense as only
2251 // single values are read.
2252 unsigned PAlign = CGM.getVtableGlobalVarAlignment();
2253
2254 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
2255 Name, VTableType, llvm::GlobalValue::ExternalLinkage,
2256 getContext().toCharUnitsFromBits(PAlign).getAsAlign());
2257 VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2258
2259 if (CGM.getTarget().hasPS4DLLImportExport())
2260 setVTableSelectiveDLLImportExport(CGM, VTable, RD);
2261
2262 CGM.setGVProperties(VTable, RD);
2263 return VTable;
2264}
2265
2266CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
2267 GlobalDecl GD,
2268 Address This,
2269 llvm::Type *Ty,
2270 SourceLocation Loc) {
2271 llvm::Type *PtrTy = CGM.GlobalsInt8PtrTy;
2272 auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl());
2273 llvm::Value *VTable = CGF.GetVTablePtr(This, PtrTy, MethodDecl->getParent());
2274
2275 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
2276 llvm::Value *VFunc, *VTableSlotPtr = nullptr;
2277 auto &Schema = CGM.getCodeGenOpts().PointerAuth.CXXVirtualFunctionPointers;
2278
2279 llvm::Type *ComponentTy = CGM.getVTables().getVTableComponentType();
2280 uint64_t ByteOffset =
2281 VTableIndex * CGM.getDataLayout().getTypeSizeInBits(ComponentTy) / 8;
2282
2283 if (!Schema && CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) {
2284 VFunc = CGF.EmitVTableTypeCheckedLoad(MethodDecl->getParent(), VTable,
2285 PtrTy, ByteOffset);
2286 } else {
2287 CGF.EmitTypeMetadataCodeForVCall(MethodDecl->getParent(), VTable, Loc);
2288
2289 llvm::Value *VFuncLoad;
2290 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
2291 VFuncLoad = CGF.Builder.CreateCall(
2292 CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}),
2293 {VTable, llvm::ConstantInt::get(CGM.Int32Ty, ByteOffset)});
2294 } else {
2295 VTableSlotPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
2296 PtrTy, VTable, VTableIndex, "vfn");
2297 VFuncLoad = CGF.Builder.CreateAlignedLoad(PtrTy, VTableSlotPtr,
2298 CGF.getPointerAlign());
2299 }
2300
2301 // Add !invariant.load md to virtual function load to indicate that
2302 // function didn't change inside vtable.
2303 // It's safe to add it without -fstrict-vtable-pointers, but it would not
2304 // help in devirtualization because it will only matter if we will have 2
2305 // the same virtual function loads from the same vtable load, which won't
2306 // happen without enabled devirtualization with -fstrict-vtable-pointers.
2307 if (CGM.getCodeGenOpts().OptimizationLevel > 0 &&
2308 CGM.getCodeGenOpts().StrictVTablePointers) {
2309 if (auto *VFuncLoadInstr = dyn_cast<llvm::Instruction>(VFuncLoad)) {
2310 VFuncLoadInstr->setMetadata(
2311 llvm::LLVMContext::MD_invariant_load,
2312 llvm::MDNode::get(CGM.getLLVMContext(),
2313 llvm::ArrayRef<llvm::Metadata *>()));
2314 }
2315 }
2316 VFunc = VFuncLoad;
2317 }
2318
2319 CGPointerAuthInfo PointerAuth;
2320 if (Schema) {
2321 assert(VTableSlotPtr && "virtual function pointer not set");
2322 GD = CGM.getItaniumVTableContext().findOriginalMethod(GD.getCanonicalDecl());
2323 PointerAuth = CGF.EmitPointerAuthInfo(Schema, VTableSlotPtr, GD, QualType());
2324 }
2325 CGCallee Callee(GD, VFunc, PointerAuth);
2326 return Callee;
2327}
2328
2329llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
2330 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
2331 Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke) {
2332 auto *CE = dyn_cast<const CXXMemberCallExpr *>(E);
2333 auto *D = dyn_cast<const CXXDeleteExpr *>(E);
2334 assert((CE != nullptr) ^ (D != nullptr));
2335 assert(CE == nullptr || CE->arguments().empty());
2336 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
2337
2338 GlobalDecl GD(Dtor, DtorType);
2339 const CGFunctionInfo *FInfo =
2340 &CGM.getTypes().arrangeCXXStructorDeclaration(GD);
2341 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
2342 CGCallee Callee = CGCallee::forVirtual(CE, GD, This, Ty);
2343
2344 QualType ThisTy;
2345 if (CE) {
2346 ThisTy = CE->getObjectType();
2347 } else {
2348 ThisTy = D->getDestroyedType();
2349 }
2350
2351 CGF.EmitCXXDestructorCall(GD, Callee, This.emitRawPointer(CGF), ThisTy,
2352 nullptr, QualType(), nullptr, CallOrInvoke);
2353 return nullptr;
2354}
2355
2356void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
2357 CodeGenVTables &VTables = CGM.getVTables();
2358 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
2359 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
2360}
2361
2362bool ItaniumCXXABI::canSpeculativelyEmitVTableAsBaseClass(
2363 const CXXRecordDecl *RD) const {
2364 // We don't emit available_externally vtables if we are in -fapple-kext mode
2365 // because kext mode does not permit devirtualization.
2366 if (CGM.getLangOpts().AppleKext)
2367 return false;
2368
2369 // If the vtable is hidden then it is not safe to emit an available_externally
2370 // copy of vtable.
2371 if (isVTableHidden(RD))
2372 return false;
2373
2374 if (CGM.getCodeGenOpts().ForceEmitVTables)
2375 return true;
2376
2377 // A speculative vtable can only be generated if all virtual inline functions
2378 // defined by this class are emitted. The vtable in the final program contains
2379 // for each virtual inline function not used in the current TU a function that
2380 // is equivalent to the unused function. The function in the actual vtable
2381 // does not have to be declared under the same symbol (e.g., a virtual
2382 // destructor that can be substituted with its base class's destructor). Since
2383 // inline functions are emitted lazily and this emissions does not account for
2384 // speculative emission of a vtable, we might generate a speculative vtable
2385 // with references to inline functions that are not emitted under that name.
2386 // This can lead to problems when devirtualizing a call to such a function,
2387 // that result in linking errors. Hence, if there are any unused virtual
2388 // inline function, we cannot emit the speculative vtable.
2389 // FIXME we can still emit a copy of the vtable if we
2390 // can emit definition of the inline functions.
2391 if (hasAnyUnusedVirtualInlineFunction(RD))
2392 return false;
2393
2394 // For a class with virtual bases, we must also be able to speculatively
2395 // emit the VTT, because CodeGen doesn't have separate notions of "can emit
2396 // the vtable" and "can emit the VTT". For a base subobject, this means we
2397 // need to be able to emit non-virtual base vtables.
2398 if (RD->getNumVBases()) {
2399 for (const auto &B : RD->bases()) {
2400 auto *BRD = B.getType()->getAsCXXRecordDecl();
2401 assert(BRD && "no class for base specifier");
2402 if (B.isVirtual() || !BRD->isDynamicClass())
2403 continue;
2404 if (!canSpeculativelyEmitVTableAsBaseClass(BRD))
2405 return false;
2406 }
2407 }
2408
2409 return true;
2410}
2411
2412bool ItaniumCXXABI::canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const {
2413 if (!canSpeculativelyEmitVTableAsBaseClass(RD))
2414 return false;
2415
2417 return false;
2418
2419 // For a complete-object vtable (or more specifically, for the VTT), we need
2420 // to be able to speculatively emit the vtables of all dynamic virtual bases.
2421 for (const auto &B : RD->vbases()) {
2422 auto *BRD = B.getType()->getAsCXXRecordDecl();
2423 assert(BRD && "no class for base specifier");
2424 if (!BRD->isDynamicClass())
2425 continue;
2426 if (!canSpeculativelyEmitVTableAsBaseClass(BRD))
2427 return false;
2428 }
2429
2430 return true;
2431}
2433 Address InitialPtr,
2434 const CXXRecordDecl *UnadjustedClass,
2435 int64_t NonVirtualAdjustment,
2436 int64_t VirtualAdjustment,
2437 bool IsReturnAdjustment) {
2438 if (!NonVirtualAdjustment && !VirtualAdjustment)
2439 return InitialPtr.emitRawPointer(CGF);
2440
2441 Address V = InitialPtr.withElementType(CGF.Int8Ty);
2442
2443 // In a base-to-derived cast, the non-virtual adjustment is applied first.
2444 if (NonVirtualAdjustment && !IsReturnAdjustment) {
2446 CharUnits::fromQuantity(NonVirtualAdjustment));
2447 }
2448
2449 // Perform the virtual adjustment if we have one.
2450 llvm::Value *ResultPtr;
2451 if (VirtualAdjustment) {
2452 llvm::Value *VTablePtr =
2453 CGF.GetVTablePtr(V, CGF.Int8PtrTy, UnadjustedClass);
2454
2455 llvm::Value *Offset;
2456 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
2457 CGF.Int8Ty, VTablePtr, VirtualAdjustment);
2459 // Load the adjustment offset from the vtable as a 32-bit int.
2460 Offset =
2461 CGF.Builder.CreateAlignedLoad(CGF.Int32Ty, OffsetPtr,
2463 } else {
2464 llvm::Type *PtrDiffTy =
2466
2467 // Load the adjustment offset from the vtable.
2468 Offset = CGF.Builder.CreateAlignedLoad(PtrDiffTy, OffsetPtr,
2469 CGF.getPointerAlign());
2470 }
2471 // Adjust our pointer.
2472 ResultPtr = CGF.Builder.CreateInBoundsGEP(V.getElementType(),
2473 V.emitRawPointer(CGF), Offset);
2474 } else {
2475 ResultPtr = V.emitRawPointer(CGF);
2476 }
2477
2478 // In a derived-to-base conversion, the non-virtual adjustment is
2479 // applied second.
2480 if (NonVirtualAdjustment && IsReturnAdjustment) {
2481 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(CGF.Int8Ty, ResultPtr,
2482 NonVirtualAdjustment);
2483 }
2484
2485 return ResultPtr;
2486}
2487
2488llvm::Value *
2489ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF, Address This,
2490 const CXXRecordDecl *UnadjustedClass,
2491 const ThunkInfo &TI) {
2492 return performTypeAdjustment(CGF, This, UnadjustedClass, TI.This.NonVirtual,
2494 /*IsReturnAdjustment=*/false);
2495}
2496
2497llvm::Value *
2498ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
2499 const CXXRecordDecl *UnadjustedClass,
2500 const ReturnAdjustment &RA) {
2501 return performTypeAdjustment(CGF, Ret, UnadjustedClass, RA.NonVirtual,
2503 /*IsReturnAdjustment=*/true);
2504}
2505
2506void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
2507 RValue RV, QualType ResultType) {
2509 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
2510
2511 // Destructor thunks in the ARM ABI have indeterminate results.
2512 llvm::Type *T = CGF.ReturnValue.getElementType();
2513 RValue Undef = RValue::get(llvm::UndefValue::get(T));
2514 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
2515}
2516
2517/************************** Array allocation cookies **************************/
2518
2519CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
2520 // The array cookie is a size_t; pad that up to the element alignment.
2521 // The cookie is actually right-justified in that space.
2522 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
2523 CGM.getContext().getPreferredTypeAlignInChars(elementType));
2524}
2525
2526Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
2527 Address NewPtr,
2528 llvm::Value *NumElements,
2529 const CXXNewExpr *expr,
2530 QualType ElementType) {
2531 assert(requiresArrayCookie(expr));
2532
2533 unsigned AS = NewPtr.getAddressSpace();
2534
2535 ASTContext &Ctx = getContext();
2536 CharUnits SizeSize = CGF.getSizeSize();
2537
2538 // The size of the cookie.
2539 CharUnits CookieSize =
2540 std::max(SizeSize, Ctx.getPreferredTypeAlignInChars(ElementType));
2541 assert(CookieSize == getArrayCookieSizeImpl(ElementType));
2542
2543 // Compute an offset to the cookie.
2544 Address CookiePtr = NewPtr;
2545 CharUnits CookieOffset = CookieSize - SizeSize;
2546 if (!CookieOffset.isZero())
2547 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset);
2548
2549 // Write the number of elements into the appropriate slot.
2550 Address NumElementsPtr = CookiePtr.withElementType(CGF.SizeTy);
2551 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
2552
2553 // Handle the array cookie specially in ASan.
2554 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
2555 (expr->getOperatorNew()->isReplaceableGlobalAllocationFunction() ||
2556 CGM.getCodeGenOpts().SanitizeAddressPoisonCustomArrayCookie)) {
2557 // The store to the CookiePtr does not need to be instrumented.
2558 SI->setNoSanitizeMetadata();
2559 llvm::FunctionType *FTy =
2560 llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false);
2561 llvm::FunctionCallee F =
2562 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
2563 CGF.Builder.CreateCall(F, NumElementsPtr.emitRawPointer(CGF));
2564 }
2565
2566 // Finally, compute a pointer to the actual data buffer by skipping
2567 // over the cookie completely.
2568 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize);
2569}
2570
2571llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
2572 Address allocPtr,
2573 CharUnits cookieSize) {
2574 // The element size is right-justified in the cookie.
2575 Address numElementsPtr = allocPtr;
2576 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize();
2577 if (!numElementsOffset.isZero())
2578 numElementsPtr =
2579 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset);
2580
2581 unsigned AS = allocPtr.getAddressSpace();
2582 numElementsPtr = numElementsPtr.withElementType(CGF.SizeTy);
2583 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
2584 return CGF.Builder.CreateLoad(numElementsPtr);
2585 // In asan mode emit a function call instead of a regular load and let the
2586 // run-time deal with it: if the shadow is properly poisoned return the
2587 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
2588 // We can't simply ignore this load using nosanitize metadata because
2589 // the metadata may be lost.
2590 llvm::FunctionType *FTy =
2591 llvm::FunctionType::get(CGF.SizeTy, CGF.DefaultPtrTy, false);
2592 llvm::FunctionCallee F =
2593 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
2594 return CGF.Builder.CreateCall(F, numElementsPtr.emitRawPointer(CGF));
2595}
2596
2597CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
2598 // ARM says that the cookie is always:
2599 // struct array_cookie {
2600 // std::size_t element_size; // element_size != 0
2601 // std::size_t element_count;
2602 // };
2603 // But the base ABI doesn't give anything an alignment greater than
2604 // 8, so we can dismiss this as typical ABI-author blindness to
2605 // actual language complexity and round up to the element alignment.
2606 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
2607 CGM.getContext().getTypeAlignInChars(elementType));
2608}
2609
2610Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
2611 Address newPtr,
2612 llvm::Value *numElements,
2613 const CXXNewExpr *expr,
2614 QualType elementType) {
2615 assert(requiresArrayCookie(expr));
2616
2617 // The cookie is always at the start of the buffer.
2618 Address cookie = newPtr;
2619
2620 // The first element is the element size.
2621 cookie = cookie.withElementType(CGF.SizeTy);
2622 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
2623 getContext().getTypeSizeInChars(elementType).getQuantity());
2624 CGF.Builder.CreateStore(elementSize, cookie);
2625
2626 // The second element is the element count.
2627 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1);
2628 CGF.Builder.CreateStore(numElements, cookie);
2629
2630 // Finally, compute a pointer to the actual data buffer by skipping
2631 // over the cookie completely.
2632 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
2633 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize);
2634}
2635
2636llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
2637 Address allocPtr,
2638 CharUnits cookieSize) {
2639 // The number of elements is at offset sizeof(size_t) relative to
2640 // the allocated pointer.
2641 Address numElementsPtr
2642 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize());
2643
2644 numElementsPtr = numElementsPtr.withElementType(CGF.SizeTy);
2645 return CGF.Builder.CreateLoad(numElementsPtr);
2646}
2647
2648/*********************** Static local initialization **************************/
2649
2650static llvm::FunctionCallee getGuardAcquireFn(CodeGenModule &CGM,
2651 llvm::PointerType *GuardPtrTy) {
2652 // int __cxa_guard_acquire(__guard *guard_object);
2653 llvm::FunctionType *FTy =
2654 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
2655 GuardPtrTy, /*isVarArg=*/false);
2656 return CGM.CreateRuntimeFunction(
2657 FTy, "__cxa_guard_acquire",
2658 llvm::AttributeList::get(CGM.getLLVMContext(),
2659 llvm::AttributeList::FunctionIndex,
2660 llvm::Attribute::NoUnwind));
2661}
2662
2663static llvm::FunctionCallee getGuardReleaseFn(CodeGenModule &CGM,
2664 llvm::PointerType *GuardPtrTy) {
2665 // void __cxa_guard_release(__guard *guard_object);
2666 llvm::FunctionType *FTy =
2667 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
2668 return CGM.CreateRuntimeFunction(
2669 FTy, "__cxa_guard_release",
2670 llvm::AttributeList::get(CGM.getLLVMContext(),
2671 llvm::AttributeList::FunctionIndex,
2672 llvm::Attribute::NoUnwind));
2673}
2674
2675static llvm::FunctionCallee getGuardAbortFn(CodeGenModule &CGM,
2676 llvm::PointerType *GuardPtrTy) {
2677 // void __cxa_guard_abort(__guard *guard_object);
2678 llvm::FunctionType *FTy =
2679 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
2680 return CGM.CreateRuntimeFunction(
2681 FTy, "__cxa_guard_abort",
2682 llvm::AttributeList::get(CGM.getLLVMContext(),
2683 llvm::AttributeList::FunctionIndex,
2684 llvm::Attribute::NoUnwind));
2685}
2686
2687namespace {
2688 struct CallGuardAbort final : EHScopeStack::Cleanup {
2689 llvm::GlobalVariable *Guard;
2690 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
2691
2692 void Emit(CodeGenFunction &CGF, Flags flags) override {
2693 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
2694 Guard);
2695 }
2696 };
2697}
2698
2699/// The ARM code here follows the Itanium code closely enough that we
2700/// just special-case it at particular places.
2701void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
2702 const VarDecl &D,
2703 llvm::GlobalVariable *var,
2704 bool shouldPerformInit) {
2705 CGBuilderTy &Builder = CGF.Builder;
2706
2707 // Inline variables that weren't instantiated from variable templates have
2708 // partially-ordered initialization within their translation unit.
2709 bool NonTemplateInline =
2710 D.isInline() &&
2712
2713 // We only need to use thread-safe statics for local non-TLS variables and
2714 // inline variables; other global initialization is always single-threaded
2715 // or (through lazy dynamic loading in multiple threads) unsequenced.
2716 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
2717 (D.isLocalVarDecl() || NonTemplateInline) &&
2718 !D.getTLSKind();
2719
2720 // If we have a global variable with internal linkage and thread-safe statics
2721 // are disabled, we can just let the guard variable be of type i8.
2722 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
2723
2724 llvm::IntegerType *guardTy;
2725 CharUnits guardAlignment;
2726 if (useInt8GuardVariable) {
2727 guardTy = CGF.Int8Ty;
2728 guardAlignment = CharUnits::One();
2729 } else {
2730 // Guard variables are 64 bits in the generic ABI and size width on ARM
2731 // (i.e. 32-bit on AArch32, 64-bit on AArch64).
2732 if (UseARMGuardVarABI) {
2733 guardTy = CGF.SizeTy;
2734 guardAlignment = CGF.getSizeAlign();
2735 } else {
2736 guardTy = CGF.Int64Ty;
2737 guardAlignment =
2738 CharUnits::fromQuantity(CGM.getDataLayout().getABITypeAlign(guardTy));
2739 }
2740 }
2741 llvm::PointerType *guardPtrTy = llvm::PointerType::get(
2742 CGF.CGM.getLLVMContext(),
2743 CGF.CGM.getDataLayout().getDefaultGlobalsAddressSpace());
2744
2745 // Create the guard variable if we don't already have it (as we
2746 // might if we're double-emitting this function body).
2747 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
2748 if (!guard) {
2749 // Mangle the name for the guard.
2750 SmallString<256> guardName;
2751 {
2752 llvm::raw_svector_ostream out(guardName);
2753 getMangleContext().mangleStaticGuardVariable(&D, out);
2754 }
2755
2756 // Create the guard variable with a zero-initializer.
2757 // Just absorb linkage, visibility and dll storage class from the guarded
2758 // variable.
2759 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
2760 false, var->getLinkage(),
2761 llvm::ConstantInt::get(guardTy, 0),
2762 guardName.str());
2763 guard->setDSOLocal(var->isDSOLocal());
2764 guard->setVisibility(var->getVisibility());
2765 guard->setDLLStorageClass(var->getDLLStorageClass());
2766 // If the variable is thread-local, so is its guard variable.
2767 guard->setThreadLocalMode(var->getThreadLocalMode());
2768 guard->setAlignment(guardAlignment.getAsAlign());
2769
2770 // The ABI says: "It is suggested that it be emitted in the same COMDAT
2771 // group as the associated data object." In practice, this doesn't work for
2772 // non-ELF and non-Wasm object formats, so only do it for ELF and Wasm.
2773 llvm::Comdat *C = var->getComdat();
2774 if (!D.isLocalVarDecl() && C &&
2775 (CGM.getTarget().getTriple().isOSBinFormatELF() ||
2776 CGM.getTarget().getTriple().isOSBinFormatWasm())) {
2777 guard->setComdat(C);
2778 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
2779 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
2780 }
2781
2782 CGM.setStaticLocalDeclGuardAddress(&D, guard);
2783 }
2784
2785 Address guardAddr = Address(guard, guard->getValueType(), guardAlignment);
2786
2787 // Test whether the variable has completed initialization.
2788 //
2789 // Itanium C++ ABI 3.3.2:
2790 // The following is pseudo-code showing how these functions can be used:
2791 // if (obj_guard.first_byte == 0) {
2792 // if ( __cxa_guard_acquire (&obj_guard) ) {
2793 // try {
2794 // ... initialize the object ...;
2795 // } catch (...) {
2796 // __cxa_guard_abort (&obj_guard);
2797 // throw;
2798 // }
2799 // ... queue object destructor with __cxa_atexit() ...;
2800 // __cxa_guard_release (&obj_guard);
2801 // }
2802 // }
2803 //
2804 // If threadsafe statics are enabled, but we don't have inline atomics, just
2805 // call __cxa_guard_acquire unconditionally. The "inline" check isn't
2806 // actually inline, and the user might not expect calls to __atomic libcalls.
2807
2808 unsigned MaxInlineWidthInBits = CGF.getTarget().getMaxAtomicInlineWidth();
2809 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2810 if (!threadsafe || MaxInlineWidthInBits) {
2811 // Load the first byte of the guard variable.
2812 llvm::LoadInst *LI =
2813 Builder.CreateLoad(guardAddr.withElementType(CGM.Int8Ty));
2814
2815 // Itanium ABI:
2816 // An implementation supporting thread-safety on multiprocessor
2817 // systems must also guarantee that references to the initialized
2818 // object do not occur before the load of the initialization flag.
2819 //
2820 // In LLVM, we do this by marking the load Acquire.
2821 if (threadsafe)
2822 LI->setAtomic(llvm::AtomicOrdering::Acquire);
2823
2824 // For ARM, we should only check the first bit, rather than the entire byte:
2825 //
2826 // ARM C++ ABI 3.2.3.1:
2827 // To support the potential use of initialization guard variables
2828 // as semaphores that are the target of ARM SWP and LDREX/STREX
2829 // synchronizing instructions we define a static initialization
2830 // guard variable to be a 4-byte aligned, 4-byte word with the
2831 // following inline access protocol.
2832 // #define INITIALIZED 1
2833 // if ((obj_guard & INITIALIZED) != INITIALIZED) {
2834 // if (__cxa_guard_acquire(&obj_guard))
2835 // ...
2836 // }
2837 //
2838 // and similarly for ARM64:
2839 //
2840 // ARM64 C++ ABI 3.2.2:
2841 // This ABI instead only specifies the value bit 0 of the static guard
2842 // variable; all other bits are platform defined. Bit 0 shall be 0 when the
2843 // variable is not initialized and 1 when it is.
2844 llvm::Value *V =
2845 (UseARMGuardVarABI && !useInt8GuardVariable)
2846 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
2847 : LI;
2848 llvm::Value *NeedsInit = Builder.CreateIsNull(V, "guard.uninitialized");
2849
2850 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
2851
2852 // Check if the first byte of the guard variable is zero.
2853 CGF.EmitCXXGuardedInitBranch(NeedsInit, InitCheckBlock, EndBlock,
2854 CodeGenFunction::GuardKind::VariableGuard, &D);
2855
2856 CGF.EmitBlock(InitCheckBlock);
2857 }
2858
2859 // The semantics of dynamic initialization of variables with static or thread
2860 // storage duration depends on whether they are declared at block-scope. The
2861 // initialization of such variables at block-scope can be aborted with an
2862 // exception and later retried (per C++20 [stmt.dcl]p4), and recursive entry
2863 // to their initialization has undefined behavior (also per C++20
2864 // [stmt.dcl]p4). For such variables declared at non-block scope, exceptions
2865 // lead to termination (per C++20 [except.terminate]p1), and recursive
2866 // references to the variables are governed only by the lifetime rules (per
2867 // C++20 [class.cdtor]p2), which means such references are perfectly fine as
2868 // long as they avoid touching memory. As a result, block-scope variables must
2869 // not be marked as initialized until after initialization completes (unless
2870 // the mark is reverted following an exception), but non-block-scope variables
2871 // must be marked prior to initialization so that recursive accesses during
2872 // initialization do not restart initialization.
2873
2874 // Variables used when coping with thread-safe statics and exceptions.
2875 if (threadsafe) {
2876 // Call __cxa_guard_acquire.
2877 llvm::Value *V
2878 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
2879
2880 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2881
2882 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
2883 InitBlock, EndBlock);
2884
2885 // Call __cxa_guard_abort along the exceptional edge.
2886 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
2887
2888 CGF.EmitBlock(InitBlock);
2889 } else if (!D.isLocalVarDecl()) {
2890 // For non-local variables, store 1 into the first byte of the guard
2891 // variable before the object initialization begins so that references
2892 // to the variable during initialization don't restart initialization.
2893 Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1),
2894 guardAddr.withElementType(CGM.Int8Ty));
2895 }
2896
2897 // Emit the initializer and add a global destructor if appropriate.
2898 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
2899
2900 if (threadsafe) {
2901 // Pop the guard-abort cleanup if we pushed one.
2902 CGF.PopCleanupBlock();
2903
2904 // Call __cxa_guard_release. This cannot throw.
2905 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy),
2906 guardAddr.emitRawPointer(CGF));
2907 } else if (D.isLocalVarDecl()) {
2908 // For local variables, store 1 into the first byte of the guard variable
2909 // after the object initialization completes so that initialization is
2910 // retried if initialization is interrupted by an exception.
2911 Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1),
2912 guardAddr.withElementType(CGM.Int8Ty));
2913 }
2914
2915 CGF.EmitBlock(EndBlock);
2916}
2917
2918/// Register a global destructor using __cxa_atexit.
2920 llvm::FunctionCallee dtor,
2921 llvm::Constant *addr, bool TLS) {
2922 assert(!CGF.getTarget().getTriple().isOSAIX() &&
2923 "unexpected call to emitGlobalDtorWithCXAAtExit");
2924 assert((TLS || CGF.getTypes().getCodeGenOpts().CXAAtExit) &&
2925 "__cxa_atexit is disabled");
2926 const char *Name = "__cxa_atexit";
2927 if (TLS) {
2928 const llvm::Triple &T = CGF.getTarget().getTriple();
2929 Name = T.isOSDarwin() ? "_tlv_atexit" : "__cxa_thread_atexit";
2930 }
2931
2932 // We're assuming that the destructor function is something we can
2933 // reasonably call with the default CC.
2934 llvm::Type *dtorTy = CGF.DefaultPtrTy;
2935
2936 // Preserve address space of addr.
2937 auto AddrAS = addr ? addr->getType()->getPointerAddressSpace() : 0;
2938 auto AddrPtrTy = AddrAS ? llvm::PointerType::get(CGF.getLLVMContext(), AddrAS)
2939 : CGF.Int8PtrTy;
2940
2941 // Create a variable that binds the atexit to this shared object.
2942 llvm::Constant *handle =
2943 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
2944 auto *GV = cast<llvm::GlobalValue>(handle->stripPointerCasts());
2945 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2946
2947 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
2948 llvm::Type *paramTys[] = {dtorTy, AddrPtrTy, handle->getType()};
2949 llvm::FunctionType *atexitTy =
2950 llvm::FunctionType::get(CGF.IntTy, paramTys, false);
2951
2952 // Fetch the actual function.
2953 llvm::FunctionCallee atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
2954 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit.getCallee()))
2955 fn->setDoesNotThrow();
2956
2957 const auto &Context = CGF.CGM.getContext();
2958 FunctionProtoType::ExtProtoInfo EPI(Context.getDefaultCallingConvention(
2959 /*IsVariadic=*/false, /*IsCXXMethod=*/false));
2960 QualType fnType =
2961 Context.getFunctionType(Context.VoidTy, {Context.VoidPtrTy}, EPI);
2962 llvm::Constant *dtorCallee = cast<llvm::Constant>(dtor.getCallee());
2963 dtorCallee = CGF.CGM.getFunctionPointer(dtorCallee, fnType);
2964
2965 if (!addr)
2966 // addr is null when we are trying to register a dtor annotated with
2967 // __attribute__((destructor)) in a constructor function. Using null here is
2968 // okay because this argument is just passed back to the destructor
2969 // function.
2970 addr = llvm::Constant::getNullValue(CGF.Int8PtrTy);
2971
2972 llvm::Value *args[] = {dtorCallee, addr, handle};
2973 CGF.EmitNounwindRuntimeCall(atexit, args);
2974}
2975
2977 StringRef FnName) {
2978 // Create a function that registers/unregisters destructors that have the same
2979 // priority.
2980 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
2981 llvm::Function *GlobalInitOrCleanupFn = CGM.CreateGlobalInitOrCleanUpFunction(
2982 FTy, FnName, CGM.getTypes().arrangeNullaryFunction(), SourceLocation());
2983
2984 return GlobalInitOrCleanupFn;
2985}
2986
2987void CodeGenModule::unregisterGlobalDtorsWithUnAtExit() {
2988 for (const auto &I : DtorsUsingAtExit) {
2989 int Priority = I.first;
2990 std::string GlobalCleanupFnName =
2991 std::string("__GLOBAL_cleanup_") + llvm::to_string(Priority);
2992
2993 llvm::Function *GlobalCleanupFn =
2994 createGlobalInitOrCleanupFn(*this, GlobalCleanupFnName);
2995
2996 CodeGenFunction CGF(*this);
2997 CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalCleanupFn,
2998 getTypes().arrangeNullaryFunction(), FunctionArgList(),
2999 SourceLocation(), SourceLocation());
3001
3002 // Get the destructor function type, void(*)(void).
3003 llvm::FunctionType *dtorFuncTy = llvm::FunctionType::get(CGF.VoidTy, false);
3004
3005 // Destructor functions are run/unregistered in non-ascending
3006 // order of their priorities.
3007 const llvm::TinyPtrVector<llvm::Function *> &Dtors = I.second;
3008 auto itv = Dtors.rbegin();
3009 while (itv != Dtors.rend()) {
3010 llvm::Function *Dtor = *itv;
3011
3012 // We're assuming that the destructor function is something we can
3013 // reasonably call with the correct CC.
3014 llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(Dtor);
3015 llvm::Value *NeedsDestruct =
3016 CGF.Builder.CreateIsNull(V, "needs_destruct");
3017
3018 llvm::BasicBlock *DestructCallBlock =
3019 CGF.createBasicBlock("destruct.call");
3020 llvm::BasicBlock *EndBlock = CGF.createBasicBlock(
3021 (itv + 1) != Dtors.rend() ? "unatexit.call" : "destruct.end");
3022 // Check if unatexit returns a value of 0. If it does, jump to
3023 // DestructCallBlock, otherwise jump to EndBlock directly.
3024 CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock);
3025
3026 CGF.EmitBlock(DestructCallBlock);
3027
3028 // Emit the call to casted Dtor.
3029 llvm::CallInst *CI = CGF.Builder.CreateCall(dtorFuncTy, Dtor);
3030 // Make sure the call and the callee agree on calling convention.
3031 CI->setCallingConv(Dtor->getCallingConv());
3032
3033 CGF.EmitBlock(EndBlock);
3034
3035 itv++;
3036 }
3037
3038 CGF.FinishFunction();
3039 AddGlobalDtor(GlobalCleanupFn, Priority);
3040 }
3041}
3042
3043void CodeGenModule::registerGlobalDtorsWithAtExit() {
3044 for (const auto &I : DtorsUsingAtExit) {
3045 int Priority = I.first;
3046 std::string GlobalInitFnName =
3047 std::string("__GLOBAL_init_") + llvm::to_string(Priority);
3048 llvm::Function *GlobalInitFn =
3049 createGlobalInitOrCleanupFn(*this, GlobalInitFnName);
3050
3051 CodeGenFunction CGF(*this);
3052 CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalInitFn,
3053 getTypes().arrangeNullaryFunction(), FunctionArgList(),
3054 SourceLocation(), SourceLocation());
3056
3057 // Since constructor functions are run in non-descending order of their
3058 // priorities, destructors are registered in non-descending order of their
3059 // priorities, and since destructor functions are run in the reverse order
3060 // of their registration, destructor functions are run in non-ascending
3061 // order of their priorities.
3062 const llvm::TinyPtrVector<llvm::Function *> &Dtors = I.second;
3063 for (auto *Dtor : Dtors) {
3064 // Register the destructor function calling __cxa_atexit if it is
3065 // available. Otherwise fall back on calling atexit.
3066 if (getCodeGenOpts().CXAAtExit) {
3067 emitGlobalDtorWithCXAAtExit(CGF, Dtor, nullptr, false);
3068 } else {
3069 // We're assuming that the destructor function is something we can
3070 // reasonably call with the correct CC.
3072 }
3073 }
3074
3075 CGF.FinishFunction();
3076 AddGlobalCtor(GlobalInitFn, Priority);
3077 }
3078
3079 if (getCXXABI().useSinitAndSterm())
3080 unregisterGlobalDtorsWithUnAtExit();
3081}
3082
3083/// Register a global destructor as best as we know how.
3084void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
3085 llvm::FunctionCallee dtor,
3086 llvm::Constant *addr) {
3087 if (D.isNoDestroy(CGM.getContext()))
3088 return;
3089
3090 // HLSL doesn't support atexit.
3091 if (CGM.getLangOpts().HLSL)
3092 return CGM.AddCXXDtorEntry(dtor, addr);
3093
3094 // OpenMP offloading supports C++ constructors and destructors but we do not
3095 // always have 'atexit' available. Instead lower these to use the LLVM global
3096 // destructors which we can handle directly in the runtime. Note that this is
3097 // not strictly 1-to-1 with using `atexit` because we no longer tear down
3098 // globals in reverse order of when they were constructed.
3099 if (!CGM.getLangOpts().hasAtExit() && !D.isStaticLocal())
3100 return CGF.registerGlobalDtorWithLLVM(D, dtor, addr);
3101
3102 // emitGlobalDtorWithCXAAtExit will emit a call to either __cxa_thread_atexit
3103 // or __cxa_atexit depending on whether this VarDecl is a thread-local storage
3104 // or not. CXAAtExit controls only __cxa_atexit, so use it if it is enabled.
3105 // We can always use __cxa_thread_atexit.
3106 if (CGM.getCodeGenOpts().CXAAtExit || D.getTLSKind())
3107 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
3108
3109 // In Apple kexts, we want to add a global destructor entry.
3110 // FIXME: shouldn't this be guarded by some variable?
3111 if (CGM.getLangOpts().AppleKext) {
3112 // Generate a global destructor entry.
3113 return CGM.AddCXXDtorEntry(dtor, addr);
3114 }
3115
3116 CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
3117}
3118
3121 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
3122 // Darwin prefers to have references to thread local variables to go through
3123 // the thread wrapper instead of directly referencing the backing variable.
3124 return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
3125 CGM.getTarget().getTriple().isOSDarwin();
3126}
3127
3128/// Get the appropriate linkage for the wrapper function. This is essentially
3129/// the weak form of the variable's linkage; every translation unit which needs
3130/// the wrapper emits a copy, and we want the linker to merge them.
3131static llvm::GlobalValue::LinkageTypes
3133 llvm::GlobalValue::LinkageTypes VarLinkage =
3135
3136 // For internal linkage variables, we don't need an external or weak wrapper.
3137 if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
3138 return VarLinkage;
3139
3140 // If the thread wrapper is replaceable, give it appropriate linkage.
3141 if (isThreadWrapperReplaceable(VD, CGM))
3142 if (!llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) &&
3143 !llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
3144 return VarLinkage;
3145 return llvm::GlobalValue::WeakODRLinkage;
3146}
3147
3148llvm::Function *
3149ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
3150 llvm::Value *Val) {
3151 // Mangle the name for the thread_local wrapper function.
3152 SmallString<256> WrapperName;
3153 {
3154 llvm::raw_svector_ostream Out(WrapperName);
3155 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
3156 }
3157
3158 // FIXME: If VD is a definition, we should regenerate the function attributes
3159 // before returning.
3160 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
3161 return cast<llvm::Function>(V);
3162
3163 QualType RetQT = VD->getType();
3164 if (RetQT->isReferenceType())
3165 RetQT = RetQT.getNonReferenceType();
3166
3167 const CGFunctionInfo &FI = CGM.getTypes().arrangeBuiltinFunctionDeclaration(
3168 getContext().getPointerType(RetQT), FunctionArgList());
3169
3170 llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FI);
3171 llvm::Function *Wrapper =
3172 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
3173 WrapperName.str(), &CGM.getModule());
3174
3175 if (CGM.supportsCOMDAT() && Wrapper->isWeakForLinker())
3176 Wrapper->setComdat(CGM.getModule().getOrInsertComdat(Wrapper->getName()));
3177
3178 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Wrapper, /*IsThunk=*/false);
3179
3180 // Always resolve references to the wrapper at link time.
3181 if (!Wrapper->hasLocalLinkage())
3182 if (!isThreadWrapperReplaceable(VD, CGM) ||
3183 llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) ||
3184 llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage()) ||
3186 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
3187
3188 if (isThreadWrapperReplaceable(VD, CGM)) {
3189 Wrapper->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
3190 Wrapper->addFnAttr(llvm::Attribute::NoUnwind);
3191 }
3192
3193 ThreadWrappers.push_back({VD, Wrapper});
3194 return Wrapper;
3195}
3196
3197void ItaniumCXXABI::EmitThreadLocalInitFuncs(
3198 CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals,
3199 ArrayRef<llvm::Function *> CXXThreadLocalInits,
3200 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) {
3201 llvm::Function *InitFunc = nullptr;
3202
3203 // Separate initializers into those with ordered (or partially-ordered)
3204 // initialization and those with unordered initialization.
3205 llvm::SmallVector<llvm::Function *, 8> OrderedInits;
3206 llvm::SmallDenseMap<const VarDecl *, llvm::Function *> UnorderedInits;
3207 for (unsigned I = 0; I != CXXThreadLocalInits.size(); ++I) {
3209 CXXThreadLocalInitVars[I]->getTemplateSpecializationKind()))
3210 UnorderedInits[CXXThreadLocalInitVars[I]->getCanonicalDecl()] =
3211 CXXThreadLocalInits[I];
3212 else
3213 OrderedInits.push_back(CXXThreadLocalInits[I]);
3214 }
3215
3216 if (!OrderedInits.empty()) {
3217 // Generate a guarded initialization function.
3218 llvm::FunctionType *FTy =
3219 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
3220 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
3221 InitFunc = CGM.CreateGlobalInitOrCleanUpFunction(FTy, "__tls_init", FI,
3222 SourceLocation(),
3223 /*TLS=*/true);
3224 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
3225 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
3226 llvm::GlobalVariable::InternalLinkage,
3227 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
3228 Guard->setThreadLocal(true);
3229 Guard->setThreadLocalMode(CGM.GetDefaultLLVMTLSModel());
3230
3231 CharUnits GuardAlign = CharUnits::One();
3232 Guard->setAlignment(GuardAlign.getAsAlign());
3233
3234 CodeGenFunction(CGM).GenerateCXXGlobalInitFunc(
3235 InitFunc, OrderedInits, ConstantAddress(Guard, CGM.Int8Ty, GuardAlign));
3236 // On Darwin platforms, use CXX_FAST_TLS calling convention.
3237 if (CGM.getTarget().getTriple().isOSDarwin()) {
3238 InitFunc->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
3239 InitFunc->addFnAttr(llvm::Attribute::NoUnwind);
3240 }
3241 }
3242
3243 // Create declarations for thread wrappers for all thread-local variables
3244 // with non-discardable definitions in this translation unit.
3245 for (const VarDecl *VD : CXXThreadLocals) {
3246 if (VD->hasDefinition() &&
3247 !isDiscardableGVALinkage(getContext().GetGVALinkageForVariable(VD))) {
3248 llvm::GlobalValue *GV = CGM.GetGlobalValue(CGM.getMangledName(VD));
3249 getOrCreateThreadLocalWrapper(VD, GV);
3250 }
3251 }
3252
3253 // Emit all referenced thread wrappers.
3254 for (auto VDAndWrapper : ThreadWrappers) {
3255 const VarDecl *VD = VDAndWrapper.first;
3256 llvm::GlobalVariable *Var =
3258 llvm::Function *Wrapper = VDAndWrapper.second;
3259
3260 // Some targets require that all access to thread local variables go through
3261 // the thread wrapper. This means that we cannot attempt to create a thread
3262 // wrapper or a thread helper.
3263 if (!VD->hasDefinition()) {
3264 if (isThreadWrapperReplaceable(VD, CGM)) {
3265 Wrapper->setLinkage(llvm::Function::ExternalLinkage);
3266 continue;
3267 }
3268
3269 // If this isn't a TU in which this variable is defined, the thread
3270 // wrapper is discardable.
3271 if (Wrapper->getLinkage() == llvm::Function::WeakODRLinkage)
3272 Wrapper->setLinkage(llvm::Function::LinkOnceODRLinkage);
3273 }
3274
3275 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Wrapper);
3276
3277 // Mangle the name for the thread_local initialization function.
3278 SmallString<256> InitFnName;
3279 {
3280 llvm::raw_svector_ostream Out(InitFnName);
3281 getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
3282 }
3283
3284 llvm::FunctionType *InitFnTy = llvm::FunctionType::get(CGM.VoidTy, false);
3285
3286 // If we have a definition for the variable, emit the initialization
3287 // function as an alias to the global Init function (if any). Otherwise,
3288 // produce a declaration of the initialization function.
3289 llvm::GlobalValue *Init = nullptr;
3290 bool InitIsInitFunc = false;
3291 bool HasConstantInitialization = false;
3292 if (!usesThreadWrapperFunction(VD)) {
3293 HasConstantInitialization = true;
3294 } else if (VD->hasDefinition()) {
3295 InitIsInitFunc = true;
3296 llvm::Function *InitFuncToUse = InitFunc;
3298 InitFuncToUse = UnorderedInits.lookup(VD->getCanonicalDecl());
3299 if (InitFuncToUse)
3300 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
3301 InitFuncToUse);
3302 } else {
3303 // Emit a weak global function referring to the initialization function.
3304 // This function will not exist if the TU defining the thread_local
3305 // variable in question does not need any dynamic initialization for
3306 // its thread_local variables.
3307 Init = llvm::Function::Create(InitFnTy,
3308 llvm::GlobalVariable::ExternalWeakLinkage,
3309 InitFnName.str(), &CGM.getModule());
3310 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
3312 GlobalDecl(), FI, cast<llvm::Function>(Init), /*IsThunk=*/false);
3313 }
3314
3315 if (Init) {
3316 Init->setVisibility(Var->getVisibility());
3317 // Don't mark an extern_weak function DSO local on windows.
3318 if (!CGM.getTriple().isOSWindows() || !Init->hasExternalWeakLinkage())
3319 Init->setDSOLocal(Var->isDSOLocal());
3320 }
3321
3322 llvm::LLVMContext &Context = CGM.getModule().getContext();
3323
3324 // The linker on AIX is not happy with missing weak symbols. However,
3325 // other TUs will not know whether the initialization routine exists
3326 // so create an empty, init function to satisfy the linker.
3327 // This is needed whenever a thread wrapper function is not used, and
3328 // also when the symbol is weak.
3329 if (CGM.getTriple().isOSAIX() && VD->hasDefinition() &&
3330 isEmittedWithConstantInitializer(VD, true) &&
3331 !mayNeedDestruction(VD)) {
3332 // Init should be null. If it were non-null, then the logic above would
3333 // either be defining the function to be an alias or declaring the
3334 // function with the expectation that the definition of the variable
3335 // is elsewhere.
3336 assert(Init == nullptr && "Expected Init to be null.");
3337
3338 llvm::Function *Func = llvm::Function::Create(
3339 InitFnTy, Var->getLinkage(), InitFnName.str(), &CGM.getModule());
3340 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
3341 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI,
3343 /*IsThunk=*/false);
3344 // Create a function body that just returns
3345 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Func);
3346 CGBuilderTy Builder(CGM, Entry);
3347 Builder.CreateRetVoid();
3348 }
3349
3350 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
3351 CGBuilderTy Builder(CGM, Entry);
3352 if (HasConstantInitialization) {
3353 // No dynamic initialization to invoke.
3354 } else if (InitIsInitFunc) {
3355 if (Init) {
3356 llvm::CallInst *CallVal = Builder.CreateCall(InitFnTy, Init);
3357 if (isThreadWrapperReplaceable(VD, CGM)) {
3358 CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
3359 llvm::Function *Fn =
3361 Fn->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
3362 }
3363 }
3364 } else if (CGM.getTriple().isOSAIX()) {
3365 // On AIX, except if constinit and also neither of class type or of
3366 // (possibly multi-dimensional) array of class type, thread_local vars
3367 // will have init routines regardless of whether they are
3368 // const-initialized. Since the routine is guaranteed to exist, we can
3369 // unconditionally call it without testing for its existance. This
3370 // avoids potentially unresolved weak symbols which the AIX linker
3371 // isn't happy with.
3372 Builder.CreateCall(InitFnTy, Init);
3373 } else {
3374 // Don't know whether we have an init function. Call it if it exists.
3375 llvm::Value *Have = Builder.CreateIsNotNull(Init);
3376 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
3377 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
3378 Builder.CreateCondBr(Have, InitBB, ExitBB);
3379
3380 Builder.SetInsertPoint(InitBB);
3381 Builder.CreateCall(InitFnTy, Init);
3382 Builder.CreateBr(ExitBB);
3383
3384 Builder.SetInsertPoint(ExitBB);
3385 }
3386
3387 // For a reference, the result of the wrapper function is a pointer to
3388 // the referenced object.
3389 llvm::Value *Val = Builder.CreateThreadLocalAddress(Var);
3390
3391 if (VD->getType()->isReferenceType()) {
3392 CharUnits Align = CGM.getContext().getDeclAlign(VD);
3393 Val = Builder.CreateAlignedLoad(Var->getValueType(), Val, Align);
3394 }
3395 Val = Builder.CreateAddrSpaceCast(Val, Wrapper->getReturnType());
3396
3397 Builder.CreateRet(Val);
3398 }
3399}
3400
3401LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
3402 const VarDecl *VD,
3403 QualType LValType) {
3404 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD);
3405 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
3406
3407 llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper);
3408 CallVal->setCallingConv(Wrapper->getCallingConv());
3409
3410 LValue LV;
3411 if (VD->getType()->isReferenceType())
3412 LV = CGF.MakeNaturalAlignRawAddrLValue(CallVal, LValType);
3413 else
3414 LV = CGF.MakeRawAddrLValue(CallVal, LValType,
3415 CGF.getContext().getDeclAlign(VD));
3416 // FIXME: need setObjCGCLValueClass?
3417 return LV;
3418}
3419
3420/// Return whether the given global decl needs a VTT parameter, which it does
3421/// if it's a base constructor or destructor with virtual bases.
3422bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
3423 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
3424
3425 // We don't have any virtual bases, just return early.
3426 if (!MD->getParent()->getNumVBases())
3427 return false;
3428
3429 // Check if we have a base constructor.
3431 return true;
3432
3433 // Check if we have a base destructor.
3434 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
3435 return true;
3436
3437 return false;
3438}
3439
3440llvm::Constant *
3441ItaniumCXXABI::getOrCreateVirtualFunctionPointerThunk(const CXXMethodDecl *MD) {
3442 SmallString<256> MethodName;
3443 llvm::raw_svector_ostream Out(MethodName);
3444 getMangleContext().mangleCXXName(MD, Out);
3445 MethodName += "_vfpthunk_";
3446 StringRef ThunkName = MethodName.str();
3447 llvm::Function *ThunkFn;
3448 if ((ThunkFn = cast_or_null<llvm::Function>(
3449 CGM.getModule().getNamedValue(ThunkName))))
3450 return ThunkFn;
3451
3452 const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeCXXMethodDeclaration(MD);
3453 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
3454 llvm::GlobalValue::LinkageTypes Linkage =
3455 MD->isExternallyVisible() ? llvm::GlobalValue::LinkOnceODRLinkage
3456 : llvm::GlobalValue::InternalLinkage;
3457 ThunkFn =
3458 llvm::Function::Create(ThunkTy, Linkage, ThunkName, &CGM.getModule());
3459 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
3460 ThunkFn->setVisibility(llvm::GlobalValue::HiddenVisibility);
3461 assert(ThunkFn->getName() == ThunkName && "name was uniqued!");
3462
3463 CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn, /*IsThunk=*/true);
3465
3466 // Stack protection sometimes gets inserted after the musttail call.
3467 ThunkFn->removeFnAttr(llvm::Attribute::StackProtect);
3468 ThunkFn->removeFnAttr(llvm::Attribute::StackProtectStrong);
3469 ThunkFn->removeFnAttr(llvm::Attribute::StackProtectReq);
3470
3471 // Start codegen.
3472 CodeGenFunction CGF(CGM);
3473 CGF.CurGD = GlobalDecl(MD);
3474 CGF.CurFuncIsThunk = true;
3475
3476 // Build FunctionArgs.
3477 FunctionArgList FunctionArgs;
3478 CGF.BuildFunctionArgList(CGF.CurGD, FunctionArgs);
3479
3480 CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo,
3481 FunctionArgs, MD->getLocation(), SourceLocation());
3482 llvm::Value *ThisVal = loadIncomingCXXThis(CGF);
3483 setCXXABIThisValue(CGF, ThisVal);
3484
3485 CallArgList CallArgs;
3486 for (const VarDecl *VD : FunctionArgs)
3487 CGF.EmitDelegateCallArg(CallArgs, VD, SourceLocation());
3488
3489 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
3490 RequiredArgs Required = RequiredArgs::forPrototypePlus(FPT, /*this*/ 1);
3491 const CGFunctionInfo &CallInfo =
3492 CGM.getTypes().arrangeCXXMethodCall(CallArgs, FPT, Required, 0);
3493 CGCallee Callee = CGCallee::forVirtual(nullptr, GlobalDecl(MD),
3494 getThisAddress(CGF), ThunkTy);
3495 llvm::CallBase *CallOrInvoke;
3496 CGF.EmitCall(CallInfo, Callee, ReturnValueSlot(), CallArgs, &CallOrInvoke,
3497 /*IsMustTail=*/true, SourceLocation(), true);
3498 auto *Call = cast<llvm::CallInst>(CallOrInvoke);
3499 Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
3500 if (Call->getType()->isVoidTy())
3501 CGF.Builder.CreateRetVoid();
3502 else
3503 CGF.Builder.CreateRet(Call);
3504
3505 // Finish the function to maintain CodeGenFunction invariants.
3506 // FIXME: Don't emit unreachable code.
3507 CGF.EmitBlock(CGF.createBasicBlock());
3508 CGF.FinishFunction();
3509 return ThunkFn;
3510}
3511
3512namespace {
3513class ItaniumRTTIBuilder {
3514 CodeGenModule &CGM; // Per-module state.
3515 llvm::LLVMContext &VMContext;
3516 const ItaniumCXXABI &CXXABI; // Per-module state.
3517
3518 /// Fields - The fields of the RTTI descriptor currently being built.
3519 SmallVector<llvm::Constant *, 16> Fields;
3520
3521 /// GetAddrOfTypeName - Returns the mangled type name of the given type.
3522 llvm::GlobalVariable *
3523 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
3524
3525 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
3526 /// descriptor of the given type.
3527 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
3528
3529 /// BuildVTablePointer - Build the vtable pointer for the given type.
3530 void BuildVTablePointer(const Type *Ty, llvm::Constant *StorageAddress);
3531
3532 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3533 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
3534 void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
3535
3536 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
3537 /// classes with bases that do not satisfy the abi::__si_class_type_info
3538 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
3539 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
3540
3541 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
3542 /// for pointer types.
3543 void BuildPointerTypeInfo(QualType PointeeTy);
3544
3545 /// BuildObjCObjectTypeInfo - Build the appropriate kind of
3546 /// type_info for an object type.
3547 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
3548
3549 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
3550 /// struct, used for member pointer types.
3551 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
3552
3553public:
3554 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
3555 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
3556
3557 // Pointer type info flags.
3558 enum {
3559 /// PTI_Const - Type has const qualifier.
3560 PTI_Const = 0x1,
3561
3562 /// PTI_Volatile - Type has volatile qualifier.
3563 PTI_Volatile = 0x2,
3564
3565 /// PTI_Restrict - Type has restrict qualifier.
3566 PTI_Restrict = 0x4,
3567
3568 /// PTI_Incomplete - Type is incomplete.
3569 PTI_Incomplete = 0x8,
3570
3571 /// PTI_ContainingClassIncomplete - Containing class is incomplete.
3572 /// (in pointer to member).
3573 PTI_ContainingClassIncomplete = 0x10,
3574
3575 /// PTI_TransactionSafe - Pointee is transaction_safe function (C++ TM TS).
3576 //PTI_TransactionSafe = 0x20,
3577
3578 /// PTI_Noexcept - Pointee is noexcept function (C++1z).
3579 PTI_Noexcept = 0x40,
3580 };
3581
3582 // VMI type info flags.
3583 enum {
3584 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
3585 VMI_NonDiamondRepeat = 0x1,
3586
3587 /// VMI_DiamondShaped - Class is diamond shaped.
3588 VMI_DiamondShaped = 0x2
3589 };
3590
3591 // Base class type info flags.
3592 enum {
3593 /// BCTI_Virtual - Base class is virtual.
3594 BCTI_Virtual = 0x1,
3595
3596 /// BCTI_Public - Base class is public.
3597 BCTI_Public = 0x2
3598 };
3599
3600 /// BuildTypeInfo - Build the RTTI type info struct for the given type, or
3601 /// link to an existing RTTI descriptor if one already exists.
3602 llvm::Constant *BuildTypeInfo(QualType Ty);
3603
3604 /// BuildTypeInfo - Build the RTTI type info struct for the given type.
3605 llvm::Constant *BuildTypeInfo(
3606 QualType Ty,
3607 llvm::GlobalVariable::LinkageTypes Linkage,
3608 llvm::GlobalValue::VisibilityTypes Visibility,
3609 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass);
3610};
3611}
3612
3613llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
3614 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
3615 SmallString<256> Name;
3616 llvm::raw_svector_ostream Out(Name);
3618
3619 // We know that the mangled name of the type starts at index 4 of the
3620 // mangled name of the typename, so we can just index into it in order to
3621 // get the mangled name of the type.
3622 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
3623 Name.substr(4));
3624 auto Align = CGM.getContext().getTypeAlignInChars(CGM.getContext().CharTy);
3625
3626 llvm::GlobalVariable *GV = CGM.CreateOrReplaceCXXRuntimeVariable(
3627 Name, Init->getType(), Linkage, Align.getAsAlign());
3628
3629 GV->setInitializer(Init);
3630
3631 return GV;
3632}
3633
3634llvm::Constant *
3635ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
3636 // Mangle the RTTI name.
3637 SmallString<256> Name;
3638 llvm::raw_svector_ostream Out(Name);
3639 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
3640
3641 // Look for an existing global.
3642 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
3643
3644 if (!GV) {
3645 // Create a new global variable.
3646 // Note for the future: If we would ever like to do deferred emission of
3647 // RTTI, check if emitting vtables opportunistically need any adjustment.
3648
3649 GV = new llvm::GlobalVariable(
3650 CGM.getModule(), CGM.GlobalsInt8PtrTy,
3651 /*isConstant=*/true, llvm::GlobalValue::ExternalLinkage, nullptr, Name);
3652 const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
3653 CGM.setGVProperties(GV, RD);
3654 // Import the typeinfo symbol when all non-inline virtual methods are
3655 // imported.
3656 if (CGM.getTarget().hasPS4DLLImportExport()) {
3658 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
3659 CGM.setDSOLocal(GV);
3660 }
3661 }
3662 }
3663
3664 return GV;
3665}
3666
3667/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
3668/// info for that type is defined in the standard library.
3670 // Itanium C++ ABI 2.9.2:
3671 // Basic type information (e.g. for "int", "bool", etc.) will be kept in
3672 // the run-time support library. Specifically, the run-time support
3673 // library should contain type_info objects for the types X, X* and
3674 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
3675 // unsigned char, signed char, short, unsigned short, int, unsigned int,
3676 // long, unsigned long, long long, unsigned long long, float, double,
3677 // long double, char16_t, char32_t, and the IEEE 754r decimal and
3678 // half-precision floating point types.
3679 //
3680 // GCC also emits RTTI for __int128.
3681 // FIXME: We do not emit RTTI information for decimal types here.
3682
3683 // Types added here must also be added to EmitFundamentalRTTIDescriptors.
3684 switch (Ty->getKind()) {
3685 case BuiltinType::Void:
3686 case BuiltinType::NullPtr:
3687 case BuiltinType::Bool:
3688 case BuiltinType::WChar_S:
3689 case BuiltinType::WChar_U:
3690 case BuiltinType::Char_U:
3691 case BuiltinType::Char_S:
3692 case BuiltinType::UChar:
3693 case BuiltinType::SChar:
3694 case BuiltinType::Short:
3695 case BuiltinType::UShort:
3696 case BuiltinType::Int:
3697 case BuiltinType::UInt:
3698 case BuiltinType::Long:
3699 case BuiltinType::ULong:
3700 case BuiltinType::LongLong:
3701 case BuiltinType::ULongLong:
3702 case BuiltinType::Half:
3703 case BuiltinType::Float:
3704 case BuiltinType::Double:
3705 case BuiltinType::LongDouble:
3706 case BuiltinType::Float16:
3707 case BuiltinType::Float128:
3708 case BuiltinType::Ibm128:
3709 case BuiltinType::Char8:
3710 case BuiltinType::Char16:
3711 case BuiltinType::Char32:
3712 case BuiltinType::Int128:
3713 case BuiltinType::UInt128:
3714 return true;
3715
3716#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3717 case BuiltinType::Id:
3718#include "clang/Basic/OpenCLImageTypes.def"
3719#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3720 case BuiltinType::Id:
3721#include "clang/Basic/OpenCLExtensionTypes.def"
3722 case BuiltinType::OCLSampler:
3723 case BuiltinType::OCLEvent:
3724 case BuiltinType::OCLClkEvent:
3725 case BuiltinType::OCLQueue:
3726 case BuiltinType::OCLReserveID:
3727#define SVE_TYPE(Name, Id, SingletonId) \
3728 case BuiltinType::Id:
3729#include "clang/Basic/AArch64ACLETypes.def"
3730#define PPC_VECTOR_TYPE(Name, Id, Size) \
3731 case BuiltinType::Id:
3732#include "clang/Basic/PPCTypes.def"
3733#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3734#include "clang/Basic/RISCVVTypes.def"
3735#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3736#include "clang/Basic/WebAssemblyReferenceTypes.def"
3737#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3738#include "clang/Basic/AMDGPUTypes.def"
3739#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3740#include "clang/Basic/HLSLIntangibleTypes.def"
3741 case BuiltinType::ShortAccum:
3742 case BuiltinType::Accum:
3743 case BuiltinType::LongAccum:
3744 case BuiltinType::UShortAccum:
3745 case BuiltinType::UAccum:
3746 case BuiltinType::ULongAccum:
3747 case BuiltinType::ShortFract:
3748 case BuiltinType::Fract:
3749 case BuiltinType::LongFract:
3750 case BuiltinType::UShortFract:
3751 case BuiltinType::UFract:
3752 case BuiltinType::ULongFract:
3753 case BuiltinType::SatShortAccum:
3754 case BuiltinType::SatAccum:
3755 case BuiltinType::SatLongAccum:
3756 case BuiltinType::SatUShortAccum:
3757 case BuiltinType::SatUAccum:
3758 case BuiltinType::SatULongAccum:
3759 case BuiltinType::SatShortFract:
3760 case BuiltinType::SatFract:
3761 case BuiltinType::SatLongFract:
3762 case BuiltinType::SatUShortFract:
3763 case BuiltinType::SatUFract:
3764 case BuiltinType::SatULongFract:
3765 case BuiltinType::BFloat16:
3766 return false;
3767
3768 case BuiltinType::Dependent:
3769#define BUILTIN_TYPE(Id, SingletonId)
3770#define PLACEHOLDER_TYPE(Id, SingletonId) \
3771 case BuiltinType::Id:
3772#include "clang/AST/BuiltinTypes.def"
3773 llvm_unreachable("asking for RRTI for a placeholder type!");
3774
3775 case BuiltinType::ObjCId:
3776 case BuiltinType::ObjCClass:
3777 case BuiltinType::ObjCSel:
3778 llvm_unreachable("FIXME: Objective-C types are unsupported!");
3779 }
3780
3781 llvm_unreachable("Invalid BuiltinType Kind!");
3782}
3783
3784static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
3785 QualType PointeeTy = PointerTy->getPointeeType();
3786 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
3787 if (!BuiltinTy)
3788 return false;
3789
3790 // Check the qualifiers.
3791 Qualifiers Quals = PointeeTy.getQualifiers();
3792 Quals.removeConst();
3793
3794 if (!Quals.empty())
3795 return false;
3796
3797 return TypeInfoIsInStandardLibrary(BuiltinTy);
3798}
3799
3800/// IsStandardLibraryRTTIDescriptor - Returns whether the type
3801/// information for the given type exists in the standard library.
3803 // Type info for builtin types is defined in the standard library.
3804 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
3805 return TypeInfoIsInStandardLibrary(BuiltinTy);
3806
3807 // Type info for some pointer types to builtin types is defined in the
3808 // standard library.
3809 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
3810 return TypeInfoIsInStandardLibrary(PointerTy);
3811
3812 return false;
3813}
3814
3815/// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
3816/// the given type exists somewhere else, and that we should not emit the type
3817/// information in this translation unit. Assumes that it is not a
3818/// standard-library type.
3820 QualType Ty) {
3821 ASTContext &Context = CGM.getContext();
3822
3823 // If RTTI is disabled, assume it might be disabled in the
3824 // translation unit that defines any potential key function, too.
3825 if (!Context.getLangOpts().RTTI) return false;
3826
3827 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
3828 const CXXRecordDecl *RD =
3829 cast<CXXRecordDecl>(RecordTy->getDecl())->getDefinitionOrSelf();
3830 if (!RD->hasDefinition())
3831 return false;
3832
3833 if (!RD->isDynamicClass())
3834 return false;
3835
3836 // FIXME: this may need to be reconsidered if the key function
3837 // changes.
3838 // N.B. We must always emit the RTTI data ourselves if there exists a key
3839 // function.
3840 bool IsDLLImport = RD->hasAttr<DLLImportAttr>();
3841
3842 // Don't import the RTTI but emit it locally.
3843 if (CGM.getTriple().isOSCygMing())
3844 return false;
3845
3846 if (CGM.getVTables().isVTableExternal(RD)) {
3847 if (CGM.getTarget().hasPS4DLLImportExport())
3848 return true;
3849
3850 return IsDLLImport && !CGM.getTriple().isWindowsItaniumEnvironment()
3851 ? false
3852 : true;
3853 }
3854 if (IsDLLImport)
3855 return true;
3856 }
3857
3858 return false;
3859}
3860
3861/// IsIncompleteClassType - Returns whether the given record type is incomplete.
3862static bool IsIncompleteClassType(const RecordType *RecordTy) {
3863 return !RecordTy->getDecl()->getDefinitionOrSelf()->isCompleteDefinition();
3864}
3865
3866/// ContainsIncompleteClassType - Returns whether the given type contains an
3867/// incomplete class type. This is true if
3868///
3869/// * The given type is an incomplete class type.
3870/// * The given type is a pointer type whose pointee type contains an
3871/// incomplete class type.
3872/// * The given type is a member pointer type whose class is an incomplete
3873/// class type.
3874/// * The given type is a member pointer type whoise pointee type contains an
3875/// incomplete class type.
3876/// is an indirect or direct pointer to an incomplete class type.
3878 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
3879 if (IsIncompleteClassType(RecordTy))
3880 return true;
3881 }
3882
3883 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
3884 return ContainsIncompleteClassType(PointerTy->getPointeeType());
3885
3886 if (const MemberPointerType *MemberPointerTy =
3887 dyn_cast<MemberPointerType>(Ty)) {
3888 // Check if the class type is incomplete.
3889 if (!MemberPointerTy->getMostRecentCXXRecordDecl()->hasDefinition())
3890 return true;
3891
3892 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
3893 }
3894
3895 return false;
3896}
3897
3898// CanUseSingleInheritance - Return whether the given record decl has a "single,
3899// public, non-virtual base at offset zero (i.e. the derived class is dynamic
3900// iff the base is)", according to Itanium C++ ABI, 2.95p6b.
3902 // Check the number of bases.
3903 if (RD->getNumBases() != 1)
3904 return false;
3905
3906 // Get the base.
3908
3909 // Check that the base is not virtual.
3910 if (Base->isVirtual())
3911 return false;
3912
3913 // Check that the base is public.
3914 if (Base->getAccessSpecifier() != AS_public)
3915 return false;
3916
3917 // Check that the class is dynamic iff the base is.
3918 auto *BaseDecl = Base->getType()->castAsCXXRecordDecl();
3919 if (!BaseDecl->isEmpty() &&
3920 BaseDecl->isDynamicClass() != RD->isDynamicClass())
3921 return false;
3922
3923 return true;
3924}
3925
3926void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty,
3927 llvm::Constant *StorageAddress) {
3928 // abi::__class_type_info.
3929 static const char * const ClassTypeInfo =
3930 "_ZTVN10__cxxabiv117__class_type_infoE";
3931 // abi::__si_class_type_info.
3932 static const char * const SIClassTypeInfo =
3933 "_ZTVN10__cxxabiv120__si_class_type_infoE";
3934 // abi::__vmi_class_type_info.
3935 static const char * const VMIClassTypeInfo =
3936 "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
3937
3938 const char *VTableName = nullptr;
3939
3940 switch (Ty->getTypeClass()) {
3941#define TYPE(Class, Base)
3942#define ABSTRACT_TYPE(Class, Base)
3943#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3944#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3945#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3946#include "clang/AST/TypeNodes.inc"
3947 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
3948
3949 case Type::LValueReference:
3950 case Type::RValueReference:
3951 llvm_unreachable("References shouldn't get here");
3952
3953 case Type::Auto:
3954 case Type::DeducedTemplateSpecialization:
3955 llvm_unreachable("Undeduced type shouldn't get here");
3956
3957 case Type::Pipe:
3958 llvm_unreachable("Pipe types shouldn't get here");
3959
3960 case Type::ArrayParameter:
3961 llvm_unreachable("Array Parameter types should not get here.");
3962
3963 case Type::Builtin:
3964 case Type::BitInt:
3965 // GCC treats vector and complex types as fundamental types.
3966 case Type::Vector:
3967 case Type::ExtVector:
3968 case Type::ConstantMatrix:
3969 case Type::Complex:
3970 case Type::Atomic:
3971 // FIXME: GCC treats block pointers as fundamental types?!
3972 case Type::BlockPointer:
3973 // abi::__fundamental_type_info.
3974 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
3975 break;
3976
3977 case Type::ConstantArray:
3978 case Type::IncompleteArray:
3979 case Type::VariableArray:
3980 // abi::__array_type_info.
3981 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
3982 break;
3983
3984 case Type::FunctionNoProto:
3985 case Type::FunctionProto:
3986 // abi::__function_type_info.
3987 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
3988 break;
3989
3990 case Type::Enum:
3991 // abi::__enum_type_info.
3992 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
3993 break;
3994
3995 case Type::Record: {
3996 const auto *RD = cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl())
3997 ->getDefinitionOrSelf();
3998
3999 if (!RD->hasDefinition() || !RD->getNumBases()) {
4000 VTableName = ClassTypeInfo;
4001 } else if (CanUseSingleInheritance(RD)) {
4002 VTableName = SIClassTypeInfo;
4003 } else {
4004 VTableName = VMIClassTypeInfo;
4005 }
4006
4007 break;
4008 }
4009
4010 case Type::ObjCObject:
4011 // Ignore protocol qualifiers.
4012 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
4013
4014 // Handle id and Class.
4015 if (isa<BuiltinType>(Ty)) {
4016 VTableName = ClassTypeInfo;
4017 break;
4018 }
4019
4020 assert(isa<ObjCInterfaceType>(Ty));
4021 [[fallthrough]];
4022
4023 case Type::ObjCInterface:
4024 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
4025 VTableName = SIClassTypeInfo;
4026 } else {
4027 VTableName = ClassTypeInfo;
4028 }
4029 break;
4030
4031 case Type::ObjCObjectPointer:
4032 case Type::Pointer:
4033 // abi::__pointer_type_info.
4034 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
4035 break;
4036
4037 case Type::MemberPointer:
4038 // abi::__pointer_to_member_type_info.
4039 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
4040 break;
4041
4042 case Type::HLSLAttributedResource:
4043 case Type::HLSLInlineSpirv:
4044 llvm_unreachable("HLSL doesn't support virtual functions");
4045 }
4046
4047 llvm::Constant *VTable = nullptr;
4048
4049 // Check if the alias exists. If it doesn't, then get or create the global.
4051 VTable = CGM.getModule().getNamedAlias(VTableName);
4052 if (!VTable) {
4053 llvm::Type *Ty = llvm::ArrayType::get(CGM.GlobalsInt8PtrTy, 0);
4054 VTable = CGM.getModule().getOrInsertGlobal(VTableName, Ty);
4055 }
4056
4057 CGM.setDSOLocal(cast<llvm::GlobalValue>(VTable->stripPointerCasts()));
4058
4059 llvm::Type *PtrDiffTy =
4061
4062 // The vtable address point is 2.
4064 // The vtable address point is 8 bytes after its start:
4065 // 4 for the offset to top + 4 for the relative offset to rtti.
4066 llvm::Constant *Eight = llvm::ConstantInt::get(CGM.Int32Ty, 8);
4067 VTable =
4068 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8Ty, VTable, Eight);
4069 } else {
4070 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
4071 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.GlobalsInt8PtrTy,
4072 VTable, Two);
4073 }
4074
4075 if (const auto &Schema =
4077 VTable = CGM.getConstantSignedPointer(
4078 VTable, Schema,
4079 Schema.isAddressDiscriminated() ? StorageAddress : nullptr,
4080 GlobalDecl(), QualType(Ty, 0));
4081
4082 Fields.push_back(VTable);
4083}
4084
4085/// Return the linkage that the type info and type info name constants
4086/// should have for the given type.
4087static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
4088 QualType Ty) {
4089 // Itanium C++ ABI 2.9.5p7:
4090 // In addition, it and all of the intermediate abi::__pointer_type_info
4091 // structs in the chain down to the abi::__class_type_info for the
4092 // incomplete class type must be prevented from resolving to the
4093 // corresponding type_info structs for the complete class type, possibly
4094 // by making them local static objects. Finally, a dummy class RTTI is
4095 // generated for the incomplete type that will not resolve to the final
4096 // complete class RTTI (because the latter need not exist), possibly by
4097 // making it a local static object.
4099 return llvm::GlobalValue::InternalLinkage;
4100
4101 switch (Ty->getLinkage()) {
4102 case Linkage::Invalid:
4103 llvm_unreachable("Linkage hasn't been computed!");
4104
4105 case Linkage::None:
4106 case Linkage::Internal:
4108 return llvm::GlobalValue::InternalLinkage;
4109
4111 case Linkage::Module:
4112 case Linkage::External:
4113 // RTTI is not enabled, which means that this type info struct is going
4114 // to be used for exception handling. Give it linkonce_odr linkage.
4115 if (!CGM.getLangOpts().RTTI)
4116 return llvm::GlobalValue::LinkOnceODRLinkage;
4117
4118 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
4119 const auto *RD =
4120 cast<CXXRecordDecl>(Record->getDecl())->getDefinitionOrSelf();
4121 if (RD->hasAttr<WeakAttr>())
4122 return llvm::GlobalValue::WeakODRLinkage;
4123 if (CGM.getTriple().isWindowsItaniumEnvironment())
4124 if (RD->hasAttr<DLLImportAttr>() &&
4126 return llvm::GlobalValue::ExternalLinkage;
4127 // MinGW always uses LinkOnceODRLinkage for type info.
4128 if (RD->isDynamicClass() &&
4129 !CGM.getContext().getTargetInfo().getTriple().isOSCygMing())
4130 return CGM.getVTableLinkage(RD);
4131 }
4132
4133 return llvm::GlobalValue::LinkOnceODRLinkage;
4134 }
4135
4136 llvm_unreachable("Invalid linkage!");
4137}
4138
4139llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) {
4140 // We want to operate on the canonical type.
4141 Ty = Ty.getCanonicalType();
4142
4143 // Check if we've already emitted an RTTI descriptor for this type.
4144 SmallString<256> Name;
4145 llvm::raw_svector_ostream Out(Name);
4146 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
4147
4148 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
4149 if (OldGV && !OldGV->isDeclaration()) {
4150 assert(!OldGV->hasAvailableExternallyLinkage() &&
4151 "available_externally typeinfos not yet implemented");
4152
4153 return OldGV;
4154 }
4155
4156 // Check if there is already an external RTTI descriptor for this type.
4159 return GetAddrOfExternalRTTIDescriptor(Ty);
4160
4161 // Emit the standard library with external linkage.
4162 llvm::GlobalVariable::LinkageTypes Linkage = getTypeInfoLinkage(CGM, Ty);
4163
4164 // Give the type_info object and name the formal visibility of the
4165 // type itself.
4166 llvm::GlobalValue::VisibilityTypes llvmVisibility;
4167 if (llvm::GlobalValue::isLocalLinkage(Linkage))
4168 // If the linkage is local, only default visibility makes sense.
4169 llvmVisibility = llvm::GlobalValue::DefaultVisibility;
4170 else if (CXXABI.classifyRTTIUniqueness(Ty, Linkage) ==
4171 ItaniumCXXABI::RUK_NonUniqueHidden)
4172 llvmVisibility = llvm::GlobalValue::HiddenVisibility;
4173 else
4174 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
4175
4176 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass =
4177 llvm::GlobalValue::DefaultStorageClass;
4178 if (auto RD = Ty->getAsCXXRecordDecl()) {
4179 if ((CGM.getTriple().isWindowsItaniumEnvironment() &&
4180 RD->hasAttr<DLLExportAttr>()) ||
4182 !llvm::GlobalValue::isLocalLinkage(Linkage) &&
4183 llvmVisibility == llvm::GlobalValue::DefaultVisibility))
4184 DLLStorageClass = llvm::GlobalValue::DLLExportStorageClass;
4185 }
4186 return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass);
4187}
4188
4189llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
4190 QualType Ty,
4191 llvm::GlobalVariable::LinkageTypes Linkage,
4192 llvm::GlobalValue::VisibilityTypes Visibility,
4193 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) {
4194 SmallString<256> Name;
4195 llvm::raw_svector_ostream Out(Name);
4196 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
4197 llvm::Module &M = CGM.getModule();
4198 llvm::GlobalVariable *OldGV = M.getNamedGlobal(Name);
4199 // int8 is an arbitrary type to be replaced later with replaceInitializer.
4200 llvm::GlobalVariable *GV =
4201 new llvm::GlobalVariable(M, CGM.Int8Ty, /*isConstant=*/true, Linkage,
4202 /*Initializer=*/nullptr, Name);
4203
4204 // Add the vtable pointer.
4205 BuildVTablePointer(cast<Type>(Ty), GV);
4206
4207 // And the name.
4208 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
4209 llvm::Constant *TypeNameField;
4210
4211 // If we're supposed to demote the visibility, be sure to set a flag
4212 // to use a string comparison for type_info comparisons.
4213 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
4214 CXXABI.classifyRTTIUniqueness(Ty, Linkage);
4215 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
4216 // The flag is the sign bit, which on ARM64 is defined to be clear
4217 // for global pointers. This is very ARM64-specific.
4218 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
4219 llvm::Constant *flag =
4220 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
4221 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
4222 TypeNameField =
4223 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.GlobalsInt8PtrTy);
4224 } else {
4225 TypeNameField = TypeName;
4226 }
4227 Fields.push_back(TypeNameField);
4228
4229 switch (Ty->getTypeClass()) {
4230#define TYPE(Class, Base)
4231#define ABSTRACT_TYPE(Class, Base)
4232#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
4233#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4234#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4235#include "clang/AST/TypeNodes.inc"
4236 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
4237
4238 // GCC treats vector types as fundamental types.
4239 case Type::Builtin:
4240 case Type::Vector:
4241 case Type::ExtVector:
4242 case Type::ConstantMatrix:
4243 case Type::Complex:
4244 case Type::BlockPointer:
4245 // Itanium C++ ABI 2.9.5p4:
4246 // abi::__fundamental_type_info adds no data members to std::type_info.
4247 break;
4248
4249 case Type::LValueReference:
4250 case Type::RValueReference:
4251 llvm_unreachable("References shouldn't get here");
4252
4253 case Type::Auto:
4254 case Type::DeducedTemplateSpecialization:
4255 llvm_unreachable("Undeduced type shouldn't get here");
4256
4257 case Type::Pipe:
4258 break;
4259
4260 case Type::BitInt:
4261 break;
4262
4263 case Type::ConstantArray:
4264 case Type::IncompleteArray:
4265 case Type::VariableArray:
4266 case Type::ArrayParameter:
4267 // Itanium C++ ABI 2.9.5p5:
4268 // abi::__array_type_info adds no data members to std::type_info.
4269 break;
4270
4271 case Type::FunctionNoProto:
4272 case Type::FunctionProto:
4273 // Itanium C++ ABI 2.9.5p5:
4274 // abi::__function_type_info adds no data members to std::type_info.
4275 break;
4276
4277 case Type::Enum:
4278 // Itanium C++ ABI 2.9.5p5:
4279 // abi::__enum_type_info adds no data members to std::type_info.
4280 break;
4281
4282 case Type::Record: {
4283 const auto *RD = cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl())
4284 ->getDefinitionOrSelf();
4285 if (!RD->hasDefinition() || !RD->getNumBases()) {
4286 // We don't need to emit any fields.
4287 break;
4288 }
4289
4291 BuildSIClassTypeInfo(RD);
4292 else
4293 BuildVMIClassTypeInfo(RD);
4294
4295 break;
4296 }
4297
4298 case Type::ObjCObject:
4299 case Type::ObjCInterface:
4300 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
4301 break;
4302
4303 case Type::ObjCObjectPointer:
4304 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
4305 break;
4306
4307 case Type::Pointer:
4308 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
4309 break;
4310
4311 case Type::MemberPointer:
4312 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
4313 break;
4314
4315 case Type::Atomic:
4316 // No fields, at least for the moment.
4317 break;
4318
4319 case Type::HLSLAttributedResource:
4320 case Type::HLSLInlineSpirv:
4321 llvm_unreachable("HLSL doesn't support RTTI");
4322 }
4323
4324 GV->replaceInitializer(llvm::ConstantStruct::getAnon(Fields));
4325
4326 // Export the typeinfo in the same circumstances as the vtable is exported.
4327 auto GVDLLStorageClass = DLLStorageClass;
4328 if (CGM.getTarget().hasPS4DLLImportExport() &&
4329 GVDLLStorageClass != llvm::GlobalVariable::DLLExportStorageClass) {
4330 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
4331 const auto *RD =
4332 cast<CXXRecordDecl>(RecordTy->getDecl())->getDefinitionOrSelf();
4333 if (RD->hasAttr<DLLExportAttr>() ||
4335 GVDLLStorageClass = llvm::GlobalVariable::DLLExportStorageClass;
4336 }
4337 }
4338
4339 // If there's already an old global variable, replace it with the new one.
4340 if (OldGV) {
4341 GV->takeName(OldGV);
4342 OldGV->replaceAllUsesWith(GV);
4343 OldGV->eraseFromParent();
4344 }
4345
4346 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
4347 GV->setComdat(M.getOrInsertComdat(GV->getName()));
4348
4349 CharUnits Align = CGM.getContext().toCharUnitsFromBits(
4351 GV->setAlignment(Align.getAsAlign());
4352
4353 // The Itanium ABI specifies that type_info objects must be globally
4354 // unique, with one exception: if the type is an incomplete class
4355 // type or a (possibly indirect) pointer to one. That exception
4356 // affects the general case of comparing type_info objects produced
4357 // by the typeid operator, which is why the comparison operators on
4358 // std::type_info generally use the type_info name pointers instead
4359 // of the object addresses. However, the language's built-in uses
4360 // of RTTI generally require class types to be complete, even when
4361 // manipulating pointers to those class types. This allows the
4362 // implementation of dynamic_cast to rely on address equality tests,
4363 // which is much faster.
4364
4365 // All of this is to say that it's important that both the type_info
4366 // object and the type_info name be uniqued when weakly emitted.
4367
4368 TypeName->setVisibility(Visibility);
4369 CGM.setDSOLocal(TypeName);
4370
4371 GV->setVisibility(Visibility);
4372 CGM.setDSOLocal(GV);
4373
4374 TypeName->setDLLStorageClass(DLLStorageClass);
4375 GV->setDLLStorageClass(GVDLLStorageClass);
4376
4377 TypeName->setPartition(CGM.getCodeGenOpts().SymbolPartition);
4378 GV->setPartition(CGM.getCodeGenOpts().SymbolPartition);
4379
4380 return GV;
4381}
4382
4383/// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
4384/// for the given Objective-C object type.
4385void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
4386 // Drop qualifiers.
4387 const Type *T = OT->getBaseType().getTypePtr();
4389
4390 // The builtin types are abi::__class_type_infos and don't require
4391 // extra fields.
4392 if (isa<BuiltinType>(T)) return;
4393
4394 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
4395 ObjCInterfaceDecl *Super = Class->getSuperClass();
4396
4397 // Root classes are also __class_type_info.
4398 if (!Super) return;
4399
4400 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
4401
4402 // Everything else is single inheritance.
4403 llvm::Constant *BaseTypeInfo =
4404 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
4405 Fields.push_back(BaseTypeInfo);
4406}
4407
4408/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
4409/// inheritance, according to the Itanium C++ ABI, 2.95p6b.
4410void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
4411 // Itanium C++ ABI 2.9.5p6b:
4412 // It adds to abi::__class_type_info a single member pointing to the
4413 // type_info structure for the base type,
4414 llvm::Constant *BaseTypeInfo =
4415 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
4416 Fields.push_back(BaseTypeInfo);
4417}
4418
4419namespace {
4420 /// SeenBases - Contains virtual and non-virtual bases seen when traversing
4421 /// a class hierarchy.
4422 struct SeenBases {
4423 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
4424 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
4425 };
4426}
4427
4428/// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
4429/// abi::__vmi_class_type_info.
4430///
4432 SeenBases &Bases) {
4433
4434 unsigned Flags = 0;
4435
4436 auto *BaseDecl = Base->getType()->castAsCXXRecordDecl();
4437 if (Base->isVirtual()) {
4438 // Mark the virtual base as seen.
4439 if (!Bases.VirtualBases.insert(BaseDecl).second) {
4440 // If this virtual base has been seen before, then the class is diamond
4441 // shaped.
4442 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
4443 } else {
4444 if (Bases.NonVirtualBases.count(BaseDecl))
4445 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
4446 }
4447 } else {
4448 // Mark the non-virtual base as seen.
4449 if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
4450 // If this non-virtual base has been seen before, then the class has non-
4451 // diamond shaped repeated inheritance.
4452 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
4453 } else {
4454 if (Bases.VirtualBases.count(BaseDecl))
4455 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
4456 }
4457 }
4458
4459 // Walk all bases.
4460 for (const auto &I : BaseDecl->bases())
4461 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
4462
4463 return Flags;
4464}
4465
4467 unsigned Flags = 0;
4468 SeenBases Bases;
4469
4470 // Walk all bases.
4471 for (const auto &I : RD->bases())
4472 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
4473
4474 return Flags;
4475}
4476
4477/// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
4478/// classes with bases that do not satisfy the abi::__si_class_type_info
4479/// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
4480void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
4481 llvm::Type *UnsignedIntLTy =
4483
4484 // Itanium C++ ABI 2.9.5p6c:
4485 // __flags is a word with flags describing details about the class
4486 // structure, which may be referenced by using the __flags_masks
4487 // enumeration. These flags refer to both direct and indirect bases.
4488 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
4489 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
4490
4491 // Itanium C++ ABI 2.9.5p6c:
4492 // __base_count is a word with the number of direct proper base class
4493 // descriptions that follow.
4494 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
4495
4496 if (!RD->getNumBases())
4497 return;
4498
4499 // Now add the base class descriptions.
4500
4501 // Itanium C++ ABI 2.9.5p6c:
4502 // __base_info[] is an array of base class descriptions -- one for every
4503 // direct proper base. Each description is of the type:
4504 //
4505 // struct abi::__base_class_type_info {
4506 // public:
4507 // const __class_type_info *__base_type;
4508 // long __offset_flags;
4509 //
4510 // enum __offset_flags_masks {
4511 // __virtual_mask = 0x1,
4512 // __public_mask = 0x2,
4513 // __offset_shift = 8
4514 // };
4515 // };
4516
4517 // If we're in mingw and 'long' isn't wide enough for a pointer, use 'long
4518 // long' instead of 'long' for __offset_flags. libstdc++abi uses long long on
4519 // LLP64 platforms.
4520 // FIXME: Consider updating libc++abi to match, and extend this logic to all
4521 // LLP64 platforms.
4522 QualType OffsetFlagsTy = CGM.getContext().LongTy;
4523 const TargetInfo &TI = CGM.getContext().getTargetInfo();
4524 if (TI.getTriple().isOSCygMing() &&
4525 TI.getPointerWidth(LangAS::Default) > TI.getLongWidth())
4526 OffsetFlagsTy = CGM.getContext().LongLongTy;
4527 llvm::Type *OffsetFlagsLTy =
4528 CGM.getTypes().ConvertType(OffsetFlagsTy);
4529
4530 for (const auto &Base : RD->bases()) {
4531 // The __base_type member points to the RTTI for the base type.
4532 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
4533
4534 auto *BaseDecl = Base.getType()->castAsCXXRecordDecl();
4535 int64_t OffsetFlags = 0;
4536
4537 // All but the lower 8 bits of __offset_flags are a signed offset.
4538 // For a non-virtual base, this is the offset in the object of the base
4539 // subobject. For a virtual base, this is the offset in the virtual table of
4540 // the virtual base offset for the virtual base referenced (negative).
4541 CharUnits Offset;
4542 if (Base.isVirtual())
4543 Offset =
4545 else {
4546 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
4547 Offset = Layout.getBaseClassOffset(BaseDecl);
4548 };
4549
4550 OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
4551
4552 // The low-order byte of __offset_flags contains flags, as given by the
4553 // masks from the enumeration __offset_flags_masks.
4554 if (Base.isVirtual())
4555 OffsetFlags |= BCTI_Virtual;
4556 if (Base.getAccessSpecifier() == AS_public)
4557 OffsetFlags |= BCTI_Public;
4558
4559 Fields.push_back(llvm::ConstantInt::get(OffsetFlagsLTy, OffsetFlags));
4560 }
4561}
4562
4563/// Compute the flags for a __pbase_type_info, and remove the corresponding
4564/// pieces from \p Type.
4566 unsigned Flags = 0;
4567
4568 if (Type.isConstQualified())
4569 Flags |= ItaniumRTTIBuilder::PTI_Const;
4570 if (Type.isVolatileQualified())
4571 Flags |= ItaniumRTTIBuilder::PTI_Volatile;
4572 if (Type.isRestrictQualified())
4573 Flags |= ItaniumRTTIBuilder::PTI_Restrict;
4574 Type = Type.getUnqualifiedType();
4575
4576 // Itanium C++ ABI 2.9.5p7:
4577 // When the abi::__pbase_type_info is for a direct or indirect pointer to an
4578 // incomplete class type, the incomplete target type flag is set.
4580 Flags |= ItaniumRTTIBuilder::PTI_Incomplete;
4581
4582 if (auto *Proto = Type->getAs<FunctionProtoType>()) {
4583 if (Proto->isNothrow()) {
4584 Flags |= ItaniumRTTIBuilder::PTI_Noexcept;
4586 }
4587 }
4588
4589 return Flags;
4590}
4591
4592/// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
4593/// used for pointer types.
4594void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
4595 // Itanium C++ ABI 2.9.5p7:
4596 // __flags is a flag word describing the cv-qualification and other
4597 // attributes of the type pointed to
4598 unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy);
4599
4600 llvm::Type *UnsignedIntLTy =
4602 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
4603
4604 // Itanium C++ ABI 2.9.5p7:
4605 // __pointee is a pointer to the std::type_info derivation for the
4606 // unqualified type being pointed to.
4607 llvm::Constant *PointeeTypeInfo =
4608 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(PointeeTy);
4609 Fields.push_back(PointeeTypeInfo);
4610}
4611
4612/// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
4613/// struct, used for member pointer types.
4614void
4615ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
4616 QualType PointeeTy = Ty->getPointeeType();
4617
4618 // Itanium C++ ABI 2.9.5p7:
4619 // __flags is a flag word describing the cv-qualification and other
4620 // attributes of the type pointed to.
4621 unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy);
4622
4623 const auto *RD = Ty->getMostRecentCXXRecordDecl();
4624 if (!RD->hasDefinition())
4625 Flags |= PTI_ContainingClassIncomplete;
4626
4627 llvm::Type *UnsignedIntLTy =
4629 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
4630
4631 // Itanium C++ ABI 2.9.5p7:
4632 // __pointee is a pointer to the std::type_info derivation for the
4633 // unqualified type being pointed to.
4634 llvm::Constant *PointeeTypeInfo =
4635 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(PointeeTy);
4636 Fields.push_back(PointeeTypeInfo);
4637
4638 // Itanium C++ ABI 2.9.5p9:
4639 // __context is a pointer to an abi::__class_type_info corresponding to the
4640 // class type containing the member pointed to
4641 // (e.g., the "A" in "int A::*").
4643 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(T));
4644}
4645
4646llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
4647 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
4648}
4649
4650void ItaniumCXXABI::EmitFundamentalRTTIDescriptors(const CXXRecordDecl *RD) {
4651 // Types added here must also be added to TypeInfoIsInStandardLibrary.
4652 QualType FundamentalTypes[] = {
4653 getContext().VoidTy, getContext().NullPtrTy,
4654 getContext().BoolTy, getContext().WCharTy,
4655 getContext().CharTy, getContext().UnsignedCharTy,
4656 getContext().SignedCharTy, getContext().ShortTy,
4657 getContext().UnsignedShortTy, getContext().IntTy,
4658 getContext().UnsignedIntTy, getContext().LongTy,
4659 getContext().UnsignedLongTy, getContext().LongLongTy,
4660 getContext().UnsignedLongLongTy, getContext().Int128Ty,
4661 getContext().UnsignedInt128Ty, getContext().HalfTy,
4662 getContext().FloatTy, getContext().DoubleTy,
4663 getContext().LongDoubleTy, getContext().Float128Ty,
4664 getContext().Char8Ty, getContext().Char16Ty,
4665 getContext().Char32Ty
4666 };
4667 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass =
4668 RD->hasAttr<DLLExportAttr>() || CGM.shouldMapVisibilityToDLLExport(RD)
4669 ? llvm::GlobalValue::DLLExportStorageClass
4670 : llvm::GlobalValue::DefaultStorageClass;
4671 llvm::GlobalValue::VisibilityTypes Visibility =
4673 for (const QualType &FundamentalType : FundamentalTypes) {
4674 QualType PointerType = getContext().getPointerType(FundamentalType);
4675 QualType PointerTypeConst = getContext().getPointerType(
4676 FundamentalType.withConst());
4677 for (QualType Type : {FundamentalType, PointerType, PointerTypeConst})
4678 ItaniumRTTIBuilder(*this).BuildTypeInfo(
4679 Type, llvm::GlobalValue::ExternalLinkage,
4680 Visibility, DLLStorageClass);
4681 }
4682}
4683
4684/// What sort of uniqueness rules should we use for the RTTI for the
4685/// given type?
4686ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
4687 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
4688 if (shouldRTTIBeUnique())
4689 return RUK_Unique;
4690
4691 // It's only necessary for linkonce_odr or weak_odr linkage.
4692 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
4693 Linkage != llvm::GlobalValue::WeakODRLinkage)
4694 return RUK_Unique;
4695
4696 // It's only necessary with default visibility.
4697 if (CanTy->getVisibility() != DefaultVisibility)
4698 return RUK_Unique;
4699
4700 // If we're not required to publish this symbol, hide it.
4701 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
4702 return RUK_NonUniqueHidden;
4703
4704 // If we're required to publish this symbol, as we might be under an
4705 // explicit instantiation, leave it with default visibility but
4706 // enable string-comparisons.
4707 assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
4708 return RUK_NonUniqueVisible;
4709}
4710
4711// Find out how to codegen the complete destructor and constructor
4712namespace {
4713enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
4714}
4715static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
4716 const CXXMethodDecl *MD) {
4717 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
4718 return StructorCodegen::Emit;
4719
4720 // The complete and base structors are not equivalent if there are any virtual
4721 // bases, so emit separate functions.
4722 if (MD->getParent()->getNumVBases())
4723 return StructorCodegen::Emit;
4724
4726 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
4728 } else {
4729 const auto *CD = cast<CXXConstructorDecl>(MD);
4731 }
4732 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
4733
4734 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
4735 return StructorCodegen::RAUW;
4736
4737 // FIXME: Should we allow available_externally aliases?
4738 if (!llvm::GlobalAlias::isValidLinkage(Linkage))
4739 return StructorCodegen::RAUW;
4740
4741 if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
4742 // Only ELF and wasm support COMDATs with arbitrary names (C5/D5).
4743 if (CGM.getTarget().getTriple().isOSBinFormatELF() ||
4744 CGM.getTarget().getTriple().isOSBinFormatWasm())
4745 return StructorCodegen::COMDAT;
4746 return StructorCodegen::Emit;
4747 }
4748
4749 return StructorCodegen::Alias;
4750}
4751
4754 GlobalDecl TargetDecl) {
4755 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
4756
4757 StringRef MangledName = CGM.getMangledName(AliasDecl);
4758 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
4759 if (Entry && !Entry->isDeclaration())
4760 return;
4761
4762 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
4763
4764 // Create the alias with no name.
4765 auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee);
4766
4767 // Constructors and destructors are always unnamed_addr.
4768 Alias->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4769
4770 // Switch any previous uses to the alias.
4771 if (Entry) {
4772 assert(Entry->getType() == Aliasee->getType() &&
4773 "declaration exists with different type");
4774 Alias->takeName(Entry);
4775 Entry->replaceAllUsesWith(Alias);
4776 Entry->eraseFromParent();
4777 } else {
4778 Alias->setName(MangledName);
4779 }
4780
4781 // Finally, set up the alias with its proper name and attributes.
4782 CGM.SetCommonAttributes(AliasDecl, Alias);
4783}
4784
4785void ItaniumCXXABI::emitCXXStructor(GlobalDecl GD) {
4786 auto *MD = cast<CXXMethodDecl>(GD.getDecl());
4787 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
4788 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
4789
4790 StructorCodegen CGType = getCodegenToUse(CGM, MD);
4791
4792 if (CD ? GD.getCtorType() == Ctor_Complete
4793 : GD.getDtorType() == Dtor_Complete) {
4794 GlobalDecl BaseDecl;
4795 if (CD)
4796 BaseDecl = GD.getWithCtorType(Ctor_Base);
4797 else
4798 BaseDecl = GD.getWithDtorType(Dtor_Base);
4799
4800 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
4801 emitConstructorDestructorAlias(CGM, GD, BaseDecl);
4802 return;
4803 }
4804
4805 if (CGType == StructorCodegen::RAUW) {
4806 StringRef MangledName = CGM.getMangledName(GD);
4807 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl);
4808 CGM.addReplacement(MangledName, Aliasee);
4809 return;
4810 }
4811 }
4812
4813 // The base destructor is equivalent to the base destructor of its
4814 // base class if there is exactly one non-virtual base class with a
4815 // non-trivial destructor, there are no fields with a non-trivial
4816 // destructor, and the body of the destructor is trivial.
4817 if (DD && GD.getDtorType() == Dtor_Base &&
4818 CGType != StructorCodegen::COMDAT &&
4820 return;
4821
4822 // FIXME: The deleting destructor is equivalent to the selected operator
4823 // delete if:
4824 // * either the delete is a destroying operator delete or the destructor
4825 // would be trivial if it weren't virtual,
4826 // * the conversion from the 'this' parameter to the first parameter of the
4827 // destructor is equivalent to a bitcast,
4828 // * the destructor does not have an implicit "this" return, and
4829 // * the operator delete has the same calling convention and IR function type
4830 // as the destructor.
4831 // In such cases we should try to emit the deleting dtor as an alias to the
4832 // selected 'operator delete'.
4833
4834 llvm::Function *Fn = CGM.codegenCXXStructor(GD);
4835
4836 if (CGType == StructorCodegen::COMDAT) {
4837 SmallString<256> Buffer;
4838 llvm::raw_svector_ostream Out(Buffer);
4839 if (DD)
4840 getMangleContext().mangleCXXDtorComdat(DD, Out);
4841 else
4842 getMangleContext().mangleCXXCtorComdat(CD, Out);
4843 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
4844 Fn->setComdat(C);
4845 } else {
4846 CGM.maybeSetTrivialComdat(*MD, *Fn);
4847 }
4848}
4849
4850static llvm::FunctionCallee getBeginCatchFn(CodeGenModule &CGM) {
4851 // void *__cxa_begin_catch(void*);
4852 llvm::FunctionType *FTy = llvm::FunctionType::get(
4853 CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false);
4854
4855 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
4856}
4857
4858static llvm::FunctionCallee getEndCatchFn(CodeGenModule &CGM) {
4859 // void __cxa_end_catch();
4860 llvm::FunctionType *FTy =
4861 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
4862
4863 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
4864}
4865
4866static llvm::FunctionCallee getGetExceptionPtrFn(CodeGenModule &CGM) {
4867 // void *__cxa_get_exception_ptr(void*);
4868 llvm::FunctionType *FTy = llvm::FunctionType::get(
4869 CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false);
4870
4871 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
4872}
4873
4874namespace {
4875 /// A cleanup to call __cxa_end_catch. In many cases, the caught
4876 /// exception type lets us state definitively that the thrown exception
4877 /// type does not have a destructor. In particular:
4878 /// - Catch-alls tell us nothing, so we have to conservatively
4879 /// assume that the thrown exception might have a destructor.
4880 /// - Catches by reference behave according to their base types.
4881 /// - Catches of non-record types will only trigger for exceptions
4882 /// of non-record types, which never have destructors.
4883 /// - Catches of record types can trigger for arbitrary subclasses
4884 /// of the caught type, so we have to assume the actual thrown
4885 /// exception type might have a throwing destructor, even if the
4886 /// caught type's destructor is trivial or nothrow.
4887 struct CallEndCatch final : EHScopeStack::Cleanup {
4888 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
4889 bool MightThrow;
4890
4891 void Emit(CodeGenFunction &CGF, Flags flags) override {
4892 if (!MightThrow) {
4894 return;
4895 }
4896
4898 }
4899 };
4900}
4901
4902/// Emits a call to __cxa_begin_catch and enters a cleanup to call
4903/// __cxa_end_catch. If -fassume-nothrow-exception-dtor is specified, we assume
4904/// that the exception object's dtor is nothrow, therefore the __cxa_end_catch
4905/// call can be marked as nounwind even if EndMightThrow is true.
4906///
4907/// \param EndMightThrow - true if __cxa_end_catch might throw
4908static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
4909 llvm::Value *Exn,
4910 bool EndMightThrow) {
4911 llvm::CallInst *call =
4913
4914 CGF.EHStack.pushCleanup<CallEndCatch>(
4916 EndMightThrow && !CGF.CGM.getLangOpts().AssumeNothrowExceptionDtor);
4917
4918 return call;
4919}
4920
4921/// A "special initializer" callback for initializing a catch
4922/// parameter during catch initialization.
4924 const VarDecl &CatchParam,
4925 Address ParamAddr,
4926 SourceLocation Loc) {
4927 // Load the exception from where the landing pad saved it.
4928 llvm::Value *Exn = CGF.getExceptionFromSlot();
4929
4930 CanQualType CatchType =
4931 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
4932 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
4933
4934 // If we're catching by reference, we can just cast the object
4935 // pointer to the appropriate pointer.
4936 if (isa<ReferenceType>(CatchType)) {
4937 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
4938 bool EndCatchMightThrow = CaughtType->isRecordType();
4939
4940 // __cxa_begin_catch returns the adjusted object pointer.
4941 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
4942
4943 // We have no way to tell the personality function that we're
4944 // catching by reference, so if we're catching a pointer,
4945 // __cxa_begin_catch will actually return that pointer by value.
4946 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
4947 QualType PointeeType = PT->getPointeeType();
4948
4949 // When catching by reference, generally we should just ignore
4950 // this by-value pointer and use the exception object instead.
4951 if (!PointeeType->isRecordType()) {
4952
4953 // Exn points to the struct _Unwind_Exception header, which
4954 // we have to skip past in order to reach the exception data.
4955 unsigned HeaderSize =
4957 AdjustedExn =
4958 CGF.Builder.CreateConstGEP1_32(CGF.Int8Ty, Exn, HeaderSize);
4959
4960 // However, if we're catching a pointer-to-record type that won't
4961 // work, because the personality function might have adjusted
4962 // the pointer. There's actually no way for us to fully satisfy
4963 // the language/ABI contract here: we can't use Exn because it
4964 // might have the wrong adjustment, but we can't use the by-value
4965 // pointer because it's off by a level of abstraction.
4966 //
4967 // The current solution is to dump the adjusted pointer into an
4968 // alloca, which breaks language semantics (because changing the
4969 // pointer doesn't change the exception) but at least works.
4970 // The better solution would be to filter out non-exact matches
4971 // and rethrow them, but this is tricky because the rethrow
4972 // really needs to be catchable by other sites at this landing
4973 // pad. The best solution is to fix the personality function.
4974 } else {
4975 // Pull the pointer for the reference type off.
4976 llvm::Type *PtrTy = CGF.ConvertTypeForMem(CaughtType);
4977
4978 // Create the temporary and write the adjusted pointer into it.
4979 Address ExnPtrTmp =
4980 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp");
4981 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
4982 CGF.Builder.CreateStore(Casted, ExnPtrTmp);
4983
4984 // Bind the reference to the temporary.
4985 AdjustedExn = ExnPtrTmp.emitRawPointer(CGF);
4986 }
4987 }
4988
4989 llvm::Value *ExnCast =
4990 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
4991 CGF.Builder.CreateStore(ExnCast, ParamAddr);
4992 return;
4993 }
4994
4995 // Scalars and complexes.
4996 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
4997 if (TEK != TEK_Aggregate) {
4998 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
4999
5000 // If the catch type is a pointer type, __cxa_begin_catch returns
5001 // the pointer by value.
5002 if (CatchType->hasPointerRepresentation()) {
5003 llvm::Value *CastExn =
5004 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
5005
5006 switch (CatchType.getQualifiers().getObjCLifetime()) {
5008 CastExn = CGF.EmitARCRetainNonBlock(CastExn);
5009 [[fallthrough]];
5010
5014 CGF.Builder.CreateStore(CastExn, ParamAddr);
5015 return;
5016
5018 CGF.EmitARCInitWeak(ParamAddr, CastExn);
5019 return;
5020 }
5021 llvm_unreachable("bad ownership qualifier!");
5022 }
5023
5024 // Otherwise, it returns a pointer into the exception object.
5025
5026 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(AdjustedExn, CatchType);
5027 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType);
5028 switch (TEK) {
5029 case TEK_Complex:
5030 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
5031 /*init*/ true);
5032 return;
5033 case TEK_Scalar: {
5034 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
5035 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
5036 return;
5037 }
5038 case TEK_Aggregate:
5039 llvm_unreachable("evaluation kind filtered out!");
5040 }
5041 llvm_unreachable("bad evaluation kind");
5042 }
5043
5044 assert(isa<RecordType>(CatchType) && "unexpected catch type!");
5045 auto catchRD = CatchType->getAsCXXRecordDecl();
5046 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD);
5047
5048 llvm::Type *PtrTy = CGF.DefaultPtrTy;
5049
5050 // Check for a copy expression. If we don't have a copy expression,
5051 // that means a trivial copy is okay.
5052 const Expr *copyExpr = CatchParam.getInit();
5053 if (!copyExpr) {
5054 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
5055 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
5056 LLVMCatchTy, caughtExnAlignment);
5057 LValue Dest = CGF.MakeAddrLValue(ParamAddr, CatchType);
5058 LValue Src = CGF.MakeAddrLValue(adjustedExn, CatchType);
5059 CGF.EmitAggregateCopy(Dest, Src, CatchType, AggValueSlot::DoesNotOverlap);
5060 return;
5061 }
5062
5063 // We have to call __cxa_get_exception_ptr to get the adjusted
5064 // pointer before copying.
5065 llvm::CallInst *rawAdjustedExn =
5067
5068 // Cast that to the appropriate type.
5069 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
5070 LLVMCatchTy, caughtExnAlignment);
5071
5072 // The copy expression is defined in terms of an OpaqueValueExpr.
5073 // Find it and map it to the adjusted expression.
5075 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
5076 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
5077
5078 // Call the copy ctor in a terminate scope.
5079 CGF.EHStack.pushTerminate();
5080
5081 // Perform the copy construction.
5082 CGF.EmitAggExpr(copyExpr,
5083 AggValueSlot::forAddr(ParamAddr, Qualifiers(),
5088
5089 // Leave the terminate scope.
5090 CGF.EHStack.popTerminate();
5091
5092 // Undo the opaque value mapping.
5093 opaque.pop();
5094
5095 // Finally we can call __cxa_begin_catch.
5096 CallBeginCatch(CGF, Exn, true);
5097}
5098
5099/// Begins a catch statement by initializing the catch variable and
5100/// calling __cxa_begin_catch.
5101void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF,
5102 const CXXCatchStmt *S) {
5103 // We have to be very careful with the ordering of cleanups here:
5104 // C++ [except.throw]p4:
5105 // The destruction [of the exception temporary] occurs
5106 // immediately after the destruction of the object declared in
5107 // the exception-declaration in the handler.
5108 //
5109 // So the precise ordering is:
5110 // 1. Construct catch variable.
5111 // 2. __cxa_begin_catch
5112 // 3. Enter __cxa_end_catch cleanup
5113 // 4. Enter dtor cleanup
5114 //
5115 // We do this by using a slightly abnormal initialization process.
5116 // Delegation sequence:
5117 // - ExitCXXTryStmt opens a RunCleanupsScope
5118 // - EmitAutoVarAlloca creates the variable and debug info
5119 // - InitCatchParam initializes the variable from the exception
5120 // - CallBeginCatch calls __cxa_begin_catch
5121 // - CallBeginCatch enters the __cxa_end_catch cleanup
5122 // - EmitAutoVarCleanups enters the variable destructor cleanup
5123 // - EmitCXXTryStmt emits the code for the catch body
5124 // - EmitCXXTryStmt close the RunCleanupsScope
5125
5126 VarDecl *CatchParam = S->getExceptionDecl();
5127 if (!CatchParam) {
5128 llvm::Value *Exn = CGF.getExceptionFromSlot();
5129 CallBeginCatch(CGF, Exn, true);
5130 return;
5131 }
5132
5133 // Emit the local.
5134 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
5135 {
5136 ApplyAtomGroup Grp(CGF.getDebugInfo());
5137 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF),
5138 S->getBeginLoc());
5139 }
5140 CGF.EmitAutoVarCleanups(var);
5141}
5142
5143/// Get or define the following function:
5144/// void @__clang_call_terminate(i8* %exn) nounwind noreturn
5145/// This code is used only in C++.
5146static llvm::FunctionCallee getClangCallTerminateFn(CodeGenModule &CGM) {
5147 ASTContext &C = CGM.getContext();
5149 C.VoidTy, {C.getPointerType(C.CharTy)});
5150 llvm::FunctionType *fnTy = CGM.getTypes().GetFunctionType(FI);
5151 llvm::FunctionCallee fnRef = CGM.CreateRuntimeFunction(
5152 fnTy, "__clang_call_terminate", llvm::AttributeList(), /*Local=*/true);
5153 llvm::Function *fn =
5154 cast<llvm::Function>(fnRef.getCallee()->stripPointerCasts());
5155 if (fn->empty()) {
5156 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, fn, /*IsThunk=*/false);
5158 fn->setDoesNotThrow();
5159 fn->setDoesNotReturn();
5160
5161 // What we really want is to massively penalize inlining without
5162 // forbidding it completely. The difference between that and
5163 // 'noinline' is negligible.
5164 fn->addFnAttr(llvm::Attribute::NoInline);
5165
5166 // Allow this function to be shared across translation units, but
5167 // we don't want it to turn into an exported symbol.
5168 fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
5169 fn->setVisibility(llvm::Function::HiddenVisibility);
5170 if (CGM.supportsCOMDAT())
5171 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
5172
5173 // Set up the function.
5174 llvm::BasicBlock *entry =
5175 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
5176 CGBuilderTy builder(CGM, entry);
5177
5178 // Pull the exception pointer out of the parameter list.
5179 llvm::Value *exn = &*fn->arg_begin();
5180
5181 // Call __cxa_begin_catch(exn).
5182 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
5183 catchCall->setDoesNotThrow();
5184 catchCall->setCallingConv(CGM.getRuntimeCC());
5185
5186 // Call std::terminate().
5187 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn());
5188 termCall->setDoesNotThrow();
5189 termCall->setDoesNotReturn();
5190 termCall->setCallingConv(CGM.getRuntimeCC());
5191
5192 // std::terminate cannot return.
5193 builder.CreateUnreachable();
5194 }
5195 return fnRef;
5196}
5197
5198llvm::CallInst *
5199ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
5200 llvm::Value *Exn) {
5201 // In C++, we want to call __cxa_begin_catch() before terminating.
5202 if (Exn) {
5203 assert(CGF.CGM.getLangOpts().CPlusPlus);
5205 }
5206 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
5207}
5208
5209std::pair<llvm::Value *, const CXXRecordDecl *>
5210ItaniumCXXABI::LoadVTablePtr(CodeGenFunction &CGF, Address This,
5211 const CXXRecordDecl *RD) {
5212 return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD};
5213}
5214
5215llvm::Constant *
5216ItaniumCXXABI::getSignedVirtualMemberFunctionPointer(const CXXMethodDecl *MD) {
5217 const CXXMethodDecl *origMD =
5220 .getDecl());
5221 llvm::Constant *thunk = getOrCreateVirtualFunctionPointerThunk(origMD);
5222 QualType funcType = CGM.getContext().getMemberPointerType(
5223 MD->getType(), /*Qualifier=*/std::nullopt, MD->getParent());
5224 return CGM.getMemberFunctionPointer(thunk, funcType);
5225}
5226
5227void WebAssemblyCXXABI::emitBeginCatch(CodeGenFunction &CGF,
5228 const CXXCatchStmt *C) {
5229 if (CGF.getTarget().hasFeature("exception-handling"))
5230 CGF.EHStack.pushCleanup<CatchRetScope>(
5232 ItaniumCXXABI::emitBeginCatch(CGF, C);
5233}
5234
5235llvm::CallInst *
5236WebAssemblyCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
5237 llvm::Value *Exn) {
5238 // Itanium ABI calls __clang_call_terminate(), which __cxa_begin_catch() on
5239 // the violating exception to mark it handled, but it is currently hard to do
5240 // with wasm EH instruction structure with catch/catch_all, we just call
5241 // std::terminate and ignore the violating exception as in CGCXXABI in Wasm EH
5242 // and call __clang_call_terminate only in Emscripten EH.
5243 // TODO Consider code transformation that makes calling __clang_call_terminate
5244 // in Wasm EH possible.
5245 if (Exn && !EHPersonality::get(CGF).isWasmPersonality()) {
5246 assert(CGF.CGM.getLangOpts().CPlusPlus);
5248 }
5250}
5251
5252/// Register a global destructor as best as we know how.
5253void XLCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
5254 llvm::FunctionCallee Dtor,
5255 llvm::Constant *Addr) {
5256 if (D.getTLSKind() != VarDecl::TLS_None) {
5257 llvm::PointerType *PtrTy = CGF.DefaultPtrTy;
5258
5259 // extern "C" int __pt_atexit_np(int flags, int(*)(int,...), ...);
5260 llvm::FunctionType *AtExitTy =
5261 llvm::FunctionType::get(CGM.IntTy, {CGM.IntTy, PtrTy}, true);
5262
5263 // Fetch the actual function.
5264 llvm::FunctionCallee AtExit =
5265 CGM.CreateRuntimeFunction(AtExitTy, "__pt_atexit_np");
5266
5267 // Create __dtor function for the var decl.
5268 llvm::Function *DtorStub = CGF.createTLSAtExitStub(D, Dtor, Addr, AtExit);
5269
5270 // Register above __dtor with atexit().
5271 // First param is flags and must be 0, second param is function ptr
5272 llvm::Value *NV = llvm::Constant::getNullValue(CGM.IntTy);
5273 CGF.EmitNounwindRuntimeCall(AtExit, {NV, DtorStub});
5274
5275 // Cannot unregister TLS __dtor so done
5276 return;
5277 }
5278
5279 // Create __dtor function for the var decl.
5280 llvm::Function *DtorStub =
5282
5283 // Register above __dtor with atexit().
5284 CGF.registerGlobalDtorWithAtExit(DtorStub);
5285
5286 // Emit __finalize function to unregister __dtor and (as appropriate) call
5287 // __dtor.
5288 emitCXXStermFinalizer(D, DtorStub, Addr);
5289}
5290
5291void XLCXXABI::emitCXXStermFinalizer(const VarDecl &D, llvm::Function *dtorStub,
5292 llvm::Constant *addr) {
5293 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
5294 SmallString<256> FnName;
5295 {
5296 llvm::raw_svector_ostream Out(FnName);
5297 getMangleContext().mangleDynamicStermFinalizer(&D, Out);
5298 }
5299
5300 // Create the finalization action associated with a variable.
5301 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
5302 llvm::Function *StermFinalizer = CGM.CreateGlobalInitOrCleanUpFunction(
5303 FTy, FnName.str(), FI, D.getLocation());
5304
5305 CodeGenFunction CGF(CGM);
5306
5307 CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, StermFinalizer, FI,
5308 FunctionArgList(), D.getLocation(),
5309 D.getInit()->getExprLoc());
5310
5311 // The unatexit subroutine unregisters __dtor functions that were previously
5312 // registered by the atexit subroutine. If the referenced function is found,
5313 // the unatexit returns a value of 0, meaning that the cleanup is still
5314 // pending (and we should call the __dtor function).
5315 llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(dtorStub);
5316
5317 llvm::Value *NeedsDestruct = CGF.Builder.CreateIsNull(V, "needs_destruct");
5318
5319 llvm::BasicBlock *DestructCallBlock = CGF.createBasicBlock("destruct.call");
5320 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("destruct.end");
5321
5322 // Check if unatexit returns a value of 0. If it does, jump to
5323 // DestructCallBlock, otherwise jump to EndBlock directly.
5324 CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock);
5325
5326 CGF.EmitBlock(DestructCallBlock);
5327
5328 // Emit the call to dtorStub.
5329 llvm::CallInst *CI = CGF.Builder.CreateCall(dtorStub);
5330
5331 // Make sure the call and the callee agree on calling convention.
5332 CI->setCallingConv(dtorStub->getCallingConv());
5333
5334 CGF.EmitBlock(EndBlock);
5335
5336 CGF.FinishFunction();
5337
5338 if (auto *IPA = D.getAttr<InitPriorityAttr>()) {
5339 CGM.AddCXXPrioritizedStermFinalizerEntry(StermFinalizer,
5340 IPA->getPriority());
5342 getContext().GetGVALinkageForVariable(&D) == GVA_DiscardableODR) {
5343 // According to C++ [basic.start.init]p2, class template static data
5344 // members (i.e., implicitly or explicitly instantiated specializations)
5345 // have unordered initialization. As a consequence, we can put them into
5346 // their own llvm.global_dtors entry.
5347 CGM.AddCXXStermFinalizerToGlobalDtor(StermFinalizer, 65535);
5348 } else {
5349 CGM.AddCXXStermFinalizerEntry(StermFinalizer);
5350 }
5351}
#define V(N, I)
static void emitConstructorDestructorAlias(CIRGenModule &cgm, GlobalDecl aliasDecl, GlobalDecl targetDecl)
static CharUnits computeOffsetHint(ASTContext &astContext, const CXXRecordDecl *src, const CXXRecordDecl *dst)
static Address emitDynamicCastToVoid(CIRGenFunction &cgf, mlir::Location loc, QualType srcRecordTy, Address src)
static cir::GlobalLinkageKind getTypeInfoLinkage(CIRGenModule &cgm, QualType ty)
Return the linkage that the type info and type info name constants should have for the given type.
static mlir::Value emitExactDynamicCast(CIRGenItaniumCXXABI &abi, CIRGenFunction &cgf, mlir::Location loc, QualType srcRecordTy, QualType destRecordTy, cir::PointerType destCIRTy, bool isRefCast, Address src)
static cir::FuncOp getItaniumDynamicCastFn(CIRGenFunction &cgf)
static cir::FuncOp getBadCastFn(CIRGenFunction &cgf)
static StructorCodegen getCodegenToUse(CodeGenModule &CGM, const CXXMethodDecl *MD)
static llvm::FunctionCallee getClangCallTerminateFn(CodeGenModule &CGM)
Get or define the following function: void @__clang_call_terminate(i8* exn) nounwind noreturn This co...
static bool CXXRecordNonInlineHasAttr(const CXXRecordDecl *RD)
static unsigned extractPBaseFlags(ASTContext &Ctx, QualType &Type)
Compute the flags for a __pbase_type_info, and remove the corresponding pieces from Type.
static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM, QualType Ty)
ShouldUseExternalRTTIDescriptor - Returns whether the type information for the given type exists some...
static bool IsIncompleteClassType(const RecordType *RecordTy)
IsIncompleteClassType - Returns whether the given record type is incomplete.
static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base, SeenBases &Bases)
ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in abi::__vmi_class_type_info.
static llvm::FunctionCallee getBadTypeidFn(CodeGenFunction &CGF)
static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF, llvm::FunctionCallee dtor, llvm::Constant *addr, bool TLS)
Register a global destructor using __cxa_atexit.
static llvm::FunctionCallee getBeginCatchFn(CodeGenModule &CGM)
static llvm::Constant * pointerAuthResignMemberFunctionPointer(llvm::Constant *Src, QualType DestType, QualType SrcType, CodeGenModule &CGM)
static llvm::FunctionCallee getGuardReleaseFn(CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
static llvm::Value * performTypeAdjustment(CodeGenFunction &CGF, Address InitialPtr, const CXXRecordDecl *UnadjustedClass, int64_t NonVirtualAdjustment, int64_t VirtualAdjustment, bool IsReturnAdjustment)
static llvm::Function * createGlobalInitOrCleanupFn(CodeGen::CodeGenModule &CGM, StringRef FnName)
static llvm::FunctionCallee getAllocateExceptionFn(CodeGenModule &CGM)
static bool IsStandardLibraryRTTIDescriptor(QualType Ty)
IsStandardLibraryRTTIDescriptor - Returns whether the type information for the given type exists in t...
static llvm::Value * CallBeginCatch(CodeGenFunction &CGF, llvm::Value *Exn, bool EndMightThrow)
Emits a call to __cxa_begin_catch and enters a cleanup to call __cxa_end_catch.
static llvm::FunctionCallee getGuardAbortFn(CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
static bool isThreadWrapperReplaceable(const VarDecl *VD, CodeGen::CodeGenModule &CGM)
static void InitCatchParam(CodeGenFunction &CGF, const VarDecl &CatchParam, Address ParamAddr, SourceLocation Loc)
A "special initializer" callback for initializing a catch parameter during catch initialization.
static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty)
TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type info for that type is de...
static bool CanUseSingleInheritance(const CXXRecordDecl *RD)
static llvm::FunctionCallee getEndCatchFn(CodeGenModule &CGM)
static llvm::GlobalValue::LinkageTypes getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM)
Get the appropriate linkage for the wrapper function.
static llvm::FunctionCallee getThrowFn(CodeGenModule &CGM)
static void setVTableSelectiveDLLImportExport(CodeGenModule &CGM, llvm::GlobalVariable *VTable, const CXXRecordDecl *RD)
static llvm::FunctionCallee getGuardAcquireFn(CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
static bool ContainsIncompleteClassType(QualType Ty)
ContainsIncompleteClassType - Returns whether the given type contains an incomplete class type.
static llvm::Constant * pointerAuthResignConstant(llvm::Value *Ptr, const CGPointerAuthInfo &CurAuthInfo, const CGPointerAuthInfo &NewAuthInfo, CodeGenModule &CGM)
static llvm::FunctionCallee getGetExceptionPtrFn(CodeGenModule &CGM)
static void dtorTy(Block *, std::byte *Ptr, const Descriptor *)
llvm::MachO::Record Record
Definition MachO.h:31
static uint64_t getFieldOffset(const ASTContext &C, const FieldDecl *FD)
static TemplateSpecializationKind getTemplateSpecializationKind(Decl *D)
Determine what kind of template specialization the given declaration is.
static QualType getPointeeType(const MemRegion *R)
#define CXXABI(Name, Str)
C Language Family Type Representation.
a trap message and trap category.
const ValueDecl * getMemberPointerDecl() const
Definition APValue.cpp:1066
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
CanQualType LongTy
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CanQualType VoidPtrTy
IdentifierTable & Idents
Definition ASTContext.h:791
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
CanQualType CharTy
CanQualType IntTy
CharUnits getExnObjectAlignment() const
Return the alignment (in bytes) of the thrown exception object.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
CharUnits getPreferredTypeAlignInChars(QualType T) const
Return the PreferredAlignment of a (complete) type T, in characters.
CanQualType VoidTy
CanQualType UnsignedIntTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:910
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
CanQualType LongLongTy
CanQualType getCanonicalTagType(const TagDecl *TD) const
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getVBaseClassOffset(const CXXRecordDecl *VBase) const
getVBaseClassOffset - Get the offset, in chars, for the given base class.
This class is used for builtin types like 'int'.
Definition TypeBase.h:3164
Kind getKind() const
Definition TypeBase.h:3212
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
Definition DeclCXX.h:146
QualType getType() const
Retrieves the type of the base class.
Definition DeclCXX.h:249
SourceLocation getBeginLoc() const LLVM_READONLY
Definition StmtCXX.h:43
VarDecl * getExceptionDecl() const
Definition StmtCXX.h:49
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2665
bool isGlobalDelete() const
Definition ExprCXX.h:2651
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
bool isVirtual() const
Definition DeclCXX.h:2184
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2255
bool isInstance() const
Definition DeclCXX.h:2156
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2225
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
Definition DeclCXX.h:1366
base_class_range bases()
Definition DeclCXX.h:608
unsigned getNumBases() const
Retrieves the number of base classes of this class.
Definition DeclCXX.h:602
base_class_iterator bases_begin()
Definition DeclCXX.h:615
const CXXBaseSpecifier * base_class_const_iterator
Iterator that traverses the base classes of a class.
Definition DeclCXX.h:520
base_class_range vbases()
Definition DeclCXX.h:625
bool isAbstract() const
Determine whether this class has a pure virtual function.
Definition DeclCXX.h:1221
bool isDynamicClass() const
Definition DeclCXX.h:574
bool hasDefinition() const
Definition DeclCXX.h:561
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
Definition DeclCXX.h:623
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
const Expr * getSubExpr() const
Definition ExprCXX.h:1228
static CanQual< Type > CreateUnsafe(QualType Other)
Qualifiers getQualifiers() const
Retrieve all qualifiers.
CastKind getCastKind() const
Definition Expr.h:3654
Expr * getSubExpr()
Definition Expr.h:3660
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
int64_t QuantityType
Definition CharUnits.h:40
bool isZero() const
isZero - Test whether the quantity equals zero.
Definition CharUnits.h:122
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
Definition CharUnits.h:189
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Definition CharUnits.h:185
static CharUnits One()
One - Construct a CharUnits quantity of one.
Definition CharUnits.h:58
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Definition CharUnits.h:63
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Definition CharUnits.h:53
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
std::string SymbolPartition
The name of the partition that symbols are assigned to, specified with -fsymbol-partition (see https:...
static ABIArgInfo getIndirect(CharUnits Alignment, unsigned AddrSpace, bool ByVal=true, bool Realign=false, llvm::Type *Padding=nullptr)
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition Address.h:128
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
Definition Address.h:253
CharUnits getAlignment() const
Definition Address.h:194
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Definition Address.h:209
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Definition Address.h:276
unsigned getAddressSpace() const
Return the address space that this address resides in.
Definition Address.h:215
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition Address.h:204
static AggValueSlot forAddr(Address addr, Qualifiers quals, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
forAddr - Make a slot for an aggregate value.
Definition CGValue.h:588
static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF)
Apply TemporaryLocation if it is valid.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Definition CGBuilder.h:140
Address CreateConstInBoundsByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Given a pointer to i8, adjust it by a given constant offset.
Definition CGBuilder.h:309
llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")
Definition CGBuilder.h:360
Address CreateGEP(CodeGenFunction &CGF, Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
Definition CGBuilder.h:296
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Definition CGBuilder.h:112
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Definition CGBuilder.h:132
Address CreateConstInBoundsGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = T* ... produce name = getelementptr inbounds addr, i64 index where i64 is actually the t...
Definition CGBuilder.h:265
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition CGBuilder.h:350
Implements C++ ABI-specific code generation functions.
Definition CGCXXABI.h:43
virtual llvm::CallInst * emitTerminateForUnexpectedException(CodeGenFunction &CGF, llvm::Value *Exn)
Definition CGCXXABI.cpp:341
MangleContext & getMangleContext()
Gets the mangle context.
Definition CGCXXABI.h:113
All available information about a concrete callee.
Definition CGCall.h:63
static CGCallee forVirtual(const CallExpr *CE, GlobalDecl MD, Address Addr, llvm::FunctionType *FTy)
Definition CGCall.h:147
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
Definition CGCall.h:137
CGFunctionInfo - Class to encapsulate the information about a function definition.
CanQualType getReturnType() const
llvm::Value * getDiscriminator() const
An RAII object to set (and then clear) a mapping for an OpaqueValueExpr.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
llvm::Value * GetVTablePtr(Address This, llvm::Type *VTableTy, const CXXRecordDecl *VTableClass, VTableAuthMode AuthMode=VTableAuthMode::Authenticate)
GetVTablePtr - Return the Value of the vtable pointer member pointed to by This.
Definition CGClass.cpp:2853
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
llvm::Constant * createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr)
Create a stub function, suitable for being passed to atexit, which passes the given address to the gi...
llvm::Function * createTLSAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr, llvm::FunctionCallee &AtExit)
Create a stub function, suitable for being passed to __pt_atexit_np, which passes the given address t...
SanitizerSet SanOpts
Sanitizers enabled for this function.
void EmitARCInitWeak(Address addr, llvm::Value *value)
i8* @objc_initWeak(i8** addr, i8* value) Returns value.
Definition CGObjC.cpp:2663
llvm::Value * getExceptionFromSlot()
Returns the contents of the function's exception object and selector slots.
llvm::Type * ConvertType(QualType T)
void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args)
Emits a call or invoke to the given noreturn runtime function.
Definition CGCall.cpp:5065
llvm::CallBase * EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
Emits a call or invoke instruction to the given runtime function.
Definition CGCall.cpp:5092
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc)
EmitLoadOfComplex - Load a complex number from the specified l-value.
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Call atexit() with a function that passes the given argument to the given function.
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
Definition CGExpr.cpp:3767
llvm::Value * getAsNaturalPointerTo(Address Addr, QualType PointeeType)
void EmitDelegateCallArg(CallArgList &args, const VarDecl *param, SourceLocation loc)
EmitDelegateCallArg - We are performing a delegate call; that is, the current function is delegating ...
Definition CGCall.cpp:4301
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
const LangOptions & getLangOpts() const
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
AutoVarEmission EmitAutoVarAlloca(const VarDecl &var)
EmitAutoVarAlloca - Emit the alloca and debug information for a local variable.
Definition CGDecl.cpp:1482
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)
Definition CGClass.cpp:2678
void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV, bool PerformInit)
EmitCXXGlobalVarDeclInit - Create the initializer for a C++ variable with global storage.
void pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete, llvm::Value *CompletePtr, QualType ElementType)
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
Definition CGExpr.cpp:3657
void EmitAnyExprToExn(const Expr *E, Address Addr)
void EmitAggregateCopy(LValue Dest, LValue Src, QualType EltTy, AggValueSlot::Overlap_t MayOverlap, bool isVolatile=false)
EmitAggregateCopy - Emit an aggregate copy.
const TargetInfo & getTarget() const
CGCallee BuildAppleKextVirtualDestructorCall(const CXXDestructorDecl *DD, CXXDtorType Type, const CXXRecordDecl *RD)
BuildVirtualCall - This routine makes indirect vtable call for call to virtual destructors.
Definition CGCXX.cpp:328
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs, const TrapReason *TR=nullptr)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
Definition CGExpr.cpp:3915
void EmitCXXGuardedInitBranch(llvm::Value *NeedsInit, llvm::BasicBlock *InitBlock, llvm::BasicBlock *NoInitBlock, GuardKind Kind, const VarDecl *D)
Emit a branch to select whether or not to perform guarded initialization.
LValue MakeRawAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment, AlignmentSource Source=AlignmentSource::Type)
Same as MakeAddrLValue above except that the pointer is known to be unsigned.
llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...
Definition CGExpr.cpp:153
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
Definition CGCall.cpp:5248
CGPointerAuthInfo EmitPointerAuthInfo(const PointerAuthSchema &Schema, llvm::Value *StorageAddress, GlobalDecl SchemaDecl, QualType SchemaType)
Emit the concrete pointer authentication informaton for the given authentication schema.
void EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD, llvm::Value *VTable, SourceLocation Loc)
If whole-program virtual table optimization is enabled, emit an assumption that VTable is a member of...
Definition CGClass.cpp:2926
llvm::Value * unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub)
Call unatexit() with function dtorStub.
llvm::Value * emitPointerAuthResign(llvm::Value *Pointer, QualType PointerType, const CGPointerAuthInfo &CurAuthInfo, const CGPointerAuthInfo &NewAuthInfo, bool IsKnownNonNull)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, AlignmentSource Source=AlignmentSource::Type, bool isNontemporal=false)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit)
EmitStoreOfComplex - Store a complex number into the specified l-value.
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
void EmitAutoVarCleanups(const AutoVarEmission &emission)
Definition CGDecl.cpp:2202
void registerGlobalDtorWithLLVM(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Registers the dtor using 'llvm.global_dtors' for platforms that do not support an 'atexit()' function...
llvm::Value * LoadCXXVTT()
LoadCXXVTT - Load the VTT parameter to base constructors/destructors have virtual bases.
llvm::Value * EmitARCRetainNonBlock(llvm::Value *value)
Retain the given object, with normal retain semantics.
Definition CGObjC.cpp:2337
llvm::Type * ConvertTypeForMem(QualType T)
CodeGenTypes & getTypes() const
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
Definition CGStmt.cpp:676
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
llvm::Value * GetVTTParameter(GlobalDecl GD, bool ForVirtualBase, bool Delegating)
GetVTTParameter - Return the VTT parameter that should be passed to a base constructor/destructor wit...
Definition CGClass.cpp:453
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID, bool NoMerge=false, const TrapReason *TR=nullptr)
Create a basic block that will call the trap intrinsic, and emit a conditional branch to it,...
Definition CGExpr.cpp:4257
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
llvm::Value * EmitVTableTypeCheckedLoad(const CXXRecordDecl *RD, llvm::Value *VTable, llvm::Type *VTableTy, uint64_t VTableByteOffset)
Emit a type checked load from the given vtable.
Definition CGClass.cpp:3114
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
llvm::Instruction * CurrentFuncletPad
bool ShouldEmitVTableTypeCheckedLoad(const CXXRecordDecl *RD)
Returns whether we should perform a type checked load when loading a virtual function for virtual cal...
Definition CGClass.cpp:3096
llvm::LLVMContext & getLLVMContext()
void PopCleanupBlock(bool FallThroughIsBranchThrough=false, bool ForDeactivation=false)
PopCleanupBlock - Will pop the cleanup entry on the stack and process all branch fixups.
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
Definition CGStmt.cpp:656
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
QualType BuildFunctionArgList(GlobalDecl GD, FunctionArgList &Args)
llvm::Value * EmitPointerAuthAuth(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
This class organizes the cross-function state that is used while generating LLVM code.
void AddCXXPrioritizedStermFinalizerEntry(llvm::Function *StermFinalizer, int Priority)
void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const
Set visibility, dllimport/dllexport and dso_local.
void AddCXXStermFinalizerToGlobalDtor(llvm::Function *StermFinalizer, int Priority)
Add an sterm finalizer to its own llvm.global_dtors entry.
llvm::GlobalVariable::ThreadLocalMode GetDefaultLLVMTLSModel() const
Get LLVM TLS mode from CodeGenOptions.
void setDSOLocal(llvm::GlobalValue *GV) const
llvm::Module & getModule() const
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
CodeGenVTables & getVTables()
void AddCXXStermFinalizerEntry(llvm::FunctionCallee DtorFn)
Add an sterm finalizer to the C++ global cleanup function.
llvm::Constant * GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH=false)
Get the address of the RTTI descriptor for the given type.
llvm::Constant * getFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return the ABI-correct function pointer value for a reference to the given function.
CGPointerAuthInfo getMemberFunctionPointerAuthInfo(QualType FT)
const LangOptions & getLangOpts() const
bool shouldMapVisibilityToDLLExport(const NamedDecl *D) const
const TargetInfo & getTarget() const
bool TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D)
Try to emit a base destructor as an alias to its primary base-class destructor.
Definition CGCXX.cpp:32
llvm::GlobalValue::LinkageTypes getLLVMLinkageVarDefinition(const VarDecl *VD)
Returns LLVM linkage for a declarator.
const llvm::DataLayout & getDataLayout() const
static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V)
llvm::Constant * getMemberFunctionPointer(const FunctionDecl *FD, llvm::Type *Ty=nullptr)
llvm::Function * codegenCXXStructor(GlobalDecl GD)
Definition CGCXX.cpp:238
CharUnits getClassPointerAlignment(const CXXRecordDecl *CD)
Returns the assumed alignment of an opaque pointer to the given class.
Definition CGClass.cpp:40
const llvm::Triple & getTriple() const
llvm::GlobalVariable::LinkageTypes getFunctionLinkage(GlobalDecl GD)
llvm::Constant * CreateRuntimeVariable(llvm::Type *Ty, StringRef Name)
Create a new runtime global variable with the specified type and name.
CharUnits getDynamicOffsetAlignment(CharUnits ActualAlign, const CXXRecordDecl *Class, CharUnits ExpectedTargetAlign)
Given a class pointer with an actual known alignment, and the expected alignment of an object at a dy...
Definition CGClass.cpp:91
llvm::Constant * GetAddrOfGlobal(GlobalDecl GD, ForDefinition_t IsForDefinition=NotForDefinition)
ItaniumVTableContext & getItaniumVTableContext()
ASTContext & getContext() const
llvm::Constant * GetAddrOfGlobalVar(const VarDecl *D, llvm::Type *Ty=nullptr, ForDefinition_t IsForDefinition=NotForDefinition)
Return the llvm::Constant for the address of the given global variable.
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
void SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV)
Set attributes which are common to any form of a global definition (alias, Objective-C method,...
llvm::GlobalVariable * CreateOrReplaceCXXRuntimeVariable(StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes Linkage, llvm::Align Alignment)
Will return a global variable of the given type.
llvm::FunctionCallee getTerminateFn()
Get the declaration of std::terminate for the platform.
llvm::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO)
LangAS GetGlobalVarAddressSpace(const VarDecl *D)
Return the AST address space of the underlying global variable for D, as determined by its declaratio...
llvm::GlobalVariable::LinkageTypes getVTableLinkage(const CXXRecordDecl *RD)
Return the appropriate linkage for the vtable, VTT, and type information of the given class.
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void addReplacement(StringRef Name, llvm::Constant *C)
llvm::Constant * getConstantSignedPointer(llvm::Constant *Pointer, const PointerAuthSchema &Schema, llvm::Constant *StorageAddress, GlobalDecl SchemaDecl, QualType SchemaType)
Sign a constant pointer using the given scheme, producing a constant with the same IR type.
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
llvm::Function * CreateGlobalInitOrCleanUpFunction(llvm::FunctionType *ty, const Twine &name, const CGFunctionInfo &FI, SourceLocation Loc=SourceLocation(), bool TLS=false, llvm::GlobalVariable::LinkageTypes Linkage=llvm::GlobalVariable::InternalLinkage)
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
const CGFunctionInfo & arrangeCXXMethodDeclaration(const CXXMethodDecl *MD)
C++ methods have some special rules and also have implicit parameters.
Definition CGCall.cpp:374
const CodeGenOptions & getCodeGenOpts() const
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
Definition CGCall.cpp:1702
bool isFuncTypeConvertible(const FunctionType *FT)
isFuncTypeConvertible - Utility to check whether a function type can be converted to an LLVM type (i....
const CGFunctionInfo & arrangeBuiltinFunctionDeclaration(QualType resultType, const FunctionArgList &args)
A builtin function is a freestanding function using the default C conventions.
Definition CGCall.cpp:740
const CGFunctionInfo & arrangeCXXMethodCall(const CallArgList &args, const FunctionProtoType *type, RequiredArgs required, unsigned numPrefixArgs)
Arrange a call to a C++ method, passing the given arguments.
Definition CGCall.cpp:770
const CGFunctionInfo & arrangeNullaryFunction()
A nullary function is a freestanding function of type 'void ()'.
Definition CGCall.cpp:788
llvm::GlobalVariable * GetAddrOfVTT(const CXXRecordDecl *RD)
GetAddrOfVTT - Get the address of the VTT for the given record decl.
Definition CGVTT.cpp:118
void createVTableInitializer(ConstantStructBuilder &builder, const VTableLayout &layout, llvm::Constant *rtti, bool vtableHasLocalLinkage)
Add vtable components for the given vtable layout to the given global initializer.
void GenerateRelativeVTableAlias(llvm::GlobalVariable *VTable, llvm::StringRef AliasNameRef)
Generate a public facing alias for the vtable and make the vtable either hidden or private.
bool isVTableExternal(const CXXRecordDecl *RD)
At this point in the translation unit, does it appear that can we rely on the vtable being defined el...
void RemoveHwasanMetadata(llvm::GlobalValue *GV) const
Specify a global should not be instrumented with hwasan.
void EmitVTTDefinition(llvm::GlobalVariable *VTT, llvm::GlobalVariable::LinkageTypes Linkage, const CXXRecordDecl *RD)
EmitVTTDefinition - Emit the definition of the given vtable.
Definition CGVTT.cpp:41
void pushTerminate()
Push a terminate handler on the stack.
void popTerminate()
Pops a terminate handler off the stack.
Definition CGCleanup.h:639
static RValue get(llvm::Value *V)
Definition CGValue.h:99
static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
virtual unsigned getSizeOfUnwindException() const
Determines the size of struct _Unwind_Exception on this platform, in 8-bit units.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
bool isTranslationUnit() const
Definition DeclBase.h:2185
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
Definition DeclBase.h:2381
T * getAttr() const
Definition DeclBase.h:573
SourceLocation getLocation() const
Definition DeclBase.h:439
DeclContext * getDeclContext()
Definition DeclBase.h:448
bool hasAttr() const
Definition DeclBase.h:577
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
This represents one expression.
Definition Expr.h:112
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:276
QualType getType() const
Definition Expr.h:144
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:2921
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Definition Decl.h:2326
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
Definition Decl.h:2353
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5254
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:57
GlobalDecl getWithCtorType(CXXCtorType Type)
Definition GlobalDecl.h:178
CXXCtorType getCtorType() const
Definition GlobalDecl.h:108
GlobalDecl getCanonicalDecl() const
Definition GlobalDecl.h:97
GlobalDecl getWithDtorType(CXXDtorType Type)
Definition GlobalDecl.h:185
CXXDtorType getDtorType() const
Definition GlobalDecl.h:113
const Decl * getDecl() const
Definition GlobalDecl.h:106
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Definition Decl.cpp:5536
const VTableLayout & getVTableLayout(const CXXRecordDecl *RD)
CharUnits getVirtualBaseOffsetOffset(const CXXRecordDecl *RD, const CXXRecordDecl *VBase)
Return the offset in chars (relative to the vtable address point) where the offset of the virtual bas...
GlobalDecl findOriginalMethod(GlobalDecl GD)
Return the method that added the v-table slot that will be used to call the given method.
virtual void mangleCXXRTTI(QualType T, raw_ostream &)=0
virtual void mangleCXXRTTIName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3653
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
Definition Type.cpp:5449
QualType getPointeeType() const
Definition TypeBase.h:3671
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
Definition TypeBase.h:3675
bool isMemberDataPointer() const
Returns true if the member type (i.e.
Definition TypeBase.h:3681
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
Visibility getVisibility() const
Determines the visibility of this entity.
Definition Decl.h:444
bool isExternallyVisible() const
Definition Decl.h:433
static const OpaqueValueExpr * findInCopyConstruct(const Expr *expr)
Given an expression which invokes a copy constructor — i.e.
Definition Expr.cpp:5050
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3328
QualType getPointeeType() const
Definition TypeBase.h:3338
A (possibly-)qualified type.
Definition TypeBase.h:937
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8318
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition TypeBase.h:8463
QualType getCanonicalType() const
Definition TypeBase.h:8330
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8372
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
Definition TypeBase.h:361
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
Definition TypeBase.h:354
@ OCL_None
There is no lifetime qualification on this type.
Definition TypeBase.h:350
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Definition TypeBase.h:364
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
Definition TypeBase.h:367
ObjCLifetime getObjCLifetime() const
Definition TypeBase.h:545
bool empty() const
Definition TypeBase.h:647
bool canPassInRegisters() const
Determine whether this class can be passed in registers.
Definition Decl.h:4458
Encodes a location in the source.
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:350
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getMaxAtomicInlineWidth() const
Return the maximum width lock-free atomic operation which can be inlined given the supported features...
Definition TargetInfo.h:858
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
Definition TargetInfo.h:489
virtual bool hasPS4DLLImportExport() const
uint64_t getPointerAlign(LangAS AddrSpace) const
Definition TargetInfo.h:493
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
Definition TargetInfo.h:535
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
The base class of the type hierarchy.
Definition TypeBase.h:1833
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
CXXRecordDecl * castAsCXXRecordDecl() const
Definition Type.h:36
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9158
bool isReferenceType() const
Definition TypeBase.h:8539
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:752
Visibility getVisibility() const
Determine the visibility of this type.
Definition TypeBase.h:3065
bool isMemberFunctionPointerType() const
Definition TypeBase.h:8600
Linkage getLinkage() const
Determine the linkage of this type.
Definition Type.cpp:4891
TypeClass getTypeClass() const
Definition TypeBase.h:2385
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9091
bool isRecordType() const
Definition TypeBase.h:8642
AddressPointLocation getAddressPoint(BaseSubobject Base) const
size_t getVTableSize(size_t i) const
QualType getType() const
Definition Decl.h:723
Represents a variable declaration or definition.
Definition Decl.h:926
TLSKind getTLSKind() const
Definition Decl.cpp:2175
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:2264
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
Definition Decl.cpp:2843
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
Definition Decl.h:1208
bool isInline() const
Whether this variable is (C++1z) inline.
Definition Decl.h:1551
const Expr * getInit() const
Definition Decl.h:1368
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition Decl.h:952
@ TLS_None
Not a TLS variable.
Definition Decl.h:946
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
Definition Decl.cpp:2382
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
Definition Decl.h:1253
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Definition Decl.cpp:2786
llvm::Value * getCXXDestructorImplicitParam(CodeGenModule &CGM, llvm::BasicBlock *InsertBlock, llvm::BasicBlock::iterator InsertPoint, const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating)
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
Definition CGValue.h:146
CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT, CGCXXABI &CXXABI)
bool classifyReturnType(const CGCXXABI &CXXABI, CGFunctionInfo &FI, const ABIInfo &Info)
TypeEvaluationKind
The kind of evaluation to perform on values of a particular type.
@ NormalCleanup
Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
CGCXXABI * CreateItaniumCXXABI(CodeGenModule &CGM)
Creates an Itanium-family ABI.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
constexpr Variable var(Literal L)
Returns the variable of L.
Definition CNFFormula.h:64
bool This(InterpState &S, CodePtr OpPC)
Definition Interp.h:2802
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
Definition ABI.h:24
@ Ctor_Base
Base object ctor.
Definition ABI.h:26
@ Ctor_DefaultClosure
Default closure variant of a ctor.
Definition ABI.h:29
@ Ctor_CopyingClosure
Copying closure variant of a ctor.
Definition ABI.h:28
@ Ctor_Complete
Complete object ctor.
Definition ABI.h:25
@ Ctor_Comdat
The COMDAT used for ctors.
Definition ABI.h:27
@ Ctor_Unified
GCC-style unified dtor.
Definition ABI.h:30
bool isa(CodeGen::Address addr)
Definition Address.h:330
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition Specifiers.h:212
@ GVA_DiscardableODR
Definition Linkage.h:75
@ Success
Annotation was successful.
Definition Parser.h:65
@ AS_public
Definition Specifiers.h:124
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ VisibleNone
No linkage according to the standard, but is visible from other translation units because of types de...
Definition Linkage.h:48
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
Definition Linkage.h:30
@ UniqueExternal
External linkage within a unique namespace.
Definition Linkage.h:44
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
Definition Linkage.h:35
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
Definition Linkage.h:58
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
CXXDtorType
C++ destructor types.
Definition ABI.h:34
@ Dtor_VectorDeleting
Vector deleting dtor.
Definition ABI.h:40
@ Dtor_Comdat
The COMDAT used for dtors.
Definition ABI.h:38
@ Dtor_Unified
GCC-style unified dtor.
Definition ABI.h:39
@ Dtor_Base
Base object dtor.
Definition ABI.h:37
@ Dtor_Complete
Complete object dtor.
Definition ABI.h:36
@ Dtor_Deleting
Deleting dtor.
Definition ABI.h:35
bool isDiscardableGVALinkage(GVALinkage L)
Definition Linkage.h:80
@ Type
The name was classified as a type.
Definition Sema.h:562
LangAS
Defines the address space values used by the address space qualifier of QualType.
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5864
@ EST_None
no exception specification
Visibility
Describes the different kinds of visibility that a declaration may have.
Definition Visibility.h:34
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
Definition Visibility.h:37
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
Definition Visibility.h:46
unsigned long uint64_t
long int64_t
const half4 dst(half4 Src0, half4 Src1)
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
Represents an element in a path from a derived class to a base class.
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * CharTy
char
llvm::CallingConv::ID getRuntimeCC() const
static const EHPersonality & get(CodeGenModule &CGM, const FunctionDecl *FD)
Extra information about a function prototype.
Definition TypeBase.h:5339
PointerAuthSchema CXXVTTVTablePointers
The ABI for C++ virtual table pointers as installed in a VTT.
PointerAuthSchema CXXTypeInfoVTablePointer
TypeInfo has external ABI requirements and is emitted without actually having parsed the libcxx defin...
union clang::ReturnAdjustment::VirtualAdjustment Virtual
int64_t NonVirtual
The non-virtual adjustment from the derived object to its nearest virtual base.
Definition Thunk.h:30
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
Definition Sanitizers.h:174
union clang::ThisAdjustment::VirtualAdjustment Virtual
int64_t NonVirtual
The non-virtual adjustment from the derived object to its nearest virtual base.
Definition Thunk.h:95
ThisAdjustment This
The this pointer adjustment.
Definition Thunk.h:159
struct clang::ReturnAdjustment::VirtualAdjustment::@103031170252120233124322035264172076254313213024 Itanium
int64_t VBaseOffsetOffset
The offset (in bytes), relative to the address point of the virtual base class offset.
Definition Thunk.h:39
struct clang::ThisAdjustment::VirtualAdjustment::@106065375072164260365214033034320247050276346205 Itanium
int64_t VCallOffsetOffset
The offset (in bytes), relative to the address point, of the virtual call offset.
Definition Thunk.h:104