Hello!

We are currently investigating a problem with CHICKEN code compiled on ARM64 
(iOS) and it seems that the way procedure-calls are compiled is entirely 
incompatible with Apple's modifications of the ARM64 ABI. I'm not completely
sure, but judging from the Information found at [1] and [2], the type of
a called function must _exactly_ match the type known at the call-site,
including the fixed number of arguments in a variadic function, so calling
a function ptr of type

  typedef void (*C_proc4)(C_word, C_word, C_word, C_word, C_word)

that points to a function of (say) this type

  void myproc(C_word c, C_word k, C_word a1, ...)

will break, as the number of fixed args does not match. According to [2], fixed 
args are always passed in registers with and varargs being passed on the stack. 
If I understand the legalese in [1] correctly, then the prelude for a vararg 
function should save all registers on the stack, but this doesn't seem to be 
the case on iOS. See also [3].

CHICKEN-compiled code does this everywhere: optional args are processed as 
varargs, to ensure that args known to be fixed can be placed in registers at 
the call-site, but the call site can not know this (which is the whole point of 
having first-class functions). Using "void (*PTR)(C_word c, ....)" everywhere 
would be a serious performance degradation, IMHO, as _all_ compiled C functions 
would have to use varargs to extract arguments, in addition to forcing all 
arguments on the stack, not being able to utilise registers for argument 
passing (with the exception of the first arg, the argument count). 

Other options would be to pass arguments in global storage (no improvement over 
using varargs everywhere) or rolling our own varargs, using assembly. 

I'm out of my wits. This is extremely stupid and breaks every attempt at 
implementing generic function-pointers in C without paying a massive 
performance penalty. But I will not rant, I will not rant, I will try very hard 
not to rant... 

Any ideas?


felix

[1] 
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf
[2] 
https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARM64FunctionCallingConventions.html
[3] 
https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html

_______________________________________________
Chicken-hackers mailing list
Chicken-hackers@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-hackers

Reply via email to