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