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