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

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

        * libc/sys/arm/crt0.S: Manually set the target architecture
        when compiling for Thumb1 on EABI targets.
        Don't use SWI on M-profile cores.
        Avoid v6-only Thumb-1 MOV instruction.
This commit is contained in:
Jeff Johnston 2011-12-13 22:40:45 +00:00
parent f46fcfebd1
commit e480bc80c3
2 changed files with 44 additions and 8 deletions

View File

@ -1,3 +1,11 @@
2011-12-13 Richard Earnshaw <rearnsha@arm.com>
Thomas Klein <th.r.klein@web.de>
* libc/sys/arm/crt0.S: Manually set the target architecture
when compiling for Thumb1 on EABI targets.
Don't use SWI on M-profile cores.
Avoid v6-only Thumb-1 MOV instruction.
2011-12-12 Akio Idehara <zbe64533@gmail.com>
* libc/time/strftime.c (get_era_info): Fix off-by-one error in month

View File

@ -17,6 +17,30 @@
#define _fini __libc_fini_array
#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
.syntax unified
@ -251,11 +275,15 @@ __change_mode:
#ifdef ARM_RDP_MONITOR
swi SWI_GetEnv /* Sets r0 to point to the command line. */
mov r1, r0
movs r1, r0
#else
movs r0, #AngelSWI_Reason_GetCmdLine
adr r1, .LC30 /* Space for command line. */
AngelSWIAsm AngelSWI
#ifdef THUMB_V7M_V6M
bkpt AngelSWI
#else
AngelSWIAsm AngelSWI
#endif
ldr r1, .LC30
#endif
/* Parse string at r1. */
@ -286,7 +314,7 @@ __change_mode:
cmp r3, #'\''
bne .LC21
.LC20:
mov r2, r3
movs r2, r3
b .LC22
.LC21:
@ -327,7 +355,7 @@ __change_mode:
mov r1, sp /* Point at stacked arg pointers. */
/* We've now got the stacked args in order, reverse them. */
#ifdef __thumb__
mov r2, r0
movs r2, r0
lsls r2, #2
add r2, sp
mov r3, sp
@ -365,13 +393,13 @@ __change_mode:
to create constructors and destructors, and for these
targets we need to call the _init function and arrange
for _fini to be called at program exit. */
mov r4, r0
mov r5, r1
movs r4, r0
movs r5, r1
ldr r0, .Lfini
bl FUNCTION (atexit)
bl FUNCTION (_init)
mov r0, r4
mov r1, r5
movs r0, r4
movs r1, r5
#endif
bl FUNCTION (main)