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