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