This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/45263] registers used in __do_global_ctors can get clobbered


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:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]