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