aboutsummaryrefslogtreecommitdiffstats
path: root/runtime/arm
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2015-03-20 16:43:14 +0100
committerXavier Leroy <xavier.leroy@inria.fr>2015-03-20 16:43:14 +0100
commita90ffe0a21a3a813df4eb9a4dc23b06f50699cde (patch)
tree7b2bc56cb7ca16314a3cc4503a61ec6d42bdb9db /runtime/arm
parent375244b93979a4ea238d5dc31211209a60a459b1 (diff)
downloadcompcert-kvx-a90ffe0a21a3a813df4eb9a4dc23b06f50699cde.tar.gz
compcert-kvx-a90ffe0a21a3a813df4eb9a4dc23b06f50699cde.zip
Support va_arg for vararg arguments of composite (struct/union) types.
ARM is done, IA32 and PowerPC remain to be updated.
Diffstat (limited to 'runtime/arm')
-rw-r--r--runtime/arm/vararg.S12
1 files changed, 12 insertions, 0 deletions
diff --git a/runtime/arm/vararg.S b/runtime/arm/vararg.S
index ae06e361..5e319b8b 100644
--- a/runtime/arm/vararg.S
+++ b/runtime/arm/vararg.S
@@ -75,3 +75,15 @@ FUNCTION(__compcert_va_float64)
#endif
bx lr
ENDFUNCTION(__compcert_va_float64)
+
+FUNCTION(__compcert_va_composite)
+ @ r0 = ap parameter
+ @ r1 = size of the composite, in bytes
+ ldr r2, [r0, #0] @ r2 = pointer to next argument
+ ADD r3, r2, r1 @ advance by size
+ ADD r3, r3, #3 @ 4-align
+ BIC r3, r3, #3
+ str r3, [r0, #0] @ update ap
+ mov r0, r2 @ result is pointer to composite in stack
+ bx lr
+ENDFUNCTION(__compcert_va_composite)