I have a question with regards to ARM interworking. The target is ARM7TDMI-S, embedded system with no OS. The compiler is arm-elf-gcc, 4.3.1 with binutils maybe 3 months old.
It seems that when interworking is enabled then when a piece of THUMB code calls an other piece of THUMB code in a separate file, it calls a linker-generated entry point that switches the CPU to ARM mode, then a jump is executed to an ARM prologue inserted in front of the target THUMB function that switches the CPU back into THUMB mode. That is, instead of a simple call, a call, a jump and two mode switches are executed. I also tried the -mcallee-super-interworking flag, which generates a short ARM to THUMB switching code in front of a THUMB function, but the final result does not seem to use the .real_entry_ofFUNCTIONNAME entry point. Rather, it goes through the same switch back and forth routine. Is there a way so when both the caller and the callee are compiled with interworking support the end code switching modes only when it is necessary? For example, placing a THUMB -> ARM prologue in front of all functions that are in ARM mode and ARM -> THUMB prologue in front of THUMB functions and the caller simply calling the real function or the prologue, depending on its own mode and that of the target? It would save both code space and execution time. Thanks, Zoltan