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