diff options
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64CallLowering.cpp | 10 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv.ll | 14 |
2 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp index 6148359da81..b1b98708753 100644 --- a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp @@ -136,7 +136,6 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler { MIRBuilder.buildGEP(AddrReg, SPReg, OffsetReg); MPO = MachinePointerInfo::getStack(MIRBuilder.getMF(), Offset); - StackSize = std::max(StackSize, Size + Offset); return AddrReg; } @@ -158,9 +157,14 @@ struct OutgoingArgHandler : public CallLowering::ValueHandler { CCValAssign::LocInfo LocInfo, const CallLowering::ArgInfo &Info, CCState &State) override { + bool Res; if (Info.IsFixed) - return AssignFn(ValNo, ValVT, LocVT, LocInfo, Info.Flags, State); - return AssignFnVarArg(ValNo, ValVT, LocVT, LocInfo, Info.Flags, State); + Res = AssignFn(ValNo, ValVT, LocVT, LocInfo, Info.Flags, State); + else + Res = AssignFnVarArg(ValNo, ValVT, LocVT, LocInfo, Info.Flags, State); + + StackSize = State.getNextStackOffset(); + return Res; } MachineInstrBuilder MIB; diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv.ll index 350ae0e4c08..59b9bb49f0e 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-callingconv.ll @@ -80,3 +80,17 @@ define void @test_varargs() { call void(i32, double, i64, ...) @varargs(i32 42, double 1.0, i64 12, i8 3, i16 1, i32 4, float 1.0, double 2.0) ret void } + +; signext/zeroext parameters on the stack: not part of any real ABI as far as I +; know, but ELF currently allocates 8 bytes for a signext parameter on the +; stack. The ADJCALLSTACK ops should reflect this, even if the difference is +; theoretical. +declare void @stack_ext_needed([8 x i64], i8 signext %in) +; CHECK-LABEL: name: test_stack_ext_needed +; CHECK: ADJCALLSTACKDOWN 8 +; CHECK: BL @stack_ext_needed +; CHECK: ADJCALLSTACKUP 8 +define void @test_stack_ext_needed() { + call void @stack_ext_needed([8 x i64] undef, i8 signext 42) + ret void +} |