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