Add function marks and size indications

Add a macro to annotate function end and start using both ENTRY and END
for each function. This allows valgrind (and presumably other debugging
tools) to use the debug symbols to trace the functions.

Change-Id: I5f09cef8e22fb356eb6f5cee952b031e567599b6
This commit is contained in:
Kenny Root
2011-02-16 11:55:58 -08:00
parent 3a3c1853ac
commit 420878c690
15 changed files with 83 additions and 131 deletions

View File

@@ -26,15 +26,10 @@
* SUCH DAMAGE.
*/
#include <asm/unistd.h>
.text
.type _exit_with_stack_teardown, #function
.globl _exit_with_stack_teardown
.align 4
#include <machine/asm.h>
@ void _exit_with_stack_teardown(void * stackBase, int stackSize, int retCode)
_exit_with_stack_teardown:
ENTRY(_exit_with_stack_teardown)
#if __ARM_EABI__
mov lr, r2
@@ -53,3 +48,4 @@ _exit_with_stack_teardown:
@ exit() should never return, cause a crash if it does
mov r0, #0
ldr r0, [r0]
END(_exit_with_stack_teardown)

View File

@@ -70,6 +70,7 @@ ENTRY(_setjmp)
mov r0, #0x00000000
bx lr
END(_setjmp)
.L_setjmp_magic:
.word _JB_MAGIC__SETJMP
@@ -109,3 +110,4 @@ botch:
bl PIC_SYM(_C_LABEL(longjmperror), PLT)
bl PIC_SYM(_C_LABEL(abort), PLT)
b . - 8 /* Cannot get here */
END(_longjmp)

View File

@@ -26,17 +26,9 @@
* SUCH DAMAGE.
*/
#include <sys/linux-syscalls.h>
#include <machine/asm.h>
#include <machine/cpu-features.h>
.global __atomic_cmpxchg
.type __atomic_cmpxchg, %function
.global __atomic_swap
.type __atomic_swap, %function
.global __atomic_dec
.type __atomic_dec, %function
.global __atomic_inc
.type __atomic_inc, %function
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
@@ -48,8 +40,7 @@
*/
/* r0(addr) -> r0(old) */
__atomic_dec:
.fnstart
ENTRY(__atomic_dec)
mov r1, r0 @ copy addr so we don't clobber it
1: ldrex r0, [r1] @ load current value into r0
sub r2, r0, #1 @ generate new value into r2
@@ -57,11 +48,10 @@ __atomic_dec:
cmp r3, #0 @ success?
bxeq lr @ yes, return
b 1b @ no, retry
.fnend
END(__atomic_dec)
/* r0(addr) -> r0(old) */
__atomic_inc:
.fnstart
ENTRY(__atomic_inc)
mov r1, r0
1: ldrex r0, [r1]
add r2, r0, #1
@@ -69,11 +59,10 @@ __atomic_inc:
cmp r3, #0
bxeq lr
b 1b
.fnend
END(__atomic_inc)
/* r0(old) r1(new) r2(addr) -> r0(zero_if_succeeded) */
__atomic_cmpxchg:
.fnstart
ENTRY(__atomic_cmpxchg)
1: mov ip, #2 @ ip=2 means "new != old"
ldrex r3, [r2] @ load current value into r3
teq r0, r3 @ new == old?
@@ -82,18 +71,17 @@ __atomic_cmpxchg:
beq 1b @ yes, retry
mov r0, ip @ return 0 on success, 2 on failure
bx lr
.fnend
END(__atomic_cmpxchg)
/* r0(new) r1(addr) -> r0(old) */
__atomic_swap:
.fnstart
ENTRY(__atomic_swap)
1: ldrex r2, [r1]
strex r3, r0, [r1]
teq r3, #0
bne 1b
mov r0, r2
bx lr
.fnend
END(__atomic_swap)
#else /*not defined __ARM_HAVE_LDREX_STREX*/
/*
@@ -107,8 +95,7 @@ __atomic_swap:
.equ kernel_atomic_base, 0xFFFF0FFF
/* r0(addr) -> r0(old) */
__atomic_dec:
.fnstart
ENTRY(__atomic_dec)
.save {r4, lr}
stmdb sp!, {r4, lr}
mov r2, r0
@@ -122,11 +109,10 @@ __atomic_dec:
add r0, r1, #1
ldmia sp!, {r4, lr}
bx lr
.fnend
END(__atomic_dec)
/* r0(addr) -> r0(old) */
__atomic_inc:
.fnstart
ENTRY(__atomic_inc)
.save {r4, lr}
stmdb sp!, {r4, lr}
mov r2, r0
@@ -140,11 +126,10 @@ __atomic_inc:
sub r0, r1, #1
ldmia sp!, {r4, lr}
bx lr
.fnend
END(__atomic_inc)
/* r0(old) r1(new) r2(addr) -> r0(zero_if_succeeded) */
__atomic_cmpxchg:
.fnstart
ENTRY(__atomic_cmpxchg)
.save {r4, lr}
stmdb sp!, {r4, lr}
mov r4, r0 /* r4 = save oldvalue */
@@ -160,14 +145,13 @@ __atomic_cmpxchg:
2: @ atomic_cmpxchg
ldmia sp!, {r4, lr}
bx lr
.fnend
END(__atomic_cmpxchg)
/* r0(new) r1(addr) -> r0(old) */
__atomic_swap:
.fnstart
ENTRY(__atomic_swap)
swp r0, r0, [r1]
bx lr
.fnend
END(__atomic_swap)
#endif /*not defined __ARM_HAVE_LDREX_STREX*/
@@ -191,18 +175,16 @@ __atomic_swap:
#if __ARM_EABI__
__futex_syscall3:
.fnstart
ENTRY(__futex_syscall3)
stmdb sp!, {r4, r7}
.save {r4, r7}
ldr r7, =__NR_futex
swi #0
ldmia sp!, {r4, r7}
bx lr
.fnend
END(__futex_syscall3)
__futex_wait:
.fnstart
ENTRY(__futex_wait)
stmdb sp!, {r4, r7}
.save {r4, r7}
mov r3, r2
@@ -212,10 +194,9 @@ __futex_wait:
swi #0
ldmia sp!, {r4, r7}
bx lr
.fnend
END(__futex_wait)
__futex_wake:
.fnstart
ENTRY(__futex_wake)
.save {r4, r7}
stmdb sp!, {r4, r7}
mov r2, r1
@@ -224,28 +205,32 @@ __futex_wake:
swi #0
ldmia sp!, {r4, r7}
bx lr
.fnend
END(__futex_wake)
#else
__futex_syscall3:
ENTRY(__futex_syscall3)
swi #__NR_futex
bx lr
END(__futex_syscall3)
__futex_wait:
ENTRY(__futex_wait)
mov r3, r2
mov r2, r1
mov r1, #FUTEX_WAIT
swi #__NR_futex
bx lr
END(__futex_wait)
__futex_wake:
ENTRY(__futex_wake)
mov r2, r1
mov r1, #FUTEX_WAKE
swi #__NR_futex
bx lr
END(__futex_wake)
#endif
__futex_syscall4:
ENTRY(__futex_syscall4)
b __futex_syscall3
END(__futex_syscall4)

View File

@@ -26,14 +26,9 @@
* SUCH DAMAGE.
*/
#include <sys/linux-syscalls.h>
#include <machine/asm.h>
.text
.type __pthread_clone, #function
.global __pthread_clone
.align 4
.fnstart
__pthread_clone:
ENTRY(__pthread_clone)
@ insert the args onto the new stack
str r0, [r1, #-4]
str r3, [r1, #-8]
@@ -73,7 +68,7 @@ __pthread_clone:
__error:
mov r0, #-1
bx lr
.fnend
END(__pthread_clone)
#
@@ -88,12 +83,8 @@ __error:
# at the end of the parameter list makes the
# implementation much simpler.
#
.type __bionic_clone, #function
.globl __bionic_clone
.align 4
.fnstart
__bionic_clone:
ENTRY(__bionic_clone)
mov ip, sp
.save {r4, r5, r6, r7}
@@ -124,5 +115,4 @@ __bionic_clone:
ldr r0, [sp, #-4]
ldr r1, [sp, #-8]
b __bionic_clone_entry
.fnend
END(__bionic_clone)

View File

@@ -61,6 +61,7 @@ ENTRY(ffs)
ldrneb r0, [ r2, r0, lsr #26 ]
bx lr
END(ffs)
.text;
.type .L_ffs_table, _ASM_TYPE_OBJECT;
@@ -78,5 +79,6 @@ ENTRY(ffs)
clzne r0, r0
rsbne r0, r0, #32
bx lr
END(ffs)
#endif /* !defined(__ARM_HAVE_CLZ) */

View File

@@ -33,17 +33,13 @@
of a corrupted malloc heap).
*/
#include <sys/linux-syscalls.h>
#include <machine/asm.h>
#ifndef __NR_kill
#define __NR_kill 37
#endif
.text
.type kill, #function
.globl kill
.align 4
kill:
ENTRY(kill)
stmfd sp!, {r4-r7, ip, lr}
ldr r7, =__NR_kill
swi #0
@@ -51,3 +47,4 @@ kill:
movs r0, r0
bxpl lr
b __set_syscall_errno
END(kill)

View File

@@ -27,12 +27,7 @@
*/
#include <machine/cpu-features.h>
.text
.global memcmp
.type memcmp, %function
.align 4
#include <machine/asm.h>
/*
* Optimized memcmp() for ARM9.
@@ -43,8 +38,7 @@
* (2) The loads are scheduled in a way they won't stall
*/
memcmp:
.fnstart
ENTRY(memcmp)
PLD (r0, #0)
PLD (r1, #0)
@@ -176,7 +170,7 @@ memcmp:
9: /* restore registers and return */
ldmfd sp!, {r4, lr}
bx lr
.fnend
END(memcmp)

View File

@@ -27,12 +27,7 @@
*/
#include <machine/cpu-features.h>
.text
.global __memcmp16
.type __memcmp16, %function
.align 4
#include <machine/asm.h>
/*
* Optimized memcmp16() for ARM9.
@@ -43,8 +38,7 @@
* (2) The loads are scheduled in a way they won't stall
*/
__memcmp16:
.fnstart
ENTRY(__memcmp16)
PLD (r0, #0)
PLD (r1, #0)
@@ -95,8 +89,6 @@ __memcmp16:
/* restore registers and return */
ldmnefd sp!, {r4, lr}
bxne lr
.fnend
0: /* here the first pointer is aligned, and we have at least 3 words
@@ -237,3 +229,4 @@ __memcmp16:
7: /* fix up the 2 pointers and fallthrough... */
sub r1, r1, #2
b 2b
END(__memcmp16)

View File

@@ -27,6 +27,7 @@
*/
#include <machine/cpu-features.h>
#include <machine/asm.h>
#if defined(__ARM_NEON__)
@@ -143,18 +144,12 @@ memcpy:
ldmfd sp!, {r0, lr}
bx lr
.fnend
END(memcpy)
#else /* __ARM_ARCH__ < 7 */
.text
.global memcpy
.type memcpy, %function
.align 4
/*
* Optimized memcpy() for ARM.
*
@@ -162,12 +157,11 @@ memcpy:
* so we have to preserve R0.
*/
memcpy:
ENTRY(memcpy)
/* The stack must always be 64-bits aligned to be compliant with the
* ARM ABI. Since we have to save R0, we might as well save R4
* which we can use for better pipelining of the reads below
*/
.fnstart
.save {r0, r4, lr}
stmfd sp!, {r0, r4, lr}
/* Making room for r5-r11 which will be spilled later */
@@ -504,7 +498,7 @@ copy_last_3_and_return:
add sp, sp, #28
ldmfd sp!, {r0, r4, lr}
bx lr
.fnend
END(memcpy)
#endif /* __ARM_ARCH__ < 7 */

View File

@@ -25,15 +25,8 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
.text
.global memset
.type memset, %function
.global bzero
.type bzero, %function
.align
#include <machine/asm.h>
/*
* Optimized memset() for ARM.
@@ -41,15 +34,15 @@
* memset() returns its first argument.
*/
bzero:
ENTRY(bzero)
mov r2, r1
mov r1, #0
END(bzero)
memset:
ENTRY(memset)
/* compute the offset to align the destination
* offset = (4-(src&3))&3 = -src & 3
*/
.fnstart
.save {r0, r4-r7, lr}
stmfd sp!, {r0, r4-r7, lr}
rsb r3, r0, #0
@@ -113,5 +106,4 @@ memset:
strcsb r1, [r0]
ldmfd sp!, {r0, r4-r7, lr}
bx lr
.fnend
END(memset)

View File

@@ -79,6 +79,7 @@ ENTRY(setjmp)
mov r0, #0x00000000
bx lr
END(setjmp)
.Lsetjmp_magic:
.word _JB_MAGIC_SETJMP
@@ -138,3 +139,4 @@ botch:
bl PIC_SYM(_C_LABEL(longjmperror), PLT)
bl PIC_SYM(_C_LABEL(abort), PLT)
b . - 8 /* Cannot get here */
END(longjmp)

View File

@@ -33,6 +33,8 @@
* SUCH DAMAGE.
*/
#define _ALIGN_TEXT .align 0
#include <machine/asm.h>
#include <machine/setjmp.h>
@@ -50,6 +52,7 @@ ENTRY(sigsetjmp)
teq r1, #0
beq PIC_SYM(_C_LABEL(_setjmp), PLT)
b PIC_SYM(_C_LABEL(setjmp), PLT)
END(sigsetjmp)
.L_setjmp_magic:
.word _JB_MAGIC__SETJMP
@@ -60,3 +63,4 @@ ENTRY(siglongjmp)
teq r2, r3
beq PIC_SYM(_C_LABEL(_longjmp), PLT)
b PIC_SYM(_C_LABEL(longjmp), PLT)
END(siglongjmp)

View File

@@ -30,15 +30,9 @@
*/
#include <machine/cpu-features.h>
#include <machine/asm.h>
.text
.global strcpy
.type strcpy, %function
.align 4
strcpy:
.fnstart
ENTRY(strcpy)
PLD(r1, #0)
eor r2, r0, r1
mov ip, r0
@@ -136,3 +130,4 @@ strcpy:
cmp r2, #0
bne 4b
bx lr
END(strcpy)

View File

@@ -32,18 +32,15 @@
abort due to a fatal runtime error (e.g. detection
of a corrupted malloc heap).
*/
#include <sys/linux-syscalls.h>
#include <machine/asm.h>
#ifndef __NR_tkill
#define __NR_tkill 238
#endif
.text
.type tkill, #function
.globl tkill
.align 4
tkill:
ENTRY(tkill)
stmfd sp!, {r4-r7, ip, lr}
ldr r7, =__NR_tkill
swi #0
@@ -51,3 +48,4 @@ tkill:
movs r0, r0
bxpl lr
b __set_syscall_errno
END(tkill)

View File

@@ -70,7 +70,13 @@
#define _ASM_TYPE_FUNCTION #function
#define _ASM_TYPE_OBJECT #object
#define _ENTRY(x) \
.text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; x:
.text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; x: .fnstart
#define _ASM_SIZE(x) .size x, .-x;
#define _END(x) \
.fnend; \
_ASM_SIZE(x)
#ifdef GPROF
# ifdef __ELF__
@@ -86,8 +92,10 @@
#define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
#define ENTRY_NP(y) _ENTRY(_C_LABEL(y))
#define END(y) _END(_C_LABEL(y))
#define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE
#define ASENTRY_NP(y) _ENTRY(_ASM_LABEL(y))
#define ASEND(y) _END(_ASM_LABEL(y))
#define ASMSTR .asciz