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