This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/45263] registers used in __do_global_ctors can get clobbered
- From: "mschulze at ivs dot cs.ovgu.de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 30 Nov 2010 15:22:11 +0000
- Subject: [Bug target/45263] registers used in __do_global_ctors can get clobbered
- Auto-submitted: auto-generated
- References: <bug-45263-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45263
--- Comment #8 from Michael Schulze <mschulze at ivs dot cs.ovgu.de> 2010-11-30 15:21:57 UTC ---
Comment on attachment 22579
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22579
alternative patch using register r15 instead of r20 avoids pushing/poping
>diff -Naur gcc-4.5.1-orig/gcc/config/avr/libgcc.S gcc-4.5.1/gcc/config/avr/libgcc.S
>--- gcc-4.5.1-orig/gcc/config/avr/libgcc.S 2009-05-23 09:16:07.000000000 +0200
>+++ gcc-4.5.1/gcc/config/avr/libgcc.S 2010-11-30 14:35:53.000000000 +0100
>@@ -792,21 +792,22 @@
> __do_global_ctors:
> ldi r17, hi8(__ctors_start)
> ldi r16, hh8(__ctors_start)
>- ldi r28, lo8(__ctors_end)
>+ ldi r28, hh8(__ctors_end)
>+ mov r15, r28
>+ ldi r28, lo8(__ctors_end)
> ldi r29, hi8(__ctors_end)
>- ldi r20, hh8(__ctors_end)
> rjmp .L__do_global_ctors_start
> .L__do_global_ctors_loop:
> sbiw r28, 2
>- sbc r20, __zero_reg__
>+ sbc r15, __zero_reg__
> mov_h r31, r29
> mov_l r30, r28
>- out __RAMPZ__, r20
>+ out __RAMPZ__, r15
> XCALL __tablejump_elpm__
> .L__do_global_ctors_start:
> cpi r28, lo8(__ctors_start)
> cpc r29, r17
>- cpc r20, r16
>+ cpc r15, r16
> brne .L__do_global_ctors_loop
> #else
> __do_global_ctors:
>@@ -833,21 +834,22 @@
> __do_global_dtors:
> ldi r17, hi8(__dtors_end)
> ldi r16, hh8(__dtors_end)
>+ ldi r28, hh8(__dtors_start)
>+ mov r15, r28
> ldi r28, lo8(__dtors_start)
> ldi r29, hi8(__dtors_start)
>- ldi r20, hh8(__dtors_start)
> rjmp .L__do_global_dtors_start
> .L__do_global_dtors_loop:
> sbiw r28, 2
>- sbc r20, __zero_reg__
>+ sbc r15, __zero_reg__
> mov_h r31, r29
> mov_l r30, r28
>- out __RAMPZ__, r20
>+ out __RAMPZ__, r15
> XCALL __tablejump_elpm__
> .L__do_global_dtors_start:
> cpi r28, lo8(__dtors_end)
> cpc r29, r17
>- cpc r20, r16
>+ cpc r15, r16
> brne .L__do_global_dtors_loop
> #else
> __do_global_dtors: