From f6aeaff7da89dfaae7e7e30e4f3911b071e781b4 Mon Sep 17 00:00:00 2001
From: rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 19 Jan 2007 13:45:54 +0000
Subject: [PATCH] gcc/ 200x-xx-xx  Nathan Sidwell  <nathan@codesourcery.com> 
     Richard Sandiford  <richard@codesourcery.com>

	* config/m68k/m68k.h (M68K_STATIC_CHAIN_REG_NAME): New macro.
	(INITIALIZE_TRAMPOLINE): Use STATIC_CHAIN_REGNUM.
	(__transfer_from_trampoline): Use M68K_STATIC_CHAIN_REG_NAME.
	* config/m68k/m68kelf.h (STATIC_CHAIN_REGNUM): Override.
	(M68K_STATIC_CHAIN_REG_NAME): Likewise.
	* config/m68k/netbsd-elf.h (M68K_STATIC_CHAIN_REG_NAME): Likewise.

gcc/testsuite/
200x-xx-xx  Nathan Sidwell  <nathan@codesourcery.com>

	* gcc.c-torture/execute/nestfunc-7.c: New.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120964 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                                 | 10 +++++
 gcc/config/m68k/m68k.h                        |  6 ++-
 gcc/config/m68k/m68kelf.h                     |  8 ++++
 gcc/config/m68k/netbsd-elf.h                  |  2 +
 gcc/testsuite/ChangeLog                       |  4 ++
 .../gcc.c-torture/execute/nestfunc-7.c        | 44 +++++++++++++++++++
 6 files changed, 72 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.c-torture/execute/nestfunc-7.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6fb680a45003..e35464099ef6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2007-01-19  Nathan Sidwell  <nathan@codesourcery.com>
+	    Richard Sandiford  <richard@codesourcery.com>
+
+	* config/m68k/m68k.h (M68K_STATIC_CHAIN_REG_NAME): New macro.
+	(INITIALIZE_TRAMPOLINE): Use STATIC_CHAIN_REGNUM.
+	(__transfer_from_trampoline): Use M68K_STATIC_CHAIN_REG_NAME.
+	* config/m68k/m68kelf.h (STATIC_CHAIN_REGNUM): Override.
+	(M68K_STATIC_CHAIN_REG_NAME): Likewise.
+	* config/m68k/netbsd-elf.h (M68K_STATIC_CHAIN_REG_NAME): Likewise.
+
 2007-01-19  Richard Sandiford  <richard@codesourcery.com>
 
 	* config/m68k/m68k.md (adddi_dilshr32): Rename to...
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 5ab146162240..c0a3f9e3b04f 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -432,6 +432,7 @@ Boston, MA 02110-1301, USA.  */
 #define ARG_POINTER_REGNUM 24
 
 #define STATIC_CHAIN_REGNUM 8
+#define M68K_STATIC_CHAIN_REG_NAME REGISTER_PREFIX "a0"
 
 /* Register in which address to store a structure value
    is passed to a function.  */
@@ -684,7 +685,8 @@ extern enum reg_class regno_reg_class[];
 	jmp FNADDR  */
 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)			\
 {									\
-  emit_move_insn (gen_rtx_MEM (HImode, TRAMP), GEN_INT(0x207C));	\
+  emit_move_insn (gen_rtx_MEM (HImode, TRAMP),				\
+		  GEN_INT(0x207C + ((STATIC_CHAIN_REGNUM-8) << 9)));	\
   emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 2)), CXT); \
   emit_move_insn (gen_rtx_MEM (HImode, plus_constant (TRAMP, 6)),	\
 		  GEN_INT(0x4EF9));					\
@@ -707,7 +709,7 @@ extern enum reg_class regno_reg_class[];
 void								\
 __transfer_from_trampoline ()					\
 {								\
-  register char *a0 asm ("%a0");				\
+  register char *a0 asm (M68K_STATIC_CHAIN_REG_NAME);		\
   asm (GLOBAL_ASM_OP "___trampoline");				\
   asm ("___trampoline:");					\
   asm volatile ("move%.l %0,%@" : : "m" (a0[22]));		\
diff --git a/gcc/config/m68k/m68kelf.h b/gcc/config/m68k/m68kelf.h
index ecdbd508ed01..6c26650677d5 100644
--- a/gcc/config/m68k/m68kelf.h
+++ b/gcc/config/m68k/m68kelf.h
@@ -83,6 +83,14 @@ do {								\
 #undef M68K_STRUCT_VALUE_REGNUM
 #define M68K_STRUCT_VALUE_REGNUM 8
 
+/* The static chain regnum defaults to a0, but we use that for
+   structure return, so have to use a1 for the static chain.  */
+
+#undef STATIC_CHAIN_REGNUM
+#define STATIC_CHAIN_REGNUM 9
+#undef M68K_STATIC_CHAIN_REG_NAME
+#define M68K_STATIC_CHAIN_REG_NAME REGISTER_PREFIX "a1"
+
 #define ASM_COMMENT_START "|"
 
 /* Define how the m68k registers should be numbered for Dwarf output.
diff --git a/gcc/config/m68k/netbsd-elf.h b/gcc/config/m68k/netbsd-elf.h
index c67f6f8fc4a2..13aca931013a 100644
--- a/gcc/config/m68k/netbsd-elf.h
+++ b/gcc/config/m68k/netbsd-elf.h
@@ -233,6 +233,8 @@ while (0)
 
 #undef STATIC_CHAIN_REGNUM
 #define STATIC_CHAIN_REGNUM 9
+#undef M68K_STATIC_CHAIN_REG_NAME
+#define M68K_STATIC_CHAIN_REG_NAME REGISTER_PREFIX "a1"
 
 
 /* Now to renumber registers for dbx and gdb.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bd0b434b8e1b..f10e21081e3a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-01-19  Nathan Sidwell  <nathan@codesourcery.com>
+
+	* gcc.c-torture/execute/nestfunc-7.c: New.
+
 2007-01-18  Hui-May Chang  <hm.chang@apple.com>
 
 	* gcc.c-torture/compile/pr27528.c: Add -fno-pic option.
diff --git a/gcc/testsuite/gcc.c-torture/execute/nestfunc-7.c b/gcc/testsuite/gcc.c-torture/execute/nestfunc-7.c
new file mode 100644
index 000000000000..5b3d34b8dce9
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/nestfunc-7.c
@@ -0,0 +1,44 @@
+struct A
+{
+  int one;
+  int two;
+  int three;
+  int four;
+  int five;
+  int six;
+};
+
+static int test (void)
+{
+  int base;
+
+  struct A Foo (void)
+    {
+      struct A a;
+
+      a.one = base + 1;
+      a.two = base + 2;
+      a.three = base + 3;
+      a.four = base + 4;
+      a.five = base + 5;
+      a.six = base + 6;
+
+      return a;
+    }
+
+  base = 10;
+  struct A a = Foo ();
+
+  return (a.one == 11
+	  && a.two == 12
+	  && a.three == 13
+	  && a.four == 14
+	  && a.five == 15
+	  && a.six == 16);
+}
+
+int main (void)
+{
+  return !test ();
+}
+
-- 
GitLab