[fpc-pascal] Question on Calling Conventions (for: PascalScript on Win x64)

Alexander Hofmann alexander.hofmann at new-h.de
Wed Sep 5 18:27:50 CEST 2012

Hi there.

This is a cross-post (cross-mail ?) to
http://www.lazarus.freepascal.org/index.php/topic,17978.0.html as I got
the hint there that it might be better to ask on the list instead of in
the forum, at least concerning the calling conventions - but I'll ask
the whole lot, anyway; I hope that's ok (and, yes, I made the mistake to
ask on the Lazarus list before, so I sincerely hope I won't bother the
wrong people again, sorry)

Is there any difference in the calling convention on x64-Systems between
Delphi and Lazarus? I could only find the "standard" information on
Windows x64 calling conventions, without special care of constructors,
if there is any.

The reason why I'm asking is the following:
I'm trying to get PascalScript running (completely, it does up to some
extend) on Win x64. I had to do some changes in x64.inc, see below - but
as far as I know, that should work - and it does, for all kinds of
calls, except calling constructors on Components.
Scripts like the following will crash the Program with a SIGSEGV.

|program Script;
  f:=TForm.CreateNew(nil); //<- Works
  b:=TButton.Create(f); //<- crash

Crash in the Program is here:

000000000044F900 4883ec38                 sub    $0x38,%rsp
000000000044F904 48895c2420               mov    %rbx,0x20(%rsp)
000000000044F909 4889742428               mov    %rsi,0x28(%rsp)
000000000044F90E 4889cb                   mov    %rcx,%rbx
000000000044F911 4889d6                   mov    %rdx,%rsi
000000000044F914 4889da                   mov    %rbx,%rdx
000000000044F917 4889f1                   mov    %rsi,%rcx
000000000044F91A 4889f0                   mov    %rsi,%rax
000000000044F91D 488b00                   mov    (%rax),%rax
000000000044F920 ff9068010000             callq  *0x168(%rax)  <-- crash| 

The same Script runs fine when the Application was compiled with x86
Lazarus 1.0. By the way: creating a TObject with e.g. o:=TObject.Create
doesn't break at al.

Interestingly (and that is how I came to ask about the calling
conventions), when I start debugging
<SomeClass>.Create(aOwner:TComponent)-Type of Constructors, there is
some difference in the Register values, depending on whether the
Constructor was called from "pure" FPC-Code or the Script (at least so
it seems):

o Called from FPC: rcx: 0 (nil), rdx: Class Reference, r8: Value of aOwner
o Called from Script: rcx: Class Reference, rdx: 1 (!?), r8: Value of
aOwner (at least so it seems)

Did anybody else stumble about that problem before?

Thanks for your help!

I can compile the downloadable latest stable version from RemObject's
website (the one with the EXE-Installer) as well as the latest
development version from https://github.com/remobjects/pascalscript OR
(that's not in the Forum) the PascalScript-version included in Lazarus'
SVN, no Problem there, after two small changes in x64.inc (see below).
My knowledge of Assembler is limited at best, but It works for calling
other types of methods...

Index: x64.inc
--- x64.inc    (revision 38441)
+++ x64.inc    (working copy)
@@ -14,7 +14,7 @@
   _RCX, _RDX, _R8, _R9: IPointer;
   var _XMM0: Double;
   _XMM1, _XMM2, _XMM3: Double;
-  aStack: Pointer; aItems: IntPtr); assembler; {$IFDEF
+  aStack: Pointer; aItems: PtrUInt); assembler; {$IFDEF
 (* Registers:
     RCX: Address
@@ -37,7 +37,7 @@
   mov rdx, aStack
   jmp @compareitems
-  push [rdx]
+  push qword ptr [rdx]
   dec rcx
   sub rdx,8

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20120905/ac86e39f/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 257 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20120905/ac86e39f/attachment.sig>

More information about the fpc-pascal mailing list