diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2011-04-13 16:36:50 +0000 |
---|---|---|
committer | Georg-Johann Lay <gjl@gcc.gnu.org> | 2011-04-13 16:36:50 +0000 |
commit | 3a7bfdd5226a54be0533b5eec6594584e2985d52 (patch) | |
tree | 2d98f93a6bbc5a1721db694e8d52dfa046ac00e8 /gcc | |
parent | 3a78d31ff374f29cd97212b89be3ff8c2f713e0b (diff) | |
download | gcc-3a7bfdd5226a54be0533b5eec6594584e2985d52.zip gcc-3a7bfdd5226a54be0533b5eec6594584e2985d52.tar.gz gcc-3a7bfdd5226a54be0533b5eec6594584e2985d52.tar.bz2 |
re PR target/45263 (registers used in __do_global_ctors can get clobbered)
PR target/45263
* config/avr/libgcc.S (__do_global_ctors, __do_global_dtors): Save
R20 around calls of __tablejump_elpm__
From-SVN: r172384
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/avr/libgcc.S | 20 |
2 files changed, 16 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ee201f8..f2b85c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-04-01 Georg-Johann Lay <avr@gjlay.de> + + PR target/45263 + * config/avr/libgcc.S (__do_global_ctors, __do_global_dtors): Save + R20 around calls of __tablejump_elpm__ + 2011-04-13 Jakub Jelinek <jakub@redhat.com> PR middle-end/48591 diff --git a/gcc/config/avr/libgcc.S b/gcc/config/avr/libgcc.S index 4a15f94..2e8d951 100644 --- a/gcc/config/avr/libgcc.S +++ b/gcc/config/avr/libgcc.S @@ -791,22 +791,22 @@ __do_clear_bss: #if defined(__AVR_HAVE_RAMPZ__) __do_global_ctors: ldi r17, hi8(__ctors_start) - ldi r16, hh8(__ctors_start) ldi r28, lo8(__ctors_end) ldi r29, hi8(__ctors_end) - ldi r20, hh8(__ctors_end) + ldi r16, hh8(__ctors_end) rjmp .L__do_global_ctors_start .L__do_global_ctors_loop: sbiw r28, 2 - sbc r20, __zero_reg__ + sbc r16, __zero_reg__ mov_h r31, r29 mov_l r30, r28 - out __RAMPZ__, r20 + out __RAMPZ__, r16 XCALL __tablejump_elpm__ .L__do_global_ctors_start: cpi r28, lo8(__ctors_start) cpc r29, r17 - cpc r20, r16 + ldi r24, hh8(__ctors_start) + cpc r16, r24 brne .L__do_global_ctors_loop #else __do_global_ctors: @@ -832,22 +832,22 @@ __do_global_ctors: #if defined(__AVR_HAVE_RAMPZ__) __do_global_dtors: ldi r17, hi8(__dtors_end) - ldi r16, hh8(__dtors_end) ldi r28, lo8(__dtors_start) ldi r29, hi8(__dtors_start) - ldi r20, hh8(__dtors_start) + ldi r16, hh8(__dtors_start) rjmp .L__do_global_dtors_start .L__do_global_dtors_loop: sbiw r28, 2 - sbc r20, __zero_reg__ + sbc r16, __zero_reg__ mov_h r31, r29 mov_l r30, r28 - out __RAMPZ__, r20 + out __RAMPZ__, r16 XCALL __tablejump_elpm__ .L__do_global_dtors_start: cpi r28, lo8(__dtors_end) cpc r29, r17 - cpc r20, r16 + ldi r24, hh8(__dtors_end) + cpc r16, r24 brne .L__do_global_dtors_loop #else __do_global_dtors: |