aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2011-04-13 16:36:50 +0000
committerGeorg-Johann Lay <gjl@gcc.gnu.org>2011-04-13 16:36:50 +0000
commit3a7bfdd5226a54be0533b5eec6594584e2985d52 (patch)
tree2d98f93a6bbc5a1721db694e8d52dfa046ac00e8 /gcc
parent3a78d31ff374f29cd97212b89be3ff8c2f713e0b (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/avr/libgcc.S20
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: