зеркало из https://github.com/microsoft/clang-1.git
Slight cleanup, and fix for va_arg on architectures where va_list is a
struct. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62585 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
c96c051150
Коммит
4fd0aa5803
|
@ -53,12 +53,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
|
|||
case Builtin::BI__builtin_stdarg_start:
|
||||
case Builtin::BI__builtin_va_start:
|
||||
case Builtin::BI__builtin_va_end: {
|
||||
Value *ArgValue;
|
||||
if (CGM.getContext().getBuiltinVaListType()->isArrayType()) {
|
||||
ArgValue = EmitScalarExpr(E->getArg(0));
|
||||
} else {
|
||||
ArgValue = EmitLValue(E->getArg(0)).getAddress();
|
||||
}
|
||||
Value *ArgValue = EmitVAListRef(E->getArg(0));;
|
||||
const llvm::Type *DestType =
|
||||
llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
|
||||
if (ArgValue->getType() != DestType)
|
||||
|
@ -70,14 +65,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
|
|||
return RValue::get(Builder.CreateCall(CGM.getIntrinsic(inst), ArgValue));
|
||||
}
|
||||
case Builtin::BI__builtin_va_copy: {
|
||||
Value *DstPtr, *SrcPtr;
|
||||
if (CGM.getContext().getBuiltinVaListType()->isArrayType()) {
|
||||
DstPtr = EmitScalarExpr(E->getArg(0));
|
||||
SrcPtr = EmitScalarExpr(E->getArg(1));
|
||||
} else {
|
||||
DstPtr = EmitLValue(E->getArg(0)).getAddress();
|
||||
SrcPtr = EmitLValue(E->getArg(1)).getAddress();
|
||||
}
|
||||
Value *DstPtr = EmitVAListRef(E->getArg(0));
|
||||
Value *SrcPtr = EmitVAListRef(E->getArg(1));
|
||||
|
||||
const llvm::Type *Type =
|
||||
llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
|
||||
|
|
|
@ -1286,7 +1286,7 @@ Value *ScalarExprEmitter::VisitOverloadExpr(OverloadExpr *E) {
|
|||
}
|
||||
|
||||
Value *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE) {
|
||||
llvm::Value *ArgValue = EmitLValue(VE->getSubExpr()).getAddress();
|
||||
llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr());
|
||||
|
||||
llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType());
|
||||
|
||||
|
|
|
@ -460,3 +460,10 @@ llvm::Value *CodeGenFunction::EmitVLASize(QualType Ty)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
llvm::Value* CodeGenFunction::EmitVAListRef(const Expr* E) {
|
||||
if (CGM.getContext().getBuiltinVaListType()->isArrayType()) {
|
||||
return EmitScalarExpr(E);
|
||||
}
|
||||
return EmitLValue(E).getAddress();
|
||||
}
|
||||
|
|
|
@ -314,6 +314,11 @@ public:
|
|||
RValue EmitAnyExpr(const Expr *E, llvm::Value *AggLoc = 0,
|
||||
bool isAggLocVolatile = false);
|
||||
|
||||
// EmitVAListRef - Emit a "reference" to a va_list; this is either the
|
||||
// address or the value of the expression, depending on how va_list is
|
||||
// defined.
|
||||
llvm::Value *EmitVAListRef(const Expr *E);
|
||||
|
||||
/// EmitAnyExprToTemp - Similary to EmitAnyExpr(), however, the result
|
||||
/// will always be accessible even if no aggregate location is
|
||||
/// provided.
|
||||
|
|
Загрузка…
Ссылка в новой задаче