Index: newlib/libc/sys/arm/crt0.S =================================================================== RCS file: /cvs/src/src/newlib/libc/sys/arm/crt0.S,v retrieving revision 1.14 diff -u -p -r1.14 crt0.S --- newlib/libc/sys/arm/crt0.S 11 Oct 2011 09:29:56 -0000 1.14 +++ newlib/libc/sys/arm/crt0.S 1 Dec 2011 14:41:48 -0000 @@ -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)