Patchwork [AVR] : Fix PR45263

login
register
mail settings
Submitter Georg-Johann Lay
Date April 1, 2011, 10:01 p.m.
Message ID <4D964B36.3050008@gjlay.de>
Download mbox | patch
Permalink /patch/89355/
State New
Headers show

Comments

Georg-Johann Lay - April 1, 2011, 10:01 p.m.
This is a better fix that does not need push/pop and does not increase 
numer of instructions.

r16 takes the role of r20, and the value formerly in r16,
i.e. hh8(__dtors_end resp. __ctors_start) is recreated as needed.

2011-04-02  Georg-Johann Lay  <avr@gjlay.de>

	PR target/45263
	* config/avr/libgcc.S (__do_global_ctors, __do_global_dtors): Don't use
	r20 around calls of __tablejump_elpm__
Weddington, Eric - April 1, 2011, 10:29 p.m.
> -----Original Message-----
> From: Georg-Johann Lay [mailto:avr@gjlay.de]
> Sent: Friday, April 01, 2011 4:01 PM
> To: Georg-Johann Lay
> Cc: gcc-patches@gcc.gnu.org; Denis Chertykov; Anatoly Sokolov; Weddington,
> Eric
> Subject: Re: [Patch,AVR]: Fix PR45263
> 
> This is a better fix that does not need push/pop and does not increase
> numer of instructions.
> 
> r16 takes the role of r20, and the value formerly in r16,
> i.e. hh8(__dtors_end resp. __ctors_start) is recreated as needed.
> 

Hi Johann,

Have you tested this patch against the test case in bug #45263?

Eric
Georg-Johann Lay - April 4, 2011, 2:02 p.m.
Weddington, Eric schrieb:
> 
>> -----Original Message-----
>> From: Georg-Johann Lay [mailto:avr@gjlay.de]
>> Sent: Friday, April 01, 2011 4:01 PM
>> To: Georg-Johann Lay
>> Cc: gcc-patches@gcc.gnu.org; Denis Chertykov; Anatoly Sokolov; Weddington,
>> Eric
>> Subject: Re: [Patch,AVR]: Fix PR45263
>>
>> This is a better fix that does not need push/pop and does not increase
>> numer of instructions.
>>
>> r16 takes the role of r20, and the value formerly in r16,
>> i.e. hh8(__dtors_end resp. __ctors_start) is recreated as needed.
>>
> 
> Hi Johann,
> 
> Have you tested this patch against the test case in bug #45263?

avr-gcc still aborts on building avr-libc as of

http://gcc.gnu.org/ml/gcc/2011-04/msg00008.html

Using avr-gdb-7.2 to debug with stubs runs on errors and doesn't show
me any code... no assembly with "A syntax error in expression, near
`0x29c'" in assembly window.

Trying to compile with avr-gcc and dwarf crashes avr-gcc.

__do_copy_data fails to initialize var1 and var2 (are 0x0).

Too much is broken... giving up.

Johann
Georg-Johann Lay - April 6, 2011, 1:30 p.m.
Georg-Johann Lay schrieb:
> Weddington, Eric schrieb:
>>> -----Original Message-----
>>> From: Georg-Johann Lay [mailto:avr@gjlay.de]
>>> Sent: Friday, April 01, 2011 4:01 PM
>>> To: Georg-Johann Lay
>>> Cc: gcc-patches@gcc.gnu.org; Denis Chertykov; Anatoly Sokolov; Weddington,
>>> Eric
>>> Subject: Re: [Patch,AVR]: Fix PR45263
>>>
>>> This is a better fix that does not need push/pop and does not increase
>>> numer of instructions.
>>>
>>> r16 takes the role of r20, and the value formerly in r16,
>>> i.e. hh8(__dtors_end resp. __ctors_start) is recreated as needed.
>>>
>> Hi Johann,
>>
>> Have you tested this patch against the test case in bug #45263?

Tested patch v2 from 2010-04-02 now for atmega2560 on avrtest
simulator. In main, var1 and var2 are initialized as expected and
anObject.getVal() is 30.

Without patch the program hangs.

> Using avr-gdb-7.2 to debug with stubs runs on errors and doesn't show
> me any code... no assembly with "A syntax error in expression, near
> `0x29c'" in assembly window.
> Trying to compile with avr-gcc and dwarf crashes avr-gcc.
> 
> __do_copy_data fails to initialize var1 and var2 (are 0x0).

Seems atmega2560 is not supported in avr-gdb-7.2 simulator? Same elf
fails to initialize .data. Do you know for which targets avr-gdb is
supposed to work?

Johann

Patch

Index: libgcc.S

===================================================================
--- libgcc.S	(Revision 171857)

+++ libgcc.S	(Arbeitskopie)

@@ -791,22 +791,22 @@ 

 #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 @@ 

 #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: