From f24a5190c25a90ec8734ce62b68c081681a314fe Mon Sep 17 00:00:00 2001 From: Georg-Johann Lay Date: Mon, 16 May 2011 14:16:22 +0000 Subject: [PATCH] re PR target/45099 ([avr] Warning could be issued for use of register variables that will fail.) PR target/45099 * config/avr/avr.c (avr_function_arg_advance): Error if a fixed register is needed for a function argument. From-SVN: r173791 --- gcc/ChangeLog | 6 ++++++ gcc/config/avr/avr.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 084fb0ef27e..b8af4fb3ede 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-05-16 Georg-Johann Lay + + PR target/45099 + * config/avr/avr.c (avr_function_arg_advance): Error if a fixed + register is needed for a function argument. + 2011-05-16 Richard Guenther * gimple.c (struct type_hash_pair): New type. diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index ac4b3182d81..c8c363ad948 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -1796,6 +1796,20 @@ avr_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, cfun->machine->sibcall_fails = 1; } + /* Test if all registers needed by the ABI are actually available. If the + user has fixed a GPR needed to pass an argument, an (implicit) function + call would clobber that fixed register. See PR45099 for an example. */ + + if (cum->regno >= 0) + { + int regno; + + for (regno = cum->regno; regno < cum->regno + bytes; regno++) + if (fixed_regs[regno]) + error ("Register %s is needed to pass a parameter but is fixed", + reg_names[regno]); + } + if (cum->nregs <= 0) { cum->nregs = 0; -- 2.30.2