clang 24.0.0git
MicrosoftCXXABI.cpp
Go to the documentation of this file.
1//===--- MicrosoftCXXABI.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 Microsoft Visual C++ ABI.
10// The class in this file generates structures that follow the Microsoft
11// Visual C++ ABI, which is actually not very well documented at all outside
12// of Microsoft.
13//
14//===----------------------------------------------------------------------===//
15
16#include "ABIInfo.h"
17#include "CGCXXABI.h"
18#include "CGCleanup.h"
19#include "CGDebugInfo.h"
20#include "CGVTables.h"
21#include "CodeGenModule.h"
22#include "CodeGenTypes.h"
23#include "TargetInfo.h"
24#include "clang/AST/Attr.h"
26#include "clang/AST/Decl.h"
27#include "clang/AST/DeclCXX.h"
28#include "clang/AST/StmtCXX.h"
32#include "llvm/ADT/StringExtras.h"
33#include "llvm/ADT/StringSet.h"
34#include "llvm/IR/Intrinsics.h"
35
36using namespace clang;
37using namespace CodeGen;
38
39namespace {
40
41/// Holds all the vbtable globals for a given class.
42struct VBTableGlobals {
43 const VPtrInfoVector *VBTables;
44 SmallVector<llvm::GlobalVariable *, 2> Globals;
45};
46
47class MicrosoftCXXABI : public CGCXXABI {
48public:
49 MicrosoftCXXABI(CodeGenModule &CGM)
50 : CGCXXABI(CGM), BaseClassDescriptorType(nullptr),
51 ClassHierarchyDescriptorType(nullptr),
52 CompleteObjectLocatorType(nullptr), CatchableTypeType(nullptr),
53 ThrowInfoType(nullptr) {
56 "visibility export mapping option unimplemented in this ABI");
57 }
58
59 bool HasThisReturn(GlobalDecl GD) const override;
60 bool hasMostDerivedReturn(GlobalDecl GD) const override;
61
62 bool classifyReturnType(CGFunctionInfo &FI) const override;
63
64 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override;
65
66 bool isSRetParameterAfterThis() const override { return true; }
67
68 bool isThisCompleteObject(GlobalDecl GD) const override {
69 // The Microsoft ABI doesn't use separate complete-object vs.
70 // base-object variants of constructors, but it does of destructors.
72 switch (GD.getDtorType()) {
73 case Dtor_Complete:
74 case Dtor_Deleting:
76 return true;
77 case Dtor_Base:
78 return false;
79
80 case Dtor_Comdat: llvm_unreachable("emitting dtor comdat as function?");
81 case Dtor_Unified:
82 llvm_unreachable("unexpected unified dtor type");
83 }
84 llvm_unreachable("bad dtor kind");
85 }
86
87 // No other kinds.
88 return false;
89 }
90
91 size_t getSrcArgforCopyCtor(const CXXConstructorDecl *CD,
92 FunctionArgList &Args) const override {
93 assert(Args.size() >= 2 &&
94 "expected the arglist to have at least two args!");
95 // The 'most_derived' parameter goes second if the ctor is variadic and
96 // has v-bases.
97 if (CD->getParent()->getNumVBases() > 0 &&
98 CD->getType()->castAs<FunctionProtoType>()->isVariadic())
99 return 2;
100 return 1;
101 }
102
103 std::vector<CharUnits> getVBPtrOffsets(const CXXRecordDecl *RD) override {
104 std::vector<CharUnits> VBPtrOffsets;
105 const ASTContext &Context = getContext();
106 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
107
108 const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
109 for (const std::unique_ptr<VPtrInfo> &VBT : *VBGlobals.VBTables) {
110 const ASTRecordLayout &SubobjectLayout =
111 Context.getASTRecordLayout(VBT->IntroducingObject);
112 CharUnits Offs = VBT->NonVirtualOffset;
113 Offs += SubobjectLayout.getVBPtrOffset();
114 if (VBT->getVBaseWithVPtr())
115 Offs += Layout.getVBaseClassOffset(VBT->getVBaseWithVPtr());
116 VBPtrOffsets.push_back(Offs);
117 }
118 llvm::array_pod_sort(VBPtrOffsets.begin(), VBPtrOffsets.end());
119 return VBPtrOffsets;
120 }
121
122 StringRef GetPureVirtualCallName() override { return "_purecall"; }
123 StringRef GetDeletedVirtualCallName() override { return "_purecall"; }
124
125 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
126 Address Ptr, QualType ElementType,
127 const CXXDestructorDecl *Dtor) override;
128
129 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
130 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
131
132 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
133
134 llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD,
135 const VPtrInfo &Info);
136
137 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
138 CatchTypeInfo
139 getAddrOfCXXCatchHandlerType(QualType Ty, QualType CatchHandlerType) override;
140
141 /// MSVC needs an extra flag to indicate a catchall.
142 CatchTypeInfo getCatchAllTypeInfo() override {
143 // For -EHa catch(...) must handle HW exception
144 // Adjective = HT_IsStdDotDot (0x40), only catch C++ exceptions
145 if (getContext().getLangOpts().EHAsynch)
146 return CatchTypeInfo{nullptr, 0};
147 else
148 return CatchTypeInfo{nullptr, 0x40};
149 }
150
151 bool shouldTypeidBeNullChecked(QualType SrcRecordTy) override;
152 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
153 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
154 Address ThisPtr,
155 llvm::Type *StdTypeInfoPtrTy) override;
156
157 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
158 QualType SrcRecordTy) override;
159
160 bool shouldEmitExactDynamicCast(QualType DestRecordTy) override {
161 // TODO: Add support for exact dynamic_casts.
162 return false;
163 }
164 std::optional<ExactDynamicCastInfo>
165 getExactDynamicCastInfo(QualType SrcRecordTy, QualType DestTy,
166 QualType DestRecordTy) override {
167 llvm_unreachable("unsupported");
168 }
169 llvm::Value *emitExactDynamicCast(CodeGenFunction &CGF, Address Value,
170 QualType SrcRecordTy, QualType DestTy,
171 QualType DestRecordTy,
172 const ExactDynamicCastInfo &CastInfo,
173 llvm::BasicBlock *CastSuccess,
174 llvm::BasicBlock *CastFail) override {
175 llvm_unreachable("unsupported");
176 }
177
178 llvm::Value *emitDynamicCastCall(CodeGenFunction &CGF, Address Value,
179 QualType SrcRecordTy, QualType DestTy,
180 QualType DestRecordTy,
181 llvm::BasicBlock *CastEnd) override;
182
183 llvm::Value *emitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
184 QualType SrcRecordTy) override;
185
186 bool EmitBadCastCall(CodeGenFunction &CGF) override;
187 bool canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const override {
188 return false;
189 }
190
191 llvm::Value *
192 GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
193 const CXXRecordDecl *ClassDecl,
194 const CXXRecordDecl *BaseClassDecl) override;
195
196 llvm::BasicBlock *
197 EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
198 const CXXRecordDecl *RD) override;
199
200 llvm::BasicBlock *
201 EmitDtorCompleteObjectHandler(CodeGenFunction &CGF);
202
203 void initializeHiddenVirtualInheritanceMembers(CodeGenFunction &CGF,
204 const CXXRecordDecl *RD) override;
205
206 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
207
208 // Background on MSVC destructors
209 // ==============================
210 //
211 // Both Itanium and MSVC ABIs have destructor variants. The variant names
212 // roughly correspond in the following way:
213 // Itanium Microsoft
214 // Base -> no name, just ~Class
215 // Complete -> vbase destructor
216 // Deleting -> scalar deleting destructor
217 // vector deleting destructor
218 //
219 // The base and complete destructors are the same as in Itanium, although the
220 // complete destructor does not accept a VTT parameter when there are virtual
221 // bases. A separate mechanism involving vtordisps is used to ensure that
222 // virtual methods of destroyed subobjects are not called.
223 //
224 // The deleting destructors accept an i32 bitfield as a second parameter. Bit
225 // 1 indicates if the memory should be deleted. Bit 2 indicates if the this
226 // pointer points to an array. The scalar deleting destructor assumes that
227 // bit 2 is zero, and therefore does not contain a loop.
228 //
229 // For virtual destructors, only one entry is reserved in the vftable, and it
230 // always points to the vector deleting destructor. The vector deleting
231 // destructor is the most general, so it can be used to destroy objects in
232 // place, delete single heap objects, or delete arrays.
233 //
234 // A TU defining a non-inline destructor is only guaranteed to emit a base
235 // destructor, and all of the other variants are emitted on an as-needed basis
236 // in COMDATs. Because a non-base destructor can be emitted in a TU that
237 // lacks a definition for the destructor, non-base destructors must always
238 // delegate to or alias the base destructor.
239
240 AddedStructorArgCounts
241 buildStructorSignature(GlobalDecl GD,
242 SmallVectorImpl<CanQualType> &ArgTys) override;
243
244 /// Non-base dtors should be emitted as delegating thunks in this ABI.
245 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
246 CXXDtorType DT) const override {
247 return DT != Dtor_Base;
248 }
249
250 void setCXXDestructorDLLStorage(llvm::GlobalValue *GV,
251 const CXXDestructorDecl *Dtor,
252 CXXDtorType DT) const override;
253
254 llvm::GlobalValue::LinkageTypes
255 getCXXDestructorLinkage(GVALinkage Linkage, const CXXDestructorDecl *Dtor,
256 CXXDtorType DT) const override;
257
258 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
259
260 const CXXRecordDecl *getThisArgumentTypeForMethod(GlobalDecl GD) override {
261 auto *MD = cast<CXXMethodDecl>(GD.getDecl());
262
263 if (MD->isVirtual()) {
264 GlobalDecl LookupGD = GD;
265 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
266 // Complete dtors take a pointer to the complete object,
267 // thus don't need adjustment.
268 if (GD.getDtorType() == Dtor_Complete)
269 return MD->getParent();
270
271 // There's only Dtor_Deleting in vftable but it shares the this
272 // adjustment with the base one, so look up the deleting one instead.
273 LookupGD = GlobalDecl(
275 CGM.getContext().getLangOpts())
277 : Dtor_Deleting);
278 }
279 MethodVFTableLocation ML =
281
282 // The vbases might be ordered differently in the final overrider object
283 // and the complete object, so the "this" argument may sometimes point to
284 // memory that has no particular type (e.g. past the complete object).
285 // In this case, we just use a generic pointer type.
286 // FIXME: might want to have a more precise type in the non-virtual
287 // multiple inheritance case.
288 if (ML.VBase || !ML.VFPtrOffset.isZero())
289 return nullptr;
290 }
291 return MD->getParent();
292 }
293
294 Address
295 adjustThisArgumentForVirtualFunctionCall(CodeGenFunction &CGF, GlobalDecl GD,
296 Address This,
297 bool VirtualCall) override;
298
299 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
300 FunctionArgList &Params) override;
301
302 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
303
304 AddedStructorArgs getImplicitConstructorArgs(CodeGenFunction &CGF,
305 const CXXConstructorDecl *D,
307 bool ForVirtualBase,
308 bool Delegating) override;
309
310 llvm::Value *getCXXDestructorImplicitParam(CodeGenFunction &CGF,
311 const CXXDestructorDecl *DD,
313 bool ForVirtualBase,
314 bool Delegating) override;
315
316 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
317 CXXDtorType Type, bool ForVirtualBase,
318 bool Delegating, Address This,
319 QualType ThisTy) override;
320
321 void emitVTableTypeMetadata(const VPtrInfo &Info, const CXXRecordDecl *RD,
322 llvm::GlobalVariable *VTable);
323
324 void emitVTableDefinitions(CodeGenVTables &CGVT,
325 const CXXRecordDecl *RD) override;
326
327 bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
328 CodeGenFunction::VPtr Vptr) override;
329
330 /// Don't initialize vptrs if dynamic class
331 /// is marked with the 'novtable' attribute.
332 bool doStructorsInitializeVPtrs(const CXXRecordDecl *VTableClass) override {
333 return !VTableClass->hasAttr<MSNoVTableAttr>();
334 }
335
336 llvm::Constant *
337 getVTableAddressPoint(BaseSubobject Base,
338 const CXXRecordDecl *VTableClass) override;
339
340 llvm::Value *getVTableAddressPointInStructor(
341 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
342 BaseSubobject Base, const CXXRecordDecl *NearestVBase) override;
343
344 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
345 CharUnits VPtrOffset) override;
346
347 CGCallee getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
348 Address This, llvm::Type *Ty,
349 SourceLocation Loc) override;
350
351 llvm::Value *
352 EmitVirtualDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *Dtor,
353 CXXDtorType DtorType, Address This,
354 DeleteOrMemberCallExpr E,
355 llvm::CallBase **CallOrInvoke) override;
356
357 void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF, GlobalDecl GD,
358 CallArgList &CallArgs) override {
359 assert((GD.getDtorType() == Dtor_VectorDeleting ||
360 GD.getDtorType() == Dtor_Deleting) &&
361 "Only vector deleting destructor thunks are available in this ABI");
362 CallArgs.add(RValue::get(getStructorImplicitParamValue(CGF)),
363 getContext().IntTy);
364 }
365
366 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
367
368 llvm::GlobalVariable *
369 getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD,
370 llvm::GlobalVariable::LinkageTypes Linkage);
371
372 llvm::GlobalVariable *
373 getAddrOfVirtualDisplacementMap(const CXXRecordDecl *SrcRD,
374 const CXXRecordDecl *DstRD) {
375 SmallString<256> OutName;
376 llvm::raw_svector_ostream Out(OutName);
377 getMangleContext().mangleCXXVirtualDisplacementMap(SrcRD, DstRD, Out);
378 StringRef MangledName = OutName.str();
379
380 if (auto *VDispMap = CGM.getModule().getNamedGlobal(MangledName))
381 return VDispMap;
382
383 MicrosoftVTableContext &VTContext = CGM.getMicrosoftVTableContext();
384 unsigned NumEntries = 1 + SrcRD->getNumVBases();
385 SmallVector<llvm::Constant *, 4> Map(NumEntries,
386 llvm::PoisonValue::get(CGM.IntTy));
387 Map[0] = llvm::ConstantInt::get(CGM.IntTy, 0);
388 bool AnyDifferent = false;
389 for (const auto &I : SrcRD->vbases()) {
390 const CXXRecordDecl *VBase = I.getType()->getAsCXXRecordDecl();
391 if (!DstRD->isVirtuallyDerivedFrom(VBase))
392 continue;
393
394 unsigned SrcVBIndex = VTContext.getVBTableIndex(SrcRD, VBase);
395 unsigned DstVBIndex = VTContext.getVBTableIndex(DstRD, VBase);
396 Map[SrcVBIndex] = llvm::ConstantInt::get(CGM.IntTy, DstVBIndex * 4);
397 AnyDifferent |= SrcVBIndex != DstVBIndex;
398 }
399 // This map would be useless, don't use it.
400 if (!AnyDifferent)
401 return nullptr;
402
403 llvm::ArrayType *VDispMapTy = llvm::ArrayType::get(CGM.IntTy, Map.size());
404 llvm::Constant *Init = llvm::ConstantArray::get(VDispMapTy, Map);
405 llvm::GlobalValue::LinkageTypes Linkage =
406 SrcRD->isExternallyVisible() && DstRD->isExternallyVisible()
407 ? llvm::GlobalValue::LinkOnceODRLinkage
408 : llvm::GlobalValue::InternalLinkage;
409 auto *VDispMap = new llvm::GlobalVariable(
410 CGM.getModule(), VDispMapTy, /*isConstant=*/true, Linkage,
411 /*Initializer=*/Init, MangledName);
412 return VDispMap;
413 }
414
415 void emitVBTableDefinition(const VPtrInfo &VBT, const CXXRecordDecl *RD,
416 llvm::GlobalVariable *GV) const;
417
418 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable,
419 GlobalDecl GD, bool ReturnAdjustment) override {
421 getContext().GetGVALinkageForFunction(cast<FunctionDecl>(GD.getDecl()));
422
423 if (Linkage == GVA_Internal)
424 Thunk->setLinkage(llvm::GlobalValue::InternalLinkage);
425 else if (ReturnAdjustment)
426 Thunk->setLinkage(llvm::GlobalValue::WeakODRLinkage);
427 else
428 Thunk->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
429 }
430
431 bool exportThunk() override { return false; }
432
433 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
434 const CXXRecordDecl * /*UnadjustedClass*/,
435 const ThunkInfo &TI) override;
436
437 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
438 const CXXRecordDecl * /*UnadjustedClass*/,
439 const ReturnAdjustment &RA) override;
440
441 void EmitThreadLocalInitFuncs(
442 CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals,
443 ArrayRef<llvm::Function *> CXXThreadLocalInits,
444 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) override;
445
446 bool usesThreadWrapperFunction(const VarDecl *VD) const override {
447 return getContext().getLangOpts().isCompatibleWithMSVC(
448 LangOptions::MSVC2019_5) &&
449 CGM.getCodeGenOpts().TlsGuards &&
450 (!isEmittedWithConstantInitializer(VD) || mayNeedDestruction(VD));
451 }
452 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
453 QualType LValType) override;
454
455 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
456 llvm::GlobalVariable *DeclPtr,
457 bool PerformInit) override;
458 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
459 llvm::FunctionCallee Dtor,
460 llvm::Constant *Addr) override;
461
462 // ==== Notes on array cookies =========
463 //
464 // MSVC seems to only use cookies when the class has a destructor; a
465 // two-argument usual array deallocation function isn't sufficient.
466 //
467 // For example, this code prints "100" and "1":
468 // struct A {
469 // char x;
470 // void *operator new[](size_t sz) {
471 // printf("%u\n", sz);
472 // return malloc(sz);
473 // }
474 // void operator delete[](void *p, size_t sz) {
475 // printf("%u\n", sz);
476 // free(p);
477 // }
478 // };
479 // int main() {
480 // A *p = new A[100];
481 // delete[] p;
482 // }
483 // Whereas it prints "104" and "104" if you give A a destructor.
484
485 bool requiresArrayCookie(const CXXDeleteExpr *expr,
486 QualType elementType) override;
487 bool requiresArrayCookie(const CXXNewExpr *expr) override;
488 CharUnits getArrayCookieSizeImpl(QualType type) override;
489 Address InitializeArrayCookie(CodeGenFunction &CGF,
490 Address NewPtr,
491 llvm::Value *NumElements,
492 const CXXNewExpr *expr,
493 QualType ElementType) override;
494 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
495 Address allocPtr,
496 CharUnits cookieSize) override;
497
498 friend struct MSRTTIBuilder;
499
500 bool isImageRelative() const {
501 return CGM.getTarget().getPointerWidth(LangAS::Default) == 64;
502 }
503
504 // 5 routines for constructing the llvm types for MS RTTI structs.
505 llvm::StructType *getTypeDescriptorType(StringRef TypeInfoString) {
506 llvm::SmallString<32> TDTypeName("rtti.TypeDescriptor");
507 TDTypeName += llvm::utostr(TypeInfoString.size());
508 llvm::StructType *&TypeDescriptorType =
509 TypeDescriptorTypeMap[TypeInfoString.size()];
510 if (TypeDescriptorType)
511 return TypeDescriptorType;
512 llvm::Type *FieldTypes[] = {
513 CGM.Int8PtrPtrTy,
514 CGM.Int8PtrTy,
515 llvm::ArrayType::get(CGM.Int8Ty, TypeInfoString.size() + 1)};
516 TypeDescriptorType =
517 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, TDTypeName);
518 return TypeDescriptorType;
519 }
520
521 llvm::Type *getImageRelativeType(llvm::Type *PtrType) {
522 if (!isImageRelative())
523 return PtrType;
524 return CGM.IntTy;
525 }
526
527 llvm::StructType *getBaseClassDescriptorType() {
528 if (BaseClassDescriptorType)
529 return BaseClassDescriptorType;
530 llvm::Type *FieldTypes[] = {
531 getImageRelativeType(CGM.Int8PtrTy),
532 CGM.IntTy,
533 CGM.IntTy,
534 CGM.IntTy,
535 CGM.IntTy,
536 CGM.IntTy,
537 getImageRelativeType(CGM.DefaultPtrTy),
538 };
539 BaseClassDescriptorType = llvm::StructType::create(
540 CGM.getLLVMContext(), FieldTypes, "rtti.BaseClassDescriptor");
541 return BaseClassDescriptorType;
542 }
543
544 llvm::StructType *getClassHierarchyDescriptorType() {
545 if (ClassHierarchyDescriptorType)
546 return ClassHierarchyDescriptorType;
547 // Forward-declare RTTIClassHierarchyDescriptor to break a cycle.
548 llvm::Type *FieldTypes[] = {CGM.IntTy, CGM.IntTy, CGM.IntTy,
549 getImageRelativeType(CGM.DefaultPtrTy)};
550 ClassHierarchyDescriptorType =
551 llvm::StructType::create(FieldTypes, "rtti.ClassHierarchyDescriptor");
552 return ClassHierarchyDescriptorType;
553 }
554
555 llvm::StructType *getCompleteObjectLocatorType() {
556 if (CompleteObjectLocatorType)
557 return CompleteObjectLocatorType;
558 llvm::Type *FieldTypes[] = {
559 CGM.IntTy,
560 CGM.IntTy,
561 CGM.IntTy,
562 getImageRelativeType(CGM.Int8PtrTy),
563 getImageRelativeType(CGM.DefaultPtrTy),
564 getImageRelativeType(CGM.VoidTy),
565 };
566 llvm::ArrayRef<llvm::Type *> FieldTypesRef(FieldTypes);
567 if (!isImageRelative())
568 FieldTypesRef = FieldTypesRef.drop_back();
569 CompleteObjectLocatorType =
570 llvm::StructType::create(FieldTypesRef, "rtti.CompleteObjectLocator");
571 return CompleteObjectLocatorType;
572 }
573
574 llvm::GlobalVariable *getImageBase() {
575 StringRef Name = "__ImageBase";
576 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name))
577 return GV;
578
579 auto *GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty,
580 /*isConstant=*/true,
581 llvm::GlobalValue::ExternalLinkage,
582 /*Initializer=*/nullptr, Name);
583 CGM.setDSOLocal(GV);
584 return GV;
585 }
586
587 llvm::Constant *getImageRelativeConstant(llvm::Constant *PtrVal) {
588 if (!isImageRelative())
589 return PtrVal;
590
591 if (PtrVal->isNullValue())
592 return llvm::Constant::getNullValue(CGM.IntTy);
593
594 llvm::Constant *ImageBaseAsInt =
595 llvm::ConstantExpr::getPtrToInt(getImageBase(), CGM.IntPtrTy);
596 llvm::Constant *PtrValAsInt =
597 llvm::ConstantExpr::getPtrToInt(PtrVal, CGM.IntPtrTy);
598 llvm::Constant *Diff =
599 llvm::ConstantExpr::getSub(PtrValAsInt, ImageBaseAsInt,
600 /*HasNUW=*/true, /*HasNSW=*/true);
601 return llvm::ConstantExpr::getTrunc(Diff, CGM.IntTy);
602 }
603
604private:
605 MicrosoftMangleContext &getMangleContext() {
607 }
608
609 llvm::Constant *getZeroInt() {
610 return llvm::ConstantInt::get(CGM.IntTy, 0);
611 }
612
613 llvm::Constant *getAllOnesInt() {
614 return llvm::Constant::getAllOnesValue(CGM.IntTy);
615 }
616
617 CharUnits getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD) override;
618
619 void
620 GetNullMemberPointerFields(const MemberPointerType *MPT,
621 llvm::SmallVectorImpl<llvm::Constant *> &fields);
622
623 /// Shared code for virtual base adjustment. Returns the offset from
624 /// the vbptr to the virtual base. Optionally returns the address of the
625 /// vbptr itself.
626 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
627 Address Base,
628 llvm::Value *VBPtrOffset,
629 llvm::Value *VBTableOffset,
630 llvm::Value **VBPtr = nullptr);
631
632 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
633 Address Base,
634 int32_t VBPtrOffset,
635 int32_t VBTableOffset,
636 llvm::Value **VBPtr = nullptr) {
637 assert(VBTableOffset % 4 == 0 && "should be byte offset into table of i32s");
638 llvm::Value *VBPOffset =
639 llvm::ConstantInt::getSigned(CGM.IntTy, VBPtrOffset);
640 llvm::Value *VBTOffset = llvm::ConstantInt::get(CGM.IntTy, VBTableOffset);
641 return GetVBaseOffsetFromVBPtr(CGF, Base, VBPOffset, VBTOffset, VBPtr);
642 }
643
644 std::tuple<Address, llvm::Value *, const CXXRecordDecl *>
645 performBaseAdjustment(CodeGenFunction &CGF, Address Value,
646 QualType SrcRecordTy);
647
648 /// Performs a full virtual base adjustment. Used to dereference
649 /// pointers to members of virtual bases.
650 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const Expr *E,
651 const CXXRecordDecl *RD, Address Base,
652 llvm::Value *VirtualBaseAdjustmentOffset,
653 llvm::Value *VBPtrOffset /* optional */);
654
655 /// Emits a full member pointer with the fields common to data and
656 /// function member pointers.
657 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
658 bool IsMemberFunction,
659 const CXXRecordDecl *RD,
660 CharUnits NonVirtualBaseAdjustment,
661 unsigned VBTableIndex);
662
663 bool MemberPointerConstantIsNull(const MemberPointerType *MPT,
664 llvm::Constant *MP);
665
666 /// - Initialize all vbptrs of 'this' with RD as the complete type.
667 void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD);
668
669 /// Caching wrapper around VBTableBuilder::enumerateVBTables().
670 const VBTableGlobals &enumerateVBTables(const CXXRecordDecl *RD);
671
672 /// Generate a thunk for calling a virtual member function MD.
673 llvm::Function *EmitVirtualMemPtrThunk(const CXXMethodDecl *MD,
674 const MethodVFTableLocation &ML);
675
676 llvm::Constant *EmitMemberDataPointer(const CXXRecordDecl *RD,
677 CharUnits offset);
678
679public:
680 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
681
682 bool isZeroInitializable(const MemberPointerType *MPT) override;
683
684 bool isMemberPointerConvertible(const MemberPointerType *MPT) const override {
685 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
686 return RD->hasAttr<MSInheritanceAttr>();
687 }
688
689 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
690
691 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
692 CharUnits offset) override;
693 llvm::Constant *EmitMemberFunctionPointer(const CXXMethodDecl *MD) override;
694 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
695
696 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
697 llvm::Value *L,
698 llvm::Value *R,
699 const MemberPointerType *MPT,
700 bool Inequality) override;
701
702 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
703 llvm::Value *MemPtr,
704 const MemberPointerType *MPT) override;
705
706 llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
707 Address Base, llvm::Value *MemPtr,
708 const MemberPointerType *MPT,
709 bool IsInBounds) override;
710
711 llvm::Value *EmitNonNullMemberPointerConversion(
712 const MemberPointerType *SrcTy, const MemberPointerType *DstTy,
714 CastExpr::path_const_iterator PathEnd, llvm::Value *Src,
715 CGBuilderTy &Builder);
716
717 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
718 const CastExpr *E,
719 llvm::Value *Src) override;
720
721 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
722 llvm::Constant *Src) override;
723
724 llvm::Constant *EmitMemberPointerConversion(
725 const MemberPointerType *SrcTy, const MemberPointerType *DstTy,
727 CastExpr::path_const_iterator PathEnd, llvm::Constant *Src);
728
729 CGCallee
730 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, const Expr *E,
731 Address This, llvm::Value *&ThisPtrForCall,
732 llvm::Value *MemPtr,
733 const MemberPointerType *MPT) override;
734
735 void emitCXXStructor(GlobalDecl GD) override;
736
737 llvm::StructType *getCatchableTypeType() {
738 if (CatchableTypeType)
739 return CatchableTypeType;
740 llvm::Type *FieldTypes[] = {
741 CGM.IntTy, // Flags
742 getImageRelativeType(CGM.Int8PtrTy), // TypeDescriptor
743 CGM.IntTy, // NonVirtualAdjustment
744 CGM.IntTy, // OffsetToVBPtr
745 CGM.IntTy, // VBTableIndex
746 CGM.IntTy, // Size
747 getImageRelativeType(CGM.Int8PtrTy) // CopyCtor
748 };
749 CatchableTypeType = llvm::StructType::create(
750 CGM.getLLVMContext(), FieldTypes, "eh.CatchableType");
751 return CatchableTypeType;
752 }
753
754 llvm::StructType *getCatchableTypeArrayType(uint32_t NumEntries) {
755 llvm::StructType *&CatchableTypeArrayType =
756 CatchableTypeArrayTypeMap[NumEntries];
757 if (CatchableTypeArrayType)
758 return CatchableTypeArrayType;
759
760 llvm::SmallString<23> CTATypeName("eh.CatchableTypeArray.");
761 CTATypeName += llvm::utostr(NumEntries);
762 llvm::Type *CTType = getImageRelativeType(CGM.DefaultPtrTy);
763 llvm::Type *FieldTypes[] = {
764 CGM.IntTy, // NumEntries
765 llvm::ArrayType::get(CTType, NumEntries) // CatchableTypes
766 };
767 CatchableTypeArrayType =
768 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, CTATypeName);
769 return CatchableTypeArrayType;
770 }
771
772 llvm::StructType *getThrowInfoType() {
773 if (ThrowInfoType)
774 return ThrowInfoType;
775 llvm::Type *FieldTypes[] = {
776 CGM.IntTy, // Flags
777 getImageRelativeType(CGM.Int8PtrTy), // CleanupFn
778 getImageRelativeType(CGM.Int8PtrTy), // ForwardCompat
779 getImageRelativeType(CGM.Int8PtrTy) // CatchableTypeArray
780 };
781 ThrowInfoType = llvm::StructType::create(CGM.getLLVMContext(), FieldTypes,
782 "eh.ThrowInfo");
783 return ThrowInfoType;
784 }
785
786 llvm::FunctionCallee getThrowFn() {
787 // _CxxThrowException is passed an exception object and a ThrowInfo object
788 // which describes the exception.
789 llvm::Type *Args[] = {CGM.Int8PtrTy, CGM.DefaultPtrTy};
790 llvm::FunctionType *FTy =
791 llvm::FunctionType::get(CGM.VoidTy, Args, /*isVarArg=*/false);
792 llvm::FunctionCallee Throw =
793 CGM.CreateRuntimeFunction(FTy, "_CxxThrowException");
794 // _CxxThrowException is stdcall on 32-bit x86 platforms.
795 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::x86) {
796 if (auto *Fn = dyn_cast<llvm::Function>(Throw.getCallee()))
797 Fn->setCallingConv(llvm::CallingConv::X86_StdCall);
798 }
799 return Throw;
800 }
801
802 llvm::Function *getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD,
803 CXXCtorType CT);
804
805 llvm::Constant *getCatchableType(QualType T,
806 uint32_t NVOffset = 0,
807 int32_t VBPtrOffset = -1,
808 uint32_t VBIndex = 0);
809
810 llvm::GlobalVariable *getCatchableTypeArray(QualType T);
811
812 llvm::GlobalVariable *getThrowInfo(QualType T) override;
813
814 std::pair<llvm::Value *, const CXXRecordDecl *>
815 LoadVTablePtr(CodeGenFunction &CGF, Address This,
816 const CXXRecordDecl *RD) override;
817
818 bool
819 isPermittedToBeHomogeneousAggregate(const CXXRecordDecl *RD) const override;
820
821private:
822 typedef std::pair<const CXXRecordDecl *, CharUnits> VFTableIdTy;
823 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalVariable *> VTablesMapTy;
824 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalValue *> VFTablesMapTy;
825 /// All the vftables that have been referenced.
826 VFTablesMapTy VFTablesMap;
827 VTablesMapTy VTablesMap;
828
829 /// This set holds the record decls we've deferred vtable emission for.
830 llvm::SmallPtrSet<const CXXRecordDecl *, 4> DeferredVFTables;
831
832
833 /// All the vbtables which have been referenced.
834 llvm::DenseMap<const CXXRecordDecl *, VBTableGlobals> VBTablesMap;
835
836 /// Info on the global variable used to guard initialization of static locals.
837 /// The BitIndex field is only used for externally invisible declarations.
838 struct GuardInfo {
839 GuardInfo() = default;
840 llvm::GlobalVariable *Guard = nullptr;
841 unsigned BitIndex = 0;
842 };
843
844 /// Map from DeclContext to the current guard variable. We assume that the
845 /// AST is visited in source code order.
846 llvm::DenseMap<const DeclContext *, GuardInfo> GuardVariableMap;
847 llvm::DenseMap<const DeclContext *, GuardInfo> ThreadLocalGuardVariableMap;
848 llvm::DenseMap<const DeclContext *, unsigned> ThreadSafeGuardNumMap;
849
850 llvm::DenseMap<size_t, llvm::StructType *> TypeDescriptorTypeMap;
851 llvm::StructType *BaseClassDescriptorType;
852 llvm::StructType *ClassHierarchyDescriptorType;
853 llvm::StructType *CompleteObjectLocatorType;
854
855 llvm::DenseMap<QualType, llvm::GlobalVariable *> CatchableTypeArrays;
856
857 llvm::StructType *CatchableTypeType;
858 llvm::DenseMap<uint32_t, llvm::StructType *> CatchableTypeArrayTypeMap;
859 llvm::StructType *ThrowInfoType;
860};
861
862}
863
865MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const {
866 // Use the default C calling convention rules for things that can be passed in
867 // registers, i.e. non-trivially copyable records or records marked with
868 // [[trivial_abi]].
869 if (RD->canPassInRegisters())
870 return RAA_Default;
871
872 switch (CGM.getTarget().getTriple().getArch()) {
873 default:
874 // FIXME: Implement for other architectures.
875 return RAA_Indirect;
876
877 case llvm::Triple::thumb:
878 // Pass things indirectly for now because it is simple.
879 // FIXME: This is incompatible with MSVC for arguments with a dtor and no
880 // copy ctor.
881 return RAA_Indirect;
882
883 case llvm::Triple::x86: {
884 // If the argument has *required* alignment greater than four bytes, pass
885 // it indirectly. Prior to MSVC version 19.14, passing overaligned
886 // arguments was not supported and resulted in a compiler error. In 19.14
887 // and later versions, such arguments are now passed indirectly.
888 TypeInfo Info =
889 getContext().getTypeInfo(getContext().getCanonicalTagType(RD));
890 if (Info.isAlignRequired() && Info.Align > 4)
891 return RAA_Indirect;
892
893 // If C++ prohibits us from making a copy, construct the arguments directly
894 // into argument memory.
895 return RAA_DirectInMemory;
896 }
897
898 case llvm::Triple::x86_64:
899 case llvm::Triple::aarch64:
900 return RAA_Indirect;
901 }
902
903 llvm_unreachable("invalid enum");
904}
905
906void MicrosoftCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
907 const CXXDeleteExpr *DE,
908 Address Ptr,
909 QualType ElementType,
910 const CXXDestructorDecl *Dtor) {
911 // FIXME: Provide a source location here even though there's no
912 // CXXMemberCallExpr for dtor call.
913 if (!getContext().getTargetInfo().callGlobalDeleteInDeletingDtor(
914 getContext().getLangOpts())) {
915 bool UseGlobalDelete = DE->isGlobalDelete();
916 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
917 llvm::Value *MDThis =
918 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE,
919 /*CallOrInvoke=*/nullptr);
920 if (UseGlobalDelete)
921 CGF.EmitDeleteCall(DE->getOperatorDelete(), MDThis, ElementType);
922 } else {
923 EmitVirtualDestructorCall(CGF, Dtor, Dtor_Deleting, Ptr, DE,
924 /*CallOrInvoke=*/nullptr);
925 }
926}
927
928void MicrosoftCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
929 llvm::Value *Args[] = {llvm::ConstantPointerNull::get(CGM.Int8PtrTy),
930 llvm::ConstantPointerNull::get(CGM.DefaultPtrTy)};
931 llvm::FunctionCallee Fn = getThrowFn();
932 if (isNoReturn)
934 else
935 CGF.EmitRuntimeCallOrInvoke(Fn, Args);
936}
937
938void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
939 const CXXCatchStmt *S) {
940 // In the MS ABI, the runtime handles the copy, and the catch handler is
941 // responsible for destruction.
942 VarDecl *CatchParam = S->getExceptionDecl();
943 llvm::BasicBlock *CatchPadBB = CGF.Builder.GetInsertBlock();
944 llvm::CatchPadInst *CPI =
945 cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHIIt());
946 CGF.CurrentFuncletPad = CPI;
947
948 // If this is a catch-all or the catch parameter is unnamed, we don't need to
949 // emit an alloca to the object.
950 if (!CatchParam || !CatchParam->getDeclName()) {
951 CGF.EHStack.pushCleanup<CatchRetScope>(NormalCleanup, CPI);
952 return;
953 }
954
955 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
956 CPI->setArgOperand(2, var.getObjectAddress(CGF).emitRawPointer(CGF));
957 CGF.EHStack.pushCleanup<CatchRetScope>(NormalCleanup, CPI);
958 CGF.EmitAutoVarCleanups(var);
959}
960
961/// We need to perform a generic polymorphic operation (like a typeid
962/// or a cast), which requires an object with a vfptr. Adjust the
963/// address to point to an object with a vfptr.
964std::tuple<Address, llvm::Value *, const CXXRecordDecl *>
965MicrosoftCXXABI::performBaseAdjustment(CodeGenFunction &CGF, Address Value,
966 QualType SrcRecordTy) {
967 Value = Value.withElementType(CGF.Int8Ty);
968 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
969 const ASTContext &Context = getContext();
970
971 // If the class itself has a vfptr, great. This check implicitly
972 // covers non-virtual base subobjects: a class with its own virtual
973 // functions would be a candidate to be a primary base.
974 if (Context.getASTRecordLayout(SrcDecl).hasExtendableVFPtr())
975 return std::make_tuple(Value, llvm::ConstantInt::get(CGF.Int32Ty, 0),
976 SrcDecl);
977
978 // Okay, one of the vbases must have a vfptr, or else this isn't
979 // actually a polymorphic class.
980 const CXXRecordDecl *PolymorphicBase = nullptr;
981 for (auto &Base : SrcDecl->vbases()) {
982 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
983 if (Context.getASTRecordLayout(BaseDecl).hasExtendableVFPtr()) {
984 PolymorphicBase = BaseDecl;
985 break;
986 }
987 }
988 assert(PolymorphicBase && "polymorphic class has no apparent vfptr?");
989
990 llvm::Value *Offset =
991 GetVirtualBaseClassOffset(CGF, Value, SrcDecl, PolymorphicBase);
992 llvm::Value *Ptr = CGF.Builder.CreateInBoundsGEP(
993 Value.getElementType(), Value.emitRawPointer(CGF), Offset);
994 CharUnits VBaseAlign =
995 CGF.CGM.getVBaseAlignment(Value.getAlignment(), SrcDecl, PolymorphicBase);
996 return std::make_tuple(Address(Ptr, CGF.Int8Ty, VBaseAlign), Offset,
997 PolymorphicBase);
998}
999
1000bool MicrosoftCXXABI::shouldTypeidBeNullChecked(QualType SrcRecordTy) {
1001 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1002 return !getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr();
1003}
1004
1005static llvm::CallBase *emitRTtypeidCall(CodeGenFunction &CGF,
1006 llvm::Value *Argument) {
1007 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
1008 llvm::FunctionType *FTy =
1009 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false);
1010 llvm::Value *Args[] = {Argument};
1011 llvm::FunctionCallee Fn = CGF.CGM.CreateRuntimeFunction(FTy, "__RTtypeid");
1012 return CGF.EmitRuntimeCallOrInvoke(Fn, Args);
1013}
1014
1015void MicrosoftCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1016 llvm::CallBase *Call =
1017 emitRTtypeidCall(CGF, llvm::Constant::getNullValue(CGM.VoidPtrTy));
1018 Call->setDoesNotReturn();
1019 CGF.Builder.CreateUnreachable();
1020}
1021
1022llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF,
1023 QualType SrcRecordTy,
1024 Address ThisPtr,
1025 llvm::Type *StdTypeInfoPtrTy) {
1026 std::tie(ThisPtr, std::ignore, std::ignore) =
1027 performBaseAdjustment(CGF, ThisPtr, SrcRecordTy);
1028 llvm::CallBase *Typeid = emitRTtypeidCall(CGF, ThisPtr.emitRawPointer(CGF));
1029 return CGF.Builder.CreateBitCast(Typeid, StdTypeInfoPtrTy);
1030}
1031
1032bool MicrosoftCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1033 QualType SrcRecordTy) {
1034 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1035 return SrcIsPtr &&
1036 !getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr();
1037}
1038
1039llvm::Value *MicrosoftCXXABI::emitDynamicCastCall(
1040 CodeGenFunction &CGF, Address This, QualType SrcRecordTy, QualType DestTy,
1041 QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1042 llvm::Value *SrcRTTI =
1044 llvm::Value *DestRTTI =
1046
1047 llvm::Value *Offset;
1048 std::tie(This, Offset, std::ignore) =
1049 performBaseAdjustment(CGF, This, SrcRecordTy);
1050 llvm::Value *ThisPtr = This.emitRawPointer(CGF);
1051 Offset = CGF.Builder.CreateTrunc(Offset, CGF.Int32Ty);
1052
1053 // PVOID __RTDynamicCast(
1054 // PVOID inptr,
1055 // LONG VfDelta,
1056 // PVOID SrcType,
1057 // PVOID TargetType,
1058 // BOOL isReference)
1059 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy, CGF.Int32Ty, CGF.Int8PtrTy,
1060 CGF.Int8PtrTy, CGF.Int32Ty};
1061 llvm::FunctionCallee Function = CGF.CGM.CreateRuntimeFunction(
1062 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
1063 "__RTDynamicCast");
1064 llvm::Value *Args[] = {
1065 ThisPtr, Offset, SrcRTTI, DestRTTI,
1066 llvm::ConstantInt::get(CGF.Int32Ty, DestTy->isReferenceType())};
1067 return CGF.EmitRuntimeCallOrInvoke(Function, Args);
1068}
1069
1070llvm::Value *MicrosoftCXXABI::emitDynamicCastToVoid(CodeGenFunction &CGF,
1071 Address Value,
1072 QualType SrcRecordTy) {
1073 std::tie(Value, std::ignore, std::ignore) =
1074 performBaseAdjustment(CGF, Value, SrcRecordTy);
1075
1076 // PVOID __RTCastToVoid(
1077 // PVOID inptr)
1078 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
1079 llvm::FunctionCallee Function = CGF.CGM.CreateRuntimeFunction(
1080 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
1081 "__RTCastToVoid");
1082 llvm::Value *Args[] = {Value.emitRawPointer(CGF)};
1083 return CGF.EmitRuntimeCall(Function, Args);
1084}
1085
1086bool MicrosoftCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1087 return false;
1088}
1089
1090llvm::Value *MicrosoftCXXABI::GetVirtualBaseClassOffset(
1091 CodeGenFunction &CGF, Address This, const CXXRecordDecl *ClassDecl,
1092 const CXXRecordDecl *BaseClassDecl) {
1093 const ASTContext &Context = getContext();
1094 int64_t VBPtrChars =
1095 Context.getASTRecordLayout(ClassDecl).getVBPtrOffset().getQuantity();
1096 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars);
1097 CharUnits IntSize = Context.getTypeSizeInChars(Context.IntTy);
1098 CharUnits VBTableChars =
1099 IntSize *
1100 CGM.getMicrosoftVTableContext().getVBTableIndex(ClassDecl, BaseClassDecl);
1101 llvm::Value *VBTableOffset =
1102 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity());
1103
1104 llvm::Value *VBPtrToNewBase =
1105 GetVBaseOffsetFromVBPtr(CGF, This, VBPtrOffset, VBTableOffset);
1106 VBPtrToNewBase =
1107 CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy);
1108 return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase);
1109}
1110
1111bool MicrosoftCXXABI::HasThisReturn(GlobalDecl GD) const {
1112 return isa<CXXConstructorDecl>(GD.getDecl());
1113}
1114
1116 return isa<CXXDestructorDecl>(GD.getDecl()) &&
1117 (GD.getDtorType() == Dtor_Deleting ||
1119}
1120
1121bool MicrosoftCXXABI::hasMostDerivedReturn(GlobalDecl GD) const {
1122 return isDeletingDtor(GD);
1123}
1124
1125static bool isTrivialForMSVC(const CXXRecordDecl *RD, QualType Ty,
1126 CodeGenModule &CGM) {
1127 // On AArch64, HVAs that can be passed in registers can also be returned
1128 // in registers. (Note this is using the MSVC definition of an HVA; see
1129 // isPermittedToBeHomogeneousAggregate().)
1130 const Type *Base = nullptr;
1131 uint64_t NumElts = 0;
1132 if (CGM.getTarget().getTriple().isAArch64() &&
1133 CGM.getABIInfo().isHomogeneousAggregate(Ty, Base, NumElts) &&
1135 return true;
1136 }
1137
1138 // We use the C++14 definition of an aggregate, so we also
1139 // check for:
1140 // No private or protected non static data members.
1141 // No base classes
1142 // No virtual functions
1143 // Additionally, we need to ensure that there is a trivial copy assignment
1144 // operator, a trivial destructor, no user-provided constructors and no
1145 // deleted copy assignment operator.
1146
1147 // We need to cover two cases when checking for a deleted copy assignment
1148 // operator.
1149 //
1150 // struct S { int& r; };
1151 // The above will have an implicit copy assignment operator that is deleted
1152 // and there will not be a `CXXMethodDecl` for the copy assignment operator.
1153 // This is handled by the `needsImplicitCopyAssignment()` check below.
1154 //
1155 // struct S { S& operator=(const S&) = delete; int i; };
1156 // The above will not have an implicit copy assignment operator that is
1157 // deleted but there is a deleted `CXXMethodDecl` for the declared copy
1158 // assignment operator. This is handled by the `isDeleted()` check below.
1159
1160 if (RD->hasProtectedFields() || RD->hasPrivateFields())
1161 return false;
1162 if (RD->getNumBases() > 0)
1163 return false;
1164 if (RD->isPolymorphic())
1165 return false;
1167 return false;
1169 return false;
1170 for (const Decl *D : RD->decls()) {
1171 if (auto *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
1172 if (Ctor->isUserProvided())
1173 return false;
1174 } else if (auto *Template = dyn_cast<FunctionTemplateDecl>(D)) {
1175 if (isa<CXXConstructorDecl>(Template->getTemplatedDecl()))
1176 return false;
1177 } else if (auto *MethodDecl = dyn_cast<CXXMethodDecl>(D)) {
1178 if (MethodDecl->isCopyAssignmentOperator() && MethodDecl->isDeleted())
1179 return false;
1180 }
1181 }
1182 if (RD->hasNonTrivialDestructor())
1183 return false;
1184 return true;
1185}
1186
1187bool MicrosoftCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
1188 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
1189 if (!RD)
1190 return false;
1191
1192 bool isTrivialForABI = RD->canPassInRegisters() &&
1193 isTrivialForMSVC(RD, FI.getReturnType(), CGM);
1194
1195 // MSVC always returns structs indirectly from C++ instance methods.
1196 bool isIndirectReturn = !isTrivialForABI || FI.isInstanceMethod();
1197
1198 if (isIndirectReturn) {
1199 CharUnits Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
1200 LangAS SRetAS = CGM.getTargetCodeGenInfo().getSRetAddrSpace(RD);
1201 unsigned AS = CGM.getContext().getTargetAddressSpace(SRetAS);
1202 FI.getReturnInfo() =
1203 ABIArgInfo::getIndirect(Align, /*AddrSpace=*/AS, /*ByVal=*/false);
1204
1205 // MSVC always passes `this` before the `sret` parameter.
1207
1208 // On AArch64, use the `inreg` attribute if the object is considered to not
1209 // be trivially copyable, or if this is an instance method struct return.
1210 FI.getReturnInfo().setInReg(CGM.getTarget().getTriple().isAArch64());
1211
1212 return true;
1213 }
1214
1215 // Otherwise, use the C ABI rules.
1216 return false;
1217}
1218
1219llvm::BasicBlock *
1220MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
1221 const CXXRecordDecl *RD) {
1222 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
1223 assert(IsMostDerivedClass &&
1224 "ctor for a class with virtual bases must have an implicit parameter");
1225 llvm::Value *IsCompleteObject =
1226 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object");
1227
1228 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases");
1229 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases");
1230 CGF.Builder.CreateCondBr(IsCompleteObject,
1231 CallVbaseCtorsBB, SkipVbaseCtorsBB);
1232
1233 CGF.EmitBlock(CallVbaseCtorsBB);
1234
1235 // Fill in the vbtable pointers here.
1236 EmitVBPtrStores(CGF, RD);
1237
1238 // CGF will put the base ctor calls in this basic block for us later.
1239
1240 return SkipVbaseCtorsBB;
1241}
1242
1243llvm::BasicBlock *
1244MicrosoftCXXABI::EmitDtorCompleteObjectHandler(CodeGenFunction &CGF) {
1245 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
1246 assert(IsMostDerivedClass &&
1247 "ctor for a class with virtual bases must have an implicit parameter");
1248 llvm::Value *IsCompleteObject =
1249 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object");
1250
1251 llvm::BasicBlock *CallVbaseDtorsBB = CGF.createBasicBlock("Dtor.dtor_vbases");
1252 llvm::BasicBlock *SkipVbaseDtorsBB = CGF.createBasicBlock("Dtor.skip_vbases");
1253 CGF.Builder.CreateCondBr(IsCompleteObject,
1254 CallVbaseDtorsBB, SkipVbaseDtorsBB);
1255
1256 CGF.EmitBlock(CallVbaseDtorsBB);
1257 // CGF will put the base dtor calls in this basic block for us later.
1258
1259 return SkipVbaseDtorsBB;
1260}
1261
1262void MicrosoftCXXABI::initializeHiddenVirtualInheritanceMembers(
1263 CodeGenFunction &CGF, const CXXRecordDecl *RD) {
1264 // In most cases, an override for a vbase virtual method can adjust
1265 // the "this" parameter by applying a constant offset.
1266 // However, this is not enough while a constructor or a destructor of some
1267 // class X is being executed if all the following conditions are met:
1268 // - X has virtual bases, (1)
1269 // - X overrides a virtual method M of a vbase Y, (2)
1270 // - X itself is a vbase of the most derived class.
1271 //
1272 // If (1) and (2) are true, the vtorDisp for vbase Y is a hidden member of X
1273 // which holds the extra amount of "this" adjustment we must do when we use
1274 // the X vftables (i.e. during X ctor or dtor).
1275 // Outside the ctors and dtors, the values of vtorDisps are zero.
1276
1277 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
1278 typedef ASTRecordLayout::VBaseOffsetsMapTy VBOffsets;
1279 const VBOffsets &VBaseMap = Layout.getVBaseOffsetsMap();
1280 CGBuilderTy &Builder = CGF.Builder;
1281
1282 llvm::Value *Int8This = nullptr; // Initialize lazily.
1283
1284 for (const CXXBaseSpecifier &S : RD->vbases()) {
1285 const CXXRecordDecl *VBase = S.getType()->getAsCXXRecordDecl();
1286 auto I = VBaseMap.find(VBase);
1287 assert(I != VBaseMap.end());
1288 if (!I->second.hasVtorDisp())
1289 continue;
1290
1291 llvm::Value *VBaseOffset =
1292 GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, VBase);
1293 uint64_t ConstantVBaseOffset = I->second.VBaseOffset.getQuantity();
1294
1295 // vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase).
1296 llvm::Value *VtorDispValue = Builder.CreateSub(
1297 VBaseOffset, llvm::ConstantInt::get(CGM.PtrDiffTy, ConstantVBaseOffset),
1298 "vtordisp.value");
1299 VtorDispValue = Builder.CreateTruncOrBitCast(VtorDispValue, CGF.Int32Ty);
1300
1301 if (!Int8This)
1302 Int8This = getThisValue(CGF);
1303
1304 llvm::Value *VtorDispPtr =
1305 Builder.CreateInBoundsGEP(CGF.Int8Ty, Int8This, VBaseOffset);
1306 // vtorDisp is always the 32-bits before the vbase in the class layout.
1307 VtorDispPtr = Builder.CreateConstGEP1_32(CGF.Int8Ty, VtorDispPtr, -4);
1308
1309 Builder.CreateAlignedStore(VtorDispValue, VtorDispPtr,
1311 }
1312}
1313
1315 const CXXMethodDecl *MD) {
1316 CallingConv ExpectedCallingConv = Context.getDefaultCallingConvention(
1317 /*IsVariadic=*/false, /*IsCXXMethod=*/true);
1318 CallingConv ActualCallingConv =
1319 MD->getType()->castAs<FunctionProtoType>()->getCallConv();
1320 return ExpectedCallingConv == ActualCallingConv;
1321}
1322
1323void MicrosoftCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1324 // There's only one constructor type in this ABI.
1325 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1326
1327 // Exported default constructors either have a simple call-site where they use
1328 // the typical calling convention and have a single 'this' pointer for an
1329 // argument -or- they get a wrapper function which appropriately thunks to the
1330 // real default constructor. This thunk is the default constructor closure.
1331 if (D->hasAttr<DLLExportAttr>() && D->isDefaultConstructor() &&
1332 D->isDefined()) {
1333 if (!hasDefaultCXXMethodCC(getContext(), D) || D->getNumParams() != 0) {
1334 llvm::Function *Fn = getAddrOfCXXCtorClosure(D, Ctor_DefaultClosure);
1335 Fn->setLinkage(llvm::GlobalValue::WeakODRLinkage);
1336 CGM.setGVProperties(Fn, D);
1337 }
1338 }
1339}
1340
1341void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF,
1342 const CXXRecordDecl *RD) {
1343 Address This = getThisAddress(CGF);
1344 This = This.withElementType(CGM.Int8Ty);
1345 const ASTContext &Context = getContext();
1346 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
1347
1348 const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
1349 for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
1350 const std::unique_ptr<VPtrInfo> &VBT = (*VBGlobals.VBTables)[I];
1351 llvm::GlobalVariable *GV = VBGlobals.Globals[I];
1352 const ASTRecordLayout &SubobjectLayout =
1353 Context.getASTRecordLayout(VBT->IntroducingObject);
1354 CharUnits Offs = VBT->NonVirtualOffset;
1355 Offs += SubobjectLayout.getVBPtrOffset();
1356 if (VBT->getVBaseWithVPtr())
1357 Offs += Layout.getVBaseClassOffset(VBT->getVBaseWithVPtr());
1358 Address VBPtr = CGF.Builder.CreateConstInBoundsByteGEP(This, Offs);
1359 llvm::Value *GVPtr =
1360 CGF.Builder.CreateConstInBoundsGEP2_32(GV->getValueType(), GV, 0, 0);
1361 VBPtr = VBPtr.withElementType(GVPtr->getType());
1362 CGF.Builder.CreateStore(GVPtr, VBPtr);
1363 }
1364}
1365
1366CGCXXABI::AddedStructorArgCounts
1367MicrosoftCXXABI::buildStructorSignature(GlobalDecl GD,
1368 SmallVectorImpl<CanQualType> &ArgTys) {
1369 AddedStructorArgCounts Added;
1370 // TODO: 'for base' flag
1371 if (isa<CXXDestructorDecl>(GD.getDecl()) &&
1372 (GD.getDtorType() == Dtor_Deleting ||
1374 // The scalar deleting destructor takes an implicit int parameter.
1375 ArgTys.push_back(getContext().IntTy);
1376 ++Added.Suffix;
1377 }
1378 auto *CD = dyn_cast<CXXConstructorDecl>(GD.getDecl());
1379 if (!CD)
1380 return Added;
1381
1382 // All parameters are already in place except is_most_derived, which goes
1383 // after 'this' if it's variadic and last if it's not.
1384
1385 const CXXRecordDecl *Class = CD->getParent();
1386 const FunctionProtoType *FPT = CD->getType()->castAs<FunctionProtoType>();
1387 if (Class->getNumVBases()) {
1388 if (FPT->isVariadic()) {
1389 ArgTys.insert(ArgTys.begin() + 1, getContext().IntTy);
1390 ++Added.Prefix;
1391 } else {
1392 ArgTys.push_back(getContext().IntTy);
1393 ++Added.Suffix;
1394 }
1395 }
1396
1397 return Added;
1398}
1399
1400void MicrosoftCXXABI::setCXXDestructorDLLStorage(llvm::GlobalValue *GV,
1401 const CXXDestructorDecl *Dtor,
1402 CXXDtorType DT) const {
1403 // Deleting destructor variants are never imported or exported. Give them the
1404 // default storage class.
1405 if (DT == Dtor_Deleting || DT == Dtor_VectorDeleting) {
1406 GV->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
1407 } else {
1408 const NamedDecl *ND = Dtor;
1409 CGM.setDLLImportDLLExport(GV, ND);
1410 }
1411}
1412
1413llvm::GlobalValue::LinkageTypes MicrosoftCXXABI::getCXXDestructorLinkage(
1414 GVALinkage Linkage, const CXXDestructorDecl *Dtor, CXXDtorType DT) const {
1415 // Internal things are always internal, regardless of attributes. After this,
1416 // we know the thunk is externally visible.
1417 if (Linkage == GVA_Internal)
1418 return llvm::GlobalValue::InternalLinkage;
1419
1420 switch (DT) {
1421 case Dtor_Base:
1422 // The base destructor most closely tracks the user-declared constructor, so
1423 // we delegate back to the normal declarator case.
1424 return CGM.getLLVMLinkageForDeclarator(Dtor, Linkage);
1425 case Dtor_Complete:
1426 // The complete destructor is like an inline function, but it may be
1427 // imported and therefore must be exported as well. This requires changing
1428 // the linkage if a DLL attribute is present.
1429 if (Dtor->hasAttr<DLLExportAttr>())
1430 return llvm::GlobalValue::WeakODRLinkage;
1431 if (Dtor->hasAttr<DLLImportAttr>())
1432 return llvm::GlobalValue::AvailableExternallyLinkage;
1433 return llvm::GlobalValue::LinkOnceODRLinkage;
1434 case Dtor_Deleting:
1435 // Deleting destructors are like inline functions. They have vague linkage
1436 // and are emitted everywhere they are used. They are internal if the class
1437 // is internal.
1438 return llvm::GlobalValue::LinkOnceODRLinkage;
1439 case Dtor_Unified:
1440 llvm_unreachable("MS C++ ABI does not support unified dtors");
1442 // Use the weak, non-ODR linkage for vector deleting destructors to block
1443 // inlining. This enables an MS ABI code-size saving optimization that
1444 // allows us to avoid emitting array deletion code when arrays of a given
1445 // type are not allocated within the final linkage unit.
1446 return llvm::GlobalValue::WeakAnyLinkage;
1447 case Dtor_Comdat:
1448 llvm_unreachable("MS C++ ABI does not support comdat dtors");
1449 }
1450 llvm_unreachable("invalid dtor type");
1451}
1452
1453void MicrosoftCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1454 // The TU defining a dtor is only guaranteed to emit a base destructor. All
1455 // other destructor variants are delegating thunks.
1456 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1457
1458 // If the class is dllexported, emit the complete (vbase) destructor wherever
1459 // the base dtor is emitted.
1460 // FIXME: To match MSVC, this should only be done when the class is exported
1461 // with -fdllexport-inlines enabled.
1462 if (D->getParent()->getNumVBases() > 0 && D->hasAttr<DLLExportAttr>())
1463 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1464}
1465
1466CharUnits
1467MicrosoftCXXABI::getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD) {
1468 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
1469
1470 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1471 // Complete destructors take a pointer to the complete object as a
1472 // parameter, thus don't need this adjustment.
1473 if (GD.getDtorType() == Dtor_Complete)
1474 return CharUnits();
1475
1476 // There's no Dtor_Base in vftable but it shares the this adjustment with
1477 // the deleting one, so look it up instead.
1478 GD =
1479 GlobalDecl(DD, CGM.getContext().getTargetInfo().emitVectorDeletingDtors(
1480 CGM.getContext().getLangOpts())
1482 : Dtor_Deleting);
1483 }
1484
1485 MethodVFTableLocation ML =
1487 CharUnits Adjustment = ML.VFPtrOffset;
1488
1489 // Normal virtual instance methods need to adjust from the vfptr that first
1490 // defined the virtual method to the virtual base subobject, but destructors
1491 // do not. The vector deleting destructor thunk applies this adjustment for
1492 // us if necessary.
1493 if (isa<CXXDestructorDecl>(MD))
1494 Adjustment = CharUnits::Zero();
1495
1496 if (ML.VBase) {
1497 const ASTRecordLayout &DerivedLayout =
1498 getContext().getASTRecordLayout(MD->getParent());
1499 Adjustment += DerivedLayout.getVBaseClassOffset(ML.VBase);
1500 }
1501
1502 return Adjustment;
1503}
1504
1505Address MicrosoftCXXABI::adjustThisArgumentForVirtualFunctionCall(
1506 CodeGenFunction &CGF, GlobalDecl GD, Address This,
1507 bool VirtualCall) {
1508 if (!VirtualCall) {
1509 // If the call of a virtual function is not virtual, we just have to
1510 // compensate for the adjustment the virtual function does in its prologue.
1511 CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(GD);
1512 if (Adjustment.isZero())
1513 return This;
1514
1515 This = This.withElementType(CGF.Int8Ty);
1516 assert(Adjustment.isPositive());
1517 return CGF.Builder.CreateConstByteGEP(This, Adjustment);
1518 }
1519
1520 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
1521
1522 GlobalDecl LookupGD = GD;
1523 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1524 // Complete dtors take a pointer to the complete object,
1525 // thus don't need adjustment.
1526 if (GD.getDtorType() == Dtor_Complete)
1527 return This;
1528
1529 // There's only Dtor_Deleting in vftable but it shares the this adjustment
1530 // with the base one, so look up the deleting one instead.
1531 LookupGD =
1532 GlobalDecl(DD, CGM.getContext().getTargetInfo().emitVectorDeletingDtors(
1533 CGM.getContext().getLangOpts())
1535 : Dtor_Deleting);
1536 }
1537 MethodVFTableLocation ML =
1539
1540 CharUnits StaticOffset = ML.VFPtrOffset;
1541
1542 // Base destructors expect 'this' to point to the beginning of the base
1543 // subobject, not the first vfptr that happens to contain the virtual dtor.
1544 // However, we still need to apply the virtual base adjustment.
1545 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
1546 StaticOffset = CharUnits::Zero();
1547
1549 if (ML.VBase) {
1550 Result = Result.withElementType(CGF.Int8Ty);
1551
1552 const CXXRecordDecl *Derived = MD->getParent();
1553 const CXXRecordDecl *VBase = ML.VBase;
1554 llvm::Value *VBaseOffset =
1555 GetVirtualBaseClassOffset(CGF, Result, Derived, VBase);
1556 llvm::Value *VBasePtr = CGF.Builder.CreateInBoundsGEP(
1557 Result.getElementType(), Result.emitRawPointer(CGF), VBaseOffset);
1558 CharUnits VBaseAlign =
1559 CGF.CGM.getVBaseAlignment(Result.getAlignment(), Derived, VBase);
1560 Result = Address(VBasePtr, CGF.Int8Ty, VBaseAlign);
1561 }
1562 if (!StaticOffset.isZero()) {
1563 assert(StaticOffset.isPositive());
1564 Result = Result.withElementType(CGF.Int8Ty);
1565 if (ML.VBase) {
1566 // Non-virtual adjustment might result in a pointer outside the allocated
1567 // object, e.g. if the final overrider class is laid out after the virtual
1568 // base that declares a method in the most derived class.
1569 // FIXME: Update the code that emits this adjustment in thunks prologues.
1570 Result = CGF.Builder.CreateConstByteGEP(Result, StaticOffset);
1571 } else {
1572 Result = CGF.Builder.CreateConstInBoundsByteGEP(Result, StaticOffset);
1573 }
1574 }
1575 return Result;
1576}
1577
1578void MicrosoftCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1579 QualType &ResTy,
1580 FunctionArgList &Params) {
1581 ASTContext &Context = getContext();
1582 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1584 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
1585 auto *IsMostDerived = ImplicitParamDecl::Create(
1586 Context, /*DC=*/nullptr, CGF.CurGD.getDecl()->getLocation(),
1587 &Context.Idents.get("is_most_derived"), Context.IntTy,
1588 ImplicitParamKind::Other);
1589 // The 'most_derived' parameter goes second if the ctor is variadic and last
1590 // if it's not. Dtors can't be variadic.
1591 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
1592 if (FPT->isVariadic())
1593 Params.insert(Params.begin() + 1, IsMostDerived);
1594 else
1595 Params.push_back(IsMostDerived);
1596 getStructorImplicitParamDecl(CGF) = IsMostDerived;
1597 } else if (isDeletingDtor(CGF.CurGD)) {
1598 auto *ShouldDelete = ImplicitParamDecl::Create(
1599 Context, /*DC=*/nullptr, CGF.CurGD.getDecl()->getLocation(),
1600 &Context.Idents.get("should_call_delete"), Context.IntTy,
1601 ImplicitParamKind::Other);
1602 Params.push_back(ShouldDelete);
1603 getStructorImplicitParamDecl(CGF) = ShouldDelete;
1604 }
1605}
1606
1607void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1608 // Naked functions have no prolog.
1609 if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>())
1610 return;
1611
1612 // Overridden virtual methods of non-primary bases need to adjust the incoming
1613 // 'this' pointer in the prologue. In this hierarchy, C::b will subtract
1614 // sizeof(void*) to adjust from B* to C*:
1615 // struct A { virtual void a(); };
1616 // struct B { virtual void b(); };
1617 // struct C : A, B { virtual void b(); };
1618 //
1619 // Leave the value stored in the 'this' alloca unadjusted, so that the
1620 // debugger sees the unadjusted value. Microsoft debuggers require this, and
1621 // will apply the ThisAdjustment in the method type information.
1622 // FIXME: Do something better for DWARF debuggers, which won't expect this,
1623 // without making our codegen depend on debug info settings.
1624 llvm::Value *This = loadIncomingCXXThis(CGF);
1625 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1626 if (!CGF.CurFuncIsThunk && MD->isVirtual()) {
1627 CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(CGF.CurGD);
1628 if (!Adjustment.isZero()) {
1629 assert(Adjustment.isPositive());
1630 This = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, This,
1631 -Adjustment.getQuantity());
1632 }
1633 }
1634 setCXXABIThisValue(CGF, This);
1635
1636 // If this is a function that the ABI specifies returns 'this', initialize
1637 // the return slot to 'this' at the start of the function.
1638 //
1639 // Unlike the setting of return types, this is done within the ABI
1640 // implementation instead of by clients of CGCXXABI because:
1641 // 1) getThisValue is currently protected
1642 // 2) in theory, an ABI could implement 'this' returns some other way;
1643 // HasThisReturn only specifies a contract, not the implementation
1644 if (HasThisReturn(CGF.CurGD) || hasMostDerivedReturn(CGF.CurGD))
1645 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1646
1647 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
1648 assert(getStructorImplicitParamDecl(CGF) &&
1649 "no implicit parameter for a constructor with virtual bases?");
1650 getStructorImplicitParamValue(CGF)
1651 = CGF.Builder.CreateLoad(
1652 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
1653 "is_most_derived");
1654 }
1655
1656 if (isDeletingDtor(CGF.CurGD)) {
1657 assert(getStructorImplicitParamDecl(CGF) &&
1658 "no implicit parameter for a deleting destructor?");
1659 getStructorImplicitParamValue(CGF)
1660 = CGF.Builder.CreateLoad(
1661 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
1662 "should_call_delete");
1663 }
1664}
1665
1666CGCXXABI::AddedStructorArgs MicrosoftCXXABI::getImplicitConstructorArgs(
1667 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1668 bool ForVirtualBase, bool Delegating) {
1669 assert(Type == Ctor_Complete || Type == Ctor_Base);
1670
1671 // Check if we need a 'most_derived' parameter.
1672 if (!D->getParent()->getNumVBases())
1673 return AddedStructorArgs{};
1674
1675 // Add the 'most_derived' argument second if we are variadic or last if not.
1676 const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>();
1677 llvm::Value *MostDerivedArg;
1678 if (Delegating) {
1679 MostDerivedArg = getStructorImplicitParamValue(CGF);
1680 } else {
1681 MostDerivedArg = llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete);
1682 }
1683 if (FPT->isVariadic()) {
1684 return AddedStructorArgs::prefix({{MostDerivedArg, getContext().IntTy}});
1685 }
1686 return AddedStructorArgs::suffix({{MostDerivedArg, getContext().IntTy}});
1687}
1688
1689llvm::Value *MicrosoftCXXABI::getCXXDestructorImplicitParam(
1690 CodeGenFunction &CGF, const CXXDestructorDecl *DD, CXXDtorType Type,
1691 bool ForVirtualBase, bool Delegating) {
1692 return nullptr;
1693}
1694
1695void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1696 const CXXDestructorDecl *DD,
1697 CXXDtorType Type, bool ForVirtualBase,
1698 bool Delegating, Address This,
1699 QualType ThisTy) {
1700 // Use the base destructor variant in place of the complete destructor variant
1701 // if the class has no virtual bases. This effectively implements some of the
1702 // -mconstructor-aliases optimization, but as part of the MS C++ ABI.
1703 if (Type == Dtor_Complete && DD->getParent()->getNumVBases() == 0)
1704 Type = Dtor_Base;
1705
1706 GlobalDecl GD(DD, Type);
1707 CGCallee Callee = CGCallee::forDirect(CGM.getAddrOfCXXStructor(GD), GD);
1708
1709 if (DD->isVirtual()) {
1710 assert(Type != CXXDtorType::Dtor_Deleting &&
1711 "The deleting destructor should only be called via a virtual call");
1712 This = adjustThisArgumentForVirtualFunctionCall(CGF, GlobalDecl(DD, Type),
1713 This, false);
1714 }
1715
1716 llvm::BasicBlock *BaseDtorEndBB = nullptr;
1717 if (ForVirtualBase && isa<CXXConstructorDecl>(CGF.CurCodeDecl)) {
1718 BaseDtorEndBB = EmitDtorCompleteObjectHandler(CGF);
1719 }
1720
1721 llvm::Value *Implicit =
1722 getCXXDestructorImplicitParam(CGF, DD, Type, ForVirtualBase,
1723 Delegating); // = nullptr
1724 CGF.EmitCXXDestructorCall(GD, Callee, CGF.getAsNaturalPointerTo(This, ThisTy),
1725 ThisTy,
1726 /*ImplicitParam=*/Implicit,
1727 /*ImplicitParamTy=*/QualType(), /*E=*/nullptr);
1728 if (BaseDtorEndBB) {
1729 // Complete object handler should continue to be the remaining
1730 CGF.Builder.CreateBr(BaseDtorEndBB);
1731 CGF.EmitBlock(BaseDtorEndBB);
1732 }
1733}
1734
1735void MicrosoftCXXABI::emitVTableTypeMetadata(const VPtrInfo &Info,
1736 const CXXRecordDecl *RD,
1737 llvm::GlobalVariable *VTable) {
1738 // Emit type metadata on vtables with LTO or IR instrumentation.
1739 // In IR instrumentation, the type metadata could be used to find out vtable
1740 // definitions (for type profiling) among all global variables.
1741 if (!CGM.getCodeGenOpts().LTOUnit &&
1743 return;
1744
1745 // TODO: Should VirtualFunctionElimination also be supported here?
1746 // See similar handling in CodeGenModule::EmitVTableTypeMetadata.
1747 if (CGM.getCodeGenOpts().WholeProgramVTables) {
1748 llvm::DenseSet<const CXXRecordDecl *> Visited;
1749 llvm::GlobalObject::VCallVisibility TypeVis =
1750 CGM.GetVCallVisibilityLevel(RD, Visited);
1751 if (TypeVis != llvm::GlobalObject::VCallVisibilityPublic)
1752 VTable->setVCallVisibilityMetadata(TypeVis);
1753 }
1754
1755 // The location of the first virtual function pointer in the virtual table,
1756 // aka the "address point" on Itanium. This is at offset 0 if RTTI is
1757 // disabled, or sizeof(void*) if RTTI is enabled.
1758 CharUnits AddressPoint =
1759 getContext().getLangOpts().RTTIData
1760 ? getContext().toCharUnitsFromBits(
1761 getContext().getTargetInfo().getPointerWidth(LangAS::Default))
1762 : CharUnits::Zero();
1763
1764 if (Info.PathToIntroducingObject.empty()) {
1765 CGM.AddVTableTypeMetadata(VTable, AddressPoint, RD);
1766 return;
1767 }
1768
1769 // Add a bitset entry for the least derived base belonging to this vftable.
1770 CGM.AddVTableTypeMetadata(VTable, AddressPoint,
1771 Info.PathToIntroducingObject.back());
1772
1773 // Add a bitset entry for each derived class that is laid out at the same
1774 // offset as the least derived base.
1775 for (unsigned I = Info.PathToIntroducingObject.size() - 1; I != 0; --I) {
1776 const CXXRecordDecl *DerivedRD = Info.PathToIntroducingObject[I - 1];
1777 const CXXRecordDecl *BaseRD = Info.PathToIntroducingObject[I];
1778
1779 const ASTRecordLayout &Layout =
1780 getContext().getASTRecordLayout(DerivedRD);
1781 CharUnits Offset;
1782 auto VBI = Layout.getVBaseOffsetsMap().find(BaseRD);
1783 if (VBI == Layout.getVBaseOffsetsMap().end())
1784 Offset = Layout.getBaseClassOffset(BaseRD);
1785 else
1786 Offset = VBI->second.VBaseOffset;
1787 if (!Offset.isZero())
1788 return;
1789 CGM.AddVTableTypeMetadata(VTable, AddressPoint, DerivedRD);
1790 }
1791
1792 // Finally do the same for the most derived class.
1793 if (Info.FullOffsetInMDC.isZero())
1794 CGM.AddVTableTypeMetadata(VTable, AddressPoint, RD);
1795}
1796
1797void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1798 const CXXRecordDecl *RD) {
1799 MicrosoftVTableContext &VFTContext = CGM.getMicrosoftVTableContext();
1800 const VPtrInfoVector &VFPtrs = VFTContext.getVFPtrOffsets(RD);
1801
1802 for (const std::unique_ptr<VPtrInfo>& Info : VFPtrs) {
1803 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, Info->FullOffsetInMDC);
1804 if (VTable->hasInitializer())
1805 continue;
1806
1807 const VTableLayout &VTLayout =
1808 VFTContext.getVFTableLayout(RD, Info->FullOffsetInMDC);
1809
1810 llvm::Constant *RTTI = nullptr;
1811 if (any_of(VTLayout.vtable_components(),
1812 [](const VTableComponent &VTC) { return VTC.isRTTIKind(); }))
1813 RTTI = getMSCompleteObjectLocator(RD, *Info);
1814
1815 ConstantInitBuilder builder(CGM);
1816 auto components = builder.beginStruct();
1817 CGVT.createVTableInitializer(components, VTLayout, RTTI,
1818 VTable->hasLocalLinkage());
1819 components.finishAndSetAsInitializer(VTable);
1820
1821 emitVTableTypeMetadata(*Info, RD, VTable);
1822 }
1823}
1824
1825bool MicrosoftCXXABI::isVirtualOffsetNeededForVTableField(
1826 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) {
1827 return Vptr.NearestVBase != nullptr;
1828}
1829
1830llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor(
1831 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1832 const CXXRecordDecl *NearestVBase) {
1833 llvm::Constant *VTableAddressPoint = getVTableAddressPoint(Base, VTableClass);
1834 if (!VTableAddressPoint) {
1835 assert(Base.getBase()->getNumVBases() &&
1836 !getContext().getASTRecordLayout(Base.getBase()).hasOwnVFPtr());
1837 }
1838 return VTableAddressPoint;
1839}
1840
1842 const CXXRecordDecl *RD, const VPtrInfo &VFPtr,
1843 SmallString<256> &Name) {
1844 llvm::raw_svector_ostream Out(Name);
1845 MangleContext.mangleCXXVFTable(RD, VFPtr.MangledPath, Out);
1846}
1847
1848llvm::Constant *
1849MicrosoftCXXABI::getVTableAddressPoint(BaseSubobject Base,
1850 const CXXRecordDecl *VTableClass) {
1851 (void)getAddrOfVTable(VTableClass, Base.getBaseOffset());
1852 VFTableIdTy ID(VTableClass, Base.getBaseOffset());
1853 return VFTablesMap[ID];
1854}
1855
1856llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1857 CharUnits VPtrOffset) {
1858 // getAddrOfVTable may return 0 if asked to get an address of a vtable which
1859 // shouldn't be used in the given record type. We want to cache this result in
1860 // VFTablesMap, thus a simple zero check is not sufficient.
1861
1862 VFTableIdTy ID(RD, VPtrOffset);
1863 auto [I, Inserted] = VTablesMap.try_emplace(ID);
1864 if (!Inserted)
1865 return I->second;
1866
1867 llvm::GlobalVariable *&VTable = I->second;
1868
1869 MicrosoftVTableContext &VTContext = CGM.getMicrosoftVTableContext();
1870 const VPtrInfoVector &VFPtrs = VTContext.getVFPtrOffsets(RD);
1871
1872 if (DeferredVFTables.insert(RD).second) {
1873 // We haven't processed this record type before.
1874 // Queue up this vtable for possible deferred emission.
1875 CGM.addDeferredVTable(RD);
1876
1877#ifndef NDEBUG
1878 // Create all the vftables at once in order to make sure each vftable has
1879 // a unique mangled name.
1880 llvm::StringSet<> ObservedMangledNames;
1881 for (const auto &VFPtr : VFPtrs) {
1882 SmallString<256> Name;
1883 mangleVFTableName(getMangleContext(), RD, *VFPtr, Name);
1884 if (!ObservedMangledNames.insert(Name.str()).second)
1885 llvm_unreachable("Already saw this mangling before?");
1886 }
1887#endif
1888 }
1889
1890 const std::unique_ptr<VPtrInfo> *VFPtrI =
1891 llvm::find_if(VFPtrs, [&](const std::unique_ptr<VPtrInfo> &VPI) {
1892 return VPI->FullOffsetInMDC == VPtrOffset;
1893 });
1894 if (VFPtrI == VFPtrs.end()) {
1895 VFTablesMap[ID] = nullptr;
1896 return nullptr;
1897 }
1898 const std::unique_ptr<VPtrInfo> &VFPtr = *VFPtrI;
1899
1900 SmallString<256> VFTableName;
1901 mangleVFTableName(getMangleContext(), RD, *VFPtr, VFTableName);
1902
1903 // Classes marked __declspec(dllimport) need vftables generated on the
1904 // import-side in order to support features like constexpr. No other
1905 // translation unit relies on the emission of the local vftable, translation
1906 // units are expected to generate them as needed.
1907 //
1908 // Because of this unique behavior, we maintain this logic here instead of
1909 // getVTableLinkage.
1910 llvm::GlobalValue::LinkageTypes VFTableLinkage =
1911 RD->hasAttr<DLLImportAttr>() ? llvm::GlobalValue::LinkOnceODRLinkage
1912 : CGM.getVTableLinkage(RD);
1913 bool VFTableComesFromAnotherTU =
1914 llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage) ||
1915 llvm::GlobalValue::isExternalLinkage(VFTableLinkage);
1916 bool VTableAliasIsRequred =
1917 !VFTableComesFromAnotherTU && getContext().getLangOpts().RTTIData;
1918
1919 if (llvm::GlobalValue *VFTable =
1920 CGM.getModule().getNamedGlobal(VFTableName)) {
1921 VFTablesMap[ID] = VFTable;
1922 VTable = VTableAliasIsRequred
1924 cast<llvm::GlobalAlias>(VFTable)->getAliaseeObject())
1925 : cast<llvm::GlobalVariable>(VFTable);
1926 return VTable;
1927 }
1928
1929 const VTableLayout &VTLayout =
1930 VTContext.getVFTableLayout(RD, VFPtr->FullOffsetInMDC);
1931 llvm::GlobalValue::LinkageTypes VTableLinkage =
1932 VTableAliasIsRequred ? llvm::GlobalValue::PrivateLinkage : VFTableLinkage;
1933
1934 StringRef VTableName = VTableAliasIsRequred ? StringRef() : VFTableName.str();
1935
1936 llvm::Type *VTableType = CGM.getVTables().getVTableType(VTLayout);
1937
1938 // Create a backing variable for the contents of VTable. The VTable may
1939 // or may not include space for a pointer to RTTI data.
1940 llvm::GlobalValue *VFTable;
1941 VTable = new llvm::GlobalVariable(CGM.getModule(), VTableType,
1942 /*isConstant=*/true, VTableLinkage,
1943 /*Initializer=*/nullptr, VTableName);
1944 if (!CGM.shouldEmitRTTI())
1945 VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1946
1947 llvm::Comdat *C = nullptr;
1948 if (!VFTableComesFromAnotherTU &&
1949 llvm::GlobalValue::isWeakForLinker(VFTableLinkage))
1950 C = CGM.getModule().getOrInsertComdat(VFTableName.str());
1951
1952 // Only insert a pointer into the VFTable for RTTI data if we are not
1953 // importing it. We never reference the RTTI data directly so there is no
1954 // need to make room for it.
1955 if (VTableAliasIsRequred) {
1956 llvm::Constant *GEPIndices[] = {llvm::ConstantInt::get(CGM.Int32Ty, 0),
1957 llvm::ConstantInt::get(CGM.Int32Ty, 0),
1958 llvm::ConstantInt::get(CGM.Int32Ty, 1)};
1959 // Create a GEP which points just after the first entry in the VFTable,
1960 // this should be the location of the first virtual method.
1961 llvm::Constant *VTableGEP = llvm::ConstantExpr::getGetElementPtr(
1962 CGM.getDataLayout(), VTable->getValueType(), VTable, GEPIndices,
1963 llvm::GEPNoWrapFlags::inBounds());
1964 if (llvm::GlobalValue::isWeakForLinker(VFTableLinkage)) {
1965 VFTableLinkage = llvm::GlobalValue::ExternalLinkage;
1966 if (C)
1967 C->setSelectionKind(llvm::Comdat::Largest);
1968 }
1969 VFTable = llvm::GlobalAlias::create(CGM.Int8PtrTy,
1970 /*AddressSpace=*/0, VFTableLinkage,
1971 VFTableName.str(), VTableGEP,
1972 &CGM.getModule());
1973 if (!CGM.shouldEmitRTTI())
1974 VFTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1975 } else {
1976 // We don't need a GlobalAlias to be a symbol for the VTable if we won't
1977 // be referencing any RTTI data.
1978 // The GlobalVariable will end up being an appropriate definition of the
1979 // VFTable.
1980 VFTable = VTable;
1981 }
1982 if (C)
1983 VTable->setComdat(C);
1984
1985 if (RD->hasAttr<DLLExportAttr>())
1986 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1987
1988 VFTablesMap[ID] = VFTable;
1989 return VTable;
1990}
1991
1992CGCallee MicrosoftCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1993 GlobalDecl GD,
1994 Address This,
1995 llvm::Type *Ty,
1996 SourceLocation Loc) {
1997 CGBuilderTy &Builder = CGF.Builder;
1998
1999 Ty = CGF.DefaultPtrTy;
2000 Address VPtr =
2001 adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true);
2002
2003 auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl());
2004 llvm::Value *VTable =
2005 CGF.GetVTablePtr(VPtr, CGF.DefaultPtrTy, MethodDecl->getParent());
2006
2007 MicrosoftVTableContext &VFTContext = CGM.getMicrosoftVTableContext();
2008 MethodVFTableLocation ML = VFTContext.getMethodVFTableLocation(GD);
2009
2010 // Compute the identity of the most derived class whose virtual table is
2011 // located at the MethodVFTableLocation ML.
2012 auto getObjectWithVPtr = [&] {
2013 return llvm::find_if(VFTContext.getVFPtrOffsets(
2014 ML.VBase ? ML.VBase : MethodDecl->getParent()),
2015 [&](const std::unique_ptr<VPtrInfo> &Info) {
2016 return Info->FullOffsetInMDC == ML.VFPtrOffset;
2017 })
2018 ->get()
2019 ->ObjectWithVPtr;
2020 };
2021
2022 llvm::Value *VFunc;
2023 if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) {
2024 VFunc = CGF.EmitVTableTypeCheckedLoad(
2025 getObjectWithVPtr(), VTable, Ty,
2026 ML.Index *
2027 CGM.getContext().getTargetInfo().getPointerWidth(LangAS::Default) /
2028 8);
2029 } else {
2030 if (CGM.getCodeGenOpts().PrepareForLTO)
2031 CGF.EmitTypeMetadataCodeForVCall(getObjectWithVPtr(), VTable, Loc);
2032
2033 llvm::Value *VFuncPtr =
2034 Builder.CreateConstInBoundsGEP1_64(Ty, VTable, ML.Index, "vfn");
2035 VFunc = Builder.CreateAlignedLoad(Ty, VFuncPtr, CGF.getPointerAlign());
2036 }
2037
2038 CGCallee Callee(GD, VFunc);
2039 return Callee;
2040}
2041
2042llvm::Value *MicrosoftCXXABI::EmitVirtualDestructorCall(
2043 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
2044 Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke) {
2045 auto *CE = dyn_cast<const CXXMemberCallExpr *>(E);
2046 auto *D = dyn_cast<const CXXDeleteExpr *>(E);
2047 assert((CE != nullptr) ^ (D != nullptr));
2048 assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
2049 assert(DtorType == Dtor_VectorDeleting || DtorType == Dtor_Complete ||
2050 DtorType == Dtor_Deleting);
2051
2052 // We have only one destructor in the vftable but can get both behaviors
2053 // by passing an implicit int parameter.
2054 ASTContext &Context = getContext();
2055 bool VectorDeletingDtorsEnabled =
2057 GlobalDecl GD(Dtor, VectorDeletingDtorsEnabled ? Dtor_VectorDeleting
2058 : Dtor_Deleting);
2059 const CGFunctionInfo *FInfo =
2061 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
2062 CGCallee Callee = CGCallee::forVirtual(CE, GD, This, Ty);
2063
2064 bool IsDeleting = DtorType == Dtor_Deleting;
2065 bool IsArrayDelete = D && D->isArrayForm() && VectorDeletingDtorsEnabled;
2066 bool IsGlobalDelete = D && D->isGlobalDelete() &&
2068 Context.getLangOpts());
2069 llvm::Value *ImplicitParam =
2070 CGF.Builder.getInt32((IsDeleting ? 1 : 0) | (IsGlobalDelete ? 4 : 0) |
2071 (IsArrayDelete ? 2 : 0));
2072
2073 QualType ThisTy;
2074 if (CE) {
2075 ThisTy = CE->getObjectType();
2076 } else {
2077 ThisTy = D->getDestroyedType();
2078 }
2079
2080 while (const ArrayType *ATy = Context.getAsArrayType(ThisTy))
2081 ThisTy = ATy->getElementType();
2082
2083 This = adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true);
2084 RValue RV =
2085 CGF.EmitCXXDestructorCall(GD, Callee, This.emitRawPointer(CGF), ThisTy,
2086 ImplicitParam, Context.IntTy, CE, CallOrInvoke);
2087 return RV.getScalarVal();
2088}
2089
2090const VBTableGlobals &
2091MicrosoftCXXABI::enumerateVBTables(const CXXRecordDecl *RD) {
2092 // At this layer, we can key the cache off of a single class, which is much
2093 // easier than caching each vbtable individually.
2094 auto [Entry, Added] = VBTablesMap.try_emplace(RD);
2095 VBTableGlobals &VBGlobals = Entry->second;
2096 if (!Added)
2097 return VBGlobals;
2098
2099 MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
2100 VBGlobals.VBTables = &Context.enumerateVBTables(RD);
2101
2102 // Cache the globals for all vbtables so we don't have to recompute the
2103 // mangled names.
2104 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
2105 for (VPtrInfoVector::const_iterator I = VBGlobals.VBTables->begin(),
2106 E = VBGlobals.VBTables->end();
2107 I != E; ++I) {
2108 VBGlobals.Globals.push_back(getAddrOfVBTable(**I, RD, Linkage));
2109 }
2110
2111 return VBGlobals;
2112}
2113
2114llvm::Function *
2115MicrosoftCXXABI::EmitVirtualMemPtrThunk(const CXXMethodDecl *MD,
2116 const MethodVFTableLocation &ML) {
2117 assert(!isa<CXXConstructorDecl>(MD) && !isa<CXXDestructorDecl>(MD) &&
2118 "can't form pointers to ctors or virtual dtors");
2119
2120 // Calculate the mangled name.
2121 SmallString<256> ThunkName;
2122 llvm::raw_svector_ostream Out(ThunkName);
2123 getMangleContext().mangleVirtualMemPtrThunk(MD, ML, Out);
2124
2125 // If the thunk has been generated previously, just return it.
2126 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName))
2127 return cast<llvm::Function>(GV);
2128
2129 // Create the llvm::Function.
2130 const CGFunctionInfo &FnInfo =
2132 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
2133 llvm::Function *ThunkFn =
2134 llvm::Function::Create(ThunkTy, llvm::Function::ExternalLinkage,
2135 ThunkName.str(), &CGM.getModule());
2136 assert(ThunkFn->getName() == ThunkName && "name was uniqued!");
2137
2138 ThunkFn->setLinkage(MD->isExternallyVisible()
2139 ? llvm::GlobalValue::LinkOnceODRLinkage
2140 : llvm::GlobalValue::InternalLinkage);
2141 if (MD->isExternallyVisible())
2142 ThunkFn->setComdat(CGM.getModule().getOrInsertComdat(ThunkFn->getName()));
2143
2144 CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn, /*IsThunk=*/false);
2146
2147 // Add the "thunk" attribute so that LLVM knows that the return type is
2148 // meaningless. These thunks can be used to call functions with differing
2149 // return types, and the caller is required to cast the prototype
2150 // appropriately to extract the correct value.
2151 ThunkFn->addFnAttr("thunk");
2152
2153 // These thunks can be compared, so they are not unnamed.
2154 ThunkFn->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::None);
2155
2156 // Start codegen.
2157 CodeGenFunction CGF(CGM);
2158 CGF.CurGD = GlobalDecl(MD);
2159 CGF.CurFuncIsThunk = true;
2160
2161 // Build FunctionArgs, but only include the implicit 'this' parameter
2162 // declaration.
2163 FunctionArgList FunctionArgs;
2164 buildThisParam(CGF, FunctionArgs);
2165
2166 // Start defining the function.
2167 CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo,
2168 FunctionArgs, MD->getLocation(), SourceLocation());
2169
2170 ApplyDebugLocation AL(CGF, MD->getLocation());
2171 setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF));
2172
2173 // Load the vfptr and then callee from the vftable. The callee should have
2174 // adjusted 'this' so that the vfptr is at offset zero.
2175 llvm::Type *ThunkPtrTy = CGF.DefaultPtrTy;
2176 llvm::Value *VTable =
2177 CGF.GetVTablePtr(getThisAddress(CGF), CGF.DefaultPtrTy, MD->getParent());
2178
2179 llvm::Value *VFuncPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
2180 ThunkPtrTy, VTable, ML.Index, "vfn");
2181 llvm::Value *Callee =
2182 CGF.Builder.CreateAlignedLoad(ThunkPtrTy, VFuncPtr, CGF.getPointerAlign());
2183
2184 CGF.EmitMustTailThunk(MD, getThisValue(CGF), {ThunkTy, Callee});
2185
2186 return ThunkFn;
2187}
2188
2189void MicrosoftCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
2190 const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
2191 for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
2192 const std::unique_ptr<VPtrInfo>& VBT = (*VBGlobals.VBTables)[I];
2193 llvm::GlobalVariable *GV = VBGlobals.Globals[I];
2194 if (GV->isDeclaration())
2195 emitVBTableDefinition(*VBT, RD, GV);
2196 }
2197}
2198
2199llvm::GlobalVariable *
2200MicrosoftCXXABI::getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD,
2201 llvm::GlobalVariable::LinkageTypes Linkage) {
2202 SmallString<256> OutName;
2203 llvm::raw_svector_ostream Out(OutName);
2204 getMangleContext().mangleCXXVBTable(RD, VBT.MangledPath, Out);
2205 StringRef Name = OutName.str();
2206
2207 llvm::ArrayType *VBTableType =
2208 llvm::ArrayType::get(CGM.IntTy, 1 + VBT.ObjectWithVPtr->getNumVBases());
2209
2210 assert(!CGM.getModule().getNamedGlobal(Name) &&
2211 "vbtable with this name already exists: mangling bug?");
2212 CharUnits Alignment =
2214 llvm::GlobalVariable *GV = CGM.CreateOrReplaceCXXRuntimeVariable(
2215 Name, VBTableType, Linkage, Alignment.getAsAlign());
2216 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2217
2218 if (RD->hasAttr<DLLImportAttr>())
2219 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
2220 else if (RD->hasAttr<DLLExportAttr>())
2221 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
2222
2223 if (!GV->hasExternalLinkage())
2224 emitVBTableDefinition(VBT, RD, GV);
2225
2226 return GV;
2227}
2228
2229void MicrosoftCXXABI::emitVBTableDefinition(const VPtrInfo &VBT,
2230 const CXXRecordDecl *RD,
2231 llvm::GlobalVariable *GV) const {
2232 const CXXRecordDecl *ObjectWithVPtr = VBT.ObjectWithVPtr;
2233
2234 assert(RD->getNumVBases() && ObjectWithVPtr->getNumVBases() &&
2235 "should only emit vbtables for classes with vbtables");
2236
2237 const ASTRecordLayout &BaseLayout =
2238 getContext().getASTRecordLayout(VBT.IntroducingObject);
2239 const ASTRecordLayout &DerivedLayout = getContext().getASTRecordLayout(RD);
2240
2241 SmallVector<llvm::Constant *, 4> Offsets(1 + ObjectWithVPtr->getNumVBases(),
2242 nullptr);
2243
2244 // The offset from ObjectWithVPtr's vbptr to itself always leads.
2245 CharUnits VBPtrOffset = BaseLayout.getVBPtrOffset();
2246 Offsets[0] =
2247 llvm::ConstantInt::getSigned(CGM.IntTy, -VBPtrOffset.getQuantity());
2248
2249 MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
2250 for (const auto &I : ObjectWithVPtr->vbases()) {
2251 const CXXRecordDecl *VBase = I.getType()->getAsCXXRecordDecl();
2252 CharUnits Offset = DerivedLayout.getVBaseClassOffset(VBase);
2253 assert(!Offset.isNegative());
2254
2255 // Make it relative to the subobject vbptr.
2256 CharUnits CompleteVBPtrOffset = VBT.NonVirtualOffset + VBPtrOffset;
2257 if (VBT.getVBaseWithVPtr())
2258 CompleteVBPtrOffset +=
2259 DerivedLayout.getVBaseClassOffset(VBT.getVBaseWithVPtr());
2260 Offset -= CompleteVBPtrOffset;
2261
2262 unsigned VBIndex = Context.getVBTableIndex(ObjectWithVPtr, VBase);
2263 assert(Offsets[VBIndex] == nullptr && "The same vbindex seen twice?");
2264 Offsets[VBIndex] =
2265 llvm::ConstantInt::getSigned(CGM.IntTy, Offset.getQuantity());
2266 }
2267
2268 assert(Offsets.size() ==
2269 cast<llvm::ArrayType>(GV->getValueType())->getNumElements());
2270 llvm::ArrayType *VBTableType =
2271 llvm::ArrayType::get(CGM.IntTy, Offsets.size());
2272 llvm::Constant *Init = llvm::ConstantArray::get(VBTableType, Offsets);
2273 GV->setInitializer(Init);
2274
2275 if (RD->hasAttr<DLLImportAttr>())
2276 GV->setLinkage(llvm::GlobalVariable::AvailableExternallyLinkage);
2277}
2278
2279llvm::Value *MicrosoftCXXABI::performThisAdjustment(
2280 CodeGenFunction &CGF, Address This,
2281 const CXXRecordDecl * /*UnadjustedClass*/, const ThunkInfo &TI) {
2282 const ThisAdjustment &TA = TI.This;
2283 if (TA.isEmpty())
2284 return This.emitRawPointer(CGF);
2285
2286 This = This.withElementType(CGF.Int8Ty);
2287
2288 llvm::Value *V;
2289 if (TA.Virtual.isEmpty()) {
2290 V = This.emitRawPointer(CGF);
2291 } else {
2292 assert(TA.Virtual.Microsoft.VtordispOffset < 0);
2293 // Adjust the this argument based on the vtordisp value.
2294 Address VtorDispPtr =
2297 VtorDispPtr = VtorDispPtr.withElementType(CGF.Int32Ty);
2298 llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp");
2299 V = CGF.Builder.CreateGEP(This.getElementType(), This.emitRawPointer(CGF),
2300 CGF.Builder.CreateNeg(VtorDisp));
2301
2302 // Unfortunately, having applied the vtordisp means that we no
2303 // longer really have a known alignment for the vbptr step.
2304 // We'll assume the vbptr is pointer-aligned.
2305
2306 if (TA.Virtual.Microsoft.VBPtrOffset) {
2307 // If the final overrider is defined in a virtual base other than the one
2308 // that holds the vfptr, we have to use a vtordispex thunk which looks up
2309 // the vbtable of the derived class.
2310 assert(TA.Virtual.Microsoft.VBPtrOffset > 0);
2311 assert(TA.Virtual.Microsoft.VBOffsetOffset >= 0);
2312 llvm::Value *VBPtr;
2313 llvm::Value *VBaseOffset = GetVBaseOffsetFromVBPtr(
2314 CGF, Address(V, CGF.Int8Ty, CGF.getPointerAlign()),
2316 TA.Virtual.Microsoft.VBOffsetOffset, &VBPtr);
2317 V = CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, VBPtr, VBaseOffset);
2318 }
2319 }
2320
2321 if (TA.NonVirtual) {
2322 // Non-virtual adjustment might result in a pointer outside the allocated
2323 // object, e.g. if the final overrider class is laid out after the virtual
2324 // base that declares a method in the most derived class.
2325 V = CGF.Builder.CreateConstGEP1_32(CGF.Int8Ty, V, TA.NonVirtual);
2326 }
2327
2328 // Don't need to bitcast back, the call CodeGen will handle this.
2329 return V;
2330}
2331
2332llvm::Value *MicrosoftCXXABI::performReturnAdjustment(
2333 CodeGenFunction &CGF, Address Ret,
2334 const CXXRecordDecl * /*UnadjustedClass*/, const ReturnAdjustment &RA) {
2335
2336 if (RA.isEmpty())
2337 return Ret.emitRawPointer(CGF);
2338
2339 Ret = Ret.withElementType(CGF.Int8Ty);
2340
2341 llvm::Value *V = Ret.emitRawPointer(CGF);
2342 if (RA.Virtual.Microsoft.VBIndex) {
2343 assert(RA.Virtual.Microsoft.VBIndex > 0);
2344 int32_t IntSize = CGF.getIntSize().getQuantity();
2345 llvm::Value *VBPtr;
2346 llvm::Value *VBaseOffset =
2347 GetVBaseOffsetFromVBPtr(CGF, Ret, RA.Virtual.Microsoft.VBPtrOffset,
2348 IntSize * RA.Virtual.Microsoft.VBIndex, &VBPtr);
2349 V = CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, VBPtr, VBaseOffset);
2350 }
2351
2352 if (RA.NonVirtual)
2353 V = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, V, RA.NonVirtual);
2354
2355 return V;
2356}
2357
2358bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr,
2359 QualType elementType) {
2360 // Microsoft seems to completely ignore the possibility of a
2361 // two-argument usual deallocation function.
2362 return elementType.isDestructedType();
2363}
2364
2365bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) {
2366 // Microsoft seems to completely ignore the possibility of a
2367 // two-argument usual deallocation function.
2368 return expr->getAllocatedType().isDestructedType();
2369}
2370
2371CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) {
2372 // The array cookie is always a size_t; we then pad that out to the
2373 // alignment of the element type.
2374 ASTContext &Ctx = getContext();
2375 return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
2377}
2378
2379llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
2380 Address allocPtr,
2381 CharUnits cookieSize) {
2382 Address numElementsPtr = allocPtr.withElementType(CGF.SizeTy);
2383 return CGF.Builder.CreateLoad(numElementsPtr);
2384}
2385
2386Address MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
2387 Address newPtr,
2388 llvm::Value *numElements,
2389 const CXXNewExpr *expr,
2390 QualType elementType) {
2391 assert(requiresArrayCookie(expr));
2392
2393 // The size of the cookie.
2394 CharUnits cookieSize = getArrayCookieSizeImpl(elementType);
2395
2396 // Compute an offset to the cookie.
2397 Address cookiePtr = newPtr;
2398
2399 // Write the number of elements into the appropriate slot.
2400 Address numElementsPtr = cookiePtr.withElementType(CGF.SizeTy);
2401 CGF.Builder.CreateStore(numElements, numElementsPtr);
2402
2403 // Finally, compute a pointer to the actual data buffer by skipping
2404 // over the cookie completely.
2405 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize);
2406}
2407
2409 llvm::FunctionCallee Dtor,
2410 llvm::Constant *Addr) {
2411 // Create a function which calls the destructor.
2412 llvm::Constant *DtorStub = CGF.createAtExitStub(VD, Dtor, Addr);
2413
2414 // extern "C" int __tlregdtor(void (*f)(void));
2415 llvm::FunctionType *TLRegDtorTy = llvm::FunctionType::get(
2416 CGF.IntTy, DtorStub->getType(), /*isVarArg=*/false);
2417
2418 llvm::FunctionCallee TLRegDtor = CGF.CGM.CreateRuntimeFunction(
2419 TLRegDtorTy, "__tlregdtor", llvm::AttributeList(), /*Local=*/true);
2420 if (llvm::Function *TLRegDtorFn =
2421 dyn_cast<llvm::Function>(TLRegDtor.getCallee()))
2422 TLRegDtorFn->setDoesNotThrow();
2423
2424 CGF.EmitNounwindRuntimeCall(TLRegDtor, DtorStub);
2425}
2426
2427void MicrosoftCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
2428 llvm::FunctionCallee Dtor,
2429 llvm::Constant *Addr) {
2430 if (D.isNoDestroy(CGM.getContext()))
2431 return;
2432
2433 if (D.getTLSKind())
2434 return emitGlobalDtorWithTLRegDtor(CGF, D, Dtor, Addr);
2435
2436 // HLSL doesn't support atexit.
2437 if (CGM.getLangOpts().HLSL)
2438 return CGM.AddCXXDtorEntry(Dtor, Addr);
2439
2440 // The default behavior is to use atexit.
2441 CGF.registerGlobalDtorWithAtExit(D, Dtor, Addr);
2442}
2443
2444void MicrosoftCXXABI::EmitThreadLocalInitFuncs(
2445 CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals,
2446 ArrayRef<llvm::Function *> CXXThreadLocalInits,
2447 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) {
2448 if (CXXThreadLocalInits.empty())
2449 return;
2450
2451 CGM.AppendLinkerOptions(CGM.getTarget().getTriple().getArch() ==
2452 llvm::Triple::x86
2453 ? "/include:___dyn_tls_init@12"
2454 : "/include:__dyn_tls_init");
2455
2456 // This will create a GV in the .CRT$XDU section. It will point to our
2457 // initialization function. The CRT will call all of these function
2458 // pointers at start-up time and, eventually, at thread-creation time.
2459 auto AddToXDU = [&CGM](llvm::Function *InitFunc) {
2460 llvm::GlobalVariable *InitFuncPtr = new llvm::GlobalVariable(
2461 CGM.getModule(), InitFunc->getType(), /*isConstant=*/true,
2462 llvm::GlobalVariable::InternalLinkage, InitFunc,
2463 Twine(InitFunc->getName(), "$initializer$"));
2464 InitFuncPtr->setSection(".CRT$XDU");
2465 // This variable has discardable linkage, we have to add it to @llvm.used to
2466 // ensure it won't get discarded.
2467 CGM.addUsedGlobal(InitFuncPtr);
2468 return InitFuncPtr;
2469 };
2470
2471 std::vector<llvm::Function *> NonComdatInits;
2472 for (size_t I = 0, E = CXXThreadLocalInitVars.size(); I != E; ++I) {
2473 llvm::GlobalVariable *GV = cast<llvm::GlobalVariable>(
2474 CGM.GetGlobalValue(CGM.getMangledName(CXXThreadLocalInitVars[I])));
2475 llvm::Function *F = CXXThreadLocalInits[I];
2476
2477 // If the GV is already in a comdat group, then we have to join it.
2478 if (llvm::Comdat *C = GV->getComdat())
2479 AddToXDU(F)->setComdat(C);
2480 else
2481 NonComdatInits.push_back(F);
2482 }
2483
2484 if (!NonComdatInits.empty()) {
2485 llvm::FunctionType *FTy =
2486 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
2487 llvm::Function *InitFunc = CGM.CreateGlobalInitOrCleanUpFunction(
2488 FTy, "__tls_init", CGM.getTypes().arrangeNullaryFunction(),
2489 SourceLocation(), /*TLS=*/true);
2490 CodeGenFunction(CGM).GenerateCXXGlobalInitFunc(InitFunc, NonComdatInits);
2491
2492 AddToXDU(InitFunc);
2493 }
2494}
2495
2496static llvm::GlobalValue *getTlsGuardVar(CodeGenModule &CGM) {
2497 // __tls_guard comes from the MSVC runtime and reflects
2498 // whether TLS has been initialized for a particular thread.
2499 // It is set from within __dyn_tls_init by the runtime.
2500 // Every library and executable has its own variable.
2501 llvm::Type *VTy = llvm::Type::getInt8Ty(CGM.getLLVMContext());
2502 llvm::Constant *TlsGuardConstant =
2503 CGM.CreateRuntimeVariable(VTy, "__tls_guard");
2504 llvm::GlobalValue *TlsGuard = cast<llvm::GlobalValue>(TlsGuardConstant);
2505
2506 TlsGuard->setThreadLocal(true);
2507
2508 return TlsGuard;
2509}
2510
2511static llvm::FunctionCallee getDynTlsOnDemandInitFn(CodeGenModule &CGM) {
2512 // __dyn_tls_on_demand_init comes from the MSVC runtime and triggers
2513 // dynamic TLS initialization by calling __dyn_tls_init internally.
2514 llvm::FunctionType *FTy =
2515 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()), {},
2516 /*isVarArg=*/false);
2517 return CGM.CreateRuntimeFunction(
2518 FTy, "__dyn_tls_on_demand_init",
2519 llvm::AttributeList::get(CGM.getLLVMContext(),
2520 llvm::AttributeList::FunctionIndex,
2521 llvm::Attribute::NoUnwind),
2522 /*Local=*/true);
2523}
2524
2525static void emitTlsGuardCheck(CodeGenFunction &CGF, llvm::GlobalValue *TlsGuard,
2526 llvm::BasicBlock *DynInitBB,
2527 llvm::BasicBlock *ContinueBB) {
2528 llvm::LoadInst *TlsGuardValue =
2529 CGF.Builder.CreateLoad(Address(TlsGuard, CGF.Int8Ty, CharUnits::One()));
2530 llvm::Value *CmpResult =
2531 CGF.Builder.CreateICmpEQ(TlsGuardValue, CGF.Builder.getInt8(0));
2532 CGF.Builder.CreateCondBr(CmpResult, DynInitBB, ContinueBB);
2533}
2534
2536 llvm::GlobalValue *TlsGuard,
2537 llvm::BasicBlock *ContinueBB) {
2538 llvm::FunctionCallee Initializer = getDynTlsOnDemandInitFn(CGF.CGM);
2539 llvm::Function *InitializerFunction =
2540 cast<llvm::Function>(Initializer.getCallee());
2541 llvm::CallInst *CallVal = CGF.Builder.CreateCall(InitializerFunction);
2542 CallVal->setCallingConv(InitializerFunction->getCallingConv());
2543
2544 CGF.Builder.CreateBr(ContinueBB);
2545}
2546
2548 llvm::BasicBlock *DynInitBB =
2549 CGF.createBasicBlock("dyntls.dyn_init", CGF.CurFn);
2550 llvm::BasicBlock *ContinueBB =
2551 CGF.createBasicBlock("dyntls.continue", CGF.CurFn);
2552
2553 llvm::GlobalValue *TlsGuard = getTlsGuardVar(CGF.CGM);
2554
2555 emitTlsGuardCheck(CGF, TlsGuard, DynInitBB, ContinueBB);
2556 CGF.Builder.SetInsertPoint(DynInitBB);
2557 emitDynamicTlsInitializationCall(CGF, TlsGuard, ContinueBB);
2558 CGF.Builder.SetInsertPoint(ContinueBB);
2559}
2560
2561LValue MicrosoftCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2562 const VarDecl *VD,
2563 QualType LValType) {
2564 // Dynamic TLS initialization works by checking the state of a
2565 // guard variable (__tls_guard) to see whether TLS initialization
2566 // for a thread has happend yet.
2567 // If not, the initialization is triggered on-demand
2568 // by calling __dyn_tls_on_demand_init.
2570
2571 // Emit the variable just like any regular global variable.
2572
2573 llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD);
2574 llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType());
2575
2576 CharUnits Alignment = CGF.getContext().getDeclAlign(VD);
2577 Address Addr(V, RealVarTy, Alignment);
2578
2579 LValue LV = VD->getType()->isReferenceType()
2581 AlignmentSource::Decl)
2582 : CGF.MakeAddrLValue(Addr, LValType, AlignmentSource::Decl);
2583 return LV;
2584}
2585
2587 StringRef VarName("_Init_thread_epoch");
2588 CharUnits Align = CGM.getIntAlign();
2589 if (auto *GV = CGM.getModule().getNamedGlobal(VarName))
2590 return ConstantAddress(GV, GV->getValueType(), Align);
2591 auto *GV = new llvm::GlobalVariable(
2592 CGM.getModule(), CGM.IntTy,
2593 /*isConstant=*/false, llvm::GlobalVariable::ExternalLinkage,
2594 /*Initializer=*/nullptr, VarName,
2595 /*InsertBefore=*/nullptr, llvm::GlobalVariable::GeneralDynamicTLSModel);
2596 GV->setAlignment(Align.getAsAlign());
2597 return ConstantAddress(GV, GV->getValueType(), Align);
2598}
2599
2600static llvm::FunctionCallee getInitThreadHeaderFn(CodeGenModule &CGM) {
2601 llvm::FunctionType *FTy =
2602 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
2603 CGM.DefaultPtrTy, /*isVarArg=*/false);
2604 return CGM.CreateRuntimeFunction(
2605 FTy, "_Init_thread_header",
2606 llvm::AttributeList::get(CGM.getLLVMContext(),
2607 llvm::AttributeList::FunctionIndex,
2608 llvm::Attribute::NoUnwind),
2609 /*Local=*/true);
2610}
2611
2612static llvm::FunctionCallee getInitThreadFooterFn(CodeGenModule &CGM) {
2613 llvm::FunctionType *FTy =
2614 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
2615 CGM.DefaultPtrTy, /*isVarArg=*/false);
2616 return CGM.CreateRuntimeFunction(
2617 FTy, "_Init_thread_footer",
2618 llvm::AttributeList::get(CGM.getLLVMContext(),
2619 llvm::AttributeList::FunctionIndex,
2620 llvm::Attribute::NoUnwind),
2621 /*Local=*/true);
2622}
2623
2624static llvm::FunctionCallee getInitThreadAbortFn(CodeGenModule &CGM) {
2625 llvm::FunctionType *FTy =
2626 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
2627 CGM.DefaultPtrTy, /*isVarArg=*/false);
2628 return CGM.CreateRuntimeFunction(
2629 FTy, "_Init_thread_abort",
2630 llvm::AttributeList::get(CGM.getLLVMContext(),
2631 llvm::AttributeList::FunctionIndex,
2632 llvm::Attribute::NoUnwind),
2633 /*Local=*/true);
2634}
2635
2636namespace {
2637struct ResetGuardBit final : EHScopeStack::Cleanup {
2638 Address Guard;
2639 unsigned GuardNum;
2640 ResetGuardBit(Address Guard, unsigned GuardNum)
2641 : Guard(Guard), GuardNum(GuardNum) {}
2642
2643 void Emit(CodeGenFunction &CGF, Flags flags) override {
2644 // Reset the bit in the mask so that the static variable may be
2645 // reinitialized.
2646 CGBuilderTy &Builder = CGF.Builder;
2647 llvm::LoadInst *LI = Builder.CreateLoad(Guard);
2648 llvm::ConstantInt *Mask =
2649 llvm::ConstantInt::getSigned(CGF.IntTy, ~(1ULL << GuardNum));
2650 Builder.CreateStore(Builder.CreateAnd(LI, Mask), Guard);
2651 }
2652};
2653
2654struct CallInitThreadAbort final : EHScopeStack::Cleanup {
2655 llvm::Value *Guard;
2656 CallInitThreadAbort(RawAddress Guard) : Guard(Guard.getPointer()) {}
2657
2658 void Emit(CodeGenFunction &CGF, Flags flags) override {
2659 // Calling _Init_thread_abort will reset the guard's state.
2661 }
2662};
2663}
2664
2665void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
2666 llvm::GlobalVariable *GV,
2667 bool PerformInit) {
2668 // MSVC only uses guards for static locals.
2669 if (!D.isStaticLocal()) {
2670 assert(GV->hasWeakLinkage() || GV->hasLinkOnceLinkage());
2671 // GlobalOpt is allowed to discard the initializer, so use linkonce_odr.
2672 llvm::Function *F = CGF.CurFn;
2673 F->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
2674 F->setComdat(CGM.getModule().getOrInsertComdat(F->getName()));
2675 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
2676 return;
2677 }
2678
2679 bool ThreadlocalStatic = D.getTLSKind();
2680 bool ThreadsafeStatic = getContext().getLangOpts().ThreadsafeStatics;
2681
2682 // Thread-safe static variables which aren't thread-specific have a
2683 // per-variable guard.
2684 bool HasPerVariableGuard = ThreadsafeStatic && !ThreadlocalStatic;
2685
2686 CGBuilderTy &Builder = CGF.Builder;
2687 llvm::IntegerType *GuardTy = CGF.Int32Ty;
2688 llvm::ConstantInt *Zero = llvm::ConstantInt::get(GuardTy, 0);
2689 CharUnits GuardAlign = CharUnits::fromQuantity(4);
2690
2691 // Get the guard variable for this function if we have one already.
2692 GuardInfo *GI = nullptr;
2693 if (ThreadlocalStatic)
2694 GI = &ThreadLocalGuardVariableMap[D.getDeclContext()];
2695 else if (!ThreadsafeStatic)
2696 GI = &GuardVariableMap[D.getDeclContext()];
2697
2698 llvm::GlobalVariable *GuardVar = GI ? GI->Guard : nullptr;
2699 unsigned GuardNum;
2700 if (D.isExternallyVisible()) {
2701 // Externally visible variables have to be numbered in Sema to properly
2702 // handle unreachable VarDecls.
2703 GuardNum = getContext().getStaticLocalNumber(&D);
2704 assert(GuardNum > 0);
2705 GuardNum--;
2706 } else if (HasPerVariableGuard) {
2707 GuardNum = ThreadSafeGuardNumMap[D.getDeclContext()]++;
2708 } else {
2709 // Non-externally visible variables are numbered here in CodeGen.
2710 GuardNum = GI->BitIndex++;
2711 }
2712
2713 if (!HasPerVariableGuard && GuardNum >= 32) {
2714 if (D.isExternallyVisible())
2715 ErrorUnsupportedABI(CGF, "more than 32 guarded initializations");
2716 GuardNum %= 32;
2717 GuardVar = nullptr;
2718 }
2719
2720 if (!GuardVar) {
2721 // Mangle the name for the guard.
2722 SmallString<256> GuardName;
2723 {
2724 llvm::raw_svector_ostream Out(GuardName);
2725 if (HasPerVariableGuard)
2726 getMangleContext().mangleThreadSafeStaticGuardVariable(&D, GuardNum,
2727 Out);
2728 else
2729 getMangleContext().mangleStaticGuardVariable(&D, Out);
2730 }
2731
2732 // Create the guard variable with a zero-initializer. Just absorb linkage,
2733 // visibility and dll storage class from the guarded variable.
2734 GuardVar =
2735 new llvm::GlobalVariable(CGM.getModule(), GuardTy, /*isConstant=*/false,
2736 GV->getLinkage(), Zero, GuardName.str());
2737 GuardVar->setVisibility(GV->getVisibility());
2738 GuardVar->setDLLStorageClass(GV->getDLLStorageClass());
2739 GuardVar->setAlignment(GuardAlign.getAsAlign());
2740 if (GuardVar->isWeakForLinker())
2741 GuardVar->setComdat(
2742 CGM.getModule().getOrInsertComdat(GuardVar->getName()));
2743 if (D.getTLSKind())
2744 CGM.setTLSMode(GuardVar, D);
2745 if (GI && !HasPerVariableGuard)
2746 GI->Guard = GuardVar;
2747 }
2748
2749 ConstantAddress GuardAddr(GuardVar, GuardTy, GuardAlign);
2750
2751 assert(GuardVar->getLinkage() == GV->getLinkage() &&
2752 "static local from the same function had different linkage");
2753
2754 if (!HasPerVariableGuard) {
2755 // Pseudo code for the test:
2756 // if (!(GuardVar & MyGuardBit)) {
2757 // GuardVar |= MyGuardBit;
2758 // ... initialize the object ...;
2759 // }
2760
2761 // Test our bit from the guard variable.
2762 llvm::ConstantInt *Bit = llvm::ConstantInt::get(GuardTy, 1ULL << GuardNum);
2763 llvm::LoadInst *LI = Builder.CreateLoad(GuardAddr);
2764 llvm::Value *NeedsInit =
2765 Builder.CreateICmpEQ(Builder.CreateAnd(LI, Bit), Zero);
2766 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2767 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2768 CGF.EmitCXXGuardedInitBranch(NeedsInit, InitBlock, EndBlock,
2769 CodeGenFunction::GuardKind::VariableGuard, &D);
2770
2771 // Set our bit in the guard variable and emit the initializer and add a global
2772 // destructor if appropriate.
2773 CGF.EmitBlock(InitBlock);
2774 Builder.CreateStore(Builder.CreateOr(LI, Bit), GuardAddr);
2775 CGF.EHStack.pushCleanup<ResetGuardBit>(EHCleanup, GuardAddr, GuardNum);
2776 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
2777 CGF.PopCleanupBlock();
2778 Builder.CreateBr(EndBlock);
2779
2780 // Continue.
2781 CGF.EmitBlock(EndBlock);
2782 } else {
2783 // Pseudo code for the test:
2784 // if (TSS > _Init_thread_epoch) {
2785 // _Init_thread_header(&TSS);
2786 // if (TSS == -1) {
2787 // ... initialize the object ...;
2788 // _Init_thread_footer(&TSS);
2789 // }
2790 // }
2791 //
2792 // The algorithm is almost identical to what can be found in the appendix
2793 // found in N2325.
2794
2795 // This BasicBLock determines whether or not we have any work to do.
2796 llvm::LoadInst *FirstGuardLoad = Builder.CreateLoad(GuardAddr);
2797 FirstGuardLoad->setOrdering(llvm::AtomicOrdering::Unordered);
2798 llvm::LoadInst *InitThreadEpoch =
2799 Builder.CreateLoad(getInitThreadEpochPtr(CGM));
2800 llvm::Value *IsUninitialized =
2801 Builder.CreateICmpSGT(FirstGuardLoad, InitThreadEpoch);
2802 llvm::BasicBlock *AttemptInitBlock = CGF.createBasicBlock("init.attempt");
2803 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2804 CGF.EmitCXXGuardedInitBranch(IsUninitialized, AttemptInitBlock, EndBlock,
2805 CodeGenFunction::GuardKind::VariableGuard, &D);
2806
2807 // This BasicBlock attempts to determine whether or not this thread is
2808 // responsible for doing the initialization.
2809 CGF.EmitBlock(AttemptInitBlock);
2811 GuardAddr.getPointer());
2812 llvm::LoadInst *SecondGuardLoad = Builder.CreateLoad(GuardAddr);
2813 SecondGuardLoad->setOrdering(llvm::AtomicOrdering::Unordered);
2814 llvm::Value *ShouldDoInit =
2815 Builder.CreateICmpEQ(SecondGuardLoad, getAllOnesInt());
2816 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2817 Builder.CreateCondBr(ShouldDoInit, InitBlock, EndBlock);
2818
2819 // Ok, we ended up getting selected as the initializing thread.
2820 CGF.EmitBlock(InitBlock);
2821 CGF.EHStack.pushCleanup<CallInitThreadAbort>(EHCleanup, GuardAddr);
2822 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
2823 CGF.PopCleanupBlock();
2825 GuardAddr.getPointer());
2826 Builder.CreateBr(EndBlock);
2827
2828 CGF.EmitBlock(EndBlock);
2829 }
2830}
2831
2832bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
2833 // Null-ness for function memptrs only depends on the first field, which is
2834 // the function pointer. The rest don't matter, so we can zero initialize.
2835 if (MPT->isMemberFunctionPointer())
2836 return true;
2837
2838 // The virtual base adjustment field is always -1 for null, so if we have one
2839 // we can't zero initialize. The field offset is sometimes also -1 if 0 is a
2840 // valid field offset.
2841 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2842 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
2843 return (!inheritanceModelHasVBTableOffsetField(Inheritance) &&
2844 RD->nullFieldOffsetIsZero());
2845}
2846
2847llvm::Type *
2848MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
2849 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2850 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
2851 llvm::SmallVector<llvm::Type *, 4> fields;
2852 if (MPT->isMemberFunctionPointer())
2853 fields.push_back(CGM.VoidPtrTy); // FunctionPointerOrVirtualThunk
2854 else
2855 fields.push_back(CGM.IntTy); // FieldOffset
2856
2858 Inheritance))
2859 fields.push_back(CGM.IntTy);
2860 if (inheritanceModelHasVBPtrOffsetField(Inheritance))
2861 fields.push_back(CGM.IntTy);
2863 fields.push_back(CGM.IntTy); // VirtualBaseAdjustmentOffset
2864
2865 if (fields.size() == 1)
2866 return fields[0];
2867 return llvm::StructType::get(CGM.getLLVMContext(), fields);
2868}
2869
2870void MicrosoftCXXABI::
2871GetNullMemberPointerFields(const MemberPointerType *MPT,
2872 llvm::SmallVectorImpl<llvm::Constant *> &fields) {
2873 assert(fields.empty());
2874 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2875 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
2876 if (MPT->isMemberFunctionPointer()) {
2877 // FunctionPointerOrVirtualThunk
2878 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
2879 } else {
2880 if (RD->nullFieldOffsetIsZero())
2881 fields.push_back(getZeroInt()); // FieldOffset
2882 else
2883 fields.push_back(getAllOnesInt()); // FieldOffset
2884 }
2885
2887 Inheritance))
2888 fields.push_back(getZeroInt());
2889 if (inheritanceModelHasVBPtrOffsetField(Inheritance))
2890 fields.push_back(getZeroInt());
2892 fields.push_back(getAllOnesInt());
2893}
2894
2895llvm::Constant *
2896MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
2897 llvm::SmallVector<llvm::Constant *, 4> fields;
2898 GetNullMemberPointerFields(MPT, fields);
2899 if (fields.size() == 1)
2900 return fields[0];
2901 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields);
2902 assert(Res->getType() == ConvertMemberPointerType(MPT));
2903 return Res;
2904}
2905
2906llvm::Constant *
2907MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
2908 bool IsMemberFunction,
2909 const CXXRecordDecl *RD,
2910 CharUnits NonVirtualBaseAdjustment,
2911 unsigned VBTableIndex) {
2912 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
2913
2914 // Single inheritance class member pointer are represented as scalars instead
2915 // of aggregates.
2916 if (inheritanceModelHasOnlyOneField(IsMemberFunction, Inheritance))
2917 return FirstField;
2918
2919 llvm::SmallVector<llvm::Constant *, 4> fields;
2920 fields.push_back(FirstField);
2921
2922 if (inheritanceModelHasNVOffsetField(IsMemberFunction, Inheritance))
2923 fields.push_back(llvm::ConstantInt::getSigned(
2924 CGM.IntTy, NonVirtualBaseAdjustment.getQuantity()));
2925
2926 if (inheritanceModelHasVBPtrOffsetField(Inheritance)) {
2927 CharUnits Offs = CharUnits::Zero();
2928 if (VBTableIndex)
2929 Offs = getContext().getASTRecordLayout(RD).getVBPtrOffset();
2930 fields.push_back(llvm::ConstantInt::get(CGM.IntTy, Offs.getQuantity()));
2931 }
2932
2933 // The rest of the fields are adjusted by conversions to a more derived class.
2935 fields.push_back(llvm::ConstantInt::get(CGM.IntTy, VBTableIndex));
2936
2937 return llvm::ConstantStruct::getAnon(fields);
2938}
2939
2940llvm::Constant *
2941MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
2942 CharUnits offset) {
2943 return EmitMemberDataPointer(MPT->getMostRecentCXXRecordDecl(), offset);
2944}
2945
2946llvm::Constant *MicrosoftCXXABI::EmitMemberDataPointer(const CXXRecordDecl *RD,
2947 CharUnits offset) {
2948 if (RD->getMSInheritanceModel() ==
2949 MSInheritanceModel::Virtual)
2950 offset -= getContext().getOffsetOfBaseWithVBPtr(RD);
2951 llvm::Constant *FirstField =
2952 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity());
2953 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD,
2954 CharUnits::Zero(), /*VBTableIndex=*/0);
2955}
2956
2957llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP,
2958 QualType MPType) {
2959 const MemberPointerType *DstTy = MPType->castAs<MemberPointerType>();
2960 const ValueDecl *MPD = MP.getMemberPointerDecl();
2961 if (!MPD)
2962 return EmitNullMemberPointer(DstTy);
2963
2964 ASTContext &Ctx = getContext();
2965 ArrayRef<const CXXRecordDecl *> MemberPointerPath = MP.getMemberPointerPath();
2966
2967 llvm::Constant *C;
2968 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD)) {
2969 C = EmitMemberFunctionPointer(MD);
2970 } else {
2971 // For a pointer to data member, start off with the offset of the field in
2972 // the class in which it was declared, and convert from there if necessary.
2973 // For indirect field decls, get the outermost anonymous field and use the
2974 // parent class.
2976 CharUnits FieldOffset = Ctx.toCharUnitsFromBits(Ctx.getFieldOffset(MPD));
2977 const FieldDecl *FD = dyn_cast<FieldDecl>(MPD);
2978 if (!FD)
2979 FD = cast<FieldDecl>(*cast<IndirectFieldDecl>(MPD)->chain_begin());
2980 const CXXRecordDecl *RD = cast<CXXRecordDecl>(FD->getParent());
2981 RD = RD->getMostRecentDecl();
2982 C = EmitMemberDataPointer(RD, FieldOffset);
2983 }
2984
2985 if (!MemberPointerPath.empty()) {
2986 const CXXRecordDecl *SrcRD = cast<CXXRecordDecl>(MPD->getDeclContext());
2987 const MemberPointerType *SrcTy =
2989 /*Qualifier=*/std::nullopt, SrcRD)
2990 ->castAs<MemberPointerType>();
2991
2992 bool DerivedMember = MP.isMemberPointerToDerivedMember();
2993 SmallVector<const CXXBaseSpecifier *, 4> DerivedToBasePath;
2994 const CXXRecordDecl *PrevRD = SrcRD;
2995 for (const CXXRecordDecl *PathElem : MemberPointerPath) {
2996 const CXXRecordDecl *Base = nullptr;
2997 const CXXRecordDecl *Derived = nullptr;
2998 if (DerivedMember) {
2999 Base = PathElem;
3000 Derived = PrevRD;
3001 } else {
3002 Base = PrevRD;
3003 Derived = PathElem;
3004 }
3005 for (const CXXBaseSpecifier &BS : Derived->bases())
3006 if (BS.getType()->getAsCXXRecordDecl()->getCanonicalDecl() ==
3007 Base->getCanonicalDecl())
3008 DerivedToBasePath.push_back(&BS);
3009 PrevRD = PathElem;
3010 }
3011 assert(DerivedToBasePath.size() == MemberPointerPath.size());
3012
3013 CastKind CK = DerivedMember ? CK_DerivedToBaseMemberPointer
3014 : CK_BaseToDerivedMemberPointer;
3015 C = EmitMemberPointerConversion(SrcTy, DstTy, CK, DerivedToBasePath.begin(),
3016 DerivedToBasePath.end(), C);
3017 }
3018 return C;
3019}
3020
3021llvm::Constant *
3022MicrosoftCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
3023 assert(MD->isInstance() && "Member function must not be static!");
3024
3025 CharUnits NonVirtualBaseAdjustment = CharUnits::Zero();
3026 const CXXRecordDecl *RD = MD->getParent()->getMostRecentDecl();
3027 CodeGenTypes &Types = CGM.getTypes();
3028
3029 unsigned VBTableIndex = 0;
3030 llvm::Constant *FirstField;
3031 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
3032 if (!MD->isVirtual()) {
3033 llvm::Type *Ty;
3034 // Check whether the function has a computable LLVM signature.
3035 if (Types.isFuncTypeConvertible(FPT)) {
3036 // The function has a computable LLVM signature; use the correct type.
3037 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
3038 } else {
3039 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
3040 // function type is incomplete.
3041 Ty = CGM.PtrDiffTy;
3042 }
3043 FirstField = CGM.GetAddrOfFunction(MD, Ty);
3044 } else {
3045 auto &VTableContext = CGM.getMicrosoftVTableContext();
3046 MethodVFTableLocation ML = VTableContext.getMethodVFTableLocation(MD);
3047 FirstField = EmitVirtualMemPtrThunk(MD, ML);
3048 // Include the vfptr adjustment if the method is in a non-primary vftable.
3049 NonVirtualBaseAdjustment += ML.VFPtrOffset;
3050 if (ML.VBase)
3051 VBTableIndex = VTableContext.getVBTableIndex(RD, ML.VBase) * 4;
3052 }
3053
3054 if (VBTableIndex == 0 &&
3055 RD->getMSInheritanceModel() ==
3056 MSInheritanceModel::Virtual)
3057 NonVirtualBaseAdjustment -= getContext().getOffsetOfBaseWithVBPtr(RD);
3058
3059 // The rest of the fields are common with data member pointers.
3060 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD,
3061 NonVirtualBaseAdjustment, VBTableIndex);
3062}
3063
3064/// Member pointers are the same if they're either bitwise identical *or* both
3065/// null. Null-ness for function members is determined by the first field,
3066/// while for data member pointers we must compare all fields.
3067llvm::Value *
3068MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
3069 llvm::Value *L,
3070 llvm::Value *R,
3071 const MemberPointerType *MPT,
3072 bool Inequality) {
3073 CGBuilderTy &Builder = CGF.Builder;
3074
3075 // Handle != comparisons by switching the sense of all boolean operations.
3076 llvm::ICmpInst::Predicate Eq;
3077 llvm::Instruction::BinaryOps And, Or;
3078 if (Inequality) {
3079 Eq = llvm::ICmpInst::ICMP_NE;
3080 And = llvm::Instruction::Or;
3081 Or = llvm::Instruction::And;
3082 } else {
3083 Eq = llvm::ICmpInst::ICMP_EQ;
3084 And = llvm::Instruction::And;
3085 Or = llvm::Instruction::Or;
3086 }
3087
3088 // If this is a single field member pointer (single inheritance), this is a
3089 // single icmp.
3090 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
3091 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
3093 Inheritance))
3094 return Builder.CreateICmp(Eq, L, R);
3095
3096 // Compare the first field.
3097 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0");
3098 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0");
3099 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first");
3100
3101 // Compare everything other than the first field.
3102 llvm::Value *Res = nullptr;
3103 llvm::StructType *LType = cast<llvm::StructType>(L->getType());
3104 for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) {
3105 llvm::Value *LF = Builder.CreateExtractValue(L, I);
3106 llvm::Value *RF = Builder.CreateExtractValue(R, I);
3107 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest");
3108 if (Res)
3109 Res = Builder.CreateBinOp(And, Res, Cmp);
3110 else
3111 Res = Cmp;
3112 }
3113
3114 // Check if the first field is 0 if this is a function pointer.
3115 if (MPT->isMemberFunctionPointer()) {
3116 // (l1 == r1 && ...) || l0 == 0
3117 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType());
3118 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero");
3119 Res = Builder.CreateBinOp(Or, Res, IsZero);
3120 }
3121
3122 // Combine the comparison of the first field, which must always be true for
3123 // this comparison to succeeed.
3124 return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp");
3125}
3126
3127llvm::Value *
3128MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
3129 llvm::Value *MemPtr,
3130 const MemberPointerType *MPT) {
3131 CGBuilderTy &Builder = CGF.Builder;
3132 llvm::SmallVector<llvm::Constant *, 4> fields;
3133 // We only need one field for member functions.
3134 if (MPT->isMemberFunctionPointer())
3135 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
3136 else
3137 GetNullMemberPointerFields(MPT, fields);
3138 assert(!fields.empty());
3139 llvm::Value *FirstField = MemPtr;
3140 if (MemPtr->getType()->isStructTy())
3141 FirstField = Builder.CreateExtractValue(MemPtr, 0);
3142 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0");
3143
3144 // For function member pointers, we only need to test the function pointer
3145 // field. The other fields if any can be garbage.
3146 if (MPT->isMemberFunctionPointer())
3147 return Res;
3148
3149 // Otherwise, emit a series of compares and combine the results.
3150 for (int I = 1, E = fields.size(); I < E; ++I) {
3151 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I);
3152 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp");
3153 Res = Builder.CreateOr(Res, Next, "memptr.tobool");
3154 }
3155 return Res;
3156}
3157
3158bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT,
3159 llvm::Constant *Val) {
3160 // Function pointers are null if the pointer in the first field is null.
3161 if (MPT->isMemberFunctionPointer()) {
3162 llvm::Constant *FirstField = Val->getType()->isStructTy() ?
3163 Val->getAggregateElement(0U) : Val;
3164 return FirstField->isNullValue();
3165 }
3166
3167 // If it's not a function pointer and it's zero initializable, we can easily
3168 // check zero.
3169 if (isZeroInitializable(MPT) && Val->isNullValue())
3170 return true;
3171
3172 // Otherwise, break down all the fields for comparison. Hopefully these
3173 // little Constants are reused, while a big null struct might not be.
3174 llvm::SmallVector<llvm::Constant *, 4> Fields;
3175 GetNullMemberPointerFields(MPT, Fields);
3176 if (Fields.size() == 1) {
3177 assert(Val->getType()->isIntegerTy());
3178 return Val == Fields[0];
3179 }
3180
3181 unsigned I, E;
3182 for (I = 0, E = Fields.size(); I != E; ++I) {
3183 if (Val->getAggregateElement(I) != Fields[I])
3184 break;
3185 }
3186 return I == E;
3187}
3188
3189llvm::Value *
3190MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
3191 Address This,
3192 llvm::Value *VBPtrOffset,
3193 llvm::Value *VBTableOffset,
3194 llvm::Value **VBPtrOut) {
3195 CGBuilderTy &Builder = CGF.Builder;
3196 // Load the vbtable pointer from the vbptr in the instance.
3197 llvm::Value *VBPtr = Builder.CreateInBoundsGEP(
3198 CGM.Int8Ty, This.emitRawPointer(CGF), VBPtrOffset, "vbptr");
3199 if (VBPtrOut)
3200 *VBPtrOut = VBPtr;
3201
3202 CharUnits VBPtrAlign;
3203 if (auto CI = dyn_cast<llvm::ConstantInt>(VBPtrOffset)) {
3204 VBPtrAlign = This.getAlignment().alignmentAtOffset(
3205 CharUnits::fromQuantity(CI->getSExtValue()));
3206 } else {
3207 VBPtrAlign = CGF.getPointerAlign();
3208 }
3209
3210 llvm::Value *VBTable =
3211 Builder.CreateAlignedLoad(CGM.DefaultPtrTy, VBPtr, VBPtrAlign, "vbtable");
3212
3213 // Translate from byte offset to table index. It improves analyzability.
3214 llvm::Value *VBTableIndex = Builder.CreateAShr(
3215 VBTableOffset, llvm::ConstantInt::get(VBTableOffset->getType(), 2),
3216 "vbtindex", /*isExact=*/true);
3217
3218 // Load an i32 offset from the vb-table.
3219 llvm::Value *VBaseOffs =
3220 Builder.CreateInBoundsGEP(CGM.Int32Ty, VBTable, VBTableIndex);
3221 return Builder.CreateAlignedLoad(CGM.Int32Ty, VBaseOffs,
3222 CharUnits::fromQuantity(4), "vbase_offs");
3223}
3224
3225// Returns an adjusted base cast to i8*, since we do more address arithmetic on
3226// it.
3227llvm::Value *MicrosoftCXXABI::AdjustVirtualBase(
3228 CodeGenFunction &CGF, const Expr *E, const CXXRecordDecl *RD,
3229 Address Base, llvm::Value *VBTableOffset, llvm::Value *VBPtrOffset) {
3230 CGBuilderTy &Builder = CGF.Builder;
3231 Base = Base.withElementType(CGM.Int8Ty);
3232 llvm::BasicBlock *OriginalBB = nullptr;
3233 llvm::BasicBlock *SkipAdjustBB = nullptr;
3234 llvm::BasicBlock *VBaseAdjustBB = nullptr;
3235
3236 // In the unspecified inheritance model, there might not be a vbtable at all,
3237 // in which case we need to skip the virtual base lookup. If there is a
3238 // vbtable, the first entry is a no-op entry that gives back the original
3239 // base, so look for a virtual base adjustment offset of zero.
3240 if (VBPtrOffset) {
3241 OriginalBB = Builder.GetInsertBlock();
3242 VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust");
3243 SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust");
3244 llvm::Value *IsVirtual =
3245 Builder.CreateICmpNE(VBTableOffset, getZeroInt(),
3246 "memptr.is_vbase");
3247 Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB);
3248 CGF.EmitBlock(VBaseAdjustBB);
3249 }
3250
3251 // If we weren't given a dynamic vbptr offset, RD should be complete and we'll
3252 // know the vbptr offset.
3253 if (!VBPtrOffset) {
3254 CharUnits offs = CharUnits::Zero();
3255 if (!RD->hasDefinition()) {
3256 DiagnosticsEngine &Diags = CGF.CGM.getDiags();
3257 Diags.Report(E->getExprLoc(), diag::err_member_ptr_requires_complete_type)
3258 << RD << E->getSourceRange();
3259 } else if (RD->getNumVBases())
3260 offs = getContext().getASTRecordLayout(RD).getVBPtrOffset();
3261 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity());
3262 }
3263 llvm::Value *VBPtr = nullptr;
3264 llvm::Value *VBaseOffs =
3265 GetVBaseOffsetFromVBPtr(CGF, Base, VBPtrOffset, VBTableOffset, &VBPtr);
3266 llvm::Value *AdjustedBase =
3267 Builder.CreateInBoundsGEP(CGM.Int8Ty, VBPtr, VBaseOffs);
3268
3269 // Merge control flow with the case where we didn't have to adjust.
3270 if (VBaseAdjustBB) {
3271 Builder.CreateBr(SkipAdjustBB);
3272 CGF.EmitBlock(SkipAdjustBB);
3273 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base");
3274 Phi->addIncoming(Base.emitRawPointer(CGF), OriginalBB);
3275 Phi->addIncoming(AdjustedBase, VBaseAdjustBB);
3276 return Phi;
3277 }
3278 return AdjustedBase;
3279}
3280
3281llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress(
3282 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
3283 const MemberPointerType *MPT, bool IsInBounds) {
3284 assert(MPT->isMemberDataPointer());
3285 CGBuilderTy &Builder = CGF.Builder;
3286 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
3287 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
3288
3289 // Extract the fields we need, regardless of model. We'll apply them if we
3290 // have them.
3291 llvm::Value *FieldOffset = MemPtr;
3292 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
3293 llvm::Value *VBPtrOffset = nullptr;
3294 if (MemPtr->getType()->isStructTy()) {
3295 // We need to extract values.
3296 unsigned I = 0;
3297 FieldOffset = Builder.CreateExtractValue(MemPtr, I++);
3298 if (inheritanceModelHasVBPtrOffsetField(Inheritance))
3299 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
3301 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
3302 }
3303
3304 llvm::Value *Addr;
3305 if (VirtualBaseAdjustmentOffset) {
3306 Addr = AdjustVirtualBase(CGF, E, RD, Base, VirtualBaseAdjustmentOffset,
3307 VBPtrOffset);
3308 } else {
3309 Addr = Base.emitRawPointer(CGF);
3310 }
3311
3312 // Apply the offset.
3313 return Builder.CreateGEP(CGF.Int8Ty, Addr, FieldOffset, "memptr.offset",
3314 IsInBounds ? llvm::GEPNoWrapFlags::inBounds()
3315 : llvm::GEPNoWrapFlags::none());
3316}
3317
3318llvm::Value *
3319MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
3320 const CastExpr *E,
3321 llvm::Value *Src) {
3322 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
3323 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
3324 E->getCastKind() == CK_ReinterpretMemberPointer);
3325
3326 // Use constant emission if we can.
3327 if (isa<llvm::Constant>(Src))
3328 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src));
3329
3330 // We may be adding or dropping fields from the member pointer, so we need
3331 // both types and the inheritance models of both records.
3332 const MemberPointerType *SrcTy =
3333 E->getSubExpr()->getType()->castAs<MemberPointerType>();
3334 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
3335 bool IsFunc = SrcTy->isMemberFunctionPointer();
3336
3337 // If the classes use the same null representation, reinterpret_cast is a nop.
3338 bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer;
3339 if (IsReinterpret && IsFunc)
3340 return Src;
3341
3342 CXXRecordDecl *SrcRD = SrcTy->getMostRecentCXXRecordDecl();
3343 CXXRecordDecl *DstRD = DstTy->getMostRecentCXXRecordDecl();
3344 if (IsReinterpret &&
3345 SrcRD->nullFieldOffsetIsZero() == DstRD->nullFieldOffsetIsZero())
3346 return Src;
3347
3348 CGBuilderTy &Builder = CGF.Builder;
3349
3350 // Branch past the conversion if Src is null.
3351 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy);
3352 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy);
3353
3354 // C++ 5.2.10p9: The null member pointer value is converted to the null member
3355 // pointer value of the destination type.
3356 if (IsReinterpret) {
3357 // For reinterpret casts, sema ensures that src and dst are both functions
3358 // or data and have the same size, which means the LLVM types should match.
3359 assert(Src->getType() == DstNull->getType());
3360 return Builder.CreateSelect(IsNotNull, Src, DstNull);
3361 }
3362
3363 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock();
3364 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert");
3365 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted");
3366 Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB);
3367 CGF.EmitBlock(ConvertBB);
3368
3369 llvm::Value *Dst = EmitNonNullMemberPointerConversion(
3370 SrcTy, DstTy, E->getCastKind(), E->path_begin(), E->path_end(), Src,
3371 Builder);
3372
3373 Builder.CreateBr(ContinueBB);
3374
3375 // In the continuation, choose between DstNull and Dst.
3376 CGF.EmitBlock(ContinueBB);
3377 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted");
3378 Phi->addIncoming(DstNull, OriginalBB);
3379 Phi->addIncoming(Dst, ConvertBB);
3380 return Phi;
3381}
3382
3383llvm::Value *MicrosoftCXXABI::EmitNonNullMemberPointerConversion(
3384 const MemberPointerType *SrcTy, const MemberPointerType *DstTy, CastKind CK,
3386 CastExpr::path_const_iterator PathEnd, llvm::Value *Src,
3387 CGBuilderTy &Builder) {
3388 const CXXRecordDecl *SrcRD = SrcTy->getMostRecentCXXRecordDecl();
3389 const CXXRecordDecl *DstRD = DstTy->getMostRecentCXXRecordDecl();
3390 MSInheritanceModel SrcInheritance = SrcRD->getMSInheritanceModel();
3391 MSInheritanceModel DstInheritance = DstRD->getMSInheritanceModel();
3392 bool IsFunc = SrcTy->isMemberFunctionPointer();
3393 bool IsConstant = isa<llvm::Constant>(Src);
3394
3395 // Decompose src.
3396 llvm::Value *FirstField = Src;
3397 llvm::Value *NonVirtualBaseAdjustment = getZeroInt();
3398 llvm::Value *VirtualBaseAdjustmentOffset = getZeroInt();
3399 llvm::Value *VBPtrOffset = getZeroInt();
3400 if (!inheritanceModelHasOnlyOneField(IsFunc, SrcInheritance)) {
3401 // We need to extract values.
3402 unsigned I = 0;
3403 FirstField = Builder.CreateExtractValue(Src, I++);
3404 if (inheritanceModelHasNVOffsetField(IsFunc, SrcInheritance))
3405 NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++);
3406 if (inheritanceModelHasVBPtrOffsetField(SrcInheritance))
3407 VBPtrOffset = Builder.CreateExtractValue(Src, I++);
3408 if (inheritanceModelHasVBTableOffsetField(SrcInheritance))
3409 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++);
3410 }
3411
3412 bool IsDerivedToBase = (CK == CK_DerivedToBaseMemberPointer);
3413 const MemberPointerType *DerivedTy = IsDerivedToBase ? SrcTy : DstTy;
3414 const CXXRecordDecl *DerivedClass = DerivedTy->getMostRecentCXXRecordDecl();
3415
3416 // For data pointers, we adjust the field offset directly. For functions, we
3417 // have a separate field.
3418 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField;
3419
3420 // The virtual inheritance model has a quirk: the virtual base table is always
3421 // referenced when dereferencing a member pointer even if the member pointer
3422 // is non-virtual. This is accounted for by adjusting the non-virtual offset
3423 // to point backwards to the top of the MDC from the first VBase. Undo this
3424 // adjustment to normalize the member pointer.
3425 llvm::Value *SrcVBIndexEqZero =
3426 Builder.CreateICmpEQ(VirtualBaseAdjustmentOffset, getZeroInt());
3427 if (SrcInheritance == MSInheritanceModel::Virtual) {
3428 if (int64_t SrcOffsetToFirstVBase =
3429 getContext().getOffsetOfBaseWithVBPtr(SrcRD).getQuantity()) {
3430 llvm::Value *UndoSrcAdjustment = Builder.CreateSelect(
3431 SrcVBIndexEqZero,
3432 llvm::ConstantInt::get(CGM.IntTy, SrcOffsetToFirstVBase),
3433 getZeroInt());
3434 NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, UndoSrcAdjustment);
3435 }
3436 }
3437
3438 // A non-zero vbindex implies that we are dealing with a source member in a
3439 // floating virtual base in addition to some non-virtual offset. If the
3440 // vbindex is zero, we are dealing with a source that exists in a non-virtual,
3441 // fixed, base. The difference between these two cases is that the vbindex +
3442 // nvoffset *always* point to the member regardless of what context they are
3443 // evaluated in so long as the vbindex is adjusted. A member inside a fixed
3444 // base requires explicit nv adjustment.
3445 llvm::Constant *BaseClassOffset = llvm::ConstantInt::get(
3446 CGM.IntTy,
3447 CGM.computeNonVirtualBaseClassOffset(DerivedClass, PathBegin, PathEnd)
3448 .getQuantity());
3449
3450 llvm::Value *NVDisp;
3451 if (IsDerivedToBase)
3452 NVDisp = Builder.CreateNSWSub(NVAdjustField, BaseClassOffset, "adj");
3453 else
3454 NVDisp = Builder.CreateNSWAdd(NVAdjustField, BaseClassOffset, "adj");
3455
3456 NVAdjustField = Builder.CreateSelect(SrcVBIndexEqZero, NVDisp, getZeroInt());
3457
3458 // Update the vbindex to an appropriate value in the destination because
3459 // SrcRD's vbtable might not be a strict prefix of the one in DstRD.
3460 llvm::Value *DstVBIndexEqZero = SrcVBIndexEqZero;
3461 if (inheritanceModelHasVBTableOffsetField(DstInheritance) &&
3462 inheritanceModelHasVBTableOffsetField(SrcInheritance)) {
3463 if (llvm::GlobalVariable *VDispMap =
3464 getAddrOfVirtualDisplacementMap(SrcRD, DstRD)) {
3465 llvm::Value *VBIndex = Builder.CreateExactUDiv(
3466 VirtualBaseAdjustmentOffset, llvm::ConstantInt::get(CGM.IntTy, 4));
3467 if (IsConstant) {
3468 llvm::Constant *Mapping = VDispMap->getInitializer();
3469 VirtualBaseAdjustmentOffset =
3470 Mapping->getAggregateElement(cast<llvm::Constant>(VBIndex));
3471 } else {
3472 llvm::Value *Idxs[] = {getZeroInt(), VBIndex};
3473 VirtualBaseAdjustmentOffset = Builder.CreateAlignedLoad(
3474 CGM.IntTy, Builder.CreateInBoundsGEP(VDispMap->getValueType(),
3475 VDispMap, Idxs),
3477 }
3478
3479 DstVBIndexEqZero =
3480 Builder.CreateICmpEQ(VirtualBaseAdjustmentOffset, getZeroInt());
3481 }
3482 }
3483
3484 // Set the VBPtrOffset to zero if the vbindex is zero. Otherwise, initialize
3485 // it to the offset of the vbptr.
3486 if (inheritanceModelHasVBPtrOffsetField(DstInheritance)) {
3487 llvm::Value *DstVBPtrOffset = llvm::ConstantInt::getSigned(
3488 CGM.IntTy,
3489 getContext().getASTRecordLayout(DstRD).getVBPtrOffset().getQuantity());
3490 VBPtrOffset =
3491 Builder.CreateSelect(DstVBIndexEqZero, getZeroInt(), DstVBPtrOffset);
3492 }
3493
3494 // Likewise, apply a similar adjustment so that dereferencing the member
3495 // pointer correctly accounts for the distance between the start of the first
3496 // virtual base and the top of the MDC.
3497 if (DstInheritance == MSInheritanceModel::Virtual) {
3498 if (int64_t DstOffsetToFirstVBase =
3499 getContext().getOffsetOfBaseWithVBPtr(DstRD).getQuantity()) {
3500 llvm::Value *DoDstAdjustment = Builder.CreateSelect(
3501 DstVBIndexEqZero,
3502 llvm::ConstantInt::get(CGM.IntTy, DstOffsetToFirstVBase),
3503 getZeroInt());
3504 NVAdjustField = Builder.CreateNSWSub(NVAdjustField, DoDstAdjustment);
3505 }
3506 }
3507
3508 // Recompose dst from the null struct and the adjusted fields from src.
3509 llvm::Value *Dst;
3510 if (inheritanceModelHasOnlyOneField(IsFunc, DstInheritance)) {
3511 Dst = FirstField;
3512 } else {
3513 Dst = llvm::PoisonValue::get(ConvertMemberPointerType(DstTy));
3514 unsigned Idx = 0;
3515 Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++);
3516 if (inheritanceModelHasNVOffsetField(IsFunc, DstInheritance))
3517 Dst = Builder.CreateInsertValue(Dst, NonVirtualBaseAdjustment, Idx++);
3518 if (inheritanceModelHasVBPtrOffsetField(DstInheritance))
3519 Dst = Builder.CreateInsertValue(Dst, VBPtrOffset, Idx++);
3520 if (inheritanceModelHasVBTableOffsetField(DstInheritance))
3521 Dst = Builder.CreateInsertValue(Dst, VirtualBaseAdjustmentOffset, Idx++);
3522 }
3523 return Dst;
3524}
3525
3526llvm::Constant *
3527MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E,
3528 llvm::Constant *Src) {
3529 const MemberPointerType *SrcTy =
3530 E->getSubExpr()->getType()->castAs<MemberPointerType>();
3531 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
3532
3533 CastKind CK = E->getCastKind();
3534
3535 return EmitMemberPointerConversion(SrcTy, DstTy, CK, E->path_begin(),
3536 E->path_end(), Src);
3537}
3538
3539llvm::Constant *MicrosoftCXXABI::EmitMemberPointerConversion(
3540 const MemberPointerType *SrcTy, const MemberPointerType *DstTy, CastKind CK,
3542 CastExpr::path_const_iterator PathEnd, llvm::Constant *Src) {
3543 assert(CK == CK_DerivedToBaseMemberPointer ||
3544 CK == CK_BaseToDerivedMemberPointer ||
3545 CK == CK_ReinterpretMemberPointer);
3546 // If src is null, emit a new null for dst. We can't return src because dst
3547 // might have a new representation.
3548 if (MemberPointerConstantIsNull(SrcTy, Src))
3549 return EmitNullMemberPointer(DstTy);
3550
3551 // We don't need to do anything for reinterpret_casts of non-null member
3552 // pointers. We should only get here when the two type representations have
3553 // the same size.
3554 if (CK == CK_ReinterpretMemberPointer)
3555 return Src;
3556
3557 CGBuilderTy Builder(CGM, CGM.getLLVMContext());
3558 auto *Dst = cast<llvm::Constant>(EmitNonNullMemberPointerConversion(
3559 SrcTy, DstTy, CK, PathBegin, PathEnd, Src, Builder));
3560
3561 return Dst;
3562}
3563
3564CGCallee MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(
3565 CodeGenFunction &CGF, const Expr *E, Address This,
3566 llvm::Value *&ThisPtrForCall, llvm::Value *MemPtr,
3567 const MemberPointerType *MPT) {
3568 assert(MPT->isMemberFunctionPointer());
3569 const FunctionProtoType *FPT =
3570 MPT->getPointeeType()->castAs<FunctionProtoType>();
3571 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
3572 CGBuilderTy &Builder = CGF.Builder;
3573
3574 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
3575
3576 // Extract the fields we need, regardless of model. We'll apply them if we
3577 // have them.
3578 llvm::Value *FunctionPointer = MemPtr;
3579 llvm::Value *NonVirtualBaseAdjustment = nullptr;
3580 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
3581 llvm::Value *VBPtrOffset = nullptr;
3582 if (MemPtr->getType()->isStructTy()) {
3583 // We need to extract values.
3584 unsigned I = 0;
3585 FunctionPointer = Builder.CreateExtractValue(MemPtr, I++);
3586 if (inheritanceModelHasNVOffsetField(MPT, Inheritance))
3587 NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++);
3588 if (inheritanceModelHasVBPtrOffsetField(Inheritance))
3589 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
3591 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
3592 }
3593
3594 if (VirtualBaseAdjustmentOffset) {
3595 ThisPtrForCall = AdjustVirtualBase(CGF, E, RD, This,
3596 VirtualBaseAdjustmentOffset, VBPtrOffset);
3597 } else {
3598 ThisPtrForCall = This.emitRawPointer(CGF);
3599 }
3600
3601 if (NonVirtualBaseAdjustment)
3602 ThisPtrForCall = Builder.CreateInBoundsGEP(CGF.Int8Ty, ThisPtrForCall,
3603 NonVirtualBaseAdjustment);
3604
3605 CGCallee Callee(FPT, FunctionPointer);
3606 return Callee;
3607}
3608
3610 return new MicrosoftCXXABI(CGM);
3611}
3612
3613// MS RTTI Overview:
3614// The run time type information emitted by cl.exe contains 5 distinct types of
3615// structures. Many of them reference each other.
3616//
3617// TypeInfo: Static classes that are returned by typeid.
3618//
3619// CompleteObjectLocator: Referenced by vftables. They contain information
3620// required for dynamic casting, including OffsetFromTop. They also contain
3621// a reference to the TypeInfo for the type and a reference to the
3622// CompleteHierarchyDescriptor for the type.
3623//
3624// ClassHierarchyDescriptor: Contains information about a class hierarchy.
3625// Used during dynamic_cast to walk a class hierarchy. References a base
3626// class array and the size of said array.
3627//
3628// BaseClassArray: Contains a list of classes in a hierarchy. BaseClassArray is
3629// somewhat of a misnomer because the most derived class is also in the list
3630// as well as multiple copies of virtual bases (if they occur multiple times
3631// in the hierarchy.) The BaseClassArray contains one BaseClassDescriptor for
3632// every path in the hierarchy, in pre-order depth first order. Note, we do
3633// not declare a specific llvm type for BaseClassArray, it's merely an array
3634// of BaseClassDescriptor pointers.
3635//
3636// BaseClassDescriptor: Contains information about a class in a class hierarchy.
3637// BaseClassDescriptor is also somewhat of a misnomer for the same reason that
3638// BaseClassArray is. It contains information about a class within a
3639// hierarchy such as: is this base is ambiguous and what is its offset in the
3640// vbtable. The names of the BaseClassDescriptors have all of their fields
3641// mangled into them so they can be aggressively deduplicated by the linker.
3642
3643static llvm::GlobalVariable *getTypeInfoVTable(CodeGenModule &CGM) {
3644 StringRef MangledName("??_7type_info@@6B@");
3645 if (auto VTable = CGM.getModule().getNamedGlobal(MangledName))
3646 return VTable;
3647 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
3648 /*isConstant=*/true,
3649 llvm::GlobalVariable::ExternalLinkage,
3650 /*Initializer=*/nullptr, MangledName);
3651}
3652
3653namespace {
3654
3655/// A Helper struct that stores information about a class in a class
3656/// hierarchy. The information stored in these structs struct is used during
3657/// the generation of ClassHierarchyDescriptors and BaseClassDescriptors.
3658// During RTTI creation, MSRTTIClasses are stored in a contiguous array with
3659// implicit depth first pre-order tree connectivity. getFirstChild and
3660// getNextSibling allow us to walk the tree efficiently.
3661struct MSRTTIClass {
3662 enum {
3663 IsPrivateOnPath = 1 | 8,
3664 IsAmbiguous = 2,
3665 IsPrivate = 4,
3666 IsVirtual = 16,
3667 HasHierarchyDescriptor = 64
3668 };
3669 MSRTTIClass(const CXXRecordDecl *RD) : RD(RD) {}
3670 uint32_t initialize(const MSRTTIClass *Parent,
3671 const CXXBaseSpecifier *Specifier);
3672
3673 MSRTTIClass *getFirstChild() { return this + 1; }
3674 static MSRTTIClass *getNextChild(MSRTTIClass *Child) {
3675 return Child + 1 + Child->NumBases;
3676 }
3677
3678 const CXXRecordDecl *RD, *VirtualRoot;
3679 uint32_t Flags, NumBases, OffsetInVBase;
3680};
3681
3682/// Recursively initialize the base class array.
3683uint32_t MSRTTIClass::initialize(const MSRTTIClass *Parent,
3684 const CXXBaseSpecifier *Specifier) {
3685 Flags = HasHierarchyDescriptor;
3686 if (!Parent) {
3687 VirtualRoot = nullptr;
3688 OffsetInVBase = 0;
3689 } else {
3690 if (Specifier->getAccessSpecifier() != AS_public)
3691 Flags |= IsPrivate | IsPrivateOnPath;
3692 if (Specifier->isVirtual()) {
3693 Flags |= IsVirtual;
3694 VirtualRoot = RD;
3695 OffsetInVBase = 0;
3696 } else {
3697 if (Parent->Flags & IsPrivateOnPath)
3698 Flags |= IsPrivateOnPath;
3699 VirtualRoot = Parent->VirtualRoot;
3700 OffsetInVBase = Parent->OffsetInVBase + RD->getASTContext()
3701 .getASTRecordLayout(Parent->RD).getBaseClassOffset(RD).getQuantity();
3702 }
3703 }
3704 NumBases = 0;
3705 MSRTTIClass *Child = getFirstChild();
3706 for (const CXXBaseSpecifier &Base : RD->bases()) {
3707 NumBases += Child->initialize(this, &Base) + 1;
3708 Child = getNextChild(Child);
3709 }
3710 return NumBases;
3711}
3712
3713static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) {
3714 switch (Ty->getLinkage()) {
3715 case Linkage::Invalid:
3716 llvm_unreachable("Linkage hasn't been computed!");
3717
3718 case Linkage::None:
3719 case Linkage::Internal:
3720 case Linkage::UniqueExternal:
3721 return llvm::GlobalValue::InternalLinkage;
3722
3723 case Linkage::VisibleNone:
3724 case Linkage::Module:
3725 case Linkage::External:
3726 return llvm::GlobalValue::LinkOnceODRLinkage;
3727 }
3728 llvm_unreachable("Invalid linkage!");
3729}
3730
3731/// An ephemeral helper class for building MS RTTI types. It caches some
3732/// calls to the module and information about the most derived class in a
3733/// hierarchy.
3734struct MSRTTIBuilder {
3735 enum {
3736 HasBranchingHierarchy = 1,
3737 HasVirtualBranchingHierarchy = 2,
3738 HasAmbiguousBases = 4
3739 };
3740
3741 MSRTTIBuilder(MicrosoftCXXABI &ABI, const CXXRecordDecl *RD)
3742 : CGM(ABI.CGM), Context(CGM.getContext()),
3743 VMContext(CGM.getLLVMContext()), Module(CGM.getModule()), RD(RD),
3744 Linkage(getLinkageForRTTI(CGM.getContext().getCanonicalTagType(RD))),
3745 ABI(ABI) {}
3746
3747 llvm::GlobalVariable *getBaseClassDescriptor(const MSRTTIClass &Classes);
3748 llvm::GlobalVariable *
3749 getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes);
3750 llvm::GlobalVariable *getClassHierarchyDescriptor();
3751 llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo &Info);
3752
3753 CodeGenModule &CGM;
3754 ASTContext &Context;
3755 llvm::LLVMContext &VMContext;
3756 llvm::Module &Module;
3757 const CXXRecordDecl *RD;
3758 llvm::GlobalVariable::LinkageTypes Linkage;
3759 MicrosoftCXXABI &ABI;
3760};
3761
3762} // namespace
3763
3764/// Recursively serializes a class hierarchy in pre-order depth first
3765/// order.
3767 const CXXRecordDecl *RD) {
3768 Classes.push_back(MSRTTIClass(RD));
3769 for (const CXXBaseSpecifier &Base : RD->bases())
3770 serializeClassHierarchy(Classes, Base.getType()->getAsCXXRecordDecl());
3771}
3772
3773/// Find ambiguity among base classes.
3774static void
3779 for (MSRTTIClass *Class = &Classes.front(); Class <= &Classes.back();) {
3780 if ((Class->Flags & MSRTTIClass::IsVirtual) &&
3781 !VirtualBases.insert(Class->RD).second) {
3782 Class = MSRTTIClass::getNextChild(Class);
3783 continue;
3784 }
3785 if (!UniqueBases.insert(Class->RD).second)
3786 AmbiguousBases.insert(Class->RD);
3787 Class++;
3788 }
3789 if (AmbiguousBases.empty())
3790 return;
3791 for (MSRTTIClass &Class : Classes)
3792 if (AmbiguousBases.count(Class.RD))
3793 Class.Flags |= MSRTTIClass::IsAmbiguous;
3794}
3795
3796llvm::GlobalVariable *MSRTTIBuilder::getClassHierarchyDescriptor() {
3797 SmallString<256> MangledName;
3798 {
3799 llvm::raw_svector_ostream Out(MangledName);
3800 ABI.getMangleContext().mangleCXXRTTIClassHierarchyDescriptor(RD, Out);
3801 }
3802
3803 // Check to see if we've already declared this ClassHierarchyDescriptor.
3804 if (auto CHD = Module.getNamedGlobal(MangledName))
3805 return CHD;
3806
3807 // Serialize the class hierarchy and initialize the CHD Fields.
3808 SmallVector<MSRTTIClass, 8> Classes;
3809 serializeClassHierarchy(Classes, RD);
3810 Classes.front().initialize(/*Parent=*/nullptr, /*Specifier=*/nullptr);
3811 detectAmbiguousBases(Classes);
3812 int Flags = 0;
3813 for (const MSRTTIClass &Class : Classes) {
3814 if (Class.RD->getNumBases() > 1)
3815 Flags |= HasBranchingHierarchy;
3816 // Note: cl.exe does not calculate "HasAmbiguousBases" correctly. We
3817 // believe the field isn't actually used.
3818 if (Class.Flags & MSRTTIClass::IsAmbiguous)
3819 Flags |= HasAmbiguousBases;
3820 }
3821 if ((Flags & HasBranchingHierarchy) && RD->getNumVBases() != 0)
3822 Flags |= HasVirtualBranchingHierarchy;
3823
3824 // Forward-declare the class hierarchy descriptor
3825 auto Type = ABI.getClassHierarchyDescriptorType();
3826 auto CHD = new llvm::GlobalVariable(Module, Type, /*isConstant=*/true, Linkage,
3827 /*Initializer=*/nullptr,
3828 MangledName);
3829 if (CHD->isWeakForLinker())
3830 CHD->setComdat(CGM.getModule().getOrInsertComdat(CHD->getName()));
3831
3832 auto *Bases = getBaseClassArray(Classes);
3833
3834 // Initialize the base class ClassHierarchyDescriptor.
3835 llvm::Constant *Fields[] = {
3836 llvm::ConstantInt::get(CGM.IntTy, 0), // reserved by the runtime
3837 llvm::ConstantInt::get(CGM.IntTy, Flags),
3838 llvm::ConstantInt::get(CGM.IntTy, Classes.size()),
3839 ABI.getImageRelativeConstant(Bases)
3840 };
3841 CHD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
3842 return CHD;
3843}
3844
3845llvm::GlobalVariable *
3846MSRTTIBuilder::getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes) {
3847 SmallString<256> MangledName;
3848 {
3849 llvm::raw_svector_ostream Out(MangledName);
3850 ABI.getMangleContext().mangleCXXRTTIBaseClassArray(RD, Out);
3851 }
3852
3853 // Forward-declare the base class array.
3854 // cl.exe pads the base class array with 1 (in 32 bit mode) or 4 (in 64 bit
3855 // mode) bytes of padding. We provide a pointer sized amount of padding by
3856 // adding +1 to Classes.size(). The sections have pointer alignment and are
3857 // marked pick-any so it shouldn't matter.
3858 llvm::Type *PtrType = ABI.getImageRelativeType(CGM.DefaultPtrTy);
3859 auto *ArrType = llvm::ArrayType::get(PtrType, Classes.size() + 1);
3860 auto *BCA =
3861 new llvm::GlobalVariable(Module, ArrType,
3862 /*isConstant=*/true, Linkage,
3863 /*Initializer=*/nullptr, MangledName);
3864 if (BCA->isWeakForLinker())
3865 BCA->setComdat(CGM.getModule().getOrInsertComdat(BCA->getName()));
3866
3867 // Initialize the BaseClassArray.
3868 SmallVector<llvm::Constant *, 8> BaseClassArrayData;
3869 for (MSRTTIClass &Class : Classes)
3870 BaseClassArrayData.push_back(
3871 ABI.getImageRelativeConstant(getBaseClassDescriptor(Class)));
3872 BaseClassArrayData.push_back(llvm::Constant::getNullValue(PtrType));
3873 BCA->setInitializer(llvm::ConstantArray::get(ArrType, BaseClassArrayData));
3874 return BCA;
3875}
3876
3877llvm::GlobalVariable *
3878MSRTTIBuilder::getBaseClassDescriptor(const MSRTTIClass &Class) {
3879 // Compute the fields for the BaseClassDescriptor. They are computed up front
3880 // because they are mangled into the name of the object.
3881 uint32_t OffsetInVBTable = 0;
3882 int32_t VBPtrOffset = -1;
3883 if (Class.VirtualRoot) {
3884 auto &VTableContext = CGM.getMicrosoftVTableContext();
3885 OffsetInVBTable = VTableContext.getVBTableIndex(RD, Class.VirtualRoot) * 4;
3886 VBPtrOffset = Context.getASTRecordLayout(RD).getVBPtrOffset().getQuantity();
3887 }
3888
3889 SmallString<256> MangledName;
3890 {
3891 llvm::raw_svector_ostream Out(MangledName);
3892 ABI.getMangleContext().mangleCXXRTTIBaseClassDescriptor(
3893 Class.RD, Class.OffsetInVBase, VBPtrOffset, OffsetInVBTable,
3894 Class.Flags, Out);
3895 }
3896
3897 // Check to see if we've already declared this object.
3898 if (auto BCD = Module.getNamedGlobal(MangledName))
3899 return BCD;
3900
3901 // Forward-declare the base class descriptor.
3902 auto Type = ABI.getBaseClassDescriptorType();
3903 auto BCD =
3904 new llvm::GlobalVariable(Module, Type, /*isConstant=*/true, Linkage,
3905 /*Initializer=*/nullptr, MangledName);
3906 if (BCD->isWeakForLinker())
3907 BCD->setComdat(CGM.getModule().getOrInsertComdat(BCD->getName()));
3908
3909 // Initialize the BaseClassDescriptor.
3910 llvm::Constant *Fields[] = {
3911 ABI.getImageRelativeConstant(
3912 ABI.getAddrOfRTTIDescriptor(Context.getCanonicalTagType(Class.RD))),
3913 llvm::ConstantInt::get(CGM.IntTy, Class.NumBases),
3914 llvm::ConstantInt::get(CGM.IntTy, Class.OffsetInVBase),
3915 llvm::ConstantInt::getSigned(CGM.IntTy, VBPtrOffset),
3916 llvm::ConstantInt::get(CGM.IntTy, OffsetInVBTable),
3917 llvm::ConstantInt::get(CGM.IntTy, Class.Flags),
3918 ABI.getImageRelativeConstant(
3919 MSRTTIBuilder(ABI, Class.RD).getClassHierarchyDescriptor()),
3920 };
3921 BCD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
3922 return BCD;
3923}
3924
3925llvm::GlobalVariable *
3926MSRTTIBuilder::getCompleteObjectLocator(const VPtrInfo &Info) {
3927 SmallString<256> MangledName;
3928 {
3929 llvm::raw_svector_ostream Out(MangledName);
3930 ABI.getMangleContext().mangleCXXRTTICompleteObjectLocator(RD, Info.MangledPath, Out);
3931 }
3932
3933 // Check to see if we've already computed this complete object locator.
3934 if (auto COL = Module.getNamedGlobal(MangledName))
3935 return COL;
3936
3937 // Compute the fields of the complete object locator.
3938 int OffsetToTop = Info.FullOffsetInMDC.getQuantity();
3939 int VFPtrOffset = 0;
3940 // The offset includes the vtordisp if one exists.
3941 if (const CXXRecordDecl *VBase = Info.getVBaseWithVPtr())
3942 if (Context.getASTRecordLayout(RD)
3944 .find(VBase)
3945 ->second.hasVtorDisp())
3946 VFPtrOffset = Info.NonVirtualOffset.getQuantity() + 4;
3947
3948 // Forward-declare the complete object locator.
3949 llvm::StructType *Type = ABI.getCompleteObjectLocatorType();
3950 auto COL = new llvm::GlobalVariable(Module, Type, /*isConstant=*/true, Linkage,
3951 /*Initializer=*/nullptr, MangledName);
3952
3953 // Initialize the CompleteObjectLocator.
3954 llvm::Constant *Fields[] = {
3955 llvm::ConstantInt::get(CGM.IntTy, ABI.isImageRelative()),
3956 llvm::ConstantInt::get(CGM.IntTy, OffsetToTop),
3957 llvm::ConstantInt::get(CGM.IntTy, VFPtrOffset),
3958 ABI.getImageRelativeConstant(
3960 ABI.getImageRelativeConstant(getClassHierarchyDescriptor()),
3961 ABI.getImageRelativeConstant(COL),
3962 };
3963 llvm::ArrayRef<llvm::Constant *> FieldsRef(Fields);
3964 if (!ABI.isImageRelative())
3965 FieldsRef = FieldsRef.drop_back();
3966 COL->setInitializer(llvm::ConstantStruct::get(Type, FieldsRef));
3967 if (COL->isWeakForLinker())
3968 COL->setComdat(CGM.getModule().getOrInsertComdat(COL->getName()));
3969 return COL;
3970}
3971
3973 bool &IsConst, bool &IsVolatile,
3974 bool &IsUnaligned) {
3975 T = Context.getExceptionObjectType(T);
3976
3977 // C++14 [except.handle]p3:
3978 // A handler is a match for an exception object of type E if [...]
3979 // - the handler is of type cv T or const T& where T is a pointer type and
3980 // E is a pointer type that can be converted to T by [...]
3981 // - a qualification conversion
3982 IsConst = false;
3983 IsVolatile = false;
3984 IsUnaligned = false;
3985 QualType PointeeType = T->getPointeeType();
3986 if (!PointeeType.isNull()) {
3987 IsConst = PointeeType.isConstQualified();
3988 IsVolatile = PointeeType.isVolatileQualified();
3989 IsUnaligned = PointeeType.getQualifiers().hasUnaligned();
3990 }
3991
3992 // Member pointer types like "const int A::*" are represented by having RTTI
3993 // for "int A::*" and separately storing the const qualifier.
3994 if (const auto *MPTy = T->getAs<MemberPointerType>())
3995 T = Context.getMemberPointerType(PointeeType.getUnqualifiedType(),
3996 MPTy->getQualifier(),
3997 MPTy->getMostRecentCXXRecordDecl());
3998
3999 // Pointer types like "const int * const *" are represented by having RTTI
4000 // for "const int **" and separately storing the const qualifier.
4001 if (T->isPointerType())
4002 T = Context.getPointerType(PointeeType.getUnqualifiedType());
4003
4004 return T;
4005}
4006
4007CatchTypeInfo
4008MicrosoftCXXABI::getAddrOfCXXCatchHandlerType(QualType Type,
4009 QualType CatchHandlerType) {
4010 // TypeDescriptors for exceptions never have qualified pointer types,
4011 // qualifiers are stored separately in order to support qualification
4012 // conversions.
4013 bool IsConst, IsVolatile, IsUnaligned;
4014 Type =
4015 decomposeTypeForEH(getContext(), Type, IsConst, IsVolatile, IsUnaligned);
4016
4017 bool IsReference = CatchHandlerType->isReferenceType();
4018
4019 uint32_t Flags = 0;
4020 if (IsConst)
4021 Flags |= 1;
4022 if (IsVolatile)
4023 Flags |= 2;
4024 if (IsUnaligned)
4025 Flags |= 4;
4026 if (IsReference)
4027 Flags |= 8;
4028
4029 return CatchTypeInfo{getAddrOfRTTIDescriptor(Type)->stripPointerCasts(),
4030 Flags};
4031}
4032
4033/// Gets a TypeDescriptor. Returns a llvm::Constant * rather than a
4034/// llvm::GlobalVariable * because different type descriptors have different
4035/// types, and need to be abstracted. They are abstracting by casting the
4036/// address to an Int8PtrTy.
4037llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) {
4038 SmallString<256> MangledName;
4039 {
4040 llvm::raw_svector_ostream Out(MangledName);
4041 getMangleContext().mangleCXXRTTI(Type, Out);
4042 }
4043
4044 // Check to see if we've already declared this TypeDescriptor.
4045 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
4046 return GV;
4047
4048 // Note for the future: If we would ever like to do deferred emission of
4049 // RTTI, check if emitting vtables opportunistically need any adjustment.
4050
4051 // Compute the fields for the TypeDescriptor.
4052 SmallString<256> TypeInfoString;
4053 {
4054 llvm::raw_svector_ostream Out(TypeInfoString);
4055 getMangleContext().mangleCXXRTTIName(Type, Out);
4056 }
4057
4058 // Declare and initialize the TypeDescriptor.
4059 llvm::Constant *Fields[] = {
4060 getTypeInfoVTable(CGM), // VFPtr
4061 llvm::ConstantPointerNull::get(CGM.Int8PtrTy), // Runtime data
4062 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), TypeInfoString)};
4063 llvm::StructType *TypeDescriptorType =
4064 getTypeDescriptorType(TypeInfoString);
4065 auto *Var = new llvm::GlobalVariable(
4066 CGM.getModule(), TypeDescriptorType, /*isConstant=*/false,
4067 getLinkageForRTTI(Type),
4068 llvm::ConstantStruct::get(TypeDescriptorType, Fields),
4069 MangledName);
4070 if (Var->isWeakForLinker())
4071 Var->setComdat(CGM.getModule().getOrInsertComdat(Var->getName()));
4072 return Var;
4073}
4074
4075/// Gets or a creates a Microsoft CompleteObjectLocator.
4076llvm::GlobalVariable *
4077MicrosoftCXXABI::getMSCompleteObjectLocator(const CXXRecordDecl *RD,
4078 const VPtrInfo &Info) {
4079 return MSRTTIBuilder(*this, RD).getCompleteObjectLocator(Info);
4080}
4081
4082void MicrosoftCXXABI::emitCXXStructor(GlobalDecl GD) {
4083 if (auto *ctor = dyn_cast<CXXConstructorDecl>(GD.getDecl())) {
4084 // There are no constructor variants, always emit the complete destructor.
4085 llvm::Function *Fn =
4087 CGM.maybeSetTrivialComdat(*ctor, *Fn);
4088 return;
4089 }
4090
4091 auto *dtor = cast<CXXDestructorDecl>(GD.getDecl());
4092
4093 // Emit the base destructor if the base and complete (vbase) destructors are
4094 // equivalent. This effectively implements -mconstructor-aliases as part of
4095 // the ABI.
4096 if (GD.getDtorType() == Dtor_Complete &&
4097 dtor->getParent()->getNumVBases() == 0)
4098 GD = GD.getWithDtorType(Dtor_Base);
4099
4100 // The base destructor is equivalent to the base destructor of its
4101 // base class if there is exactly one non-virtual base class with a
4102 // non-trivial destructor, there are no fields with a non-trivial
4103 // destructor, and the body of the destructor is trivial.
4104 if (GD.getDtorType() == Dtor_Base && !CGM.TryEmitBaseDestructorAsAlias(dtor))
4105 return;
4106
4107 if (GD.getDtorType() == Dtor_VectorDeleting &&
4108 !CGM.classNeedsVectorDestructor(dtor->getParent())) {
4109 // Create GlobalDecl object with the correct type for the scalar
4110 // deleting destructor.
4111 GlobalDecl ScalarDtorGD(dtor, Dtor_Deleting);
4112
4113 // Emit an alias from the vector deleting destructor to the scalar deleting
4114 // destructor.
4115 CGM.EmitDefinitionAsAlias(GD, ScalarDtorGD);
4116 return;
4117 }
4118
4119 llvm::Function *Fn = CGM.codegenCXXStructor(GD);
4120 if (Fn->isWeakForLinker())
4121 Fn->setComdat(CGM.getModule().getOrInsertComdat(Fn->getName()));
4122}
4123
4124llvm::Function *
4125MicrosoftCXXABI::getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD,
4126 CXXCtorType CT) {
4127 assert(CT == Ctor_CopyingClosure || CT == Ctor_DefaultClosure);
4128
4129 // Calculate the mangled name.
4130 SmallString<256> ThunkName;
4131 llvm::raw_svector_ostream Out(ThunkName);
4132 getMangleContext().mangleName(GlobalDecl(CD, CT), Out);
4133
4134 // If the thunk has been generated previously, just return it.
4135 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName))
4136 return cast<llvm::Function>(GV);
4137
4138 // Create the llvm::Function.
4139 const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeMSCtorClosure(CD, CT);
4140 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
4141 const CXXRecordDecl *RD = CD->getParent();
4142 CanQualType RecordTy = getContext().getCanonicalTagType(RD);
4143 llvm::Function *ThunkFn = llvm::Function::Create(
4144 ThunkTy, getLinkageForRTTI(RecordTy), ThunkName.str(), &CGM.getModule());
4145 ThunkFn->setCallingConv(static_cast<llvm::CallingConv::ID>(
4147 if (ThunkFn->isWeakForLinker())
4148 ThunkFn->setComdat(CGM.getModule().getOrInsertComdat(ThunkFn->getName()));
4149 bool IsCopy = CT == Ctor_CopyingClosure;
4150
4151 // Start codegen.
4152 CodeGenFunction CGF(CGM);
4153 CGF.CurGD = GlobalDecl(CD, Ctor_Complete);
4154
4155 // Build FunctionArgs.
4156 FunctionArgList FunctionArgs;
4157
4158 // A constructor always starts with a 'this' pointer as its first argument.
4159 buildThisParam(CGF, FunctionArgs);
4160
4161 // Following the 'this' pointer is a reference to the source object that we
4162 // are copying from.
4163 auto *SrcParam = ImplicitParamDecl::Create(
4164 getContext(), /*DC=*/nullptr, SourceLocation(),
4165 &getContext().Idents.get("src"),
4166 getContext().getLValueReferenceType(RecordTy,
4167 /*SpelledAsLValue=*/true),
4168 ImplicitParamKind::Other);
4169 if (IsCopy)
4170 FunctionArgs.push_back(SrcParam);
4171
4172 // Constructors for classes which utilize virtual bases have an additional
4173 // parameter which indicates whether or not it is being delegated to by a more
4174 // derived constructor.
4175 auto *IsMostDerived =
4176 ImplicitParamDecl::Create(getContext(), /*DC=*/nullptr, SourceLocation(),
4177 &getContext().Idents.get("is_most_derived"),
4178 getContext().IntTy, ImplicitParamKind::Other);
4179 // Only add the parameter to the list if the class has virtual bases.
4180 if (RD->getNumVBases() > 0)
4181 FunctionArgs.push_back(IsMostDerived);
4182
4183 // Start defining the function.
4184 auto NL = ApplyDebugLocation::CreateEmpty(CGF);
4185 CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo,
4186 FunctionArgs, CD->getLocation(), SourceLocation());
4187 // Create a scope with an artificial location for the body of this function.
4189 setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF));
4190 llvm::Value *This = getThisValue(CGF);
4191
4192 llvm::Value *SrcVal =
4193 IsCopy ? CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(SrcParam), "src")
4194 : nullptr;
4195
4196 CallArgList Args;
4197
4198 // Push the this ptr.
4199 Args.add(RValue::get(This), CD->getThisType());
4200
4201 // Push the src ptr.
4202 if (SrcVal)
4203 Args.add(RValue::get(SrcVal), SrcParam->getType());
4204
4205 // Get the rest of the default arguments.
4206 SmallVector<const Stmt *, 4> ArgVec;
4207 for (const CXXDefaultArgExpr *Expr :
4208 CD->getCtorClosureDefaultArgs().drop_front(IsCopy ? 1 : 0))
4209 ArgVec.push_back(Expr);
4210 assert(ArgVec.size() == CD->getNumParams() - IsCopy);
4211
4212 CodeGenFunction::RunCleanupsScope Cleanups(CGF);
4213
4214 const auto *FPT = CD->getType()->castAs<FunctionProtoType>();
4215 CGF.EmitCallArgs(Args, FPT, ArrayRef(ArgVec), CD, IsCopy ? 1 : 0);
4216
4217 // Insert any ABI-specific implicit constructor arguments.
4218 AddedStructorArgCounts ExtraArgs =
4219 addImplicitConstructorArgs(CGF, CD, Ctor_Complete,
4220 /*ForVirtualBase=*/false,
4221 /*Delegating=*/false, Args);
4222 // Call the destructor with our arguments.
4223 llvm::Constant *CalleePtr =
4224 CGM.getAddrOfCXXStructor(GlobalDecl(CD, Ctor_Complete));
4225 CGCallee Callee =
4226 CGCallee::forDirect(CalleePtr, GlobalDecl(CD, Ctor_Complete));
4227 // Microsoft ABI constructors always use the default method calling
4228 // convention (see SemaType.cpp adjustMemberFunctionCC), so no caller
4229 // declaration is needed for SysV ABI selection.
4230 const CGFunctionInfo &CalleeInfo = CGM.getTypes().arrangeCXXConstructorCall(
4231 Args, CD, Ctor_Complete, ExtraArgs.Prefix, ExtraArgs.Suffix,
4232 /*ABIInfoFD=*/nullptr);
4233 CGF.EmitCall(CalleeInfo, Callee, ReturnValueSlot(), Args);
4234
4235 Cleanups.ForceCleanup();
4236
4237 // Emit the ret instruction, remove any temporary instructions created for the
4238 // aid of CodeGen.
4239 CGF.FinishFunction(SourceLocation());
4240
4241 return ThunkFn;
4242}
4243
4244llvm::Constant *MicrosoftCXXABI::getCatchableType(QualType T,
4245 uint32_t NVOffset,
4246 int32_t VBPtrOffset,
4247 uint32_t VBIndex) {
4248 assert(!T->isReferenceType());
4249
4250 CXXRecordDecl *RD = T->getAsCXXRecordDecl();
4251 const CXXConstructorDecl *CD =
4252 RD ? CGM.getContext().getCopyConstructorForExceptionObject(RD) : nullptr;
4254 if (CD)
4255 if (!hasDefaultCXXMethodCC(getContext(), CD) || CD->getNumParams() != 1)
4257
4258 uint32_t Size = getContext().getTypeSizeInChars(T).getQuantity();
4259 SmallString<256> MangledName;
4260 {
4261 llvm::raw_svector_ostream Out(MangledName);
4262 getMangleContext().mangleCXXCatchableType(T, CD, CT, Size, NVOffset,
4263 VBPtrOffset, VBIndex, Out);
4264 }
4265 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
4266 return getImageRelativeConstant(GV);
4267
4268 // The TypeDescriptor is used by the runtime to determine if a catch handler
4269 // is appropriate for the exception object.
4270 llvm::Constant *TD = getImageRelativeConstant(getAddrOfRTTIDescriptor(T));
4271
4272 // The runtime is responsible for calling the copy constructor if the
4273 // exception is caught by value.
4274 llvm::Constant *CopyCtor;
4275 if (CD) {
4276 if (CT == Ctor_CopyingClosure)
4277 CopyCtor = getAddrOfCXXCtorClosure(CD, Ctor_CopyingClosure);
4278 else
4279 CopyCtor = CGM.getAddrOfCXXStructor(GlobalDecl(CD, Ctor_Complete));
4280 } else {
4281 CopyCtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
4282 }
4283 CopyCtor = getImageRelativeConstant(CopyCtor);
4284
4285 bool IsScalar = !RD;
4286 bool HasVirtualBases = false;
4287 bool IsStdBadAlloc = false; // std::bad_alloc is special for some reason.
4288 QualType PointeeType = T;
4289 if (T->isPointerType())
4290 PointeeType = T->getPointeeType();
4291 if (const CXXRecordDecl *RD = PointeeType->getAsCXXRecordDecl()) {
4292 HasVirtualBases = RD->getNumVBases() > 0;
4293 if (IdentifierInfo *II = RD->getIdentifier())
4294 IsStdBadAlloc = II->isStr("bad_alloc") && RD->isInStdNamespace();
4295 }
4296
4297 // Encode the relevant CatchableType properties into the Flags bitfield.
4298 // FIXME: Figure out how bits 2 or 8 can get set.
4299 uint32_t Flags = 0;
4300 if (IsScalar)
4301 Flags |= 1;
4302 if (HasVirtualBases)
4303 Flags |= 4;
4304 if (IsStdBadAlloc)
4305 Flags |= 16;
4306
4307 llvm::Constant *Fields[] = {
4308 llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags
4309 TD, // TypeDescriptor
4310 llvm::ConstantInt::get(CGM.IntTy, NVOffset), // NonVirtualAdjustment
4311 llvm::ConstantInt::getSigned(CGM.IntTy, VBPtrOffset), // OffsetToVBPtr
4312 llvm::ConstantInt::get(CGM.IntTy, VBIndex), // VBTableIndex
4313 llvm::ConstantInt::get(CGM.IntTy, Size), // Size
4314 CopyCtor // CopyCtor
4315 };
4316 llvm::StructType *CTType = getCatchableTypeType();
4317 auto *GV = new llvm::GlobalVariable(
4318 CGM.getModule(), CTType, /*isConstant=*/true, getLinkageForRTTI(T),
4319 llvm::ConstantStruct::get(CTType, Fields), MangledName);
4320 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4321 GV->setSection(".xdata");
4322 if (GV->isWeakForLinker())
4323 GV->setComdat(CGM.getModule().getOrInsertComdat(GV->getName()));
4324 return getImageRelativeConstant(GV);
4325}
4326
4327llvm::GlobalVariable *MicrosoftCXXABI::getCatchableTypeArray(QualType T) {
4328 assert(!T->isReferenceType());
4329
4330 // See if we've already generated a CatchableTypeArray for this type before.
4331 llvm::GlobalVariable *&CTA = CatchableTypeArrays[T];
4332 if (CTA)
4333 return CTA;
4334
4335 // Ensure that we don't have duplicate entries in our CatchableTypeArray by
4336 // using a SmallSetVector. Duplicates may arise due to virtual bases
4337 // occurring more than once in the hierarchy.
4338 llvm::SmallSetVector<llvm::Constant *, 2> CatchableTypes;
4339
4340 // C++14 [except.handle]p3:
4341 // A handler is a match for an exception object of type E if [...]
4342 // - the handler is of type cv T or cv T& and T is an unambiguous public
4343 // base class of E, or
4344 // - the handler is of type cv T or const T& where T is a pointer type and
4345 // E is a pointer type that can be converted to T by [...]
4346 // - a standard pointer conversion (4.10) not involving conversions to
4347 // pointers to private or protected or ambiguous classes
4348 const CXXRecordDecl *MostDerivedClass = nullptr;
4349 bool IsPointer = T->isPointerType();
4350 if (IsPointer)
4351 MostDerivedClass = T->getPointeeType()->getAsCXXRecordDecl();
4352 else
4353 MostDerivedClass = T->getAsCXXRecordDecl();
4354
4355 // Collect all the unambiguous public bases of the MostDerivedClass.
4356 if (MostDerivedClass) {
4357 const ASTContext &Context = getContext();
4358 const ASTRecordLayout &MostDerivedLayout =
4359 Context.getASTRecordLayout(MostDerivedClass);
4360 MicrosoftVTableContext &VTableContext = CGM.getMicrosoftVTableContext();
4361 SmallVector<MSRTTIClass, 8> Classes;
4362 serializeClassHierarchy(Classes, MostDerivedClass);
4363 Classes.front().initialize(/*Parent=*/nullptr, /*Specifier=*/nullptr);
4364 detectAmbiguousBases(Classes);
4365 for (const MSRTTIClass &Class : Classes) {
4366 // Skip any ambiguous or private bases.
4367 if (Class.Flags &
4368 (MSRTTIClass::IsPrivateOnPath | MSRTTIClass::IsAmbiguous))
4369 continue;
4370 // Write down how to convert from a derived pointer to a base pointer.
4371 uint32_t OffsetInVBTable = 0;
4372 int32_t VBPtrOffset = -1;
4373 if (Class.VirtualRoot) {
4374 OffsetInVBTable =
4375 VTableContext.getVBTableIndex(MostDerivedClass, Class.VirtualRoot)*4;
4376 VBPtrOffset = MostDerivedLayout.getVBPtrOffset().getQuantity();
4377 }
4378
4379 // Turn our record back into a pointer if the exception object is a
4380 // pointer.
4381 CanQualType RTTITy = Context.getCanonicalTagType(Class.RD);
4382 if (IsPointer)
4383 RTTITy = Context.getPointerType(RTTITy);
4384 CatchableTypes.insert(getCatchableType(RTTITy, Class.OffsetInVBase,
4385 VBPtrOffset, OffsetInVBTable));
4386 }
4387 }
4388
4389 // C++14 [except.handle]p3:
4390 // A handler is a match for an exception object of type E if
4391 // - The handler is of type cv T or cv T& and E and T are the same type
4392 // (ignoring the top-level cv-qualifiers)
4393 CatchableTypes.insert(getCatchableType(T));
4394
4395 // C++14 [except.handle]p3:
4396 // A handler is a match for an exception object of type E if
4397 // - the handler is of type cv T or const T& where T is a pointer type and
4398 // E is a pointer type that can be converted to T by [...]
4399 // - a standard pointer conversion (4.10) not involving conversions to
4400 // pointers to private or protected or ambiguous classes
4401 //
4402 // C++14 [conv.ptr]p2:
4403 // A prvalue of type "pointer to cv T," where T is an object type, can be
4404 // converted to a prvalue of type "pointer to cv void".
4405 if (IsPointer && T->getPointeeType()->isObjectType())
4406 CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy));
4407
4408 // C++14 [except.handle]p3:
4409 // A handler is a match for an exception object of type E if [...]
4410 // - the handler is of type cv T or const T& where T is a pointer or
4411 // pointer to member type and E is std::nullptr_t.
4412 //
4413 // We cannot possibly list all possible pointer types here, making this
4414 // implementation incompatible with the standard. However, MSVC includes an
4415 // entry for pointer-to-void in this case. Let's do the same.
4416 if (T->isNullPtrType())
4417 CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy));
4418
4419 uint32_t NumEntries = CatchableTypes.size();
4420 llvm::Type *CTType = getImageRelativeType(CGM.DefaultPtrTy);
4421 llvm::ArrayType *AT = llvm::ArrayType::get(CTType, NumEntries);
4422 llvm::StructType *CTAType = getCatchableTypeArrayType(NumEntries);
4423 llvm::Constant *Fields[] = {
4424 llvm::ConstantInt::get(CGM.IntTy, NumEntries), // NumEntries
4425 llvm::ConstantArray::get(
4426 AT, llvm::ArrayRef(CatchableTypes.begin(),
4427 CatchableTypes.end())) // CatchableTypes
4428 };
4429 SmallString<256> MangledName;
4430 {
4431 llvm::raw_svector_ostream Out(MangledName);
4432 getMangleContext().mangleCXXCatchableTypeArray(T, NumEntries, Out);
4433 }
4434 CTA = new llvm::GlobalVariable(
4435 CGM.getModule(), CTAType, /*isConstant=*/true, getLinkageForRTTI(T),
4436 llvm::ConstantStruct::get(CTAType, Fields), MangledName);
4437 CTA->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4438 CTA->setSection(".xdata");
4439 if (CTA->isWeakForLinker())
4440 CTA->setComdat(CGM.getModule().getOrInsertComdat(CTA->getName()));
4441 return CTA;
4442}
4443
4444llvm::GlobalVariable *MicrosoftCXXABI::getThrowInfo(QualType T) {
4445 bool IsConst, IsVolatile, IsUnaligned;
4446 T = decomposeTypeForEH(getContext(), T, IsConst, IsVolatile, IsUnaligned);
4447
4448 // The CatchableTypeArray enumerates the various (CV-unqualified) types that
4449 // the exception object may be caught as.
4450 llvm::GlobalVariable *CTA = getCatchableTypeArray(T);
4451 // The first field in a CatchableTypeArray is the number of CatchableTypes.
4452 // This is used as a component of the mangled name which means that we need to
4453 // know what it is in order to see if we have previously generated the
4454 // ThrowInfo.
4455 uint32_t NumEntries =
4456 cast<llvm::ConstantInt>(CTA->getInitializer()->getAggregateElement(0U))
4457 ->getLimitedValue();
4458
4459 SmallString<256> MangledName;
4460 {
4461 llvm::raw_svector_ostream Out(MangledName);
4462 getMangleContext().mangleCXXThrowInfo(T, IsConst, IsVolatile, IsUnaligned,
4463 NumEntries, Out);
4464 }
4465
4466 // Reuse a previously generated ThrowInfo if we have generated an appropriate
4467 // one before.
4468 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
4469 return GV;
4470
4471 // The RTTI TypeDescriptor uses an unqualified type but catch clauses must
4472 // be at least as CV qualified. Encode this requirement into the Flags
4473 // bitfield.
4474 uint32_t Flags = 0;
4475 if (IsConst)
4476 Flags |= 1;
4477 if (IsVolatile)
4478 Flags |= 2;
4479 if (IsUnaligned)
4480 Flags |= 4;
4481
4482 // The cleanup-function (a destructor) must be called when the exception
4483 // object's lifetime ends.
4484 llvm::Constant *CleanupFn = llvm::Constant::getNullValue(CGM.Int8PtrTy);
4485 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
4486 if (CXXDestructorDecl *DtorD = RD->getDestructor())
4487 if (!DtorD->isTrivial())
4488 CleanupFn = CGM.getAddrOfCXXStructor(GlobalDecl(DtorD, Dtor_Complete));
4489 // This is unused as far as we can tell, initialize it to null.
4490 llvm::Constant *ForwardCompat =
4491 getImageRelativeConstant(llvm::Constant::getNullValue(CGM.Int8PtrTy));
4492 llvm::Constant *PointerToCatchableTypes = getImageRelativeConstant(CTA);
4493 llvm::StructType *TIType = getThrowInfoType();
4494 llvm::Constant *Fields[] = {
4495 llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags
4496 getImageRelativeConstant(CleanupFn), // CleanupFn
4497 ForwardCompat, // ForwardCompat
4498 PointerToCatchableTypes // CatchableTypeArray
4499 };
4500 auto *GV = new llvm::GlobalVariable(
4501 CGM.getModule(), TIType, /*isConstant=*/true, getLinkageForRTTI(T),
4502 llvm::ConstantStruct::get(TIType, Fields), MangledName.str());
4503 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4504 GV->setSection(".xdata");
4505 if (GV->isWeakForLinker())
4506 GV->setComdat(CGM.getModule().getOrInsertComdat(GV->getName()));
4507 return GV;
4508}
4509
4510void MicrosoftCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
4511 const Expr *SubExpr = E->getSubExpr();
4512 assert(SubExpr && "SubExpr cannot be null");
4513 QualType ThrowType = SubExpr->getType();
4514 // The exception object lives on the stack and it's address is passed to the
4515 // runtime function.
4516 Address AI = CGF.CreateMemTempWithoutCast(ThrowType);
4517 CGF.EmitAnyExprToMem(SubExpr, AI, ThrowType.getQualifiers(),
4518 /*IsInit=*/true);
4519
4520 // The so-called ThrowInfo is used to describe how the exception object may be
4521 // caught.
4522 llvm::GlobalVariable *TI = getThrowInfo(ThrowType);
4523
4524 // Call into the runtime to throw the exception.
4525 llvm::Value *Args[] = {AI.emitRawPointer(CGF), TI};
4527}
4528
4529std::pair<llvm::Value *, const CXXRecordDecl *>
4530MicrosoftCXXABI::LoadVTablePtr(CodeGenFunction &CGF, Address This,
4531 const CXXRecordDecl *RD) {
4533 std::tie(This, std::ignore, RD) = performBaseAdjustment(CGF, This, T);
4534 return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD};
4535}
4536
4537bool MicrosoftCXXABI::isPermittedToBeHomogeneousAggregate(
4538 const CXXRecordDecl *RD) const {
4539 // All aggregates are permitted to be HFA on non-ARM platforms, which mostly
4540 // affects vectorcall on x64/x86.
4541 if (!CGM.getTarget().getTriple().isAArch64())
4542 return true;
4543 // MSVC Windows on Arm64 has its own rules for determining if a type is HFA
4544 // that are inconsistent with the AAPCS64 ABI. The following are our best
4545 // determination of those rules so far, based on observation of MSVC's
4546 // behavior.
4547 if (RD->isEmpty())
4548 return false;
4549 if (RD->isPolymorphic())
4550 return false;
4552 return false;
4553 if (RD->hasNonTrivialDestructor())
4554 return false;
4556 return false;
4557 // These two are somewhat redundant given the caller
4558 // (ABIInfo::isHomogeneousAggregate) checks the bases and fields, but that
4559 // caller doesn't consider empty bases/fields to be non-homogenous, but it
4560 // looks like Microsoft's AArch64 ABI does care about these empty types &
4561 // anything containing/derived from one is non-homogeneous.
4562 // Instead we could add another CXXABI entry point to query this property and
4563 // have ABIInfo::isHomogeneousAggregate use that property.
4564 // I don't think any other of the features listed above could be true of a
4565 // base/field while not true of the outer struct. For example, if you have a
4566 // base/field that has an non-trivial copy assignment/dtor/default ctor, then
4567 // the outer struct's corresponding operation must be non-trivial.
4568 for (const CXXBaseSpecifier &B : RD->bases()) {
4569 if (const CXXRecordDecl *FRD = B.getType()->getAsCXXRecordDecl()) {
4570 if (!isPermittedToBeHomogeneousAggregate(FRD))
4571 return false;
4572 }
4573 }
4574 // empty fields seem to be caught by the ABIInfo::isHomogeneousAggregate
4575 // checking for padding - but maybe there are ways to end up with an empty
4576 // field without padding? Not that I know of, so don't check fields here &
4577 // rely on the padding check.
4578 return true;
4579}
#define V(N, I)
static Address emitDynamicCastToVoid(CIRGenFunction &cgf, mlir::Location loc, QualType srcRecordTy, Address src)
static mlir::Value emitExactDynamicCast(CIRGenItaniumCXXABI &abi, CIRGenFunction &cgf, mlir::Location loc, QualType srcRecordTy, QualType destRecordTy, cir::PointerType destCIRTy, bool isRefCast, Address src)
static RValue performReturnAdjustment(CIRGenFunction &cgf, QualType resultType, RValue rv, const ThunkInfo &thunk)
static llvm::FunctionCallee getThrowFn(CodeGenModule &CGM)
static void emitTlsGuardCheck(CodeGenFunction &CGF, llvm::GlobalValue *TlsGuard, llvm::BasicBlock *DynInitBB, llvm::BasicBlock *ContinueBB)
static llvm::GlobalVariable * getTypeInfoVTable(CodeGenModule &CGM)
static bool hasDefaultCXXMethodCC(ASTContext &Context, const CXXMethodDecl *MD)
static bool isTrivialForMSVC(const CXXRecordDecl *RD, QualType Ty, CodeGenModule &CGM)
static llvm::FunctionCallee getInitThreadAbortFn(CodeGenModule &CGM)
static llvm::FunctionCallee getInitThreadHeaderFn(CodeGenModule &CGM)
static llvm::GlobalValue * getTlsGuardVar(CodeGenModule &CGM)
static QualType decomposeTypeForEH(ASTContext &Context, QualType T, bool &IsConst, bool &IsVolatile, bool &IsUnaligned)
static llvm::CallBase * emitRTtypeidCall(CodeGenFunction &CGF, llvm::Value *Argument)
static llvm::FunctionCallee getDynTlsOnDemandInitFn(CodeGenModule &CGM)
static void emitDynamicTlsInitializationCall(CodeGenFunction &CGF, llvm::GlobalValue *TlsGuard, llvm::BasicBlock *ContinueBB)
static void detectAmbiguousBases(SmallVectorImpl< MSRTTIClass > &Classes)
Find ambiguity among base classes.
static void emitDynamicTlsInitialization(CodeGenFunction &CGF)
static void serializeClassHierarchy(SmallVectorImpl< MSRTTIClass > &Classes, const CXXRecordDecl *RD)
Recursively serializes a class hierarchy in pre-order depth first order.
static llvm::FunctionCallee getInitThreadFooterFn(CodeGenModule &CGM)
static bool isDeletingDtor(GlobalDecl GD)
static void emitGlobalDtorWithTLRegDtor(CodeGenFunction &CGF, const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr)
static ConstantAddress getInitThreadEpochPtr(CodeGenModule &CGM)
static void mangleVFTableName(MicrosoftMangleContext &MangleContext, const CXXRecordDecl *RD, const VPtrInfo &VFPtr, SmallString< 256 > &Name)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
FormatToken * Next
The next token in the unwrapped line.
Result
Implement __builtin_bit_cast and related operations.
bool isMemberPointerToDerivedMember() const
Definition APValue.cpp:1155
const ValueDecl * getMemberPointerDecl() const
Definition APValue.cpp:1148
ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const
Definition APValue.cpp:1162
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:239
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
uint64_t getFieldOffset(const ValueDecl *FD) const
Get the offset of a FieldDecl or IndirectFieldDecl, in bits.
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.
IdentifierTable & Idents
Definition ASTContext.h:850
const LangOptions & getLangOpts() const
CanQualType IntTy
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
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 CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:969
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType getCanonicalTagType(const TagDecl *TD) const
unsigned getTargetAddressSpace(LangAS AS) const
void recordMemberDataPointerEvaluation(const ValueDecl *VD)
llvm::DenseMap< const CXXRecordDecl *, VBaseInfo > VBaseOffsetsMapTy
CharUnits getVBPtrOffset() const
getVBPtrOffset - Get the offset for virtual base table pointer.
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.
const VBaseOffsetsMapTy & getVBaseOffsetsMap() const
bool hasExtendableVFPtr() const
hasVFPtr - Does this class have a virtual function table pointer that can be extended by a derived cl...
Represents a base class of a C++ class.
Definition DeclCXX.h:146
VarDecl * getExceptionDecl() const
Definition StmtCXX.h:50
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
Definition DeclCXX.cpp:3049
ArrayRef< CXXDefaultArgExpr * > getCtorClosureDefaultArgs() const
Definition DeclCXX.cpp:3139
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2670
bool isGlobalDelete() const
Definition ExprCXX.h:2656
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2150
bool isVirtual() const
Definition DeclCXX.h:2205
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2293
QualType getThisType() const
Return the type of the this pointer.
Definition DeclCXX.cpp:2859
bool isInstance() const
Definition DeclCXX.h:2177
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
bool hasNonTrivialCopyAssignment() const
Determine whether this class has a non-trivial copy assignment operator (C++ [class....
Definition DeclCXX.h:1350
CXXRecordDecl * getMostRecentDecl()
Definition DeclCXX.h:540
bool hasPrivateFields() const
Definition DeclCXX.h:1201
base_class_range bases()
Definition DeclCXX.h:609
bool hasProtectedFields() const
Definition DeclCXX.h:1205
bool hasNonTrivialDestructor() const
Determine whether this class has a non-trivial destructor (C++ [class.dtor]p3)
Definition DeclCXX.h:1392
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
Definition DeclCXX.h:1224
unsigned getNumBases() const
Retrieves the number of base classes of this class.
Definition DeclCXX.h:603
base_class_range vbases()
Definition DeclCXX.h:626
MSInheritanceModel getMSInheritanceModel() const
Returns the inheritance model used for this record.
bool nullFieldOffsetIsZero() const
In the Microsoft C++ ABI, use zero for the field offset of a null data member pointer if we can guara...
bool hasDefinition() const
Definition DeclCXX.h:562
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
Definition DeclCXX.h:1196
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
Definition DeclCXX.cpp:2129
bool hasNonTrivialDefaultConstructor() const
Determine whether this class has a non-trivial default constructor (C++11 [class.ctor]p5).
Definition DeclCXX.h:1263
bool isVirtuallyDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is virtually derived from the class Base.
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
Definition DeclCXX.h:933
bool hasSimpleCopyAssignment() const
true if we know for sure that this class has a single, accessible, unambiguous copy assignment operat...
Definition DeclCXX.h:742
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
Definition DeclCXX.h:624
const Expr * getSubExpr() const
Definition ExprCXX.h:1233
path_iterator path_begin()
Definition Expr.h:3790
CastKind getCastKind() const
Definition Expr.h:3764
path_iterator path_end()
Definition Expr.h:3791
const CXXBaseSpecifier *const * path_const_iterator
Definition Expr.h:3787
Expr * getSubExpr()
Definition Expr.h:3770
This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
bool isNegative() const
Test whether the quantity is less than zero.
Definition CharUnits.h:110
bool isPositive() const
Test whether the quantity is greater than zero.
Definition CharUnits.h:107
bool isZero() const
Test whether the quantity equals zero.
Definition CharUnits.h:101
llvm::Align getAsAlign() const
Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit bytes.
Definition CharUnits.h:157
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
Definition CharUnits.h:153
static CharUnits One()
Construct a CharUnits quantity of one.
Definition CharUnits.h:55
static CharUnits fromQuantity(QuantityType Quantity)
Construct a CharUnits quantity from a raw integer type.
Definition CharUnits.h:58
static CharUnits Zero()
Construct a CharUnits quantity of zero.
Definition CharUnits.h:52
bool hasProfileIRInstr() const
Check if IR level profile instrumentation is on.
static ABIArgInfo getIndirect(CharUnits Alignment, unsigned AddrSpace, bool ByVal=true, bool Realign=false, llvm::Type *Padding=nullptr)
void setSRetAfterThis(bool AfterThis)
bool isHomogeneousAggregate(QualType Ty, const Type *&Base, uint64_t &Members) const
isHomogeneousAggregate - Return true if a type is an ELFv2 homogeneous aggregate.
Definition ABIInfo.cpp:66
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
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Definition Address.h:276
static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF)
Apply TemporaryLocation if it is valid.
static ApplyDebugLocation CreateEmpty(CodeGenFunction &CGF)
Set the IRBuilder to not attach debug locations.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Definition CGBuilder.h:146
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:315
Address CreateConstInBoundsGEP2_32(Address Addr, unsigned Idx0, unsigned Idx1, const llvm::Twine &Name="")
Definition CGBuilder.h:335
Address CreateGEP(CodeGenFunction &CGF, Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
Definition CGBuilder.h:302
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Definition CGBuilder.h:118
Address CreateConstByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Definition CGBuilder.h:325
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Definition CGBuilder.h:138
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition CGBuilder.h:356
Implements C++ ABI-specific code generation functions.
Definition CGCXXABI.h:43
RecordArgABI
Specify how one should pass an argument of a record type.
Definition CGCXXABI.h:150
MangleContext & getMangleContext()
Gets the mangle context.
Definition CGCXXABI.h:113
static CGCallee forVirtual(const CallExpr *CE, GlobalDecl MD, Address Addr, llvm::FunctionType *FTy)
Definition CGCall.h:150
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
Definition CGCall.h:140
CanQualType getReturnType() const
unsigned getEffectiveCallingConvention() const
getEffectiveCallingConvention - Return the actual calling convention to use, which may depend on the ...
void add(RValue rvalue, QualType type)
Definition CGCall.h:305
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:2721
LValue EmitLoadOfReferenceLValue(LValue RefLVal)
Definition CGExpr.cpp:3453
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...
void EmitMustTailThunk(GlobalDecl GD, llvm::Value *AdjustedThisPtr, llvm::FunctionCallee Callee)
Emit a musttail call for a thunk with a potentially adjusted this pointer.
void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args)
Emits a call or invoke to the given noreturn runtime function.
Definition CGCall.cpp:5483
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:5510
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::Value * getAsNaturalPointerTo(Address Addr, QualType PointeeType)
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
AutoVarEmission EmitAutoVarAlloca(const VarDecl &var)
EmitAutoVarAlloca - Emit the alloca and debug information for a local variable.
Definition CGDecl.cpp:1494
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)
Definition CGClass.cpp:2544
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV, bool PerformInit)
EmitCXXGlobalVarDeclInit - Create the initializer for a C++ variable with global storage.
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 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.
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:5666
RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen without...
Definition CGExpr.cpp:234
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:2793
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
void EmitAutoVarCleanups(const AutoVarEmission &emission)
Definition CGDecl.cpp:2285
void EmitAnyExprToMem(const Expr *E, Address Location, Qualifiers Quals, bool IsInitializer)
EmitAnyExprToMem - Emits the code necessary to evaluate an arbitrary expression into the given memory...
Definition CGExpr.cpp:312
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
CodeGenTypes & getTypes() const
void EmitDeleteCall(const FunctionDecl *DeleteFD, llvm::Value *Ptr, QualType DeleteTy, llvm::Value *NumElements=nullptr, CharUnits CookieSize=CharUnits(), llvm::Constant *CalleeOverride=nullptr)
void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)
EmitCallArgs - Emit call arguments for a function.
Definition CGCall.cpp:5058
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
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:2980
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:2962
void PopCleanupBlock(bool FallThroughIsBranchThrough=false, bool ForDeactivation=false)
PopCleanupBlock - Will pop the cleanup entry on the stack and process all branch fixups.
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
Definition CGStmt.cpp:655
This class organizes the cross-function state that is used while generating LLVM code.
void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const
Set visibility, dllimport/dllexport and dso_local.
void AddCXXDtorEntry(llvm::FunctionCallee DtorFn, llvm::Constant *Object)
Add a destructor and object to add to the C++ global destructor function.
void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset, const CXXRecordDecl *RD)
Create and attach type metadata for the given vtable.
void setDSOLocal(llvm::GlobalValue *GV) const
llvm::GlobalObject::VCallVisibility GetVCallVisibilityLevel(const CXXRecordDecl *RD, llvm::DenseSet< const CXXRecordDecl * > &Visited)
Returns the vcall visibility of the given type.
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()
bool classNeedsVectorDestructor(const CXXRecordDecl *RD)
Check that class need vector deleting destructor body.
llvm::Constant * GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH=false)
Get the address of the RTTI descriptor for the given type.
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
DiagnosticsEngine & getDiags() const
llvm::Constant * getAddrOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the constructor/destructor of the given type.
llvm::GlobalValue::LinkageTypes getLLVMLinkageForDeclarator(const DeclaratorDecl *D, GVALinkage Linkage)
Returns LLVM linkage for a declarator.
const LangOptions & getLangOpts() const
const TargetInfo & getTarget() const
bool shouldEmitRTTI(bool ForEH=false)
void EmitGlobal(GlobalDecl D)
Emit code for a single global function or var decl.
void addUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.used metadata.
void AppendLinkerOptions(StringRef Opts)
Appends Opts to the "llvm.linker.options" metadata value.
bool TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D)
Try to emit a base destructor as an alias to its primary base-class destructor.
Definition CGCXX.cpp:34
const llvm::DataLayout & getDataLayout() const
CharUnits computeNonVirtualBaseClassOffset(const CXXRecordDecl *DerivedClass, CastExpr::path_const_iterator Start, CastExpr::path_const_iterator End)
Definition CGClass.cpp:170
CharUnits getVBaseAlignment(CharUnits DerivedAlign, const CXXRecordDecl *Derived, const CXXRecordDecl *VBase)
Returns the assumed alignment of a virtual base of a class.
Definition CGClass.cpp:78
void EmitDefinitionAsAlias(GlobalDecl Alias, GlobalDecl Target)
Emit a definition as a global alias for another definition, unconditionally.
Definition CGCXX.cpp:205
llvm::Function * codegenCXXStructor(GlobalDecl GD)
Definition CGCXX.cpp:266
llvm::Constant * CreateRuntimeVariable(llvm::Type *Ty, StringRef Name)
Create a new runtime global variable with the specified type and name.
void setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const
Set the TLS mode for the given LLVM GlobalValue for the thread-local variable declaration D.
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.
MicrosoftVTableContext & getMicrosoftVTableContext()
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
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::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO)
void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const
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 addDeferredVTable(const CXXRecordDecl *RD)
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)
const CGFunctionInfo & arrangeCXXConstructorCall(const CallArgList &Args, const CXXConstructorDecl *D, CXXCtorType CtorKind, unsigned ExtraPrefixArgs, unsigned ExtraSuffixArgs, const FunctionDecl *ABIInfoFD, bool PassProtoArgs=true)
Arrange a call to a C++ method, passing the given arguments.
Definition CGCall.cpp:504
const CGFunctionInfo & arrangeCXXMethodDeclaration(const CXXMethodDecl *MD)
C++ methods have some special rules and also have implicit parameters.
Definition CGCall.cpp:387
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
Definition CGCall.cpp:2064
bool isFuncTypeConvertible(const FunctionType *FT)
isFuncTypeConvertible - Utility to check whether a function type can be converted to an LLVM type (i....
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
const CGFunctionInfo & arrangeUnprototypedMustTailThunk(const CXXMethodDecl *MD)
Arrange a thunk that takes 'this' as the first parameter followed by varargs.
Definition CGCall.cpp:656
const CGFunctionInfo & arrangeCXXStructorDeclaration(GlobalDecl GD)
Definition CGCall.cpp:421
const CGFunctionInfo & arrangeMSCtorClosure(const CXXConstructorDecl *CD, CXXCtorType CT)
Definition CGCall.cpp:665
const CGFunctionInfo & arrangeNullaryFunction()
A nullary function is a freestanding function of type 'void ()'.
Definition CGCall.cpp:824
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.
A specialization of Address that requires the address to be an LLVM Constant.
Definition Address.h:296
static RValue get(llvm::Value *V)
Definition CGValue.h:99
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
Definition CGValue.h:72
virtual LangAS getSRetAddrSpace(const CXXRecordDecl *RD) const
Get the address space for an indirect (sret) return of the given type.
Definition TargetInfo.h:354
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2126
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition DeclBase.h:2423
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
bool isInStdNamespace() const
Definition DeclBase.cpp:453
SourceLocation getLocation() const
Definition DeclBase.h:447
DeclContext * getDeclContext()
Definition DeclBase.h:456
bool hasAttr() const
Definition DeclBase.h:585
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:283
QualType getType() const
Definition Expr.h:145
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition Decl.h:3531
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3868
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
Definition Decl.cpp:3233
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5416
bool isVariadic() const
Whether this function prototype is variadic.
Definition TypeBase.h:5820
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:60
GlobalDecl getWithCtorType(CXXCtorType Type)
Definition GlobalDecl.h:176
GlobalDecl getWithDtorType(CXXDtorType Type)
Definition GlobalDecl.h:183
CXXDtorType getDtorType() const
Definition GlobalDecl.h:122
const Decl * getDecl() const
Definition GlobalDecl.h:115
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Definition Decl.cpp:5673
bool isExplicitDefaultVisibilityExportMapping() const
bool isAllDefaultVisibilityExportMapping() const
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Definition Mangle.h:56
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3751
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
Definition Type.cpp:5847
QualType getPointeeType() const
Definition TypeBase.h:3769
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
Definition TypeBase.h:3773
bool isMemberDataPointer() const
Returns true if the member type (i.e.
Definition TypeBase.h:3779
unsigned getVBTableIndex(const CXXRecordDecl *Derived, const CXXRecordDecl *VBase)
Returns the index of VBase in the vbtable of Derived.
MethodVFTableLocation getMethodVFTableLocation(GlobalDecl GD)
const VPtrInfoVector & getVFPtrOffsets(const CXXRecordDecl *RD)
const VTableLayout & getVFTableLayout(const CXXRecordDecl *RD, CharUnits VFPtrOffset)
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:296
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:341
bool isExternallyVisible() const
Definition Decl.h:434
A (possibly-)qualified type.
Definition TypeBase.h:938
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8530
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1005
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8486
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8540
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8519
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Definition TypeBase.h:1561
bool hasUnaligned() const
Definition TypeBase.h:512
bool canPassInRegisters() const
Determine whether this class can be passed in registers.
Definition Decl.h:4597
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool emitVectorDeletingDtors(const LangOptions &) const
Controls whether to emit MSVC vector deleting destructors.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
Definition TargetInfo.h:495
virtual bool callGlobalDeleteInDeletingDtor(const LangOptions &) const
Controls whether global operator delete is called by the deleting destructor or at the point where de...
The base class of the type hierarchy.
Definition TypeBase.h:1879
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
bool isPointerType() const
Definition TypeBase.h:8683
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9366
bool isReferenceType() const
Definition TypeBase.h:8707
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:885
bool isObjectType() const
Determine whether this type is an object type.
Definition TypeBase.h:2574
Linkage getLinkage() const
Determine the linkage of this type.
Definition Type.cpp:5202
bool isNullPtrType() const
Definition TypeBase.h:9109
ArrayRef< VTableComponent > vtable_components() const
QualType getType() const
Definition Decl.h:724
Represents a variable declaration or definition.
Definition Decl.h:933
TLSKind getTLSKind() const
Definition Decl.cpp:2148
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
Definition Decl.cpp:2806
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
Definition Decl.h:1215
llvm::Value * getCXXDestructorImplicitParam(CodeGenModule &CGM, llvm::BasicBlock *InsertBlock, llvm::BasicBlock::iterator InsertPoint, const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating)
CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT, CGCXXABI &CXXABI)
bool classifyReturnType(const CGCXXABI &CXXABI, CGFunctionInfo &FI, const ABIInfo &Info)
@ 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 * CreateMicrosoftCXXABI(CodeGenModule &CGM)
Creates a Microsoft-family ABI.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
constexpr Variable var(Literal L)
Returns the variable of L.
Definition CNFFormula.h:64
PRESERVE_NONE bool Ret(InterpState &S)
Definition Interp.h:284
bool This(InterpState &S, CodePtr OpPC)
Definition Interp.h:3229
@ Address
A pointer to a ValueDecl.
Definition Primitives.h:28
Top level wrappers for InstallAPI frontend operations.
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
bool isa(CodeGen::Address addr)
Definition Address.h:330
GVALinkage
A more specific kind of linkage than enum Linkage.
Definition Linkage.h:72
@ GVA_Internal
Definition Linkage.h:73
bool inheritanceModelHasNVOffsetField(bool IsMemberFunction, MSInheritanceModel Inheritance)
@ AS_public
Definition Specifiers.h:128
bool inheritanceModelHasOnlyOneField(bool IsMemberFunction, MSInheritanceModel Inheritance)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool inheritanceModelHasVBPtrOffsetField(MSInheritanceModel Inheritance)
bool inheritanceModelHasVBTableOffsetField(MSInheritanceModel Inheritance)
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
SmallVector< std::unique_ptr< VPtrInfo >, 2 > VPtrInfoVector
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
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
Definition Specifiers.h:414
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:282
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6025
@ Implicit
An implicit conversion.
Definition Sema.h:434
unsigned long uint64_t
long int64_t
int32_t uint32_t
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
const CXXRecordDecl * VBase
If nonnull, holds the last vbase which contains the vfptr that the method definition is adjusted to.
CharUnits VFPtrOffset
This is the offset of the vfptr from the start of the last vbase, or the complete type if there are n...
uint64_t Index
Method's index in the vftable.
bool isEmpty() const
Definition Thunk.h:70
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
union clang::ThisAdjustment::VirtualAdjustment Virtual
bool isEmpty() const
Definition Thunk.h:137
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
bool isAlignRequired()
Definition ASTContext.h:197
Holds information about the inheritance path to a virtual base or function table pointer.
CharUnits NonVirtualOffset
IntroducingObject is at this offset from its containing complete object or virtual base.
CharUnits FullOffsetInMDC
Static offset from the top of the most derived class to this vfptr, including any virtual base offset...
const CXXRecordDecl * getVBaseWithVPtr() const
The vptr is stored inside the non-virtual component of this virtual base.
const CXXRecordDecl * IntroducingObject
This is the class that introduced the vptr by declaring new virtual methods or virtual bases.
BasePath MangledPath
The bases from the inheritance path that got used to mangle the vbtable name.
BasePath PathToIntroducingObject
This holds the base classes path from the complete type to the first base with the given vfptr offset...
const CXXRecordDecl * ObjectWithVPtr
This is the most derived class that has this vptr at offset zero.
uint32_t VBPtrOffset
The offset (in bytes) of the vbptr, relative to the beginning of the derived class.
Definition Thunk.h:46
struct clang::ReturnAdjustment::VirtualAdjustment::@167242364125115315334113104006210160165266060257 Microsoft
uint32_t VBIndex
Index of the virtual base in the vbtable.
Definition Thunk.h:49
int32_t VtordispOffset
The offset of the vtordisp (in bytes), relative to the ECX.
Definition Thunk.h:109
struct clang::ThisAdjustment::VirtualAdjustment::@312251255113040203233347230177110330127151157305 Microsoft
int32_t VBOffsetOffset
The offset (in bytes) of the vbase offset in the vbtable.
Definition Thunk.h:116
int32_t VBPtrOffset
The offset of the vbptr of the derived class (in bytes), relative to the ECX after vtordisp adjustmen...
Definition Thunk.h:113