[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-gcc-list] Incorrect code by gcc?
From: |
Ruud Vlaming |
Subject: |
[avr-gcc-list] Incorrect code by gcc? |
Date: |
Wed, 2 Apr 2008 22:41:13 +0200 |
User-agent: |
KMail/1.9.1 |
Hi,
When developing an OS for the smallest Atmels (ATtiny861/461/21)
i observed a strange effect. Sometimes, depending on the optimization
choosen by gcc, the compiler generates code which cannot be correct
(in my view). Most of the time the code is not functional too.
The problem is that use of the instructions "std Y+1,rX" and
"ldd rX,Y+1" is made, but that de corresponding registers are
never properly initialized. The result is that the value is
stored somewhere in RAM or is retrieved from that (random?)
place. That may or may not hurt, but it seems wrong anyhow.
Below you can see an piece of code generated by GCC (v4.2.3)
78c: 99 83 std Y+1, r25 ; 0x01
78e: 46 de rcall .-884 ; 0x41c <privOperateSlotStack>
790: 99 81 ldd r25, Y+1 ; 0x01
(From the methode below)
The point is nowhere in that method the registers r28 and r29 are used
neigther are they set in the called methodes. (see below)
In practice this effect indeed results in non functional code
which can most of the time be easily circumvented by inlining
some methodes or hooking some variables up to fixed registers.
GCC is then forced to alter the output somewhat and often
the error disappears.
BTW, it seems that the compiler actually meant to do something
like this:
78c: 79 2e mov r7, r25 ; 0x01
78e: 46 de rcall .-884 ; 0x41c <privOperateSlotStack>
790: 97 2d mov r25, r7 ; 0x01
where r7 can be any free register, since if you substitute
that (in the raw hex file for example) the code turns fully
functional.
I have observed the effect also at GCC 4.2.1 and GCC 4.3.0,
although beit not with exactly the same code. The effect is
reproducable, but depends critcally on the choose optimizations
and structure of the code. These are my compiler options
avr-gcc -c -save-temps -mmcu=attiny861 -mint8 -Wall -Wno-main \
-Winline -Wundef -gdwarf-2 -Os -funsigned-char -fomit-frame-pointer \
-fpack-struct -fshort-enums
OK, it would take to much space to include enough details here
for you to be able to reproduce the problem. I made a zip which
can be downloaded from:
http://www.femtoos.org/gcc_effect.zip
which should make this possible. (includes source code, and a
compiler script, you need avr-gcc 4.2.3 on your system, other
versions will no reprocude the error in this particular example)
Hopefully some of you can shed some light on this.
regards,
Ruud
0000074e <privQueuRequestBody>:
74e: 08 2f mov r16, r24
750: c6 2e mov r12, r22
752: 7a 01 movw r14, r20
754: 0d de rcall .-998 ; 0x370 <privInitOs>
756: fb dd rcall .-1034 ; 0x34e <tcbCurrent>
758: 5c 01 movw r10, r24
75a: 6c 2d mov r22, r12
75c: 80 2f mov r24, r16
75e: 09 dd rcall .-1518 ; 0x172 <privQueuTest>
760: 98 2f mov r25, r24
762: 1c 14 cp r1, r12
764: 24 f4 brge .+8 ; 0x76e
<privQueuRequestBody+0x20>
766: 8c 15 cp r24, r12
768: 08 f4 brcc .+2 ; 0x76c
<privQueuRequestBody+0x1e>
76a: 57 c0 rjmp .+174 ; 0x81a
<privQueuRequestBody+0xcc>
76c: 07 c0 rjmp .+14 ; 0x77c
<privQueuRequestBody+0x2e>
76e: cc 20 and r12, r12
770: 29 f0 breq .+10 ; 0x77c
<privQueuRequestBody+0x2e>
772: 8c 2d mov r24, r12
774: 81 95 neg r24
776: 98 17 cp r25, r24
778: 08 f4 brcc .+2 ; 0x77c
<privQueuRequestBody+0x2e>
77a: 4f c0 rjmp .+158 ; 0x81a
<privQueuRequestBody+0xcc>
77c: 90 e0 ldi r25, 0x00 ; 0
77e: 10 2f mov r17, r16
780: 1f 70 andi r17, 0x0F ; 15
782: f0 e8 ldi r31, 0x80 ; 128
784: df 2e mov r13, r31
786: d1 2a or r13, r17
788: 6d 2d mov r22, r13
78a: 89 2f mov r24, r25
78c: 99 83 std Y+1, r25 ; 0x01
78e: 46 de rcall .-884 ; 0x41c <privOperateSlotStack>
790: 99 81 ldd r25, Y+1 ; 0x01
792: 88 23 and r24, r24
794: 31 f0 breq .+12 ; 0x7a2
<privQueuRequestBody+0x54>
796: 07 ff sbrs r16, 7
798: 40 c0 rjmp .+128 ; 0x81a
<privQueuRequestBody+0xcc>
79a: 60 2f mov r22, r16
79c: 89 2f mov r24, r25
79e: 26 de rcall .-948 ; 0x3ec <privReleaseTask>
7a0: 3c c0 rjmp .+120 ; 0x81a
<privQueuRequestBody+0xcc>
7a2: 9f 5f subi r25, 0xFF ; 255
7a4: 93 30 cpi r25, 0x03 ; 3
7a6: 09 f4 brne .+2 ; 0x7aa
<privQueuRequestBody+0x5c>
7a8: 77 c0 rjmp .+238 ; 0x898
<privQueuRequestBody+0x14a>
7aa: ee cf rjmp .-36 ; 0x788
<privQueuRequestBody+0x3a>
7ac: f6 01 movw r30, r12
7ae: 81 81 ldd r24, Z+1 ; 0x01
7b0: 8f 7d andi r24, 0xDF ; 223
7b2: 81 83 std Z+1, r24 ; 0x01
7b4: e1 14 cp r14, r1
7b6: f1 04 cpc r15, r1
7b8: 49 f1 breq .+82 ; 0x80c
<privQueuRequestBody+0xbe>
7ba: bd dd rcall .-1158 ; 0x336 <privCheckOsStack>
7bc: c8 dd rcall .-1136 ; 0x34e <tcbCurrent>
7be: 8c 01 movw r16, r24
7c0: f0 e0 ldi r31, 0x00 ; 0
7c2: ef 16 cp r14, r31
7c4: ff ef ldi r31, 0xFF ; 255
7c6: ff 06 cpc r15, r31
7c8: 18 f0 brcs .+6 ; 0x7d0
<privQueuRequestBody+0x82>
7ca: 60 e0 ldi r22, 0x00 ; 0
7cc: 8f ec ldi r24, 0xCF ; 207
7ce: 0a dd rcall .-1516 ; 0x1e4 <privShowError>
7d0: 80 91 90 00 lds r24, 0x0090
7d4: 20 91 8f 00 lds r18, 0x008F
7d8: 99 27 eor r25, r25
7da: 98 2f mov r25, r24
7dc: 88 27 eor r24, r24
7de: 82 0f add r24, r18
7e0: 91 1d adc r25, r1
7e2: 8e 0d add r24, r14
7e4: 9f 1d adc r25, r15
7e6: f8 01 movw r30, r16
7e8: 82 83 std Z+2, r24 ; 0x02
7ea: 89 2f mov r24, r25
7ec: 99 27 eor r25, r25
7ee: 83 83 std Z+3, r24 ; 0x03
7f0: 93 81 ldd r25, Z+3 ; 0x03
7f2: 80 91 90 00 lds r24, 0x0090
7f6: 98 17 cp r25, r24
7f8: 29 f4 brne .+10 ; 0x804
<privQueuRequestBody+0xb6>
7fa: 80 91 b1 00 lds r24, 0x00B1
7fe: 80 62 ori r24, 0x20 ; 32
800: 80 93 b1 00 sts 0x00B1, r24
804: f8 01 movw r30, r16
806: 81 81 ldd r24, Z+1 ; 0x01
808: 8f 7e andi r24, 0xEF ; 239
80a: 81 83 std Z+1, r24 ; 0x01
80c: f5 01 movw r30, r10
80e: 84 81 ldd r24, Z+4 ; 0x04
810: 8c 7f andi r24, 0xFC ; 252
812: 81 60 ori r24, 0x01 ; 1
814: 84 83 std Z+4, r24 ; 0x04
816: 80 e0 ldi r24, 0x00 ; 0
818: 3d c0 rjmp .+122 ; 0x894
<privQueuRequestBody+0x146>
81a: 00 68 ori r16, 0x80 ; 128
81c: 98 dd rcall .-1232 ; 0x34e <tcbCurrent>
81e: 4c 01 movw r8, r24
820: 0f 70 andi r16, 0x0F ; 15
822: 00 61 ori r16, 0x10 ; 16
824: 80 91 b1 00 lds r24, 0x00B1
828: 60 2f mov r22, r16
82a: 8f 70 andi r24, 0x0F ; 15
82c: f7 dd rcall .-1042 ; 0x41c <privOperateSlotStack>
82e: f4 01 movw r30, r8
830: 81 81 ldd r24, Z+1 ; 0x01
832: 8f 7d andi r24, 0xDF ; 223
834: 81 83 std Z+1, r24 ; 0x01
836: e1 14 cp r14, r1
838: f1 04 cpc r15, r1
83a: 49 f1 breq .+82 ; 0x88e
<privQueuRequestBody+0x140>
83c: 7c dd rcall .-1288 ; 0x336 <privCheckOsStack>
83e: 87 dd rcall .-1266 ; 0x34e <tcbCurrent>
840: 8c 01 movw r16, r24
842: f0 e0 ldi r31, 0x00 ; 0
844: ef 16 cp r14, r31
846: ff ef ldi r31, 0xFF ; 255
848: ff 06 cpc r15, r31
84a: 18 f0 brcs .+6 ; 0x852
<privQueuRequestBody+0x104>
84c: 60 e0 ldi r22, 0x00 ; 0
84e: 8f ec ldi r24, 0xCF ; 207
850: c9 dc rcall .-1646 ; 0x1e4 <privShowError>
852: 80 91 90 00 lds r24, 0x0090
856: 20 91 8f 00 lds r18, 0x008F
85a: 99 27 eor r25, r25
85c: 98 2f mov r25, r24
85e: 88 27 eor r24, r24
860: 82 0f add r24, r18
862: 91 1d adc r25, r1
864: 8e 0d add r24, r14
866: 9f 1d adc r25, r15
868: f8 01 movw r30, r16
86a: 82 83 std Z+2, r24 ; 0x02
86c: 89 2f mov r24, r25
86e: 99 27 eor r25, r25
870: 83 83 std Z+3, r24 ; 0x03
872: 93 81 ldd r25, Z+3 ; 0x03
874: 80 91 90 00 lds r24, 0x0090
878: 98 17 cp r25, r24
87a: 29 f4 brne .+10 ; 0x886
<privQueuRequestBody+0x138>
87c: 80 91 b1 00 lds r24, 0x00B1
880: 80 62 ori r24, 0x20 ; 32
882: 80 93 b1 00 sts 0x00B1, r24
886: f8 01 movw r30, r16
888: 81 81 ldd r24, Z+1 ; 0x01
88a: 8f 7e andi r24, 0xEF ; 239
88c: 81 83 std Z+1, r24 ; 0x01
88e: f5 01 movw r30, r10
890: c5 82 std Z+5, r12 ; 0x05
892: 81 e0 ldi r24, 0x01 ; 1
894: e0 dd rcall .-1088 ; 0x456 <privEnterOS>
896: 0b c0 rjmp .+22 ; 0x8ae <portInit>
898: 5a dd rcall .-1356 ; 0x34e <tcbCurrent>
89a: 6c 01 movw r12, r24
89c: 10 61 ori r17, 0x10 ; 16
89e: 80 91 b1 00 lds r24, 0x00B1
8a2: 61 2f mov r22, r17
8a4: 8f 70 andi r24, 0x0F ; 15
8a6: ba dd rcall .-1164 ; 0x41c <privOperateSlotStack>
8a8: 07 ff sbrs r16, 7
8aa: b0 cf rjmp .-160 ; 0x80c
<privQueuRequestBody+0xbe>
8ac: 7f cf rjmp .-258 ; 0x7ac
<privQueuRequestBody+0x5e>
- [avr-gcc-list] Incorrect code by gcc?,
Ruud Vlaming <=
- RE: [avr-gcc-list] Incorrect code by gcc?, Weddington, Eric, 2008/04/02
- Re: [avr-gcc-list] Incorrect code by gcc?, Andy H, 2008/04/02
- Re: [avr-gcc-list] Incorrect code by gcc?, Ruud Vlaming, 2008/04/02
- Re: [avr-gcc-list] Incorrect code by gcc?, Andy H, 2008/04/02
- Re: [avr-gcc-list] Incorrect code by gcc?, Ruud Vlaming, 2008/04/03
- Re: [avr-gcc-list] Incorrect code by gcc?, hutchinsonandy, 2008/04/03
- Re: [avr-gcc-list] Incorrect code by gcc?, Ruud Vlaming, 2008/04/03