I'm not quite sure what you think is wrong with this code (from the fpc
viewpoint):

# [31] WriteLn(master.getVersion());
    call    fpc_get_output
    movq    %rax,%rbx
    movq    U_P$CREATE_MASTER,%rdi
    movq    U_P$CREATE_MASTER,%rax
    movq    (%rax),%rax
    call    *(%rax)
    movl    %eax,%edx
    movslq    %edx,%rdx
    movq    %rbx,%rsi
    movl    $0,%edi
    call    fpc_write_text_sint
    call    FPC_IOCHECK
    movq    %rbx,%rdi
    call    fpc_writeln_end
    call    FPC_IOCHECK



As far as I can make out, it is loading the instance variable (Master)
into %rdi

movq    U_P$CREATE_MASTER,%rdi

It then assumes a simple vtable and  loads and calls the first pointer
in the table:

   movq    U_P$CREATE_MASTER,%rax
    movq    (%rax),%rax
    call    *(%rax)

On return, the result is assumed to be in $eax (standard cdecl for a
32-bit integer return), and then, after a "sign extend" to 64-bit passes
it on to the writeln:

    movl    %eax,%edx
    movslq    %edx,%rdx
    movq    %rbx,%rsi
    movl    $0,%edi
    call    fpc_write_text_sint

It would be interesting to see what the c++ compiler expected, but my
guess is that it does not use %rdi for the instance variable.


On 14/08/14 12:28, Dimitry Sibiryakov wrote:
> 14.08.2014 11:34, Alex Peshkoff wrote:
>> HP C/aC++ Version A.06.26
>
>   Alpha version?..
>
> PS: The problem with FPC which started whole this topic seems to be a
> compiler's bug which destroy value returning by external function.
> Testcase is attached. I registered ticket in their bugtracker:
> http://bugs.freepascal.org/view.php?id=26593.
>
>
>
> ------------------------------------------------------------------------------
>
>
> Firebird-Devel mailing list, web interface at 
> https://lists.sourceforge.net/lists/listinfo/firebird-devel

------------------------------------------------------------------------------
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to