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