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