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