I was instructed by avr-gcc 4.3.2 to send a bug report. Here's the command line:
$ avr-gcc -v -save-temps -Os -g -Wall -I. -I../usbtiny -mmcu=attiny2313 -c -o main.o main.c Using built-in specs. Target: avr Configured with: ../configure --disable-libssp --disable-nls --enable-languages=c,c++ --mandir=/usr/share/man --prefix=/usr --target=avr --with-gnu-as --with-gnu-ld --with-as=/usr/bin/avr-as --with-ld=/usr/bin/avr-ld : (reconfigured) ../configure --disable-libssp --disable-nls --enable-languages=c,c++ --infodir=/usr/share/info --libexecdir=/usr/lib --mandir=/usr/share/man --prefix=/usr --target=avr --with-gnu-as --with-gnu-ld --with-as=/usr/bin/avr-as --with-ld=/usr/bin/avr-ld Thread model: single gcc version 4.3.2 (GCC) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Os' '-g' '-Wall' '-I.' '-I../usbtiny' '-mmcu=attiny2313' '-c' '-o' 'main.o' /usr/lib/gcc/avr/4.3.2/cc1 -E -quiet -v -I. -I../usbtiny -imultilib avr25 main.c -mmcu=attiny2313 -Wall -fworking-directory -Os -fpch-preprocess -o main.i ignoring nonexistent directory "/usr/lib/gcc/avr/4.3.2/../../../../avr/sys-include" #include "..." search starts here: #include <...> search starts here: . ../usbtiny /usr/lib/gcc/avr/4.3.2/include /usr/lib/gcc/avr/4.3.2/include-fixed /usr/lib/gcc/avr/4.3.2/../../../../avr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Os' '-g' '-Wall' '-I.' '-I../usbtiny' '-mmcu=attiny2313' '-c' '-o' 'main.o' /usr/lib/gcc/avr/4.3.2/cc1 -fpreprocessed main.i -quiet -dumpbase main.c -mmcu=attiny2313 -auxbase-strip main.o -g -Os -Wall -version -o main.s GNU C (GCC) version 4.3.2 (avr) compiled by GNU C version 4.3.2, GMP version 4.2.4, MPFR version 2.3.2. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 2d5f5dc20dcc192172a3e9de347166ce main.c:168: internal compiler error: in start_function, at c-decl.c:6248 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. And here's the main.i it generates (the source is GPLed): # 1 "main.c" # 1 "/home/toxite/usbtiny-1.4/ir//" # 1 "<built-in>" # 1 "<command-line>" # 1 "main.c" # 102 "main.c" # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 1 3 # 99 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/sfr_defs.h" 1 3 # 126 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/sfr_defs.h" 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/inttypes.h" 1 3 # 37 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/inttypes.h" 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/stdint.h" 1 3 # 121 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/stdint.h" 3 typedef int int8_t __attribute__((__mode__(__QI__))); typedef unsigned int uint8_t __attribute__((__mode__(__QI__))); typedef int int16_t __attribute__ ((__mode__ (__HI__))); typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__))); typedef int int32_t __attribute__ ((__mode__ (__SI__))); typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__))); typedef int int64_t __attribute__((__mode__(__DI__))); typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); # 142 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/stdint.h" 3 typedef int16_t intptr_t; typedef uint16_t uintptr_t; # 159 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/stdint.h" 3 typedef int8_t int_least8_t; typedef uint8_t uint_least8_t; typedef int16_t int_least16_t; typedef uint16_t uint_least16_t; typedef int32_t int_least32_t; typedef uint32_t uint_least32_t; typedef int64_t int_least64_t; typedef uint64_t uint_least64_t; # 213 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/stdint.h" 3 typedef int8_t int_fast8_t; typedef uint8_t uint_fast8_t; typedef int16_t int_fast16_t; typedef uint16_t uint_fast16_t; typedef int32_t int_fast32_t; typedef uint32_t uint_fast32_t; typedef int64_t int_fast64_t; typedef uint64_t uint_fast64_t; # 273 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/stdint.h" 3 typedef int64_t intmax_t; typedef uint64_t uintmax_t; # 38 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/inttypes.h" 2 3 # 77 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/inttypes.h" 3 typedef int32_t int_farptr_t; typedef uint32_t uint_farptr_t; # 127 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/sfr_defs.h" 2 3 # 100 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 2 3 # 274 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/iotn2313.h" 1 3 # 275 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 2 3 # 334 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/portpins.h" 1 3 # 335 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 2 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/common.h" 1 3 # 337 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 2 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/version.h" 1 3 # 339 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 2 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/fuse.h" 1 3 # 234 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/fuse.h" 3 typedef struct { unsigned char low; unsigned char high; unsigned char extended; } __fuse_t; # 342 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 2 3 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/lock.h" 1 3 # 345 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/io.h" 2 3 # 103 "main.c" 2 # 1 "/usr/lib/gcc/avr/4.3.2/../../../../avr/include/avr/interrupt.h" 1 3 # 104 "main.c" 2 # 1 "../usbtiny/usb.h" 1 # 13 "../usbtiny/usb.h" typedef unsigned char byte_t; typedef unsigned int uint_t; extern void usb_init ( void ); extern void usb_poll ( void ); extern void crc ( byte_t* data, byte_t len ); extern byte_t usb_setup ( byte_t data[8] ); extern void usb_out ( byte_t* data, byte_t len ); extern byte_t usb_in ( byte_t* data, byte_t len ); # 105 "main.c" 2 # 117 "main.c" enum { USBTINY_ECHO, IGORPLUG_CLEAR, IGORPLUG_READ, LCD_INSTR = 20, LCD_DATA, }; static byte_t inpos = 0xff; static byte_t edges; static struct { byte_t length; byte_t count; byte_t offset; byte_t data[35]; } ir; # 166 "main.c" __attribute__((signal,naked)) extern void __vector_3 ( void ) { static uint_t prev; uint_t stamp; byte_t delta; byte_t e; asm volatile( "push r23\n" "in r23,__SREG__\n" "push r18\n" "push r19\n" "push r24\n" "push r25\n" :: ); stamp = (*(volatile uint16_t *)((0x24) + 0x20)); (*(volatile uint8_t *)((0x39) + 0x20)) = 0; (*(volatile uint8_t *)((0x2E) + 0x20)) ^= (1 << (6)); __asm__ __volatile__ ("sei" ::); (*(volatile uint8_t *)((0x12) + 0x20)) |= (1 << (5)); asm volatile( "push r20\n" "push r21\n" "push r30\n" "push r31\n" :: ); delta = (stamp - prev + (1 << (10 -3-1))) >> (10 -3); asm volatile("" : : "r"(delta) ); prev = stamp; (*(volatile uint16_t *)((0x2A) + 0x20)) = stamp + 12L * 10500 / 8; __asm__ __volatile__ ("cli" ::); e = edges; if ( e != 0xff ) { if ( e > 35 ) { e -= 16; } if ( inpos == 0xff ) { ir.length = 0; if ( e > 0 ) { ir.data[e - 1] = delta; } } edges = e + 1; } __asm__ __volatile__ ("sei" ::); asm volatile("nop"); asm volatile( "pop r31\n" "pop r30\n" "pop r21\n" "pop r20\n" :: ); __asm__ __volatile__ ("cli" ::); (*(volatile uint8_t *)((0x39) + 0x20)) = (1 << (6)) | (1 << (3)); asm volatile( "pop r25\n" "pop r24\n" "pop r19\n" "pop r18\n" "out __SREG__,r23\n" "pop r23\n" "reti\n" :: ); } __attribute__((signal)) extern void __vector_4 ( void ) { (*(volatile uint8_t *)((0x39) + 0x20)) = 0; __asm__ __volatile__ ("sei" ::); (*(volatile uint8_t *)((0x12) + 0x20)) &= ~(1 << (5)); __asm__ __volatile__ ("cli" ::); if ( edges >= 4 && edges != 0xff && inpos == 0xff ) { ir.count++; ir.length = edges - 1; } edges = 0; __asm__ __volatile__ ("sei" ::); (*(volatile uint8_t *)((0x2E) + 0x20)) &= ~(1 << (6)); __asm__ __volatile__ ("cli" ::); (*(volatile uint8_t *)((0x39) + 0x20)) = (1 << (6)) | (1 << (3)); } static void ir_init ( void ) { (*(volatile uint8_t *)((0x11) + 0x20)) |= (1 << (5)); (*(volatile uint8_t *)((0x2E) + 0x20)) = (1 << (7)) | (1 << (1)); (*(volatile uint8_t *)((0x39) + 0x20)) = (1 << (6)) | (1 << (3)); } static void lcd_delay100u ( byte_t count ) { asm volatile( "0: ldi r25, 240\n" "1: rjmp 2f\n" "2: dec r25\n" " brne 1b\n" " dec r24\n" " brne 0b\n" ); } static void lcd_write4 ( byte_t data ) { (*(volatile uint8_t *)((0x18) + 0x20)) = ((*(volatile uint8_t *)((0x18) + 0x20)) & ~ (0xf << 0)) | (data << 0); (*(volatile uint8_t *)((0x18) + 0x20)) |= (1 << 6); (*(volatile uint8_t *)((0x17) + 0x20)) = (1 << 4) | (1 << 5) | (1 << 6) | (0xf << 0); (*(volatile uint8_t *)((0x18) + 0x20)) &= ~ (1 << 6); (*(volatile uint8_t *)((0x17) + 0x20)) = (1 << 4) | (1 << 5) | (1 << 6); } static byte_t lcd_read4 ( void ) { byte_t save; byte_t data; save = (*(volatile uint8_t *)((0x18) + 0x20)); (*(volatile uint8_t *)((0x18) + 0x20)) = (1 << 5); (*(volatile uint8_t *)((0x18) + 0x20)) |= (1 << 6); asm volatile("rjmp 0f\n0:"); data = ((*(volatile uint8_t *)((0x16) + 0x20)) & (0xf << 0)) >> 0; (*(volatile uint8_t *)((0x18) + 0x20)) = save; return data; } static void lcd_write ( byte_t b ) { byte_t h; do { h = lcd_read4(); (void) lcd_read4(); } while ( h & 0x08 ); lcd_write4( b >> 4 ); lcd_write4( b & 15 ); } static void lcd_init ( void ) { (*(volatile uint8_t *)((0x17) + 0x20)) = (1 << 4) | (1 << 5) | (1 << 6); (*(volatile uint8_t *)((0x18) + 0x20)) = 0; lcd_write4( 3 ); lcd_delay100u( 41 ); lcd_write4( 3 ); lcd_delay100u( 1 ); lcd_write( 0x32 ); lcd_write( 0x28 ); lcd_write( 0x01 ); lcd_write( 0x06 ); lcd_write( 0x0c ); } extern byte_t usb_setup ( byte_t data[8] ) { byte_t req; byte_t r; r = 0; req = data[1]; if ( req == USBTINY_ECHO ) { r = 8; } if ( req == IGORPLUG_CLEAR ) { ir.length = 0; inpos = 0xff; } if ( req == IGORPLUG_READ ) { __asm__ __volatile__ ("cli" ::); if ( ir.length > 0 ) { inpos = data[4]; r = 0xff; } else { data[0] = 0; r = 1; } __asm__ __volatile__ ("sei" ::); } if ( req == LCD_INSTR ) { (*(volatile uint8_t *)((0x18) + 0x20)) &= ~ (1 << 4); } if ( req == LCD_DATA ) { (*(volatile uint8_t *)((0x18) + 0x20)) |= (1 << 4); } return r; } extern byte_t usb_in ( byte_t* data, byte_t len ) { byte_t n; byte_t max; max = ir.length + 3; n = 0; while ( n < len ) { if ( inpos >= max ) { __asm__ __volatile__ ("cli" ::); if ( edges ) { edges = 0xff; } inpos = 0xff; __asm__ __volatile__ ("sei" ::); break; } data[n++] = (& ir.length)[inpos++]; } return n; } extern void usb_out ( byte_t* data, byte_t len ) { while ( len ) { lcd_write( *data++ ); len--; } } __attribute__((naked)) extern int main ( void ) { (*(volatile uint8_t *)((0x12) + 0x20)) |= (1 << (3)); (*(volatile uint8_t *)((0x11) + 0x20)) |= (1 << (3)); lcd_init(); usb_init(); ir_init(); for ( ;; ) { usb_poll(); } return 0; } -- Summary: AVR-GCC: internal compiler error: in start_function, at c-decl.c:6248 Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: charles at chaoslizard dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38954