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