diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp --- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp +++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp @@ -1058,7 +1058,7 @@ OutStreamer->AddComment("Length/4 of Parms"); OutStreamer->emitInt16( - static_cast(MFFrame.getMaxCallFrameSize() / 4)); // Parms/4. + static_cast(ZFI->getSizeOfFnParams() / 4)); // Parms/4. OutStreamer->AddComment("Length of Code"); OutStreamer->emitAbsoluteSymbolDiff(FnEndSym, CurrentFnEPMarkerSym, 4); diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -1505,6 +1505,7 @@ SmallVector ArgLocs; SystemZCCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, *DAG.getContext()); CCInfo.AnalyzeFormalArguments(Ins, CC_SystemZ); + FuncInfo->setSizeOfFnParams(CCInfo.getStackSize()); unsigned NumFixedGPRs = 0; unsigned NumFixedFPRs = 0; diff --git a/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h b/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h --- a/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h +++ b/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h @@ -27,6 +27,9 @@ class SystemZMachineFunctionInfo : public MachineFunctionInfo { virtual void anchor(); + /// Size of expected parameter area for current function. (Fixed args only). + unsigned SizeOfFnParams; + SystemZ::GPRRegs SpillGPRRegs; SystemZ::GPRRegs RestoreGPRRegs; Register VarArgsFirstGPR; @@ -38,14 +41,20 @@ public: SystemZMachineFunctionInfo(const Function &F, const TargetSubtargetInfo *STI) - : VarArgsFirstGPR(0), VarArgsFirstFPR(0), VarArgsFrameIndex(0), - RegSaveFrameIndex(0), FramePointerSaveIndex(0), NumLocalDynamics(0) {} + : SizeOfFnParams(0), VarArgsFirstGPR(0), VarArgsFirstFPR(0), + VarArgsFrameIndex(0), RegSaveFrameIndex(0), FramePointerSaveIndex(0), + NumLocalDynamics(0) {} MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap &Src2DstMBB) const override; + // z/OS: Get and set the size of the expected parameter area for the + // current function. (ie. Size of param area in caller). + unsigned getSizeOfFnParams() const { return SizeOfFnParams; } + void setSizeOfFnParams(unsigned Size) { SizeOfFnParams = Size; } + // Get and set the first and last call-saved GPR that should be saved by // this function and the SP offset for the STMG. These are 0 if no GPRs // need to be saved or restored. diff --git a/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll b/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll --- a/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll +++ b/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll @@ -14,6 +14,9 @@ ; CHECK64: lg 7, 2072(4) ; CHECK64: aghi 4, 192 ; CHECK64: b 2(7) + +; CHECK64: @@PPA1_func0_0: +; CHECK64: .short 0 * Length/4 of Parms define void @func0() { call i64 (i64) @fun(i64 10) ret void @@ -27,6 +30,9 @@ ; CHECK64: lmg 7, 15, 2072(4) ; CHECK64: aghi 4, 160 ; CHECK64: b 2(7) + +; CHECK64: @@PPA1_func1_0: +; CHECK64: .short 2 * Length/4 of Parms define void @func1(ptr %ptr) { %l01 = load volatile i64, ptr %ptr %l02 = load volatile i64, ptr %ptr @@ -338,6 +344,9 @@ ; CHECK64: @BB7_2: ; CHECK64: stmg 6, 7, 2064(4) ; CHECK64: lgr 3, 0 + +; CHECK64: @@PPA1_large_stack1_0: +; CHECK64: .short 6 * Length/4 of Parms define void @large_stack1(i64 %n1, i64 %n2, i64 %n3) { %arr = alloca [131072 x i64], align 8 call i64 (ptr, i64, i64, i64) @fun3(ptr %arr,