arm: Remove RETURN macro
LTO can re-order top-level assembly blocks, which can cause this macro definition to appear after its use (or not at all), causing compilation failures. On modern toolchains (armv4t+), assembly should write `bx lr` in all cases, and linkers will transparently convert them to `mov pc, lr`, allowing us to simply remove the macro. (source: https://groups.google.com/forum/#!topic/comp.sys.arm/3l7fVGX-Wug and verified empirically) For the armv4.S file, preserve this macro to maximize backwards compatibility.
This commit is contained in:
parent
b219285f87
commit
3ebc26958e
|
@ -60,26 +60,4 @@
|
||||||
# define _ISA_THUMB_1
|
# define _ISA_THUMB_1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Now some macros for common instruction sequences. */
|
|
||||||
#ifdef __ASSEMBLER__
|
|
||||||
.macro RETURN cond=
|
|
||||||
#if defined (_ISA_ARM_4T) || defined (_ISA_THUMB_1)
|
|
||||||
bx\cond lr
|
|
||||||
#else
|
|
||||||
mov\cond pc, lr
|
|
||||||
#endif
|
|
||||||
.endm
|
|
||||||
|
|
||||||
#else
|
|
||||||
asm(".macro RETURN cond=\n\t"
|
|
||||||
#if defined (_ISA_ARM_4T) || defined (_ISA_THUMB_1)
|
|
||||||
"bx\\cond lr\n\t"
|
|
||||||
#else
|
|
||||||
"mov\\cond pc, lr\n\t"
|
|
||||||
#endif
|
|
||||||
".endm"
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ARM_ASM__H */
|
#endif /* ARM_ASM__H */
|
||||||
|
|
|
@ -42,6 +42,6 @@ def_fn strcmp
|
||||||
beq 1b
|
beq 1b
|
||||||
2:
|
2:
|
||||||
subs r0, r2, r3
|
subs r0, r2, r3
|
||||||
RETURN
|
bx lr
|
||||||
.cfi_endproc
|
.cfi_endproc
|
||||||
.size strcmp, . - strcmp
|
.size strcmp, . - strcmp
|
||||||
|
|
|
@ -43,6 +43,18 @@
|
||||||
#define tmp1 r12
|
#define tmp1 r12
|
||||||
#define syndrome r12 /* Overlaps tmp1 */
|
#define syndrome r12 /* Overlaps tmp1 */
|
||||||
|
|
||||||
|
/* For armv4t and newer, toolchains will transparently convert
|
||||||
|
'bx lr' to 'mov pc, lr' if needed. GCC has deprecated support
|
||||||
|
for anything older than armv4t, but this should handle that
|
||||||
|
corner case in case anyone needs it anyway */
|
||||||
|
.macro RETURN
|
||||||
|
#if __ARM_ARCH <= 4 && __ARM_ARCH_ISA_THUMB == 0
|
||||||
|
mov pc, lr
|
||||||
|
#else
|
||||||
|
bx lr
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
.arm
|
.arm
|
||||||
def_fn strcmp
|
def_fn strcmp
|
||||||
.cfi_sections .debug_frame
|
.cfi_sections .debug_frame
|
||||||
|
|
|
@ -106,7 +106,7 @@ def_fn strcmp
|
||||||
lsrs result, result, #24
|
lsrs result, result, #24
|
||||||
subs result, result, data2
|
subs result, result, data2
|
||||||
#endif
|
#endif
|
||||||
RETURN
|
bx lr
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -356,7 +356,7 @@ def_fn strcmp
|
||||||
ldmfd sp!, {r5}
|
ldmfd sp!, {r5}
|
||||||
.cfi_restore 5
|
.cfi_restore 5
|
||||||
.cfi_def_cfa_offset 0
|
.cfi_def_cfa_offset 0
|
||||||
RETURN
|
bx lr
|
||||||
|
|
||||||
.Lstrcmp_tail:
|
.Lstrcmp_tail:
|
||||||
.cfi_restore_state
|
.cfi_restore_state
|
||||||
|
@ -373,6 +373,6 @@ def_fn strcmp
|
||||||
ldmfd sp!, {r5}
|
ldmfd sp!, {r5}
|
||||||
.cfi_restore 5
|
.cfi_restore 5
|
||||||
.cfi_def_cfa_offset 0
|
.cfi_def_cfa_offset 0
|
||||||
RETURN
|
bx lr
|
||||||
.cfi_endproc
|
.cfi_endproc
|
||||||
.size strcmp, . - strcmp
|
.size strcmp, . - strcmp
|
||||||
|
|
|
@ -108,7 +108,7 @@ strcpy (char* dst, const char* src)
|
||||||
#ifndef __thumb2__
|
#ifndef __thumb2__
|
||||||
"ldr r5, [sp], #4\n\t"
|
"ldr r5, [sp], #4\n\t"
|
||||||
#endif
|
#endif
|
||||||
"RETURN\n"
|
"bx lr\n"
|
||||||
|
|
||||||
/* Strings have the same offset from word alignment, but it's
|
/* Strings have the same offset from word alignment, but it's
|
||||||
not zero. */
|
not zero. */
|
||||||
|
@ -119,7 +119,7 @@ strcpy (char* dst, const char* src)
|
||||||
"strb r2, [ip], #1\n\t"
|
"strb r2, [ip], #1\n\t"
|
||||||
"cmp r2, #0\n\t"
|
"cmp r2, #0\n\t"
|
||||||
"it eq\n"
|
"it eq\n"
|
||||||
"RETURN eq\n"
|
"bxeq lr\n"
|
||||||
"1:\n\t"
|
"1:\n\t"
|
||||||
"tst r1, #2\n\t"
|
"tst r1, #2\n\t"
|
||||||
"beq 5b\n\t"
|
"beq 5b\n\t"
|
||||||
|
@ -139,7 +139,7 @@ strcpy (char* dst, const char* src)
|
||||||
"tstne r2, #0xff00\n\t"
|
"tstne r2, #0xff00\n\t"
|
||||||
#endif
|
#endif
|
||||||
"bne 5b\n\t"
|
"bne 5b\n\t"
|
||||||
"RETURN\n"
|
"bx lr\n"
|
||||||
|
|
||||||
/* src and dst do not have a common word-alignement. Fall back to
|
/* src and dst do not have a common word-alignement. Fall back to
|
||||||
byte copying. */
|
byte copying. */
|
||||||
|
@ -148,7 +148,7 @@ strcpy (char* dst, const char* src)
|
||||||
"strb r2, [ip], #1\n\t"
|
"strb r2, [ip], #1\n\t"
|
||||||
"cmp r2, #0\n\t"
|
"cmp r2, #0\n\t"
|
||||||
"bne 4b\n\t"
|
"bne 4b\n\t"
|
||||||
"RETURN"
|
"bx lr\n\t"
|
||||||
|
|
||||||
#elif !defined (__thumb__) || defined (__thumb2__)
|
#elif !defined (__thumb__) || defined (__thumb2__)
|
||||||
"mov r3, r0\n\t"
|
"mov r3, r0\n\t"
|
||||||
|
@ -157,7 +157,7 @@ strcpy (char* dst, const char* src)
|
||||||
"strb r2, [r3], #1\n\t"
|
"strb r2, [r3], #1\n\t"
|
||||||
"cmp r2, #0\n\t"
|
"cmp r2, #0\n\t"
|
||||||
"bne 1b\n\t"
|
"bne 1b\n\t"
|
||||||
"RETURN"
|
"bx lr\n\t"
|
||||||
#else
|
#else
|
||||||
"mov r3, r0\n\t"
|
"mov r3, r0\n\t"
|
||||||
"1:\n\t"
|
"1:\n\t"
|
||||||
|
@ -167,7 +167,7 @@ strcpy (char* dst, const char* src)
|
||||||
"add r3, r3, #1\n\t"
|
"add r3, r3, #1\n\t"
|
||||||
"cmp r2, #0\n\t"
|
"cmp r2, #0\n\t"
|
||||||
"bne 1b\n\t"
|
"bne 1b\n\t"
|
||||||
"RETURN"
|
"bx lr\n\t"
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,7 +168,7 @@ strlen (const char* str)
|
||||||
"addne len, len, #1\n\t"
|
"addne len, len, #1\n\t"
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
"RETURN");
|
"bx lr\n\t");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue