[SystemZ]  Support the kernel back chain.

In order to build the Linux kernel, the back chain must be supported with
packed-stack. The back chain is then stored topmost in the register save
area.

Review: Ulrich Weigand

Differential Revision: https://reviews.llvm.org/D74506

GitOrigin-RevId: 82879c2913da69ef2deadee9d075140a84eb6e8c
diff --git a/test/CodeGen/SystemZ/frame-23.ll b/test/CodeGen/SystemZ/frame-23.ll
new file mode 100644
index 0000000..e1c8b2b
--- /dev/null
+++ b/test/CodeGen/SystemZ/frame-23.ll
@@ -0,0 +1,20 @@
+; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
+;
+; Test backchain with packed-stack, which requires soft-float.
+
+attributes #0 = { nounwind "backchain" "packed-stack" "use-soft-float"="true" }
+define i64 @fun0(i64 %a) #0 {
+; CHECK-LABEL: fun0:
+; CHECK:      stmg	%r14, %r15, 136(%r15)
+; CHECK-NEXT: lgr	%r1, %r15
+; CHECK-NEXT: aghi	%r15, -24
+; CHECK-NEXT: stg	%r1, 152(%r15)
+; CHECK-NEXT: brasl	%r14, foo@PLT
+; CHECK-NEXT: lmg	%r14, %r15, 160(%r15)
+; CHECK-NEXT: br	%r14
+entry:
+  %call = call i64 @foo(i64 %a)
+  ret i64 %call
+}
+
+declare i64 @foo(i64)