diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 14 |
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 084fb0e..b8af4fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-05-16 Georg-Johann Lay <avr@gjlay.de> + + 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 <rguenther@suse.de> * gimple.c (struct type_hash_pair): New type. diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index ac4b318..c8c363a 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; |