1//===--- MicrosoftCXXABI.cpp - Emit LLVM Code from ASTs for a Module ------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This provides C++ code generation targeting the Microsoft Visual C++ ABI. 11// The class in this file generates structures that follow the Microsoft 12// Visual C++ ABI, which is actually not very well documented at all outside 13// of Microsoft. 14// 15//===----------------------------------------------------------------------===// 16 17#include "CGCXXABI.h" 18#include "CGVTables.h" 19#include "CodeGenModule.h" 20#include "CodeGenTypes.h" 21#include "TargetInfo.h" 22#include "clang/AST/Decl.h" 23#include "clang/AST/DeclCXX.h" 24#include "clang/AST/StmtCXX.h" 25#include "clang/AST/VTableBuilder.h" 26#include "llvm/ADT/StringExtras.h" 27#include "llvm/ADT/StringSet.h" 28#include "llvm/IR/CallSite.h" 29#include "llvm/IR/Intrinsics.h" 30 31using namespace clang; 32using namespace CodeGen; 33 34namespace { 35 36/// Holds all the vbtable globals for a given class. 37struct VBTableGlobals { 38 const VPtrInfoVector *VBTables; 39 SmallVector<llvm::GlobalVariable *, 2> Globals; 40}; 41 42class MicrosoftCXXABI : public CGCXXABI { 43public: 44 MicrosoftCXXABI(CodeGenModule &CGM) 45 : CGCXXABI(CGM), BaseClassDescriptorType(nullptr), 46 ClassHierarchyDescriptorType(nullptr), 47 CompleteObjectLocatorType(nullptr), CatchableTypeType(nullptr), 48 ThrowInfoType(nullptr), CatchHandlerTypeType(nullptr) {} 49 50 bool HasThisReturn(GlobalDecl GD) const override; 51 bool hasMostDerivedReturn(GlobalDecl GD) const override; 52 53 bool classifyReturnType(CGFunctionInfo &FI) const override; 54 55 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override; 56 57 bool isSRetParameterAfterThis() const override { return true; } 58 59 size_t getSrcArgforCopyCtor(const CXXConstructorDecl *CD, 60 FunctionArgList &Args) const override { 61 assert(Args.size() >= 2 && 62 "expected the arglist to have at least two args!"); 63 // The 'most_derived' parameter goes second if the ctor is variadic and 64 // has v-bases. 65 if (CD->getParent()->getNumVBases() > 0 && 66 CD->getType()->castAs<FunctionProtoType>()->isVariadic()) 67 return 2; 68 return 1; 69 } 70 71 StringRef GetPureVirtualCallName() override { return "_purecall"; } 72 StringRef GetDeletedVirtualCallName() override { return "_purecall"; } 73 74 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, 75 llvm::Value *Ptr, QualType ElementType, 76 const CXXDestructorDecl *Dtor) override; 77 78 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override; 79 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override; 80 81 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override; 82 83 llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD, 84 const VPtrInfo *Info); 85 86 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override; 87 llvm::Constant * 88 getAddrOfCXXCatchHandlerType(QualType Ty, QualType CatchHandlerType) override; 89 90 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override; 91 void EmitBadTypeidCall(CodeGenFunction &CGF) override; 92 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy, 93 llvm::Value *ThisPtr, 94 llvm::Type *StdTypeInfoPtrTy) override; 95 96 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr, 97 QualType SrcRecordTy) override; 98 99 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value, 100 QualType SrcRecordTy, QualType DestTy, 101 QualType DestRecordTy, 102 llvm::BasicBlock *CastEnd) override; 103 104 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value, 105 QualType SrcRecordTy, 106 QualType DestTy) override; 107 108 bool EmitBadCastCall(CodeGenFunction &CGF) override; 109 110 llvm::Value * 111 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This, 112 const CXXRecordDecl *ClassDecl, 113 const CXXRecordDecl *BaseClassDecl) override; 114 115 llvm::BasicBlock * 116 EmitCtorCompleteObjectHandler(CodeGenFunction &CGF, 117 const CXXRecordDecl *RD) override; 118 119 void initializeHiddenVirtualInheritanceMembers(CodeGenFunction &CGF, 120 const CXXRecordDecl *RD) override; 121 122 void EmitCXXConstructors(const CXXConstructorDecl *D) override; 123 124 // Background on MSVC destructors 125 // ============================== 126 // 127 // Both Itanium and MSVC ABIs have destructor variants. The variant names 128 // roughly correspond in the following way: 129 // Itanium Microsoft 130 // Base -> no name, just ~Class 131 // Complete -> vbase destructor 132 // Deleting -> scalar deleting destructor 133 // vector deleting destructor 134 // 135 // The base and complete destructors are the same as in Itanium, although the 136 // complete destructor does not accept a VTT parameter when there are virtual 137 // bases. A separate mechanism involving vtordisps is used to ensure that 138 // virtual methods of destroyed subobjects are not called. 139 // 140 // The deleting destructors accept an i32 bitfield as a second parameter. Bit 141 // 1 indicates if the memory should be deleted. Bit 2 indicates if the this 142 // pointer points to an array. The scalar deleting destructor assumes that 143 // bit 2 is zero, and therefore does not contain a loop. 144 // 145 // For virtual destructors, only one entry is reserved in the vftable, and it 146 // always points to the vector deleting destructor. The vector deleting 147 // destructor is the most general, so it can be used to destroy objects in 148 // place, delete single heap objects, or delete arrays. 149 // 150 // A TU defining a non-inline destructor is only guaranteed to emit a base 151 // destructor, and all of the other variants are emitted on an as-needed basis 152 // in COMDATs. Because a non-base destructor can be emitted in a TU that 153 // lacks a definition for the destructor, non-base destructors must always 154 // delegate to or alias the base destructor. 155 156 void buildStructorSignature(const CXXMethodDecl *MD, StructorType T, 157 SmallVectorImpl<CanQualType> &ArgTys) override; 158 159 /// Non-base dtors should be emitted as delegating thunks in this ABI. 160 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor, 161 CXXDtorType DT) const override { 162 return DT != Dtor_Base; 163 } 164 165 void EmitCXXDestructors(const CXXDestructorDecl *D) override; 166 167 const CXXRecordDecl * 168 getThisArgumentTypeForMethod(const CXXMethodDecl *MD) override { 169 MD = MD->getCanonicalDecl(); 170 if (MD->isVirtual() && !isa<CXXDestructorDecl>(MD)) { 171 MicrosoftVTableContext::MethodVFTableLocation ML = 172 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(MD); 173 // The vbases might be ordered differently in the final overrider object 174 // and the complete object, so the "this" argument may sometimes point to 175 // memory that has no particular type (e.g. past the complete object). 176 // In this case, we just use a generic pointer type. 177 // FIXME: might want to have a more precise type in the non-virtual 178 // multiple inheritance case. 179 if (ML.VBase || !ML.VFPtrOffset.isZero()) 180 return nullptr; 181 } 182 return MD->getParent(); 183 } 184 185 llvm::Value * 186 adjustThisArgumentForVirtualFunctionCall(CodeGenFunction &CGF, GlobalDecl GD, 187 llvm::Value *This, 188 bool VirtualCall) override; 189 190 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy, 191 FunctionArgList &Params) override; 192 193 llvm::Value *adjustThisParameterInVirtualFunctionPrologue( 194 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) override; 195 196 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override; 197 198 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF, 199 const CXXConstructorDecl *D, 200 CXXCtorType Type, bool ForVirtualBase, 201 bool Delegating, 202 CallArgList &Args) override; 203 204 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD, 205 CXXDtorType Type, bool ForVirtualBase, 206 bool Delegating, llvm::Value *This) override; 207 208 void emitVTableDefinitions(CodeGenVTables &CGVT, 209 const CXXRecordDecl *RD) override; 210 211 llvm::Value *getVTableAddressPointInStructor( 212 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, 213 BaseSubobject Base, const CXXRecordDecl *NearestVBase, 214 bool &NeedsVirtualOffset) override; 215 216 llvm::Constant * 217 getVTableAddressPointForConstExpr(BaseSubobject Base, 218 const CXXRecordDecl *VTableClass) override; 219 220 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD, 221 CharUnits VPtrOffset) override; 222 223 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD, 224 llvm::Value *This, 225 llvm::Type *Ty) override; 226 227 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF, 228 const CXXDestructorDecl *Dtor, 229 CXXDtorType DtorType, 230 llvm::Value *This, 231 const CXXMemberCallExpr *CE) override; 232 233 void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF, GlobalDecl GD, 234 CallArgList &CallArgs) override { 235 assert(GD.getDtorType() == Dtor_Deleting && 236 "Only deleting destructor thunks are available in this ABI"); 237 CallArgs.add(RValue::get(getStructorImplicitParamValue(CGF)), 238 getContext().IntTy); 239 } 240 241 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override; 242 243 llvm::GlobalVariable * 244 getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD, 245 llvm::GlobalVariable::LinkageTypes Linkage); 246 247 void emitVBTableDefinition(const VPtrInfo &VBT, const CXXRecordDecl *RD, 248 llvm::GlobalVariable *GV) const; 249 250 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, 251 GlobalDecl GD, bool ReturnAdjustment) override { 252 // Never dllimport/dllexport thunks. 253 Thunk->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); 254 255 GVALinkage Linkage = 256 getContext().GetGVALinkageForFunction(cast<FunctionDecl>(GD.getDecl())); 257 258 if (Linkage == GVA_Internal) 259 Thunk->setLinkage(llvm::GlobalValue::InternalLinkage); 260 else if (ReturnAdjustment) 261 Thunk->setLinkage(llvm::GlobalValue::WeakODRLinkage); 262 else 263 Thunk->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage); 264 } 265 266 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This, 267 const ThisAdjustment &TA) override; 268 269 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret, 270 const ReturnAdjustment &RA) override; 271 272 void EmitThreadLocalInitFuncs( 273 CodeGenModule &CGM, 274 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>> 275 CXXThreadLocals, 276 ArrayRef<llvm::Function *> CXXThreadLocalInits, 277 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) override; 278 279 bool usesThreadWrapperFunction() const override { return false; } 280 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD, 281 QualType LValType) override; 282 283 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, 284 llvm::GlobalVariable *DeclPtr, 285 bool PerformInit) override; 286 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, 287 llvm::Constant *Dtor, llvm::Constant *Addr) override; 288 289 // ==== Notes on array cookies ========= 290 // 291 // MSVC seems to only use cookies when the class has a destructor; a 292 // two-argument usual array deallocation function isn't sufficient. 293 // 294 // For example, this code prints "100" and "1": 295 // struct A { 296 // char x; 297 // void *operator new[](size_t sz) { 298 // printf("%u\n", sz); 299 // return malloc(sz); 300 // } 301 // void operator delete[](void *p, size_t sz) { 302 // printf("%u\n", sz); 303 // free(p); 304 // } 305 // }; 306 // int main() { 307 // A *p = new A[100]; 308 // delete[] p; 309 // } 310 // Whereas it prints "104" and "104" if you give A a destructor. 311 312 bool requiresArrayCookie(const CXXDeleteExpr *expr, 313 QualType elementType) override; 314 bool requiresArrayCookie(const CXXNewExpr *expr) override; 315 CharUnits getArrayCookieSizeImpl(QualType type) override; 316 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF, 317 llvm::Value *NewPtr, 318 llvm::Value *NumElements, 319 const CXXNewExpr *expr, 320 QualType ElementType) override; 321 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, 322 llvm::Value *allocPtr, 323 CharUnits cookieSize) override; 324 325 friend struct MSRTTIBuilder; 326 327 bool isImageRelative() const { 328 return CGM.getTarget().getPointerWidth(/*AddressSpace=*/0) == 64; 329 } 330 331 // 5 routines for constructing the llvm types for MS RTTI structs. 332 llvm::StructType *getTypeDescriptorType(StringRef TypeInfoString) { 333 llvm::SmallString<32> TDTypeName("rtti.TypeDescriptor"); 334 TDTypeName += llvm::utostr(TypeInfoString.size()); 335 llvm::StructType *&TypeDescriptorType = 336 TypeDescriptorTypeMap[TypeInfoString.size()]; 337 if (TypeDescriptorType) 338 return TypeDescriptorType; 339 llvm::Type *FieldTypes[] = { 340 CGM.Int8PtrPtrTy, 341 CGM.Int8PtrTy, 342 llvm::ArrayType::get(CGM.Int8Ty, TypeInfoString.size() + 1)}; 343 TypeDescriptorType = 344 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, TDTypeName); 345 return TypeDescriptorType; 346 } 347 348 llvm::Type *getImageRelativeType(llvm::Type *PtrType) { 349 if (!isImageRelative()) 350 return PtrType; 351 return CGM.IntTy; 352 } 353 354 llvm::StructType *getBaseClassDescriptorType() { 355 if (BaseClassDescriptorType) 356 return BaseClassDescriptorType; 357 llvm::Type *FieldTypes[] = { 358 getImageRelativeType(CGM.Int8PtrTy), 359 CGM.IntTy, 360 CGM.IntTy, 361 CGM.IntTy, 362 CGM.IntTy, 363 CGM.IntTy, 364 getImageRelativeType(getClassHierarchyDescriptorType()->getPointerTo()), 365 }; 366 BaseClassDescriptorType = llvm::StructType::create( 367 CGM.getLLVMContext(), FieldTypes, "rtti.BaseClassDescriptor"); 368 return BaseClassDescriptorType; 369 } 370 371 llvm::StructType *getClassHierarchyDescriptorType() { 372 if (ClassHierarchyDescriptorType) 373 return ClassHierarchyDescriptorType; 374 // Forward-declare RTTIClassHierarchyDescriptor to break a cycle. 375 ClassHierarchyDescriptorType = llvm::StructType::create( 376 CGM.getLLVMContext(), "rtti.ClassHierarchyDescriptor"); 377 llvm::Type *FieldTypes[] = { 378 CGM.IntTy, 379 CGM.IntTy, 380 CGM.IntTy, 381 getImageRelativeType( 382 getBaseClassDescriptorType()->getPointerTo()->getPointerTo()), 383 }; 384 ClassHierarchyDescriptorType->setBody(FieldTypes); 385 return ClassHierarchyDescriptorType; 386 } 387 388 llvm::StructType *getCompleteObjectLocatorType() { 389 if (CompleteObjectLocatorType) 390 return CompleteObjectLocatorType; 391 CompleteObjectLocatorType = llvm::StructType::create( 392 CGM.getLLVMContext(), "rtti.CompleteObjectLocator"); 393 llvm::Type *FieldTypes[] = { 394 CGM.IntTy, 395 CGM.IntTy, 396 CGM.IntTy, 397 getImageRelativeType(CGM.Int8PtrTy), 398 getImageRelativeType(getClassHierarchyDescriptorType()->getPointerTo()), 399 getImageRelativeType(CompleteObjectLocatorType), 400 }; 401 llvm::ArrayRef<llvm::Type *> FieldTypesRef(FieldTypes); 402 if (!isImageRelative()) 403 FieldTypesRef = FieldTypesRef.drop_back(); 404 CompleteObjectLocatorType->setBody(FieldTypesRef); 405 return CompleteObjectLocatorType; 406 } 407 408 llvm::GlobalVariable *getImageBase() { 409 StringRef Name = "__ImageBase"; 410 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name)) 411 return GV; 412 413 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty, 414 /*isConstant=*/true, 415 llvm::GlobalValue::ExternalLinkage, 416 /*Initializer=*/nullptr, Name); 417 } 418 419 llvm::Constant *getImageRelativeConstant(llvm::Constant *PtrVal) { 420 if (!isImageRelative()) 421 return PtrVal; 422 423 if (PtrVal->isNullValue()) 424 return llvm::Constant::getNullValue(CGM.IntTy); 425 426 llvm::Constant *ImageBaseAsInt = 427 llvm::ConstantExpr::getPtrToInt(getImageBase(), CGM.IntPtrTy); 428 llvm::Constant *PtrValAsInt = 429 llvm::ConstantExpr::getPtrToInt(PtrVal, CGM.IntPtrTy); 430 llvm::Constant *Diff = 431 llvm::ConstantExpr::getSub(PtrValAsInt, ImageBaseAsInt, 432 /*HasNUW=*/true, /*HasNSW=*/true); 433 return llvm::ConstantExpr::getTrunc(Diff, CGM.IntTy); 434 } 435 436private: 437 MicrosoftMangleContext &getMangleContext() { 438 return cast<MicrosoftMangleContext>(CodeGen::CGCXXABI::getMangleContext()); 439 } 440 441 llvm::Constant *getZeroInt() { 442 return llvm::ConstantInt::get(CGM.IntTy, 0); 443 } 444 445 llvm::Constant *getAllOnesInt() { 446 return llvm::Constant::getAllOnesValue(CGM.IntTy); 447 } 448 449 llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) { 450 return C ? C : getZeroInt(); 451 } 452 453 llvm::Value *getValueOrZeroInt(llvm::Value *C) { 454 return C ? C : getZeroInt(); 455 } 456 457 CharUnits getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD); 458 459 void 460 GetNullMemberPointerFields(const MemberPointerType *MPT, 461 llvm::SmallVectorImpl<llvm::Constant *> &fields); 462 463 /// \brief Shared code for virtual base adjustment. Returns the offset from 464 /// the vbptr to the virtual base. Optionally returns the address of the 465 /// vbptr itself. 466 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, 467 llvm::Value *Base, 468 llvm::Value *VBPtrOffset, 469 llvm::Value *VBTableOffset, 470 llvm::Value **VBPtr = nullptr); 471 472 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, 473 llvm::Value *Base, 474 int32_t VBPtrOffset, 475 int32_t VBTableOffset, 476 llvm::Value **VBPtr = nullptr) { 477 assert(VBTableOffset % 4 == 0 && "should be byte offset into table of i32s"); 478 llvm::Value *VBPOffset = llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), 479 *VBTOffset = llvm::ConstantInt::get(CGM.IntTy, VBTableOffset); 480 return GetVBaseOffsetFromVBPtr(CGF, Base, VBPOffset, VBTOffset, VBPtr); 481 } 482 483 std::pair<llvm::Value *, llvm::Value *> 484 performBaseAdjustment(CodeGenFunction &CGF, llvm::Value *Value, 485 QualType SrcRecordTy); 486 487 /// \brief Performs a full virtual base adjustment. Used to dereference 488 /// pointers to members of virtual bases. 489 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const Expr *E, 490 const CXXRecordDecl *RD, llvm::Value *Base, 491 llvm::Value *VirtualBaseAdjustmentOffset, 492 llvm::Value *VBPtrOffset /* optional */); 493 494 /// \brief Emits a full member pointer with the fields common to data and 495 /// function member pointers. 496 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField, 497 bool IsMemberFunction, 498 const CXXRecordDecl *RD, 499 CharUnits NonVirtualBaseAdjustment); 500 501 llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD, 502 const CXXMethodDecl *MD, 503 CharUnits NonVirtualBaseAdjustment); 504 505 bool MemberPointerConstantIsNull(const MemberPointerType *MPT, 506 llvm::Constant *MP); 507 508 /// \brief - Initialize all vbptrs of 'this' with RD as the complete type. 509 void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD); 510 511 /// \brief Caching wrapper around VBTableBuilder::enumerateVBTables(). 512 const VBTableGlobals &enumerateVBTables(const CXXRecordDecl *RD); 513 514 /// \brief Generate a thunk for calling a virtual member function MD. 515 llvm::Function *EmitVirtualMemPtrThunk( 516 const CXXMethodDecl *MD, 517 const MicrosoftVTableContext::MethodVFTableLocation &ML); 518 519public: 520 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override; 521 522 bool isZeroInitializable(const MemberPointerType *MPT) override; 523 524 bool isMemberPointerConvertible(const MemberPointerType *MPT) const override { 525 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 526 return RD->hasAttr<MSInheritanceAttr>(); 527 } 528 529 bool isTypeInfoCalculable(QualType Ty) const override { 530 if (!CGCXXABI::isTypeInfoCalculable(Ty)) 531 return false; 532 if (const auto *MPT = Ty->getAs<MemberPointerType>()) { 533 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 534 if (!RD->hasAttr<MSInheritanceAttr>()) 535 return false; 536 } 537 return true; 538 } 539 540 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override; 541 542 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT, 543 CharUnits offset) override; 544 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override; 545 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override; 546 547 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF, 548 llvm::Value *L, 549 llvm::Value *R, 550 const MemberPointerType *MPT, 551 bool Inequality) override; 552 553 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF, 554 llvm::Value *MemPtr, 555 const MemberPointerType *MPT) override; 556 557 llvm::Value * 558 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E, 559 llvm::Value *Base, llvm::Value *MemPtr, 560 const MemberPointerType *MPT) override; 561 562 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF, 563 const CastExpr *E, 564 llvm::Value *Src) override; 565 566 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E, 567 llvm::Constant *Src) override; 568 569 llvm::Value * 570 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, const Expr *E, 571 llvm::Value *&This, llvm::Value *MemPtr, 572 const MemberPointerType *MPT) override; 573 574 void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override; 575 576 llvm::StructType *getCatchHandlerTypeType() { 577 if (!CatchHandlerTypeType) { 578 llvm::Type *FieldTypes[] = { 579 CGM.IntTy, // Flags 580 CGM.Int8PtrTy, // TypeDescriptor 581 }; 582 CatchHandlerTypeType = llvm::StructType::create( 583 CGM.getLLVMContext(), FieldTypes, "eh.CatchHandlerType"); 584 } 585 return CatchHandlerTypeType; 586 } 587 588 llvm::StructType *getCatchableTypeType() { 589 if (CatchableTypeType) 590 return CatchableTypeType; 591 llvm::Type *FieldTypes[] = { 592 CGM.IntTy, // Flags 593 getImageRelativeType(CGM.Int8PtrTy), // TypeDescriptor 594 CGM.IntTy, // NonVirtualAdjustment 595 CGM.IntTy, // OffsetToVBPtr 596 CGM.IntTy, // VBTableIndex 597 CGM.IntTy, // Size 598 getImageRelativeType(CGM.Int8PtrTy) // CopyCtor 599 }; 600 CatchableTypeType = llvm::StructType::create( 601 CGM.getLLVMContext(), FieldTypes, "eh.CatchableType"); 602 return CatchableTypeType; 603 } 604 605 llvm::StructType *getCatchableTypeArrayType(uint32_t NumEntries) { 606 llvm::StructType *&CatchableTypeArrayType = 607 CatchableTypeArrayTypeMap[NumEntries]; 608 if (CatchableTypeArrayType) 609 return CatchableTypeArrayType; 610 611 llvm::SmallString<23> CTATypeName("eh.CatchableTypeArray."); 612 CTATypeName += llvm::utostr(NumEntries); 613 llvm::Type *CTType = 614 getImageRelativeType(getCatchableTypeType()->getPointerTo()); 615 llvm::Type *FieldTypes[] = { 616 CGM.IntTy, // NumEntries 617 llvm::ArrayType::get(CTType, NumEntries) // CatchableTypes 618 }; 619 CatchableTypeArrayType = 620 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, CTATypeName); 621 return CatchableTypeArrayType; 622 } 623 624 llvm::StructType *getThrowInfoType() { 625 if (ThrowInfoType) 626 return ThrowInfoType; 627 llvm::Type *FieldTypes[] = { 628 CGM.IntTy, // Flags 629 getImageRelativeType(CGM.Int8PtrTy), // CleanupFn 630 getImageRelativeType(CGM.Int8PtrTy), // ForwardCompat 631 getImageRelativeType(CGM.Int8PtrTy) // CatchableTypeArray 632 }; 633 ThrowInfoType = llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, 634 "eh.ThrowInfo"); 635 return ThrowInfoType; 636 } 637 638 llvm::Constant *getThrowFn() { 639 // _CxxThrowException is passed an exception object and a ThrowInfo object 640 // which describes the exception. 641 llvm::Type *Args[] = {CGM.Int8PtrTy, getThrowInfoType()->getPointerTo()}; 642 llvm::FunctionType *FTy = 643 llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false); 644 auto *Fn = cast<llvm::Function>( 645 CGM.CreateRuntimeFunction(FTy, "_CxxThrowException")); 646 // _CxxThrowException is stdcall on 32-bit x86 platforms. 647 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::x86) 648 Fn->setCallingConv(llvm::CallingConv::X86_StdCall); 649 return Fn; 650 } 651 652 llvm::Function *getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD, 653 CXXCtorType CT); 654 655 llvm::Constant *getCatchableType(QualType T, 656 uint32_t NVOffset = 0, 657 int32_t VBPtrOffset = -1, 658 uint32_t VBIndex = 0); 659 660 llvm::GlobalVariable *getCatchableTypeArray(QualType T); 661 662 llvm::GlobalVariable *getThrowInfo(QualType T) override; 663 664private: 665 typedef std::pair<const CXXRecordDecl *, CharUnits> VFTableIdTy; 666 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalVariable *> VTablesMapTy; 667 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalValue *> VFTablesMapTy; 668 /// \brief All the vftables that have been referenced. 669 VFTablesMapTy VFTablesMap; 670 VTablesMapTy VTablesMap; 671 672 /// \brief This set holds the record decls we've deferred vtable emission for. 673 llvm::SmallPtrSet<const CXXRecordDecl *, 4> DeferredVFTables; 674 675 676 /// \brief All the vbtables which have been referenced. 677 llvm::DenseMap<const CXXRecordDecl *, VBTableGlobals> VBTablesMap; 678 679 /// Info on the global variable used to guard initialization of static locals. 680 /// The BitIndex field is only used for externally invisible declarations. 681 struct GuardInfo { 682 GuardInfo() : Guard(nullptr), BitIndex(0) {} 683 llvm::GlobalVariable *Guard; 684 unsigned BitIndex; 685 }; 686 687 /// Map from DeclContext to the current guard variable. We assume that the 688 /// AST is visited in source code order. 689 llvm::DenseMap<const DeclContext *, GuardInfo> GuardVariableMap; 690 691 llvm::DenseMap<size_t, llvm::StructType *> TypeDescriptorTypeMap; 692 llvm::StructType *BaseClassDescriptorType; 693 llvm::StructType *ClassHierarchyDescriptorType; 694 llvm::StructType *CompleteObjectLocatorType; 695 696 llvm::DenseMap<QualType, llvm::GlobalVariable *> CatchableTypeArrays; 697 698 llvm::StructType *CatchableTypeType; 699 llvm::DenseMap<uint32_t, llvm::StructType *> CatchableTypeArrayTypeMap; 700 llvm::StructType *ThrowInfoType; 701 llvm::StructType *CatchHandlerTypeType; 702}; 703 704} 705 706CGCXXABI::RecordArgABI 707MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const { 708 switch (CGM.getTarget().getTriple().getArch()) { 709 default: 710 // FIXME: Implement for other architectures. 711 return RAA_Default; 712 713 case llvm::Triple::x86: 714 // All record arguments are passed in memory on x86. Decide whether to 715 // construct the object directly in argument memory, or to construct the 716 // argument elsewhere and copy the bytes during the call. 717 718 // If C++ prohibits us from making a copy, construct the arguments directly 719 // into argument memory. 720 if (!canCopyArgument(RD)) 721 return RAA_DirectInMemory; 722 723 // Otherwise, construct the argument into a temporary and copy the bytes 724 // into the outgoing argument memory. 725 return RAA_Default; 726 727 case llvm::Triple::x86_64: 728 // Win64 passes objects with non-trivial copy ctors indirectly. 729 if (RD->hasNonTrivialCopyConstructor()) 730 return RAA_Indirect; 731 732 // If an object has a destructor, we'd really like to pass it indirectly 733 // because it allows us to elide copies. Unfortunately, MSVC makes that 734 // impossible for small types, which it will pass in a single register or 735 // stack slot. Most objects with dtors are large-ish, so handle that early. 736 // We can't call out all large objects as being indirect because there are 737 // multiple x64 calling conventions and the C++ ABI code shouldn't dictate 738 // how we pass large POD types. 739 if (RD->hasNonTrivialDestructor() && 740 getContext().getTypeSize(RD->getTypeForDecl()) > 64) 741 return RAA_Indirect; 742 743 // We have a trivial copy constructor or no copy constructors, but we have 744 // to make sure it isn't deleted. 745 bool CopyDeleted = false; 746 for (const CXXConstructorDecl *CD : RD->ctors()) { 747 if (CD->isCopyConstructor()) { 748 assert(CD->isTrivial()); 749 // We had at least one undeleted trivial copy ctor. Return directly. 750 if (!CD->isDeleted()) 751 return RAA_Default; 752 CopyDeleted = true; 753 } 754 } 755 756 // The trivial copy constructor was deleted. Return indirectly. 757 if (CopyDeleted) 758 return RAA_Indirect; 759 760 // There were no copy ctors. Return in RAX. 761 return RAA_Default; 762 } 763 764 llvm_unreachable("invalid enum"); 765} 766 767void MicrosoftCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF, 768 const CXXDeleteExpr *DE, 769 llvm::Value *Ptr, 770 QualType ElementType, 771 const CXXDestructorDecl *Dtor) { 772 // FIXME: Provide a source location here even though there's no 773 // CXXMemberCallExpr for dtor call. 774 bool UseGlobalDelete = DE->isGlobalDelete(); 775 CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting; 776 llvm::Value *MDThis = 777 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr); 778 if (UseGlobalDelete) 779 CGF.EmitDeleteCall(DE->getOperatorDelete(), MDThis, ElementType); 780} 781 782void MicrosoftCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) { 783 llvm::Value *Args[] = { 784 llvm::ConstantPointerNull::get(CGM.Int8PtrTy), 785 llvm::ConstantPointerNull::get(getThrowInfoType()->getPointerTo())}; 786 auto *Fn = getThrowFn(); 787 if (isNoReturn) 788 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, Args); 789 else 790 CGF.EmitRuntimeCallOrInvoke(Fn, Args); 791} 792 793namespace { 794struct CallEndCatchMSVC : EHScopeStack::Cleanup { 795 CallEndCatchMSVC() {} 796 void Emit(CodeGenFunction &CGF, Flags flags) override { 797 CGF.EmitNounwindRuntimeCall( 798 CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_endcatch)); 799 } 800}; 801} 802 803void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF, 804 const CXXCatchStmt *S) { 805 // In the MS ABI, the runtime handles the copy, and the catch handler is 806 // responsible for destruction. 807 VarDecl *CatchParam = S->getExceptionDecl(); 808 llvm::Value *Exn = CGF.getExceptionFromSlot(); 809 llvm::Function *BeginCatch = 810 CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_begincatch); 811 812 // If this is a catch-all or the catch parameter is unnamed, we don't need to 813 // emit an alloca to the object. 814 if (!CatchParam || !CatchParam->getDeclName()) { 815 llvm::Value *Args[2] = {Exn, llvm::Constant::getNullValue(CGF.Int8PtrTy)}; 816 CGF.EmitNounwindRuntimeCall(BeginCatch, Args); 817 CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalAndEHCleanup); 818 return; 819 } 820 821 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam); 822 llvm::Value *ParamAddr = 823 CGF.Builder.CreateBitCast(var.getObjectAddress(CGF), CGF.Int8PtrTy); 824 llvm::Value *Args[2] = {Exn, ParamAddr}; 825 CGF.EmitNounwindRuntimeCall(BeginCatch, Args); 826 // FIXME: Do we really need exceptional endcatch cleanups? 827 CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalAndEHCleanup); 828 CGF.EmitAutoVarCleanups(var); 829} 830 831std::pair<llvm::Value *, llvm::Value *> 832MicrosoftCXXABI::performBaseAdjustment(CodeGenFunction &CGF, llvm::Value *Value, 833 QualType SrcRecordTy) { 834 Value = CGF.Builder.CreateBitCast(Value, CGF.Int8PtrTy); 835 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl(); 836 const ASTContext &Context = getContext(); 837 838 if (Context.getASTRecordLayout(SrcDecl).hasExtendableVFPtr()) 839 return std::make_pair(Value, llvm::ConstantInt::get(CGF.Int32Ty, 0)); 840 841 // Perform a base adjustment. 842 const CXXBaseSpecifier *PolymorphicBase = std::find_if( 843 SrcDecl->vbases_begin(), SrcDecl->vbases_end(), 844 [&](const CXXBaseSpecifier &Base) { 845 const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl(); 846 return Context.getASTRecordLayout(BaseDecl).hasExtendableVFPtr(); 847 }); 848 llvm::Value *Offset = GetVirtualBaseClassOffset( 849 CGF, Value, SrcDecl, PolymorphicBase->getType()->getAsCXXRecordDecl()); 850 Value = CGF.Builder.CreateInBoundsGEP(Value, Offset); 851 Offset = CGF.Builder.CreateTrunc(Offset, CGF.Int32Ty); 852 return std::make_pair(Value, Offset); 853} 854 855bool MicrosoftCXXABI::shouldTypeidBeNullChecked(bool IsDeref, 856 QualType SrcRecordTy) { 857 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl(); 858 return IsDeref && 859 !getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr(); 860} 861 862static llvm::CallSite emitRTtypeidCall(CodeGenFunction &CGF, 863 llvm::Value *Argument) { 864 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy}; 865 llvm::FunctionType *FTy = 866 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false); 867 llvm::Value *Args[] = {Argument}; 868 llvm::Constant *Fn = CGF.CGM.CreateRuntimeFunction(FTy, "__RTtypeid"); 869 return CGF.EmitRuntimeCallOrInvoke(Fn, Args); 870} 871 872void MicrosoftCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) { 873 llvm::CallSite Call = 874 emitRTtypeidCall(CGF, llvm::Constant::getNullValue(CGM.VoidPtrTy)); 875 Call.setDoesNotReturn(); 876 CGF.Builder.CreateUnreachable(); 877} 878 879llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF, 880 QualType SrcRecordTy, 881 llvm::Value *ThisPtr, 882 llvm::Type *StdTypeInfoPtrTy) { 883 llvm::Value *Offset; 884 std::tie(ThisPtr, Offset) = performBaseAdjustment(CGF, ThisPtr, SrcRecordTy); 885 return CGF.Builder.CreateBitCast( 886 emitRTtypeidCall(CGF, ThisPtr).getInstruction(), StdTypeInfoPtrTy); 887} 888 889bool MicrosoftCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr, 890 QualType SrcRecordTy) { 891 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl(); 892 return SrcIsPtr && 893 !getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr(); 894} 895 896llvm::Value *MicrosoftCXXABI::EmitDynamicCastCall( 897 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy, 898 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) { 899 llvm::Type *DestLTy = CGF.ConvertType(DestTy); 900 901 llvm::Value *SrcRTTI = 902 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType()); 903 llvm::Value *DestRTTI = 904 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType()); 905 906 llvm::Value *Offset; 907 std::tie(Value, Offset) = performBaseAdjustment(CGF, Value, SrcRecordTy); 908 909 // PVOID __RTDynamicCast( 910 // PVOID inptr, 911 // LONG VfDelta, 912 // PVOID SrcType, 913 // PVOID TargetType, 914 // BOOL isReference) 915 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy, CGF.Int32Ty, CGF.Int8PtrTy, 916 CGF.Int8PtrTy, CGF.Int32Ty}; 917 llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction( 918 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false), 919 "__RTDynamicCast"); 920 llvm::Value *Args[] = { 921 Value, Offset, SrcRTTI, DestRTTI, 922 llvm::ConstantInt::get(CGF.Int32Ty, DestTy->isReferenceType())}; 923 Value = CGF.EmitRuntimeCallOrInvoke(Function, Args).getInstruction(); 924 return CGF.Builder.CreateBitCast(Value, DestLTy); 925} 926 927llvm::Value * 928MicrosoftCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value, 929 QualType SrcRecordTy, 930 QualType DestTy) { 931 llvm::Value *Offset; 932 std::tie(Value, Offset) = performBaseAdjustment(CGF, Value, SrcRecordTy); 933 934 // PVOID __RTCastToVoid( 935 // PVOID inptr) 936 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy}; 937 llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction( 938 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false), 939 "__RTCastToVoid"); 940 llvm::Value *Args[] = {Value}; 941 return CGF.EmitRuntimeCall(Function, Args); 942} 943 944bool MicrosoftCXXABI::EmitBadCastCall(CodeGenFunction &CGF) { 945 return false; 946} 947 948llvm::Value *MicrosoftCXXABI::GetVirtualBaseClassOffset( 949 CodeGenFunction &CGF, llvm::Value *This, const CXXRecordDecl *ClassDecl, 950 const CXXRecordDecl *BaseClassDecl) { 951 const ASTContext &Context = getContext(); 952 int64_t VBPtrChars = 953 Context.getASTRecordLayout(ClassDecl).getVBPtrOffset().getQuantity(); 954 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars); 955 CharUnits IntSize = Context.getTypeSizeInChars(Context.IntTy); 956 CharUnits VBTableChars = 957 IntSize * 958 CGM.getMicrosoftVTableContext().getVBTableIndex(ClassDecl, BaseClassDecl); 959 llvm::Value *VBTableOffset = 960 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity()); 961 962 llvm::Value *VBPtrToNewBase = 963 GetVBaseOffsetFromVBPtr(CGF, This, VBPtrOffset, VBTableOffset); 964 VBPtrToNewBase = 965 CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy); 966 return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase); 967} 968 969bool MicrosoftCXXABI::HasThisReturn(GlobalDecl GD) const { 970 return isa<CXXConstructorDecl>(GD.getDecl()); 971} 972 973static bool isDeletingDtor(GlobalDecl GD) { 974 return isa<CXXDestructorDecl>(GD.getDecl()) && 975 GD.getDtorType() == Dtor_Deleting; 976} 977 978bool MicrosoftCXXABI::hasMostDerivedReturn(GlobalDecl GD) const { 979 return isDeletingDtor(GD); 980} 981 982bool MicrosoftCXXABI::classifyReturnType(CGFunctionInfo &FI) const { 983 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl(); 984 if (!RD) 985 return false; 986 987 if (FI.isInstanceMethod()) { 988 // If it's an instance method, aggregates are always returned indirectly via 989 // the second parameter. 990 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false); 991 FI.getReturnInfo().setSRetAfterThis(FI.isInstanceMethod()); 992 return true; 993 } else if (!RD->isPOD()) { 994 // If it's a free function, non-POD types are returned indirectly. 995 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false); 996 return true; 997 } 998 999 // Otherwise, use the C ABI rules. 1000 return false; 1001} 1002 1003llvm::BasicBlock * 1004MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF, 1005 const CXXRecordDecl *RD) { 1006 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF); 1007 assert(IsMostDerivedClass && 1008 "ctor for a class with virtual bases must have an implicit parameter"); 1009 llvm::Value *IsCompleteObject = 1010 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object"); 1011 1012 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases"); 1013 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases"); 1014 CGF.Builder.CreateCondBr(IsCompleteObject, 1015 CallVbaseCtorsBB, SkipVbaseCtorsBB); 1016 1017 CGF.EmitBlock(CallVbaseCtorsBB); 1018 1019 // Fill in the vbtable pointers here. 1020 EmitVBPtrStores(CGF, RD); 1021 1022 // CGF will put the base ctor calls in this basic block for us later. 1023 1024 return SkipVbaseCtorsBB; 1025} 1026 1027void MicrosoftCXXABI::initializeHiddenVirtualInheritanceMembers( 1028 CodeGenFunction &CGF, const CXXRecordDecl *RD) { 1029 // In most cases, an override for a vbase virtual method can adjust 1030 // the "this" parameter by applying a constant offset. 1031 // However, this is not enough while a constructor or a destructor of some 1032 // class X is being executed if all the following conditions are met: 1033 // - X has virtual bases, (1) 1034 // - X overrides a virtual method M of a vbase Y, (2) 1035 // - X itself is a vbase of the most derived class. 1036 // 1037 // If (1) and (2) are true, the vtorDisp for vbase Y is a hidden member of X 1038 // which holds the extra amount of "this" adjustment we must do when we use 1039 // the X vftables (i.e. during X ctor or dtor). 1040 // Outside the ctors and dtors, the values of vtorDisps are zero. 1041 1042 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 1043 typedef ASTRecordLayout::VBaseOffsetsMapTy VBOffsets; 1044 const VBOffsets &VBaseMap = Layout.getVBaseOffsetsMap(); 1045 CGBuilderTy &Builder = CGF.Builder; 1046 1047 unsigned AS = 1048 cast<llvm::PointerType>(getThisValue(CGF)->getType())->getAddressSpace(); 1049 llvm::Value *Int8This = nullptr; // Initialize lazily. 1050 1051 for (VBOffsets::const_iterator I = VBaseMap.begin(), E = VBaseMap.end(); 1052 I != E; ++I) { 1053 if (!I->second.hasVtorDisp()) 1054 continue; 1055 1056 llvm::Value *VBaseOffset = 1057 GetVirtualBaseClassOffset(CGF, getThisValue(CGF), RD, I->first); 1058 // FIXME: it doesn't look right that we SExt in GetVirtualBaseClassOffset() 1059 // just to Trunc back immediately. 1060 VBaseOffset = Builder.CreateTruncOrBitCast(VBaseOffset, CGF.Int32Ty); 1061 uint64_t ConstantVBaseOffset = 1062 Layout.getVBaseClassOffset(I->first).getQuantity(); 1063 1064 // vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase). 1065 llvm::Value *VtorDispValue = Builder.CreateSub( 1066 VBaseOffset, llvm::ConstantInt::get(CGM.Int32Ty, ConstantVBaseOffset), 1067 "vtordisp.value"); 1068 1069 if (!Int8This) 1070 Int8This = Builder.CreateBitCast(getThisValue(CGF), 1071 CGF.Int8Ty->getPointerTo(AS)); 1072 llvm::Value *VtorDispPtr = Builder.CreateInBoundsGEP(Int8This, VBaseOffset); 1073 // vtorDisp is always the 32-bits before the vbase in the class layout. 1074 VtorDispPtr = Builder.CreateConstGEP1_32(VtorDispPtr, -4); 1075 VtorDispPtr = Builder.CreateBitCast( 1076 VtorDispPtr, CGF.Int32Ty->getPointerTo(AS), "vtordisp.ptr"); 1077 1078 Builder.CreateStore(VtorDispValue, VtorDispPtr); 1079 } 1080} 1081 1082static bool hasDefaultCXXMethodCC(ASTContext &Context, 1083 const CXXMethodDecl *MD) { 1084 CallingConv ExpectedCallingConv = Context.getDefaultCallingConvention( 1085 /*IsVariadic=*/false, /*IsCXXMethod=*/true); 1086 CallingConv ActualCallingConv = 1087 MD->getType()->getAs<FunctionProtoType>()->getCallConv(); 1088 return ExpectedCallingConv == ActualCallingConv; 1089} 1090 1091void MicrosoftCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) { 1092 // There's only one constructor type in this ABI. 1093 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete)); 1094 1095 // Exported default constructors either have a simple call-site where they use 1096 // the typical calling convention and have a single 'this' pointer for an 1097 // argument -or- they get a wrapper function which appropriately thunks to the 1098 // real default constructor. This thunk is the default constructor closure. 1099 if (D->hasAttr<DLLExportAttr>() && D->isDefaultConstructor()) 1100 if (!hasDefaultCXXMethodCC(getContext(), D) || D->getNumParams() != 0) { 1101 llvm::Function *Fn = getAddrOfCXXCtorClosure(D, Ctor_DefaultClosure); 1102 Fn->setLinkage(llvm::GlobalValue::WeakODRLinkage); 1103 Fn->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 1104 } 1105} 1106 1107void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF, 1108 const CXXRecordDecl *RD) { 1109 llvm::Value *ThisInt8Ptr = 1110 CGF.Builder.CreateBitCast(getThisValue(CGF), CGM.Int8PtrTy, "this.int8"); 1111 const ASTContext &Context = getContext(); 1112 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 1113 1114 const VBTableGlobals &VBGlobals = enumerateVBTables(RD); 1115 for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) { 1116 const VPtrInfo *VBT = (*VBGlobals.VBTables)[I]; 1117 llvm::GlobalVariable *GV = VBGlobals.Globals[I]; 1118 const ASTRecordLayout &SubobjectLayout = 1119 Context.getASTRecordLayout(VBT->BaseWithVPtr); 1120 CharUnits Offs = VBT->NonVirtualOffset; 1121 Offs += SubobjectLayout.getVBPtrOffset(); 1122 if (VBT->getVBaseWithVPtr()) 1123 Offs += Layout.getVBaseClassOffset(VBT->getVBaseWithVPtr()); 1124 llvm::Value *VBPtr = 1125 CGF.Builder.CreateConstInBoundsGEP1_64(ThisInt8Ptr, Offs.getQuantity()); 1126 llvm::Value *GVPtr = 1127 CGF.Builder.CreateConstInBoundsGEP2_32(GV->getValueType(), GV, 0, 0); 1128 VBPtr = CGF.Builder.CreateBitCast(VBPtr, GVPtr->getType()->getPointerTo(0), 1129 "vbptr." + VBT->ReusingBase->getName()); 1130 CGF.Builder.CreateStore(GVPtr, VBPtr); 1131 } 1132} 1133 1134void 1135MicrosoftCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T, 1136 SmallVectorImpl<CanQualType> &ArgTys) { 1137 // TODO: 'for base' flag 1138 if (T == StructorType::Deleting) { 1139 // The scalar deleting destructor takes an implicit int parameter. 1140 ArgTys.push_back(getContext().IntTy); 1141 } 1142 auto *CD = dyn_cast<CXXConstructorDecl>(MD); 1143 if (!CD) 1144 return; 1145 1146 // All parameters are already in place except is_most_derived, which goes 1147 // after 'this' if it's variadic and last if it's not. 1148 1149 const CXXRecordDecl *Class = CD->getParent(); 1150 const FunctionProtoType *FPT = CD->getType()->castAs<FunctionProtoType>(); 1151 if (Class->getNumVBases()) { 1152 if (FPT->isVariadic()) 1153 ArgTys.insert(ArgTys.begin() + 1, getContext().IntTy); 1154 else 1155 ArgTys.push_back(getContext().IntTy); 1156 } 1157} 1158 1159void MicrosoftCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) { 1160 // The TU defining a dtor is only guaranteed to emit a base destructor. All 1161 // other destructor variants are delegating thunks. 1162 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base)); 1163} 1164 1165CharUnits 1166MicrosoftCXXABI::getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD) { 1167 GD = GD.getCanonicalDecl(); 1168 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); 1169 1170 GlobalDecl LookupGD = GD; 1171 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) { 1172 // Complete destructors take a pointer to the complete object as a 1173 // parameter, thus don't need this adjustment. 1174 if (GD.getDtorType() == Dtor_Complete) 1175 return CharUnits(); 1176 1177 // There's no Dtor_Base in vftable but it shares the this adjustment with 1178 // the deleting one, so look it up instead. 1179 LookupGD = GlobalDecl(DD, Dtor_Deleting); 1180 } 1181 1182 MicrosoftVTableContext::MethodVFTableLocation ML = 1183 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(LookupGD); 1184 CharUnits Adjustment = ML.VFPtrOffset; 1185 1186 // Normal virtual instance methods need to adjust from the vfptr that first 1187 // defined the virtual method to the virtual base subobject, but destructors 1188 // do not. The vector deleting destructor thunk applies this adjustment for 1189 // us if necessary. 1190 if (isa<CXXDestructorDecl>(MD)) 1191 Adjustment = CharUnits::Zero(); 1192 1193 if (ML.VBase) { 1194 const ASTRecordLayout &DerivedLayout = 1195 getContext().getASTRecordLayout(MD->getParent()); 1196 Adjustment += DerivedLayout.getVBaseClassOffset(ML.VBase); 1197 } 1198 1199 return Adjustment; 1200} 1201 1202llvm::Value *MicrosoftCXXABI::adjustThisArgumentForVirtualFunctionCall( 1203 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, bool VirtualCall) { 1204 if (!VirtualCall) { 1205 // If the call of a virtual function is not virtual, we just have to 1206 // compensate for the adjustment the virtual function does in its prologue. 1207 CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(GD); 1208 if (Adjustment.isZero()) 1209 return This; 1210 1211 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace(); 1212 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS); 1213 This = CGF.Builder.CreateBitCast(This, charPtrTy); 1214 assert(Adjustment.isPositive()); 1215 return CGF.Builder.CreateConstGEP1_32(This, Adjustment.getQuantity()); 1216 } 1217 1218 GD = GD.getCanonicalDecl(); 1219 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); 1220 1221 GlobalDecl LookupGD = GD; 1222 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) { 1223 // Complete dtors take a pointer to the complete object, 1224 // thus don't need adjustment. 1225 if (GD.getDtorType() == Dtor_Complete) 1226 return This; 1227 1228 // There's only Dtor_Deleting in vftable but it shares the this adjustment 1229 // with the base one, so look up the deleting one instead. 1230 LookupGD = GlobalDecl(DD, Dtor_Deleting); 1231 } 1232 MicrosoftVTableContext::MethodVFTableLocation ML = 1233 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(LookupGD); 1234 1235 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace(); 1236 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS); 1237 CharUnits StaticOffset = ML.VFPtrOffset; 1238 1239 // Base destructors expect 'this' to point to the beginning of the base 1240 // subobject, not the first vfptr that happens to contain the virtual dtor. 1241 // However, we still need to apply the virtual base adjustment. 1242 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base) 1243 StaticOffset = CharUnits::Zero(); 1244 1245 if (ML.VBase) { 1246 This = CGF.Builder.CreateBitCast(This, charPtrTy); 1247 llvm::Value *VBaseOffset = 1248 GetVirtualBaseClassOffset(CGF, This, MD->getParent(), ML.VBase); 1249 This = CGF.Builder.CreateInBoundsGEP(This, VBaseOffset); 1250 } 1251 if (!StaticOffset.isZero()) { 1252 assert(StaticOffset.isPositive()); 1253 This = CGF.Builder.CreateBitCast(This, charPtrTy); 1254 if (ML.VBase) { 1255 // Non-virtual adjustment might result in a pointer outside the allocated 1256 // object, e.g. if the final overrider class is laid out after the virtual 1257 // base that declares a method in the most derived class. 1258 // FIXME: Update the code that emits this adjustment in thunks prologues. 1259 This = CGF.Builder.CreateConstGEP1_32(This, StaticOffset.getQuantity()); 1260 } else { 1261 This = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, This, 1262 StaticOffset.getQuantity()); 1263 } 1264 } 1265 return This; 1266} 1267 1268void MicrosoftCXXABI::addImplicitStructorParams(CodeGenFunction &CGF, 1269 QualType &ResTy, 1270 FunctionArgList &Params) { 1271 ASTContext &Context = getContext(); 1272 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); 1273 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)); 1274 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) { 1275 ImplicitParamDecl *IsMostDerived 1276 = ImplicitParamDecl::Create(Context, nullptr, 1277 CGF.CurGD.getDecl()->getLocation(), 1278 &Context.Idents.get("is_most_derived"), 1279 Context.IntTy); 1280 // The 'most_derived' parameter goes second if the ctor is variadic and last 1281 // if it's not. Dtors can't be variadic. 1282 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>(); 1283 if (FPT->isVariadic()) 1284 Params.insert(Params.begin() + 1, IsMostDerived); 1285 else 1286 Params.push_back(IsMostDerived); 1287 getStructorImplicitParamDecl(CGF) = IsMostDerived; 1288 } else if (isDeletingDtor(CGF.CurGD)) { 1289 ImplicitParamDecl *ShouldDelete 1290 = ImplicitParamDecl::Create(Context, nullptr, 1291 CGF.CurGD.getDecl()->getLocation(), 1292 &Context.Idents.get("should_call_delete"), 1293 Context.IntTy); 1294 Params.push_back(ShouldDelete); 1295 getStructorImplicitParamDecl(CGF) = ShouldDelete; 1296 } 1297} 1298 1299llvm::Value *MicrosoftCXXABI::adjustThisParameterInVirtualFunctionPrologue( 1300 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) { 1301 // In this ABI, every virtual function takes a pointer to one of the 1302 // subobjects that first defines it as the 'this' parameter, rather than a 1303 // pointer to the final overrider subobject. Thus, we need to adjust it back 1304 // to the final overrider subobject before use. 1305 // See comments in the MicrosoftVFTableContext implementation for the details. 1306 CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(GD); 1307 if (Adjustment.isZero()) 1308 return This; 1309 1310 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace(); 1311 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS), 1312 *thisTy = This->getType(); 1313 1314 This = CGF.Builder.CreateBitCast(This, charPtrTy); 1315 assert(Adjustment.isPositive()); 1316 This = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, This, 1317 -Adjustment.getQuantity()); 1318 return CGF.Builder.CreateBitCast(This, thisTy); 1319} 1320 1321void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) { 1322 EmitThisParam(CGF); 1323 1324 /// If this is a function that the ABI specifies returns 'this', initialize 1325 /// the return slot to 'this' at the start of the function. 1326 /// 1327 /// Unlike the setting of return types, this is done within the ABI 1328 /// implementation instead of by clients of CGCXXABI because: 1329 /// 1) getThisValue is currently protected 1330 /// 2) in theory, an ABI could implement 'this' returns some other way; 1331 /// HasThisReturn only specifies a contract, not the implementation 1332 if (HasThisReturn(CGF.CurGD)) 1333 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue); 1334 else if (hasMostDerivedReturn(CGF.CurGD)) 1335 CGF.Builder.CreateStore(CGF.EmitCastToVoidPtr(getThisValue(CGF)), 1336 CGF.ReturnValue); 1337 1338 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); 1339 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) { 1340 assert(getStructorImplicitParamDecl(CGF) && 1341 "no implicit parameter for a constructor with virtual bases?"); 1342 getStructorImplicitParamValue(CGF) 1343 = CGF.Builder.CreateLoad( 1344 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), 1345 "is_most_derived"); 1346 } 1347 1348 if (isDeletingDtor(CGF.CurGD)) { 1349 assert(getStructorImplicitParamDecl(CGF) && 1350 "no implicit parameter for a deleting destructor?"); 1351 getStructorImplicitParamValue(CGF) 1352 = CGF.Builder.CreateLoad( 1353 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), 1354 "should_call_delete"); 1355 } 1356} 1357 1358unsigned MicrosoftCXXABI::addImplicitConstructorArgs( 1359 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type, 1360 bool ForVirtualBase, bool Delegating, CallArgList &Args) { 1361 assert(Type == Ctor_Complete || Type == Ctor_Base); 1362 1363 // Check if we need a 'most_derived' parameter. 1364 if (!D->getParent()->getNumVBases()) 1365 return 0; 1366 1367 // Add the 'most_derived' argument second if we are variadic or last if not. 1368 const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>(); 1369 llvm::Value *MostDerivedArg = 1370 llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete); 1371 RValue RV = RValue::get(MostDerivedArg); 1372 if (MostDerivedArg) { 1373 if (FPT->isVariadic()) 1374 Args.insert(Args.begin() + 1, 1375 CallArg(RV, getContext().IntTy, /*needscopy=*/false)); 1376 else 1377 Args.add(RV, getContext().IntTy); 1378 } 1379 1380 return 1; // Added one arg. 1381} 1382 1383void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF, 1384 const CXXDestructorDecl *DD, 1385 CXXDtorType Type, bool ForVirtualBase, 1386 bool Delegating, llvm::Value *This) { 1387 llvm::Value *Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type)); 1388 1389 if (DD->isVirtual()) { 1390 assert(Type != CXXDtorType::Dtor_Deleting && 1391 "The deleting destructor should only be called via a virtual call"); 1392 This = adjustThisArgumentForVirtualFunctionCall(CGF, GlobalDecl(DD, Type), 1393 This, false); 1394 } 1395 1396 CGF.EmitCXXStructorCall(DD, Callee, ReturnValueSlot(), This, 1397 /*ImplicitParam=*/nullptr, 1398 /*ImplicitParamTy=*/QualType(), nullptr, 1399 getFromDtorType(Type)); 1400} 1401 1402void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT, 1403 const CXXRecordDecl *RD) { 1404 MicrosoftVTableContext &VFTContext = CGM.getMicrosoftVTableContext(); 1405 const VPtrInfoVector &VFPtrs = VFTContext.getVFPtrOffsets(RD); 1406 1407 for (VPtrInfo *Info : VFPtrs) { 1408 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, Info->FullOffsetInMDC); 1409 if (VTable->hasInitializer()) 1410 continue; 1411 1412 llvm::Constant *RTTI = getContext().getLangOpts().RTTIData 1413 ? getMSCompleteObjectLocator(RD, Info) 1414 : nullptr; 1415 1416 const VTableLayout &VTLayout = 1417 VFTContext.getVFTableLayout(RD, Info->FullOffsetInMDC); 1418 llvm::Constant *Init = CGVT.CreateVTableInitializer( 1419 RD, VTLayout.vtable_component_begin(), 1420 VTLayout.getNumVTableComponents(), VTLayout.vtable_thunk_begin(), 1421 VTLayout.getNumVTableThunks(), RTTI); 1422 1423 VTable->setInitializer(Init); 1424 } 1425} 1426 1427llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor( 1428 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, 1429 const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) { 1430 NeedsVirtualOffset = (NearestVBase != nullptr); 1431 1432 (void)getAddrOfVTable(VTableClass, Base.getBaseOffset()); 1433 VFTableIdTy ID(VTableClass, Base.getBaseOffset()); 1434 llvm::GlobalValue *VTableAddressPoint = VFTablesMap[ID]; 1435 if (!VTableAddressPoint) { 1436 assert(Base.getBase()->getNumVBases() && 1437 !getContext().getASTRecordLayout(Base.getBase()).hasOwnVFPtr()); 1438 } 1439 return VTableAddressPoint; 1440} 1441 1442static void mangleVFTableName(MicrosoftMangleContext &MangleContext, 1443 const CXXRecordDecl *RD, const VPtrInfo *VFPtr, 1444 SmallString<256> &Name) { 1445 llvm::raw_svector_ostream Out(Name); 1446 MangleContext.mangleCXXVFTable(RD, VFPtr->MangledPath, Out); 1447} 1448 1449llvm::Constant *MicrosoftCXXABI::getVTableAddressPointForConstExpr( 1450 BaseSubobject Base, const CXXRecordDecl *VTableClass) { 1451 (void)getAddrOfVTable(VTableClass, Base.getBaseOffset()); 1452 VFTableIdTy ID(VTableClass, Base.getBaseOffset()); 1453 llvm::GlobalValue *VFTable = VFTablesMap[ID]; 1454 assert(VFTable && "Couldn't find a vftable for the given base?"); 1455 return VFTable; 1456} 1457 1458llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD, 1459 CharUnits VPtrOffset) { 1460 // getAddrOfVTable may return 0 if asked to get an address of a vtable which 1461 // shouldn't be used in the given record type. We want to cache this result in 1462 // VFTablesMap, thus a simple zero check is not sufficient. 1463 VFTableIdTy ID(RD, VPtrOffset); 1464 VTablesMapTy::iterator I; 1465 bool Inserted; 1466 std::tie(I, Inserted) = VTablesMap.insert(std::make_pair(ID, nullptr)); 1467 if (!Inserted) 1468 return I->second; 1469 1470 llvm::GlobalVariable *&VTable = I->second; 1471 1472 MicrosoftVTableContext &VTContext = CGM.getMicrosoftVTableContext(); 1473 const VPtrInfoVector &VFPtrs = VTContext.getVFPtrOffsets(RD); 1474 1475 if (DeferredVFTables.insert(RD).second) { 1476 // We haven't processed this record type before. 1477 // Queue up this v-table for possible deferred emission. 1478 CGM.addDeferredVTable(RD); 1479 1480#ifndef NDEBUG 1481 // Create all the vftables at once in order to make sure each vftable has 1482 // a unique mangled name. 1483 llvm::StringSet<> ObservedMangledNames; 1484 for (size_t J = 0, F = VFPtrs.size(); J != F; ++J) { 1485 SmallString<256> Name; 1486 mangleVFTableName(getMangleContext(), RD, VFPtrs[J], Name); 1487 if (!ObservedMangledNames.insert(Name.str()).second) 1488 llvm_unreachable("Already saw this mangling before?"); 1489 } 1490#endif 1491 } 1492 1493 VPtrInfo *const *VFPtrI = 1494 std::find_if(VFPtrs.begin(), VFPtrs.end(), [&](VPtrInfo *VPI) { 1495 return VPI->FullOffsetInMDC == VPtrOffset; 1496 }); 1497 if (VFPtrI == VFPtrs.end()) { 1498 VFTablesMap[ID] = nullptr; 1499 return nullptr; 1500 } 1501 VPtrInfo *VFPtr = *VFPtrI; 1502 1503 SmallString<256> VFTableName; 1504 mangleVFTableName(getMangleContext(), RD, VFPtr, VFTableName); 1505 1506 llvm::GlobalValue::LinkageTypes VFTableLinkage = CGM.getVTableLinkage(RD); 1507 bool VFTableComesFromAnotherTU = 1508 llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage) || 1509 llvm::GlobalValue::isExternalLinkage(VFTableLinkage); 1510 bool VTableAliasIsRequred = 1511 !VFTableComesFromAnotherTU && getContext().getLangOpts().RTTIData; 1512 1513 if (llvm::GlobalValue *VFTable = 1514 CGM.getModule().getNamedGlobal(VFTableName)) { 1515 VFTablesMap[ID] = VFTable; 1516 return VTableAliasIsRequred 1517 ? cast<llvm::GlobalVariable>( 1518 cast<llvm::GlobalAlias>(VFTable)->getBaseObject()) 1519 : cast<llvm::GlobalVariable>(VFTable); 1520 } 1521 1522 uint64_t NumVTableSlots = 1523 VTContext.getVFTableLayout(RD, VFPtr->FullOffsetInMDC) 1524 .getNumVTableComponents(); 1525 llvm::GlobalValue::LinkageTypes VTableLinkage = 1526 VTableAliasIsRequred ? llvm::GlobalValue::PrivateLinkage : VFTableLinkage; 1527 1528 StringRef VTableName = VTableAliasIsRequred ? StringRef() : VFTableName.str(); 1529 1530 llvm::ArrayType *VTableType = 1531 llvm::ArrayType::get(CGM.Int8PtrTy, NumVTableSlots); 1532 1533 // Create a backing variable for the contents of VTable. The VTable may 1534 // or may not include space for a pointer to RTTI data. 1535 llvm::GlobalValue *VFTable; 1536 VTable = new llvm::GlobalVariable(CGM.getModule(), VTableType, 1537 /*isConstant=*/true, VTableLinkage, 1538 /*Initializer=*/nullptr, VTableName); 1539 VTable->setUnnamedAddr(true); 1540 1541 llvm::Comdat *C = nullptr; 1542 if (!VFTableComesFromAnotherTU && 1543 (llvm::GlobalValue::isWeakForLinker(VFTableLinkage) || 1544 (llvm::GlobalValue::isLocalLinkage(VFTableLinkage) && 1545 VTableAliasIsRequred))) 1546 C = CGM.getModule().getOrInsertComdat(VFTableName.str()); 1547 1548 // Only insert a pointer into the VFTable for RTTI data if we are not 1549 // importing it. We never reference the RTTI data directly so there is no 1550 // need to make room for it. 1551 if (VTableAliasIsRequred) { 1552 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0), 1553 llvm::ConstantInt::get(CGM.IntTy, 1)}; 1554 // Create a GEP which points just after the first entry in the VFTable, 1555 // this should be the location of the first virtual method. 1556 llvm::Constant *VTableGEP = llvm::ConstantExpr::getInBoundsGetElementPtr( 1557 VTable->getValueType(), VTable, GEPIndices); 1558 if (llvm::GlobalValue::isWeakForLinker(VFTableLinkage)) { 1559 VFTableLinkage = llvm::GlobalValue::ExternalLinkage; 1560 if (C) 1561 C->setSelectionKind(llvm::Comdat::Largest); 1562 } 1563 VFTable = llvm::GlobalAlias::create( 1564 cast<llvm::SequentialType>(VTableGEP->getType())->getElementType(), 1565 /*AddressSpace=*/0, VFTableLinkage, VFTableName.str(), VTableGEP, 1566 &CGM.getModule()); 1567 VFTable->setUnnamedAddr(true); 1568 } else { 1569 // We don't need a GlobalAlias to be a symbol for the VTable if we won't 1570 // be referencing any RTTI data. 1571 // The GlobalVariable will end up being an appropriate definition of the 1572 // VFTable. 1573 VFTable = VTable; 1574 } 1575 if (C) 1576 VTable->setComdat(C); 1577 1578 if (RD->hasAttr<DLLImportAttr>()) 1579 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); 1580 else if (RD->hasAttr<DLLExportAttr>()) 1581 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 1582 1583 VFTablesMap[ID] = VFTable; 1584 return VTable; 1585} 1586 1587llvm::Value *MicrosoftCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, 1588 GlobalDecl GD, 1589 llvm::Value *This, 1590 llvm::Type *Ty) { 1591 GD = GD.getCanonicalDecl(); 1592 CGBuilderTy &Builder = CGF.Builder; 1593 1594 Ty = Ty->getPointerTo()->getPointerTo(); 1595 llvm::Value *VPtr = 1596 adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true); 1597 llvm::Value *VTable = CGF.GetVTablePtr(VPtr, Ty); 1598 1599 MicrosoftVTableContext::MethodVFTableLocation ML = 1600 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD); 1601 llvm::Value *VFuncPtr = 1602 Builder.CreateConstInBoundsGEP1_64(VTable, ML.Index, "vfn"); 1603 return Builder.CreateLoad(VFuncPtr); 1604} 1605 1606llvm::Value *MicrosoftCXXABI::EmitVirtualDestructorCall( 1607 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType, 1608 llvm::Value *This, const CXXMemberCallExpr *CE) { 1609 assert(CE == nullptr || CE->arg_begin() == CE->arg_end()); 1610 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete); 1611 1612 // We have only one destructor in the vftable but can get both behaviors 1613 // by passing an implicit int parameter. 1614 GlobalDecl GD(Dtor, Dtor_Deleting); 1615 const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration( 1616 Dtor, StructorType::Deleting); 1617 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo); 1618 llvm::Value *Callee = getVirtualFunctionPointer(CGF, GD, This, Ty); 1619 1620 ASTContext &Context = getContext(); 1621 llvm::Value *ImplicitParam = llvm::ConstantInt::get( 1622 llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()), 1623 DtorType == Dtor_Deleting); 1624 1625 This = adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true); 1626 RValue RV = CGF.EmitCXXStructorCall(Dtor, Callee, ReturnValueSlot(), This, 1627 ImplicitParam, Context.IntTy, CE, 1628 StructorType::Deleting); 1629 return RV.getScalarVal(); 1630} 1631 1632const VBTableGlobals & 1633MicrosoftCXXABI::enumerateVBTables(const CXXRecordDecl *RD) { 1634 // At this layer, we can key the cache off of a single class, which is much 1635 // easier than caching each vbtable individually. 1636 llvm::DenseMap<const CXXRecordDecl*, VBTableGlobals>::iterator Entry; 1637 bool Added; 1638 std::tie(Entry, Added) = 1639 VBTablesMap.insert(std::make_pair(RD, VBTableGlobals())); 1640 VBTableGlobals &VBGlobals = Entry->second; 1641 if (!Added) 1642 return VBGlobals; 1643 1644 MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext(); 1645 VBGlobals.VBTables = &Context.enumerateVBTables(RD); 1646 1647 // Cache the globals for all vbtables so we don't have to recompute the 1648 // mangled names. 1649 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD); 1650 for (VPtrInfoVector::const_iterator I = VBGlobals.VBTables->begin(), 1651 E = VBGlobals.VBTables->end(); 1652 I != E; ++I) { 1653 VBGlobals.Globals.push_back(getAddrOfVBTable(**I, RD, Linkage)); 1654 } 1655 1656 return VBGlobals; 1657} 1658 1659llvm::Function *MicrosoftCXXABI::EmitVirtualMemPtrThunk( 1660 const CXXMethodDecl *MD, 1661 const MicrosoftVTableContext::MethodVFTableLocation &ML) { 1662 assert(!isa<CXXConstructorDecl>(MD) && !isa<CXXDestructorDecl>(MD) && 1663 "can't form pointers to ctors or virtual dtors"); 1664 1665 // Calculate the mangled name. 1666 SmallString<256> ThunkName; 1667 llvm::raw_svector_ostream Out(ThunkName); 1668 getMangleContext().mangleVirtualMemPtrThunk(MD, Out); 1669 Out.flush(); 1670 1671 // If the thunk has been generated previously, just return it. 1672 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName)) 1673 return cast<llvm::Function>(GV); 1674 1675 // Create the llvm::Function. 1676 const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeMSMemberPointerThunk(MD); 1677 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo); 1678 llvm::Function *ThunkFn = 1679 llvm::Function::Create(ThunkTy, llvm::Function::ExternalLinkage, 1680 ThunkName.str(), &CGM.getModule()); 1681 assert(ThunkFn->getName() == ThunkName && "name was uniqued!"); 1682 1683 ThunkFn->setLinkage(MD->isExternallyVisible() 1684 ? llvm::GlobalValue::LinkOnceODRLinkage 1685 : llvm::GlobalValue::InternalLinkage); 1686 if (MD->isExternallyVisible()) 1687 ThunkFn->setComdat(CGM.getModule().getOrInsertComdat(ThunkFn->getName())); 1688 1689 CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn); 1690 CGM.SetLLVMFunctionAttributesForDefinition(MD, ThunkFn); 1691 1692 // Add the "thunk" attribute so that LLVM knows that the return type is 1693 // meaningless. These thunks can be used to call functions with differing 1694 // return types, and the caller is required to cast the prototype 1695 // appropriately to extract the correct value. 1696 ThunkFn->addFnAttr("thunk"); 1697 1698 // These thunks can be compared, so they are not unnamed. 1699 ThunkFn->setUnnamedAddr(false); 1700 1701 // Start codegen. 1702 CodeGenFunction CGF(CGM); 1703 CGF.CurGD = GlobalDecl(MD); 1704 CGF.CurFuncIsThunk = true; 1705 1706 // Build FunctionArgs, but only include the implicit 'this' parameter 1707 // declaration. 1708 FunctionArgList FunctionArgs; 1709 buildThisParam(CGF, FunctionArgs); 1710 1711 // Start defining the function. 1712 CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo, 1713 FunctionArgs, MD->getLocation(), SourceLocation()); 1714 EmitThisParam(CGF); 1715 1716 // Load the vfptr and then callee from the vftable. The callee should have 1717 // adjusted 'this' so that the vfptr is at offset zero. 1718 llvm::Value *VTable = CGF.GetVTablePtr( 1719 getThisValue(CGF), ThunkTy->getPointerTo()->getPointerTo()); 1720 llvm::Value *VFuncPtr = 1721 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, ML.Index, "vfn"); 1722 llvm::Value *Callee = CGF.Builder.CreateLoad(VFuncPtr); 1723 1724 CGF.EmitMustTailThunk(MD, getThisValue(CGF), Callee); 1725 1726 return ThunkFn; 1727} 1728 1729void MicrosoftCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) { 1730 const VBTableGlobals &VBGlobals = enumerateVBTables(RD); 1731 for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) { 1732 const VPtrInfo *VBT = (*VBGlobals.VBTables)[I]; 1733 llvm::GlobalVariable *GV = VBGlobals.Globals[I]; 1734 if (GV->isDeclaration()) 1735 emitVBTableDefinition(*VBT, RD, GV); 1736 } 1737} 1738 1739llvm::GlobalVariable * 1740MicrosoftCXXABI::getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD, 1741 llvm::GlobalVariable::LinkageTypes Linkage) { 1742 SmallString<256> OutName; 1743 llvm::raw_svector_ostream Out(OutName); 1744 getMangleContext().mangleCXXVBTable(RD, VBT.MangledPath, Out); 1745 Out.flush(); 1746 StringRef Name = OutName.str(); 1747 1748 llvm::ArrayType *VBTableType = 1749 llvm::ArrayType::get(CGM.IntTy, 1 + VBT.ReusingBase->getNumVBases()); 1750 1751 assert(!CGM.getModule().getNamedGlobal(Name) && 1752 "vbtable with this name already exists: mangling bug?"); 1753 llvm::GlobalVariable *GV = 1754 CGM.CreateOrReplaceCXXRuntimeVariable(Name, VBTableType, Linkage); 1755 GV->setUnnamedAddr(true); 1756 1757 if (RD->hasAttr<DLLImportAttr>()) 1758 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); 1759 else if (RD->hasAttr<DLLExportAttr>()) 1760 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 1761 1762 if (!GV->hasExternalLinkage()) 1763 emitVBTableDefinition(VBT, RD, GV); 1764 1765 return GV; 1766} 1767 1768void MicrosoftCXXABI::emitVBTableDefinition(const VPtrInfo &VBT, 1769 const CXXRecordDecl *RD, 1770 llvm::GlobalVariable *GV) const { 1771 const CXXRecordDecl *ReusingBase = VBT.ReusingBase; 1772 1773 assert(RD->getNumVBases() && ReusingBase->getNumVBases() && 1774 "should only emit vbtables for classes with vbtables"); 1775 1776 const ASTRecordLayout &BaseLayout = 1777 getContext().getASTRecordLayout(VBT.BaseWithVPtr); 1778 const ASTRecordLayout &DerivedLayout = getContext().getASTRecordLayout(RD); 1779 1780 SmallVector<llvm::Constant *, 4> Offsets(1 + ReusingBase->getNumVBases(), 1781 nullptr); 1782 1783 // The offset from ReusingBase's vbptr to itself always leads. 1784 CharUnits VBPtrOffset = BaseLayout.getVBPtrOffset(); 1785 Offsets[0] = llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity()); 1786 1787 MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext(); 1788 for (const auto &I : ReusingBase->vbases()) { 1789 const CXXRecordDecl *VBase = I.getType()->getAsCXXRecordDecl(); 1790 CharUnits Offset = DerivedLayout.getVBaseClassOffset(VBase); 1791 assert(!Offset.isNegative()); 1792 1793 // Make it relative to the subobject vbptr. 1794 CharUnits CompleteVBPtrOffset = VBT.NonVirtualOffset + VBPtrOffset; 1795 if (VBT.getVBaseWithVPtr()) 1796 CompleteVBPtrOffset += 1797 DerivedLayout.getVBaseClassOffset(VBT.getVBaseWithVPtr()); 1798 Offset -= CompleteVBPtrOffset; 1799 1800 unsigned VBIndex = Context.getVBTableIndex(ReusingBase, VBase); 1801 assert(Offsets[VBIndex] == nullptr && "The same vbindex seen twice?"); 1802 Offsets[VBIndex] = llvm::ConstantInt::get(CGM.IntTy, Offset.getQuantity()); 1803 } 1804 1805 assert(Offsets.size() == 1806 cast<llvm::ArrayType>(cast<llvm::PointerType>(GV->getType()) 1807 ->getElementType())->getNumElements()); 1808 llvm::ArrayType *VBTableType = 1809 llvm::ArrayType::get(CGM.IntTy, Offsets.size()); 1810 llvm::Constant *Init = llvm::ConstantArray::get(VBTableType, Offsets); 1811 GV->setInitializer(Init); 1812} 1813 1814llvm::Value *MicrosoftCXXABI::performThisAdjustment(CodeGenFunction &CGF, 1815 llvm::Value *This, 1816 const ThisAdjustment &TA) { 1817 if (TA.isEmpty()) 1818 return This; 1819 1820 llvm::Value *V = CGF.Builder.CreateBitCast(This, CGF.Int8PtrTy); 1821 1822 if (!TA.Virtual.isEmpty()) { 1823 assert(TA.Virtual.Microsoft.VtordispOffset < 0); 1824 // Adjust the this argument based on the vtordisp value. 1825 llvm::Value *VtorDispPtr = 1826 CGF.Builder.CreateConstGEP1_32(V, TA.Virtual.Microsoft.VtordispOffset); 1827 VtorDispPtr = 1828 CGF.Builder.CreateBitCast(VtorDispPtr, CGF.Int32Ty->getPointerTo()); 1829 llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp"); 1830 V = CGF.Builder.CreateGEP(V, CGF.Builder.CreateNeg(VtorDisp)); 1831 1832 if (TA.Virtual.Microsoft.VBPtrOffset) { 1833 // If the final overrider is defined in a virtual base other than the one 1834 // that holds the vfptr, we have to use a vtordispex thunk which looks up 1835 // the vbtable of the derived class. 1836 assert(TA.Virtual.Microsoft.VBPtrOffset > 0); 1837 assert(TA.Virtual.Microsoft.VBOffsetOffset >= 0); 1838 llvm::Value *VBPtr; 1839 llvm::Value *VBaseOffset = 1840 GetVBaseOffsetFromVBPtr(CGF, V, -TA.Virtual.Microsoft.VBPtrOffset, 1841 TA.Virtual.Microsoft.VBOffsetOffset, &VBPtr); 1842 V = CGF.Builder.CreateInBoundsGEP(VBPtr, VBaseOffset); 1843 } 1844 } 1845 1846 if (TA.NonVirtual) { 1847 // Non-virtual adjustment might result in a pointer outside the allocated 1848 // object, e.g. if the final overrider class is laid out after the virtual 1849 // base that declares a method in the most derived class. 1850 V = CGF.Builder.CreateConstGEP1_32(V, TA.NonVirtual); 1851 } 1852 1853 // Don't need to bitcast back, the call CodeGen will handle this. 1854 return V; 1855} 1856 1857llvm::Value * 1858MicrosoftCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret, 1859 const ReturnAdjustment &RA) { 1860 if (RA.isEmpty()) 1861 return Ret; 1862 1863 llvm::Value *V = CGF.Builder.CreateBitCast(Ret, CGF.Int8PtrTy); 1864 1865 if (RA.Virtual.Microsoft.VBIndex) { 1866 assert(RA.Virtual.Microsoft.VBIndex > 0); 1867 const ASTContext &Context = getContext(); 1868 int32_t IntSize = Context.getTypeSizeInChars(Context.IntTy).getQuantity(); 1869 llvm::Value *VBPtr; 1870 llvm::Value *VBaseOffset = 1871 GetVBaseOffsetFromVBPtr(CGF, V, RA.Virtual.Microsoft.VBPtrOffset, 1872 IntSize * RA.Virtual.Microsoft.VBIndex, &VBPtr); 1873 V = CGF.Builder.CreateInBoundsGEP(VBPtr, VBaseOffset); 1874 } 1875 1876 if (RA.NonVirtual) 1877 V = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, V, RA.NonVirtual); 1878 1879 // Cast back to the original type. 1880 return CGF.Builder.CreateBitCast(V, Ret->getType()); 1881} 1882 1883bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr, 1884 QualType elementType) { 1885 // Microsoft seems to completely ignore the possibility of a 1886 // two-argument usual deallocation function. 1887 return elementType.isDestructedType(); 1888} 1889 1890bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) { 1891 // Microsoft seems to completely ignore the possibility of a 1892 // two-argument usual deallocation function. 1893 return expr->getAllocatedType().isDestructedType(); 1894} 1895 1896CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) { 1897 // The array cookie is always a size_t; we then pad that out to the 1898 // alignment of the element type. 1899 ASTContext &Ctx = getContext(); 1900 return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()), 1901 Ctx.getTypeAlignInChars(type)); 1902} 1903 1904llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, 1905 llvm::Value *allocPtr, 1906 CharUnits cookieSize) { 1907 unsigned AS = allocPtr->getType()->getPointerAddressSpace(); 1908 llvm::Value *numElementsPtr = 1909 CGF.Builder.CreateBitCast(allocPtr, CGF.SizeTy->getPointerTo(AS)); 1910 return CGF.Builder.CreateLoad(numElementsPtr); 1911} 1912 1913llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, 1914 llvm::Value *newPtr, 1915 llvm::Value *numElements, 1916 const CXXNewExpr *expr, 1917 QualType elementType) { 1918 assert(requiresArrayCookie(expr)); 1919 1920 // The size of the cookie. 1921 CharUnits cookieSize = getArrayCookieSizeImpl(elementType); 1922 1923 // Compute an offset to the cookie. 1924 llvm::Value *cookiePtr = newPtr; 1925 1926 // Write the number of elements into the appropriate slot. 1927 unsigned AS = newPtr->getType()->getPointerAddressSpace(); 1928 llvm::Value *numElementsPtr 1929 = CGF.Builder.CreateBitCast(cookiePtr, CGF.SizeTy->getPointerTo(AS)); 1930 CGF.Builder.CreateStore(numElements, numElementsPtr); 1931 1932 // Finally, compute a pointer to the actual data buffer by skipping 1933 // over the cookie completely. 1934 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr, 1935 cookieSize.getQuantity()); 1936} 1937 1938static void emitGlobalDtorWithTLRegDtor(CodeGenFunction &CGF, const VarDecl &VD, 1939 llvm::Constant *Dtor, 1940 llvm::Constant *Addr) { 1941 // Create a function which calls the destructor. 1942 llvm::Constant *DtorStub = CGF.createAtExitStub(VD, Dtor, Addr); 1943 1944 // extern "C" int __tlregdtor(void (*f)(void)); 1945 llvm::FunctionType *TLRegDtorTy = llvm::FunctionType::get( 1946 CGF.IntTy, DtorStub->getType(), /*IsVarArg=*/false); 1947 1948 llvm::Constant *TLRegDtor = 1949 CGF.CGM.CreateRuntimeFunction(TLRegDtorTy, "__tlregdtor"); 1950 if (llvm::Function *TLRegDtorFn = dyn_cast<llvm::Function>(TLRegDtor)) 1951 TLRegDtorFn->setDoesNotThrow(); 1952 1953 CGF.EmitNounwindRuntimeCall(TLRegDtor, DtorStub); 1954} 1955 1956void MicrosoftCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, 1957 llvm::Constant *Dtor, 1958 llvm::Constant *Addr) { 1959 if (D.getTLSKind()) 1960 return emitGlobalDtorWithTLRegDtor(CGF, D, Dtor, Addr); 1961 1962 // The default behavior is to use atexit. 1963 CGF.registerGlobalDtorWithAtExit(D, Dtor, Addr); 1964} 1965 1966void MicrosoftCXXABI::EmitThreadLocalInitFuncs( 1967 CodeGenModule &CGM, 1968 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>> 1969 CXXThreadLocals, 1970 ArrayRef<llvm::Function *> CXXThreadLocalInits, 1971 ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) { 1972 // This will create a GV in the .CRT$XDU section. It will point to our 1973 // initialization function. The CRT will call all of these function 1974 // pointers at start-up time and, eventually, at thread-creation time. 1975 auto AddToXDU = [&CGM](llvm::Function *InitFunc) { 1976 llvm::GlobalVariable *InitFuncPtr = new llvm::GlobalVariable( 1977 CGM.getModule(), InitFunc->getType(), /*IsConstant=*/true, 1978 llvm::GlobalVariable::InternalLinkage, InitFunc, 1979 Twine(InitFunc->getName(), "$initializer$")); 1980 InitFuncPtr->setSection(".CRT$XDU"); 1981 // This variable has discardable linkage, we have to add it to @llvm.used to 1982 // ensure it won't get discarded. 1983 CGM.addUsedGlobal(InitFuncPtr); 1984 return InitFuncPtr; 1985 }; 1986 1987 std::vector<llvm::Function *> NonComdatInits; 1988 for (size_t I = 0, E = CXXThreadLocalInitVars.size(); I != E; ++I) { 1989 llvm::GlobalVariable *GV = CXXThreadLocalInitVars[I]; 1990 llvm::Function *F = CXXThreadLocalInits[I]; 1991 1992 // If the GV is already in a comdat group, then we have to join it. 1993 if (llvm::Comdat *C = GV->getComdat()) 1994 AddToXDU(F)->setComdat(C); 1995 else 1996 NonComdatInits.push_back(F); 1997 } 1998 1999 if (!NonComdatInits.empty()) { 2000 llvm::FunctionType *FTy = 2001 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false); 2002 llvm::Function *InitFunc = CGM.CreateGlobalInitOrDestructFunction( 2003 FTy, "__tls_init", SourceLocation(), 2004 /*TLS=*/true); 2005 CodeGenFunction(CGM).GenerateCXXGlobalInitFunc(InitFunc, NonComdatInits); 2006 2007 AddToXDU(InitFunc); 2008 } 2009} 2010 2011LValue MicrosoftCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, 2012 const VarDecl *VD, 2013 QualType LValType) { 2014 CGF.CGM.ErrorUnsupported(VD, "thread wrappers"); 2015 return LValue(); 2016} 2017 2018void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, 2019 llvm::GlobalVariable *GV, 2020 bool PerformInit) { 2021 // MSVC only uses guards for static locals. 2022 if (!D.isStaticLocal()) { 2023 assert(GV->hasWeakLinkage() || GV->hasLinkOnceLinkage()); 2024 // GlobalOpt is allowed to discard the initializer, so use linkonce_odr. 2025 llvm::Function *F = CGF.CurFn; 2026 F->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage); 2027 F->setComdat(CGM.getModule().getOrInsertComdat(F->getName())); 2028 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit); 2029 return; 2030 } 2031 2032 // MSVC always uses an i32 bitfield to guard initialization, which is *not* 2033 // threadsafe. Since the user may be linking in inline functions compiled by 2034 // cl.exe, there's no reason to provide a false sense of security by using 2035 // critical sections here. 2036 2037 if (D.getTLSKind()) 2038 CGM.ErrorUnsupported(&D, "dynamic TLS initialization"); 2039 2040 CGBuilderTy &Builder = CGF.Builder; 2041 llvm::IntegerType *GuardTy = CGF.Int32Ty; 2042 llvm::ConstantInt *Zero = llvm::ConstantInt::get(GuardTy, 0); 2043 2044 // Get the guard variable for this function if we have one already. 2045 GuardInfo *GI = &GuardVariableMap[D.getDeclContext()]; 2046 2047 unsigned BitIndex; 2048 if (D.isStaticLocal() && D.isExternallyVisible()) { 2049 // Externally visible variables have to be numbered in Sema to properly 2050 // handle unreachable VarDecls. 2051 BitIndex = getContext().getStaticLocalNumber(&D); 2052 assert(BitIndex > 0); 2053 BitIndex--; 2054 } else { 2055 // Non-externally visible variables are numbered here in CodeGen. 2056 BitIndex = GI->BitIndex++; 2057 } 2058 2059 if (BitIndex >= 32) { 2060 if (D.isExternallyVisible()) 2061 ErrorUnsupportedABI(CGF, "more than 32 guarded initializations"); 2062 BitIndex %= 32; 2063 GI->Guard = nullptr; 2064 } 2065 2066 // Lazily create the i32 bitfield for this function. 2067 if (!GI->Guard) { 2068 // Mangle the name for the guard. 2069 SmallString<256> GuardName; 2070 { 2071 llvm::raw_svector_ostream Out(GuardName); 2072 getMangleContext().mangleStaticGuardVariable(&D, Out); 2073 Out.flush(); 2074 } 2075 2076 // Create the guard variable with a zero-initializer. Just absorb linkage, 2077 // visibility and dll storage class from the guarded variable. 2078 GI->Guard = 2079 new llvm::GlobalVariable(CGM.getModule(), GuardTy, false, 2080 GV->getLinkage(), Zero, GuardName.str()); 2081 GI->Guard->setVisibility(GV->getVisibility()); 2082 GI->Guard->setDLLStorageClass(GV->getDLLStorageClass()); 2083 if (GI->Guard->isWeakForLinker()) 2084 GI->Guard->setComdat( 2085 CGM.getModule().getOrInsertComdat(GI->Guard->getName())); 2086 } else { 2087 assert(GI->Guard->getLinkage() == GV->getLinkage() && 2088 "static local from the same function had different linkage"); 2089 } 2090 2091 // Pseudo code for the test: 2092 // if (!(GuardVar & MyGuardBit)) { 2093 // GuardVar |= MyGuardBit; 2094 // ... initialize the object ...; 2095 // } 2096 2097 // Test our bit from the guard variable. 2098 llvm::ConstantInt *Bit = llvm::ConstantInt::get(GuardTy, 1U << BitIndex); 2099 llvm::LoadInst *LI = Builder.CreateLoad(GI->Guard); 2100 llvm::Value *IsInitialized = 2101 Builder.CreateICmpNE(Builder.CreateAnd(LI, Bit), Zero); 2102 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); 2103 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); 2104 Builder.CreateCondBr(IsInitialized, EndBlock, InitBlock); 2105 2106 // Set our bit in the guard variable and emit the initializer and add a global 2107 // destructor if appropriate. 2108 CGF.EmitBlock(InitBlock); 2109 Builder.CreateStore(Builder.CreateOr(LI, Bit), GI->Guard); 2110 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit); 2111 Builder.CreateBr(EndBlock); 2112 2113 // Continue. 2114 CGF.EmitBlock(EndBlock); 2115} 2116 2117bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) { 2118 // Null-ness for function memptrs only depends on the first field, which is 2119 // the function pointer. The rest don't matter, so we can zero initialize. 2120 if (MPT->isMemberFunctionPointer()) 2121 return true; 2122 2123 // The virtual base adjustment field is always -1 for null, so if we have one 2124 // we can't zero initialize. The field offset is sometimes also -1 if 0 is a 2125 // valid field offset. 2126 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 2127 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); 2128 return (!MSInheritanceAttr::hasVBTableOffsetField(Inheritance) && 2129 RD->nullFieldOffsetIsZero()); 2130} 2131 2132llvm::Type * 2133MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) { 2134 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 2135 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); 2136 llvm::SmallVector<llvm::Type *, 4> fields; 2137 if (MPT->isMemberFunctionPointer()) 2138 fields.push_back(CGM.VoidPtrTy); // FunctionPointerOrVirtualThunk 2139 else 2140 fields.push_back(CGM.IntTy); // FieldOffset 2141 2142 if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(), 2143 Inheritance)) 2144 fields.push_back(CGM.IntTy); 2145 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) 2146 fields.push_back(CGM.IntTy); 2147 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance)) 2148 fields.push_back(CGM.IntTy); // VirtualBaseAdjustmentOffset 2149 2150 if (fields.size() == 1) 2151 return fields[0]; 2152 return llvm::StructType::get(CGM.getLLVMContext(), fields); 2153} 2154 2155void MicrosoftCXXABI:: 2156GetNullMemberPointerFields(const MemberPointerType *MPT, 2157 llvm::SmallVectorImpl<llvm::Constant *> &fields) { 2158 assert(fields.empty()); 2159 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 2160 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); 2161 if (MPT->isMemberFunctionPointer()) { 2162 // FunctionPointerOrVirtualThunk 2163 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy)); 2164 } else { 2165 if (RD->nullFieldOffsetIsZero()) 2166 fields.push_back(getZeroInt()); // FieldOffset 2167 else 2168 fields.push_back(getAllOnesInt()); // FieldOffset 2169 } 2170 2171 if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(), 2172 Inheritance)) 2173 fields.push_back(getZeroInt()); 2174 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) 2175 fields.push_back(getZeroInt()); 2176 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance)) 2177 fields.push_back(getAllOnesInt()); 2178} 2179 2180llvm::Constant * 2181MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) { 2182 llvm::SmallVector<llvm::Constant *, 4> fields; 2183 GetNullMemberPointerFields(MPT, fields); 2184 if (fields.size() == 1) 2185 return fields[0]; 2186 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields); 2187 assert(Res->getType() == ConvertMemberPointerType(MPT)); 2188 return Res; 2189} 2190 2191llvm::Constant * 2192MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField, 2193 bool IsMemberFunction, 2194 const CXXRecordDecl *RD, 2195 CharUnits NonVirtualBaseAdjustment) 2196{ 2197 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); 2198 2199 // Single inheritance class member pointer are represented as scalars instead 2200 // of aggregates. 2201 if (MSInheritanceAttr::hasOnlyOneField(IsMemberFunction, Inheritance)) 2202 return FirstField; 2203 2204 llvm::SmallVector<llvm::Constant *, 4> fields; 2205 fields.push_back(FirstField); 2206 2207 if (MSInheritanceAttr::hasNVOffsetField(IsMemberFunction, Inheritance)) 2208 fields.push_back(llvm::ConstantInt::get( 2209 CGM.IntTy, NonVirtualBaseAdjustment.getQuantity())); 2210 2211 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) { 2212 CharUnits Offs = CharUnits::Zero(); 2213 if (RD->getNumVBases()) 2214 Offs = getContext().getASTRecordLayout(RD).getVBPtrOffset(); 2215 fields.push_back(llvm::ConstantInt::get(CGM.IntTy, Offs.getQuantity())); 2216 } 2217 2218 // The rest of the fields are adjusted by conversions to a more derived class. 2219 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance)) 2220 fields.push_back(getZeroInt()); 2221 2222 return llvm::ConstantStruct::getAnon(fields); 2223} 2224 2225llvm::Constant * 2226MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT, 2227 CharUnits offset) { 2228 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 2229 llvm::Constant *FirstField = 2230 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity()); 2231 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD, 2232 CharUnits::Zero()); 2233} 2234 2235llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) { 2236 return BuildMemberPointer(MD->getParent(), MD, CharUnits::Zero()); 2237} 2238 2239llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP, 2240 QualType MPType) { 2241 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>(); 2242 const ValueDecl *MPD = MP.getMemberPointerDecl(); 2243 if (!MPD) 2244 return EmitNullMemberPointer(MPT); 2245 2246 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP); 2247 2248 // FIXME PR15713: Support virtual inheritance paths. 2249 2250 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD)) 2251 return BuildMemberPointer(MPT->getMostRecentCXXRecordDecl(), MD, 2252 ThisAdjustment); 2253 2254 CharUnits FieldOffset = 2255 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD)); 2256 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset); 2257} 2258 2259llvm::Constant * 2260MicrosoftCXXABI::BuildMemberPointer(const CXXRecordDecl *RD, 2261 const CXXMethodDecl *MD, 2262 CharUnits NonVirtualBaseAdjustment) { 2263 assert(MD->isInstance() && "Member function must not be static!"); 2264 MD = MD->getCanonicalDecl(); 2265 RD = RD->getMostRecentDecl(); 2266 CodeGenTypes &Types = CGM.getTypes(); 2267 2268 llvm::Constant *FirstField; 2269 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>(); 2270 if (!MD->isVirtual()) { 2271 llvm::Type *Ty; 2272 // Check whether the function has a computable LLVM signature. 2273 if (Types.isFuncTypeConvertible(FPT)) { 2274 // The function has a computable LLVM signature; use the correct type. 2275 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD)); 2276 } else { 2277 // Use an arbitrary non-function type to tell GetAddrOfFunction that the 2278 // function type is incomplete. 2279 Ty = CGM.PtrDiffTy; 2280 } 2281 FirstField = CGM.GetAddrOfFunction(MD, Ty); 2282 FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy); 2283 } else { 2284 MicrosoftVTableContext::MethodVFTableLocation ML = 2285 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(MD); 2286 if (!CGM.getTypes().isFuncTypeConvertible( 2287 MD->getType()->castAs<FunctionType>())) { 2288 CGM.ErrorUnsupported(MD, "pointer to virtual member function with " 2289 "incomplete return or parameter type"); 2290 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy); 2291 } else if (FPT->getCallConv() == CC_X86FastCall) { 2292 CGM.ErrorUnsupported(MD, "pointer to fastcall virtual member function"); 2293 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy); 2294 } else if (ML.VBase) { 2295 CGM.ErrorUnsupported(MD, "pointer to virtual member function overriding " 2296 "member function in virtual base class"); 2297 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy); 2298 } else { 2299 llvm::Function *Thunk = EmitVirtualMemPtrThunk(MD, ML); 2300 FirstField = llvm::ConstantExpr::getBitCast(Thunk, CGM.VoidPtrTy); 2301 // Include the vfptr adjustment if the method is in a non-primary vftable. 2302 NonVirtualBaseAdjustment += ML.VFPtrOffset; 2303 } 2304 } 2305 2306 // The rest of the fields are common with data member pointers. 2307 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD, 2308 NonVirtualBaseAdjustment); 2309} 2310 2311/// Member pointers are the same if they're either bitwise identical *or* both 2312/// null. Null-ness for function members is determined by the first field, 2313/// while for data member pointers we must compare all fields. 2314llvm::Value * 2315MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF, 2316 llvm::Value *L, 2317 llvm::Value *R, 2318 const MemberPointerType *MPT, 2319 bool Inequality) { 2320 CGBuilderTy &Builder = CGF.Builder; 2321 2322 // Handle != comparisons by switching the sense of all boolean operations. 2323 llvm::ICmpInst::Predicate Eq; 2324 llvm::Instruction::BinaryOps And, Or; 2325 if (Inequality) { 2326 Eq = llvm::ICmpInst::ICMP_NE; 2327 And = llvm::Instruction::Or; 2328 Or = llvm::Instruction::And; 2329 } else { 2330 Eq = llvm::ICmpInst::ICMP_EQ; 2331 And = llvm::Instruction::And; 2332 Or = llvm::Instruction::Or; 2333 } 2334 2335 // If this is a single field member pointer (single inheritance), this is a 2336 // single icmp. 2337 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 2338 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); 2339 if (MSInheritanceAttr::hasOnlyOneField(MPT->isMemberFunctionPointer(), 2340 Inheritance)) 2341 return Builder.CreateICmp(Eq, L, R); 2342 2343 // Compare the first field. 2344 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0"); 2345 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0"); 2346 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first"); 2347 2348 // Compare everything other than the first field. 2349 llvm::Value *Res = nullptr; 2350 llvm::StructType *LType = cast<llvm::StructType>(L->getType()); 2351 for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) { 2352 llvm::Value *LF = Builder.CreateExtractValue(L, I); 2353 llvm::Value *RF = Builder.CreateExtractValue(R, I); 2354 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest"); 2355 if (Res) 2356 Res = Builder.CreateBinOp(And, Res, Cmp); 2357 else 2358 Res = Cmp; 2359 } 2360 2361 // Check if the first field is 0 if this is a function pointer. 2362 if (MPT->isMemberFunctionPointer()) { 2363 // (l1 == r1 && ...) || l0 == 0 2364 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType()); 2365 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero"); 2366 Res = Builder.CreateBinOp(Or, Res, IsZero); 2367 } 2368 2369 // Combine the comparison of the first field, which must always be true for 2370 // this comparison to succeeed. 2371 return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp"); 2372} 2373 2374llvm::Value * 2375MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF, 2376 llvm::Value *MemPtr, 2377 const MemberPointerType *MPT) { 2378 CGBuilderTy &Builder = CGF.Builder; 2379 llvm::SmallVector<llvm::Constant *, 4> fields; 2380 // We only need one field for member functions. 2381 if (MPT->isMemberFunctionPointer()) 2382 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy)); 2383 else 2384 GetNullMemberPointerFields(MPT, fields); 2385 assert(!fields.empty()); 2386 llvm::Value *FirstField = MemPtr; 2387 if (MemPtr->getType()->isStructTy()) 2388 FirstField = Builder.CreateExtractValue(MemPtr, 0); 2389 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0"); 2390 2391 // For function member pointers, we only need to test the function pointer 2392 // field. The other fields if any can be garbage. 2393 if (MPT->isMemberFunctionPointer()) 2394 return Res; 2395 2396 // Otherwise, emit a series of compares and combine the results. 2397 for (int I = 1, E = fields.size(); I < E; ++I) { 2398 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I); 2399 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp"); 2400 Res = Builder.CreateOr(Res, Next, "memptr.tobool"); 2401 } 2402 return Res; 2403} 2404 2405bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT, 2406 llvm::Constant *Val) { 2407 // Function pointers are null if the pointer in the first field is null. 2408 if (MPT->isMemberFunctionPointer()) { 2409 llvm::Constant *FirstField = Val->getType()->isStructTy() ? 2410 Val->getAggregateElement(0U) : Val; 2411 return FirstField->isNullValue(); 2412 } 2413 2414 // If it's not a function pointer and it's zero initializable, we can easily 2415 // check zero. 2416 if (isZeroInitializable(MPT) && Val->isNullValue()) 2417 return true; 2418 2419 // Otherwise, break down all the fields for comparison. Hopefully these 2420 // little Constants are reused, while a big null struct might not be. 2421 llvm::SmallVector<llvm::Constant *, 4> Fields; 2422 GetNullMemberPointerFields(MPT, Fields); 2423 if (Fields.size() == 1) { 2424 assert(Val->getType()->isIntegerTy()); 2425 return Val == Fields[0]; 2426 } 2427 2428 unsigned I, E; 2429 for (I = 0, E = Fields.size(); I != E; ++I) { 2430 if (Val->getAggregateElement(I) != Fields[I]) 2431 break; 2432 } 2433 return I == E; 2434} 2435 2436llvm::Value * 2437MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, 2438 llvm::Value *This, 2439 llvm::Value *VBPtrOffset, 2440 llvm::Value *VBTableOffset, 2441 llvm::Value **VBPtrOut) { 2442 CGBuilderTy &Builder = CGF.Builder; 2443 // Load the vbtable pointer from the vbptr in the instance. 2444 This = Builder.CreateBitCast(This, CGM.Int8PtrTy); 2445 llvm::Value *VBPtr = 2446 Builder.CreateInBoundsGEP(This, VBPtrOffset, "vbptr"); 2447 if (VBPtrOut) *VBPtrOut = VBPtr; 2448 VBPtr = Builder.CreateBitCast(VBPtr, 2449 CGM.Int32Ty->getPointerTo(0)->getPointerTo(0)); 2450 llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable"); 2451 2452 // Translate from byte offset to table index. It improves analyzability. 2453 llvm::Value *VBTableIndex = Builder.CreateAShr( 2454 VBTableOffset, llvm::ConstantInt::get(VBTableOffset->getType(), 2), 2455 "vbtindex", /*isExact=*/true); 2456 2457 // Load an i32 offset from the vb-table. 2458 llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableIndex); 2459 VBaseOffs = Builder.CreateBitCast(VBaseOffs, CGM.Int32Ty->getPointerTo(0)); 2460 return Builder.CreateLoad(VBaseOffs, "vbase_offs"); 2461} 2462 2463// Returns an adjusted base cast to i8*, since we do more address arithmetic on 2464// it. 2465llvm::Value *MicrosoftCXXABI::AdjustVirtualBase( 2466 CodeGenFunction &CGF, const Expr *E, const CXXRecordDecl *RD, 2467 llvm::Value *Base, llvm::Value *VBTableOffset, llvm::Value *VBPtrOffset) { 2468 CGBuilderTy &Builder = CGF.Builder; 2469 Base = Builder.CreateBitCast(Base, CGM.Int8PtrTy); 2470 llvm::BasicBlock *OriginalBB = nullptr; 2471 llvm::BasicBlock *SkipAdjustBB = nullptr; 2472 llvm::BasicBlock *VBaseAdjustBB = nullptr; 2473 2474 // In the unspecified inheritance model, there might not be a vbtable at all, 2475 // in which case we need to skip the virtual base lookup. If there is a 2476 // vbtable, the first entry is a no-op entry that gives back the original 2477 // base, so look for a virtual base adjustment offset of zero. 2478 if (VBPtrOffset) { 2479 OriginalBB = Builder.GetInsertBlock(); 2480 VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust"); 2481 SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust"); 2482 llvm::Value *IsVirtual = 2483 Builder.CreateICmpNE(VBTableOffset, getZeroInt(), 2484 "memptr.is_vbase"); 2485 Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB); 2486 CGF.EmitBlock(VBaseAdjustBB); 2487 } 2488 2489 // If we weren't given a dynamic vbptr offset, RD should be complete and we'll 2490 // know the vbptr offset. 2491 if (!VBPtrOffset) { 2492 CharUnits offs = CharUnits::Zero(); 2493 if (!RD->hasDefinition()) { 2494 DiagnosticsEngine &Diags = CGF.CGM.getDiags(); 2495 unsigned DiagID = Diags.getCustomDiagID( 2496 DiagnosticsEngine::Error, 2497 "member pointer representation requires a " 2498 "complete class type for %0 to perform this expression"); 2499 Diags.Report(E->getExprLoc(), DiagID) << RD << E->getSourceRange(); 2500 } else if (RD->getNumVBases()) 2501 offs = getContext().getASTRecordLayout(RD).getVBPtrOffset(); 2502 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity()); 2503 } 2504 llvm::Value *VBPtr = nullptr; 2505 llvm::Value *VBaseOffs = 2506 GetVBaseOffsetFromVBPtr(CGF, Base, VBPtrOffset, VBTableOffset, &VBPtr); 2507 llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs); 2508 2509 // Merge control flow with the case where we didn't have to adjust. 2510 if (VBaseAdjustBB) { 2511 Builder.CreateBr(SkipAdjustBB); 2512 CGF.EmitBlock(SkipAdjustBB); 2513 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base"); 2514 Phi->addIncoming(Base, OriginalBB); 2515 Phi->addIncoming(AdjustedBase, VBaseAdjustBB); 2516 return Phi; 2517 } 2518 return AdjustedBase; 2519} 2520 2521llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress( 2522 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr, 2523 const MemberPointerType *MPT) { 2524 assert(MPT->isMemberDataPointer()); 2525 unsigned AS = Base->getType()->getPointerAddressSpace(); 2526 llvm::Type *PType = 2527 CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS); 2528 CGBuilderTy &Builder = CGF.Builder; 2529 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 2530 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); 2531 2532 // Extract the fields we need, regardless of model. We'll apply them if we 2533 // have them. 2534 llvm::Value *FieldOffset = MemPtr; 2535 llvm::Value *VirtualBaseAdjustmentOffset = nullptr; 2536 llvm::Value *VBPtrOffset = nullptr; 2537 if (MemPtr->getType()->isStructTy()) { 2538 // We need to extract values. 2539 unsigned I = 0; 2540 FieldOffset = Builder.CreateExtractValue(MemPtr, I++); 2541 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) 2542 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++); 2543 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance)) 2544 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++); 2545 } 2546 2547 if (VirtualBaseAdjustmentOffset) { 2548 Base = AdjustVirtualBase(CGF, E, RD, Base, VirtualBaseAdjustmentOffset, 2549 VBPtrOffset); 2550 } 2551 2552 // Cast to char*. 2553 Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS)); 2554 2555 // Apply the offset, which we assume is non-null. 2556 llvm::Value *Addr = 2557 Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset"); 2558 2559 // Cast the address to the appropriate pointer type, adopting the address 2560 // space of the base pointer. 2561 return Builder.CreateBitCast(Addr, PType); 2562} 2563 2564static MSInheritanceAttr::Spelling 2565getInheritanceFromMemptr(const MemberPointerType *MPT) { 2566 return MPT->getMostRecentCXXRecordDecl()->getMSInheritanceModel(); 2567} 2568 2569llvm::Value * 2570MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF, 2571 const CastExpr *E, 2572 llvm::Value *Src) { 2573 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer || 2574 E->getCastKind() == CK_BaseToDerivedMemberPointer || 2575 E->getCastKind() == CK_ReinterpretMemberPointer); 2576 2577 // Use constant emission if we can. 2578 if (isa<llvm::Constant>(Src)) 2579 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src)); 2580 2581 // We may be adding or dropping fields from the member pointer, so we need 2582 // both types and the inheritance models of both records. 2583 const MemberPointerType *SrcTy = 2584 E->getSubExpr()->getType()->castAs<MemberPointerType>(); 2585 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>(); 2586 bool IsFunc = SrcTy->isMemberFunctionPointer(); 2587 2588 // If the classes use the same null representation, reinterpret_cast is a nop. 2589 bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer; 2590 if (IsReinterpret && IsFunc) 2591 return Src; 2592 2593 CXXRecordDecl *SrcRD = SrcTy->getMostRecentCXXRecordDecl(); 2594 CXXRecordDecl *DstRD = DstTy->getMostRecentCXXRecordDecl(); 2595 if (IsReinterpret && 2596 SrcRD->nullFieldOffsetIsZero() == DstRD->nullFieldOffsetIsZero()) 2597 return Src; 2598 2599 CGBuilderTy &Builder = CGF.Builder; 2600 2601 // Branch past the conversion if Src is null. 2602 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy); 2603 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy); 2604 2605 // C++ 5.2.10p9: The null member pointer value is converted to the null member 2606 // pointer value of the destination type. 2607 if (IsReinterpret) { 2608 // For reinterpret casts, sema ensures that src and dst are both functions 2609 // or data and have the same size, which means the LLVM types should match. 2610 assert(Src->getType() == DstNull->getType()); 2611 return Builder.CreateSelect(IsNotNull, Src, DstNull); 2612 } 2613 2614 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock(); 2615 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert"); 2616 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted"); 2617 Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB); 2618 CGF.EmitBlock(ConvertBB); 2619 2620 // Decompose src. 2621 llvm::Value *FirstField = Src; 2622 llvm::Value *NonVirtualBaseAdjustment = nullptr; 2623 llvm::Value *VirtualBaseAdjustmentOffset = nullptr; 2624 llvm::Value *VBPtrOffset = nullptr; 2625 MSInheritanceAttr::Spelling SrcInheritance = SrcRD->getMSInheritanceModel(); 2626 if (!MSInheritanceAttr::hasOnlyOneField(IsFunc, SrcInheritance)) { 2627 // We need to extract values. 2628 unsigned I = 0; 2629 FirstField = Builder.CreateExtractValue(Src, I++); 2630 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, SrcInheritance)) 2631 NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++); 2632 if (MSInheritanceAttr::hasVBPtrOffsetField(SrcInheritance)) 2633 VBPtrOffset = Builder.CreateExtractValue(Src, I++); 2634 if (MSInheritanceAttr::hasVBTableOffsetField(SrcInheritance)) 2635 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++); 2636 } 2637 2638 // For data pointers, we adjust the field offset directly. For functions, we 2639 // have a separate field. 2640 llvm::Constant *Adj = getMemberPointerAdjustment(E); 2641 if (Adj) { 2642 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy); 2643 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField; 2644 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer); 2645 if (!NVAdjustField) // If this field didn't exist in src, it's zero. 2646 NVAdjustField = getZeroInt(); 2647 if (isDerivedToBase) 2648 NVAdjustField = Builder.CreateNSWSub(NVAdjustField, Adj, "adj"); 2649 else 2650 NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, Adj, "adj"); 2651 } 2652 2653 // FIXME PR15713: Support conversions through virtually derived classes. 2654 2655 // Recompose dst from the null struct and the adjusted fields from src. 2656 MSInheritanceAttr::Spelling DstInheritance = DstRD->getMSInheritanceModel(); 2657 llvm::Value *Dst; 2658 if (MSInheritanceAttr::hasOnlyOneField(IsFunc, DstInheritance)) { 2659 Dst = FirstField; 2660 } else { 2661 Dst = llvm::UndefValue::get(DstNull->getType()); 2662 unsigned Idx = 0; 2663 Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++); 2664 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, DstInheritance)) 2665 Dst = Builder.CreateInsertValue( 2666 Dst, getValueOrZeroInt(NonVirtualBaseAdjustment), Idx++); 2667 if (MSInheritanceAttr::hasVBPtrOffsetField(DstInheritance)) 2668 Dst = Builder.CreateInsertValue( 2669 Dst, getValueOrZeroInt(VBPtrOffset), Idx++); 2670 if (MSInheritanceAttr::hasVBTableOffsetField(DstInheritance)) 2671 Dst = Builder.CreateInsertValue( 2672 Dst, getValueOrZeroInt(VirtualBaseAdjustmentOffset), Idx++); 2673 } 2674 Builder.CreateBr(ContinueBB); 2675 2676 // In the continuation, choose between DstNull and Dst. 2677 CGF.EmitBlock(ContinueBB); 2678 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted"); 2679 Phi->addIncoming(DstNull, OriginalBB); 2680 Phi->addIncoming(Dst, ConvertBB); 2681 return Phi; 2682} 2683 2684llvm::Constant * 2685MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E, 2686 llvm::Constant *Src) { 2687 const MemberPointerType *SrcTy = 2688 E->getSubExpr()->getType()->castAs<MemberPointerType>(); 2689 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>(); 2690 2691 // If src is null, emit a new null for dst. We can't return src because dst 2692 // might have a new representation. 2693 if (MemberPointerConstantIsNull(SrcTy, Src)) 2694 return EmitNullMemberPointer(DstTy); 2695 2696 // We don't need to do anything for reinterpret_casts of non-null member 2697 // pointers. We should only get here when the two type representations have 2698 // the same size. 2699 if (E->getCastKind() == CK_ReinterpretMemberPointer) 2700 return Src; 2701 2702 MSInheritanceAttr::Spelling SrcInheritance = getInheritanceFromMemptr(SrcTy); 2703 MSInheritanceAttr::Spelling DstInheritance = getInheritanceFromMemptr(DstTy); 2704 2705 // Decompose src. 2706 llvm::Constant *FirstField = Src; 2707 llvm::Constant *NonVirtualBaseAdjustment = nullptr; 2708 llvm::Constant *VirtualBaseAdjustmentOffset = nullptr; 2709 llvm::Constant *VBPtrOffset = nullptr; 2710 bool IsFunc = SrcTy->isMemberFunctionPointer(); 2711 if (!MSInheritanceAttr::hasOnlyOneField(IsFunc, SrcInheritance)) { 2712 // We need to extract values. 2713 unsigned I = 0; 2714 FirstField = Src->getAggregateElement(I++); 2715 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, SrcInheritance)) 2716 NonVirtualBaseAdjustment = Src->getAggregateElement(I++); 2717 if (MSInheritanceAttr::hasVBPtrOffsetField(SrcInheritance)) 2718 VBPtrOffset = Src->getAggregateElement(I++); 2719 if (MSInheritanceAttr::hasVBTableOffsetField(SrcInheritance)) 2720 VirtualBaseAdjustmentOffset = Src->getAggregateElement(I++); 2721 } 2722 2723 // For data pointers, we adjust the field offset directly. For functions, we 2724 // have a separate field. 2725 llvm::Constant *Adj = getMemberPointerAdjustment(E); 2726 if (Adj) { 2727 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy); 2728 llvm::Constant *&NVAdjustField = 2729 IsFunc ? NonVirtualBaseAdjustment : FirstField; 2730 bool IsDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer); 2731 if (!NVAdjustField) // If this field didn't exist in src, it's zero. 2732 NVAdjustField = getZeroInt(); 2733 if (IsDerivedToBase) 2734 NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj); 2735 else 2736 NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj); 2737 } 2738 2739 // FIXME PR15713: Support conversions through virtually derived classes. 2740 2741 // Recompose dst from the null struct and the adjusted fields from src. 2742 if (MSInheritanceAttr::hasOnlyOneField(IsFunc, DstInheritance)) 2743 return FirstField; 2744 2745 llvm::SmallVector<llvm::Constant *, 4> Fields; 2746 Fields.push_back(FirstField); 2747 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, DstInheritance)) 2748 Fields.push_back(getConstantOrZeroInt(NonVirtualBaseAdjustment)); 2749 if (MSInheritanceAttr::hasVBPtrOffsetField(DstInheritance)) 2750 Fields.push_back(getConstantOrZeroInt(VBPtrOffset)); 2751 if (MSInheritanceAttr::hasVBTableOffsetField(DstInheritance)) 2752 Fields.push_back(getConstantOrZeroInt(VirtualBaseAdjustmentOffset)); 2753 return llvm::ConstantStruct::getAnon(Fields); 2754} 2755 2756llvm::Value *MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer( 2757 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This, 2758 llvm::Value *MemPtr, const MemberPointerType *MPT) { 2759 assert(MPT->isMemberFunctionPointer()); 2760 const FunctionProtoType *FPT = 2761 MPT->getPointeeType()->castAs<FunctionProtoType>(); 2762 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); 2763 llvm::FunctionType *FTy = 2764 CGM.getTypes().GetFunctionType( 2765 CGM.getTypes().arrangeCXXMethodType(RD, FPT)); 2766 CGBuilderTy &Builder = CGF.Builder; 2767 2768 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); 2769 2770 // Extract the fields we need, regardless of model. We'll apply them if we 2771 // have them. 2772 llvm::Value *FunctionPointer = MemPtr; 2773 llvm::Value *NonVirtualBaseAdjustment = nullptr; 2774 llvm::Value *VirtualBaseAdjustmentOffset = nullptr; 2775 llvm::Value *VBPtrOffset = nullptr; 2776 if (MemPtr->getType()->isStructTy()) { 2777 // We need to extract values. 2778 unsigned I = 0; 2779 FunctionPointer = Builder.CreateExtractValue(MemPtr, I++); 2780 if (MSInheritanceAttr::hasNVOffsetField(MPT, Inheritance)) 2781 NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++); 2782 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) 2783 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++); 2784 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance)) 2785 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++); 2786 } 2787 2788 if (VirtualBaseAdjustmentOffset) { 2789 This = AdjustVirtualBase(CGF, E, RD, This, VirtualBaseAdjustmentOffset, 2790 VBPtrOffset); 2791 } 2792 2793 if (NonVirtualBaseAdjustment) { 2794 // Apply the adjustment and cast back to the original struct type. 2795 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy()); 2796 Ptr = Builder.CreateInBoundsGEP(Ptr, NonVirtualBaseAdjustment); 2797 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted"); 2798 } 2799 2800 return Builder.CreateBitCast(FunctionPointer, FTy->getPointerTo()); 2801} 2802 2803CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) { 2804 return new MicrosoftCXXABI(CGM); 2805} 2806 2807// MS RTTI Overview: 2808// The run time type information emitted by cl.exe contains 5 distinct types of 2809// structures. Many of them reference each other. 2810// 2811// TypeInfo: Static classes that are returned by typeid. 2812// 2813// CompleteObjectLocator: Referenced by vftables. They contain information 2814// required for dynamic casting, including OffsetFromTop. They also contain 2815// a reference to the TypeInfo for the type and a reference to the 2816// CompleteHierarchyDescriptor for the type. 2817// 2818// ClassHieararchyDescriptor: Contains information about a class hierarchy. 2819// Used during dynamic_cast to walk a class hierarchy. References a base 2820// class array and the size of said array. 2821// 2822// BaseClassArray: Contains a list of classes in a hierarchy. BaseClassArray is 2823// somewhat of a misnomer because the most derived class is also in the list 2824// as well as multiple copies of virtual bases (if they occur multiple times 2825// in the hiearchy.) The BaseClassArray contains one BaseClassDescriptor for 2826// every path in the hierarchy, in pre-order depth first order. Note, we do 2827// not declare a specific llvm type for BaseClassArray, it's merely an array 2828// of BaseClassDescriptor pointers. 2829// 2830// BaseClassDescriptor: Contains information about a class in a class hierarchy. 2831// BaseClassDescriptor is also somewhat of a misnomer for the same reason that 2832// BaseClassArray is. It contains information about a class within a 2833// hierarchy such as: is this base is ambiguous and what is its offset in the 2834// vbtable. The names of the BaseClassDescriptors have all of their fields 2835// mangled into them so they can be aggressively deduplicated by the linker. 2836 2837static llvm::GlobalVariable *getTypeInfoVTable(CodeGenModule &CGM) { 2838 StringRef MangledName("\01??_7type_info@@6B@"); 2839 if (auto VTable = CGM.getModule().getNamedGlobal(MangledName)) 2840 return VTable; 2841 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy, 2842 /*Constant=*/true, 2843 llvm::GlobalVariable::ExternalLinkage, 2844 /*Initializer=*/nullptr, MangledName); 2845} 2846 2847namespace { 2848 2849/// \brief A Helper struct that stores information about a class in a class 2850/// hierarchy. The information stored in these structs struct is used during 2851/// the generation of ClassHierarchyDescriptors and BaseClassDescriptors. 2852// During RTTI creation, MSRTTIClasses are stored in a contiguous array with 2853// implicit depth first pre-order tree connectivity. getFirstChild and 2854// getNextSibling allow us to walk the tree efficiently. 2855struct MSRTTIClass { 2856 enum { 2857 IsPrivateOnPath = 1 | 8, 2858 IsAmbiguous = 2, 2859 IsPrivate = 4, 2860 IsVirtual = 16, 2861 HasHierarchyDescriptor = 64 2862 }; 2863 MSRTTIClass(const CXXRecordDecl *RD) : RD(RD) {} 2864 uint32_t initialize(const MSRTTIClass *Parent, 2865 const CXXBaseSpecifier *Specifier); 2866 2867 MSRTTIClass *getFirstChild() { return this + 1; } 2868 static MSRTTIClass *getNextChild(MSRTTIClass *Child) { 2869 return Child + 1 + Child->NumBases; 2870 } 2871 2872 const CXXRecordDecl *RD, *VirtualRoot; 2873 uint32_t Flags, NumBases, OffsetInVBase; 2874}; 2875 2876/// \brief Recursively initialize the base class array. 2877uint32_t MSRTTIClass::initialize(const MSRTTIClass *Parent, 2878 const CXXBaseSpecifier *Specifier) { 2879 Flags = HasHierarchyDescriptor; 2880 if (!Parent) { 2881 VirtualRoot = nullptr; 2882 OffsetInVBase = 0; 2883 } else { 2884 if (Specifier->getAccessSpecifier() != AS_public) 2885 Flags |= IsPrivate | IsPrivateOnPath; 2886 if (Specifier->isVirtual()) { 2887 Flags |= IsVirtual; 2888 VirtualRoot = RD; 2889 OffsetInVBase = 0; 2890 } else { 2891 if (Parent->Flags & IsPrivateOnPath) 2892 Flags |= IsPrivateOnPath; 2893 VirtualRoot = Parent->VirtualRoot; 2894 OffsetInVBase = Parent->OffsetInVBase + RD->getASTContext() 2895 .getASTRecordLayout(Parent->RD).getBaseClassOffset(RD).getQuantity(); 2896 } 2897 } 2898 NumBases = 0; 2899 MSRTTIClass *Child = getFirstChild(); 2900 for (const CXXBaseSpecifier &Base : RD->bases()) { 2901 NumBases += Child->initialize(this, &Base) + 1; 2902 Child = getNextChild(Child); 2903 } 2904 return NumBases; 2905} 2906 2907static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) { 2908 switch (Ty->getLinkage()) { 2909 case NoLinkage: 2910 case InternalLinkage: 2911 case UniqueExternalLinkage: 2912 return llvm::GlobalValue::InternalLinkage; 2913 2914 case VisibleNoLinkage: 2915 case ExternalLinkage: 2916 return llvm::GlobalValue::LinkOnceODRLinkage; 2917 } 2918 llvm_unreachable("Invalid linkage!"); 2919} 2920 2921/// \brief An ephemeral helper class for building MS RTTI types. It caches some 2922/// calls to the module and information about the most derived class in a 2923/// hierarchy. 2924struct MSRTTIBuilder { 2925 enum { 2926 HasBranchingHierarchy = 1, 2927 HasVirtualBranchingHierarchy = 2, 2928 HasAmbiguousBases = 4 2929 }; 2930 2931 MSRTTIBuilder(MicrosoftCXXABI &ABI, const CXXRecordDecl *RD) 2932 : CGM(ABI.CGM), Context(CGM.getContext()), 2933 VMContext(CGM.getLLVMContext()), Module(CGM.getModule()), RD(RD), 2934 Linkage(getLinkageForRTTI(CGM.getContext().getTagDeclType(RD))), 2935 ABI(ABI) {} 2936 2937 llvm::GlobalVariable *getBaseClassDescriptor(const MSRTTIClass &Classes); 2938 llvm::GlobalVariable * 2939 getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes); 2940 llvm::GlobalVariable *getClassHierarchyDescriptor(); 2941 llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo *Info); 2942 2943 CodeGenModule &CGM; 2944 ASTContext &Context; 2945 llvm::LLVMContext &VMContext; 2946 llvm::Module &Module; 2947 const CXXRecordDecl *RD; 2948 llvm::GlobalVariable::LinkageTypes Linkage; 2949 MicrosoftCXXABI &ABI; 2950}; 2951 2952} // namespace 2953 2954/// \brief Recursively serializes a class hierarchy in pre-order depth first 2955/// order. 2956static void serializeClassHierarchy(SmallVectorImpl<MSRTTIClass> &Classes, 2957 const CXXRecordDecl *RD) { 2958 Classes.push_back(MSRTTIClass(RD)); 2959 for (const CXXBaseSpecifier &Base : RD->bases()) 2960 serializeClassHierarchy(Classes, Base.getType()->getAsCXXRecordDecl()); 2961} 2962 2963/// \brief Find ambiguity among base classes. 2964static void 2965detectAmbiguousBases(SmallVectorImpl<MSRTTIClass> &Classes) { 2966 llvm::SmallPtrSet<const CXXRecordDecl *, 8> VirtualBases; 2967 llvm::SmallPtrSet<const CXXRecordDecl *, 8> UniqueBases; 2968 llvm::SmallPtrSet<const CXXRecordDecl *, 8> AmbiguousBases; 2969 for (MSRTTIClass *Class = &Classes.front(); Class <= &Classes.back();) { 2970 if ((Class->Flags & MSRTTIClass::IsVirtual) && 2971 !VirtualBases.insert(Class->RD).second) { 2972 Class = MSRTTIClass::getNextChild(Class); 2973 continue; 2974 } 2975 if (!UniqueBases.insert(Class->RD).second) 2976 AmbiguousBases.insert(Class->RD); 2977 Class++; 2978 } 2979 if (AmbiguousBases.empty()) 2980 return; 2981 for (MSRTTIClass &Class : Classes) 2982 if (AmbiguousBases.count(Class.RD)) 2983 Class.Flags |= MSRTTIClass::IsAmbiguous; 2984} 2985 2986llvm::GlobalVariable *MSRTTIBuilder::getClassHierarchyDescriptor() { 2987 SmallString<256> MangledName; 2988 { 2989 llvm::raw_svector_ostream Out(MangledName); 2990 ABI.getMangleContext().mangleCXXRTTIClassHierarchyDescriptor(RD, Out); 2991 } 2992 2993 // Check to see if we've already declared this ClassHierarchyDescriptor. 2994 if (auto CHD = Module.getNamedGlobal(MangledName)) 2995 return CHD; 2996 2997 // Serialize the class hierarchy and initialize the CHD Fields. 2998 SmallVector<MSRTTIClass, 8> Classes; 2999 serializeClassHierarchy(Classes, RD); 3000 Classes.front().initialize(/*Parent=*/nullptr, /*Specifier=*/nullptr); 3001 detectAmbiguousBases(Classes); 3002 int Flags = 0; 3003 for (auto Class : Classes) { 3004 if (Class.RD->getNumBases() > 1) 3005 Flags |= HasBranchingHierarchy; 3006 // Note: cl.exe does not calculate "HasAmbiguousBases" correctly. We 3007 // believe the field isn't actually used. 3008 if (Class.Flags & MSRTTIClass::IsAmbiguous) 3009 Flags |= HasAmbiguousBases; 3010 } 3011 if ((Flags & HasBranchingHierarchy) && RD->getNumVBases() != 0) 3012 Flags |= HasVirtualBranchingHierarchy; 3013 // These gep indices are used to get the address of the first element of the 3014 // base class array. 3015 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0), 3016 llvm::ConstantInt::get(CGM.IntTy, 0)}; 3017 3018 // Forward-declare the class hierarchy descriptor 3019 auto Type = ABI.getClassHierarchyDescriptorType(); 3020 auto CHD = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage, 3021 /*Initializer=*/nullptr, 3022 StringRef(MangledName)); 3023 if (CHD->isWeakForLinker()) 3024 CHD->setComdat(CGM.getModule().getOrInsertComdat(CHD->getName())); 3025 3026 auto *Bases = getBaseClassArray(Classes); 3027 3028 // Initialize the base class ClassHierarchyDescriptor. 3029 llvm::Constant *Fields[] = { 3030 llvm::ConstantInt::get(CGM.IntTy, 0), // Unknown 3031 llvm::ConstantInt::get(CGM.IntTy, Flags), 3032 llvm::ConstantInt::get(CGM.IntTy, Classes.size()), 3033 ABI.getImageRelativeConstant(llvm::ConstantExpr::getInBoundsGetElementPtr( 3034 Bases->getValueType(), Bases, 3035 llvm::ArrayRef<llvm::Value *>(GEPIndices))), 3036 }; 3037 CHD->setInitializer(llvm::ConstantStruct::get(Type, Fields)); 3038 return CHD; 3039} 3040 3041llvm::GlobalVariable * 3042MSRTTIBuilder::getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes) { 3043 SmallString<256> MangledName; 3044 { 3045 llvm::raw_svector_ostream Out(MangledName); 3046 ABI.getMangleContext().mangleCXXRTTIBaseClassArray(RD, Out); 3047 } 3048 3049 // Forward-declare the base class array. 3050 // cl.exe pads the base class array with 1 (in 32 bit mode) or 4 (in 64 bit 3051 // mode) bytes of padding. We provide a pointer sized amount of padding by 3052 // adding +1 to Classes.size(). The sections have pointer alignment and are 3053 // marked pick-any so it shouldn't matter. 3054 llvm::Type *PtrType = ABI.getImageRelativeType( 3055 ABI.getBaseClassDescriptorType()->getPointerTo()); 3056 auto *ArrType = llvm::ArrayType::get(PtrType, Classes.size() + 1); 3057 auto *BCA = 3058 new llvm::GlobalVariable(Module, ArrType, 3059 /*Constant=*/true, Linkage, 3060 /*Initializer=*/nullptr, StringRef(MangledName)); 3061 if (BCA->isWeakForLinker()) 3062 BCA->setComdat(CGM.getModule().getOrInsertComdat(BCA->getName())); 3063 3064 // Initialize the BaseClassArray. 3065 SmallVector<llvm::Constant *, 8> BaseClassArrayData; 3066 for (MSRTTIClass &Class : Classes) 3067 BaseClassArrayData.push_back( 3068 ABI.getImageRelativeConstant(getBaseClassDescriptor(Class))); 3069 BaseClassArrayData.push_back(llvm::Constant::getNullValue(PtrType)); 3070 BCA->setInitializer(llvm::ConstantArray::get(ArrType, BaseClassArrayData)); 3071 return BCA; 3072} 3073 3074llvm::GlobalVariable * 3075MSRTTIBuilder::getBaseClassDescriptor(const MSRTTIClass &Class) { 3076 // Compute the fields for the BaseClassDescriptor. They are computed up front 3077 // because they are mangled into the name of the object. 3078 uint32_t OffsetInVBTable = 0; 3079 int32_t VBPtrOffset = -1; 3080 if (Class.VirtualRoot) { 3081 auto &VTableContext = CGM.getMicrosoftVTableContext(); 3082 OffsetInVBTable = VTableContext.getVBTableIndex(RD, Class.VirtualRoot) * 4; 3083 VBPtrOffset = Context.getASTRecordLayout(RD).getVBPtrOffset().getQuantity(); 3084 } 3085 3086 SmallString<256> MangledName; 3087 { 3088 llvm::raw_svector_ostream Out(MangledName); 3089 ABI.getMangleContext().mangleCXXRTTIBaseClassDescriptor( 3090 Class.RD, Class.OffsetInVBase, VBPtrOffset, OffsetInVBTable, 3091 Class.Flags, Out); 3092 } 3093 3094 // Check to see if we've already declared this object. 3095 if (auto BCD = Module.getNamedGlobal(MangledName)) 3096 return BCD; 3097 3098 // Forward-declare the base class descriptor. 3099 auto Type = ABI.getBaseClassDescriptorType(); 3100 auto BCD = 3101 new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage, 3102 /*Initializer=*/nullptr, StringRef(MangledName)); 3103 if (BCD->isWeakForLinker()) 3104 BCD->setComdat(CGM.getModule().getOrInsertComdat(BCD->getName())); 3105 3106 // Initialize the BaseClassDescriptor. 3107 llvm::Constant *Fields[] = { 3108 ABI.getImageRelativeConstant( 3109 ABI.getAddrOfRTTIDescriptor(Context.getTypeDeclType(Class.RD))), 3110 llvm::ConstantInt::get(CGM.IntTy, Class.NumBases), 3111 llvm::ConstantInt::get(CGM.IntTy, Class.OffsetInVBase), 3112 llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), 3113 llvm::ConstantInt::get(CGM.IntTy, OffsetInVBTable), 3114 llvm::ConstantInt::get(CGM.IntTy, Class.Flags), 3115 ABI.getImageRelativeConstant( 3116 MSRTTIBuilder(ABI, Class.RD).getClassHierarchyDescriptor()), 3117 }; 3118 BCD->setInitializer(llvm::ConstantStruct::get(Type, Fields)); 3119 return BCD; 3120} 3121 3122llvm::GlobalVariable * 3123MSRTTIBuilder::getCompleteObjectLocator(const VPtrInfo *Info) { 3124 SmallString<256> MangledName; 3125 { 3126 llvm::raw_svector_ostream Out(MangledName); 3127 ABI.getMangleContext().mangleCXXRTTICompleteObjectLocator(RD, Info->MangledPath, Out); 3128 } 3129 3130 // Check to see if we've already computed this complete object locator. 3131 if (auto COL = Module.getNamedGlobal(MangledName)) 3132 return COL; 3133 3134 // Compute the fields of the complete object locator. 3135 int OffsetToTop = Info->FullOffsetInMDC.getQuantity(); 3136 int VFPtrOffset = 0; 3137 // The offset includes the vtordisp if one exists. 3138 if (const CXXRecordDecl *VBase = Info->getVBaseWithVPtr()) 3139 if (Context.getASTRecordLayout(RD) 3140 .getVBaseOffsetsMap() 3141 .find(VBase) 3142 ->second.hasVtorDisp()) 3143 VFPtrOffset = Info->NonVirtualOffset.getQuantity() + 4; 3144 3145 // Forward-declare the complete object locator. 3146 llvm::StructType *Type = ABI.getCompleteObjectLocatorType(); 3147 auto COL = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage, 3148 /*Initializer=*/nullptr, StringRef(MangledName)); 3149 3150 // Initialize the CompleteObjectLocator. 3151 llvm::Constant *Fields[] = { 3152 llvm::ConstantInt::get(CGM.IntTy, ABI.isImageRelative()), 3153 llvm::ConstantInt::get(CGM.IntTy, OffsetToTop), 3154 llvm::ConstantInt::get(CGM.IntTy, VFPtrOffset), 3155 ABI.getImageRelativeConstant( 3156 CGM.GetAddrOfRTTIDescriptor(Context.getTypeDeclType(RD))), 3157 ABI.getImageRelativeConstant(getClassHierarchyDescriptor()), 3158 ABI.getImageRelativeConstant(COL), 3159 }; 3160 llvm::ArrayRef<llvm::Constant *> FieldsRef(Fields); 3161 if (!ABI.isImageRelative()) 3162 FieldsRef = FieldsRef.drop_back(); 3163 COL->setInitializer(llvm::ConstantStruct::get(Type, FieldsRef)); 3164 if (COL->isWeakForLinker()) 3165 COL->setComdat(CGM.getModule().getOrInsertComdat(COL->getName())); 3166 return COL; 3167} 3168 3169static QualType decomposeTypeForEH(ASTContext &Context, QualType T, 3170 bool &IsConst, bool &IsVolatile) { 3171 T = Context.getExceptionObjectType(T); 3172 3173 // C++14 [except.handle]p3: 3174 // A handler is a match for an exception object of type E if [...] 3175 // - the handler is of type cv T or const T& where T is a pointer type and 3176 // E is a pointer type that can be converted to T by [...] 3177 // - a qualification conversion 3178 IsConst = false; 3179 IsVolatile = false; 3180 QualType PointeeType = T->getPointeeType(); 3181 if (!PointeeType.isNull()) { 3182 IsConst = PointeeType.isConstQualified(); 3183 IsVolatile = PointeeType.isVolatileQualified(); 3184 } 3185 3186 // Member pointer types like "const int A::*" are represented by having RTTI 3187 // for "int A::*" and separately storing the const qualifier. 3188 if (const auto *MPTy = T->getAs<MemberPointerType>()) 3189 T = Context.getMemberPointerType(PointeeType.getUnqualifiedType(), 3190 MPTy->getClass()); 3191 3192 // Pointer types like "const int * const *" are represented by having RTTI 3193 // for "const int **" and separately storing the const qualifier. 3194 if (T->isPointerType()) 3195 T = Context.getPointerType(PointeeType.getUnqualifiedType()); 3196 3197 return T; 3198} 3199 3200llvm::Constant * 3201MicrosoftCXXABI::getAddrOfCXXCatchHandlerType(QualType Type, 3202 QualType CatchHandlerType) { 3203 // TypeDescriptors for exceptions never have qualified pointer types, 3204 // qualifiers are stored seperately in order to support qualification 3205 // conversions. 3206 bool IsConst, IsVolatile; 3207 Type = decomposeTypeForEH(getContext(), Type, IsConst, IsVolatile); 3208 3209 bool IsReference = CatchHandlerType->isReferenceType(); 3210 3211 uint32_t Flags = 0; 3212 if (IsConst) 3213 Flags |= 1; 3214 if (IsVolatile) 3215 Flags |= 2; 3216 if (IsReference) 3217 Flags |= 8; 3218 3219 SmallString<256> MangledName; 3220 { 3221 llvm::raw_svector_ostream Out(MangledName); 3222 getMangleContext().mangleCXXCatchHandlerType(Type, Flags, Out); 3223 } 3224 3225 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) 3226 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); 3227 3228 llvm::Constant *Fields[] = { 3229 llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags 3230 getAddrOfRTTIDescriptor(Type), // TypeDescriptor 3231 }; 3232 llvm::StructType *CatchHandlerTypeType = getCatchHandlerTypeType(); 3233 auto *Var = new llvm::GlobalVariable( 3234 CGM.getModule(), CatchHandlerTypeType, /*Constant=*/true, 3235 llvm::GlobalValue::PrivateLinkage, 3236 llvm::ConstantStruct::get(CatchHandlerTypeType, Fields), 3237 StringRef(MangledName)); 3238 Var->setUnnamedAddr(true); 3239 Var->setSection("llvm.metadata"); 3240 return Var; 3241} 3242 3243/// \brief Gets a TypeDescriptor. Returns a llvm::Constant * rather than a 3244/// llvm::GlobalVariable * because different type descriptors have different 3245/// types, and need to be abstracted. They are abstracting by casting the 3246/// address to an Int8PtrTy. 3247llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) { 3248 SmallString<256> MangledName; 3249 { 3250 llvm::raw_svector_ostream Out(MangledName); 3251 getMangleContext().mangleCXXRTTI(Type, Out); 3252 } 3253 3254 // Check to see if we've already declared this TypeDescriptor. 3255 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) 3256 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); 3257 3258 // Compute the fields for the TypeDescriptor. 3259 SmallString<256> TypeInfoString; 3260 { 3261 llvm::raw_svector_ostream Out(TypeInfoString); 3262 getMangleContext().mangleCXXRTTIName(Type, Out); 3263 } 3264 3265 // Declare and initialize the TypeDescriptor. 3266 llvm::Constant *Fields[] = { 3267 getTypeInfoVTable(CGM), // VFPtr 3268 llvm::ConstantPointerNull::get(CGM.Int8PtrTy), // Runtime data 3269 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), TypeInfoString)}; 3270 llvm::StructType *TypeDescriptorType = 3271 getTypeDescriptorType(TypeInfoString); 3272 auto *Var = new llvm::GlobalVariable( 3273 CGM.getModule(), TypeDescriptorType, /*Constant=*/false, 3274 getLinkageForRTTI(Type), 3275 llvm::ConstantStruct::get(TypeDescriptorType, Fields), 3276 StringRef(MangledName)); 3277 if (Var->isWeakForLinker()) 3278 Var->setComdat(CGM.getModule().getOrInsertComdat(Var->getName())); 3279 return llvm::ConstantExpr::getBitCast(Var, CGM.Int8PtrTy); 3280} 3281 3282/// \brief Gets or a creates a Microsoft CompleteObjectLocator. 3283llvm::GlobalVariable * 3284MicrosoftCXXABI::getMSCompleteObjectLocator(const CXXRecordDecl *RD, 3285 const VPtrInfo *Info) { 3286 return MSRTTIBuilder(*this, RD).getCompleteObjectLocator(Info); 3287} 3288 3289static void emitCXXConstructor(CodeGenModule &CGM, 3290 const CXXConstructorDecl *ctor, 3291 StructorType ctorType) { 3292 // There are no constructor variants, always emit the complete destructor. 3293 llvm::Function *Fn = CGM.codegenCXXStructor(ctor, StructorType::Complete); 3294 CGM.maybeSetTrivialComdat(*ctor, *Fn); 3295} 3296 3297static void emitCXXDestructor(CodeGenModule &CGM, const CXXDestructorDecl *dtor, 3298 StructorType dtorType) { 3299 // The complete destructor is equivalent to the base destructor for 3300 // classes with no virtual bases, so try to emit it as an alias. 3301 if (!dtor->getParent()->getNumVBases() && 3302 (dtorType == StructorType::Complete || dtorType == StructorType::Base)) { 3303 bool ProducedAlias = !CGM.TryEmitDefinitionAsAlias( 3304 GlobalDecl(dtor, Dtor_Complete), GlobalDecl(dtor, Dtor_Base), true); 3305 if (ProducedAlias) { 3306 if (dtorType == StructorType::Complete) 3307 return; 3308 if (dtor->isVirtual()) 3309 CGM.getVTables().EmitThunks(GlobalDecl(dtor, Dtor_Complete)); 3310 } 3311 } 3312 3313 // The base destructor is equivalent to the base destructor of its 3314 // base class if there is exactly one non-virtual base class with a 3315 // non-trivial destructor, there are no fields with a non-trivial 3316 // destructor, and the body of the destructor is trivial. 3317 if (dtorType == StructorType::Base && !CGM.TryEmitBaseDestructorAsAlias(dtor)) 3318 return; 3319 3320 llvm::Function *Fn = CGM.codegenCXXStructor(dtor, dtorType); 3321 if (Fn->isWeakForLinker()) 3322 Fn->setComdat(CGM.getModule().getOrInsertComdat(Fn->getName())); 3323} 3324 3325void MicrosoftCXXABI::emitCXXStructor(const CXXMethodDecl *MD, 3326 StructorType Type) { 3327 if (auto *CD = dyn_cast<CXXConstructorDecl>(MD)) { 3328 emitCXXConstructor(CGM, CD, Type); 3329 return; 3330 } 3331 emitCXXDestructor(CGM, cast<CXXDestructorDecl>(MD), Type); 3332} 3333 3334llvm::Function * 3335MicrosoftCXXABI::getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD, 3336 CXXCtorType CT) { 3337 assert(CT == Ctor_CopyingClosure || CT == Ctor_DefaultClosure); 3338 3339 // Calculate the mangled name. 3340 SmallString<256> ThunkName; 3341 llvm::raw_svector_ostream Out(ThunkName); 3342 getMangleContext().mangleCXXCtor(CD, CT, Out); 3343 Out.flush(); 3344 3345 // If the thunk has been generated previously, just return it. 3346 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName)) 3347 return cast<llvm::Function>(GV); 3348 3349 // Create the llvm::Function. 3350 const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeMSCtorClosure(CD, CT); 3351 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo); 3352 const CXXRecordDecl *RD = CD->getParent(); 3353 QualType RecordTy = getContext().getRecordType(RD); 3354 llvm::Function *ThunkFn = llvm::Function::Create( 3355 ThunkTy, getLinkageForRTTI(RecordTy), ThunkName.str(), &CGM.getModule()); 3356 ThunkFn->setCallingConv(static_cast<llvm::CallingConv::ID>( 3357 FnInfo.getEffectiveCallingConvention())); 3358 bool IsCopy = CT == Ctor_CopyingClosure; 3359 3360 // Start codegen. 3361 CodeGenFunction CGF(CGM); 3362 CGF.CurGD = GlobalDecl(CD, Ctor_Complete); 3363 3364 // Build FunctionArgs. 3365 FunctionArgList FunctionArgs; 3366 3367 // A constructor always starts with a 'this' pointer as its first argument. 3368 buildThisParam(CGF, FunctionArgs); 3369 3370 // Following the 'this' pointer is a reference to the source object that we 3371 // are copying from. 3372 ImplicitParamDecl SrcParam( 3373 getContext(), nullptr, SourceLocation(), &getContext().Idents.get("src"), 3374 getContext().getLValueReferenceType(RecordTy, 3375 /*SpelledAsLValue=*/true)); 3376 if (IsCopy) 3377 FunctionArgs.push_back(&SrcParam); 3378 3379 // Constructors for classes which utilize virtual bases have an additional 3380 // parameter which indicates whether or not it is being delegated to by a more 3381 // derived constructor. 3382 ImplicitParamDecl IsMostDerived(getContext(), nullptr, SourceLocation(), 3383 &getContext().Idents.get("is_most_derived"), 3384 getContext().IntTy); 3385 // Only add the parameter to the list if thie class has virtual bases. 3386 if (RD->getNumVBases() > 0) 3387 FunctionArgs.push_back(&IsMostDerived); 3388 3389 // Start defining the function. 3390 CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo, 3391 FunctionArgs, CD->getLocation(), SourceLocation()); 3392 EmitThisParam(CGF); 3393 llvm::Value *This = getThisValue(CGF); 3394 3395 llvm::Value *SrcVal = 3396 IsCopy ? CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(&SrcParam), "src") 3397 : nullptr; 3398 3399 CallArgList Args; 3400 3401 // Push the this ptr. 3402 Args.add(RValue::get(This), CD->getThisType(getContext())); 3403 3404 // Push the src ptr. 3405 if (SrcVal) 3406 Args.add(RValue::get(SrcVal), SrcParam.getType()); 3407 3408 // Add the rest of the default arguments. 3409 std::vector<Stmt *> ArgVec; 3410 for (unsigned I = IsCopy ? 1 : 0, E = CD->getNumParams(); I != E; ++I) { 3411 Stmt *DefaultArg = getContext().getDefaultArgExprForConstructor(CD, I); 3412 assert(DefaultArg && "sema forgot to instantiate default args"); 3413 ArgVec.push_back(DefaultArg); 3414 } 3415 3416 CodeGenFunction::RunCleanupsScope Cleanups(CGF); 3417 3418 const auto *FPT = CD->getType()->castAs<FunctionProtoType>(); 3419 ConstExprIterator ArgBegin(ArgVec.data()), 3420 ArgEnd(ArgVec.data() + ArgVec.size()); 3421 CGF.EmitCallArgs(Args, FPT, ArgBegin, ArgEnd, CD, IsCopy ? 1 : 0); 3422 3423 // Insert any ABI-specific implicit constructor arguments. 3424 unsigned ExtraArgs = addImplicitConstructorArgs(CGF, CD, Ctor_Complete, 3425 /*ForVirtualBase=*/false, 3426 /*Delegating=*/false, Args); 3427 3428 // Call the destructor with our arguments. 3429 llvm::Value *CalleeFn = CGM.getAddrOfCXXStructor(CD, StructorType::Complete); 3430 const CGFunctionInfo &CalleeInfo = CGM.getTypes().arrangeCXXConstructorCall( 3431 Args, CD, Ctor_Complete, ExtraArgs); 3432 CGF.EmitCall(CalleeInfo, CalleeFn, ReturnValueSlot(), Args, CD); 3433 3434 Cleanups.ForceCleanup(); 3435 3436 // Emit the ret instruction, remove any temporary instructions created for the 3437 // aid of CodeGen. 3438 CGF.FinishFunction(SourceLocation()); 3439 3440 return ThunkFn; 3441} 3442 3443llvm::Constant *MicrosoftCXXABI::getCatchableType(QualType T, 3444 uint32_t NVOffset, 3445 int32_t VBPtrOffset, 3446 uint32_t VBIndex) { 3447 assert(!T->isReferenceType()); 3448 3449 CXXRecordDecl *RD = T->getAsCXXRecordDecl(); 3450 const CXXConstructorDecl *CD = 3451 RD ? CGM.getContext().getCopyConstructorForExceptionObject(RD) : nullptr; 3452 CXXCtorType CT = Ctor_Complete; 3453 if (CD) 3454 if (!hasDefaultCXXMethodCC(getContext(), CD) || CD->getNumParams() != 1) 3455 CT = Ctor_CopyingClosure; 3456 3457 uint32_t Size = getContext().getTypeSizeInChars(T).getQuantity(); 3458 SmallString<256> MangledName; 3459 { 3460 llvm::raw_svector_ostream Out(MangledName); 3461 getMangleContext().mangleCXXCatchableType(T, CD, CT, Size, NVOffset, 3462 VBPtrOffset, VBIndex, Out); 3463 } 3464 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) 3465 return getImageRelativeConstant(GV); 3466 3467 // The TypeDescriptor is used by the runtime to determine if a catch handler 3468 // is appropriate for the exception object. 3469 llvm::Constant *TD = getImageRelativeConstant(getAddrOfRTTIDescriptor(T)); 3470 3471 // The runtime is responsible for calling the copy constructor if the 3472 // exception is caught by value. 3473 llvm::Constant *CopyCtor; 3474 if (CD) { 3475 if (CT == Ctor_CopyingClosure) 3476 CopyCtor = getAddrOfCXXCtorClosure(CD, Ctor_CopyingClosure); 3477 else 3478 CopyCtor = CGM.getAddrOfCXXStructor(CD, StructorType::Complete); 3479 3480 CopyCtor = llvm::ConstantExpr::getBitCast(CopyCtor, CGM.Int8PtrTy); 3481 } else { 3482 CopyCtor = llvm::Constant::getNullValue(CGM.Int8PtrTy); 3483 } 3484 CopyCtor = getImageRelativeConstant(CopyCtor); 3485 3486 bool IsScalar = !RD; 3487 bool HasVirtualBases = false; 3488 bool IsStdBadAlloc = false; // std::bad_alloc is special for some reason. 3489 QualType PointeeType = T; 3490 if (T->isPointerType()) 3491 PointeeType = T->getPointeeType(); 3492 if (const CXXRecordDecl *RD = PointeeType->getAsCXXRecordDecl()) { 3493 HasVirtualBases = RD->getNumVBases() > 0; 3494 if (IdentifierInfo *II = RD->getIdentifier()) 3495 IsStdBadAlloc = II->isStr("bad_alloc") && RD->isInStdNamespace(); 3496 } 3497 3498 // Encode the relevant CatchableType properties into the Flags bitfield. 3499 // FIXME: Figure out how bits 2 or 8 can get set. 3500 uint32_t Flags = 0; 3501 if (IsScalar) 3502 Flags |= 1; 3503 if (HasVirtualBases) 3504 Flags |= 4; 3505 if (IsStdBadAlloc) 3506 Flags |= 16; 3507 3508 llvm::Constant *Fields[] = { 3509 llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags 3510 TD, // TypeDescriptor 3511 llvm::ConstantInt::get(CGM.IntTy, NVOffset), // NonVirtualAdjustment 3512 llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), // OffsetToVBPtr 3513 llvm::ConstantInt::get(CGM.IntTy, VBIndex), // VBTableIndex 3514 llvm::ConstantInt::get(CGM.IntTy, Size), // Size 3515 CopyCtor // CopyCtor 3516 }; 3517 llvm::StructType *CTType = getCatchableTypeType(); 3518 auto *GV = new llvm::GlobalVariable( 3519 CGM.getModule(), CTType, /*Constant=*/true, getLinkageForRTTI(T), 3520 llvm::ConstantStruct::get(CTType, Fields), StringRef(MangledName)); 3521 GV->setUnnamedAddr(true); 3522 GV->setSection(".xdata"); 3523 if (GV->isWeakForLinker()) 3524 GV->setComdat(CGM.getModule().getOrInsertComdat(GV->getName())); 3525 return getImageRelativeConstant(GV); 3526} 3527 3528llvm::GlobalVariable *MicrosoftCXXABI::getCatchableTypeArray(QualType T) { 3529 assert(!T->isReferenceType()); 3530 3531 // See if we've already generated a CatchableTypeArray for this type before. 3532 llvm::GlobalVariable *&CTA = CatchableTypeArrays[T]; 3533 if (CTA) 3534 return CTA; 3535 3536 // Ensure that we don't have duplicate entries in our CatchableTypeArray by 3537 // using a SmallSetVector. Duplicates may arise due to virtual bases 3538 // occurring more than once in the hierarchy. 3539 llvm::SmallSetVector<llvm::Constant *, 2> CatchableTypes; 3540 3541 // C++14 [except.handle]p3: 3542 // A handler is a match for an exception object of type E if [...] 3543 // - the handler is of type cv T or cv T& and T is an unambiguous public 3544 // base class of E, or 3545 // - the handler is of type cv T or const T& where T is a pointer type and 3546 // E is a pointer type that can be converted to T by [...] 3547 // - a standard pointer conversion (4.10) not involving conversions to 3548 // pointers to private or protected or ambiguous classes 3549 const CXXRecordDecl *MostDerivedClass = nullptr; 3550 bool IsPointer = T->isPointerType(); 3551 if (IsPointer) 3552 MostDerivedClass = T->getPointeeType()->getAsCXXRecordDecl(); 3553 else 3554 MostDerivedClass = T->getAsCXXRecordDecl(); 3555 3556 // Collect all the unambiguous public bases of the MostDerivedClass. 3557 if (MostDerivedClass) { 3558 const ASTContext &Context = getContext(); 3559 const ASTRecordLayout &MostDerivedLayout = 3560 Context.getASTRecordLayout(MostDerivedClass); 3561 MicrosoftVTableContext &VTableContext = CGM.getMicrosoftVTableContext(); 3562 SmallVector<MSRTTIClass, 8> Classes; 3563 serializeClassHierarchy(Classes, MostDerivedClass); 3564 Classes.front().initialize(/*Parent=*/nullptr, /*Specifier=*/nullptr); 3565 detectAmbiguousBases(Classes); 3566 for (const MSRTTIClass &Class : Classes) { 3567 // Skip any ambiguous or private bases. 3568 if (Class.Flags & 3569 (MSRTTIClass::IsPrivateOnPath | MSRTTIClass::IsAmbiguous)) 3570 continue; 3571 // Write down how to convert from a derived pointer to a base pointer. 3572 uint32_t OffsetInVBTable = 0; 3573 int32_t VBPtrOffset = -1; 3574 if (Class.VirtualRoot) { 3575 OffsetInVBTable = 3576 VTableContext.getVBTableIndex(MostDerivedClass, Class.VirtualRoot)*4; 3577 VBPtrOffset = MostDerivedLayout.getVBPtrOffset().getQuantity(); 3578 } 3579 3580 // Turn our record back into a pointer if the exception object is a 3581 // pointer. 3582 QualType RTTITy = QualType(Class.RD->getTypeForDecl(), 0); 3583 if (IsPointer) 3584 RTTITy = Context.getPointerType(RTTITy); 3585 CatchableTypes.insert(getCatchableType(RTTITy, Class.OffsetInVBase, 3586 VBPtrOffset, OffsetInVBTable)); 3587 } 3588 } 3589 3590 // C++14 [except.handle]p3: 3591 // A handler is a match for an exception object of type E if 3592 // - The handler is of type cv T or cv T& and E and T are the same type 3593 // (ignoring the top-level cv-qualifiers) 3594 CatchableTypes.insert(getCatchableType(T)); 3595 3596 // C++14 [except.handle]p3: 3597 // A handler is a match for an exception object of type E if 3598 // - the handler is of type cv T or const T& where T is a pointer type and 3599 // E is a pointer type that can be converted to T by [...] 3600 // - a standard pointer conversion (4.10) not involving conversions to 3601 // pointers to private or protected or ambiguous classes 3602 // 3603 // C++14 [conv.ptr]p2: 3604 // A prvalue of type "pointer to cv T," where T is an object type, can be 3605 // converted to a prvalue of type "pointer to cv void". 3606 if (IsPointer && T->getPointeeType()->isObjectType()) 3607 CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy)); 3608 3609 // C++14 [except.handle]p3: 3610 // A handler is a match for an exception object of type E if [...] 3611 // - the handler is of type cv T or const T& where T is a pointer or 3612 // pointer to member type and E is std::nullptr_t. 3613 // 3614 // We cannot possibly list all possible pointer types here, making this 3615 // implementation incompatible with the standard. However, MSVC includes an 3616 // entry for pointer-to-void in this case. Let's do the same. 3617 if (T->isNullPtrType()) 3618 CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy)); 3619 3620 uint32_t NumEntries = CatchableTypes.size(); 3621 llvm::Type *CTType = 3622 getImageRelativeType(getCatchableTypeType()->getPointerTo()); 3623 llvm::ArrayType *AT = llvm::ArrayType::get(CTType, NumEntries); 3624 llvm::StructType *CTAType = getCatchableTypeArrayType(NumEntries); 3625 llvm::Constant *Fields[] = { 3626 llvm::ConstantInt::get(CGM.IntTy, NumEntries), // NumEntries 3627 llvm::ConstantArray::get( 3628 AT, llvm::makeArrayRef(CatchableTypes.begin(), 3629 CatchableTypes.end())) // CatchableTypes 3630 }; 3631 SmallString<256> MangledName; 3632 { 3633 llvm::raw_svector_ostream Out(MangledName); 3634 getMangleContext().mangleCXXCatchableTypeArray(T, NumEntries, Out); 3635 } 3636 CTA = new llvm::GlobalVariable( 3637 CGM.getModule(), CTAType, /*Constant=*/true, getLinkageForRTTI(T), 3638 llvm::ConstantStruct::get(CTAType, Fields), StringRef(MangledName)); 3639 CTA->setUnnamedAddr(true); 3640 CTA->setSection(".xdata"); 3641 if (CTA->isWeakForLinker()) 3642 CTA->setComdat(CGM.getModule().getOrInsertComdat(CTA->getName())); 3643 return CTA; 3644} 3645 3646llvm::GlobalVariable *MicrosoftCXXABI::getThrowInfo(QualType T) { 3647 bool IsConst, IsVolatile; 3648 T = decomposeTypeForEH(getContext(), T, IsConst, IsVolatile); 3649 3650 // The CatchableTypeArray enumerates the various (CV-unqualified) types that 3651 // the exception object may be caught as. 3652 llvm::GlobalVariable *CTA = getCatchableTypeArray(T); 3653 // The first field in a CatchableTypeArray is the number of CatchableTypes. 3654 // This is used as a component of the mangled name which means that we need to 3655 // know what it is in order to see if we have previously generated the 3656 // ThrowInfo. 3657 uint32_t NumEntries = 3658 cast<llvm::ConstantInt>(CTA->getInitializer()->getAggregateElement(0U)) 3659 ->getLimitedValue(); 3660 3661 SmallString<256> MangledName; 3662 { 3663 llvm::raw_svector_ostream Out(MangledName); 3664 getMangleContext().mangleCXXThrowInfo(T, IsConst, IsVolatile, NumEntries, 3665 Out); 3666 } 3667 3668 // Reuse a previously generated ThrowInfo if we have generated an appropriate 3669 // one before. 3670 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) 3671 return GV; 3672 3673 // The RTTI TypeDescriptor uses an unqualified type but catch clauses must 3674 // be at least as CV qualified. Encode this requirement into the Flags 3675 // bitfield. 3676 uint32_t Flags = 0; 3677 if (IsConst) 3678 Flags |= 1; 3679 if (IsVolatile) 3680 Flags |= 2; 3681 3682 // The cleanup-function (a destructor) must be called when the exception 3683 // object's lifetime ends. 3684 llvm::Constant *CleanupFn = llvm::Constant::getNullValue(CGM.Int8PtrTy); 3685 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) 3686 if (CXXDestructorDecl *DtorD = RD->getDestructor()) 3687 if (!DtorD->isTrivial()) 3688 CleanupFn = llvm::ConstantExpr::getBitCast( 3689 CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete), 3690 CGM.Int8PtrTy); 3691 // This is unused as far as we can tell, initialize it to null. 3692 llvm::Constant *ForwardCompat = 3693 getImageRelativeConstant(llvm::Constant::getNullValue(CGM.Int8PtrTy)); 3694 llvm::Constant *PointerToCatchableTypes = getImageRelativeConstant( 3695 llvm::ConstantExpr::getBitCast(CTA, CGM.Int8PtrTy)); 3696 llvm::StructType *TIType = getThrowInfoType(); 3697 llvm::Constant *Fields[] = { 3698 llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags 3699 getImageRelativeConstant(CleanupFn), // CleanupFn 3700 ForwardCompat, // ForwardCompat 3701 PointerToCatchableTypes // CatchableTypeArray 3702 }; 3703 auto *GV = new llvm::GlobalVariable( 3704 CGM.getModule(), TIType, /*Constant=*/true, getLinkageForRTTI(T), 3705 llvm::ConstantStruct::get(TIType, Fields), StringRef(MangledName)); 3706 GV->setUnnamedAddr(true); 3707 GV->setSection(".xdata"); 3708 if (GV->isWeakForLinker()) 3709 GV->setComdat(CGM.getModule().getOrInsertComdat(GV->getName())); 3710 return GV; 3711} 3712 3713void MicrosoftCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) { 3714 const Expr *SubExpr = E->getSubExpr(); 3715 QualType ThrowType = SubExpr->getType(); 3716 // The exception object lives on the stack and it's address is passed to the 3717 // runtime function. 3718 llvm::AllocaInst *AI = CGF.CreateMemTemp(ThrowType); 3719 CGF.EmitAnyExprToMem(SubExpr, AI, ThrowType.getQualifiers(), 3720 /*IsInit=*/true); 3721 3722 // The so-called ThrowInfo is used to describe how the exception object may be 3723 // caught. 3724 llvm::GlobalVariable *TI = getThrowInfo(ThrowType); 3725 3726 // Call into the runtime to throw the exception. 3727 llvm::Value *Args[] = {CGF.Builder.CreateBitCast(AI, CGM.Int8PtrTy), TI}; 3728 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(), Args); 3729} 3730