The following example is a test case showing the problem.
The jump table is placed in .data on gcc-4.0.0 instead of flash memory.
Gcc-4.0.0 was configured that way:
./configure --prefix=/home/avrdev --target=avr --enable-languages=c,c++
--disable-nls
[EMAIL PROTECTED] stk500]$ cat testbug.c
unsigned long TestBug(int p)
{
unsigned long x=200;
unsigned long y=1;
switch(p){
case 0:
x=1;
y++;
break;
case 1:
x=2;
y++;
break;
case 2:
x=3;
y=2;
break;
case 3:
x=4;
y=34;
break;
case 4:
x=5;
y=38;
break;
case 5:
x=6;
y=9;
break;
case 6:
x=7;
y=71;
break;
case 7:
x=8;
y=712;
break;
case 8:
x=9;
y=-1;
break;
case 9:
x=10;
y=10;
break;
case 10:
x=11;
y=12;
break;
case 11:
x=12;
y=123;
break;
case 12:
x=13;
y=124;
break;
case 13:
x=14;
y=122;
break;
case 14:
x=15;
y=121;
break;
case 15:
x=1;
y++;
break;
case 16:
x=2;
y++;
break;
case 17:
x=3;
y=2;
break;
case 18:
x=4;
y=34;
break;
case 19:
x=5;
y=38;
break;
case 20:
x=6;
y=9;
break;
case 21:
x=7;
y=71;
break;
case 22:
x=8;
y=712;
break;
case 23:
x=9;
y=-1;
break;
case 24:
x=10;
y=10;
break;
case 25:
x=11;
y=12;
break;
case 26:
x=12;
y=123;
break;
case 27:
x=13;
y=124;
break;
case 28:
x=14;
y=122;
break;
case 29:
x=15;
y=121;
break;
}
return x*y;
}
[EMAIL PROTECTED] stk500]$ avr-gcc --version
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[EMAIL PROTECTED] stk500]$ avr-gcc -Os -Wall -c testbug.c
[EMAIL PROTECTED] stk500]$ avr-objdump -s testbug.o
testbug.o: file format elf32-avr
Contents of section .text:
0000 cf93df93 c8ecd0e0 e0e0f0e0 21e030e0 ............!.0.
0010 40e050e0 aa2797fd a095ba2f 8e319105 @.P..'...../.1..
0020 08f083c0 80509040 8f939f93 0895c1e0 [EMAIL PROTECTED]
0030 d0e0e0e0 f0e009c0 c2e0d0e0 e0e0f0e0 ................
0040 43c0c3e0 d0e0e0e0 f0e022e0 30e040e0 C........."[EMAIL PROTECTED]
0050 50e06bc0 c4e0d0e0 e0e0f0e0 22e230e0 P.k.........".0.
0060 40e050e0 62c0c5e0 d0e0e0e0 f0e026e2 @.P.b.........&.
0070 30e040e0 50e059c0 c6e0d0e0 e0e0f0e0 [EMAIL PROTECTED]
0080 29e030e0 40e050e0 50c0c7e0 d0e0e0e0 )[EMAIL PROTECTED]
0090 f0e027e4 30e040e0 50e047c0 c8e0d0e0 ..'[EMAIL PROTECTED]
00a0 e0e0f0e0 28ec32e0 40e050e0 3ec0c9e0 ....([EMAIL PROTECTED]>...
00b0 d0e0e0e0 f0e02fef 3fef4fef 5fef35c0 ....../.?.O._.5.
00c0 cae0d0e0 e0e0f0e0 2c2f3d2f 4e2f5f2f ........,/=/N/_/
00d0 2cc0cbe0 d0e0e0e0 f0e02ce0 30e040e0 ,.........,[EMAIL PROTECTED]
00e0 50e023c0 cce0d0e0 e0e0f0e0 2be730e0 P.#.........+.0.
00f0 40e050e0 1ac0cde0 d0e0e0e0 f0e02ce7 @.P...........,.
0100 30e040e0 50e011c0 cee0d0e0 e0e0f0e0 [EMAIL PROTECTED]
0110 2ae730e0 40e050e0 08c0cfe0 d0e0e0e0 [EMAIL PROTECTED]
0120 f0e029e7 30e040e0 50e06c2f 7d2f8e2f ..)[EMAIL PROTECTED]/}/./
0130 9f2f00d0 b92fa82f 972f862f 682f792f ./..././././h/y/
0140 8a2f9b2f df91cf91 0895 ././......
Contents of section .progmem.gcc_sw_table:
0000 00c000c0 00c000c0 00c000c0 00c000c0 ................
0010 00c000c0 00c000c0 00c000c0 00c000c0 ................
0020 00c000c0 00c000c0 00c000c0 00c000c0 ................
0030 00c000c0 00c000c0 00c000c0 ............
[EMAIL PROTECTED] stk500]$ avr-gcc --version
avr-gcc (GCC) 4.0.0
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[EMAIL PROTECTED] stk500]$ avr-gcc -Os -Wall -c testbug.c
[EMAIL PROTECTED] stk500]$ avr-objdump -s testbug.o
testbug.o: file format elf32-avr
Contents of section .text:
0000 f92fe82f 4e9760f4 e050f040 09946fe0 ././[EMAIL PROTECTED]
0010 70e080e0 90e029e7 30e040e0 50e07ec0 p.....)[EMAIL PROTECTED]
0020 68ec70e0 80e090e0 21e030e0 40e050e0 [EMAIL PROTECTED]
0030 75c061e0 70e080e0 90e004c0 62e070e0 u.a.p.......b.p.
0040 80e090e0 22e030e0 40e050e0 67c063e0 ...."[EMAIL PROTECTED]
0050 70e080e0 90e0f6cf 64e070e0 80e090e0 p.......d.p.....
0060 22e230e0 40e050e0 59c065e0 70e080e0 "[EMAIL PROTECTED]
0070 90e026e2 30e040e0 50e050c0 66e070e0 ..&[EMAIL PROTECTED]
0080 80e090e0 29e030e0 40e050e0 47c067e0 ....)[EMAIL PROTECTED]
0090 70e080e0 90e027e4 30e040e0 50e03ec0 p.....'[EMAIL PROTECTED]>.
00a0 68e070e0 80e090e0 28ec32e0 40e050e0 h.p.....([EMAIL PROTECTED]
00b0 35c069e0 70e080e0 90e02fef 3fef4fef 5.i.p...../.?.O.
00c0 5fef2cc0 6ae070e0 80e090e0 2ae030e0 _.,.j.p.....*.0.
00d0 40e050e0 23c06be0 70e080e0 90e02ce0 @.P.#.k.p.....,.
00e0 30e040e0 50e01ac0 6ce070e0 80e090e0 [EMAIL PROTECTED]
00f0 2be730e0 40e050e0 11c06de0 70e080e0 [EMAIL PROTECTED]
0100 90e02ce7 30e040e0 50e008c0 6ee070e0 ..,[EMAIL PROTECTED]
0110 80e090e0 2ae730e0 40e050e0 00d00895 [EMAIL PROTECTED]
Contents of section .data:
0000 00c000c0 00c000c0 00c000c0 00c000c0 ................
0010 00c000c0 00c000c0 00c000c0 00c000c0 ................
0020 00c000c0 00c000c0 00c000c0 00c000c0 ................
0030 00c000c0 00c000c0 00c000c0 ............
[EMAIL PROTECTED] stk500]$
--
Summary: AVR target: switch/case jump table is placed in .data
instead of .progmem.gcc_sw_table
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: critical
Priority: P2
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: bernard dot fouche at kuantic dot com
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21284