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