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