From: Daniel Dunbar Date: Thu, 5 Feb 2009 07:09:07 +0000 (+0000) Subject: Pull CodeGenFunction::GetUndefRValue() out of EmitUnsupportedRValue. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13e81737a433b23f8c662d10d1d57356122a8caa;p=clang Pull CodeGenFunction::GetUndefRValue() out of EmitUnsupportedRValue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63845 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index b7459b2229..0d0dd33d47 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1430,17 +1430,11 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, return RValue::get(CI); case ABIArgInfo::Ignore: - if (RetTy->isVoidType()) - return RValue::get(0); - // If we are ignoring an argument that had a result, make sure to // construct the appropriate return value for our caller. - if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { - llvm::Value *Res = - llvm::UndefValue::get(llvm::PointerType::getUnqual(ConvertType(RetTy))); - return RValue::getAggregate(Res); - } - return RValue::get(llvm::UndefValue::get(ConvertType(RetTy))); + return GetUndefRValue(RetTy); + if (RetTy->isVoidType()) + return RValue::get(0); case ABIArgInfo::Coerce: { // FIXME: Avoid the conversion through memory if possible. diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index f085127da2..5e969308b0 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -83,23 +83,27 @@ unsigned CodeGenFunction::getAccessedFieldNo(unsigned Idx, // LValue Expression Emission //===----------------------------------------------------------------------===// -RValue CodeGenFunction::EmitUnsupportedRValue(const Expr *E, - const char *Name) { - ErrorUnsupported(E, Name); - if (const ComplexType *CTy = E->getType()->getAsComplexType()) { +RValue CodeGenFunction::GetUndefRValue(QualType Ty) { + if (Ty->isVoidType()) { + return RValue::get(0); + } else if (const ComplexType *CTy = Ty->getAsComplexType()) { const llvm::Type *EltTy = ConvertType(CTy->getElementType()); llvm::Value *U = llvm::UndefValue::get(EltTy); return RValue::getComplex(std::make_pair(U, U)); - } else if (hasAggregateLLVMType(E->getType())) { - const llvm::Type *Ty = - llvm::PointerType::getUnqual(ConvertType(E->getType())); - return RValue::getAggregate(llvm::UndefValue::get(Ty)); + } else if (hasAggregateLLVMType(Ty)) { + const llvm::Type *LTy = llvm::PointerType::getUnqual(ConvertType(Ty)); + return RValue::getAggregate(llvm::UndefValue::get(LTy)); } else { - const llvm::Type *Ty = ConvertType(E->getType()); - return RValue::get(llvm::UndefValue::get(Ty)); + return RValue::get(llvm::UndefValue::get(ConvertType(Ty))); } } +RValue CodeGenFunction::EmitUnsupportedRValue(const Expr *E, + const char *Name) { + ErrorUnsupported(E, Name); + return GetUndefRValue(E->getType()); +} + LValue CodeGenFunction::EmitUnsupportedLValue(const Expr *E, const char *Name) { ErrorUnsupported(E, Name); diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index ab145d7a1e..bf27d0acea 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -450,6 +450,9 @@ public: // LValue Expression Emission //===--------------------------------------------------------------------===// + /// GetUndefRValue - Get an appropriate 'undef' rvalue for the given type. + RValue GetUndefRValue(QualType Ty); + /// EmitUnsupportedRValue - Emit a dummy r-value using the type of E /// and issue an ErrorUnsupported style diagnostic (using the /// provided Name).