From 846f2436e8cdebc963c5920a0579dd8af643513f Mon Sep 17 00:00:00 2001 From: Amara Emerson Date: Mon, 2 Jul 2018 16:39:09 +0000 Subject: [PATCH] [AArch64][GlobalISel] Any-extend vararg parameters to stack slot size on Darwin. We currently don't any-extend vararg parameters before storing them to the stack locations on Darwin. However, SelectionDAG however does this, and so user code is in the wild which inadvertently relies on this extension. This can manifest in cases where the value stored is (int)0, but the actual parameter is interpreted by va_arg as a pointer, and so not extending to 64 bits causes the callee to load additional undefined bits. llvm-svn: 336120 --- llvm/lib/Target/AArch64/AArch64CallLowering.cpp | 3 +++ llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv-ios.ll | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp index e4dc10c..b8644ba 100644 --- a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp @@ -155,6 +155,9 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler { void assignValueToAddress(unsigned ValVReg, unsigned Addr, uint64_t Size, MachinePointerInfo &MPO, CCValAssign &VA) override { + if (VA.getLocInfo() == CCValAssign::LocInfo::AExt) + Size = VA.getLocVT().getSizeInBits() / 8; + auto MMO = MIRBuilder.getMF().getMachineMemOperand( MPO, MachineMemOperand::MOStore, Size, 0); MIRBuilder.buildStore(ValVReg, Addr, *MMO); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv-ios.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv-ios.ll index b74b632..9e4015a 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv-ios.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv-ios.ll @@ -16,9 +16,9 @@ target triple = "aarch64-apple-ios9.0" ; CHECK: $w0 = COPY [[ANSWER]] ; CHECK: $d0 = COPY [[D_ONE]] ; CHECK: $x1 = COPY [[TWELVE]] -; CHECK: G_STORE [[THREE]](s8), {{%[0-9]+}}(p0) :: (store 1 into stack, align 0) -; CHECK: G_STORE [[ONE]](s16), {{%[0-9]+}}(p0) :: (store 2 into stack + 8, align 0) -; CHECK: G_STORE [[FOUR]](s32), {{%[0-9]+}}(p0) :: (store 4 into stack + 16, align 0) +; CHECK: G_STORE [[THREE]](s8), {{%[0-9]+}}(p0) :: (store 8 into stack, align 0) +; CHECK: G_STORE [[ONE]](s16), {{%[0-9]+}}(p0) :: (store 8 into stack + 8, align 0) +; CHECK: G_STORE [[FOUR]](s32), {{%[0-9]+}}(p0) :: (store 8 into stack + 16, align 0) ; CHECK: G_STORE [[F_ONE]](s32), {{%[0-9]+}}(p0) :: (store 4 into stack + 24, align 0) ; CHECK: G_STORE [[TWO]](s64), {{%[0-9]+}}(p0) :: (store 8 into stack + 32, align 0) declare void @varargs(i32, double, i64, ...) -- 2.7.4