MacOS X (64bit)でのFFI

次(0.2.6)のmoshではOpenCLをサポートする*1ので、64bitのFFIもついでに対応することにした。もっとも、OpenCLランタイムをFFIで呼ぶか、コンパイル時にリンクするかはまだ決めていない。
ABIはLinux等と同様なので対応自体はすぐ終わった。Win64はABIがかなり異なるのと、DLL資産がそれほどまだ揃っていないのでまだまだ対応しない予定。

罠が2つ有った。

"32-bit absolute addressing is not supported for x86-64"

MacOS Xの64bitコードはPICでなければならないので、シンボルの参照は明示的にrip相対にしないといけない。。
最初↑のようにGOT相対にするのを忘れていて、callbackが動作しなかった。

というわけで、@GOTPCRELを付ける。

"suffix or operands invalid for movq"

真面目なアセンブラはmovq xmm0,raxを拒否する。実際にはこのようなコードも動くが、諸般の事情でmovd xmm0,raxでないと動かない環境がある(VC, MacOS)。

*1:といってもSchemeのコードが自動的にOpenCLになるわけではなくて、専用のストリーム定義言語を使う。