* implement thunking for x86_64 SysV ABI targets

git-svn-id: trunk@42734 -
This commit is contained in:
svenbarth 2019-08-18 18:30:42 +00:00
parent 58ada1f547
commit 652e1985a9

View File

@ -863,7 +863,7 @@ asm
jmp %eax jmp %eax
RawThunkEnd: RawThunkEnd:
end; end;
{$elseif defined(cpux86_64) and defined(win64)} {$elseif defined(cpux86_64)}
const const
RawThunkPlaceholderProc = PtrUInt($8765876587658765); RawThunkPlaceholderProc = PtrUInt($8765876587658765);
RawThunkPlaceholderContext = PtrUInt($4321432143214321); RawThunkPlaceholderContext = PtrUInt($4321432143214321);
@ -872,6 +872,7 @@ type
TRawThunkProc = PtrUInt; TRawThunkProc = PtrUInt;
TRawThunkContext = PtrUInt; TRawThunkContext = PtrUInt;
{$ifdef win64}
procedure RawThunk; assembler; nostackframe; procedure RawThunk; assembler; nostackframe;
asm asm
{ Self is always in register RCX } { Self is always in register RCX }
@ -880,6 +881,16 @@ asm
jmp %rax jmp %rax
RawThunkEnd: RawThunkEnd:
end; end;
{$else}
procedure RawThunk; assembler; nostackframe;
asm
{ Self is always in register RDI }
movl RawThunkPlaceholderContext, %rdi
movl RawThunkPlaceholderProc, %rax
jmp %rax
RawThunkEnd:
end;
{$endif}
{$endif} {$endif}
{$if declared(RawThunk)} {$if declared(RawThunk)}