how to know exactly which parameters are enabled/disabled by default for arm-none-eabi-gcc?
I have the doubt thinking about the parameter `-fshort-enum`.
Try to compile this example (main.c):
#include <stdio.h> typedef enum { A, B, C, max_e, } e_t; /* static assert for detect size of e_t @compile time using DIM symbol */ _Static_assert(DIM == sizeof(e_t), "sizeof do not match"); void f(e_t p) { if(p<0 || p>=max_e){ printf("out of range %d\n", p); return; } printf("p %d\n", p); } int main(void) { f(0); f(1); f(5); f(-1); return 0; }
First I used gcc on my ubuntu 18.04 (with '-DDIM=x -std=gnu11 -Wall -Wextra' parameters):
max@resfw04:~/progs/test_enum_signed$ gcc --version gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 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. max@resfw04:~/progs/test_enum_signed$ gcc -DDIM=1 -std=gnu11 -Wall -Wextra main.c -c -o main.o main.c:12:1: error: static assertion failed: "sizeof do not match" max@resfw04:~/progs/test_enum_signed$ gcc -DDIM=2 -std=gnu11 -Wall -Wextra main.c -c -o main.o main.c:12:1: error: static assertion failed: "sizeof do not match" max@resfw04:~/progs/test_enum_signed$ gcc -DDIM=4 -std=gnu11 -Wall -Wextra main.c -c -o main.o max@resfw04:~/progs/test_enum_signed$
As you can see I have gcc 7.4.0 on my machine, and it seems that the default is '-fno-short-enum', in fact the build fails with DIM other than 4.
The I tried to compile with arm toolchain (same parameters):
max@resfw04:~/progs/test_enum_signed$ arm-none-eabi-gcc --version arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] Copyright (C) 2017 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. max@resfw04:~/progs/test_enum_signed$ arm-none-eabi-gcc -DDIM=1 -std=gnu11 -Wall -Wextra main.c -c -o main.o main.c: In function 'f': main.c:16:6: warning: comparison is always false due to limited range of data type [-Wtype-limits] if(p<0 || p>=max_e){ ^ max@resfw04:~/progs/test_enum_signed$ arm-none-eabi-gcc -DDIM=2 -std=gnu11 -Wall -Wextra main.c -c -o main.o main.c:12:1: error: static assertion failed: "sizeof do not match" _Static_assert(DIM == sizeof(e_t), "sizeof do not match"); ^~~~~~~~~~~~~~ main.c: In function 'f': main.c:16:6: warning: comparison is always false due to limited range of data type [-Wtype-limits] if(p<0 || p>=max_e){ ^ max@resfw04:~/progs/test_enum_signed$ arm-none-eabi-gcc -DDIM=4 -std=gnu11 -Wall -Wextra main.c -c -o main.o main.c:12:1: error: static assertion failed: "sizeof do not match" _Static_assert(DIM == sizeof(e_t), "sizeof do not match"); ^~~~~~~~~~~~~~ main.c: In function 'f': main.c:16:6: warning: comparison is always false due to limited range of data type [-Wtype-limits] if(p<0 || p>=max_e){ ^ max@resfw04:~/progs/test_enum_signed$
In this case it seems that is enabled '-fshort-enum' by default, in fact the build fails with DIM other than 1, and I have also a warning.
So I must deduce that the default of the two gcc's is different, I guess for other parameters, maybe even many.
Where can I find the default parameters for arm-none-eabi-gcc? Is it a document distributed with the toolchain or online? Or should I look at the sources? And in the latter case exactly where?
best regards
Max
The gcc source says:
/* gcc/config/arm/arm.h */ /* AAPCS based ABIs use short enums by default. */ #ifndef ARM_DEFAULT_SHORT_ENUMS #define ARM_DEFAULT_SHORT_ENUMS \ (TARGET_AAPCS_BASED && arm_abi != ARM_ABI_AAPCS_LINUX) #endif
Compare the above, with below for linux-eabi:
/* gcc/config/arm/linux-eabi.h */ /* We default to the "aapcs-linux" ABI so that enums are int-sized by default. */ #undef ARM_DEFAULT_ABI #define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
gcc takes "-mabi=" argument to specify the ABI. In your tests with arm-none-eabi-gcc with -DDIM=4, try placing -mabi=aapcs-linux on the commandline.
More info:
8.1.3
https://wiki.debian.org/ArmEabiPort
https://gcc.gnu.org/onlinedocs/gccint/Type-Layout.html
https://patchwork.ozlabs.org/patch/746413/
https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00138.html