[cfe-commits] r88988 - /cfe/trunk/lib/CodeGen/CGCXXExpr.cpp
Ted Kremenek
kremenek at apple.com
Mon Nov 16 18:40:44 PST 2009
Hi Mike,
I think you introduced an uninitialized variable bug in this commit:
llvm[4]: Compiling CGCXXExpr.cpp for Release build
/Users/kremenek/llvm/tools/clang/lib/CodeGen/CGCXXExpr.cpp: In member function ‘llvm::Value* clang::CodeGen::CodeGenFunction::EmitDynamicCast(llvm::Value*, const clang::CXXDynamicCastExpr*)’:
/Users/kremenek/llvm/tools/clang/lib/CodeGen/CGCXXExpr.cpp:500: warning: ‘FBadTy’ is used uninitialized in this function
On Nov 16, 2009, at 2:52 PM, Mike Stump wrote:
> Author: mrs
> Date: Mon Nov 16 16:52:20 2009
> New Revision: 88988
>
> URL: http://llvm.org/viewvc/llvm-project?rev=88988&view=rev
> Log:
> Implement dynamic_cast<void*>(E).
>
> Modified:
> cfe/trunk/lib/CodeGen/CGCXXExpr.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGCXXExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXXExpr.cpp?rev=88988&r1=88987&r2=88988&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGCXXExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGCXXExpr.cpp Mon Nov 16 16:52:20 2009
> @@ -408,26 +408,14 @@
> llvm::Value *CodeGenFunction::EmitDynamicCast(llvm::Value *V,
> const CXXDynamicCastExpr *DCE) {
> QualType CastTy = DCE->getTypeAsWritten();
> + QualType InnerType = CastTy->getPointeeType();
> QualType ArgTy = DCE->getSubExpr()->getType();
> const llvm::Type *LArgTy = ConvertType(ArgTy);
> const llvm::Type *LTy = ConvertType(DCE->getType());
> - CXXRecordDecl *SrcTy;
> - CXXRecordDecl *DstTy;
> - QualType Ty = CastTy.getTypePtr()->getPointeeType();
> - CanQualType CanTy = CGM.getContext().getCanonicalType(Ty);
> - Ty = CanTy.getUnqualifiedType();
> - DstTy = cast<CXXRecordDecl>(Ty->getAs<RecordType>()->getDecl());
> - Ty = ArgTy;
> - if (ArgTy.getTypePtr()->isPointerType()
> - || ArgTy.getTypePtr()->isReferenceType())
> - Ty = Ty.getTypePtr()->getPointeeType();
> - CanTy = CGM.getContext().getCanonicalType(Ty);
> - Ty = CanTy.getUnqualifiedType();
> - SrcTy = cast<CXXRecordDecl>(Ty->getAs<RecordType>()->getDecl());
> +
> bool CanBeZero = false;
> - bool ThrowOnBad = false;
> bool ToVoid = false;
> - QualType InnerType = CastTy->getPointeeType();
> + bool ThrowOnBad = false;
> if (CastTy->isPointerType()) {
> // FIXME: if PointerType->hasAttr<NonNullAttr>(), we don't set this
> CanBeZero = true;
> @@ -438,7 +426,14 @@
> ThrowOnBad = true;
> }
>
> - // FIXME: Add support for ToVoid
> + CXXRecordDecl *SrcTy;
> + QualType Ty = ArgTy;
> + if (ArgTy.getTypePtr()->isPointerType()
> + || ArgTy.getTypePtr()->isReferenceType())
> + Ty = Ty.getTypePtr()->getPointeeType();
> + CanQualType CanTy = CGM.getContext().getCanonicalType(Ty);
> + Ty = CanTy.getUnqualifiedType();
> + SrcTy = cast<CXXRecordDecl>(Ty->getAs<RecordType>()->getDecl());
>
> llvm::BasicBlock *ContBlock = createBasicBlock();
> llvm::BasicBlock *NullBlock = 0;
> @@ -452,44 +447,62 @@
> EmitBlock(NonZeroBlock);
> }
>
> + llvm::BasicBlock *BadCastBlock = 0;
>
> - /// Call __dynamic_cast
> - const llvm::Type *ResultType = llvm::Type::getInt8PtrTy(VMContext);
> - const llvm::FunctionType *FTy;
> - std::vector<const llvm::Type*> ArgTys;
> - const llvm::Type *PtrToInt8Ty
> - = llvm::Type::getInt8Ty(VMContext)->getPointerTo();
> const llvm::Type *PtrDiffTy = ConvertType(getContext().getSizeType());
> - ArgTys.push_back(PtrToInt8Ty);
> - ArgTys.push_back(PtrToInt8Ty);
> - ArgTys.push_back(PtrToInt8Ty);
> - ArgTys.push_back(PtrDiffTy);
> - FTy = llvm::FunctionType::get(ResultType, ArgTys, false);
> -
> - // FIXME: Calculate better hint.
> - llvm::Value *hint = llvm::ConstantInt::get(PtrDiffTy, -1ULL);
> - llvm::Value *SrcArg = CGM.GenerateRttiRef(SrcTy);
> - llvm::Value *DstArg = CGM.GenerateRttiRef(DstTy);
> - V = Builder.CreateBitCast(V, PtrToInt8Ty);
> - V = Builder.CreateCall4(CGM.CreateRuntimeFunction(FTy, "__dynamic_cast"),
> - V, SrcArg, DstArg, hint);
> - V = Builder.CreateBitCast(V, LTy);
> -
> - llvm::BasicBlock *BadCastBlock = 0;
> - if (ThrowOnBad) {
> - BadCastBlock = createBasicBlock();
>
> - llvm::Value *Zero = llvm::Constant::getNullValue(LTy);
> - Builder.CreateCondBr(Builder.CreateICmpNE(V, Zero),
> - ContBlock, BadCastBlock);
> - EmitBlock(BadCastBlock);
> - /// Call __cxa_bad_cast
> - ResultType = llvm::Type::getVoidTy(VMContext);
> - const llvm::FunctionType *FBadTy;
> - FTy = llvm::FunctionType::get(ResultType, false);
> - llvm::Value *F = CGM.CreateRuntimeFunction(FBadTy, "__cxa_bad_cast");
> - Builder.CreateCall(F)->setDoesNotReturn();
> - // Builder.CreateUnreachable();
> + // See if this is a dynamic_cast(void*)
> + if (ToVoid) {
> + llvm::Value *This = V;
> + V = Builder.CreateBitCast(This, PtrDiffTy->getPointerTo()->getPointerTo());
> + V = Builder.CreateLoad(V, "vtable");
> + V = Builder.CreateConstInBoundsGEP1_64(V, -2ULL);
> + V = Builder.CreateLoad(V, "offset to top");
> + This = Builder.CreateBitCast(This, llvm::Type::getInt8PtrTy(VMContext));
> + V = Builder.CreateInBoundsGEP(This, V);
> + V = Builder.CreateBitCast(V, LTy);
> + } else {
> + /// Call __dynamic_cast
> + const llvm::Type *ResultType = llvm::Type::getInt8PtrTy(VMContext);
> + const llvm::FunctionType *FTy;
> + std::vector<const llvm::Type*> ArgTys;
> + const llvm::Type *PtrToInt8Ty
> + = llvm::Type::getInt8Ty(VMContext)->getPointerTo();
> + ArgTys.push_back(PtrToInt8Ty);
> + ArgTys.push_back(PtrToInt8Ty);
> + ArgTys.push_back(PtrToInt8Ty);
> + ArgTys.push_back(PtrDiffTy);
> + FTy = llvm::FunctionType::get(ResultType, ArgTys, false);
> + CXXRecordDecl *DstTy;
> + Ty = CastTy.getTypePtr()->getPointeeType();
> + CanTy = CGM.getContext().getCanonicalType(Ty);
> + Ty = CanTy.getUnqualifiedType();
> + DstTy = cast<CXXRecordDecl>(Ty->getAs<RecordType>()->getDecl());
> +
> + // FIXME: Calculate better hint.
> + llvm::Value *hint = llvm::ConstantInt::get(PtrDiffTy, -1ULL);
> + llvm::Value *SrcArg = CGM.GenerateRttiRef(SrcTy);
> + llvm::Value *DstArg = CGM.GenerateRttiRef(DstTy);
> + V = Builder.CreateBitCast(V, PtrToInt8Ty);
> + V = Builder.CreateCall4(CGM.CreateRuntimeFunction(FTy, "__dynamic_cast"),
> + V, SrcArg, DstArg, hint);
> + V = Builder.CreateBitCast(V, LTy);
> +
> + if (ThrowOnBad) {
> + BadCastBlock = createBasicBlock();
> +
> + llvm::Value *Zero = llvm::Constant::getNullValue(LTy);
> + Builder.CreateCondBr(Builder.CreateICmpNE(V, Zero),
> + ContBlock, BadCastBlock);
> + EmitBlock(BadCastBlock);
> + /// Call __cxa_bad_cast
> + ResultType = llvm::Type::getVoidTy(VMContext);
> + const llvm::FunctionType *FBadTy;
> + FTy = llvm::FunctionType::get(ResultType, false);
> + llvm::Value *F = CGM.CreateRuntimeFunction(FBadTy, "__cxa_bad_cast");
> + Builder.CreateCall(F)->setDoesNotReturn();
> + // Builder.CreateUnreachable();
> + }
> }
>
> if (CanBeZero) {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list