diff --git a/newlib/ChangeLog b/newlib/ChangeLog index dccc4f272..a2451df65 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,11 @@ +2011-12-13 Richard Earnshaw + Thomas Klein + + * 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 * libc/time/strftime.c (get_era_info): Fix off-by-one error in month diff --git a/newlib/libc/sys/arm/crt0.S b/newlib/libc/sys/arm/crt0.S index 79b36b1fb..5e85ee291 100644 --- a/newlib/libc/sys/arm/crt0.S +++ b/newlib/libc/sys/arm/crt0.S @@ -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)