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