diff -Naurp libgcc/config/avr/lib1funcs.S libgcc/config/avr/lib1funcs.S --- libgcc/config/avr/lib1funcs.S 2013-01-21 18:58:03.000000000 +0530 +++ libgcc/config/avr/lib1funcs.S 2013-01-21 19:12:51.000000000 +0530 @@ -2010,7 +2010,21 @@ ENDF __do_clear_bss #ifdef L_ctors .section .init6,"ax",@progbits DEFUN __do_global_ctors -#if defined(__AVR_HAVE_ELPM__) +#if defined(__AVR_TINY__) + ldi r18, hi8(__ctors_start) + ldi r28, lo8(__ctors_end) + ldi r29, hi8(__ctors_end) + rjmp .L__do_global_ctors_start +.L__do_global_ctors_loop: + wsubi 28, 2 + mov_h r31, r29 + mov_l r30, r28 + XCALL __tablejump__ +.L__do_global_ctors_start: + cpi r28, lo8(__ctors_start) + cpc r29, r18 + brne .L__do_global_ctors_loop +#elif defined(__AVR_HAVE_ELPM__) ldi r17, hi8(__ctors_start) ldi r28, lo8(__ctors_end) ldi r29, hi8(__ctors_end) @@ -2035,7 +2049,7 @@ DEFUN __do_global_ctors ldi r29, hi8(__ctors_end) rjmp .L__do_global_ctors_start .L__do_global_ctors_loop: - wsubi r28, 2 + sbiw r28, 2 mov_h r31, r29 mov_l r30, r28 XCALL __tablejump__ @@ -2050,7 +2064,21 @@ ENDF __do_global_ctors #ifdef L_dtors .section .fini6,"ax",@progbits DEFUN __do_global_dtors -#if defined(__AVR_HAVE_ELPM__) +#if defined(__AVR_TINY__) + ldi r18, hi8(__dtors_end) + ldi r28, lo8(__dtors_start) + ldi r29, hi8(__dtors_start) + rjmp .L__do_global_dtors_start +.L__do_global_dtors_loop: + mov_h r31, r29 + mov_l r30, r28 + XCALL __tablejump__ + wsubi 28, -2 +.L__do_global_dtors_start: + cpi r28, lo8(__dtors_end) + cpc r29, r18 + brne .L__do_global_dtors_loop +#elif defined(__AVR_HAVE_ELPM__) ldi r17, hi8(__dtors_end) ldi r28, lo8(__dtors_start) ldi r29, hi8(__dtors_start) @@ -2079,7 +2107,7 @@ DEFUN __do_global_dtors mov_l r30, r28 XCALL __tablejump__ #if defined (__AVR_TINY__) - wsubi r28, -2 + wsubi 28, -2 #else adiw r28, 2 #endif