1 //===--- MicrosoftCXXABI.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 Microsoft Visual C++ ABI. 11 // The class in this file generates structures that follow the Microsoft 12 // Visual C++ ABI, which is actually not very well documented at all outside 13 // of Microsoft. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #include "CGCXXABI.h" 18 #include "CodeGenModule.h" 19 #include "clang/AST/Decl.h" 20 #include "clang/AST/DeclCXX.h" 21 22 using namespace clang; 23 using namespace CodeGen; 24 25 namespace { 26 27 class MicrosoftCXXABI : public CGCXXABI { 28 public: 29 MicrosoftCXXABI(CodeGenModule &CGM) : CGCXXABI(CGM) {} 30 31 bool isReturnTypeIndirect(const CXXRecordDecl *RD) const { 32 // Structures that are not C++03 PODs are always indirect. 33 return !RD->isPOD(); 34 } 35 36 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const { 37 if (RD->hasNonTrivialCopyConstructor()) 38 return RAA_DirectInMemory; 39 return RAA_Default; 40 } 41 42 StringRef GetPureVirtualCallName() { return "_purecall"; } 43 // No known support for deleted functions in MSVC yet, so this choice is 44 // arbitrary. 45 StringRef GetDeletedVirtualCallName() { return "_purecall"; } 46 47 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF, 48 llvm::Value *ptr, 49 QualType type); 50 51 llvm::Value *GetVirtualBaseClassOffset(CodeGenFunction &CGF, 52 llvm::Value *This, 53 const CXXRecordDecl *ClassDecl, 54 const CXXRecordDecl *BaseClassDecl); 55 56 void BuildConstructorSignature(const CXXConstructorDecl *Ctor, 57 CXXCtorType Type, 58 CanQualType &ResTy, 59 SmallVectorImpl<CanQualType> &ArgTys); 60 61 llvm::BasicBlock *EmitCtorCompleteObjectHandler(CodeGenFunction &CGF); 62 63 void BuildDestructorSignature(const CXXDestructorDecl *Ctor, 64 CXXDtorType Type, 65 CanQualType &ResTy, 66 SmallVectorImpl<CanQualType> &ArgTys); 67 68 void BuildInstanceFunctionParams(CodeGenFunction &CGF, 69 QualType &ResTy, 70 FunctionArgList &Params); 71 72 void EmitInstanceFunctionProlog(CodeGenFunction &CGF); 73 74 llvm::Value *EmitConstructorCall(CodeGenFunction &CGF, 75 const CXXConstructorDecl *D, 76 CXXCtorType Type, bool ForVirtualBase, 77 bool Delegating, 78 llvm::Value *This, 79 CallExpr::const_arg_iterator ArgBeg, 80 CallExpr::const_arg_iterator ArgEnd); 81 82 RValue EmitVirtualDestructorCall(CodeGenFunction &CGF, 83 const CXXDestructorDecl *Dtor, 84 CXXDtorType DtorType, 85 SourceLocation CallLoc, 86 ReturnValueSlot ReturnValue, 87 llvm::Value *This); 88 89 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, 90 llvm::GlobalVariable *DeclPtr, 91 bool PerformInit); 92 93 // ==== Notes on array cookies ========= 94 // 95 // MSVC seems to only use cookies when the class has a destructor; a 96 // two-argument usual array deallocation function isn't sufficient. 97 // 98 // For example, this code prints "100" and "1": 99 // struct A { 100 // char x; 101 // void *operator new[](size_t sz) { 102 // printf("%u\n", sz); 103 // return malloc(sz); 104 // } 105 // void operator delete[](void *p, size_t sz) { 106 // printf("%u\n", sz); 107 // free(p); 108 // } 109 // }; 110 // int main() { 111 // A *p = new A[100]; 112 // delete[] p; 113 // } 114 // Whereas it prints "104" and "104" if you give A a destructor. 115 116 bool requiresArrayCookie(const CXXDeleteExpr *expr, QualType elementType); 117 bool requiresArrayCookie(const CXXNewExpr *expr); 118 CharUnits getArrayCookieSizeImpl(QualType type); 119 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF, 120 llvm::Value *NewPtr, 121 llvm::Value *NumElements, 122 const CXXNewExpr *expr, 123 QualType ElementType); 124 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, 125 llvm::Value *allocPtr, 126 CharUnits cookieSize); 127 static bool needThisReturn(GlobalDecl GD); 128 129 private: 130 llvm::Constant *getZeroInt() { 131 return llvm::ConstantInt::get(CGM.IntTy, 0); 132 } 133 134 llvm::Constant *getAllOnesInt() { 135 return llvm::Constant::getAllOnesValue(CGM.IntTy); 136 } 137 138 llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) { 139 return C ? C : getZeroInt(); 140 } 141 142 llvm::Value *getValueOrZeroInt(llvm::Value *C) { 143 return C ? C : getZeroInt(); 144 } 145 146 void 147 GetNullMemberPointerFields(const MemberPointerType *MPT, 148 llvm::SmallVectorImpl<llvm::Constant *> &fields); 149 150 /// \brief Finds the offset from the base of RD to the vbptr it uses, even if 151 /// it is reusing a vbptr from a non-virtual base. RD must have morally 152 /// virtual bases. 153 CharUnits GetVBPtrOffsetFromBases(const CXXRecordDecl *RD); 154 155 /// \brief Shared code for virtual base adjustment. Returns the offset from 156 /// the vbptr to the virtual base. Optionally returns the address of the 157 /// vbptr itself. 158 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, 159 llvm::Value *Base, 160 llvm::Value *VBPtrOffset, 161 llvm::Value *VBTableOffset, 162 llvm::Value **VBPtr = 0); 163 164 /// \brief Performs a full virtual base adjustment. Used to dereference 165 /// pointers to members of virtual bases. 166 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const CXXRecordDecl *RD, 167 llvm::Value *Base, 168 llvm::Value *VirtualBaseAdjustmentOffset, 169 llvm::Value *VBPtrOffset /* optional */); 170 171 /// \brief Emits a full member pointer with the fields common to data and 172 /// function member pointers. 173 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField, 174 bool IsMemberFunction, 175 const CXXRecordDecl *RD, 176 CharUnits NonVirtualBaseAdjustment); 177 178 llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD, 179 const CXXMethodDecl *MD, 180 CharUnits NonVirtualBaseAdjustment); 181 182 bool MemberPointerConstantIsNull(const MemberPointerType *MPT, 183 llvm::Constant *MP); 184 185 public: 186 virtual llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT); 187 188 virtual bool isZeroInitializable(const MemberPointerType *MPT); 189 190 virtual llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT); 191 192 virtual llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT, 193 CharUnits offset); 194 virtual llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD); 195 virtual llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT); 196 197 virtual llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF, 198 llvm::Value *L, 199 llvm::Value *R, 200 const MemberPointerType *MPT, 201 bool Inequality); 202 203 virtual llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF, 204 llvm::Value *MemPtr, 205 const MemberPointerType *MPT); 206 207 virtual llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF, 208 llvm::Value *Base, 209 llvm::Value *MemPtr, 210 const MemberPointerType *MPT); 211 212 virtual llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF, 213 const CastExpr *E, 214 llvm::Value *Src); 215 216 virtual llvm::Constant *EmitMemberPointerConversion(const CastExpr *E, 217 llvm::Constant *Src); 218 219 virtual llvm::Value * 220 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, 221 llvm::Value *&This, 222 llvm::Value *MemPtr, 223 const MemberPointerType *MPT); 224 225 }; 226 227 } 228 229 llvm::Value *MicrosoftCXXABI::adjustToCompleteObject(CodeGenFunction &CGF, 230 llvm::Value *ptr, 231 QualType type) { 232 // FIXME: implement 233 return ptr; 234 } 235 236 /// \brief Finds the first non-virtual base of RD that has virtual bases. If RD 237 /// doesn't have a vbptr, it will reuse the vbptr of the returned class. 238 static const CXXRecordDecl *FindFirstNVBaseWithVBases(const CXXRecordDecl *RD) { 239 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 240 E = RD->bases_end(); I != E; ++I) { 241 const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl(); 242 if (!I->isVirtual() && Base->getNumVBases() > 0) 243 return Base; 244 } 245 llvm_unreachable("RD must have an nv base with vbases"); 246 } 247 248 CharUnits MicrosoftCXXABI::GetVBPtrOffsetFromBases(const CXXRecordDecl *RD) { 249 assert(RD->getNumVBases()); 250 CharUnits Total = CharUnits::Zero(); 251 while (RD) { 252 const ASTRecordLayout &RDLayout = getContext().getASTRecordLayout(RD); 253 CharUnits VBPtrOffset = RDLayout.getVBPtrOffset(); 254 // -1 is the sentinel for no vbptr. 255 if (VBPtrOffset != CharUnits::fromQuantity(-1)) { 256 Total += VBPtrOffset; 257 break; 258 } 259 RD = FindFirstNVBaseWithVBases(RD); 260 Total += RDLayout.getBaseClassOffset(RD); 261 } 262 return Total; 263 } 264 265 /// \brief Computes the index of BaseClassDecl in the vbtable of ClassDecl. 266 /// BaseClassDecl must be a morally virtual base of ClassDecl. The vbtable is 267 /// an array of i32 offsets. The first entry is a self entry, and the rest are 268 /// offsets from the vbptr to virtual bases. The bases are ordered the same way 269 /// our vbases are ordered: as they appear in a left-to-right depth-first search 270 /// of the hierarchy. 271 static unsigned GetVBTableIndex(const CXXRecordDecl *ClassDecl, 272 const CXXRecordDecl *BaseClassDecl) { 273 unsigned VBTableIndex = 1; // Start with one to skip the self entry. 274 for (CXXRecordDecl::base_class_const_iterator I = ClassDecl->vbases_begin(), 275 E = ClassDecl->vbases_end(); I != E; ++I) { 276 if (I->getType()->getAsCXXRecordDecl() == BaseClassDecl) 277 return VBTableIndex; 278 VBTableIndex++; 279 } 280 llvm_unreachable("BaseClassDecl must be a vbase of ClassDecl"); 281 } 282 283 llvm::Value * 284 MicrosoftCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF, 285 llvm::Value *This, 286 const CXXRecordDecl *ClassDecl, 287 const CXXRecordDecl *BaseClassDecl) { 288 int64_t VBPtrChars = GetVBPtrOffsetFromBases(ClassDecl).getQuantity(); 289 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars); 290 CharUnits IntSize = getContext().getTypeSizeInChars(getContext().IntTy); 291 CharUnits VBTableChars = IntSize * GetVBTableIndex(ClassDecl, BaseClassDecl); 292 llvm::Value *VBTableOffset = 293 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity()); 294 295 llvm::Value *VBPtrToNewBase = 296 GetVBaseOffsetFromVBPtr(CGF, This, VBTableOffset, VBPtrOffset); 297 VBPtrToNewBase = 298 CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy); 299 return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase); 300 } 301 302 bool MicrosoftCXXABI::needThisReturn(GlobalDecl GD) { 303 const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl()); 304 return isa<CXXConstructorDecl>(MD); 305 } 306 307 void MicrosoftCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor, 308 CXXCtorType Type, 309 CanQualType &ResTy, 310 SmallVectorImpl<CanQualType> &ArgTys) { 311 // 'this' is already in place 312 313 // Ctor returns this ptr 314 ResTy = ArgTys[0]; 315 316 const CXXRecordDecl *Class = Ctor->getParent(); 317 if (Class->getNumVBases()) { 318 // Constructors of classes with virtual bases take an implicit parameter. 319 ArgTys.push_back(CGM.getContext().IntTy); 320 } 321 } 322 323 llvm::BasicBlock *MicrosoftCXXABI::EmitCtorCompleteObjectHandler( 324 CodeGenFunction &CGF) { 325 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF); 326 assert(IsMostDerivedClass && 327 "ctor for a class with virtual bases must have an implicit parameter"); 328 llvm::Value *IsCompleteObject 329 = CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object"); 330 331 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases"); 332 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases"); 333 CGF.Builder.CreateCondBr(IsCompleteObject, 334 CallVbaseCtorsBB, SkipVbaseCtorsBB); 335 336 CGF.EmitBlock(CallVbaseCtorsBB); 337 // FIXME: emit vbtables somewhere around here. 338 339 // CGF will put the base ctor calls in this basic block for us later. 340 341 return SkipVbaseCtorsBB; 342 } 343 344 void MicrosoftCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor, 345 CXXDtorType Type, 346 CanQualType &ResTy, 347 SmallVectorImpl<CanQualType> &ArgTys) { 348 // 'this' is already in place 349 // TODO: 'for base' flag 350 351 if (Type == Dtor_Deleting) { 352 // The scalar deleting destructor takes an implicit bool parameter. 353 ArgTys.push_back(CGM.getContext().BoolTy); 354 } 355 } 356 357 static bool IsDeletingDtor(GlobalDecl GD) { 358 const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl()); 359 if (isa<CXXDestructorDecl>(MD)) { 360 return GD.getDtorType() == Dtor_Deleting; 361 } 362 return false; 363 } 364 365 void MicrosoftCXXABI::BuildInstanceFunctionParams(CodeGenFunction &CGF, 366 QualType &ResTy, 367 FunctionArgList &Params) { 368 BuildThisParam(CGF, Params); 369 if (needThisReturn(CGF.CurGD)) { 370 ResTy = Params[0]->getType(); 371 } 372 373 ASTContext &Context = getContext(); 374 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); 375 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) { 376 ImplicitParamDecl *IsMostDerived 377 = ImplicitParamDecl::Create(Context, 0, 378 CGF.CurGD.getDecl()->getLocation(), 379 &Context.Idents.get("is_most_derived"), 380 Context.IntTy); 381 Params.push_back(IsMostDerived); 382 getStructorImplicitParamDecl(CGF) = IsMostDerived; 383 } else if (IsDeletingDtor(CGF.CurGD)) { 384 ImplicitParamDecl *ShouldDelete 385 = ImplicitParamDecl::Create(Context, 0, 386 CGF.CurGD.getDecl()->getLocation(), 387 &Context.Idents.get("should_call_delete"), 388 Context.BoolTy); 389 Params.push_back(ShouldDelete); 390 getStructorImplicitParamDecl(CGF) = ShouldDelete; 391 } 392 } 393 394 void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) { 395 EmitThisParam(CGF); 396 if (needThisReturn(CGF.CurGD)) { 397 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue); 398 } 399 400 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); 401 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) { 402 assert(getStructorImplicitParamDecl(CGF) && 403 "no implicit parameter for a constructor with virtual bases?"); 404 getStructorImplicitParamValue(CGF) 405 = CGF.Builder.CreateLoad( 406 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), 407 "is_most_derived"); 408 } 409 410 if (IsDeletingDtor(CGF.CurGD)) { 411 assert(getStructorImplicitParamDecl(CGF) && 412 "no implicit parameter for a deleting destructor?"); 413 getStructorImplicitParamValue(CGF) 414 = CGF.Builder.CreateLoad( 415 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), 416 "should_call_delete"); 417 } 418 } 419 420 llvm::Value *MicrosoftCXXABI::EmitConstructorCall(CodeGenFunction &CGF, 421 const CXXConstructorDecl *D, 422 CXXCtorType Type, bool ForVirtualBase, 423 bool Delegating, 424 llvm::Value *This, 425 CallExpr::const_arg_iterator ArgBeg, 426 CallExpr::const_arg_iterator ArgEnd) { 427 assert(Type == Ctor_Complete || Type == Ctor_Base); 428 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Ctor_Complete); 429 430 llvm::Value *ImplicitParam = 0; 431 QualType ImplicitParamTy; 432 if (D->getParent()->getNumVBases()) { 433 ImplicitParam = llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete); 434 ImplicitParamTy = getContext().IntTy; 435 } 436 437 // FIXME: Provide a source location here. 438 CGF.EmitCXXMemberCall(D, SourceLocation(), Callee, ReturnValueSlot(), This, 439 ImplicitParam, ImplicitParamTy, 440 ArgBeg, ArgEnd); 441 return Callee; 442 } 443 444 RValue MicrosoftCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF, 445 const CXXDestructorDecl *Dtor, 446 CXXDtorType DtorType, 447 SourceLocation CallLoc, 448 ReturnValueSlot ReturnValue, 449 llvm::Value *This) { 450 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete); 451 452 // We have only one destructor in the vftable but can get both behaviors 453 // by passing an implicit bool parameter. 454 const CGFunctionInfo *FInfo 455 = &CGM.getTypes().arrangeCXXDestructor(Dtor, Dtor_Deleting); 456 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo); 457 llvm::Value *Callee = CGF.BuildVirtualCall(Dtor, Dtor_Deleting, This, Ty); 458 459 ASTContext &Context = CGF.getContext(); 460 llvm::Value *ImplicitParam 461 = llvm::ConstantInt::get(llvm::IntegerType::getInt1Ty(CGF.getLLVMContext()), 462 DtorType == Dtor_Deleting); 463 464 return CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValue, This, 465 ImplicitParam, Context.BoolTy, 0, 0); 466 } 467 468 bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr, 469 QualType elementType) { 470 // Microsoft seems to completely ignore the possibility of a 471 // two-argument usual deallocation function. 472 return elementType.isDestructedType(); 473 } 474 475 bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) { 476 // Microsoft seems to completely ignore the possibility of a 477 // two-argument usual deallocation function. 478 return expr->getAllocatedType().isDestructedType(); 479 } 480 481 CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) { 482 // The array cookie is always a size_t; we then pad that out to the 483 // alignment of the element type. 484 ASTContext &Ctx = getContext(); 485 return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()), 486 Ctx.getTypeAlignInChars(type)); 487 } 488 489 llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, 490 llvm::Value *allocPtr, 491 CharUnits cookieSize) { 492 unsigned AS = allocPtr->getType()->getPointerAddressSpace(); 493 llvm::Value *numElementsPtr = 494 CGF.Builder.CreateBitCast(allocPtr, CGF.SizeTy->getPointerTo(AS)); 495 return CGF.Builder.CreateLoad(numElementsPtr); 496 } 497 498 llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, 499 llvm::Value *newPtr, 500 llvm::Value *numElements, 501 const CXXNewExpr *expr, 502 QualType elementType) { 503 assert(requiresArrayCookie(expr)); 504 505 // The size of the cookie. 506 CharUnits cookieSize = getArrayCookieSizeImpl(elementType); 507 508 // Compute an offset to the cookie. 509 llvm::Value *cookiePtr = newPtr; 510 511 // Write the number of elements into the appropriate slot. 512 unsigned AS = newPtr->getType()->getPointerAddressSpace(); 513 llvm::Value *numElementsPtr 514 = CGF.Builder.CreateBitCast(cookiePtr, CGF.SizeTy->getPointerTo(AS)); 515 CGF.Builder.CreateStore(numElements, numElementsPtr); 516 517 // Finally, compute a pointer to the actual data buffer by skipping 518 // over the cookie completely. 519 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr, 520 cookieSize.getQuantity()); 521 } 522 523 void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, 524 llvm::GlobalVariable *DeclPtr, 525 bool PerformInit) { 526 // FIXME: this code was only tested for global initialization. 527 // Not sure whether we want thread-safe static local variables as VS 528 // doesn't make them thread-safe. 529 530 if (D.getTLSKind()) 531 CGM.ErrorUnsupported(&D, "dynamic TLS initialization"); 532 533 // Emit the initializer and add a global destructor if appropriate. 534 CGF.EmitCXXGlobalVarDeclInit(D, DeclPtr, PerformInit); 535 } 536 537 // Member pointer helpers. 538 static bool hasVBPtrOffsetField(MSInheritanceModel Inheritance) { 539 return Inheritance == MSIM_Unspecified; 540 } 541 542 static bool hasOnlyOneField(bool IsMemberFunction, 543 MSInheritanceModel Inheritance) { 544 return Inheritance <= MSIM_SinglePolymorphic || 545 (!IsMemberFunction && Inheritance <= MSIM_MultiplePolymorphic); 546 } 547 548 // Only member pointers to functions need a this adjustment, since it can be 549 // combined with the field offset for data pointers. 550 static bool hasNonVirtualBaseAdjustmentField(bool IsMemberFunction, 551 MSInheritanceModel Inheritance) { 552 return (IsMemberFunction && Inheritance >= MSIM_Multiple); 553 } 554 555 static bool hasVirtualBaseAdjustmentField(MSInheritanceModel Inheritance) { 556 return Inheritance >= MSIM_Virtual; 557 } 558 559 // Use zero for the field offset of a null data member pointer if we can 560 // guarantee that zero is not a valid field offset, or if the member pointer has 561 // multiple fields. Polymorphic classes have a vfptr at offset zero, so we can 562 // use zero for null. If there are multiple fields, we can use zero even if it 563 // is a valid field offset because null-ness testing will check the other 564 // fields. 565 static bool nullFieldOffsetIsZero(MSInheritanceModel Inheritance) { 566 return Inheritance != MSIM_Multiple && Inheritance != MSIM_Single; 567 } 568 569 bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) { 570 // Null-ness for function memptrs only depends on the first field, which is 571 // the function pointer. The rest don't matter, so we can zero initialize. 572 if (MPT->isMemberFunctionPointer()) 573 return true; 574 575 // The virtual base adjustment field is always -1 for null, so if we have one 576 // we can't zero initialize. The field offset is sometimes also -1 if 0 is a 577 // valid field offset. 578 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl(); 579 MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); 580 return (!hasVirtualBaseAdjustmentField(Inheritance) && 581 nullFieldOffsetIsZero(Inheritance)); 582 } 583 584 llvm::Type * 585 MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) { 586 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl(); 587 MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); 588 llvm::SmallVector<llvm::Type *, 4> fields; 589 if (MPT->isMemberFunctionPointer()) 590 fields.push_back(CGM.VoidPtrTy); // FunctionPointerOrVirtualThunk 591 else 592 fields.push_back(CGM.IntTy); // FieldOffset 593 594 if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(), 595 Inheritance)) 596 fields.push_back(CGM.IntTy); 597 if (hasVBPtrOffsetField(Inheritance)) 598 fields.push_back(CGM.IntTy); 599 if (hasVirtualBaseAdjustmentField(Inheritance)) 600 fields.push_back(CGM.IntTy); // VirtualBaseAdjustmentOffset 601 602 if (fields.size() == 1) 603 return fields[0]; 604 return llvm::StructType::get(CGM.getLLVMContext(), fields); 605 } 606 607 void MicrosoftCXXABI:: 608 GetNullMemberPointerFields(const MemberPointerType *MPT, 609 llvm::SmallVectorImpl<llvm::Constant *> &fields) { 610 assert(fields.empty()); 611 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl(); 612 MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); 613 if (MPT->isMemberFunctionPointer()) { 614 // FunctionPointerOrVirtualThunk 615 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy)); 616 } else { 617 if (nullFieldOffsetIsZero(Inheritance)) 618 fields.push_back(getZeroInt()); // FieldOffset 619 else 620 fields.push_back(getAllOnesInt()); // FieldOffset 621 } 622 623 if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(), 624 Inheritance)) 625 fields.push_back(getZeroInt()); 626 if (hasVBPtrOffsetField(Inheritance)) 627 fields.push_back(getZeroInt()); 628 if (hasVirtualBaseAdjustmentField(Inheritance)) 629 fields.push_back(getAllOnesInt()); 630 } 631 632 llvm::Constant * 633 MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) { 634 llvm::SmallVector<llvm::Constant *, 4> fields; 635 GetNullMemberPointerFields(MPT, fields); 636 if (fields.size() == 1) 637 return fields[0]; 638 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields); 639 assert(Res->getType() == ConvertMemberPointerType(MPT)); 640 return Res; 641 } 642 643 llvm::Constant * 644 MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField, 645 bool IsMemberFunction, 646 const CXXRecordDecl *RD, 647 CharUnits NonVirtualBaseAdjustment) 648 { 649 MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); 650 651 // Single inheritance class member pointer are represented as scalars instead 652 // of aggregates. 653 if (hasOnlyOneField(IsMemberFunction, Inheritance)) 654 return FirstField; 655 656 llvm::SmallVector<llvm::Constant *, 4> fields; 657 fields.push_back(FirstField); 658 659 if (hasNonVirtualBaseAdjustmentField(IsMemberFunction, Inheritance)) 660 fields.push_back(llvm::ConstantInt::get( 661 CGM.IntTy, NonVirtualBaseAdjustment.getQuantity())); 662 663 if (hasVBPtrOffsetField(Inheritance)) { 664 fields.push_back(llvm::ConstantInt::get( 665 CGM.IntTy, GetVBPtrOffsetFromBases(RD).getQuantity())); 666 } 667 668 // The rest of the fields are adjusted by conversions to a more derived class. 669 if (hasVirtualBaseAdjustmentField(Inheritance)) 670 fields.push_back(getZeroInt()); 671 672 return llvm::ConstantStruct::getAnon(fields); 673 } 674 675 llvm::Constant * 676 MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT, 677 CharUnits offset) { 678 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl(); 679 llvm::Constant *FirstField = 680 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity()); 681 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD, 682 CharUnits::Zero()); 683 } 684 685 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) { 686 return BuildMemberPointer(MD->getParent(), MD, CharUnits::Zero()); 687 } 688 689 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP, 690 QualType MPType) { 691 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>(); 692 const ValueDecl *MPD = MP.getMemberPointerDecl(); 693 if (!MPD) 694 return EmitNullMemberPointer(MPT); 695 696 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP); 697 698 // FIXME PR15713: Support virtual inheritance paths. 699 700 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD)) 701 return BuildMemberPointer(MPT->getClass()->getAsCXXRecordDecl(), 702 MD, ThisAdjustment); 703 704 CharUnits FieldOffset = 705 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD)); 706 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset); 707 } 708 709 llvm::Constant * 710 MicrosoftCXXABI::BuildMemberPointer(const CXXRecordDecl *RD, 711 const CXXMethodDecl *MD, 712 CharUnits NonVirtualBaseAdjustment) { 713 assert(MD->isInstance() && "Member function must not be static!"); 714 MD = MD->getCanonicalDecl(); 715 CodeGenTypes &Types = CGM.getTypes(); 716 717 llvm::Constant *FirstField; 718 if (MD->isVirtual()) { 719 // FIXME: We have to instantiate a thunk that loads the vftable and jumps to 720 // the right offset. 721 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy); 722 } else { 723 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>(); 724 llvm::Type *Ty; 725 // Check whether the function has a computable LLVM signature. 726 if (Types.isFuncTypeConvertible(FPT)) { 727 // The function has a computable LLVM signature; use the correct type. 728 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD)); 729 } else { 730 // Use an arbitrary non-function type to tell GetAddrOfFunction that the 731 // function type is incomplete. 732 Ty = CGM.PtrDiffTy; 733 } 734 FirstField = CGM.GetAddrOfFunction(MD, Ty); 735 FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy); 736 } 737 738 // The rest of the fields are common with data member pointers. 739 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD, 740 NonVirtualBaseAdjustment); 741 } 742 743 /// Member pointers are the same if they're either bitwise identical *or* both 744 /// null. Null-ness for function members is determined by the first field, 745 /// while for data member pointers we must compare all fields. 746 llvm::Value * 747 MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF, 748 llvm::Value *L, 749 llvm::Value *R, 750 const MemberPointerType *MPT, 751 bool Inequality) { 752 CGBuilderTy &Builder = CGF.Builder; 753 754 // Handle != comparisons by switching the sense of all boolean operations. 755 llvm::ICmpInst::Predicate Eq; 756 llvm::Instruction::BinaryOps And, Or; 757 if (Inequality) { 758 Eq = llvm::ICmpInst::ICMP_NE; 759 And = llvm::Instruction::Or; 760 Or = llvm::Instruction::And; 761 } else { 762 Eq = llvm::ICmpInst::ICMP_EQ; 763 And = llvm::Instruction::And; 764 Or = llvm::Instruction::Or; 765 } 766 767 // If this is a single field member pointer (single inheritance), this is a 768 // single icmp. 769 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl(); 770 MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); 771 if (hasOnlyOneField(MPT->isMemberFunctionPointer(), Inheritance)) 772 return Builder.CreateICmp(Eq, L, R); 773 774 // Compare the first field. 775 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0"); 776 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0"); 777 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first"); 778 779 // Compare everything other than the first field. 780 llvm::Value *Res = 0; 781 llvm::StructType *LType = cast<llvm::StructType>(L->getType()); 782 for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) { 783 llvm::Value *LF = Builder.CreateExtractValue(L, I); 784 llvm::Value *RF = Builder.CreateExtractValue(R, I); 785 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest"); 786 if (Res) 787 Res = Builder.CreateBinOp(And, Res, Cmp); 788 else 789 Res = Cmp; 790 } 791 792 // Check if the first field is 0 if this is a function pointer. 793 if (MPT->isMemberFunctionPointer()) { 794 // (l1 == r1 && ...) || l0 == 0 795 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType()); 796 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero"); 797 Res = Builder.CreateBinOp(Or, Res, IsZero); 798 } 799 800 // Combine the comparison of the first field, which must always be true for 801 // this comparison to succeeed. 802 return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp"); 803 } 804 805 llvm::Value * 806 MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF, 807 llvm::Value *MemPtr, 808 const MemberPointerType *MPT) { 809 CGBuilderTy &Builder = CGF.Builder; 810 llvm::SmallVector<llvm::Constant *, 4> fields; 811 // We only need one field for member functions. 812 if (MPT->isMemberFunctionPointer()) 813 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy)); 814 else 815 GetNullMemberPointerFields(MPT, fields); 816 assert(!fields.empty()); 817 llvm::Value *FirstField = MemPtr; 818 if (MemPtr->getType()->isStructTy()) 819 FirstField = Builder.CreateExtractValue(MemPtr, 0); 820 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0"); 821 822 // For function member pointers, we only need to test the function pointer 823 // field. The other fields if any can be garbage. 824 if (MPT->isMemberFunctionPointer()) 825 return Res; 826 827 // Otherwise, emit a series of compares and combine the results. 828 for (int I = 1, E = fields.size(); I < E; ++I) { 829 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I); 830 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp"); 831 Res = Builder.CreateAnd(Res, Next, "memptr.tobool"); 832 } 833 return Res; 834 } 835 836 bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT, 837 llvm::Constant *Val) { 838 // Function pointers are null if the pointer in the first field is null. 839 if (MPT->isMemberFunctionPointer()) { 840 llvm::Constant *FirstField = Val->getType()->isStructTy() ? 841 Val->getAggregateElement(0U) : Val; 842 return FirstField->isNullValue(); 843 } 844 845 // If it's not a function pointer and it's zero initializable, we can easily 846 // check zero. 847 if (isZeroInitializable(MPT) && Val->isNullValue()) 848 return true; 849 850 // Otherwise, break down all the fields for comparison. Hopefully these 851 // little Constants are reused, while a big null struct might not be. 852 llvm::SmallVector<llvm::Constant *, 4> Fields; 853 GetNullMemberPointerFields(MPT, Fields); 854 if (Fields.size() == 1) { 855 assert(Val->getType()->isIntegerTy()); 856 return Val == Fields[0]; 857 } 858 859 unsigned I, E; 860 for (I = 0, E = Fields.size(); I != E; ++I) { 861 if (Val->getAggregateElement(I) != Fields[I]) 862 break; 863 } 864 return I == E; 865 } 866 867 llvm::Value * 868 MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, 869 llvm::Value *This, 870 llvm::Value *VBTableOffset, 871 llvm::Value *VBPtrOffset, 872 llvm::Value **VBPtrOut) { 873 CGBuilderTy &Builder = CGF.Builder; 874 // Load the vbtable pointer from the vbptr in the instance. 875 This = Builder.CreateBitCast(This, CGM.Int8PtrTy); 876 llvm::Value *VBPtr = 877 Builder.CreateInBoundsGEP(This, VBPtrOffset, "vbptr"); 878 if (VBPtrOut) *VBPtrOut = VBPtr; 879 VBPtr = Builder.CreateBitCast(VBPtr, CGM.Int8PtrTy->getPointerTo(0)); 880 llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable"); 881 882 // Load an i32 offset from the vb-table. 883 llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableOffset); 884 VBaseOffs = Builder.CreateBitCast(VBaseOffs, CGM.Int32Ty->getPointerTo(0)); 885 return Builder.CreateLoad(VBaseOffs, "vbase_offs"); 886 } 887 888 // Returns an adjusted base cast to i8*, since we do more address arithmetic on 889 // it. 890 llvm::Value * 891 MicrosoftCXXABI::AdjustVirtualBase(CodeGenFunction &CGF, 892 const CXXRecordDecl *RD, llvm::Value *Base, 893 llvm::Value *VBTableOffset, 894 llvm::Value *VBPtrOffset) { 895 CGBuilderTy &Builder = CGF.Builder; 896 Base = Builder.CreateBitCast(Base, CGM.Int8PtrTy); 897 llvm::BasicBlock *OriginalBB = 0; 898 llvm::BasicBlock *SkipAdjustBB = 0; 899 llvm::BasicBlock *VBaseAdjustBB = 0; 900 901 // In the unspecified inheritance model, there might not be a vbtable at all, 902 // in which case we need to skip the virtual base lookup. If there is a 903 // vbtable, the first entry is a no-op entry that gives back the original 904 // base, so look for a virtual base adjustment offset of zero. 905 if (VBPtrOffset) { 906 OriginalBB = Builder.GetInsertBlock(); 907 VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust"); 908 SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust"); 909 llvm::Value *IsVirtual = 910 Builder.CreateICmpNE(VBTableOffset, getZeroInt(), 911 "memptr.is_vbase"); 912 Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB); 913 CGF.EmitBlock(VBaseAdjustBB); 914 } 915 916 // If we weren't given a dynamic vbptr offset, RD should be complete and we'll 917 // know the vbptr offset. 918 if (!VBPtrOffset) { 919 CharUnits offs = CharUnits::Zero(); 920 if (RD->getNumVBases()) { 921 offs = GetVBPtrOffsetFromBases(RD); 922 } 923 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity()); 924 } 925 llvm::Value *VBPtr = 0; 926 llvm::Value *VBaseOffs = 927 GetVBaseOffsetFromVBPtr(CGF, Base, VBTableOffset, VBPtrOffset, &VBPtr); 928 llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs); 929 930 // Merge control flow with the case where we didn't have to adjust. 931 if (VBaseAdjustBB) { 932 Builder.CreateBr(SkipAdjustBB); 933 CGF.EmitBlock(SkipAdjustBB); 934 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base"); 935 Phi->addIncoming(Base, OriginalBB); 936 Phi->addIncoming(AdjustedBase, VBaseAdjustBB); 937 return Phi; 938 } 939 return AdjustedBase; 940 } 941 942 llvm::Value * 943 MicrosoftCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF, 944 llvm::Value *Base, 945 llvm::Value *MemPtr, 946 const MemberPointerType *MPT) { 947 assert(MPT->isMemberDataPointer()); 948 unsigned AS = Base->getType()->getPointerAddressSpace(); 949 llvm::Type *PType = 950 CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS); 951 CGBuilderTy &Builder = CGF.Builder; 952 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl(); 953 MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); 954 955 // Extract the fields we need, regardless of model. We'll apply them if we 956 // have them. 957 llvm::Value *FieldOffset = MemPtr; 958 llvm::Value *VirtualBaseAdjustmentOffset = 0; 959 llvm::Value *VBPtrOffset = 0; 960 if (MemPtr->getType()->isStructTy()) { 961 // We need to extract values. 962 unsigned I = 0; 963 FieldOffset = Builder.CreateExtractValue(MemPtr, I++); 964 if (hasVBPtrOffsetField(Inheritance)) 965 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++); 966 if (hasVirtualBaseAdjustmentField(Inheritance)) 967 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++); 968 } 969 970 if (VirtualBaseAdjustmentOffset) { 971 Base = AdjustVirtualBase(CGF, RD, Base, VirtualBaseAdjustmentOffset, 972 VBPtrOffset); 973 } 974 llvm::Value *Addr = 975 Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset"); 976 977 // Cast the address to the appropriate pointer type, adopting the address 978 // space of the base pointer. 979 return Builder.CreateBitCast(Addr, PType); 980 } 981 982 static MSInheritanceModel 983 getInheritanceFromMemptr(const MemberPointerType *MPT) { 984 return MPT->getClass()->getAsCXXRecordDecl()->getMSInheritanceModel(); 985 } 986 987 llvm::Value * 988 MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF, 989 const CastExpr *E, 990 llvm::Value *Src) { 991 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer || 992 E->getCastKind() == CK_BaseToDerivedMemberPointer || 993 E->getCastKind() == CK_ReinterpretMemberPointer); 994 995 // Use constant emission if we can. 996 if (isa<llvm::Constant>(Src)) 997 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src)); 998 999 // We may be adding or dropping fields from the member pointer, so we need 1000 // both types and the inheritance models of both records. 1001 const MemberPointerType *SrcTy = 1002 E->getSubExpr()->getType()->castAs<MemberPointerType>(); 1003 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>(); 1004 MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy); 1005 MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy); 1006 bool IsFunc = SrcTy->isMemberFunctionPointer(); 1007 1008 // If the classes use the same null representation, reinterpret_cast is a nop. 1009 bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer; 1010 if (IsReinterpret && (IsFunc || 1011 nullFieldOffsetIsZero(SrcInheritance) == 1012 nullFieldOffsetIsZero(DstInheritance))) 1013 return Src; 1014 1015 CGBuilderTy &Builder = CGF.Builder; 1016 1017 // Branch past the conversion if Src is null. 1018 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy); 1019 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy); 1020 1021 // C++ 5.2.10p9: The null member pointer value is converted to the null member 1022 // pointer value of the destination type. 1023 if (IsReinterpret) { 1024 // For reinterpret casts, sema ensures that src and dst are both functions 1025 // or data and have the same size, which means the LLVM types should match. 1026 assert(Src->getType() == DstNull->getType()); 1027 return Builder.CreateSelect(IsNotNull, Src, DstNull); 1028 } 1029 1030 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock(); 1031 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert"); 1032 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted"); 1033 Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB); 1034 CGF.EmitBlock(ConvertBB); 1035 1036 // Decompose src. 1037 llvm::Value *FirstField = Src; 1038 llvm::Value *NonVirtualBaseAdjustment = 0; 1039 llvm::Value *VirtualBaseAdjustmentOffset = 0; 1040 llvm::Value *VBPtrOffset = 0; 1041 if (!hasOnlyOneField(IsFunc, SrcInheritance)) { 1042 // We need to extract values. 1043 unsigned I = 0; 1044 FirstField = Builder.CreateExtractValue(Src, I++); 1045 if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance)) 1046 NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++); 1047 if (hasVBPtrOffsetField(SrcInheritance)) 1048 VBPtrOffset = Builder.CreateExtractValue(Src, I++); 1049 if (hasVirtualBaseAdjustmentField(SrcInheritance)) 1050 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++); 1051 } 1052 1053 // For data pointers, we adjust the field offset directly. For functions, we 1054 // have a separate field. 1055 llvm::Constant *Adj = getMemberPointerAdjustment(E); 1056 if (Adj) { 1057 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy); 1058 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField; 1059 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer); 1060 if (!NVAdjustField) // If this field didn't exist in src, it's zero. 1061 NVAdjustField = getZeroInt(); 1062 if (isDerivedToBase) 1063 NVAdjustField = Builder.CreateNSWSub(NVAdjustField, Adj, "adj"); 1064 else 1065 NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, Adj, "adj"); 1066 } 1067 1068 // FIXME PR15713: Support conversions through virtually derived classes. 1069 1070 // Recompose dst from the null struct and the adjusted fields from src. 1071 llvm::Value *Dst; 1072 if (hasOnlyOneField(IsFunc, DstInheritance)) { 1073 Dst = FirstField; 1074 } else { 1075 Dst = llvm::UndefValue::get(DstNull->getType()); 1076 unsigned Idx = 0; 1077 Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++); 1078 if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance)) 1079 Dst = Builder.CreateInsertValue( 1080 Dst, getValueOrZeroInt(NonVirtualBaseAdjustment), Idx++); 1081 if (hasVBPtrOffsetField(DstInheritance)) 1082 Dst = Builder.CreateInsertValue( 1083 Dst, getValueOrZeroInt(VBPtrOffset), Idx++); 1084 if (hasVirtualBaseAdjustmentField(DstInheritance)) 1085 Dst = Builder.CreateInsertValue( 1086 Dst, getValueOrZeroInt(VirtualBaseAdjustmentOffset), Idx++); 1087 } 1088 Builder.CreateBr(ContinueBB); 1089 1090 // In the continuation, choose between DstNull and Dst. 1091 CGF.EmitBlock(ContinueBB); 1092 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted"); 1093 Phi->addIncoming(DstNull, OriginalBB); 1094 Phi->addIncoming(Dst, ConvertBB); 1095 return Phi; 1096 } 1097 1098 llvm::Constant * 1099 MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E, 1100 llvm::Constant *Src) { 1101 const MemberPointerType *SrcTy = 1102 E->getSubExpr()->getType()->castAs<MemberPointerType>(); 1103 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>(); 1104 1105 // If src is null, emit a new null for dst. We can't return src because dst 1106 // might have a new representation. 1107 if (MemberPointerConstantIsNull(SrcTy, Src)) 1108 return EmitNullMemberPointer(DstTy); 1109 1110 // We don't need to do anything for reinterpret_casts of non-null member 1111 // pointers. We should only get here when the two type representations have 1112 // the same size. 1113 if (E->getCastKind() == CK_ReinterpretMemberPointer) 1114 return Src; 1115 1116 MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy); 1117 MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy); 1118 1119 // Decompose src. 1120 llvm::Constant *FirstField = Src; 1121 llvm::Constant *NonVirtualBaseAdjustment = 0; 1122 llvm::Constant *VirtualBaseAdjustmentOffset = 0; 1123 llvm::Constant *VBPtrOffset = 0; 1124 bool IsFunc = SrcTy->isMemberFunctionPointer(); 1125 if (!hasOnlyOneField(IsFunc, SrcInheritance)) { 1126 // We need to extract values. 1127 unsigned I = 0; 1128 FirstField = Src->getAggregateElement(I++); 1129 if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance)) 1130 NonVirtualBaseAdjustment = Src->getAggregateElement(I++); 1131 if (hasVBPtrOffsetField(SrcInheritance)) 1132 VBPtrOffset = Src->getAggregateElement(I++); 1133 if (hasVirtualBaseAdjustmentField(SrcInheritance)) 1134 VirtualBaseAdjustmentOffset = Src->getAggregateElement(I++); 1135 } 1136 1137 // For data pointers, we adjust the field offset directly. For functions, we 1138 // have a separate field. 1139 llvm::Constant *Adj = getMemberPointerAdjustment(E); 1140 if (Adj) { 1141 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy); 1142 llvm::Constant *&NVAdjustField = 1143 IsFunc ? NonVirtualBaseAdjustment : FirstField; 1144 bool IsDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer); 1145 if (!NVAdjustField) // If this field didn't exist in src, it's zero. 1146 NVAdjustField = getZeroInt(); 1147 if (IsDerivedToBase) 1148 NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj); 1149 else 1150 NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj); 1151 } 1152 1153 // FIXME PR15713: Support conversions through virtually derived classes. 1154 1155 // Recompose dst from the null struct and the adjusted fields from src. 1156 if (hasOnlyOneField(IsFunc, DstInheritance)) 1157 return FirstField; 1158 1159 llvm::SmallVector<llvm::Constant *, 4> Fields; 1160 Fields.push_back(FirstField); 1161 if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance)) 1162 Fields.push_back(getConstantOrZeroInt(NonVirtualBaseAdjustment)); 1163 if (hasVBPtrOffsetField(DstInheritance)) 1164 Fields.push_back(getConstantOrZeroInt(VBPtrOffset)); 1165 if (hasVirtualBaseAdjustmentField(DstInheritance)) 1166 Fields.push_back(getConstantOrZeroInt(VirtualBaseAdjustmentOffset)); 1167 return llvm::ConstantStruct::getAnon(Fields); 1168 } 1169 1170 llvm::Value * 1171 MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, 1172 llvm::Value *&This, 1173 llvm::Value *MemPtr, 1174 const MemberPointerType *MPT) { 1175 assert(MPT->isMemberFunctionPointer()); 1176 const FunctionProtoType *FPT = 1177 MPT->getPointeeType()->castAs<FunctionProtoType>(); 1178 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl(); 1179 llvm::FunctionType *FTy = 1180 CGM.getTypes().GetFunctionType( 1181 CGM.getTypes().arrangeCXXMethodType(RD, FPT)); 1182 CGBuilderTy &Builder = CGF.Builder; 1183 1184 MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); 1185 1186 // Extract the fields we need, regardless of model. We'll apply them if we 1187 // have them. 1188 llvm::Value *FunctionPointer = MemPtr; 1189 llvm::Value *NonVirtualBaseAdjustment = NULL; 1190 llvm::Value *VirtualBaseAdjustmentOffset = NULL; 1191 llvm::Value *VBPtrOffset = NULL; 1192 if (MemPtr->getType()->isStructTy()) { 1193 // We need to extract values. 1194 unsigned I = 0; 1195 FunctionPointer = Builder.CreateExtractValue(MemPtr, I++); 1196 if (hasNonVirtualBaseAdjustmentField(MPT, Inheritance)) 1197 NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++); 1198 if (hasVBPtrOffsetField(Inheritance)) 1199 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++); 1200 if (hasVirtualBaseAdjustmentField(Inheritance)) 1201 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++); 1202 } 1203 1204 if (VirtualBaseAdjustmentOffset) { 1205 This = AdjustVirtualBase(CGF, RD, This, VirtualBaseAdjustmentOffset, 1206 VBPtrOffset); 1207 } 1208 1209 if (NonVirtualBaseAdjustment) { 1210 // Apply the adjustment and cast back to the original struct type. 1211 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy()); 1212 Ptr = Builder.CreateInBoundsGEP(Ptr, NonVirtualBaseAdjustment); 1213 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted"); 1214 } 1215 1216 return Builder.CreateBitCast(FunctionPointer, FTy->getPointerTo()); 1217 } 1218 1219 CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) { 1220 return new MicrosoftCXXABI(CGM); 1221 } 1222 1223