Linux 64bit Calling Convention

Maxime Chevalier maximechevalierb at gmail.com
Wed Feb 27 16:42:49 PST 2013


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?


More information about the Digitalmars-d mailing list