2011-12-13 Richard Earnshaw <rearnsha@arm.com>

Thomas Klein  <th.r.klein@web.de>

        * arm/crt0.S: Manually set the target architecture
        when compiling for Thumb1 on EABI targets.
        Avoid v6-only Thumb-1 MOV instruction.
This commit is contained in:
Jeff Johnston 2011-12-13 22:45:12 +00:00
parent e480bc80c3
commit 50e970d1b1
2 changed files with 38 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2011-12-13 Richard Earnshaw <rearnsha@arm.com>
Thomas Klein <th.r.klein@web.de>
* arm/crt0.S: Manually set the target architecture
when compiling for Thumb1 on EABI targets.
Avoid v6-only Thumb-1 MOV instruction.
2011-11-28 DJ Delorie <dj@redhat.com> 2011-11-28 DJ Delorie <dj@redhat.com>
* configure.in: Add rl78. * configure.in: Add rl78.

View File

@ -17,6 +17,30 @@
#define _fini __libc_fini_array #define _fini __libc_fini_array
#endif #endif
#if defined(__ARM_EABI__) && defined(__thumb__) && !defined(__thumb2__)
/* For Thumb1 we need to force the architecture to be sure that we get the
correct attributes on the object file; otherwise the assembler will get
confused and mark the object as being v6T2. */
#if defined(__ARM_ARCH_4T__)
.arch armv4t
#elif defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__)
/* Nothing in this object requires higher than v5. */
.arch armv5t
#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
|| defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
|| defined(__ARM_ARCH_6ZK__)
/* Nothing in this object requires higher than v6. */
.arch armv6
#elif defined(__ARM_ARCH_6M__)
#ifdef ARM_RDP_MONITOR
/* Object file uses SVC, so mark as v6s-m. */
.arch armv6s-m
#else
.arch armv6-m
#endif
#endif
#endif
/* .text is used instead of .section .text so it works with arm-aout too. */ /* .text is used instead of .section .text so it works with arm-aout too. */
.text .text
.syntax unified .syntax unified
@ -250,7 +274,7 @@ __change_mode:
#ifdef ARM_RDP_MONITOR #ifdef ARM_RDP_MONITOR
swi SWI_GetEnv /* sets r0 to point to the command line */ swi SWI_GetEnv /* sets r0 to point to the command line */
mov r1, r0 movs r1, r0
#else #else
movs r0, #AngelSWI_Reason_GetCmdLine movs r0, #AngelSWI_Reason_GetCmdLine
adr r1, .LC30 /* Space for command line */ adr r1, .LC30 /* Space for command line */
@ -285,7 +309,7 @@ __change_mode:
cmp r3, #'\'' cmp r3, #'\''
bne .LC21 bne .LC21
.LC20: .LC20:
mov r2, r3 movs r2, r3
b .LC22 b .LC22
.LC21: .LC21:
@ -326,7 +350,7 @@ __change_mode:
mov r1, sp /* point at stacked arg pointers */ mov r1, sp /* point at stacked arg pointers */
/* We've now got the stacked args in order reverse the */ /* We've now got the stacked args in order reverse the */
#ifdef __thumb__ #ifdef __thumb__
mov r2, r0 movs r2, r0
lsls r2, #2 lsls r2, #2
add r2, sp add r2, sp
mov r3, sp mov r3, sp
@ -364,13 +388,13 @@ __change_mode:
to create constructors and destructors, and for these to create constructors and destructors, and for these
targets we need to call the _init function and arrange targets we need to call the _init function and arrange
for _fini to be called at program exit. */ for _fini to be called at program exit. */
mov r4, r0 movs r4, r0
mov r5, r1 movs r5, r1
ldr r0, .Lfini ldr r0, .Lfini
bl FUNCTION (atexit) bl FUNCTION (atexit)
bl FUNCTION (_init) bl FUNCTION (_init)
mov r0, r4 movs r0, r4
mov r1, r5 movs r1, r5
#endif #endif
bl FUNCTION (main) bl FUNCTION (main)