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