In our project, we are using ticlang compiler, i.e. a flavor of clang from TI. Optimization is set to level -Os.
In the code we have variables that have a struct type and are only used within a C file and hence are defined as static struct_type_xy variable;
The compiler performs some optimization where the members of such a struct are not kept in sequence in one block of memory but are re-ordered and even split.
This means that while debugging such variables cannot be displayed properly. Of course, I could define them as volatile but that would also prevent optimizing multiple accesses to same members which I don't want to happen.
Therefore I want to prevent this kind of optimization.
What is the name of such an optimization and how can I disable it in clang?
I don't have a MCVE yet but I can provide a few details:
typedef struct { Command_t Command; // this is an enum type int Par_1; // System uses 32 bit integers. int Par_2; int Par_3; int Par_4; size_t Num_Tok; } Cmd_t; static Cmd_t Cmd; The map file then contains:
20000540 00000004 Cmd.o (.bss.Cmd.1) 20000544 00000004 Cmd.o (.bss.Cmd.2) 20000548 00000004 Cmd.o (.bss.Cmd.5) 2000054c 00000004 HAL_* ... 2000057b 00000001 XY_* 2000057c 00000001 Cmd.o (.bss.Cmd.0) The parts of Cmd are split accross the memory and some are even removed. (I used a bulid configuration where the missing 2 members are not used but the struct definition is identical for all configurations)
If I remove static this changes to
200004c4 00000018 (.common:Cmd)