Hello,
I'm having an issue with the code generated by powerpc-eabivle-gcc.exe.
When I compile this code
----------------
//#define COMPILE_WITHOUT_TRAP_INSTRUCTION
#ifdef COMPILE_WITHOUT_TRAP_INSTRUCTION
#define FLASH_SECTOR_ADDRESS 0x00000004
#else
#define FLASH_SECTOR_ADDRESS 0x00000000
#endif
unsigned int MyFunc(void);
typedef struct {
unsigned char * Buffer;
} tProgFlash;
tProgFlash ProgFlash;
unsigned int MyFunc(void)
{
unsigned int CmdResult = 0;
if( *((unsigned int *) FLASH_SECTOR_ADDRESS) == 0xFFFFFFFF ) {
ProgFlash.Buffer = 0;
}
return CmdResult;
}
----------------
The output of powerpc-eabivle-objdump.exe is this:
Disassembly of section .text.MyFunc:
00000000 <MyFunc>:
0: 48 07 se_li r7,0
2: c0 77 se_lwz r7,0(r7)
4: 7f e0 00 08 trap
The full command prompt I use to compile:
"C:/SysGCC/powerpc-eabi/bin/powerpc-eabivle-gcc.exe" -c -O2 -g3 -Wall -c -fmessage-length=0 -ffunction-sections -fdata-sections -mcpu=e200z3 -mbig -mvle -mregnames -mhard-float -meabi -Werror -specs="C:/SysGCC/powerpc-eabi/powerpc-eabivle/lib/e200z3/nosys.specs" -I"C:/SysGCC/powerpc-eabi/powerpc-eabivle/include" --sysroot="C:/SysGCC/powerpc-eabi/powerpc-eabivle/lib/e200z3/" -MMD -MP -MF"Test.d" -MT"Test.o" -c -o "Test.o" "Test.c"
The version I'm using:
powerpc-eabivle-gcc.exe (BLD = 1607) 4.9.4 20160726 (build.sh rev=gceb1328 s=F494 -i /opt/freescale ELe200 -V release_gceb1328_build_Fed_ELe200_ML3)
With optimisation level O1 the trap instruction is not generated. When using the define "
COMPILE_WITHOUT_TRAP_INSTRUCTION" the code compiles perfectly, even with O2.
Can you please help out?
Thanks in advance.
Solved! Go to Solution.
Hello,
please see the information below:
There is a conflict with the C language: NULL is defined as 0x00000000 and it must represent an invalid address, but you want to access 0x00000000 as a valid address. You can't have both. (BTW, this "feature" is architecture independent.)
powerpc-eabivle-gcc -S -O2 test.c -fno-delete-null-pointer-checks
Results in:
MyFunc:
se_li 6,0
se_lwz 7,0(6)
e_cmp16i 7,-1
e_beq 0,.L4
se_li 3,0
se_blr
.L4:
e_lis 7,ProgFlash@ha
se_li 3,0
e_stw 6,ProgFlash@l(7)
se_blr
Regards,
Martin
Hello,
please see the information below:
There is a conflict with the C language: NULL is defined as 0x00000000 and it must represent an invalid address, but you want to access 0x00000000 as a valid address. You can't have both. (BTW, this "feature" is architecture independent.)
powerpc-eabivle-gcc -S -O2 test.c -fno-delete-null-pointer-checks
Results in:
MyFunc:
se_li 6,0
se_lwz 7,0(6)
e_cmp16i 7,-1
e_beq 0,.L4
se_li 3,0
se_blr
.L4:
e_lis 7,ProgFlash@ha
se_li 3,0
e_stw 6,ProgFlash@l(7)
se_blr
Regards,
Martin