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 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 2540 case BuiltinType::Id: 2541 #include "clang/Basic/OpenCLImageTypes.def" 2542 case BuiltinType::OCLSampler: 2543 case BuiltinType::OCLEvent: 2544 case BuiltinType::OCLClkEvent: 2545 case BuiltinType::OCLQueue: 2546 case BuiltinType::OCLNDRange: 2547 case BuiltinType::OCLReserveID: 2548 return false; 2549 2550 case BuiltinType::Dependent: 2551 #define BUILTIN_TYPE(Id, SingletonId) 2552 #define PLACEHOLDER_TYPE(Id, SingletonId) \ 2553 case BuiltinType::Id: 2554 #include "clang/AST/BuiltinTypes.def" 2555 llvm_unreachable("asking for RRTI for a placeholder type!"); 2556 2557 case BuiltinType::ObjCId: 2558 case BuiltinType::ObjCClass: 2559 case BuiltinType::ObjCSel: 2560 llvm_unreachable("FIXME: Objective-C types are unsupported!"); 2561 } 2562 2563 llvm_unreachable("Invalid BuiltinType Kind!"); 2564 } 2565 2566 static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) { 2567 QualType PointeeTy = PointerTy->getPointeeType(); 2568 const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy); 2569 if (!BuiltinTy) 2570 return false; 2571 2572 // Check the qualifiers. 2573 Qualifiers Quals = PointeeTy.getQualifiers(); 2574 Quals.removeConst(); 2575 2576 if (!Quals.empty()) 2577 return false; 2578 2579 return TypeInfoIsInStandardLibrary(BuiltinTy); 2580 } 2581 2582 /// IsStandardLibraryRTTIDescriptor - Returns whether the type 2583 /// information for the given type exists in the standard library. 2584 static bool IsStandardLibraryRTTIDescriptor(QualType Ty) { 2585 // Type info for builtin types is defined in the standard library. 2586 if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty)) 2587 return TypeInfoIsInStandardLibrary(BuiltinTy); 2588 2589 // Type info for some pointer types to builtin types is defined in the 2590 // standard library. 2591 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty)) 2592 return TypeInfoIsInStandardLibrary(PointerTy); 2593 2594 return false; 2595 } 2596 2597 /// ShouldUseExternalRTTIDescriptor - Returns whether the type information for 2598 /// the given type exists somewhere else, and that we should not emit the type 2599 /// information in this translation unit. Assumes that it is not a 2600 /// standard-library type. 2601 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM, 2602 QualType Ty) { 2603 ASTContext &Context = CGM.getContext(); 2604 2605 // If RTTI is disabled, assume it might be disabled in the 2606 // translation unit that defines any potential key function, too. 2607 if (!Context.getLangOpts().RTTI) return false; 2608 2609 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { 2610 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl()); 2611 if (!RD->hasDefinition()) 2612 return false; 2613 2614 if (!RD->isDynamicClass()) 2615 return false; 2616 2617 // FIXME: this may need to be reconsidered if the key function 2618 // changes. 2619 // N.B. We must always emit the RTTI data ourselves if there exists a key 2620 // function. 2621 bool IsDLLImport = RD->hasAttr<DLLImportAttr>(); 2622 if (CGM.getVTables().isVTableExternal(RD)) 2623 return IsDLLImport ? false : true; 2624 2625 if (IsDLLImport) 2626 return true; 2627 } 2628 2629 return false; 2630 } 2631 2632 /// IsIncompleteClassType - Returns whether the given record type is incomplete. 2633 static bool IsIncompleteClassType(const RecordType *RecordTy) { 2634 return !RecordTy->getDecl()->isCompleteDefinition(); 2635 } 2636 2637 /// ContainsIncompleteClassType - Returns whether the given type contains an 2638 /// incomplete class type. This is true if 2639 /// 2640 /// * The given type is an incomplete class type. 2641 /// * The given type is a pointer type whose pointee type contains an 2642 /// incomplete class type. 2643 /// * The given type is a member pointer type whose class is an incomplete 2644 /// class type. 2645 /// * The given type is a member pointer type whoise pointee type contains an 2646 /// incomplete class type. 2647 /// is an indirect or direct pointer to an incomplete class type. 2648 static bool ContainsIncompleteClassType(QualType Ty) { 2649 if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { 2650 if (IsIncompleteClassType(RecordTy)) 2651 return true; 2652 } 2653 2654 if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty)) 2655 return ContainsIncompleteClassType(PointerTy->getPointeeType()); 2656 2657 if (const MemberPointerType *MemberPointerTy = 2658 dyn_cast<MemberPointerType>(Ty)) { 2659 // Check if the class type is incomplete. 2660 const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass()); 2661 if (IsIncompleteClassType(ClassType)) 2662 return true; 2663 2664 return ContainsIncompleteClassType(MemberPointerTy->getPointeeType()); 2665 } 2666 2667 return false; 2668 } 2669 2670 // CanUseSingleInheritance - Return whether the given record decl has a "single, 2671 // public, non-virtual base at offset zero (i.e. the derived class is dynamic 2672 // iff the base is)", according to Itanium C++ ABI, 2.95p6b. 2673 static bool CanUseSingleInheritance(const CXXRecordDecl *RD) { 2674 // Check the number of bases. 2675 if (RD->getNumBases() != 1) 2676 return false; 2677 2678 // Get the base. 2679 CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(); 2680 2681 // Check that the base is not virtual. 2682 if (Base->isVirtual()) 2683 return false; 2684 2685 // Check that the base is public. 2686 if (Base->getAccessSpecifier() != AS_public) 2687 return false; 2688 2689 // Check that the class is dynamic iff the base is. 2690 const CXXRecordDecl *BaseDecl = 2691 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 2692 if (!BaseDecl->isEmpty() && 2693 BaseDecl->isDynamicClass() != RD->isDynamicClass()) 2694 return false; 2695 2696 return true; 2697 } 2698 2699 void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) { 2700 // abi::__class_type_info. 2701 static const char * const ClassTypeInfo = 2702 "_ZTVN10__cxxabiv117__class_type_infoE"; 2703 // abi::__si_class_type_info. 2704 static const char * const SIClassTypeInfo = 2705 "_ZTVN10__cxxabiv120__si_class_type_infoE"; 2706 // abi::__vmi_class_type_info. 2707 static const char * const VMIClassTypeInfo = 2708 "_ZTVN10__cxxabiv121__vmi_class_type_infoE"; 2709 2710 const char *VTableName = nullptr; 2711 2712 switch (Ty->getTypeClass()) { 2713 #define TYPE(Class, Base) 2714 #define ABSTRACT_TYPE(Class, Base) 2715 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 2716 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 2717 #define DEPENDENT_TYPE(Class, Base) case Type::Class: 2718 #include "clang/AST/TypeNodes.def" 2719 llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 2720 2721 case Type::LValueReference: 2722 case Type::RValueReference: 2723 llvm_unreachable("References shouldn't get here"); 2724 2725 case Type::Auto: 2726 llvm_unreachable("Undeduced auto type shouldn't get here"); 2727 2728 case Type::Pipe: 2729 llvm_unreachable("Pipe types shouldn't get here"); 2730 2731 case Type::Builtin: 2732 // GCC treats vector and complex types as fundamental types. 2733 case Type::Vector: 2734 case Type::ExtVector: 2735 case Type::Complex: 2736 case Type::Atomic: 2737 // FIXME: GCC treats block pointers as fundamental types?! 2738 case Type::BlockPointer: 2739 // abi::__fundamental_type_info. 2740 VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE"; 2741 break; 2742 2743 case Type::ConstantArray: 2744 case Type::IncompleteArray: 2745 case Type::VariableArray: 2746 // abi::__array_type_info. 2747 VTableName = "_ZTVN10__cxxabiv117__array_type_infoE"; 2748 break; 2749 2750 case Type::FunctionNoProto: 2751 case Type::FunctionProto: 2752 // abi::__function_type_info. 2753 VTableName = "_ZTVN10__cxxabiv120__function_type_infoE"; 2754 break; 2755 2756 case Type::Enum: 2757 // abi::__enum_type_info. 2758 VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE"; 2759 break; 2760 2761 case Type::Record: { 2762 const CXXRecordDecl *RD = 2763 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl()); 2764 2765 if (!RD->hasDefinition() || !RD->getNumBases()) { 2766 VTableName = ClassTypeInfo; 2767 } else if (CanUseSingleInheritance(RD)) { 2768 VTableName = SIClassTypeInfo; 2769 } else { 2770 VTableName = VMIClassTypeInfo; 2771 } 2772 2773 break; 2774 } 2775 2776 case Type::ObjCObject: 2777 // Ignore protocol qualifiers. 2778 Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr(); 2779 2780 // Handle id and Class. 2781 if (isa<BuiltinType>(Ty)) { 2782 VTableName = ClassTypeInfo; 2783 break; 2784 } 2785 2786 assert(isa<ObjCInterfaceType>(Ty)); 2787 // Fall through. 2788 2789 case Type::ObjCInterface: 2790 if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) { 2791 VTableName = SIClassTypeInfo; 2792 } else { 2793 VTableName = ClassTypeInfo; 2794 } 2795 break; 2796 2797 case Type::ObjCObjectPointer: 2798 case Type::Pointer: 2799 // abi::__pointer_type_info. 2800 VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE"; 2801 break; 2802 2803 case Type::MemberPointer: 2804 // abi::__pointer_to_member_type_info. 2805 VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE"; 2806 break; 2807 } 2808 2809 llvm::Constant *VTable = 2810 CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy); 2811 2812 llvm::Type *PtrDiffTy = 2813 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType()); 2814 2815 // The vtable address point is 2. 2816 llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2); 2817 VTable = 2818 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two); 2819 VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy); 2820 2821 Fields.push_back(VTable); 2822 } 2823 2824 /// \brief Return the linkage that the type info and type info name constants 2825 /// should have for the given type. 2826 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM, 2827 QualType Ty) { 2828 // Itanium C++ ABI 2.9.5p7: 2829 // In addition, it and all of the intermediate abi::__pointer_type_info 2830 // structs in the chain down to the abi::__class_type_info for the 2831 // incomplete class type must be prevented from resolving to the 2832 // corresponding type_info structs for the complete class type, possibly 2833 // by making them local static objects. Finally, a dummy class RTTI is 2834 // generated for the incomplete type that will not resolve to the final 2835 // complete class RTTI (because the latter need not exist), possibly by 2836 // making it a local static object. 2837 if (ContainsIncompleteClassType(Ty)) 2838 return llvm::GlobalValue::InternalLinkage; 2839 2840 switch (Ty->getLinkage()) { 2841 case NoLinkage: 2842 case InternalLinkage: 2843 case UniqueExternalLinkage: 2844 return llvm::GlobalValue::InternalLinkage; 2845 2846 case VisibleNoLinkage: 2847 case ExternalLinkage: 2848 if (!CGM.getLangOpts().RTTI) { 2849 // RTTI is not enabled, which means that this type info struct is going 2850 // to be used for exception handling. Give it linkonce_odr linkage. 2851 return llvm::GlobalValue::LinkOnceODRLinkage; 2852 } 2853 2854 if (const RecordType *Record = dyn_cast<RecordType>(Ty)) { 2855 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl()); 2856 if (RD->hasAttr<WeakAttr>()) 2857 return llvm::GlobalValue::WeakODRLinkage; 2858 if (RD->isDynamicClass()) { 2859 llvm::GlobalValue::LinkageTypes LT = CGM.getVTableLinkage(RD); 2860 // MinGW won't export the RTTI information when there is a key function. 2861 // Make sure we emit our own copy instead of attempting to dllimport it. 2862 if (RD->hasAttr<DLLImportAttr>() && 2863 llvm::GlobalValue::isAvailableExternallyLinkage(LT)) 2864 LT = llvm::GlobalValue::LinkOnceODRLinkage; 2865 return LT; 2866 } 2867 } 2868 2869 return llvm::GlobalValue::LinkOnceODRLinkage; 2870 } 2871 2872 llvm_unreachable("Invalid linkage!"); 2873 } 2874 2875 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { 2876 // We want to operate on the canonical type. 2877 Ty = Ty.getCanonicalType(); 2878 2879 // Check if we've already emitted an RTTI descriptor for this type. 2880 SmallString<256> Name; 2881 llvm::raw_svector_ostream Out(Name); 2882 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); 2883 2884 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name); 2885 if (OldGV && !OldGV->isDeclaration()) { 2886 assert(!OldGV->hasAvailableExternallyLinkage() && 2887 "available_externally typeinfos not yet implemented"); 2888 2889 return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy); 2890 } 2891 2892 // Check if there is already an external RTTI descriptor for this type. 2893 bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty); 2894 if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty))) 2895 return GetAddrOfExternalRTTIDescriptor(Ty); 2896 2897 // Emit the standard library with external linkage. 2898 llvm::GlobalVariable::LinkageTypes Linkage; 2899 if (IsStdLib) 2900 Linkage = llvm::GlobalValue::ExternalLinkage; 2901 else 2902 Linkage = getTypeInfoLinkage(CGM, Ty); 2903 2904 // Add the vtable pointer. 2905 BuildVTablePointer(cast<Type>(Ty)); 2906 2907 // And the name. 2908 llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage); 2909 llvm::Constant *TypeNameField; 2910 2911 // If we're supposed to demote the visibility, be sure to set a flag 2912 // to use a string comparison for type_info comparisons. 2913 ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness = 2914 CXXABI.classifyRTTIUniqueness(Ty, Linkage); 2915 if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) { 2916 // The flag is the sign bit, which on ARM64 is defined to be clear 2917 // for global pointers. This is very ARM64-specific. 2918 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty); 2919 llvm::Constant *flag = 2920 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63); 2921 TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag); 2922 TypeNameField = 2923 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy); 2924 } else { 2925 TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy); 2926 } 2927 Fields.push_back(TypeNameField); 2928 2929 switch (Ty->getTypeClass()) { 2930 #define TYPE(Class, Base) 2931 #define ABSTRACT_TYPE(Class, Base) 2932 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 2933 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 2934 #define DEPENDENT_TYPE(Class, Base) case Type::Class: 2935 #include "clang/AST/TypeNodes.def" 2936 llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 2937 2938 // GCC treats vector types as fundamental types. 2939 case Type::Builtin: 2940 case Type::Vector: 2941 case Type::ExtVector: 2942 case Type::Complex: 2943 case Type::BlockPointer: 2944 // Itanium C++ ABI 2.9.5p4: 2945 // abi::__fundamental_type_info adds no data members to std::type_info. 2946 break; 2947 2948 case Type::LValueReference: 2949 case Type::RValueReference: 2950 llvm_unreachable("References shouldn't get here"); 2951 2952 case Type::Auto: 2953 llvm_unreachable("Undeduced auto type shouldn't get here"); 2954 2955 case Type::Pipe: 2956 llvm_unreachable("Pipe type shouldn't get here"); 2957 2958 case Type::ConstantArray: 2959 case Type::IncompleteArray: 2960 case Type::VariableArray: 2961 // Itanium C++ ABI 2.9.5p5: 2962 // abi::__array_type_info adds no data members to std::type_info. 2963 break; 2964 2965 case Type::FunctionNoProto: 2966 case Type::FunctionProto: 2967 // Itanium C++ ABI 2.9.5p5: 2968 // abi::__function_type_info adds no data members to std::type_info. 2969 break; 2970 2971 case Type::Enum: 2972 // Itanium C++ ABI 2.9.5p5: 2973 // abi::__enum_type_info adds no data members to std::type_info. 2974 break; 2975 2976 case Type::Record: { 2977 const CXXRecordDecl *RD = 2978 cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl()); 2979 if (!RD->hasDefinition() || !RD->getNumBases()) { 2980 // We don't need to emit any fields. 2981 break; 2982 } 2983 2984 if (CanUseSingleInheritance(RD)) 2985 BuildSIClassTypeInfo(RD); 2986 else 2987 BuildVMIClassTypeInfo(RD); 2988 2989 break; 2990 } 2991 2992 case Type::ObjCObject: 2993 case Type::ObjCInterface: 2994 BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty)); 2995 break; 2996 2997 case Type::ObjCObjectPointer: 2998 BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType()); 2999 break; 3000 3001 case Type::Pointer: 3002 BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType()); 3003 break; 3004 3005 case Type::MemberPointer: 3006 BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty)); 3007 break; 3008 3009 case Type::Atomic: 3010 // No fields, at least for the moment. 3011 break; 3012 } 3013 3014 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields); 3015 3016 llvm::Module &M = CGM.getModule(); 3017 llvm::GlobalVariable *GV = 3018 new llvm::GlobalVariable(M, Init->getType(), 3019 /*Constant=*/true, Linkage, Init, Name); 3020 3021 // If there's already an old global variable, replace it with the new one. 3022 if (OldGV) { 3023 GV->takeName(OldGV); 3024 llvm::Constant *NewPtr = 3025 llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 3026 OldGV->replaceAllUsesWith(NewPtr); 3027 OldGV->eraseFromParent(); 3028 } 3029 3030 if (CGM.supportsCOMDAT() && GV->isWeakForLinker()) 3031 GV->setComdat(M.getOrInsertComdat(GV->getName())); 3032 3033 // The Itanium ABI specifies that type_info objects must be globally 3034 // unique, with one exception: if the type is an incomplete class 3035 // type or a (possibly indirect) pointer to one. That exception 3036 // affects the general case of comparing type_info objects produced 3037 // by the typeid operator, which is why the comparison operators on 3038 // std::type_info generally use the type_info name pointers instead 3039 // of the object addresses. However, the language's built-in uses 3040 // of RTTI generally require class types to be complete, even when 3041 // manipulating pointers to those class types. This allows the 3042 // implementation of dynamic_cast to rely on address equality tests, 3043 // which is much faster. 3044 3045 // All of this is to say that it's important that both the type_info 3046 // object and the type_info name be uniqued when weakly emitted. 3047 3048 // Give the type_info object and name the formal visibility of the 3049 // type itself. 3050 llvm::GlobalValue::VisibilityTypes llvmVisibility; 3051 if (llvm::GlobalValue::isLocalLinkage(Linkage)) 3052 // If the linkage is local, only default visibility makes sense. 3053 llvmVisibility = llvm::GlobalValue::DefaultVisibility; 3054 else if (RTTIUniqueness == ItaniumCXXABI::RUK_NonUniqueHidden) 3055 llvmVisibility = llvm::GlobalValue::HiddenVisibility; 3056 else 3057 llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility()); 3058 TypeName->setVisibility(llvmVisibility); 3059 GV->setVisibility(llvmVisibility); 3060 3061 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); 3062 } 3063 3064 /// ComputeQualifierFlags - Compute the pointer type info flags from the 3065 /// given qualifier. 3066 static unsigned ComputeQualifierFlags(Qualifiers Quals) { 3067 unsigned Flags = 0; 3068 3069 if (Quals.hasConst()) 3070 Flags |= ItaniumRTTIBuilder::PTI_Const; 3071 if (Quals.hasVolatile()) 3072 Flags |= ItaniumRTTIBuilder::PTI_Volatile; 3073 if (Quals.hasRestrict()) 3074 Flags |= ItaniumRTTIBuilder::PTI_Restrict; 3075 3076 return Flags; 3077 } 3078 3079 /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info 3080 /// for the given Objective-C object type. 3081 void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) { 3082 // Drop qualifiers. 3083 const Type *T = OT->getBaseType().getTypePtr(); 3084 assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T)); 3085 3086 // The builtin types are abi::__class_type_infos and don't require 3087 // extra fields. 3088 if (isa<BuiltinType>(T)) return; 3089 3090 ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl(); 3091 ObjCInterfaceDecl *Super = Class->getSuperClass(); 3092 3093 // Root classes are also __class_type_info. 3094 if (!Super) return; 3095 3096 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super); 3097 3098 // Everything else is single inheritance. 3099 llvm::Constant *BaseTypeInfo = 3100 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy); 3101 Fields.push_back(BaseTypeInfo); 3102 } 3103 3104 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single 3105 /// inheritance, according to the Itanium C++ ABI, 2.95p6b. 3106 void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) { 3107 // Itanium C++ ABI 2.9.5p6b: 3108 // It adds to abi::__class_type_info a single member pointing to the 3109 // type_info structure for the base type, 3110 llvm::Constant *BaseTypeInfo = 3111 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType()); 3112 Fields.push_back(BaseTypeInfo); 3113 } 3114 3115 namespace { 3116 /// SeenBases - Contains virtual and non-virtual bases seen when traversing 3117 /// a class hierarchy. 3118 struct SeenBases { 3119 llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases; 3120 llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases; 3121 }; 3122 } 3123 3124 /// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in 3125 /// abi::__vmi_class_type_info. 3126 /// 3127 static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base, 3128 SeenBases &Bases) { 3129 3130 unsigned Flags = 0; 3131 3132 const CXXRecordDecl *BaseDecl = 3133 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 3134 3135 if (Base->isVirtual()) { 3136 // Mark the virtual base as seen. 3137 if (!Bases.VirtualBases.insert(BaseDecl).second) { 3138 // If this virtual base has been seen before, then the class is diamond 3139 // shaped. 3140 Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped; 3141 } else { 3142 if (Bases.NonVirtualBases.count(BaseDecl)) 3143 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat; 3144 } 3145 } else { 3146 // Mark the non-virtual base as seen. 3147 if (!Bases.NonVirtualBases.insert(BaseDecl).second) { 3148 // If this non-virtual base has been seen before, then the class has non- 3149 // diamond shaped repeated inheritance. 3150 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat; 3151 } else { 3152 if (Bases.VirtualBases.count(BaseDecl)) 3153 Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat; 3154 } 3155 } 3156 3157 // Walk all bases. 3158 for (const auto &I : BaseDecl->bases()) 3159 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); 3160 3161 return Flags; 3162 } 3163 3164 static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) { 3165 unsigned Flags = 0; 3166 SeenBases Bases; 3167 3168 // Walk all bases. 3169 for (const auto &I : RD->bases()) 3170 Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); 3171 3172 return Flags; 3173 } 3174 3175 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for 3176 /// classes with bases that do not satisfy the abi::__si_class_type_info 3177 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c. 3178 void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { 3179 llvm::Type *UnsignedIntLTy = 3180 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 3181 3182 // Itanium C++ ABI 2.9.5p6c: 3183 // __flags is a word with flags describing details about the class 3184 // structure, which may be referenced by using the __flags_masks 3185 // enumeration. These flags refer to both direct and indirect bases. 3186 unsigned Flags = ComputeVMIClassTypeInfoFlags(RD); 3187 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 3188 3189 // Itanium C++ ABI 2.9.5p6c: 3190 // __base_count is a word with the number of direct proper base class 3191 // descriptions that follow. 3192 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases())); 3193 3194 if (!RD->getNumBases()) 3195 return; 3196 3197 llvm::Type *LongLTy = 3198 CGM.getTypes().ConvertType(CGM.getContext().LongTy); 3199 3200 // Now add the base class descriptions. 3201 3202 // Itanium C++ ABI 2.9.5p6c: 3203 // __base_info[] is an array of base class descriptions -- one for every 3204 // direct proper base. Each description is of the type: 3205 // 3206 // struct abi::__base_class_type_info { 3207 // public: 3208 // const __class_type_info *__base_type; 3209 // long __offset_flags; 3210 // 3211 // enum __offset_flags_masks { 3212 // __virtual_mask = 0x1, 3213 // __public_mask = 0x2, 3214 // __offset_shift = 8 3215 // }; 3216 // }; 3217 for (const auto &Base : RD->bases()) { 3218 // The __base_type member points to the RTTI for the base type. 3219 Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType())); 3220 3221 const CXXRecordDecl *BaseDecl = 3222 cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl()); 3223 3224 int64_t OffsetFlags = 0; 3225 3226 // All but the lower 8 bits of __offset_flags are a signed offset. 3227 // For a non-virtual base, this is the offset in the object of the base 3228 // subobject. For a virtual base, this is the offset in the virtual table of 3229 // the virtual base offset for the virtual base referenced (negative). 3230 CharUnits Offset; 3231 if (Base.isVirtual()) 3232 Offset = 3233 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl); 3234 else { 3235 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); 3236 Offset = Layout.getBaseClassOffset(BaseDecl); 3237 }; 3238 3239 OffsetFlags = uint64_t(Offset.getQuantity()) << 8; 3240 3241 // The low-order byte of __offset_flags contains flags, as given by the 3242 // masks from the enumeration __offset_flags_masks. 3243 if (Base.isVirtual()) 3244 OffsetFlags |= BCTI_Virtual; 3245 if (Base.getAccessSpecifier() == AS_public) 3246 OffsetFlags |= BCTI_Public; 3247 3248 Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags)); 3249 } 3250 } 3251 3252 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, 3253 /// used for pointer types. 3254 void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) { 3255 Qualifiers Quals; 3256 QualType UnqualifiedPointeeTy = 3257 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals); 3258 3259 // Itanium C++ ABI 2.9.5p7: 3260 // __flags is a flag word describing the cv-qualification and other 3261 // attributes of the type pointed to 3262 unsigned Flags = ComputeQualifierFlags(Quals); 3263 3264 // Itanium C++ ABI 2.9.5p7: 3265 // When the abi::__pbase_type_info is for a direct or indirect pointer to an 3266 // incomplete class type, the incomplete target type flag is set. 3267 if (ContainsIncompleteClassType(UnqualifiedPointeeTy)) 3268 Flags |= PTI_Incomplete; 3269 3270 llvm::Type *UnsignedIntLTy = 3271 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 3272 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 3273 3274 // Itanium C++ ABI 2.9.5p7: 3275 // __pointee is a pointer to the std::type_info derivation for the 3276 // unqualified type being pointed to. 3277 llvm::Constant *PointeeTypeInfo = 3278 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy); 3279 Fields.push_back(PointeeTypeInfo); 3280 } 3281 3282 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info 3283 /// struct, used for member pointer types. 3284 void 3285 ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) { 3286 QualType PointeeTy = Ty->getPointeeType(); 3287 3288 Qualifiers Quals; 3289 QualType UnqualifiedPointeeTy = 3290 CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals); 3291 3292 // Itanium C++ ABI 2.9.5p7: 3293 // __flags is a flag word describing the cv-qualification and other 3294 // attributes of the type pointed to. 3295 unsigned Flags = ComputeQualifierFlags(Quals); 3296 3297 const RecordType *ClassType = cast<RecordType>(Ty->getClass()); 3298 3299 // Itanium C++ ABI 2.9.5p7: 3300 // When the abi::__pbase_type_info is for a direct or indirect pointer to an 3301 // incomplete class type, the incomplete target type flag is set. 3302 if (ContainsIncompleteClassType(UnqualifiedPointeeTy)) 3303 Flags |= PTI_Incomplete; 3304 3305 if (IsIncompleteClassType(ClassType)) 3306 Flags |= PTI_ContainingClassIncomplete; 3307 3308 llvm::Type *UnsignedIntLTy = 3309 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 3310 Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 3311 3312 // Itanium C++ ABI 2.9.5p7: 3313 // __pointee is a pointer to the std::type_info derivation for the 3314 // unqualified type being pointed to. 3315 llvm::Constant *PointeeTypeInfo = 3316 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(UnqualifiedPointeeTy); 3317 Fields.push_back(PointeeTypeInfo); 3318 3319 // Itanium C++ ABI 2.9.5p9: 3320 // __context is a pointer to an abi::__class_type_info corresponding to the 3321 // class type containing the member pointed to 3322 // (e.g., the "A" in "int A::*"). 3323 Fields.push_back( 3324 ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0))); 3325 } 3326 3327 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) { 3328 return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty); 3329 } 3330 3331 void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) { 3332 QualType PointerType = getContext().getPointerType(Type); 3333 QualType PointerTypeConst = getContext().getPointerType(Type.withConst()); 3334 ItaniumRTTIBuilder(*this).BuildTypeInfo(Type, true); 3335 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerType, true); 3336 ItaniumRTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true); 3337 } 3338 3339 void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() { 3340 // Types added here must also be added to TypeInfoIsInStandardLibrary. 3341 QualType FundamentalTypes[] = { 3342 getContext().VoidTy, getContext().NullPtrTy, 3343 getContext().BoolTy, getContext().WCharTy, 3344 getContext().CharTy, getContext().UnsignedCharTy, 3345 getContext().SignedCharTy, getContext().ShortTy, 3346 getContext().UnsignedShortTy, getContext().IntTy, 3347 getContext().UnsignedIntTy, getContext().LongTy, 3348 getContext().UnsignedLongTy, getContext().LongLongTy, 3349 getContext().UnsignedLongLongTy, getContext().Int128Ty, 3350 getContext().UnsignedInt128Ty, getContext().HalfTy, 3351 getContext().FloatTy, getContext().DoubleTy, 3352 getContext().LongDoubleTy, getContext().Char16Ty, 3353 getContext().Char32Ty, 3354 }; 3355 for (const QualType &FundamentalType : FundamentalTypes) 3356 EmitFundamentalRTTIDescriptor(FundamentalType); 3357 } 3358 3359 /// What sort of uniqueness rules should we use for the RTTI for the 3360 /// given type? 3361 ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness( 3362 QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const { 3363 if (shouldRTTIBeUnique()) 3364 return RUK_Unique; 3365 3366 // It's only necessary for linkonce_odr or weak_odr linkage. 3367 if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage && 3368 Linkage != llvm::GlobalValue::WeakODRLinkage) 3369 return RUK_Unique; 3370 3371 // It's only necessary with default visibility. 3372 if (CanTy->getVisibility() != DefaultVisibility) 3373 return RUK_Unique; 3374 3375 // If we're not required to publish this symbol, hide it. 3376 if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage) 3377 return RUK_NonUniqueHidden; 3378 3379 // If we're required to publish this symbol, as we might be under an 3380 // explicit instantiation, leave it with default visibility but 3381 // enable string-comparisons. 3382 assert(Linkage == llvm::GlobalValue::WeakODRLinkage); 3383 return RUK_NonUniqueVisible; 3384 } 3385 3386 // Find out how to codegen the complete destructor and constructor 3387 namespace { 3388 enum class StructorCodegen { Emit, RAUW, Alias, COMDAT }; 3389 } 3390 static StructorCodegen getCodegenToUse(CodeGenModule &CGM, 3391 const CXXMethodDecl *MD) { 3392 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases) 3393 return StructorCodegen::Emit; 3394 3395 // The complete and base structors are not equivalent if there are any virtual 3396 // bases, so emit separate functions. 3397 if (MD->getParent()->getNumVBases()) 3398 return StructorCodegen::Emit; 3399 3400 GlobalDecl AliasDecl; 3401 if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) { 3402 AliasDecl = GlobalDecl(DD, Dtor_Complete); 3403 } else { 3404 const auto *CD = cast<CXXConstructorDecl>(MD); 3405 AliasDecl = GlobalDecl(CD, Ctor_Complete); 3406 } 3407 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl); 3408 3409 if (llvm::GlobalValue::isDiscardableIfUnused(Linkage)) 3410 return StructorCodegen::RAUW; 3411 3412 // FIXME: Should we allow available_externally aliases? 3413 if (!llvm::GlobalAlias::isValidLinkage(Linkage)) 3414 return StructorCodegen::RAUW; 3415 3416 if (llvm::GlobalValue::isWeakForLinker(Linkage)) { 3417 // Only ELF supports COMDATs with arbitrary names (C5/D5). 3418 if (CGM.getTarget().getTriple().isOSBinFormatELF()) 3419 return StructorCodegen::COMDAT; 3420 return StructorCodegen::Emit; 3421 } 3422 3423 return StructorCodegen::Alias; 3424 } 3425 3426 static void emitConstructorDestructorAlias(CodeGenModule &CGM, 3427 GlobalDecl AliasDecl, 3428 GlobalDecl TargetDecl) { 3429 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl); 3430 3431 StringRef MangledName = CGM.getMangledName(AliasDecl); 3432 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName); 3433 if (Entry && !Entry->isDeclaration()) 3434 return; 3435 3436 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl)); 3437 3438 // Create the alias with no name. 3439 auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee); 3440 3441 // Switch any previous uses to the alias. 3442 if (Entry) { 3443 assert(Entry->getType() == Aliasee->getType() && 3444 "declaration exists with different type"); 3445 Alias->takeName(Entry); 3446 Entry->replaceAllUsesWith(Alias); 3447 Entry->eraseFromParent(); 3448 } else { 3449 Alias->setName(MangledName); 3450 } 3451 3452 // Finally, set up the alias with its proper name and attributes. 3453 CGM.setAliasAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias); 3454 } 3455 3456 void ItaniumCXXABI::emitCXXStructor(const CXXMethodDecl *MD, 3457 StructorType Type) { 3458 auto *CD = dyn_cast<CXXConstructorDecl>(MD); 3459 const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD); 3460 3461 StructorCodegen CGType = getCodegenToUse(CGM, MD); 3462 3463 if (Type == StructorType::Complete) { 3464 GlobalDecl CompleteDecl; 3465 GlobalDecl BaseDecl; 3466 if (CD) { 3467 CompleteDecl = GlobalDecl(CD, Ctor_Complete); 3468 BaseDecl = GlobalDecl(CD, Ctor_Base); 3469 } else { 3470 CompleteDecl = GlobalDecl(DD, Dtor_Complete); 3471 BaseDecl = GlobalDecl(DD, Dtor_Base); 3472 } 3473 3474 if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) { 3475 emitConstructorDestructorAlias(CGM, CompleteDecl, BaseDecl); 3476 return; 3477 } 3478 3479 if (CGType == StructorCodegen::RAUW) { 3480 StringRef MangledName = CGM.getMangledName(CompleteDecl); 3481 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl); 3482 CGM.addReplacement(MangledName, Aliasee); 3483 return; 3484 } 3485 } 3486 3487 // The base destructor is equivalent to the base destructor of its 3488 // base class if there is exactly one non-virtual base class with a 3489 // non-trivial destructor, there are no fields with a non-trivial 3490 // destructor, and the body of the destructor is trivial. 3491 if (DD && Type == StructorType::Base && CGType != StructorCodegen::COMDAT && 3492 !CGM.TryEmitBaseDestructorAsAlias(DD)) 3493 return; 3494 3495 llvm::Function *Fn = CGM.codegenCXXStructor(MD, Type); 3496 3497 if (CGType == StructorCodegen::COMDAT) { 3498 SmallString<256> Buffer; 3499 llvm::raw_svector_ostream Out(Buffer); 3500 if (DD) 3501 getMangleContext().mangleCXXDtorComdat(DD, Out); 3502 else 3503 getMangleContext().mangleCXXCtorComdat(CD, Out); 3504 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str()); 3505 Fn->setComdat(C); 3506 } else { 3507 CGM.maybeSetTrivialComdat(*MD, *Fn); 3508 } 3509 } 3510 3511 static llvm::Constant *getBeginCatchFn(CodeGenModule &CGM) { 3512 // void *__cxa_begin_catch(void*); 3513 llvm::FunctionType *FTy = llvm::FunctionType::get( 3514 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false); 3515 3516 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch"); 3517 } 3518 3519 static llvm::Constant *getEndCatchFn(CodeGenModule &CGM) { 3520 // void __cxa_end_catch(); 3521 llvm::FunctionType *FTy = 3522 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false); 3523 3524 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch"); 3525 } 3526 3527 static llvm::Constant *getGetExceptionPtrFn(CodeGenModule &CGM) { 3528 // void *__cxa_get_exception_ptr(void*); 3529 llvm::FunctionType *FTy = llvm::FunctionType::get( 3530 CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false); 3531 3532 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr"); 3533 } 3534 3535 namespace { 3536 /// A cleanup to call __cxa_end_catch. In many cases, the caught 3537 /// exception type lets us state definitively that the thrown exception 3538 /// type does not have a destructor. In particular: 3539 /// - Catch-alls tell us nothing, so we have to conservatively 3540 /// assume that the thrown exception might have a destructor. 3541 /// - Catches by reference behave according to their base types. 3542 /// - Catches of non-record types will only trigger for exceptions 3543 /// of non-record types, which never have destructors. 3544 /// - Catches of record types can trigger for arbitrary subclasses 3545 /// of the caught type, so we have to assume the actual thrown 3546 /// exception type might have a throwing destructor, even if the 3547 /// caught type's destructor is trivial or nothrow. 3548 struct CallEndCatch final : EHScopeStack::Cleanup { 3549 CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {} 3550 bool MightThrow; 3551 3552 void Emit(CodeGenFunction &CGF, Flags flags) override { 3553 if (!MightThrow) { 3554 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM)); 3555 return; 3556 } 3557 3558 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM)); 3559 } 3560 }; 3561 } 3562 3563 /// Emits a call to __cxa_begin_catch and enters a cleanup to call 3564 /// __cxa_end_catch. 3565 /// 3566 /// \param EndMightThrow - true if __cxa_end_catch might throw 3567 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF, 3568 llvm::Value *Exn, 3569 bool EndMightThrow) { 3570 llvm::CallInst *call = 3571 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn); 3572 3573 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow); 3574 3575 return call; 3576 } 3577 3578 /// A "special initializer" callback for initializing a catch 3579 /// parameter during catch initialization. 3580 static void InitCatchParam(CodeGenFunction &CGF, 3581 const VarDecl &CatchParam, 3582 Address ParamAddr, 3583 SourceLocation Loc) { 3584 // Load the exception from where the landing pad saved it. 3585 llvm::Value *Exn = CGF.getExceptionFromSlot(); 3586 3587 CanQualType CatchType = 3588 CGF.CGM.getContext().getCanonicalType(CatchParam.getType()); 3589 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType); 3590 3591 // If we're catching by reference, we can just cast the object 3592 // pointer to the appropriate pointer. 3593 if (isa<ReferenceType>(CatchType)) { 3594 QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType(); 3595 bool EndCatchMightThrow = CaughtType->isRecordType(); 3596 3597 // __cxa_begin_catch returns the adjusted object pointer. 3598 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow); 3599 3600 // We have no way to tell the personality function that we're 3601 // catching by reference, so if we're catching a pointer, 3602 // __cxa_begin_catch will actually return that pointer by value. 3603 if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) { 3604 QualType PointeeType = PT->getPointeeType(); 3605 3606 // When catching by reference, generally we should just ignore 3607 // this by-value pointer and use the exception object instead. 3608 if (!PointeeType->isRecordType()) { 3609 3610 // Exn points to the struct _Unwind_Exception header, which 3611 // we have to skip past in order to reach the exception data. 3612 unsigned HeaderSize = 3613 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException(); 3614 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize); 3615 3616 // However, if we're catching a pointer-to-record type that won't 3617 // work, because the personality function might have adjusted 3618 // the pointer. There's actually no way for us to fully satisfy 3619 // the language/ABI contract here: we can't use Exn because it 3620 // might have the wrong adjustment, but we can't use the by-value 3621 // pointer because it's off by a level of abstraction. 3622 // 3623 // The current solution is to dump the adjusted pointer into an 3624 // alloca, which breaks language semantics (because changing the 3625 // pointer doesn't change the exception) but at least works. 3626 // The better solution would be to filter out non-exact matches 3627 // and rethrow them, but this is tricky because the rethrow 3628 // really needs to be catchable by other sites at this landing 3629 // pad. The best solution is to fix the personality function. 3630 } else { 3631 // Pull the pointer for the reference type off. 3632 llvm::Type *PtrTy = 3633 cast<llvm::PointerType>(LLVMCatchTy)->getElementType(); 3634 3635 // Create the temporary and write the adjusted pointer into it. 3636 Address ExnPtrTmp = 3637 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp"); 3638 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy); 3639 CGF.Builder.CreateStore(Casted, ExnPtrTmp); 3640 3641 // Bind the reference to the temporary. 3642 AdjustedExn = ExnPtrTmp.getPointer(); 3643 } 3644 } 3645 3646 llvm::Value *ExnCast = 3647 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref"); 3648 CGF.Builder.CreateStore(ExnCast, ParamAddr); 3649 return; 3650 } 3651 3652 // Scalars and complexes. 3653 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType); 3654 if (TEK != TEK_Aggregate) { 3655 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false); 3656 3657 // If the catch type is a pointer type, __cxa_begin_catch returns 3658 // the pointer by value. 3659 if (CatchType->hasPointerRepresentation()) { 3660 llvm::Value *CastExn = 3661 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted"); 3662 3663 switch (CatchType.getQualifiers().getObjCLifetime()) { 3664 case Qualifiers::OCL_Strong: 3665 CastExn = CGF.EmitARCRetainNonBlock(CastExn); 3666 // fallthrough 3667 3668 case Qualifiers::OCL_None: 3669 case Qualifiers::OCL_ExplicitNone: 3670 case Qualifiers::OCL_Autoreleasing: 3671 CGF.Builder.CreateStore(CastExn, ParamAddr); 3672 return; 3673 3674 case Qualifiers::OCL_Weak: 3675 CGF.EmitARCInitWeak(ParamAddr, CastExn); 3676 return; 3677 } 3678 llvm_unreachable("bad ownership qualifier!"); 3679 } 3680 3681 // Otherwise, it returns a pointer into the exception object. 3682 3683 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok 3684 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy); 3685 3686 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType); 3687 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType); 3688 switch (TEK) { 3689 case TEK_Complex: 3690 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV, 3691 /*init*/ true); 3692 return; 3693 case TEK_Scalar: { 3694 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc); 3695 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true); 3696 return; 3697 } 3698 case TEK_Aggregate: 3699 llvm_unreachable("evaluation kind filtered out!"); 3700 } 3701 llvm_unreachable("bad evaluation kind"); 3702 } 3703 3704 assert(isa<RecordType>(CatchType) && "unexpected catch type!"); 3705 auto catchRD = CatchType->getAsCXXRecordDecl(); 3706 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD); 3707 3708 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok 3709 3710 // Check for a copy expression. If we don't have a copy expression, 3711 // that means a trivial copy is okay. 3712 const Expr *copyExpr = CatchParam.getInit(); 3713 if (!copyExpr) { 3714 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true); 3715 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), 3716 caughtExnAlignment); 3717 CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType); 3718 return; 3719 } 3720 3721 // We have to call __cxa_get_exception_ptr to get the adjusted 3722 // pointer before copying. 3723 llvm::CallInst *rawAdjustedExn = 3724 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn); 3725 3726 // Cast that to the appropriate type. 3727 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), 3728 caughtExnAlignment); 3729 3730 // The copy expression is defined in terms of an OpaqueValueExpr. 3731 // Find it and map it to the adjusted expression. 3732 CodeGenFunction::OpaqueValueMapping 3733 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr), 3734 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType())); 3735 3736 // Call the copy ctor in a terminate scope. 3737 CGF.EHStack.pushTerminate(); 3738 3739 // Perform the copy construction. 3740 CGF.EmitAggExpr(copyExpr, 3741 AggValueSlot::forAddr(ParamAddr, Qualifiers(), 3742 AggValueSlot::IsNotDestructed, 3743 AggValueSlot::DoesNotNeedGCBarriers, 3744 AggValueSlot::IsNotAliased)); 3745 3746 // Leave the terminate scope. 3747 CGF.EHStack.popTerminate(); 3748 3749 // Undo the opaque value mapping. 3750 opaque.pop(); 3751 3752 // Finally we can call __cxa_begin_catch. 3753 CallBeginCatch(CGF, Exn, true); 3754 } 3755 3756 /// Begins a catch statement by initializing the catch variable and 3757 /// calling __cxa_begin_catch. 3758 void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF, 3759 const CXXCatchStmt *S) { 3760 // We have to be very careful with the ordering of cleanups here: 3761 // C++ [except.throw]p4: 3762 // The destruction [of the exception temporary] occurs 3763 // immediately after the destruction of the object declared in 3764 // the exception-declaration in the handler. 3765 // 3766 // So the precise ordering is: 3767 // 1. Construct catch variable. 3768 // 2. __cxa_begin_catch 3769 // 3. Enter __cxa_end_catch cleanup 3770 // 4. Enter dtor cleanup 3771 // 3772 // We do this by using a slightly abnormal initialization process. 3773 // Delegation sequence: 3774 // - ExitCXXTryStmt opens a RunCleanupsScope 3775 // - EmitAutoVarAlloca creates the variable and debug info 3776 // - InitCatchParam initializes the variable from the exception 3777 // - CallBeginCatch calls __cxa_begin_catch 3778 // - CallBeginCatch enters the __cxa_end_catch cleanup 3779 // - EmitAutoVarCleanups enters the variable destructor cleanup 3780 // - EmitCXXTryStmt emits the code for the catch body 3781 // - EmitCXXTryStmt close the RunCleanupsScope 3782 3783 VarDecl *CatchParam = S->getExceptionDecl(); 3784 if (!CatchParam) { 3785 llvm::Value *Exn = CGF.getExceptionFromSlot(); 3786 CallBeginCatch(CGF, Exn, true); 3787 return; 3788 } 3789 3790 // Emit the local. 3791 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam); 3792 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart()); 3793 CGF.EmitAutoVarCleanups(var); 3794 } 3795 3796 /// Get or define the following function: 3797 /// void @__clang_call_terminate(i8* %exn) nounwind noreturn 3798 /// This code is used only in C++. 3799 static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) { 3800 llvm::FunctionType *fnTy = 3801 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false); 3802 llvm::Constant *fnRef = 3803 CGM.CreateRuntimeFunction(fnTy, "__clang_call_terminate"); 3804 3805 llvm::Function *fn = dyn_cast<llvm::Function>(fnRef); 3806 if (fn && fn->empty()) { 3807 fn->setDoesNotThrow(); 3808 fn->setDoesNotReturn(); 3809 3810 // What we really want is to massively penalize inlining without 3811 // forbidding it completely. The difference between that and 3812 // 'noinline' is negligible. 3813 fn->addFnAttr(llvm::Attribute::NoInline); 3814 3815 // Allow this function to be shared across translation units, but 3816 // we don't want it to turn into an exported symbol. 3817 fn->setLinkage(llvm::Function::LinkOnceODRLinkage); 3818 fn->setVisibility(llvm::Function::HiddenVisibility); 3819 if (CGM.supportsCOMDAT()) 3820 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName())); 3821 3822 // Set up the function. 3823 llvm::BasicBlock *entry = 3824 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn); 3825 CGBuilderTy builder(CGM, entry); 3826 3827 // Pull the exception pointer out of the parameter list. 3828 llvm::Value *exn = &*fn->arg_begin(); 3829 3830 // Call __cxa_begin_catch(exn). 3831 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn); 3832 catchCall->setDoesNotThrow(); 3833 catchCall->setCallingConv(CGM.getRuntimeCC()); 3834 3835 // Call std::terminate(). 3836 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn()); 3837 termCall->setDoesNotThrow(); 3838 termCall->setDoesNotReturn(); 3839 termCall->setCallingConv(CGM.getRuntimeCC()); 3840 3841 // std::terminate cannot return. 3842 builder.CreateUnreachable(); 3843 } 3844 3845 return fnRef; 3846 } 3847 3848 llvm::CallInst * 3849 ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF, 3850 llvm::Value *Exn) { 3851 // In C++, we want to call __cxa_begin_catch() before terminating. 3852 if (Exn) { 3853 assert(CGF.CGM.getLangOpts().CPlusPlus); 3854 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn); 3855 } 3856 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn()); 3857 } 3858