I'm implementing a JIT compiler and having to call into D functions from machine code I generated. Unfortunately, I seem to be experiencing a problem where the arguments are passed in the reverse order of what I would expect.

The functions I'm calling are global functions with 2 class pointer arguments. E.g.:

void foo(ClassA ptrA, ClassB ptrB) { ... }

The ABI page on dlang.org seems to imply that D uses the C calling convention on Linux. Now, using the C convention on 64-bit linux, this should mean that the first class pointer (ptrA) get passed in register RDI, and the second one (ptrB) in RSI. This is what I would expect but when I actually call a D function, the two arguments are reversed.

I understand that this isn't necessarily super clear without looking at code, but I just wanted to know if there was something obvious I might be overlooking with regards to the D calling convention on Linux/AMD64.

Is it because ptrA automatically gets treated as a "this" pointer, as if the function were a method of ClassA?

Reply via email to