forked from OSchip/llvm-project
[MSan] [X86] Fix vararg helper for fixed arguments in overflow area.
This fixes http://llvm.org/PR27646 on x86_64. Differential Revision: http://reviews.llvm.org/D19997 llvm-svn: 268783
This commit is contained in:
parent
144eafd9ee
commit
b088ad1e09
|
@ -2891,9 +2891,14 @@ struct VarArgAMD64Helper : public VarArgHelper {
|
|||
ArgIt != End; ++ArgIt) {
|
||||
Value *A = *ArgIt;
|
||||
unsigned ArgNo = CS.getArgumentNo(ArgIt);
|
||||
bool IsFixed = ArgNo < CS.getFunctionType()->getNumParams();
|
||||
bool IsByVal = CS.paramHasAttr(ArgNo + 1, Attribute::ByVal);
|
||||
if (IsByVal) {
|
||||
// ByVal arguments always go to the overflow area.
|
||||
// Fixed arguments passed through the overflow area will be stepped
|
||||
// over by va_start, so don't count them towards the offset.
|
||||
if (IsFixed)
|
||||
continue;
|
||||
assert(A->getType()->isPointerTy());
|
||||
Type *RealTy = A->getType()->getPointerElementType();
|
||||
uint64_t ArgSize = DL.getTypeAllocSize(RealTy);
|
||||
|
@ -2918,10 +2923,16 @@ struct VarArgAMD64Helper : public VarArgHelper {
|
|||
FpOffset += 16;
|
||||
break;
|
||||
case AK_Memory:
|
||||
if (IsFixed)
|
||||
continue;
|
||||
uint64_t ArgSize = DL.getTypeAllocSize(A->getType());
|
||||
Base = getShadowPtrForVAArgument(A->getType(), IRB, OverflowOffset);
|
||||
OverflowOffset += alignTo(ArgSize, 8);
|
||||
}
|
||||
// Take fixed arguments into account for GpOffset and FpOffset,
|
||||
// but don't actually store shadows for them.
|
||||
if (IsFixed)
|
||||
continue;
|
||||
IRB.CreateAlignedStore(MSV.getShadow(A), Base, kShadowTLSAlignment);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -914,8 +914,7 @@ entry:
|
|||
; the third struct goes to the overflow area byval
|
||||
|
||||
; CHECK-LABEL: @VAArgStruct
|
||||
; undef
|
||||
; CHECK: store i32 -1, i32* {{.*}}@__msan_va_arg_tls {{.*}}, align 8
|
||||
; undef not stored to __msan_va_arg_tls - it's a fixed argument
|
||||
; first struct through general purpose registers
|
||||
; CHECK: store i64 {{.*}}, i64* {{.*}}@__msan_va_arg_tls{{.*}}, i64 8){{.*}}, align 8
|
||||
; CHECK: store i64 {{.*}}, i64* {{.*}}@__msan_va_arg_tls{{.*}}, i64 16){{.*}}, align 8
|
||||
|
|
Loading…
Reference in New Issue