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