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