ItaniumCXXABI.cpp revision 2de56d1d0c3a504ad1529de2677628bdfbb95cd4
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 targetting 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 "CodeGenFunction.h" 24#include "CodeGenModule.h" 25#include "Mangle.h" 26#include <clang/AST/Type.h> 27#include <llvm/Target/TargetData.h> 28#include <llvm/Value.h> 29 30using namespace clang; 31using namespace CodeGen; 32 33namespace { 34class ItaniumCXXABI : public CodeGen::CGCXXABI { 35private: 36 const llvm::IntegerType *PtrDiffTy; 37protected: 38 CodeGen::MangleContext MangleCtx; 39 bool IsARM; 40 41 // It's a little silly for us to cache this. 42 const llvm::IntegerType *getPtrDiffTy() { 43 if (!PtrDiffTy) { 44 QualType T = CGM.getContext().getPointerDiffType(); 45 const llvm::Type *Ty = CGM.getTypes().ConvertTypeRecursive(T); 46 PtrDiffTy = cast<llvm::IntegerType>(Ty); 47 } 48 return PtrDiffTy; 49 } 50 51public: 52 ItaniumCXXABI(CodeGen::CodeGenModule &CGM, bool IsARM = false) : 53 CGCXXABI(CGM), PtrDiffTy(0), MangleCtx(CGM.getContext(), CGM.getDiags()), 54 IsARM(IsARM) { } 55 56 CodeGen::MangleContext &getMangleContext() { 57 return MangleCtx; 58 } 59 60 bool isZeroInitializable(const MemberPointerType *MPT); 61 62 const llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT); 63 64 llvm::Value *EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, 65 llvm::Value *&This, 66 llvm::Value *MemFnPtr, 67 const MemberPointerType *MPT); 68 69 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF, 70 const CastExpr *E, 71 llvm::Value *Src); 72 73 llvm::Constant *EmitMemberPointerConversion(llvm::Constant *C, 74 const CastExpr *E); 75 76 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT); 77 78 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD); 79 llvm::Constant *EmitMemberPointer(const FieldDecl *FD); 80 81 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF, 82 llvm::Value *L, 83 llvm::Value *R, 84 const MemberPointerType *MPT, 85 bool Inequality); 86 87 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF, 88 llvm::Value *Addr, 89 const MemberPointerType *MPT); 90}; 91 92class ARMCXXABI : public ItaniumCXXABI { 93public: 94 ARMCXXABI(CodeGen::CodeGenModule &CGM) : ItaniumCXXABI(CGM, /*ARM*/ true) {} 95}; 96} 97 98CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) { 99 return new ItaniumCXXABI(CGM); 100} 101 102CodeGen::CGCXXABI *CodeGen::CreateARMCXXABI(CodeGenModule &CGM) { 103 return new ARMCXXABI(CGM); 104} 105 106const llvm::Type * 107ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) { 108 if (MPT->isMemberDataPointer()) 109 return getPtrDiffTy(); 110 else 111 return llvm::StructType::get(CGM.getLLVMContext(), 112 getPtrDiffTy(), getPtrDiffTy(), NULL); 113} 114 115/// In the Itanium and ARM ABIs, method pointers have the form: 116/// struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr; 117/// 118/// In the Itanium ABI: 119/// - method pointers are virtual if (memptr.ptr & 1) is nonzero 120/// - the this-adjustment is (memptr.adj) 121/// - the virtual offset is (memptr.ptr - 1) 122/// 123/// In the ARM ABI: 124/// - method pointers are virtual if (memptr.adj & 1) is nonzero 125/// - the this-adjustment is (memptr.adj >> 1) 126/// - the virtual offset is (memptr.ptr) 127/// ARM uses 'adj' for the virtual flag because Thumb functions 128/// may be only single-byte aligned. 129/// 130/// If the member is virtual, the adjusted 'this' pointer points 131/// to a vtable pointer from which the virtual offset is applied. 132/// 133/// If the member is non-virtual, memptr.ptr is the address of 134/// the function to call. 135llvm::Value * 136ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, 137 llvm::Value *&This, 138 llvm::Value *MemFnPtr, 139 const MemberPointerType *MPT) { 140 CGBuilderTy &Builder = CGF.Builder; 141 142 const FunctionProtoType *FPT = 143 MPT->getPointeeType()->getAs<FunctionProtoType>(); 144 const CXXRecordDecl *RD = 145 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl()); 146 147 const llvm::FunctionType *FTy = 148 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT), 149 FPT->isVariadic()); 150 151 const llvm::IntegerType *ptrdiff = getPtrDiffTy(); 152 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(ptrdiff, 1); 153 154 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual"); 155 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual"); 156 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end"); 157 158 // Extract memptr.adj, which is in the second field. 159 llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj"); 160 161 // Compute the true adjustment. 162 llvm::Value *Adj = RawAdj; 163 if (IsARM) 164 Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted"); 165 166 // Apply the adjustment and cast back to the original struct type 167 // for consistency. 168 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy()); 169 Ptr = Builder.CreateInBoundsGEP(Ptr, Adj); 170 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted"); 171 172 // Load the function pointer. 173 llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr"); 174 175 // If the LSB in the function pointer is 1, the function pointer points to 176 // a virtual function. 177 llvm::Value *IsVirtual; 178 if (IsARM) 179 IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1); 180 else 181 IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1); 182 IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual"); 183 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual); 184 185 // In the virtual path, the adjustment left 'This' pointing to the 186 // vtable of the correct base subobject. The "function pointer" is an 187 // offset within the vtable (+1 for the virtual flag on non-ARM). 188 CGF.EmitBlock(FnVirtual); 189 190 // Cast the adjusted this to a pointer to vtable pointer and load. 191 const llvm::Type *VTableTy = Builder.getInt8PtrTy(); 192 llvm::Value *VTable = Builder.CreateBitCast(This, VTableTy->getPointerTo()); 193 VTable = Builder.CreateLoad(VTable, "memptr.vtable"); 194 195 // Apply the offset. 196 llvm::Value *VTableOffset = FnAsInt; 197 if (!IsARM) VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1); 198 VTable = Builder.CreateGEP(VTable, VTableOffset); 199 200 // Load the virtual function to call. 201 VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo()); 202 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn"); 203 CGF.EmitBranch(FnEnd); 204 205 // In the non-virtual path, the function pointer is actually a 206 // function pointer. 207 CGF.EmitBlock(FnNonVirtual); 208 llvm::Value *NonVirtualFn = 209 Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn"); 210 211 // We're done. 212 CGF.EmitBlock(FnEnd); 213 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo()); 214 Callee->reserveOperandSpace(2); 215 Callee->addIncoming(VirtualFn, FnVirtual); 216 Callee->addIncoming(NonVirtualFn, FnNonVirtual); 217 return Callee; 218} 219 220/// Perform a derived-to-base or base-to-derived member pointer conversion. 221/// 222/// Obligatory offset/adjustment diagram: 223/// <-- offset --> <-- adjustment --> 224/// |--------------------------|----------------------|--------------------| 225/// ^Derived address point ^Base address point ^Member address point 226/// 227/// So when converting a base member pointer to a derived member pointer, 228/// we add the offset to the adjustment because the address point has 229/// decreased; and conversely, when converting a derived MP to a base MP 230/// we subtract the offset from the adjustment because the address point 231/// has increased. 232/// 233/// The standard forbids (at compile time) conversion to and from 234/// virtual bases, which is why we don't have to consider them here. 235/// 236/// The standard forbids (at run time) casting a derived MP to a base 237/// MP when the derived MP does not point to a member of the base. 238/// This is why -1 is a reasonable choice for null data member 239/// pointers. 240llvm::Value * 241ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF, 242 const CastExpr *E, 243 llvm::Value *Src) { 244 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer || 245 E->getCastKind() == CK_BaseToDerivedMemberPointer); 246 247 if (isa<llvm::Constant>(Src)) 248 return EmitMemberPointerConversion(cast<llvm::Constant>(Src), E); 249 250 CGBuilderTy &Builder = CGF.Builder; 251 252 const MemberPointerType *SrcTy = 253 E->getSubExpr()->getType()->getAs<MemberPointerType>(); 254 const MemberPointerType *DestTy = E->getType()->getAs<MemberPointerType>(); 255 256 const CXXRecordDecl *SrcDecl = SrcTy->getClass()->getAsCXXRecordDecl(); 257 const CXXRecordDecl *DestDecl = DestTy->getClass()->getAsCXXRecordDecl(); 258 259 bool DerivedToBase = 260 E->getCastKind() == CK_DerivedToBaseMemberPointer; 261 262 const CXXRecordDecl *BaseDecl, *DerivedDecl; 263 if (DerivedToBase) 264 DerivedDecl = SrcDecl, BaseDecl = DestDecl; 265 else 266 BaseDecl = SrcDecl, DerivedDecl = DestDecl; 267 268 llvm::Constant *Adj = 269 CGF.CGM.GetNonVirtualBaseClassOffset(DerivedDecl, 270 E->path_begin(), 271 E->path_end()); 272 if (!Adj) return Src; 273 274 // For member data pointers, this is just a matter of adding the 275 // offset if the source is non-null. 276 if (SrcTy->isMemberDataPointer()) { 277 llvm::Value *Dst; 278 if (DerivedToBase) 279 Dst = Builder.CreateNSWSub(Src, Adj, "adj"); 280 else 281 Dst = Builder.CreateNSWAdd(Src, Adj, "adj"); 282 283 // Null check. 284 llvm::Value *Null = llvm::Constant::getAllOnesValue(Src->getType()); 285 llvm::Value *IsNull = Builder.CreateICmpEQ(Src, Null, "memptr.isnull"); 286 return Builder.CreateSelect(IsNull, Src, Dst); 287 } 288 289 // The this-adjustment is left-shifted by 1 on ARM. 290 if (IsARM) { 291 uint64_t Offset = cast<llvm::ConstantInt>(Adj)->getZExtValue(); 292 Offset <<= 1; 293 Adj = llvm::ConstantInt::get(Adj->getType(), Offset); 294 } 295 296 llvm::Value *SrcAdj = Builder.CreateExtractValue(Src, 1, "src.adj"); 297 llvm::Value *DstAdj; 298 if (DerivedToBase) 299 DstAdj = Builder.CreateNSWSub(SrcAdj, Adj, "adj"); 300 else 301 DstAdj = Builder.CreateNSWAdd(SrcAdj, Adj, "adj"); 302 303 return Builder.CreateInsertValue(Src, DstAdj, 1); 304} 305 306llvm::Constant * 307ItaniumCXXABI::EmitMemberPointerConversion(llvm::Constant *C, 308 const CastExpr *E) { 309 const MemberPointerType *SrcTy = 310 E->getSubExpr()->getType()->getAs<MemberPointerType>(); 311 const MemberPointerType *DestTy = 312 E->getType()->getAs<MemberPointerType>(); 313 314 bool DerivedToBase = 315 E->getCastKind() == CK_DerivedToBaseMemberPointer; 316 317 const CXXRecordDecl *DerivedDecl; 318 if (DerivedToBase) 319 DerivedDecl = SrcTy->getClass()->getAsCXXRecordDecl(); 320 else 321 DerivedDecl = DestTy->getClass()->getAsCXXRecordDecl(); 322 323 // Calculate the offset to the base class. 324 llvm::Constant *Offset = 325 CGM.GetNonVirtualBaseClassOffset(DerivedDecl, 326 E->path_begin(), 327 E->path_end()); 328 // If there's no offset, we're done. 329 if (!Offset) return C; 330 331 // If the source is a member data pointer, we have to do a null 332 // check and then add the offset. In the common case, we can fold 333 // away the offset. 334 if (SrcTy->isMemberDataPointer()) { 335 assert(C->getType() == getPtrDiffTy()); 336 337 // If it's a constant int, just create a new constant int. 338 if (llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C)) { 339 int64_t Src = CI->getSExtValue(); 340 341 // Null converts to null. 342 if (Src == -1) return CI; 343 344 // Otherwise, just add the offset. 345 int64_t OffsetV = cast<llvm::ConstantInt>(Offset)->getSExtValue(); 346 int64_t Dst = (DerivedToBase ? Src - OffsetV : Src + OffsetV); 347 return llvm::ConstantInt::get(CI->getType(), Dst, /*signed*/ true); 348 } 349 350 // Otherwise, we have to form a constant select expression. 351 llvm::Constant *Null = llvm::Constant::getAllOnesValue(C->getType()); 352 353 llvm::Constant *IsNull = 354 llvm::ConstantExpr::getICmp(llvm::ICmpInst::ICMP_EQ, C, Null); 355 356 llvm::Constant *Dst; 357 if (DerivedToBase) 358 Dst = llvm::ConstantExpr::getNSWSub(C, Offset); 359 else 360 Dst = llvm::ConstantExpr::getNSWAdd(C, Offset); 361 362 return llvm::ConstantExpr::getSelect(IsNull, Null, Dst); 363 } 364 365 // The this-adjustment is left-shifted by 1 on ARM. 366 if (IsARM) { 367 int64_t OffsetV = cast<llvm::ConstantInt>(Offset)->getSExtValue(); 368 OffsetV <<= 1; 369 Offset = llvm::ConstantInt::get(Offset->getType(), OffsetV); 370 } 371 372 llvm::ConstantStruct *CS = cast<llvm::ConstantStruct>(C); 373 374 llvm::Constant *Values[2] = { CS->getOperand(0), 0 }; 375 if (DerivedToBase) 376 Values[1] = llvm::ConstantExpr::getSub(CS->getOperand(1), Offset); 377 else 378 Values[1] = llvm::ConstantExpr::getAdd(CS->getOperand(1), Offset); 379 380 return llvm::ConstantStruct::get(CGM.getLLVMContext(), Values, 2, 381 /*Packed=*/false); 382} 383 384 385llvm::Constant * 386ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) { 387 const llvm::Type *ptrdiff_t = getPtrDiffTy(); 388 389 // Itanium C++ ABI 2.3: 390 // A NULL pointer is represented as -1. 391 if (MPT->isMemberDataPointer()) 392 return llvm::ConstantInt::get(ptrdiff_t, -1ULL, /*isSigned=*/true); 393 394 llvm::Constant *Zero = llvm::ConstantInt::get(ptrdiff_t, 0); 395 llvm::Constant *Values[2] = { Zero, Zero }; 396 return llvm::ConstantStruct::get(CGM.getLLVMContext(), Values, 2, 397 /*Packed=*/false); 398} 399 400llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const FieldDecl *FD) { 401 // Itanium C++ ABI 2.3: 402 // A pointer to data member is an offset from the base address of 403 // the class object containing it, represented as a ptrdiff_t 404 405 QualType ClassType = CGM.getContext().getTypeDeclType(FD->getParent()); 406 const llvm::StructType *ClassLTy = 407 cast<llvm::StructType>(CGM.getTypes().ConvertType(ClassType)); 408 409 const CGRecordLayout &RL = CGM.getTypes().getCGRecordLayout(FD->getParent()); 410 unsigned FieldNo = RL.getLLVMFieldNo(FD); 411 uint64_t Offset = 412 CGM.getTargetData().getStructLayout(ClassLTy)->getElementOffset(FieldNo); 413 414 return llvm::ConstantInt::get(getPtrDiffTy(), Offset); 415} 416 417llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) { 418 assert(MD->isInstance() && "Member function must not be static!"); 419 MD = MD->getCanonicalDecl(); 420 421 CodeGenTypes &Types = CGM.getTypes(); 422 const llvm::Type *ptrdiff_t = getPtrDiffTy(); 423 424 // Get the function pointer (or index if this is a virtual function). 425 llvm::Constant *MemPtr[2]; 426 if (MD->isVirtual()) { 427 uint64_t Index = CGM.getVTables().getMethodVTableIndex(MD); 428 429 // FIXME: We shouldn't use / 8 here. 430 uint64_t PointerWidthInBytes = 431 CGM.getContext().Target.getPointerWidth(0) / 8; 432 uint64_t VTableOffset = (Index * PointerWidthInBytes); 433 434 if (IsARM) { 435 // ARM C++ ABI 3.2.1: 436 // This ABI specifies that adj contains twice the this 437 // adjustment, plus 1 if the member function is virtual. The 438 // least significant bit of adj then makes exactly the same 439 // discrimination as the least significant bit of ptr does for 440 // Itanium. 441 MemPtr[0] = llvm::ConstantInt::get(ptrdiff_t, VTableOffset); 442 MemPtr[1] = llvm::ConstantInt::get(ptrdiff_t, 1); 443 } else { 444 // Itanium C++ ABI 2.3: 445 // For a virtual function, [the pointer field] is 1 plus the 446 // virtual table offset (in bytes) of the function, 447 // represented as a ptrdiff_t. 448 MemPtr[0] = llvm::ConstantInt::get(ptrdiff_t, VTableOffset + 1); 449 MemPtr[1] = llvm::ConstantInt::get(ptrdiff_t, 0); 450 } 451 } else { 452 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); 453 const llvm::Type *Ty; 454 // Check whether the function has a computable LLVM signature. 455 if (!CodeGenTypes::VerifyFuncTypeComplete(FPT)) { 456 // The function has a computable LLVM signature; use the correct type. 457 Ty = Types.GetFunctionType(Types.getFunctionInfo(MD), FPT->isVariadic()); 458 } else { 459 // Use an arbitrary non-function type to tell GetAddrOfFunction that the 460 // function type is incomplete. 461 Ty = ptrdiff_t; 462 } 463 464 llvm::Constant *Addr = CGM.GetAddrOfFunction(MD, Ty); 465 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(Addr, ptrdiff_t); 466 MemPtr[1] = llvm::ConstantInt::get(ptrdiff_t, 0); 467 } 468 469 return llvm::ConstantStruct::get(CGM.getLLVMContext(), 470 MemPtr, 2, /*Packed=*/false); 471} 472 473/// The comparison algorithm is pretty easy: the member pointers are 474/// the same if they're either bitwise identical *or* both null. 475/// 476/// ARM is different here only because null-ness is more complicated. 477llvm::Value * 478ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF, 479 llvm::Value *L, 480 llvm::Value *R, 481 const MemberPointerType *MPT, 482 bool Inequality) { 483 CGBuilderTy &Builder = CGF.Builder; 484 485 llvm::ICmpInst::Predicate Eq; 486 llvm::Instruction::BinaryOps And, Or; 487 if (Inequality) { 488 Eq = llvm::ICmpInst::ICMP_NE; 489 And = llvm::Instruction::Or; 490 Or = llvm::Instruction::And; 491 } else { 492 Eq = llvm::ICmpInst::ICMP_EQ; 493 And = llvm::Instruction::And; 494 Or = llvm::Instruction::Or; 495 } 496 497 // Member data pointers are easy because there's a unique null 498 // value, so it just comes down to bitwise equality. 499 if (MPT->isMemberDataPointer()) 500 return Builder.CreateICmp(Eq, L, R); 501 502 // For member function pointers, the tautologies are more complex. 503 // The Itanium tautology is: 504 // (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj)) 505 // The ARM tautology is: 506 // (L == R) <==> (L.ptr == R.ptr && 507 // (L.adj == R.adj || 508 // (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0))) 509 // The inequality tautologies have exactly the same structure, except 510 // applying De Morgan's laws. 511 512 llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr"); 513 llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr"); 514 515 // This condition tests whether L.ptr == R.ptr. This must always be 516 // true for equality to hold. 517 llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr"); 518 519 // This condition, together with the assumption that L.ptr == R.ptr, 520 // tests whether the pointers are both null. ARM imposes an extra 521 // condition. 522 llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType()); 523 llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null"); 524 525 // This condition tests whether L.adj == R.adj. If this isn't 526 // true, the pointers are unequal unless they're both null. 527 llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj"); 528 llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj"); 529 llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj"); 530 531 // Null member function pointers on ARM clear the low bit of Adj, 532 // so the zero condition has to check that neither low bit is set. 533 if (IsARM) { 534 llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1); 535 536 // Compute (l.adj | r.adj) & 1 and test it against zero. 537 llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj"); 538 llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One); 539 llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero, 540 "cmp.or.adj"); 541 EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero); 542 } 543 544 // Tie together all our conditions. 545 llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq); 546 Result = Builder.CreateBinOp(And, PtrEq, Result, 547 Inequality ? "memptr.ne" : "memptr.eq"); 548 return Result; 549} 550 551llvm::Value * 552ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF, 553 llvm::Value *MemPtr, 554 const MemberPointerType *MPT) { 555 CGBuilderTy &Builder = CGF.Builder; 556 557 /// For member data pointers, this is just a check against -1. 558 if (MPT->isMemberDataPointer()) { 559 assert(MemPtr->getType() == getPtrDiffTy()); 560 llvm::Value *NegativeOne = 561 llvm::Constant::getAllOnesValue(MemPtr->getType()); 562 return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool"); 563 } 564 565 // In Itanium, a member function pointer is null if 'ptr' is null. 566 llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr"); 567 568 llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0); 569 llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool"); 570 571 // In ARM, it's that, plus the low bit of 'adj' must be zero. 572 if (IsARM) { 573 llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1); 574 llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj"); 575 llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit"); 576 llvm::Value *IsNotVirtual = Builder.CreateICmpEQ(VirtualBit, Zero, 577 "memptr.notvirtual"); 578 Result = Builder.CreateAnd(Result, IsNotVirtual); 579 } 580 581 return Result; 582} 583 584/// The Itanium ABI requires non-zero initialization only for data 585/// member pointers, for which '0' is a valid offset. 586bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) { 587 return MPT->getPointeeType()->isFunctionType(); 588} 589