Anthony Walter wrote:
Because these devices have a fairly large amount of memory I have been
using ARM instruction set (-CIARM option) to simplify the assembler code
required for the low level interfaces, however early on I noticed that
if I specify the options -CpARMV7A (or -CpARMV6) and –CIARM I end up
with code that doesn’t work.
I traced the problem to the use of BLX <Label> instructions which
according to the ARM documentation seem to always causes an
unconditional change to Thumb state. If I remove the
CPUARM_HAS_BLX_LABEL capability and rebuild the compiler the code
produced uses only BL <Label> and always works correctly. There seems to
be no problem with BLX <Register> or BX <Register> instructions which
use bit[0] of the register to determine the target state.
The compiler and assembler mark which code is ARM and which is Thumb.
Normally, when the linker processes the object files, it will replace
the blx instructions with bl if they go from ARM to ARM or from Thumb to
Thumb. The reason that a compiler/assembler cannot do this, is that the
target of a call may be in another object file and the
compiler/assembler cannot know whether this object file has been
compiled in ARM or Thumb mode.
Are you not processing the generated code with a linker at all?
Jonas
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel