2017-02-09 08:10 AM
When compiling a SPC5 studio generated demo program with -Os to optimize on size, the resulting code stalls during initialisation. in eirqInit() the loop
while (eirqconf[i].eirqNumber != -1) {
never terminates when the eirqconf[] table has no entries except for the terminator record where irq is set to -1
const eirq_config eirqconf[]={
{-1,0,0,0,NULL} };Is this a known issue, can anyone reproduce?
2017-02-09 08:26 AM
Hello Gert ,
could you confirm your test application tested ?
Do you use ppc-freevlvle-eabi or hightec gcc ?
i will check with my board.
to debug this issue , you should focus your assembly code not C code.
you should add --save-temps and check your .s file
Best Regards
Erwan
2017-02-09 08:29 AM
Using the ppc-freevle-eabi 4.9.2 compiler. I'm currently trying to reproduce by generating a minimal example function which shows the same behaviour.
2017-02-09 08:48 AM
Minimal snippet to reproduce.
The following never terminates:
#include <stdint.h>
volatile int store1, store2;
int8_t fs[] = { -1 };
void bug(void)
{ uint8_t i = 0;while (fs[i] != -1) {
uint8_t v = (uint8_t)fs[i]; store2 = v; store1 = fs[i]; i++; }}However, removing the line 'store1 = fs[i]' or 'store2 = v' will change the behaviour so that the loop terminates.
Assembly:
0: 70 e0 e0 00 e_lis r7,0
4: 70 c0 e0 00 e_lis r6,0 8: 71 20 00 00 e_li r9,0 c: 1c e7 00 00 e_add16i r7,r7,0 10: 1c c6 00 00 e_add16i r6,r6,0 14: 7d 47 48 ae lbzx r10,r7,r9 18: 7d 48 07 74 extsb r8,r10 1c: 18 28 ac ff e_cmpi cr1,r8,-1 20: 7a 16 00 18 e_beq cr1,38 <bug+0x38> 24: 75 4a 06 3f e_rlwinm r10,r10,0,24,31 28: 19 29 80 01 e_addi r9,r9,1 2c: 55 46 00 00 e_stw r10,0(r6) 30: 75 29 06 3f e_rlwinm r9,r9,0,24,31 34: 79 ff ff e0 e_b 14 <bug+0x14> 38: 00 04 se_blr2017-02-09 11:10 AM
And even simpler code:
void boom(int a, int b)
{ printd('%d %d\n', a, b);}int8_t fs = -1;
void bug(void)
{ if (fs != -1) { boom((uint8_t)fs, fs); }}resulting in
bug:
.LFB2: .loc 1 15 0 .cfi_startproc .loc 1 16 0 e_lis %r9,.LANCHOR0@ha e_lbz %r3,.LANCHOR0@l(%r9) se_extsb %r4 e_cmpi %cr1,%r4,-1 e_beq %cr1,.L2 .loc 1 17 0 se_extzb %r3 .loc 1 19 0 .loc 1 17 0 e_b boom2017-02-09 12:34 PM
Sorry to keep spamming my own topic, but things are getting more and more weird. The following snippet shows wrong behaviour with -O2, but not with -Os:
signed char fs = -1;
void boom(int a)
{ printd('boom %d %d\n', (int)fs, (int)a);}void bug(void){ if (fs != -1) { boom((unsigned char)fs); }}The expression in the 'if' is handled as if it is true, and the output of the program is
boom 1 255
The beaviour of the program is not stable: if 'signed char fs' is declared volatile, it behaves as expected.
I feel that the integer promotion in the if expression seems to mess up, but I can't get my finger around it.
I found some references about ppc being kind of special considering the 'char' type, which is unsigned by default instead of signed on this architecture, although I'm not sure if that is relevant for this case.
2017-02-10 02:35 AM
Hello Gert ,
It seems to be a compiler issue.
i am contacting thecompiler team.
for your information, It is not the last version of the compiler
you can try with the last version 10/12/2016 from NXP website
https://community.nxp.com/docs/DOC-333045
by updating ,c:\SPC5Studio\eclipse\plugins\com.st.tools.spc5.tools.gnu.gcc.ppcvle.win32_1.0.0.201611101103
anyway, you can force
__attribute__((optimize('-O0')))
�?
�?�?�?�?�?
I have created a ticket for this issue.
Best regards
Erwan
2017-02-10 02:55 AM
Thank you for the confirmation. I will try the updated compiler when possible - the NXP site is not available at this moment:
We are unable to complete your software download request at this time due to a system outage. Please try your download at a later time. We apologize for the inconvenience.
It has been like this for a few days already, unfortunately.
2017-02-13 02:00 AM
It is back in
Best regards
Erwan
2017-02-13 03:55 AM
Same results with this compiler.