[cfe-dev] Question on VisitVAArgExpr()
Sylvere Teissier
st at invia.fr
Wed Feb 10 10:56:45 PST 2010
Hi,
If we look at the 3 different implementations of VisitVAArgExpr function
in clang source...:
--------------------------------------------------------------------
Value *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE) {
llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr());
llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType());
// If EmitVAArg fails, we fall back to the LLVM instruction.
if (!ArgPtr)
return Builder.CreateVAArg(ArgValue, ConvertType(VE->getType()));
// FIXME Volatility.
return Builder.CreateLoad(ArgPtr);
}
----------------------------------------------------------------------
ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
llvm::Value *ArgValue = CGF.EmitVAListRef(E->getSubExpr());
llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, E->getType());
if (!ArgPtr) {
CGF.ErrorUnsupported(E, "complex va_arg expression");
const llvm::Type *EltTy =
CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType());
llvm::Value *U = llvm::UndefValue::get(EltTy);
return ComplexPairTy(U, U);
}
// FIXME Volatility.
return EmitLoadOfComplex(ArgPtr, false);
}
-----------------------------------------------------------------------
void AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) {
llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr());
llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType());
if (!ArgPtr) {
CGF.ErrorUnsupported(VE, "aggregate va_arg expression");
return;
}
EmitFinalDestCopy(VE, LValue::MakeAddr(ArgPtr, Qualifiers()));
}
-----------------------------------------------------------------------
...there is no fall back to the LLVM va_arg instruction if (ArgPtr==0)
for the aggregate and complex case
Then there is an unsupported error for architectures that don't
implement EmitVAArg...
Why? Is it a bug or is it impossible to use LLVM va_arg instruction for
these cases ?
More information about the cfe-dev
mailing list