diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-12 06:04:24 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-12 06:04:24 +0000 |
commit | 32baf62b9a3aea3b63be6925b64aa182b0a2278e (patch) | |
tree | 4184b9b367454b14d6343b01f6a2767593c83307 /lib/CodeGen/CGCXXClass.cpp | |
parent | 191dfe909d6cc18e9134ac23ac4daaedeceb862f (diff) |
When necessary, null check the base value in GetAddressCXXOfBaseClass.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81611 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXXClass.cpp')
-rw-r--r-- | lib/CodeGen/CGCXXClass.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/CodeGen/CGCXXClass.cpp b/lib/CodeGen/CGCXXClass.cpp index 1fb8f8308c..b2ff2327af 100644 --- a/lib/CodeGen/CGCXXClass.cpp +++ b/lib/CodeGen/CGCXXClass.cpp @@ -81,6 +81,22 @@ CodeGenFunction::GetAddressCXXOfBaseClass(llvm::Value *BaseValue, uint64_t Offset = ComputeBaseClassOffset(getContext(), ClassDecl, BaseClassDecl); + llvm::BasicBlock *CastNull = 0; + llvm::BasicBlock *CastNotNull = 0; + llvm::BasicBlock *CastEnd = 0; + + if (NullCheckValue) { + CastNull = createBasicBlock("cast.null"); + CastNotNull = createBasicBlock("cast.notnull"); + CastEnd = createBasicBlock("cast.end"); + + llvm::Value *IsNull = + Builder.CreateICmpEQ(BaseValue, + llvm::Constant::getNullValue(BaseValue->getType())); + Builder.CreateCondBr(IsNull, CastNull, CastNotNull); + EmitBlock(CastNotNull); + } + const llvm::Type *LongTy = CGM.getTypes().ConvertType(CGM.getContext().LongTy); const llvm::Type *Int8PtrTy = @@ -99,6 +115,20 @@ CodeGenFunction::GetAddressCXXOfBaseClass(llvm::Value *BaseValue, // Cast back. const llvm::Type *BasePtr = llvm::PointerType::getUnqual(ConvertType(BTy)); BaseValue = Builder.CreateBitCast(BaseValue, BasePtr); + + if (NullCheckValue) { + Builder.CreateBr(CastEnd); + EmitBlock(CastNull); + Builder.CreateBr(CastEnd); + EmitBlock(CastEnd); + + llvm::PHINode *PHI = Builder.CreatePHI(BaseValue->getType()); + PHI->reserveOperandSpace(2); + PHI->addIncoming(BaseValue, CastNotNull); + PHI->addIncoming(llvm::Constant::getNullValue(BaseValue->getType()), + CastNull); + BaseValue = PHI; + } return BaseValue; } |