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>
|
2011-12-12 Akio Idehara <zbe64533@gmail.com>
|
||||||
|
|
||||||
* libc/time/strftime.c (get_era_info): Fix off-by-one error in month
|
* libc/time/strftime.c (get_era_info): Fix off-by-one error in month
|
||||||
|
|
|
@ -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
|
||||||
|
@ -251,11 +275,15 @@ __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. */
|
||||||
AngelSWIAsm AngelSWI
|
#ifdef THUMB_V7M_V6M
|
||||||
|
bkpt AngelSWI
|
||||||
|
#else
|
||||||
|
AngelSWIAsm AngelSWI
|
||||||
|
#endif
|
||||||
ldr r1, .LC30
|
ldr r1, .LC30
|
||||||
#endif
|
#endif
|
||||||
/* Parse string at r1. */
|
/* Parse string at r1. */
|
||||||
|
@ -286,7 +314,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:
|
||||||
|
@ -327,7 +355,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 them. */
|
/* We've now got the stacked args in order, reverse them. */
|
||||||
#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
|
||||||
|
@ -365,13 +393,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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue