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 iOS64CXXABI : public ARMCXXABI { 490 public: 491 iOS64CXXABI(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::iOS64: 555 return new iOS64CXXABI(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); 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 = 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 if (!VTable->isDeclarationForLinker()) 1771 CGM.EmitVTableTypeMetadata(RD, VTable, VTLayout); 1772 1773 if (VTContext.isRelativeLayout() && !VTable->isDSOLocal()) 1774 CGVT.GenerateRelativeVTableAlias(VTable, VTable->getName()); 1775 } 1776 1777 bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField( 1778 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) { 1779 if (Vptr.NearestVBase == nullptr) 1780 return false; 1781 return NeedsVTTParameter(CGF.CurGD); 1782 } 1783 1784 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor( 1785 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, 1786 const CXXRecordDecl *NearestVBase) { 1787 1788 if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) && 1789 NeedsVTTParameter(CGF.CurGD)) { 1790 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base, 1791 NearestVBase); 1792 } 1793 return getVTableAddressPoint(Base, VTableClass); 1794 } 1795 1796 llvm::Constant * 1797 ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base, 1798 const CXXRecordDecl *VTableClass) { 1799 llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, CharUnits()); 1800 1801 // Find the appropriate vtable within the vtable group, and the address point 1802 // within that vtable. 1803 VTableLayout::AddressPointLocation AddressPoint = 1804 CGM.getItaniumVTableContext() 1805 .getVTableLayout(VTableClass) 1806 .getAddressPoint(Base); 1807 llvm::Value *Indices[] = { 1808 llvm::ConstantInt::get(CGM.Int32Ty, 0), 1809 llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.VTableIndex), 1810 llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.AddressPointIndex), 1811 }; 1812 1813 return llvm::ConstantExpr::getGetElementPtr(VTable->getValueType(), VTable, 1814 Indices, /*InBounds=*/true, 1815 /*InRangeIndex=*/1); 1816 } 1817 1818 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT( 1819 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, 1820 const CXXRecordDecl *NearestVBase) { 1821 assert((Base.getBase()->getNumVBases() || NearestVBase != nullptr) && 1822 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT"); 1823 1824 // Get the secondary vpointer index. 1825 uint64_t VirtualPointerIndex = 1826 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base); 1827 1828 /// Load the VTT. 1829 llvm::Value *VTT = CGF.LoadCXXVTT(); 1830 if (VirtualPointerIndex) 1831 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex); 1832 1833 // And load the address point from the VTT. 1834 return CGF.Builder.CreateAlignedLoad(VTT, CGF.getPointerAlign()); 1835 } 1836 1837 llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr( 1838 BaseSubobject Base, const CXXRecordDecl *VTableClass) { 1839 return getVTableAddressPoint(Base, VTableClass); 1840 } 1841 1842 llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD, 1843 CharUnits VPtrOffset) { 1844 assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets"); 1845 1846 llvm::GlobalVariable *&VTable = VTables[RD]; 1847 if (VTable) 1848 return VTable; 1849 1850 // Queue up this vtable for possible deferred emission. 1851 CGM.addDeferredVTable(RD); 1852 1853 SmallString<256> Name; 1854 llvm::raw_svector_ostream Out(Name); 1855 getMangleContext().mangleCXXVTable(RD, Out); 1856 1857 const VTableLayout &VTLayout = 1858 CGM.getItaniumVTableContext().getVTableLayout(RD); 1859 llvm::Type *VTableType = CGM.getVTables().getVTableType(VTLayout); 1860 1861 // Use pointer alignment for the vtable. Otherwise we would align them based 1862 // on the size of the initializer which doesn't make sense as only single 1863 // values are read. 1864 unsigned PAlign = CGM.getItaniumVTableContext().isRelativeLayout() 1865 ? 32 1866 : CGM.getTarget().getPointerAlign(0); 1867 1868 VTable = CGM.CreateOrReplaceCXXRuntimeVariable( 1869 Name, VTableType, llvm::GlobalValue::ExternalLinkage, 1870 getContext().toCharUnitsFromBits(PAlign).getQuantity()); 1871 VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); 1872 1873 CGM.setGVProperties(VTable, RD); 1874 1875 return VTable; 1876 } 1877 1878 CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, 1879 GlobalDecl GD, 1880 Address This, 1881 llvm::Type *Ty, 1882 SourceLocation Loc) { 1883 auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl()); 1884 llvm::Value *VTable = CGF.GetVTablePtr( 1885 This, Ty->getPointerTo()->getPointerTo(), MethodDecl->getParent()); 1886 1887 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD); 1888 llvm::Value *VFunc; 1889 if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) { 1890 VFunc = CGF.EmitVTableTypeCheckedLoad( 1891 MethodDecl->getParent(), VTable, 1892 VTableIndex * CGM.getContext().getTargetInfo().getPointerWidth(0) / 8); 1893 } else { 1894 CGF.EmitTypeMetadataCodeForVCall(MethodDecl->getParent(), VTable, Loc); 1895 1896 llvm::Value *VFuncLoad; 1897 if (CGM.getItaniumVTableContext().isRelativeLayout()) { 1898 VTable = CGF.Builder.CreateBitCast(VTable, CGM.Int8PtrTy); 1899 llvm::Value *Load = CGF.Builder.CreateCall( 1900 CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}), 1901 {VTable, llvm::ConstantInt::get(CGM.Int32Ty, 4 * VTableIndex)}); 1902 VFuncLoad = CGF.Builder.CreateBitCast(Load, Ty->getPointerTo()); 1903 } else { 1904 VTable = 1905 CGF.Builder.CreateBitCast(VTable, Ty->getPointerTo()->getPointerTo()); 1906 llvm::Value *VTableSlotPtr = 1907 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn"); 1908 VFuncLoad = 1909 CGF.Builder.CreateAlignedLoad(VTableSlotPtr, CGF.getPointerAlign()); 1910 } 1911 1912 // Add !invariant.load md to virtual function load to indicate that 1913 // function didn't change inside vtable. 1914 // It's safe to add it without -fstrict-vtable-pointers, but it would not 1915 // help in devirtualization because it will only matter if we will have 2 1916 // the same virtual function loads from the same vtable load, which won't 1917 // happen without enabled devirtualization with -fstrict-vtable-pointers. 1918 if (CGM.getCodeGenOpts().OptimizationLevel > 0 && 1919 CGM.getCodeGenOpts().StrictVTablePointers) { 1920 if (auto *VFuncLoadInstr = dyn_cast<llvm::Instruction>(VFuncLoad)) { 1921 VFuncLoadInstr->setMetadata( 1922 llvm::LLVMContext::MD_invariant_load, 1923 llvm::MDNode::get(CGM.getLLVMContext(), 1924 llvm::ArrayRef<llvm::Metadata *>())); 1925 } 1926 } 1927 VFunc = VFuncLoad; 1928 } 1929 1930 CGCallee Callee(GD, VFunc); 1931 return Callee; 1932 } 1933 1934 llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall( 1935 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType, 1936 Address This, DeleteOrMemberCallExpr E) { 1937 auto *CE = E.dyn_cast<const CXXMemberCallExpr *>(); 1938 auto *D = E.dyn_cast<const CXXDeleteExpr *>(); 1939 assert((CE != nullptr) ^ (D != nullptr)); 1940 assert(CE == nullptr || CE->arg_begin() == CE->arg_end()); 1941 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete); 1942 1943 GlobalDecl GD(Dtor, DtorType); 1944 const CGFunctionInfo *FInfo = 1945 &CGM.getTypes().arrangeCXXStructorDeclaration(GD); 1946 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo); 1947 CGCallee Callee = CGCallee::forVirtual(CE, GD, This, Ty); 1948 1949 QualType ThisTy; 1950 if (CE) { 1951 ThisTy = CE->getObjectType(); 1952 } else { 1953 ThisTy = D->getDestroyedType(); 1954 } 1955 1956 CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, nullptr, 1957 QualType(), nullptr); 1958 return nullptr; 1959 } 1960 1961 void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) { 1962 CodeGenVTables &VTables = CGM.getVTables(); 1963 llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD); 1964 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD); 1965 } 1966 1967 bool ItaniumCXXABI::canSpeculativelyEmitVTableAsBaseClass( 1968 const CXXRecordDecl *RD) const { 1969 // We don't emit available_externally vtables if we are in -fapple-kext mode 1970 // because kext mode does not permit devirtualization. 1971 if (CGM.getLangOpts().AppleKext) 1972 return false; 1973 1974 // If the vtable is hidden then it is not safe to emit an available_externally 1975 // copy of vtable. 1976 if (isVTableHidden(RD)) 1977 return false; 1978 1979 if (CGM.getCodeGenOpts().ForceEmitVTables) 1980 return true; 1981 1982 // If we don't have any not emitted inline virtual function then we are safe 1983 // to emit an available_externally copy of vtable. 1984 // FIXME we can still emit a copy of the vtable if we 1985 // can emit definition of the inline functions. 1986 if (hasAnyUnusedVirtualInlineFunction(RD)) 1987 return false; 1988 1989 // For a class with virtual bases, we must also be able to speculatively 1990 // emit the VTT, because CodeGen doesn't have separate notions of "can emit 1991 // the vtable" and "can emit the VTT". For a base subobject, this means we 1992 // need to be able to emit non-virtual base vtables. 1993 if (RD->getNumVBases()) { 1994 for (const auto &B : RD->bases()) { 1995 auto *BRD = B.getType()->getAsCXXRecordDecl(); 1996 assert(BRD && "no class for base specifier"); 1997 if (B.isVirtual() || !BRD->isDynamicClass()) 1998 continue; 1999 if (!canSpeculativelyEmitVTableAsBaseClass(BRD)) 2000 return false; 2001 } 2002 } 2003 2004 return true; 2005 } 2006 2007 bool ItaniumCXXABI::canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const { 2008 if (!canSpeculativelyEmitVTableAsBaseClass(RD)) 2009 return false; 2010 2011 // For a complete-object vtable (or more specifically, for the VTT), we need 2012 // to be able to speculatively emit the vtables of all dynamic virtual bases. 2013 for (const auto &B : RD->vbases()) { 2014 auto *BRD = B.getType()->getAsCXXRecordDecl(); 2015 assert(BRD && "no class for base specifier"); 2016 if (!BRD->isDynamicClass()) 2017 continue; 2018 if (!canSpeculativelyEmitVTableAsBaseClass(BRD)) 2019 return false; 2020 } 2021 2022 return true; 2023 } 2024 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF, 2025 Address InitialPtr, 2026 int64_t NonVirtualAdjustment, 2027 int64_t VirtualAdjustment, 2028 bool IsReturnAdjustment) { 2029 if (!NonVirtualAdjustment && !VirtualAdjustment) 2030 return InitialPtr.getPointer(); 2031 2032 Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty); 2033 2034 // In a base-to-derived cast, the non-virtual adjustment is applied first. 2035 if (NonVirtualAdjustment && !IsReturnAdjustment) { 2036 V = CGF.Builder.CreateConstInBoundsByteGEP(V, 2037 CharUnits::fromQuantity(NonVirtualAdjustment)); 2038 } 2039 2040 // Perform the virtual adjustment if we have one. 2041 llvm::Value *ResultPtr; 2042 if (VirtualAdjustment) { 2043 Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy); 2044 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr); 2045 2046 llvm::Value *Offset; 2047 llvm::Value *OffsetPtr = 2048 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment); 2049 if (CGF.CGM.getItaniumVTableContext().isRelativeLayout()) { 2050 // Load the adjustment offset from the vtable as a 32-bit int. 2051 OffsetPtr = 2052 CGF.Builder.CreateBitCast(OffsetPtr, CGF.Int32Ty->getPointerTo()); 2053 Offset = 2054 CGF.Builder.CreateAlignedLoad(OffsetPtr, CharUnits::fromQuantity(4)); 2055 } else { 2056 llvm::Type *PtrDiffTy = 2057 CGF.ConvertType(CGF.getContext().getPointerDiffType()); 2058 2059 OffsetPtr = 2060 CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo()); 2061 2062 // Load the adjustment offset from the vtable. 2063 Offset = CGF.Builder.CreateAlignedLoad(OffsetPtr, CGF.getPointerAlign()); 2064 } 2065 // Adjust our pointer. 2066 ResultPtr = CGF.Builder.CreateInBoundsGEP(V.getPointer(), Offset); 2067 } else { 2068 ResultPtr = V.getPointer(); 2069 } 2070 2071 // In a derived-to-base conversion, the non-virtual adjustment is 2072 // applied second. 2073 if (NonVirtualAdjustment && IsReturnAdjustment) { 2074 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(ResultPtr, 2075 NonVirtualAdjustment); 2076 } 2077 2078 // Cast back to the original type. 2079 return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType()); 2080 } 2081 2082 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF, 2083 Address This, 2084 const ThisAdjustment &TA) { 2085 return performTypeAdjustment(CGF, This, TA.NonVirtual, 2086 TA.Virtual.Itanium.VCallOffsetOffset, 2087 /*IsReturnAdjustment=*/false); 2088 } 2089 2090 llvm::Value * 2091 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret, 2092 const ReturnAdjustment &RA) { 2093 return performTypeAdjustment(CGF, Ret, RA.NonVirtual, 2094 RA.Virtual.Itanium.VBaseOffsetOffset, 2095 /*IsReturnAdjustment=*/true); 2096 } 2097 2098 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF, 2099 RValue RV, QualType ResultType) { 2100 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl())) 2101 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType); 2102 2103 // Destructor thunks in the ARM ABI have indeterminate results. 2104 llvm::Type *T = CGF.ReturnValue.getElementType(); 2105 RValue Undef = RValue::get(llvm::UndefValue::get(T)); 2106 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType); 2107 } 2108 2109 /************************** Array allocation cookies **************************/ 2110 2111 CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) { 2112 // The array cookie is a size_t; pad that up to the element alignment. 2113 // The cookie is actually right-justified in that space. 2114 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes), 2115 CGM.getContext().getPreferredTypeAlignInChars(elementType)); 2116 } 2117 2118 Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, 2119 Address NewPtr, 2120 llvm::Value *NumElements, 2121 const CXXNewExpr *expr, 2122 QualType ElementType) { 2123 assert(requiresArrayCookie(expr)); 2124 2125 unsigned AS = NewPtr.getAddressSpace(); 2126 2127 ASTContext &Ctx = getContext(); 2128 CharUnits SizeSize = CGF.getSizeSize(); 2129 2130 // The size of the cookie. 2131 CharUnits CookieSize = 2132 std::max(SizeSize, Ctx.getPreferredTypeAlignInChars(ElementType)); 2133 assert(CookieSize == getArrayCookieSizeImpl(ElementType)); 2134 2135 // Compute an offset to the cookie. 2136 Address CookiePtr = NewPtr; 2137 CharUnits CookieOffset = CookieSize - SizeSize; 2138 if (!CookieOffset.isZero()) 2139 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset); 2140 2141 // Write the number of elements into the appropriate slot. 2142 Address NumElementsPtr = 2143 CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy); 2144 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr); 2145 2146 // Handle the array cookie specially in ASan. 2147 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 && 2148 (expr->getOperatorNew()->isReplaceableGlobalAllocationFunction() || 2149 CGM.getCodeGenOpts().SanitizeAddressPoisonCustomArrayCookie)) { 2150 // The store to the CookiePtr does not need to be instrumented. 2151 CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI); 2152 llvm::FunctionType *FTy = 2153 llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false); 2154 llvm::FunctionCallee F = 2155 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie"); 2156 CGF.Builder.CreateCall(F, NumElementsPtr.getPointer()); 2157 } 2158 2159 // Finally, compute a pointer to the actual data buffer by skipping 2160 // over the cookie completely. 2161 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize); 2162 } 2163 2164 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, 2165 Address allocPtr, 2166 CharUnits cookieSize) { 2167 // The element size is right-justified in the cookie. 2168 Address numElementsPtr = allocPtr; 2169 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize(); 2170 if (!numElementsOffset.isZero()) 2171 numElementsPtr = 2172 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset); 2173 2174 unsigned AS = allocPtr.getAddressSpace(); 2175 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy); 2176 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0) 2177 return CGF.Builder.CreateLoad(numElementsPtr); 2178 // In asan mode emit a function call instead of a regular load and let the 2179 // run-time deal with it: if the shadow is properly poisoned return the 2180 // cookie, otherwise return 0 to avoid an infinite loop calling DTORs. 2181 // We can't simply ignore this load using nosanitize metadata because 2182 // the metadata may be lost. 2183 llvm::FunctionType *FTy = 2184 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false); 2185 llvm::FunctionCallee F = 2186 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie"); 2187 return CGF.Builder.CreateCall(F, numElementsPtr.getPointer()); 2188 } 2189 2190 CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) { 2191 // ARM says that the cookie is always: 2192 // struct array_cookie { 2193 // std::size_t element_size; // element_size != 0 2194 // std::size_t element_count; 2195 // }; 2196 // But the base ABI doesn't give anything an alignment greater than 2197 // 8, so we can dismiss this as typical ABI-author blindness to 2198 // actual language complexity and round up to the element alignment. 2199 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes), 2200 CGM.getContext().getTypeAlignInChars(elementType)); 2201 } 2202 2203 Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, 2204 Address newPtr, 2205 llvm::Value *numElements, 2206 const CXXNewExpr *expr, 2207 QualType elementType) { 2208 assert(requiresArrayCookie(expr)); 2209 2210 // The cookie is always at the start of the buffer. 2211 Address cookie = newPtr; 2212 2213 // The first element is the element size. 2214 cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy); 2215 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy, 2216 getContext().getTypeSizeInChars(elementType).getQuantity()); 2217 CGF.Builder.CreateStore(elementSize, cookie); 2218 2219 // The second element is the element count. 2220 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1); 2221 CGF.Builder.CreateStore(numElements, cookie); 2222 2223 // Finally, compute a pointer to the actual data buffer by skipping 2224 // over the cookie completely. 2225 CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType); 2226 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize); 2227 } 2228 2229 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, 2230 Address allocPtr, 2231 CharUnits cookieSize) { 2232 // The number of elements is at offset sizeof(size_t) relative to 2233 // the allocated pointer. 2234 Address numElementsPtr 2235 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize()); 2236 2237 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy); 2238 return CGF.Builder.CreateLoad(numElementsPtr); 2239 } 2240 2241 /*********************** Static local initialization **************************/ 2242 2243 static llvm::FunctionCallee getGuardAcquireFn(CodeGenModule &CGM, 2244 llvm::PointerType *GuardPtrTy) { 2245 // int __cxa_guard_acquire(__guard *guard_object); 2246 llvm::FunctionType *FTy = 2247 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy), 2248 GuardPtrTy, /*isVarArg=*/false); 2249 return CGM.CreateRuntimeFunction( 2250 FTy, "__cxa_guard_acquire", 2251 llvm::AttributeList::get(CGM.getLLVMContext(), 2252 llvm::AttributeList::FunctionIndex, 2253 llvm::Attribute::NoUnwind)); 2254 } 2255 2256 static llvm::FunctionCallee getGuardReleaseFn(CodeGenModule &CGM, 2257 llvm::PointerType *GuardPtrTy) { 2258 // void __cxa_guard_release(__guard *guard_object); 2259 llvm::FunctionType *FTy = 2260 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false); 2261 return CGM.CreateRuntimeFunction( 2262 FTy, "__cxa_guard_release", 2263 llvm::AttributeList::get(CGM.getLLVMContext(), 2264 llvm::AttributeList::FunctionIndex, 2265 llvm::Attribute::NoUnwind)); 2266 } 2267 2268 static llvm::FunctionCallee getGuardAbortFn(CodeGenModule &CGM, 2269 llvm::PointerType *GuardPtrTy) { 2270 // void __cxa_guard_abort(__guard *guard_object); 2271 llvm::FunctionType *FTy = 2272 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false); 2273 return CGM.CreateRuntimeFunction( 2274 FTy, "__cxa_guard_abort", 2275 llvm::AttributeList::get(CGM.getLLVMContext(), 2276 llvm::AttributeList::FunctionIndex, 2277 llvm::Attribute::NoUnwind)); 2278 } 2279 2280 namespace { 2281 struct CallGuardAbort final : EHScopeStack::Cleanup { 2282 llvm::GlobalVariable *Guard; 2283 CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {} 2284 2285 void Emit(CodeGenFunction &CGF, Flags flags) override { 2286 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()), 2287 Guard); 2288 } 2289 }; 2290 } 2291 2292 /// The ARM code here follows the Itanium code closely enough that we 2293 /// just special-case it at particular places. 2294 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF, 2295 const VarDecl &D, 2296 llvm::GlobalVariable *var, 2297 bool shouldPerformInit) { 2298 CGBuilderTy &Builder = CGF.Builder; 2299 2300 // Inline variables that weren't instantiated from variable templates have 2301 // partially-ordered initialization within their translation unit. 2302 bool NonTemplateInline = 2303 D.isInline() && 2304 !isTemplateInstantiation(D.getTemplateSpecializationKind()); 2305 2306 // We only need to use thread-safe statics for local non-TLS variables and 2307 // inline variables; other global initialization is always single-threaded 2308 // or (through lazy dynamic loading in multiple threads) unsequenced. 2309 bool threadsafe = getContext().getLangOpts().ThreadsafeStatics && 2310 (D.isLocalVarDecl() || NonTemplateInline) && 2311 !D.getTLSKind(); 2312 2313 // If we have a global variable with internal linkage and thread-safe statics 2314 // are disabled, we can just let the guard variable be of type i8. 2315 bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage(); 2316 2317 llvm::IntegerType *guardTy; 2318 CharUnits guardAlignment; 2319 if (useInt8GuardVariable) { 2320 guardTy = CGF.Int8Ty; 2321 guardAlignment = CharUnits::One(); 2322 } else { 2323 // Guard variables are 64 bits in the generic ABI and size width on ARM 2324 // (i.e. 32-bit on AArch32, 64-bit on AArch64). 2325 if (UseARMGuardVarABI) { 2326 guardTy = CGF.SizeTy; 2327 guardAlignment = CGF.getSizeAlign(); 2328 } else { 2329 guardTy = CGF.Int64Ty; 2330 guardAlignment = CharUnits::fromQuantity( 2331 CGM.getDataLayout().getABITypeAlignment(guardTy)); 2332 } 2333 } 2334 llvm::PointerType *guardPtrTy = guardTy->getPointerTo(); 2335 2336 // Create the guard variable if we don't already have it (as we 2337 // might if we're double-emitting this function body). 2338 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D); 2339 if (!guard) { 2340 // Mangle the name for the guard. 2341 SmallString<256> guardName; 2342 { 2343 llvm::raw_svector_ostream out(guardName); 2344 getMangleContext().mangleStaticGuardVariable(&D, out); 2345 } 2346 2347 // Create the guard variable with a zero-initializer. 2348 // Just absorb linkage and visibility from the guarded variable. 2349 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy, 2350 false, var->getLinkage(), 2351 llvm::ConstantInt::get(guardTy, 0), 2352 guardName.str()); 2353 guard->setDSOLocal(var->isDSOLocal()); 2354 guard->setVisibility(var->getVisibility()); 2355 // If the variable is thread-local, so is its guard variable. 2356 guard->setThreadLocalMode(var->getThreadLocalMode()); 2357 guard->setAlignment(guardAlignment.getAsAlign()); 2358 2359 // The ABI says: "It is suggested that it be emitted in the same COMDAT 2360 // group as the associated data object." In practice, this doesn't work for 2361 // non-ELF and non-Wasm object formats, so only do it for ELF and Wasm. 2362 llvm::Comdat *C = var->getComdat(); 2363 if (!D.isLocalVarDecl() && C && 2364 (CGM.getTarget().getTriple().isOSBinFormatELF() || 2365 CGM.getTarget().getTriple().isOSBinFormatWasm())) { 2366 guard->setComdat(C); 2367 // An inline variable's guard function is run from the per-TU 2368 // initialization function, not via a dedicated global ctor function, so 2369 // we can't put it in a comdat. 2370 if (!NonTemplateInline) 2371 CGF.CurFn->setComdat(C); 2372 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) { 2373 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName())); 2374 } 2375 2376 CGM.setStaticLocalDeclGuardAddress(&D, guard); 2377 } 2378 2379 Address guardAddr = Address(guard, guardAlignment); 2380 2381 // Test whether the variable has completed initialization. 2382 // 2383 // Itanium C++ ABI 3.3.2: 2384 // The following is pseudo-code showing how these functions can be used: 2385 // if (obj_guard.first_byte == 0) { 2386 // if ( __cxa_guard_acquire (&obj_guard) ) { 2387 // try { 2388 // ... initialize the object ...; 2389 // } catch (...) { 2390 // __cxa_guard_abort (&obj_guard); 2391 // throw; 2392 // } 2393 // ... queue object destructor with __cxa_atexit() ...; 2394 // __cxa_guard_release (&obj_guard); 2395 // } 2396 // } 2397 2398 // Load the first byte of the guard variable. 2399 llvm::LoadInst *LI = 2400 Builder.CreateLoad(Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty)); 2401 2402 // Itanium ABI: 2403 // An implementation supporting thread-safety on multiprocessor 2404 // systems must also guarantee that references to the initialized 2405 // object do not occur before the load of the initialization flag. 2406 // 2407 // In LLVM, we do this by marking the load Acquire. 2408 if (threadsafe) 2409 LI->setAtomic(llvm::AtomicOrdering::Acquire); 2410 2411 // For ARM, we should only check the first bit, rather than the entire byte: 2412 // 2413 // ARM C++ ABI 3.2.3.1: 2414 // To support the potential use of initialization guard variables 2415 // as semaphores that are the target of ARM SWP and LDREX/STREX 2416 // synchronizing instructions we define a static initialization 2417 // guard variable to be a 4-byte aligned, 4-byte word with the 2418 // following inline access protocol. 2419 // #define INITIALIZED 1 2420 // if ((obj_guard & INITIALIZED) != INITIALIZED) { 2421 // if (__cxa_guard_acquire(&obj_guard)) 2422 // ... 2423 // } 2424 // 2425 // and similarly for ARM64: 2426 // 2427 // ARM64 C++ ABI 3.2.2: 2428 // This ABI instead only specifies the value bit 0 of the static guard 2429 // variable; all other bits are platform defined. Bit 0 shall be 0 when the 2430 // variable is not initialized and 1 when it is. 2431 llvm::Value *V = 2432 (UseARMGuardVarABI && !useInt8GuardVariable) 2433 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1)) 2434 : LI; 2435 llvm::Value *NeedsInit = Builder.CreateIsNull(V, "guard.uninitialized"); 2436 2437 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check"); 2438 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); 2439 2440 // Check if the first byte of the guard variable is zero. 2441 CGF.EmitCXXGuardedInitBranch(NeedsInit, InitCheckBlock, EndBlock, 2442 CodeGenFunction::GuardKind::VariableGuard, &D); 2443 2444 CGF.EmitBlock(InitCheckBlock); 2445 2446 // Variables used when coping with thread-safe statics and exceptions. 2447 if (threadsafe) { 2448 // Call __cxa_guard_acquire. 2449 llvm::Value *V 2450 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard); 2451 2452 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); 2453 2454 Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"), 2455 InitBlock, EndBlock); 2456 2457 // Call __cxa_guard_abort along the exceptional edge. 2458 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard); 2459 2460 CGF.EmitBlock(InitBlock); 2461 } 2462 2463 // Emit the initializer and add a global destructor if appropriate. 2464 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit); 2465 2466 if (threadsafe) { 2467 // Pop the guard-abort cleanup if we pushed one. 2468 CGF.PopCleanupBlock(); 2469 2470 // Call __cxa_guard_release. This cannot throw. 2471 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), 2472 guardAddr.getPointer()); 2473 } else { 2474 Builder.CreateStore(llvm::ConstantInt::get(guardTy, 1), guardAddr); 2475 } 2476 2477 CGF.EmitBlock(EndBlock); 2478 } 2479 2480 /// Register a global destructor using __cxa_atexit. 2481 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF, 2482 llvm::FunctionCallee dtor, 2483 llvm::Constant *addr, bool TLS) { 2484 assert((TLS || CGF.getTypes().getCodeGenOpts().CXAAtExit) && 2485 "__cxa_atexit is disabled"); 2486 const char *Name = "__cxa_atexit"; 2487 if (TLS) { 2488 const llvm::Triple &T = CGF.getTarget().getTriple(); 2489 Name = T.isOSDarwin() ? "_tlv_atexit" : "__cxa_thread_atexit"; 2490 } 2491 2492 // We're assuming that the destructor function is something we can 2493 // reasonably call with the default CC. Go ahead and cast it to the 2494 // right prototype. 2495 llvm::Type *dtorTy = 2496 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo(); 2497 2498 // Preserve address space of addr. 2499 auto AddrAS = addr ? addr->getType()->getPointerAddressSpace() : 0; 2500 auto AddrInt8PtrTy = 2501 AddrAS ? CGF.Int8Ty->getPointerTo(AddrAS) : CGF.Int8PtrTy; 2502 2503 // Create a variable that binds the atexit to this shared object. 2504 llvm::Constant *handle = 2505 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle"); 2506 auto *GV = cast<llvm::GlobalValue>(handle->stripPointerCasts()); 2507 GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 2508 2509 // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d); 2510 llvm::Type *paramTys[] = {dtorTy, AddrInt8PtrTy, handle->getType()}; 2511 llvm::FunctionType *atexitTy = 2512 llvm::FunctionType::get(CGF.IntTy, paramTys, false); 2513 2514 // Fetch the actual function. 2515 llvm::FunctionCallee atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name); 2516 if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit.getCallee())) 2517 fn->setDoesNotThrow(); 2518 2519 if (!addr) 2520 // addr is null when we are trying to register a dtor annotated with 2521 // __attribute__((destructor)) in a constructor function. Using null here is 2522 // okay because this argument is just passed back to the destructor 2523 // function. 2524 addr = llvm::Constant::getNullValue(CGF.Int8PtrTy); 2525 2526 llvm::Value *args[] = {llvm::ConstantExpr::getBitCast( 2527 cast<llvm::Constant>(dtor.getCallee()), dtorTy), 2528 llvm::ConstantExpr::getBitCast(addr, AddrInt8PtrTy), 2529 handle}; 2530 CGF.EmitNounwindRuntimeCall(atexit, args); 2531 } 2532 2533 void CodeGenModule::registerGlobalDtorsWithAtExit() { 2534 for (const auto &I : DtorsUsingAtExit) { 2535 int Priority = I.first; 2536 const llvm::TinyPtrVector<llvm::Function *> &Dtors = I.second; 2537 2538 // Create a function that registers destructors that have the same priority. 2539 // 2540 // Since constructor functions are run in non-descending order of their 2541 // priorities, destructors are registered in non-descending order of their 2542 // priorities, and since destructor functions are run in the reverse order 2543 // of their registration, destructor functions are run in non-ascending 2544 // order of their priorities. 2545 CodeGenFunction CGF(*this); 2546 std::string GlobalInitFnName = 2547 std::string("__GLOBAL_init_") + llvm::to_string(Priority); 2548 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false); 2549 llvm::Function *GlobalInitFn = CreateGlobalInitOrCleanUpFunction( 2550 FTy, GlobalInitFnName, getTypes().arrangeNullaryFunction(), 2551 SourceLocation()); 2552 ASTContext &Ctx = getContext(); 2553 QualType ReturnTy = Ctx.VoidTy; 2554 QualType FunctionTy = Ctx.getFunctionType(ReturnTy, llvm::None, {}); 2555 FunctionDecl *FD = FunctionDecl::Create( 2556 Ctx, Ctx.getTranslationUnitDecl(), SourceLocation(), SourceLocation(), 2557 &Ctx.Idents.get(GlobalInitFnName), FunctionTy, nullptr, SC_Static, 2558 false, false); 2559 CGF.StartFunction(GlobalDecl(FD), ReturnTy, GlobalInitFn, 2560 getTypes().arrangeNullaryFunction(), FunctionArgList(), 2561 SourceLocation(), SourceLocation()); 2562 2563 for (auto *Dtor : Dtors) { 2564 // Register the destructor function calling __cxa_atexit if it is 2565 // available. Otherwise fall back on calling atexit. 2566 if (getCodeGenOpts().CXAAtExit) 2567 emitGlobalDtorWithCXAAtExit(CGF, Dtor, nullptr, false); 2568 else 2569 CGF.registerGlobalDtorWithAtExit(Dtor); 2570 } 2571 2572 CGF.FinishFunction(); 2573 AddGlobalCtor(GlobalInitFn, Priority, nullptr); 2574 } 2575 } 2576 2577 /// Register a global destructor as best as we know how. 2578 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, 2579 llvm::FunctionCallee dtor, 2580 llvm::Constant *addr) { 2581 if (D.isNoDestroy(CGM.getContext())) 2582 return; 2583 2584 // emitGlobalDtorWithCXAAtExit will emit a call to either __cxa_thread_atexit 2585 // or __cxa_atexit depending on whether this VarDecl is a thread-local storage 2586 // or not. CXAAtExit controls only __cxa_atexit, so use it if it is enabled. 2587 // We can always use __cxa_thread_atexit. 2588 if (CGM.getCodeGenOpts().CXAAtExit || D.getTLSKind()) 2589 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind()); 2590 2591 // In Apple kexts, we want to add a global destructor entry. 2592 // FIXME: shouldn't this be guarded by some variable? 2593 if (CGM.getLangOpts().AppleKext) { 2594 // Generate a global destructor entry. 2595 return CGM.AddCXXDtorEntry(dtor, addr); 2596 } 2597 2598 CGF.registerGlobalDtorWithAtExit(D, dtor, addr); 2599 } 2600 2601 static bool isThreadWrapperReplaceable(const VarDecl *VD, 2602 CodeGen::CodeGenModule &CGM) { 2603 assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!"); 2604 // Darwin prefers to have references to thread local variables to go through 2605 // the thread wrapper instead of directly referencing the backing variable. 2606 return VD->getTLSKind() == VarDecl::TLS_Dynamic && 2607 CGM.getTarget().getTriple().isOSDarwin(); 2608 } 2609 2610 /// Get the appropriate linkage for the wrapper function. This is essentially 2611 /// the weak form of the variable's linkage; every translation unit which needs 2612 /// the wrapper emits a copy, and we want the linker to merge them. 2613 static llvm::GlobalValue::LinkageTypes 2614 getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) { 2615 llvm::GlobalValue::LinkageTypes VarLinkage = 2616 CGM.getLLVMLinkageVarDefinition(VD, /*IsConstant=*/false); 2617 2618 // For internal linkage variables, we don't need an external or weak wrapper. 2619 if (llvm::GlobalValue::isLocalLinkage(VarLinkage)) 2620 return VarLinkage; 2621 2622 // If the thread wrapper is replaceable, give it appropriate linkage. 2623 if (isThreadWrapperReplaceable(VD, CGM)) 2624 if (!llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) && 2625 !llvm::GlobalVariable::isWeakODRLinkage(VarLinkage)) 2626 return VarLinkage; 2627 return llvm::GlobalValue::WeakODRLinkage; 2628 } 2629 2630 llvm::Function * 2631 ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD, 2632 llvm::Value *Val) { 2633 // Mangle the name for the thread_local wrapper function. 2634 SmallString<256> WrapperName; 2635 { 2636 llvm::raw_svector_ostream Out(WrapperName); 2637 getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out); 2638 } 2639 2640 // FIXME: If VD is a definition, we should regenerate the function attributes 2641 // before returning. 2642 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName)) 2643 return cast<llvm::Function>(V); 2644 2645 QualType RetQT = VD->getType(); 2646 if (RetQT->isReferenceType()) 2647 RetQT = RetQT.getNonReferenceType(); 2648 2649 const CGFunctionInfo &FI = CGM.getTypes().arrangeBuiltinFunctionDeclaration( 2650 getContext().getPointerType(RetQT), FunctionArgList()); 2651 2652 llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FI); 2653 llvm::Function *Wrapper = 2654 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM), 2655 WrapperName.str(), &CGM.getModule()); 2656 2657 if (CGM.supportsCOMDAT() && Wrapper->isWeakForLinker()) 2658 Wrapper->setComdat(CGM.getModule().getOrInsertComdat(Wrapper->getName())); 2659 2660 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Wrapper); 2661 2662 // Always resolve references to the wrapper at link time. 2663 if (!Wrapper->hasLocalLinkage()) 2664 if (!isThreadWrapperReplaceable(VD, CGM) || 2665 llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) || 2666 llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage()) || 2667 VD->getVisibility() == HiddenVisibility) 2668 Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility); 2669 2670 if (isThreadWrapperReplaceable(VD, CGM)) { 2671 Wrapper->setCallingConv(llvm::CallingConv::CXX_FAST_TLS); 2672 Wrapper->addFnAttr(llvm::Attribute::NoUnwind); 2673 } 2674 2675 ThreadWrappers.push_back({VD, Wrapper}); 2676 return Wrapper; 2677 } 2678 2679 void ItaniumCXXABI::EmitThreadLocalInitFuncs( 2680 CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals, 2681 ArrayRef<llvm::Function *> CXXThreadLocalInits, 2682 ArrayRef<const VarDecl *> CXXThreadLocalInitVars) { 2683 llvm::Function *InitFunc = nullptr; 2684 2685 // Separate initializers into those with ordered (or partially-ordered) 2686 // initialization and those with unordered initialization. 2687 llvm::SmallVector<llvm::Function *, 8> OrderedInits; 2688 llvm::SmallDenseMap<const VarDecl *, llvm::Function *> UnorderedInits; 2689 for (unsigned I = 0; I != CXXThreadLocalInits.size(); ++I) { 2690 if (isTemplateInstantiation( 2691 CXXThreadLocalInitVars[I]->getTemplateSpecializationKind())) 2692 UnorderedInits[CXXThreadLocalInitVars[I]->getCanonicalDecl()] = 2693 CXXThreadLocalInits[I]; 2694 else 2695 OrderedInits.push_back(CXXThreadLocalInits[I]); 2696 } 2697 2698 if (!OrderedInits.empty()) { 2699 // Generate a guarded initialization function. 2700 llvm::FunctionType *FTy = 2701 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false); 2702 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction(); 2703 InitFunc = CGM.CreateGlobalInitOrCleanUpFunction(FTy, "__tls_init", FI, 2704 SourceLocation(), 2705 /*TLS=*/true); 2706 llvm::GlobalVariable *Guard = new llvm::GlobalVariable( 2707 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false, 2708 llvm::GlobalVariable::InternalLinkage, 2709 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard"); 2710 Guard->setThreadLocal(true); 2711 Guard->setThreadLocalMode(CGM.GetDefaultLLVMTLSModel()); 2712 2713 CharUnits GuardAlign = CharUnits::One(); 2714 Guard->setAlignment(GuardAlign.getAsAlign()); 2715 2716 CodeGenFunction(CGM).GenerateCXXGlobalInitFunc( 2717 InitFunc, OrderedInits, ConstantAddress(Guard, GuardAlign)); 2718 // On Darwin platforms, use CXX_FAST_TLS calling convention. 2719 if (CGM.getTarget().getTriple().isOSDarwin()) { 2720 InitFunc->setCallingConv(llvm::CallingConv::CXX_FAST_TLS); 2721 InitFunc->addFnAttr(llvm::Attribute::NoUnwind); 2722 } 2723 } 2724 2725 // Create declarations for thread wrappers for all thread-local variables 2726 // with non-discardable definitions in this translation unit. 2727 for (const VarDecl *VD : CXXThreadLocals) { 2728 if (VD->hasDefinition() && 2729 !isDiscardableGVALinkage(getContext().GetGVALinkageForVariable(VD))) { 2730 llvm::GlobalValue *GV = CGM.GetGlobalValue(CGM.getMangledName(VD)); 2731 getOrCreateThreadLocalWrapper(VD, GV); 2732 } 2733 } 2734 2735 // Emit all referenced thread wrappers. 2736 for (auto VDAndWrapper : ThreadWrappers) { 2737 const VarDecl *VD = VDAndWrapper.first; 2738 llvm::GlobalVariable *Var = 2739 cast<llvm::GlobalVariable>(CGM.GetGlobalValue(CGM.getMangledName(VD))); 2740 llvm::Function *Wrapper = VDAndWrapper.second; 2741 2742 // Some targets require that all access to thread local variables go through 2743 // the thread wrapper. This means that we cannot attempt to create a thread 2744 // wrapper or a thread helper. 2745 if (!VD->hasDefinition()) { 2746 if (isThreadWrapperReplaceable(VD, CGM)) { 2747 Wrapper->setLinkage(llvm::Function::ExternalLinkage); 2748 continue; 2749 } 2750 2751 // If this isn't a TU in which this variable is defined, the thread 2752 // wrapper is discardable. 2753 if (Wrapper->getLinkage() == llvm::Function::WeakODRLinkage) 2754 Wrapper->setLinkage(llvm::Function::LinkOnceODRLinkage); 2755 } 2756 2757 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Wrapper); 2758 2759 // Mangle the name for the thread_local initialization function. 2760 SmallString<256> InitFnName; 2761 { 2762 llvm::raw_svector_ostream Out(InitFnName); 2763 getMangleContext().mangleItaniumThreadLocalInit(VD, Out); 2764 } 2765 2766 llvm::FunctionType *InitFnTy = llvm::FunctionType::get(CGM.VoidTy, false); 2767 2768 // If we have a definition for the variable, emit the initialization 2769 // function as an alias to the global Init function (if any). Otherwise, 2770 // produce a declaration of the initialization function. 2771 llvm::GlobalValue *Init = nullptr; 2772 bool InitIsInitFunc = false; 2773 bool HasConstantInitialization = false; 2774 if (!usesThreadWrapperFunction(VD)) { 2775 HasConstantInitialization = true; 2776 } else if (VD->hasDefinition()) { 2777 InitIsInitFunc = true; 2778 llvm::Function *InitFuncToUse = InitFunc; 2779 if (isTemplateInstantiation(VD->getTemplateSpecializationKind())) 2780 InitFuncToUse = UnorderedInits.lookup(VD->getCanonicalDecl()); 2781 if (InitFuncToUse) 2782 Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(), 2783 InitFuncToUse); 2784 } else { 2785 // Emit a weak global function referring to the initialization function. 2786 // This function will not exist if the TU defining the thread_local 2787 // variable in question does not need any dynamic initialization for 2788 // its thread_local variables. 2789 Init = llvm::Function::Create(InitFnTy, 2790 llvm::GlobalVariable::ExternalWeakLinkage, 2791 InitFnName.str(), &CGM.getModule()); 2792 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction(); 2793 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, 2794 cast<llvm::Function>(Init)); 2795 } 2796 2797 if (Init) { 2798 Init->setVisibility(Var->getVisibility()); 2799 // Don't mark an extern_weak function DSO local on windows. 2800 if (!CGM.getTriple().isOSWindows() || !Init->hasExternalWeakLinkage()) 2801 Init->setDSOLocal(Var->isDSOLocal()); 2802 } 2803 2804 llvm::LLVMContext &Context = CGM.getModule().getContext(); 2805 llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper); 2806 CGBuilderTy Builder(CGM, Entry); 2807 if (HasConstantInitialization) { 2808 // No dynamic initialization to invoke. 2809 } else if (InitIsInitFunc) { 2810 if (Init) { 2811 llvm::CallInst *CallVal = Builder.CreateCall(InitFnTy, Init); 2812 if (isThreadWrapperReplaceable(VD, CGM)) { 2813 CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS); 2814 llvm::Function *Fn = 2815 cast<llvm::Function>(cast<llvm::GlobalAlias>(Init)->getAliasee()); 2816 Fn->setCallingConv(llvm::CallingConv::CXX_FAST_TLS); 2817 } 2818 } 2819 } else { 2820 // Don't know whether we have an init function. Call it if it exists. 2821 llvm::Value *Have = Builder.CreateIsNotNull(Init); 2822 llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper); 2823 llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper); 2824 Builder.CreateCondBr(Have, InitBB, ExitBB); 2825 2826 Builder.SetInsertPoint(InitBB); 2827 Builder.CreateCall(InitFnTy, Init); 2828 Builder.CreateBr(ExitBB); 2829 2830 Builder.SetInsertPoint(ExitBB); 2831 } 2832 2833 // For a reference, the result of the wrapper function is a pointer to 2834 // the referenced object. 2835 llvm::Value *Val = Var; 2836 if (VD->getType()->isReferenceType()) { 2837 CharUnits Align = CGM.getContext().getDeclAlign(VD); 2838 Val = Builder.CreateAlignedLoad(Val, Align); 2839 } 2840 if (Val->getType() != Wrapper->getReturnType()) 2841 Val = Builder.CreatePointerBitCastOrAddrSpaceCast( 2842 Val, Wrapper->getReturnType(), ""); 2843 Builder.CreateRet(Val); 2844 } 2845 } 2846 2847 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, 2848 const VarDecl *VD, 2849 QualType LValType) { 2850 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD); 2851 llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val); 2852 2853 llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper); 2854 CallVal->setCallingConv(Wrapper->getCallingConv()); 2855 2856 LValue LV; 2857 if (VD->getType()->isReferenceType()) 2858 LV = CGF.MakeNaturalAlignAddrLValue(CallVal, LValType); 2859 else 2860 LV = CGF.MakeAddrLValue(CallVal, LValType, 2861 CGF.getContext().getDeclAlign(VD)); 2862 // FIXME: need setObjCGCLValueClass? 2863 return LV; 2864 } 2865 2866 /// Return whether the given global decl needs a VTT parameter, which it does 2867 /// if it's a base constructor or destructor with virtual bases. 2868 bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) { 2869 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); 2870 2871 // We don't have any virtual bases, just return early. 2872 if (!MD->getParent()->getNumVBases()) 2873 return false; 2874 2875 // Check if we have a base constructor. 2876 if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base) 2877 return true; 2878 2879 // Check if we have a base destructor. 2880 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base) 2881 return true; 2882 2883 return false; 2884 } 2885 2886 namespace { 2887 class ItaniumRTTIBuilder { 2888 CodeGenModule &CGM; // Per-module state. 2889 llvm::LLVMContext &VMContext; 2890 const ItaniumCXXABI &CXXABI; // Per-module state. 2891 2892 /// Fields - The fields of the RTTI descriptor currently being built. 2893 SmallVector<llvm::Constant *, 16> Fields; 2894 2895 /// GetAddrOfTypeName - Returns the mangled type name of the given type. 2896 llvm::GlobalVariable * 2897 GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage); 2898 2899 /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI 2900 /// descriptor of the given type. 2901 llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty); 2902 2903 /// BuildVTablePointer - Build the vtable pointer for the given type. 2904 void BuildVTablePointer(const Type *Ty); 2905 2906 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single 2907 /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b. 2908 void BuildSIClassTypeInfo(const CXXRecordDecl *RD); 2909 2910 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for 2911 /// classes with bases that do not satisfy the abi::__si_class_type_info 2912 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c. 2913 void BuildVMIClassTypeInfo(const CXXRecordDecl *RD); 2914 2915 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used 2916 /// for pointer types. 2917 void BuildPointerTypeInfo(QualType PointeeTy); 2918 2919 /// BuildObjCObjectTypeInfo - Build the appropriate kind of 2920 /// type_info for an object type. 2921 void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty); 2922 2923 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info 2924 /// struct, used for member pointer types. 2925 void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty); 2926 2927 public: 2928 ItaniumRTTIBuilder(const ItaniumCXXABI &ABI) 2929 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {} 2930 2931 // Pointer type info flags. 2932 enum { 2933 /// PTI_Const - Type has const qualifier. 2934 PTI_Const = 0x1, 2935 2936 /// PTI_Volatile - Type has volatile qualifier. 2937 PTI_Volatile = 0x2, 2938 2939 /// PTI_Restrict - Type has restrict qualifier. 2940 PTI_Restrict = 0x4, 2941 2942 /// PTI_Incomplete - Type is incomplete. 2943 PTI_Incomplete = 0x8, 2944 2945 /// PTI_ContainingClassIncomplete - Containing class is incomplete. 2946 /// (in pointer to member). 2947 PTI_ContainingClassIncomplete = 0x10, 2948 2949 /// PTI_TransactionSafe - Pointee is transaction_safe function (C++ TM TS). 2950 //PTI_TransactionSafe = 0x20, 2951 2952 /// PTI_Noexcept - Pointee is noexcept function (C++1z). 2953 PTI_Noexcept = 0x40, 2954 }; 2955 2956 // VMI type info flags. 2957 enum { 2958 /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance. 2959 VMI_NonDiamondRepeat = 0x1, 2960 2961 /// VMI_DiamondShaped - Class is diamond shaped. 2962 VMI_DiamondShaped = 0x2 2963 }; 2964 2965 // Base class type info flags. 2966 enum { 2967 /// BCTI_Virtual - Base class is virtual. 2968 BCTI_Virtual = 0x1, 2969 2970 /// BCTI_Public - Base class is public. 2971 BCTI_Public = 0x2 2972 }; 2973 2974 /// BuildTypeInfo - Build the RTTI type info struct for the given type, or 2975 /// link to an existing RTTI descriptor if one already exists. 2976 llvm::Constant *BuildTypeInfo(QualType Ty); 2977 2978 /// BuildTypeInfo - Build the RTTI type info struct for the given type. 2979 llvm::Constant *BuildTypeInfo( 2980 QualType Ty, 2981 llvm::GlobalVariable::LinkageTypes Linkage, 2982 llvm::GlobalValue::VisibilityTypes Visibility, 2983 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass); 2984 }; 2985 } 2986 2987 llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName( 2988 QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) { 2989 SmallString<256> Name; 2990 llvm::raw_svector_ostream Out(Name); 2991 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out); 2992 2993 // We know that the mangled name of the type starts at index 4 of the 2994 // mangled name of the typename, so we can just index into it in order to 2995 // get the mangled name of the type. 2996 llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext, 2997 Name.substr(4)); 2998 auto Align = CGM.getContext().getTypeAlignInChars(CGM.getContext().CharTy); 2999 3000 llvm::GlobalVariable *GV = CGM.CreateOrReplaceCXXRuntimeVariable( 3001 Name, Init->getType(), Linkage, Align.getQuantity()); 3002 3003 GV->setInitializer(Init); 3004 3005 return GV; 3006 } 3007 3008 llvm::Constant * 3009 ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) { 3010 // Mangle the RTTI name. 3011 SmallString<256> Name; 3012 llvm::raw_svector_ostream Out(Name); 3013 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); 3014 3015 // Look for an existing global. 3016 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name); 3017 3018 if (!GV) { 3019 // Create a new global variable. 3020 // Note for the future: If we would ever like to do deferred emission of 3021 // RTTI, check if emitting vtables opportunistically need any adjustment. 3022 3023 GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy, 3024 /*isConstant=*/true, 3025 llvm::GlobalValue::ExternalLinkage, nullptr, 3026 Name); 3027 const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl(); 3028 CGM.setGVProperties(GV, RD); 3029 } 3030 3031 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); 3032 } 3033 3034 /// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type 3035 /// info for that type is defined in the standard library. 3036 static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { 3037 // Itanium C++ ABI 2.9.2: 3038 // Basic type information (e.g. for "int", "bool", etc.) will be kept in 3039 // the run-time support library. Specifically, the run-time support 3040 // library should contain type_info objects for the types X, X* and 3041 // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char, 3042 // unsigned char, signed char, short, unsigned short, int, unsigned int, 3043 // long, unsigned long, long long, unsigned long long, float, double, 3044 // long double, char16_t, char32_t, and the IEEE 754r decimal and 3045 // half-precision floating point types. 3046 // 3047 // GCC also emits RTTI for __int128. 3048 // FIXME: We do not emit RTTI information for decimal types here. 3049 3050 // Types added here must also be added to EmitFundamentalRTTIDescriptors. 3051 switch (Ty->getKind()) { 3052 case BuiltinType::Void: 3053 case BuiltinType::NullPtr: 3054 case BuiltinType::Bool: 3055 case BuiltinType::WChar_S: 3056 case BuiltinType::WChar_U: 3057 case BuiltinType::Char_U: 3058 case BuiltinType::Char_S: 3059 case BuiltinType::UChar: 3060 case BuiltinType::SChar: 3061 case BuiltinType::Short: 3062 case BuiltinType::UShort: 3063 case BuiltinType::Int: 3064 case BuiltinType::UInt: 3065 case BuiltinType::Long: 3066 case BuiltinType::ULong: 3067 case BuiltinType::LongLong: 3068 case BuiltinType::ULongLong: 3069 case BuiltinType::Half: 3070 case BuiltinType::Float: 3071 case BuiltinType::Double: 3072 case BuiltinType::LongDouble: 3073 case BuiltinType::Float16: 3074 case BuiltinType::Float128: 3075 case BuiltinType::Char8: 3076 case BuiltinType::Char16: 3077 case BuiltinType::Char32: 3078 case BuiltinType::Int128: 3079 case BuiltinType::UInt128: 3080 return true; 3081 3082 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 3083 case BuiltinType::Id: 3084 #include "clang/Basic/OpenCLImageTypes.def" 3085 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 3086 case BuiltinType::Id: 3087 #include "clang/Basic/OpenCLExtensionTypes.def" 3088 case BuiltinType::OCLSampler: 3089 case BuiltinType::OCLEvent: 3090 case BuiltinType::OCLClkEvent: 3091 case BuiltinType::OCLQueue: 3092 case BuiltinType::OCLReserveID: 3093 #define SVE_TYPE(Name, Id, SingletonId) \ 3094 case BuiltinType::Id: 3095 #include "clang/Basic/AArch64SVEACLETypes.def" 3096 case BuiltinType::ShortAccum: 3097 case BuiltinType::Accum: 3098 case BuiltinType::LongAccum: 3099 case BuiltinType::UShortAccum: 3100 case BuiltinType::UAccum: 3101 case BuiltinType::ULongAccum: 3102 case BuiltinType::ShortFract: 3103 case BuiltinType::Fract: 3104 case BuiltinType::LongFract: 3105 case BuiltinType::UShortFract: 3106 case BuiltinType::UFract: 3107 case BuiltinType::ULongFract: 3108 case BuiltinType::SatShortAccum: 3109 case BuiltinType::SatAccum: 3110 case BuiltinType::SatLongAccum: 3111 case BuiltinType::SatUShortAccum: 3112 case BuiltinType::SatUAccum: 3113 case BuiltinType::SatULongAccum: 3114 case BuiltinType::SatShortFract: 3115 case BuiltinType::SatFract: 3116 case BuiltinType::SatLongFract: 3117 case BuiltinType::SatUShortFract: 3118 case BuiltinType::SatUFract: 3119 case BuiltinType::SatULongFract: 3120 case BuiltinType::BFloat16: 3121 return false; 3122 3123 case BuiltinType::Dependent: 3124 #define BUILTIN_TYPE(Id, SingletonId) 3125 #define PLACEHOLDER_TYPE(Id, SingletonId) \ 3126 case BuiltinType::Id: 3127 #include "clang/AST/BuiltinTypes.def" 3128 llvm_unreachable("asking for RRTI for a placeholder type!"); 3129 3130 case BuiltinType::ObjCId: 3131 case BuiltinType::ObjCClass: 3132 case BuiltinType::ObjCSel: 3133 llvm_unreachable("FIXME: Objective-C types are unsupported!"); 3134 } 3135 3136 llvm_unreachable("Invalid BuiltinType Kind!"); 3137 } 3138 3139 static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) { 3140 QualType PointeeTy = PointerTy->getPointeeType(); 3141 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy); 3142 if (!BuiltinTy) 3143 return false; 3144 3145 // Check the qualifiers. 3146 Qualifiers Quals = PointeeTy.getQualifiers(); 3147 Quals.removeConst(); 3148 3149 if (!Quals.empty()) 3150 return false; 3151 3152 return TypeInfoIsInStandardLibrary(BuiltinTy); 3153 } 3154 3155 /// IsStandardLibraryRTTIDescriptor - Returns whether the type 3156 /// information for the given type exists in the standard library. 3157 static bool IsStandardLibraryRTTIDescriptor(QualType Ty) { 3158 // Type info for builtin types is defined in the standard library. 3159 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty)) 3160 return TypeInfoIsInStandardLibrary(BuiltinTy); 3161 3162 // Type info for some pointer types to builtin types is defined in the 3163 // standard library. 3164 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty)) 3165 return TypeInfoIsInStandardLibrary(PointerTy); 3166 3167 return false; 3168 } 3169 3170 /// ShouldUseExternalRTTIDescriptor - Returns whether the type information for 3171 /// the given type exists somewhere else, and that we should not emit the type 3172 /// information in this translation unit. Assumes that it is not a 3173 /// standard-library type. 3174 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM, 3175 QualType Ty) { 3176 ASTContext &Context = CGM.getContext(); 3177 3178 // If RTTI is disabled, assume it might be disabled in the 3179 // translation unit that defines any potential key function, too. 3180 if (!Context.getLangOpts().RTTI) return false; 3181 3182 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { 3183 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl()); 3184 if (!RD->hasDefinition()) 3185 return false; 3186 3187 if (!RD->isDynamicClass()) 3188 return false; 3189 3190 // FIXME: this may need to be reconsidered if the key function 3191 // changes. 3192 // N.B. We must always emit the RTTI data ourselves if there exists a key 3193 // function. 3194 bool IsDLLImport = RD->hasAttr<DLLImportAttr>(); 3195 3196 // Don't import the RTTI but emit it locally. 3197 if (CGM.getTriple().isWindowsGNUEnvironment()) 3198 return false; 3199 3200 if (CGM.getVTables().isVTableExternal(RD)) 3201 return IsDLLImport && !CGM.getTriple().isWindowsItaniumEnvironment() 3202 ? false 3203 : true; 3204 3205 if (IsDLLImport) 3206 return true; 3207 } 3208 3209 return false; 3210 } 3211 3212 /// IsIncompleteClassType - Returns whether the given record type is incomplete. 3213 static bool IsIncompleteClassType(const RecordType *RecordTy) { 3214 return !RecordTy->getDecl()->isCompleteDefinition(); 3215 } 3216 3217 /// ContainsIncompleteClassType - Returns whether the given type contains an 3218 /// incomplete class type. This is true if 3219 /// 3220 /// * The given type is an incomplete class type. 3221 /// * The given type is a pointer type whose pointee type contains an 3222 /// incomplete class type. 3223 /// * The given type is a member pointer type whose class is an incomplete 3224 /// class type. 3225 /// * The given type is a member pointer type whoise pointee type contains an 3226 /// incomplete class type. 3227 /// is an indirect or direct pointer to an incomplete class type. 3228 static bool ContainsIncompleteClassType(QualType Ty) { 3229 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { 3230 if (IsIncompleteClassType(RecordTy)) 3231 return true; 3232 } 3233 3234 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty)) 3235 return ContainsIncompleteClassType(PointerTy->getPointeeType()); 3236 3237 if (const MemberPointerType *MemberPointerTy = 3238 dyn_cast<MemberPointerType>(Ty)) { 3239 // Check if the class type is incomplete. 3240 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass()); 3241 if (IsIncompleteClassType(ClassType)) 3242 return true; 3243 3244 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType()); 3245 } 3246 3247 return false; 3248 } 3249 3250 // CanUseSingleInheritance - Return whether the given record decl has a "single, 3251 // public, non-virtual base at offset zero (i.e. the derived class is dynamic 3252 // iff the base is)", according to Itanium C++ ABI, 2.95p6b. 3253 static bool CanUseSingleInheritance(const CXXRecordDecl *RD) { 3254 // Check the number of bases. 3255 if (RD->getNumBases() != 1) 3256 return false; 3257 3258 // Get the base. 3259 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(); 3260 3261 // Check that the base is not virtual. 3262 if (Base->isVirtual()) 3263 return false; 3264 3265 // Check that the base is public. 3266 if (Base->getAccessSpecifier() != AS_public) 3267 return false; 3268 3269 // Check that the class is dynamic iff the base is. 3270 auto *BaseDecl = 3271 cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl()); 3272 if (!BaseDecl->isEmpty() && 3273 BaseDecl->isDynamicClass() != RD->isDynamicClass()) 3274 return false; 3275 3276 return true; 3277 } 3278 3279 void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) { 3280 // abi::__class_type_info. 3281 static const char * const ClassTypeInfo = 3282 "_ZTVN10__cxxabiv117__class_type_infoE"; 3283 // abi::__si_class_type_info. 3284 static const char * const SIClassTypeInfo = 3285 "_ZTVN10__cxxabiv120__si_class_type_infoE"; 3286 // abi::__vmi_class_type_info. 3287 static const char * const VMIClassTypeInfo = 3288 "_ZTVN10__cxxabiv121__vmi_class_type_infoE"; 3289 3290 const char *VTableName = nullptr; 3291 3292 switch (Ty->getTypeClass()) { 3293 #define TYPE(Class, Base) 3294 #define ABSTRACT_TYPE(Class, Base) 3295 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 3296 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 3297 #define DEPENDENT_TYPE(Class, Base) case Type::Class: 3298 #include "clang/AST/TypeNodes.inc" 3299 llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 3300 3301 case Type::LValueReference: 3302 case Type::RValueReference: 3303 llvm_unreachable("References shouldn't get here"); 3304 3305 case Type::Auto: 3306 case Type::DeducedTemplateSpecialization: 3307 llvm_unreachable("Undeduced type shouldn't get here"); 3308 3309 case Type::Pipe: 3310 llvm_unreachable("Pipe types shouldn't get here"); 3311 3312 case Type::Builtin: 3313 case Type::ExtInt: 3314 // GCC treats vector and complex types as fundamental types. 3315 case Type::Vector: 3316 case Type::ExtVector: 3317 case Type::ConstantMatrix: 3318 case Type::Complex: 3319 case Type::Atomic: 3320 // FIXME: GCC treats block pointers as fundamental types?! 3321 case Type::BlockPointer: 3322 // abi::__fundamental_type_info. 3323 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE"; 3324 break; 3325 3326 case Type::ConstantArray: 3327 case Type::IncompleteArray: 3328 case Type::VariableArray: 3329 // abi::__array_type_info. 3330 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE"; 3331 break; 3332 3333 case Type::FunctionNoProto: 3334 case Type::FunctionProto: 3335 // abi::__function_type_info. 3336 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE"; 3337 break; 3338 3339 case Type::Enum: 3340 // abi::__enum_type_info. 3341 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE"; 3342 break; 3343 3344 case Type::Record: { 3345 const CXXRecordDecl *RD = 3346 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl()); 3347 3348 if (!RD->hasDefinition() || !RD->getNumBases()) { 3349 VTableName = ClassTypeInfo; 3350 } else if (CanUseSingleInheritance(RD)) { 3351 VTableName = SIClassTypeInfo; 3352 } else { 3353 VTableName = VMIClassTypeInfo; 3354 } 3355 3356 break; 3357 } 3358 3359 case Type::ObjCObject: 3360 // Ignore protocol qualifiers. 3361 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr(); 3362 3363 // Handle id and Class. 3364 if (isa<BuiltinType>(Ty)) { 3365 VTableName = ClassTypeInfo; 3366 break; 3367 } 3368 3369 assert(isa<ObjCInterfaceType>(Ty)); 3370 LLVM_FALLTHROUGH; 3371 3372 case Type::ObjCInterface: 3373 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) { 3374 VTableName = SIClassTypeInfo; 3375 } else { 3376 VTableName = ClassTypeInfo; 3377 } 3378 break; 3379 3380 case Type::ObjCObjectPointer: 3381 case Type::Pointer: 3382 // abi::__pointer_type_info. 3383 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE"; 3384 break; 3385 3386 case Type::MemberPointer: 3387 // abi::__pointer_to_member_type_info. 3388 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE"; 3389 break; 3390 } 3391 3392 llvm::Constant *VTable = nullptr; 3393 3394 // Check if the alias exists. If it doesn't, then get or create the global. 3395 if (CGM.getItaniumVTableContext().isRelativeLayout()) 3396 VTable = CGM.getModule().getNamedAlias(VTableName); 3397 if (!VTable) 3398 VTable = CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy); 3399 3400 CGM.setDSOLocal(cast<llvm::GlobalValue>(VTable->stripPointerCasts())); 3401 3402 llvm::Type *PtrDiffTy = 3403 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType()); 3404 3405 // The vtable address point is 2. 3406 if (CGM.getItaniumVTableContext().isRelativeLayout()) { 3407 // The vtable address point is 8 bytes after its start: 3408 // 4 for the offset to top + 4 for the relative offset to rtti. 3409 llvm::Constant *Eight = llvm::ConstantInt::get(CGM.Int32Ty, 8); 3410 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy); 3411 VTable = 3412 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8Ty, VTable, Eight); 3413 } else { 3414 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2); 3415 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, 3416 Two); 3417 } 3418 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy); 3419 3420 Fields.push_back(VTable); 3421 } 3422 3423 /// Return the linkage that the type info and type info name constants 3424 /// should have for the given type. 3425 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM, 3426 QualType Ty) { 3427 // Itanium C++ ABI 2.9.5p7: 3428 // In addition, it and all of the intermediate abi::__pointer_type_info 3429 // structs in the chain down to the abi::__class_type_info for the 3430 // incomplete class type must be prevented from resolving to the 3431 // corresponding type_info structs for the complete class type, possibly 3432 // by making them local static objects. Finally, a dummy class RTTI is 3433 // generated for the incomplete type that will not resolve to the final 3434 // complete class RTTI (because the latter need not exist), possibly by 3435 // making it a local static object. 3436 if (ContainsIncompleteClassType(Ty)) 3437 return llvm::GlobalValue::InternalLinkage; 3438 3439 switch (Ty->getLinkage()) { 3440 case NoLinkage: 3441 case InternalLinkage: 3442 case UniqueExternalLinkage: 3443 return llvm::GlobalValue::InternalLinkage; 3444 3445 case VisibleNoLinkage: 3446 case ModuleInternalLinkage: 3447 case ModuleLinkage: 3448 case ExternalLinkage: 3449 // RTTI is not enabled, which means that this type info struct is going 3450 // to be used for exception handling. Give it linkonce_odr linkage. 3451 if (!CGM.getLangOpts().RTTI) 3452 return llvm::GlobalValue::LinkOnceODRLinkage; 3453 3454 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) { 3455 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl()); 3456 if (RD->hasAttr<WeakAttr>()) 3457 return llvm::GlobalValue::WeakODRLinkage; 3458 if (CGM.getTriple().isWindowsItaniumEnvironment()) 3459 if (RD->hasAttr<DLLImportAttr>() && 3460 ShouldUseExternalRTTIDescriptor(CGM, Ty)) 3461 return llvm::GlobalValue::ExternalLinkage; 3462 // MinGW always uses LinkOnceODRLinkage for type info. 3463 if (RD->isDynamicClass() && 3464 !CGM.getContext() 3465 .getTargetInfo() 3466 .getTriple() 3467 .isWindowsGNUEnvironment()) 3468 return CGM.getVTableLinkage(RD); 3469 } 3470 3471 return llvm::GlobalValue::LinkOnceODRLinkage; 3472 } 3473 3474 llvm_unreachable("Invalid linkage!"); 3475 } 3476 3477 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) { 3478 // We want to operate on the canonical type. 3479 Ty = Ty.getCanonicalType(); 3480 3481 // Check if we've already emitted an RTTI descriptor for this type. 3482 SmallString<256> Name; 3483 llvm::raw_svector_ostream Out(Name); 3484 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); 3485 3486 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name); 3487 if (OldGV && !OldGV->isDeclaration()) { 3488 assert(!OldGV->hasAvailableExternallyLinkage() && 3489 "available_externally typeinfos not yet implemented"); 3490 3491 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy); 3492 } 3493 3494 // Check if there is already an external RTTI descriptor for this type. 3495 if (IsStandardLibraryRTTIDescriptor(Ty) || 3496 ShouldUseExternalRTTIDescriptor(CGM, Ty)) 3497 return GetAddrOfExternalRTTIDescriptor(Ty); 3498 3499 // Emit the standard library with external linkage. 3500 llvm::GlobalVariable::LinkageTypes Linkage = getTypeInfoLinkage(CGM, Ty); 3501 3502 // Give the type_info object and name the formal visibility of the 3503 // type itself. 3504 llvm::GlobalValue::VisibilityTypes llvmVisibility; 3505 if (llvm::GlobalValue::isLocalLinkage(Linkage)) 3506 // If the linkage is local, only default visibility makes sense. 3507 llvmVisibility = llvm::GlobalValue::DefaultVisibility; 3508 else if (CXXABI.classifyRTTIUniqueness(Ty, Linkage) == 3509 ItaniumCXXABI::RUK_NonUniqueHidden) 3510 llvmVisibility = llvm::GlobalValue::HiddenVisibility; 3511 else 3512 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility()); 3513 3514 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass = 3515 llvm::GlobalValue::DefaultStorageClass; 3516 if (CGM.getTriple().isWindowsItaniumEnvironment()) { 3517 auto RD = Ty->getAsCXXRecordDecl(); 3518 if (RD && RD->hasAttr<DLLExportAttr>()) 3519 DLLStorageClass = llvm::GlobalValue::DLLExportStorageClass; 3520 } 3521 3522 return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass); 3523 } 3524 3525 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( 3526 QualType Ty, 3527 llvm::GlobalVariable::LinkageTypes Linkage, 3528 llvm::GlobalValue::VisibilityTypes Visibility, 3529 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) { 3530 // Add the vtable pointer. 3531 BuildVTablePointer(cast<Type>(Ty)); 3532 3533 // And the name. 3534 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage); 3535 llvm::Constant *TypeNameField; 3536 3537 // If we're supposed to demote the visibility, be sure to set a flag 3538 // to use a string comparison for type_info comparisons. 3539 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness = 3540 CXXABI.classifyRTTIUniqueness(Ty, Linkage); 3541 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) { 3542 // The flag is the sign bit, which on ARM64 is defined to be clear 3543 // for global pointers. This is very ARM64-specific. 3544 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty); 3545 llvm::Constant *flag = 3546 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63); 3547 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag); 3548 TypeNameField = 3549 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy); 3550 } else { 3551 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy); 3552 } 3553 Fields.push_back(TypeNameField); 3554 3555 switch (Ty->getTypeClass()) { 3556 #define TYPE(Class, Base) 3557 #define ABSTRACT_TYPE(Class, Base) 3558 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 3559 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 3560 #define DEPENDENT_TYPE(Class, Base) case Type::Class: 3561 #include "clang/AST/TypeNodes.inc" 3562 llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 3563 3564 // GCC treats vector types as fundamental types. 3565 case Type::Builtin: 3566 case Type::Vector: 3567 case Type::ExtVector: 3568 case Type::ConstantMatrix: 3569 case Type::Complex: 3570 case Type::BlockPointer: 3571 // Itanium C++ ABI 2.9.5p4: 3572 // abi::__fundamental_type_info adds no data members to std::type_info. 3573 break; 3574 3575 case Type::LValueReference: 3576 case Type::RValueReference: 3577 llvm_unreachable("References shouldn't get here"); 3578 3579 case Type::Auto: 3580 case Type::DeducedTemplateSpecialization: 3581 llvm_unreachable("Undeduced type shouldn't get here"); 3582 3583 case Type::Pipe: 3584 break; 3585 3586 case Type::ExtInt: 3587 break; 3588 3589 case Type::ConstantArray: 3590 case Type::IncompleteArray: 3591 case Type::VariableArray: 3592 // Itanium C++ ABI 2.9.5p5: 3593 // abi::__array_type_info adds no data members to std::type_info. 3594 break; 3595 3596 case Type::FunctionNoProto: 3597 case Type::FunctionProto: 3598 // Itanium C++ ABI 2.9.5p5: 3599 // abi::__function_type_info adds no data members to std::type_info. 3600 break; 3601 3602 case Type::Enum: 3603 // Itanium C++ ABI 2.9.5p5: 3604 // abi::__enum_type_info adds no data members to std::type_info. 3605 break; 3606 3607 case Type::Record: { 3608 const CXXRecordDecl *RD = 3609 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl()); 3610 if (!RD->hasDefinition() || !RD->getNumBases()) { 3611 // We don't need to emit any fields. 3612 break; 3613 } 3614 3615 if (CanUseSingleInheritance(RD)) 3616 BuildSIClassTypeInfo(RD); 3617 else 3618 BuildVMIClassTypeInfo(RD); 3619 3620 break; 3621 } 3622 3623 case Type::ObjCObject: 3624 case Type::ObjCInterface: 3625 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty)); 3626 break; 3627 3628 case Type::ObjCObjectPointer: 3629 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType()); 3630 break; 3631 3632 case Type::Pointer: 3633 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType()); 3634 break; 3635 3636 case Type::MemberPointer: 3637 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty)); 3638 break; 3639 3640 case Type::Atomic: 3641 // No fields, at least for the moment. 3642 break; 3643 } 3644 3645 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields); 3646 3647 SmallString<256> Name; 3648 llvm::raw_svector_ostream Out(Name); 3649 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); 3650 llvm::Module &M = CGM.getModule(); 3651 llvm::GlobalVariable *OldGV = M.getNamedGlobal(Name); 3652 llvm::GlobalVariable *GV = 3653 new llvm::GlobalVariable(M, Init->getType(), 3654 /*isConstant=*/true, Linkage, Init, Name); 3655 3656 // If there's already an old global variable, replace it with the new one. 3657 if (OldGV) { 3658 GV->takeName(OldGV); 3659 llvm::Constant *NewPtr = 3660 llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 3661 OldGV->replaceAllUsesWith(NewPtr); 3662 OldGV->eraseFromParent(); 3663 } 3664 3665 if (CGM.supportsCOMDAT() && GV->isWeakForLinker()) 3666 GV->setComdat(M.getOrInsertComdat(GV->getName())); 3667 3668 CharUnits Align = 3669 CGM.getContext().toCharUnitsFromBits(CGM.getTarget().getPointerAlign(0)); 3670 GV->setAlignment(Align.getAsAlign()); 3671 3672 // The Itanium ABI specifies that type_info objects must be globally 3673 // unique, with one exception: if the type is an incomplete class 3674 // type or a (possibly indirect) pointer to one. That exception 3675 // affects the general case of comparing type_info objects produced 3676 // by the typeid operator, which is why the comparison operators on 3677 // std::type_info generally use the type_info name pointers instead 3678 // of the object addresses. However, the language's built-in uses 3679 // of RTTI generally require class types to be complete, even when 3680 // manipulating pointers to those class types. This allows the 3681 // implementation of dynamic_cast to rely on address equality tests, 3682 // which is much faster. 3683 3684 // All of this is to say that it's important that both the type_info 3685 // object and the type_info name be uniqued when weakly emitted. 3686 3687 TypeName->setVisibility(Visibility); 3688 CGM.setDSOLocal(TypeName); 3689 3690 GV->setVisibility(Visibility); 3691 CGM.setDSOLocal(GV); 3692 3693 TypeName->setDLLStorageClass(DLLStorageClass); 3694 GV->setDLLStorageClass(DLLStorageClass); 3695 3696 TypeName->setPartition(CGM.getCodeGenOpts().SymbolPartition); 3697 GV->setPartition(CGM.getCodeGenOpts().SymbolPartition); 3698 3699 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); 3700 } 3701 3702 /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info 3703 /// for the given Objective-C object type. 3704 void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) { 3705 // Drop qualifiers. 3706 const Type *T = OT->getBaseType().getTypePtr(); 3707 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T)); 3708 3709 // The builtin types are abi::__class_type_infos and don't require 3710 // extra fields. 3711 if (isa<BuiltinType>(T)) return; 3712 3713 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl(); 3714 ObjCInterfaceDecl *Super = Class->getSuperClass(); 3715 3716 // Root classes are also __class_type_info. 3717 if (!Super) return; 3718 3719 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super); 3720 3721 // Everything else is single inheritance. 3722 llvm::Constant *BaseTypeInfo = 3723 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy); 3724 Fields.push_back(BaseTypeInfo); 3725 } 3726 3727 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single 3728 /// inheritance, according to the Itanium C++ ABI, 2.95p6b. 3729 void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) { 3730 // Itanium C++ ABI 2.9.5p6b: 3731 // It adds to abi::__class_type_info a single member pointing to the 3732 // type_info structure for the base type, 3733 llvm::Constant *BaseTypeInfo = 3734 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType()); 3735 Fields.push_back(BaseTypeInfo); 3736 } 3737 3738 namespace { 3739 /// SeenBases - Contains virtual and non-virtual bases seen when traversing 3740 /// a class hierarchy. 3741 struct SeenBases { 3742 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases; 3743 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases; 3744 }; 3745 } 3746 3747 /// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in 3748 /// abi::__vmi_class_type_info. 3749 /// 3750 static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base, 3751 SeenBases &Bases) { 3752 3753 unsigned Flags = 0; 3754 3755 auto *BaseDecl = 3756 cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl()); 3757 3758 if (Base->isVirtual()) { 3759 // Mark the virtual base as seen. 3760 if (!Bases.VirtualBases.insert(BaseDecl).second) { 3761 // If this virtual base has been seen before, then the class is diamond 3762 // shaped. 3763 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped; 3764 } else { 3765 if (Bases.NonVirtualBases.count(BaseDecl)) 3766 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat; 3767 } 3768 } else { 3769 // Mark the non-virtual base as seen. 3770 if (!Bases.NonVirtualBases.insert(BaseDecl).second) { 3771 // If this non-virtual base has been seen before, then the class has non- 3772 // diamond shaped repeated inheritance. 3773 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat; 3774 } else { 3775 if (Bases.VirtualBases.count(BaseDecl)) 3776 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat; 3777 } 3778 } 3779 3780 // Walk all bases. 3781 for (const auto &I : BaseDecl->bases()) 3782 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); 3783 3784 return Flags; 3785 } 3786 3787 static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) { 3788 unsigned Flags = 0; 3789 SeenBases Bases; 3790 3791 // Walk all bases. 3792 for (const auto &I : RD->bases()) 3793 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); 3794 3795 return Flags; 3796 } 3797 3798 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for 3799 /// classes with bases that do not satisfy the abi::__si_class_type_info 3800 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c. 3801 void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { 3802 llvm::Type *UnsignedIntLTy = 3803 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 3804 3805 // Itanium C++ ABI 2.9.5p6c: 3806 // __flags is a word with flags describing details about the class 3807 // structure, which may be referenced by using the __flags_masks 3808 // enumeration. These flags refer to both direct and indirect bases. 3809 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD); 3810 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 3811 3812 // Itanium C++ ABI 2.9.5p6c: 3813 // __base_count is a word with the number of direct proper base class 3814 // descriptions that follow. 3815 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases())); 3816 3817 if (!RD->getNumBases()) 3818 return; 3819 3820 // Now add the base class descriptions. 3821 3822 // Itanium C++ ABI 2.9.5p6c: 3823 // __base_info[] is an array of base class descriptions -- one for every 3824 // direct proper base. Each description is of the type: 3825 // 3826 // struct abi::__base_class_type_info { 3827 // public: 3828 // const __class_type_info *__base_type; 3829 // long __offset_flags; 3830 // 3831 // enum __offset_flags_masks { 3832 // __virtual_mask = 0x1, 3833 // __public_mask = 0x2, 3834 // __offset_shift = 8 3835 // }; 3836 // }; 3837 3838 // If we're in mingw and 'long' isn't wide enough for a pointer, use 'long 3839 // long' instead of 'long' for __offset_flags. libstdc++abi uses long long on 3840 // LLP64 platforms. 3841 // FIXME: Consider updating libc++abi to match, and extend this logic to all 3842 // LLP64 platforms. 3843 QualType OffsetFlagsTy = CGM.getContext().LongTy; 3844 const TargetInfo &TI = CGM.getContext().getTargetInfo(); 3845 if (TI.getTriple().isOSCygMing() && TI.getPointerWidth(0) > TI.getLongWidth()) 3846 OffsetFlagsTy = CGM.getContext().LongLongTy; 3847 llvm::Type *OffsetFlagsLTy = 3848 CGM.getTypes().ConvertType(OffsetFlagsTy); 3849 3850 for (const auto &Base : RD->bases()) { 3851 // The __base_type member points to the RTTI for the base type. 3852 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType())); 3853 3854 auto *BaseDecl = 3855 cast<CXXRecordDecl>(Base.getType()->castAs<RecordType>()->getDecl()); 3856 3857 int64_t OffsetFlags = 0; 3858 3859 // All but the lower 8 bits of __offset_flags are a signed offset. 3860 // For a non-virtual base, this is the offset in the object of the base 3861 // subobject. For a virtual base, this is the offset in the virtual table of 3862 // the virtual base offset for the virtual base referenced (negative). 3863 CharUnits Offset; 3864 if (Base.isVirtual()) 3865 Offset = 3866 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl); 3867 else { 3868 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); 3869 Offset = Layout.getBaseClassOffset(BaseDecl); 3870 }; 3871 3872 OffsetFlags = uint64_t(Offset.getQuantity()) << 8; 3873 3874 // The low-order byte of __offset_flags contains flags, as given by the 3875 // masks from the enumeration __offset_flags_masks. 3876 if (Base.isVirtual()) 3877 OffsetFlags |= BCTI_Virtual; 3878 if (Base.getAccessSpecifier() == AS_public) 3879 OffsetFlags |= BCTI_Public; 3880 3881 Fields.push_back(llvm::ConstantInt::get(OffsetFlagsLTy, OffsetFlags)); 3882 } 3883 } 3884 3885 /// Compute the flags for a __pbase_type_info, and remove the corresponding 3886 /// pieces from \p Type. 3887 static unsigned extractPBaseFlags(ASTContext &Ctx, QualType &Type) { 3888 unsigned Flags = 0; 3889 3890 if (Type.isConstQualified()) 3891 Flags |= ItaniumRTTIBuilder::PTI_Const; 3892 if (Type.isVolatileQualified()) 3893 Flags |= ItaniumRTTIBuilder::PTI_Volatile; 3894 if (Type.isRestrictQualified()) 3895 Flags |= ItaniumRTTIBuilder::PTI_Restrict; 3896 Type = Type.getUnqualifiedType(); 3897 3898 // Itanium C++ ABI 2.9.5p7: 3899 // When the abi::__pbase_type_info is for a direct or indirect pointer to an 3900 // incomplete class type, the incomplete target type flag is set. 3901 if (ContainsIncompleteClassType(Type)) 3902 Flags |= ItaniumRTTIBuilder::PTI_Incomplete; 3903 3904 if (auto *Proto = Type->getAs<FunctionProtoType>()) { 3905 if (Proto->isNothrow()) { 3906 Flags |= ItaniumRTTIBuilder::PTI_Noexcept; 3907 Type = Ctx.getFunctionTypeWithExceptionSpec(Type, EST_None); 3908 } 3909 } 3910 3911 return Flags; 3912 } 3913 3914 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, 3915 /// used for pointer types. 3916 void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) { 3917 // Itanium C++ ABI 2.9.5p7: 3918 // __flags is a flag word describing the cv-qualification and other 3919 // attributes of the type pointed to 3920 unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy); 3921 3922 llvm::Type *UnsignedIntLTy = 3923 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 3924 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 3925 3926 // Itanium C++ ABI 2.9.5p7: 3927 // __pointee is a pointer to the std::type_info derivation for the 3928 // unqualified type being pointed to. 3929 llvm::Constant *PointeeTypeInfo = 3930 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(PointeeTy); 3931 Fields.push_back(PointeeTypeInfo); 3932 } 3933 3934 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info 3935 /// struct, used for member pointer types. 3936 void 3937 ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) { 3938 QualType PointeeTy = Ty->getPointeeType(); 3939 3940 // Itanium C++ ABI 2.9.5p7: 3941 // __flags is a flag word describing the cv-qualification and other 3942 // attributes of the type pointed to. 3943 unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy); 3944 3945 const RecordType *ClassType = cast<RecordType>(Ty->getClass()); 3946 if (IsIncompleteClassType(ClassType)) 3947 Flags |= PTI_ContainingClassIncomplete; 3948 3949 llvm::Type *UnsignedIntLTy = 3950 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 3951 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 3952 3953 // Itanium C++ ABI 2.9.5p7: 3954 // __pointee is a pointer to the std::type_info derivation for the 3955 // unqualified type being pointed to. 3956 llvm::Constant *PointeeTypeInfo = 3957 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(PointeeTy); 3958 Fields.push_back(PointeeTypeInfo); 3959 3960 // Itanium C++ ABI 2.9.5p9: 3961 // __context is a pointer to an abi::__class_type_info corresponding to the 3962 // class type containing the member pointed to 3963 // (e.g., the "A" in "int A::*"). 3964 Fields.push_back( 3965 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0))); 3966 } 3967 3968 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) { 3969 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty); 3970 } 3971 3972 void ItaniumCXXABI::EmitFundamentalRTTIDescriptors(const CXXRecordDecl *RD) { 3973 // Types added here must also be added to TypeInfoIsInStandardLibrary. 3974 QualType FundamentalTypes[] = { 3975 getContext().VoidTy, getContext().NullPtrTy, 3976 getContext().BoolTy, getContext().WCharTy, 3977 getContext().CharTy, getContext().UnsignedCharTy, 3978 getContext().SignedCharTy, getContext().ShortTy, 3979 getContext().UnsignedShortTy, getContext().IntTy, 3980 getContext().UnsignedIntTy, getContext().LongTy, 3981 getContext().UnsignedLongTy, getContext().LongLongTy, 3982 getContext().UnsignedLongLongTy, getContext().Int128Ty, 3983 getContext().UnsignedInt128Ty, getContext().HalfTy, 3984 getContext().FloatTy, getContext().DoubleTy, 3985 getContext().LongDoubleTy, getContext().Float128Ty, 3986 getContext().Char8Ty, getContext().Char16Ty, 3987 getContext().Char32Ty 3988 }; 3989 llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass = 3990 RD->hasAttr<DLLExportAttr>() 3991 ? llvm::GlobalValue::DLLExportStorageClass 3992 : llvm::GlobalValue::DefaultStorageClass; 3993 llvm::GlobalValue::VisibilityTypes Visibility = 3994 CodeGenModule::GetLLVMVisibility(RD->getVisibility()); 3995 for (const QualType &FundamentalType : FundamentalTypes) { 3996 QualType PointerType = getContext().getPointerType(FundamentalType); 3997 QualType PointerTypeConst = getContext().getPointerType( 3998 FundamentalType.withConst()); 3999 for (QualType Type : {FundamentalType, PointerType, PointerTypeConst}) 4000 ItaniumRTTIBuilder(*this).BuildTypeInfo( 4001 Type, llvm::GlobalValue::ExternalLinkage, 4002 Visibility, DLLStorageClass); 4003 } 4004 } 4005 4006 /// What sort of uniqueness rules should we use for the RTTI for the 4007 /// given type? 4008 ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness( 4009 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const { 4010 if (shouldRTTIBeUnique()) 4011 return RUK_Unique; 4012 4013 // It's only necessary for linkonce_odr or weak_odr linkage. 4014 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage && 4015 Linkage != llvm::GlobalValue::WeakODRLinkage) 4016 return RUK_Unique; 4017 4018 // It's only necessary with default visibility. 4019 if (CanTy->getVisibility() != DefaultVisibility) 4020 return RUK_Unique; 4021 4022 // If we're not required to publish this symbol, hide it. 4023 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage) 4024 return RUK_NonUniqueHidden; 4025 4026 // If we're required to publish this symbol, as we might be under an 4027 // explicit instantiation, leave it with default visibility but 4028 // enable string-comparisons. 4029 assert(Linkage == llvm::GlobalValue::WeakODRLinkage); 4030 return RUK_NonUniqueVisible; 4031 } 4032 4033 // Find out how to codegen the complete destructor and constructor 4034 namespace { 4035 enum class StructorCodegen { Emit, RAUW, Alias, COMDAT }; 4036 } 4037 static StructorCodegen getCodegenToUse(CodeGenModule &CGM, 4038 const CXXMethodDecl *MD) { 4039 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases) 4040 return StructorCodegen::Emit; 4041 4042 // The complete and base structors are not equivalent if there are any virtual 4043 // bases, so emit separate functions. 4044 if (MD->getParent()->getNumVBases()) 4045 return StructorCodegen::Emit; 4046 4047 GlobalDecl AliasDecl; 4048 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) { 4049 AliasDecl = GlobalDecl(DD, Dtor_Complete); 4050 } else { 4051 const auto *CD = cast<CXXConstructorDecl>(MD); 4052 AliasDecl = GlobalDecl(CD, Ctor_Complete); 4053 } 4054 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl); 4055 4056 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage)) 4057 return StructorCodegen::RAUW; 4058 4059 // FIXME: Should we allow available_externally aliases? 4060 if (!llvm::GlobalAlias::isValidLinkage(Linkage)) 4061 return StructorCodegen::RAUW; 4062 4063 if (llvm::GlobalValue::isWeakForLinker(Linkage)) { 4064 // Only ELF and wasm support COMDATs with arbitrary names (C5/D5). 4065 if (CGM.getTarget().getTriple().isOSBinFormatELF() || 4066 CGM.getTarget().getTriple().isOSBinFormatWasm()) 4067 return StructorCodegen::COMDAT; 4068 return StructorCodegen::Emit; 4069 } 4070 4071 return StructorCodegen::Alias; 4072 } 4073 4074 static void emitConstructorDestructorAlias(CodeGenModule &CGM, 4075 GlobalDecl AliasDecl, 4076 GlobalDecl TargetDecl) { 4077 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl); 4078 4079 StringRef MangledName = CGM.getMangledName(AliasDecl); 4080 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName); 4081 if (Entry && !Entry->isDeclaration()) 4082 return; 4083 4084 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl)); 4085 4086 // Create the alias with no name. 4087 auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee); 4088 4089 // Constructors and destructors are always unnamed_addr. 4090 Alias->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); 4091 4092 // Switch any previous uses to the alias. 4093 if (Entry) { 4094 assert(Entry->getType() == Aliasee->getType() && 4095 "declaration exists with different type"); 4096 Alias->takeName(Entry); 4097 Entry->replaceAllUsesWith(Alias); 4098 Entry->eraseFromParent(); 4099 } else { 4100 Alias->setName(MangledName); 4101 } 4102 4103 // Finally, set up the alias with its proper name and attributes. 4104 CGM.SetCommonAttributes(AliasDecl, Alias); 4105 } 4106 4107 void ItaniumCXXABI::emitCXXStructor(GlobalDecl GD) { 4108 auto *MD = cast<CXXMethodDecl>(GD.getDecl()); 4109 auto *CD = dyn_cast<CXXConstructorDecl>(MD); 4110 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD); 4111 4112 StructorCodegen CGType = getCodegenToUse(CGM, MD); 4113 4114 if (CD ? GD.getCtorType() == Ctor_Complete 4115 : GD.getDtorType() == Dtor_Complete) { 4116 GlobalDecl BaseDecl; 4117 if (CD) 4118 BaseDecl = GD.getWithCtorType(Ctor_Base); 4119 else 4120 BaseDecl = GD.getWithDtorType(Dtor_Base); 4121 4122 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) { 4123 emitConstructorDestructorAlias(CGM, GD, BaseDecl); 4124 return; 4125 } 4126 4127 if (CGType == StructorCodegen::RAUW) { 4128 StringRef MangledName = CGM.getMangledName(GD); 4129 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl); 4130 CGM.addReplacement(MangledName, Aliasee); 4131 return; 4132 } 4133 } 4134 4135 // The base destructor is equivalent to the base destructor of its 4136 // base class if there is exactly one non-virtual base class with a 4137 // non-trivial destructor, there are no fields with a non-trivial 4138 // destructor, and the body of the destructor is trivial. 4139 if (DD && GD.getDtorType() == Dtor_Base && 4140 CGType != StructorCodegen::COMDAT && 4141 !CGM.TryEmitBaseDestructorAsAlias(DD)) 4142 return; 4143 4144 // FIXME: The deleting destructor is equivalent to the selected operator 4145 // delete if: 4146 // * either the delete is a destroying operator delete or the destructor 4147 // would be trivial if it weren't virtual, 4148 // * the conversion from the 'this' parameter to the first parameter of the 4149 // destructor is equivalent to a bitcast, 4150 // * the destructor does not have an implicit "this" return, and 4151 // * the operator delete has the same calling convention and IR function type 4152 // as the destructor. 4153 // In such cases we should try to emit the deleting dtor as an alias to the 4154 // selected 'operator delete'. 4155 4156 llvm::Function *Fn = CGM.codegenCXXStructor(GD); 4157 4158 if (CGType == StructorCodegen::COMDAT) { 4159 SmallString<256> Buffer; 4160 llvm::raw_svector_ostream Out(Buffer); 4161 if (DD) 4162 getMangleContext().mangleCXXDtorComdat(DD, Out); 4163 else 4164 getMangleContext().mangleCXXCtorComdat(CD, Out); 4165 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str()); 4166 Fn->setComdat(C); 4167 } else { 4168 CGM.maybeSetTrivialComdat(*MD, *Fn); 4169 } 4170 } 4171 4172 static llvm::FunctionCallee getBeginCatchFn(CodeGenModule &CGM) { 4173 // void *__cxa_begin_catch(void*); 4174 llvm::FunctionType *FTy = llvm::FunctionType::get( 4175 CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false); 4176 4177 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch"); 4178 } 4179 4180 static llvm::FunctionCallee getEndCatchFn(CodeGenModule &CGM) { 4181 // void __cxa_end_catch(); 4182 llvm::FunctionType *FTy = 4183 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false); 4184 4185 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch"); 4186 } 4187 4188 static llvm::FunctionCallee getGetExceptionPtrFn(CodeGenModule &CGM) { 4189 // void *__cxa_get_exception_ptr(void*); 4190 llvm::FunctionType *FTy = llvm::FunctionType::get( 4191 CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false); 4192 4193 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr"); 4194 } 4195 4196 namespace { 4197 /// A cleanup to call __cxa_end_catch. In many cases, the caught 4198 /// exception type lets us state definitively that the thrown exception 4199 /// type does not have a destructor. In particular: 4200 /// - Catch-alls tell us nothing, so we have to conservatively 4201 /// assume that the thrown exception might have a destructor. 4202 /// - Catches by reference behave according to their base types. 4203 /// - Catches of non-record types will only trigger for exceptions 4204 /// of non-record types, which never have destructors. 4205 /// - Catches of record types can trigger for arbitrary subclasses 4206 /// of the caught type, so we have to assume the actual thrown 4207 /// exception type might have a throwing destructor, even if the 4208 /// caught type's destructor is trivial or nothrow. 4209 struct CallEndCatch final : EHScopeStack::Cleanup { 4210 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {} 4211 bool MightThrow; 4212 4213 void Emit(CodeGenFunction &CGF, Flags flags) override { 4214 if (!MightThrow) { 4215 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM)); 4216 return; 4217 } 4218 4219 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM)); 4220 } 4221 }; 4222 } 4223 4224 /// Emits a call to __cxa_begin_catch and enters a cleanup to call 4225 /// __cxa_end_catch. 4226 /// 4227 /// \param EndMightThrow - true if __cxa_end_catch might throw 4228 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF, 4229 llvm::Value *Exn, 4230 bool EndMightThrow) { 4231 llvm::CallInst *call = 4232 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn); 4233 4234 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow); 4235 4236 return call; 4237 } 4238 4239 /// A "special initializer" callback for initializing a catch 4240 /// parameter during catch initialization. 4241 static void InitCatchParam(CodeGenFunction &CGF, 4242 const VarDecl &CatchParam, 4243 Address ParamAddr, 4244 SourceLocation Loc) { 4245 // Load the exception from where the landing pad saved it. 4246 llvm::Value *Exn = CGF.getExceptionFromSlot(); 4247 4248 CanQualType CatchType = 4249 CGF.CGM.getContext().getCanonicalType(CatchParam.getType()); 4250 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType); 4251 4252 // If we're catching by reference, we can just cast the object 4253 // pointer to the appropriate pointer. 4254 if (isa<ReferenceType>(CatchType)) { 4255 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType(); 4256 bool EndCatchMightThrow = CaughtType->isRecordType(); 4257 4258 // __cxa_begin_catch returns the adjusted object pointer. 4259 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow); 4260 4261 // We have no way to tell the personality function that we're 4262 // catching by reference, so if we're catching a pointer, 4263 // __cxa_begin_catch will actually return that pointer by value. 4264 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) { 4265 QualType PointeeType = PT->getPointeeType(); 4266 4267 // When catching by reference, generally we should just ignore 4268 // this by-value pointer and use the exception object instead. 4269 if (!PointeeType->isRecordType()) { 4270 4271 // Exn points to the struct _Unwind_Exception header, which 4272 // we have to skip past in order to reach the exception data. 4273 unsigned HeaderSize = 4274 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException(); 4275 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize); 4276 4277 // However, if we're catching a pointer-to-record type that won't 4278 // work, because the personality function might have adjusted 4279 // the pointer. There's actually no way for us to fully satisfy 4280 // the language/ABI contract here: we can't use Exn because it 4281 // might have the wrong adjustment, but we can't use the by-value 4282 // pointer because it's off by a level of abstraction. 4283 // 4284 // The current solution is to dump the adjusted pointer into an 4285 // alloca, which breaks language semantics (because changing the 4286 // pointer doesn't change the exception) but at least works. 4287 // The better solution would be to filter out non-exact matches 4288 // and rethrow them, but this is tricky because the rethrow 4289 // really needs to be catchable by other sites at this landing 4290 // pad. The best solution is to fix the personality function. 4291 } else { 4292 // Pull the pointer for the reference type off. 4293 llvm::Type *PtrTy = 4294 cast<llvm::PointerType>(LLVMCatchTy)->getElementType(); 4295 4296 // Create the temporary and write the adjusted pointer into it. 4297 Address ExnPtrTmp = 4298 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp"); 4299 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy); 4300 CGF.Builder.CreateStore(Casted, ExnPtrTmp); 4301 4302 // Bind the reference to the temporary. 4303 AdjustedExn = ExnPtrTmp.getPointer(); 4304 } 4305 } 4306 4307 llvm::Value *ExnCast = 4308 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref"); 4309 CGF.Builder.CreateStore(ExnCast, ParamAddr); 4310 return; 4311 } 4312 4313 // Scalars and complexes. 4314 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType); 4315 if (TEK != TEK_Aggregate) { 4316 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false); 4317 4318 // If the catch type is a pointer type, __cxa_begin_catch returns 4319 // the pointer by value. 4320 if (CatchType->hasPointerRepresentation()) { 4321 llvm::Value *CastExn = 4322 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted"); 4323 4324 switch (CatchType.getQualifiers().getObjCLifetime()) { 4325 case Qualifiers::OCL_Strong: 4326 CastExn = CGF.EmitARCRetainNonBlock(CastExn); 4327 LLVM_FALLTHROUGH; 4328 4329 case Qualifiers::OCL_None: 4330 case Qualifiers::OCL_ExplicitNone: 4331 case Qualifiers::OCL_Autoreleasing: 4332 CGF.Builder.CreateStore(CastExn, ParamAddr); 4333 return; 4334 4335 case Qualifiers::OCL_Weak: 4336 CGF.EmitARCInitWeak(ParamAddr, CastExn); 4337 return; 4338 } 4339 llvm_unreachable("bad ownership qualifier!"); 4340 } 4341 4342 // Otherwise, it returns a pointer into the exception object. 4343 4344 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok 4345 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy); 4346 4347 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType); 4348 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType); 4349 switch (TEK) { 4350 case TEK_Complex: 4351 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV, 4352 /*init*/ true); 4353 return; 4354 case TEK_Scalar: { 4355 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc); 4356 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true); 4357 return; 4358 } 4359 case TEK_Aggregate: 4360 llvm_unreachable("evaluation kind filtered out!"); 4361 } 4362 llvm_unreachable("bad evaluation kind"); 4363 } 4364 4365 assert(isa<RecordType>(CatchType) && "unexpected catch type!"); 4366 auto catchRD = CatchType->getAsCXXRecordDecl(); 4367 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD); 4368 4369 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok 4370 4371 // Check for a copy expression. If we don't have a copy expression, 4372 // that means a trivial copy is okay. 4373 const Expr *copyExpr = CatchParam.getInit(); 4374 if (!copyExpr) { 4375 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true); 4376 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), 4377 caughtExnAlignment); 4378 LValue Dest = CGF.MakeAddrLValue(ParamAddr, CatchType); 4379 LValue Src = CGF.MakeAddrLValue(adjustedExn, CatchType); 4380 CGF.EmitAggregateCopy(Dest, Src, CatchType, AggValueSlot::DoesNotOverlap); 4381 return; 4382 } 4383 4384 // We have to call __cxa_get_exception_ptr to get the adjusted 4385 // pointer before copying. 4386 llvm::CallInst *rawAdjustedExn = 4387 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn); 4388 4389 // Cast that to the appropriate type. 4390 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), 4391 caughtExnAlignment); 4392 4393 // The copy expression is defined in terms of an OpaqueValueExpr. 4394 // Find it and map it to the adjusted expression. 4395 CodeGenFunction::OpaqueValueMapping 4396 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr), 4397 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType())); 4398 4399 // Call the copy ctor in a terminate scope. 4400 CGF.EHStack.pushTerminate(); 4401 4402 // Perform the copy construction. 4403 CGF.EmitAggExpr(copyExpr, 4404 AggValueSlot::forAddr(ParamAddr, Qualifiers(), 4405 AggValueSlot::IsNotDestructed, 4406 AggValueSlot::DoesNotNeedGCBarriers, 4407 AggValueSlot::IsNotAliased, 4408 AggValueSlot::DoesNotOverlap)); 4409 4410 // Leave the terminate scope. 4411 CGF.EHStack.popTerminate(); 4412 4413 // Undo the opaque value mapping. 4414 opaque.pop(); 4415 4416 // Finally we can call __cxa_begin_catch. 4417 CallBeginCatch(CGF, Exn, true); 4418 } 4419 4420 /// Begins a catch statement by initializing the catch variable and 4421 /// calling __cxa_begin_catch. 4422 void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF, 4423 const CXXCatchStmt *S) { 4424 // We have to be very careful with the ordering of cleanups here: 4425 // C++ [except.throw]p4: 4426 // The destruction [of the exception temporary] occurs 4427 // immediately after the destruction of the object declared in 4428 // the exception-declaration in the handler. 4429 // 4430 // So the precise ordering is: 4431 // 1. Construct catch variable. 4432 // 2. __cxa_begin_catch 4433 // 3. Enter __cxa_end_catch cleanup 4434 // 4. Enter dtor cleanup 4435 // 4436 // We do this by using a slightly abnormal initialization process. 4437 // Delegation sequence: 4438 // - ExitCXXTryStmt opens a RunCleanupsScope 4439 // - EmitAutoVarAlloca creates the variable and debug info 4440 // - InitCatchParam initializes the variable from the exception 4441 // - CallBeginCatch calls __cxa_begin_catch 4442 // - CallBeginCatch enters the __cxa_end_catch cleanup 4443 // - EmitAutoVarCleanups enters the variable destructor cleanup 4444 // - EmitCXXTryStmt emits the code for the catch body 4445 // - EmitCXXTryStmt close the RunCleanupsScope 4446 4447 VarDecl *CatchParam = S->getExceptionDecl(); 4448 if (!CatchParam) { 4449 llvm::Value *Exn = CGF.getExceptionFromSlot(); 4450 CallBeginCatch(CGF, Exn, true); 4451 return; 4452 } 4453 4454 // Emit the local. 4455 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam); 4456 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getBeginLoc()); 4457 CGF.EmitAutoVarCleanups(var); 4458 } 4459 4460 /// Get or define the following function: 4461 /// void @__clang_call_terminate(i8* %exn) nounwind noreturn 4462 /// This code is used only in C++. 4463 static llvm::FunctionCallee getClangCallTerminateFn(CodeGenModule &CGM) { 4464 llvm::FunctionType *fnTy = 4465 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*isVarArg=*/false); 4466 llvm::FunctionCallee fnRef = CGM.CreateRuntimeFunction( 4467 fnTy, "__clang_call_terminate", llvm::AttributeList(), /*Local=*/true); 4468 llvm::Function *fn = 4469 cast<llvm::Function>(fnRef.getCallee()->stripPointerCasts()); 4470 if (fn->empty()) { 4471 fn->setDoesNotThrow(); 4472 fn->setDoesNotReturn(); 4473 4474 // What we really want is to massively penalize inlining without 4475 // forbidding it completely. The difference between that and 4476 // 'noinline' is negligible. 4477 fn->addFnAttr(llvm::Attribute::NoInline); 4478 4479 // Allow this function to be shared across translation units, but 4480 // we don't want it to turn into an exported symbol. 4481 fn->setLinkage(llvm::Function::LinkOnceODRLinkage); 4482 fn->setVisibility(llvm::Function::HiddenVisibility); 4483 if (CGM.supportsCOMDAT()) 4484 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName())); 4485 4486 // Set up the function. 4487 llvm::BasicBlock *entry = 4488 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn); 4489 CGBuilderTy builder(CGM, entry); 4490 4491 // Pull the exception pointer out of the parameter list. 4492 llvm::Value *exn = &*fn->arg_begin(); 4493 4494 // Call __cxa_begin_catch(exn). 4495 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn); 4496 catchCall->setDoesNotThrow(); 4497 catchCall->setCallingConv(CGM.getRuntimeCC()); 4498 4499 // Call std::terminate(). 4500 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn()); 4501 termCall->setDoesNotThrow(); 4502 termCall->setDoesNotReturn(); 4503 termCall->setCallingConv(CGM.getRuntimeCC()); 4504 4505 // std::terminate cannot return. 4506 builder.CreateUnreachable(); 4507 } 4508 return fnRef; 4509 } 4510 4511 llvm::CallInst * 4512 ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF, 4513 llvm::Value *Exn) { 4514 // In C++, we want to call __cxa_begin_catch() before terminating. 4515 if (Exn) { 4516 assert(CGF.CGM.getLangOpts().CPlusPlus); 4517 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn); 4518 } 4519 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn()); 4520 } 4521 4522 std::pair<llvm::Value *, const CXXRecordDecl *> 4523 ItaniumCXXABI::LoadVTablePtr(CodeGenFunction &CGF, Address This, 4524 const CXXRecordDecl *RD) { 4525 return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD}; 4526 } 4527 4528 void WebAssemblyCXXABI::emitBeginCatch(CodeGenFunction &CGF, 4529 const CXXCatchStmt *C) { 4530 if (CGF.getTarget().hasFeature("exception-handling")) 4531 CGF.EHStack.pushCleanup<CatchRetScope>( 4532 NormalCleanup, cast<llvm::CatchPadInst>(CGF.CurrentFuncletPad)); 4533 ItaniumCXXABI::emitBeginCatch(CGF, C); 4534 } 4535 4536 /// Register a global destructor as best as we know how. 4537 void XLCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, 4538 llvm::FunctionCallee dtor, 4539 llvm::Constant *addr) { 4540 if (D.getTLSKind() != VarDecl::TLS_None) 4541 llvm::report_fatal_error("thread local storage not yet implemented on AIX"); 4542 4543 // Create __dtor function for the var decl. 4544 llvm::Function *dtorStub = CGF.createAtExitStub(D, dtor, addr); 4545 4546 // Register above __dtor with atexit(). 4547 CGF.registerGlobalDtorWithAtExit(dtorStub); 4548 4549 // Emit __finalize function to unregister __dtor and (as appropriate) call 4550 // __dtor. 4551 emitCXXStermFinalizer(D, dtorStub, addr); 4552 } 4553 4554 void XLCXXABI::emitCXXStermFinalizer(const VarDecl &D, llvm::Function *dtorStub, 4555 llvm::Constant *addr) { 4556 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false); 4557 SmallString<256> FnName; 4558 { 4559 llvm::raw_svector_ostream Out(FnName); 4560 getMangleContext().mangleDynamicStermFinalizer(&D, Out); 4561 } 4562 4563 // Create the finalization action associated with a variable. 4564 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction(); 4565 llvm::Function *StermFinalizer = CGM.CreateGlobalInitOrCleanUpFunction( 4566 FTy, FnName.str(), FI, D.getLocation()); 4567 4568 CodeGenFunction CGF(CGM); 4569 4570 CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, StermFinalizer, FI, 4571 FunctionArgList(), D.getLocation(), 4572 D.getInit()->getExprLoc()); 4573 4574 // The unatexit subroutine unregisters __dtor functions that were previously 4575 // registered by the atexit subroutine. If the referenced function is found, 4576 // the unatexit returns a value of 0, meaning that the cleanup is still 4577 // pending (and we should call the __dtor function). 4578 llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(dtorStub); 4579 4580 llvm::Value *NeedsDestruct = CGF.Builder.CreateIsNull(V, "needs_destruct"); 4581 4582 llvm::BasicBlock *DestructCallBlock = CGF.createBasicBlock("destruct.call"); 4583 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("destruct.end"); 4584 4585 // Check if unatexit returns a value of 0. If it does, jump to 4586 // DestructCallBlock, otherwise jump to EndBlock directly. 4587 CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock); 4588 4589 CGF.EmitBlock(DestructCallBlock); 4590 4591 // Emit the call to dtorStub. 4592 llvm::CallInst *CI = CGF.Builder.CreateCall(dtorStub); 4593 4594 // Make sure the call and the callee agree on calling convention. 4595 CI->setCallingConv(dtorStub->getCallingConv()); 4596 4597 CGF.EmitBlock(EndBlock); 4598 4599 CGF.FinishFunction(); 4600 4601 assert(!D.getAttr<InitPriorityAttr>() && 4602 "Prioritized sinit and sterm functions are not yet supported."); 4603 4604 if (isTemplateInstantiation(D.getTemplateSpecializationKind()) || 4605 getContext().GetGVALinkageForVariable(&D) == GVA_DiscardableODR) 4606 // According to C++ [basic.start.init]p2, class template static data 4607 // members (i.e., implicitly or explicitly instantiated specializations) 4608 // have unordered initialization. As a consequence, we can put them into 4609 // their own llvm.global_dtors entry. 4610 CGM.AddCXXStermFinalizerToGlobalDtor(StermFinalizer, 65535); 4611 else 4612 CGM.AddCXXStermFinalizerEntry(StermFinalizer); 4613 } 4614