Zoltán Kócsi wrote:
> 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.

I don't get it.  How would this work?   When you have a function pointer
you don't know if the target is thumb or ARM code, so how do you know
where to jump to?  Perhaps you could sketch out an implementation.

Andrew.

Reply via email to