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