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:
parent
f46fcfebd1
commit
e480bc80c3
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
#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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue