summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLandon Fuller <landonf@bikemonkey.org>2010-09-18 16:21:32 -0700
committerLandon Fuller <landonf@bikemonkey.org>2010-09-18 16:21:32 -0700
commit6b452bafaec498df975ba8ac4c99de174e5f74f7 (patch)
tree809b488f7f0c33327f0a576753def636d07c7639 /src
parent8ddac835b6f8b54ede764d0ea977dee4c82e2d67 (diff)
downloadlibffi-6b452bafaec498df975ba8ac4c99de174e5f74f7.tar.gz
Apple assembler support; fixed most gas/ELF-isms.
Diffstat (limited to 'src')
-rw-r--r--src/arm/sysv.S47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/arm/sysv.S b/src/arm/sysv.S
index 5ffb101..2593c48 100644
--- a/src/arm/sysv.S
+++ b/src/arm/sysv.S
@@ -39,7 +39,11 @@
#else
#define CNAME(x) x
#endif
+#ifdef __APPLE__
+#define ENTRY(x) .globl CNAME(x); CNAME(x):
+#else
#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
+#endif /* __APPLE__ */
#endif
#ifdef __ELF__
@@ -111,43 +115,37 @@
.align 0
.thumb
.thumb_func
+#ifdef __APPLE__
+ ENTRY($0)
+#else
ENTRY(\name)
+#endif
bx pc
nop
.arm
UNWIND .fnstart
/* A hook to tell gdb that we've switched to ARM mode. Also used to call
directly from other local arm routines. */
-_L__\name:
+#ifdef __APPLE__
+_L__$0:
+#else
+_L__\name:
+#endif
.endm
#else
.macro ARM_FUNC_START name
.text
.align 0
.arm
+#ifdef __APPLE__
+ ENTRY($0)
+#else
ENTRY(\name)
+#endif
UNWIND .fnstart
.endm
#endif
-.macro RETLDM regs=, cond=, dirn=ia
-#if defined (__INTERWORKING__)
- .ifc "\regs",""
- ldr\cond lr, [sp], #4
- .else
- ldm\cond\dirn sp!, {\regs, lr}
- .endif
- bx\cond lr
-#else
- .ifc "\regs",""
- ldr\cond pc, [sp], #4
- .else
- ldm\cond\dirn sp!, {\regs, pc}
- .endif
-#endif
-.endm
-
-
@ r0: ffi_prep_args
@ r1: &ecif
@ r2: cif->bytes
@@ -230,11 +228,18 @@ ARM_FUNC_START ffi_call_SYSV
#endif
LSYM(Lepilogue):
- RETLDM "r0-r3,fp"
+#if defined (__INTERWORKING__)
+ ldmia sp!, {r0-r3,fp, lr}
+ bx lr
+#else
+ ldmia sp!, {r0-r3,fp, pc}
+#endif
.ffi_call_SYSV_end:
UNWIND .fnend
+#ifdef __ELF__
.size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
+#endif
/*
unsigned int FFI_HIDDEN
@@ -306,7 +311,9 @@ ARM_FUNC_START ffi_closure_SYSV
.ffi_closure_SYSV_end:
UNWIND .fnend
+#ifdef __ELF__
.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
+#endif
#if defined __ELF__ && defined __linux__
.section .note.GNU-stack,"",%progbits