mORMot and Open Source friends
Check-in [c0b0fced3e]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:{2752} ensure CallMethod() on x86-64/Delphi use regular .params command for easier debugging
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: c0b0fced3e79de5e4a9a0aafbc091ab289e71f81
User & Date: ab 2016-06-16 12:05:46
Context
2016-06-16
18:59
{2753} introduce FPC RTTI modification to match Delphi RTTI for any stored PTypeInfo field check-in: ed48b52743 user: ab tags: trunk
12:05
{2752} ensure CallMethod() on x86-64/Delphi use regular .params command for easier debugging check-in: c0b0fced3e user: ab tags: trunk
10:39
{2751} finally fixed unexpected memory corruption in TSQLRestStorageMongoDB.GetJSONValues check-in: 85dbfbf833 user: ab tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to SQLite3/mORMot.pas.

54401
54402
54403
54404
54405
54406
54407
54408

54409
54410
54411
54412
54413
54414
54415
54416
54417
54418





54419
54420
54421
54422
54423
54424
54425
54426
54427
54428
54429
54430
54431
54432
54433
54434
54435
54436
54437
54438
54439
54440
54441
54442
54443
.....
54446
54447
54448
54449
54450
54451
54452

54453
54454
54455
54456
54457
54458
54459
54460
54461
54462
54463
54464
54465
54466
54467
54468
54469
54470
54471
54472
54473
54474
54475
54476
54477
54478
54479
54480
54481
54482
54483
54484
54485


54486
54487
54488

54489
54490
54491
54492
54493
54494
54495
.....
56360
56361
56362
56363
56364
56365
56366
56367
56368
56369
56370
56371
56372
56373
56374
   mov	sp, fp
   ldp	x19, x20, [sp], #16
   ldp	fp, lr, [sp], #16
   ret
end;
{$endif CPUAARCH64}

{$ifdef CPUX64}

assembler;{$ifdef FPC}nostackframe;{$endif}
asm
    {$ifndef FPC}.noframe{$endif}
    push rbp
    push r12
    mov rbp,rsp
    // simulate .params 60 ... size for 60 parameters
    lea rsp,[rsp-MAX_EXECSTACK]
    // align stack
    and rsp, -16





    // get Args
    mov r12, Args
    // copy (push) stack content (if any)
    mov ecx, [r12].TCallMethodArgs.StackSize
    mov rdx, [r12].TCallMethodArgs.StackAddr
    jmp @checkstack
@addstack:
    {$ifdef FPC}
    push qword ptr [rdx]
    {$else}
    push [rdx]
    {$endif}
    dec ecx
    sub rdx,8
@checkstack:
    or ecx, ecx
    jnz @addstack
    // fill registers
    {$ifdef LINUX}
    // Linux/BSD System V AMD64 ABI
    mov rdi, [r12+TCallMethodArgs.ParamRegs+REGRDI*8-8]
    mov rsi, [r12+TCallMethodArgs.ParamRegs+REGRSI*8-8]
    mov rdx, [r12+TCallMethodArgs.ParamRegs+REGRDX *8-8]
    mov rcx, [r12+TCallMethodArgs.ParamRegs+REGRCX *8-8]
    mov r8, [r12+TCallMethodArgs.ParamRegs+REGR8*8-8]
................................................................................
    movsd xmm1, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM1*8-8]
    movsd xmm2, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM2*8-8]
    movsd xmm3, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM3*8-8]
    movsd xmm4, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM4*8-8]
    movsd xmm5, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM5*8-8]
    movsd xmm6, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM6*8-8]
    movsd xmm7, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM7*8-8]

    {$else}
    // Win64 ABI
    mov rcx, [r12+TCallMethodArgs.ParamRegs+REGRCX*8-8]
    mov rdx, [r12+TCallMethodArgs.ParamRegs+REGRDX*8-8]
    mov r8, [r12+TCallMethodArgs.ParamRegs+REGR8 *8-8]
    mov r9, [r12+TCallMethodArgs.ParamRegs+REGR9 *8-8]
    movsd xmm0, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM0*8-8]
    movsd xmm1, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM1*8-8]
    movsd xmm2, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM2*8-8]
    movsd xmm3, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM3*8-8]
    {$endif LINUX}
    // alf: adjust for shadow-space (fixme?)
    // caller must ensure that there is space on the stack for the API
    // to store the parameters (RCX,RDX,R8 and R9)
    {$ifndef Linux}
    sub rsp, $20
    {$endif}
    // call method
    call [r12].TCallMethodArgs.method
    // undo the damage (shadow-space) done earlier
    {$ifndef Linux}
    add rsp, $20
    {$endif}
    // retrieve result
    mov [r12].TCallMethodArgs.res64, rax
    mov cl, [r12].TCallMethodArgs.resKind
    cmp cl, smvDouble
    je @d
    cmp cl, smvDateTime
    je @d
    cmp cl, smvCurrency
    jne @e
@d: movlpd qword ptr [r12].TCallMethodArgs.res64, xmm0


@e: mov rsp, rbp
    pop r12
    pop rbp

end;
{$endif CPUX64}

{$ifdef CPUX86}
asm
    push esi
    push ebp
................................................................................
    {$else}
    {$ifdef CPUINTEL}
    call.StackSize := ArgsSizeInStack shr 3;
    // ensure stack aligned on 16 bytes (paranoid)
    if call.StackSize and 1 <> 0 then
      inc(call.StackSize);
    // stack is filled reversed (RTL)
    call.StackAddr := PtrInt(@Stack[call.StackSize*8-8]);
    {$else}
    // stack is filled normally (LTR)
    call.StackAddr := PtrInt(@Stack[0]);
    call.StackSize := ArgsSizeInStack shr 2;
    {$ifdef CPUAARCH64}
    call.StackSize := ArgsSizeInStack shr 3;
    // ensure stack aligned on 16 bytes (mandatory: needed for correct low level asm)






|
>
|

<







>
>
>
>
>







<

<
<
<





|







 







>










|
<
<
<
<
<
<
<

<
<
|
|










>
>
|


>







 







|







54401
54402
54403
54404
54405
54406
54407
54408
54409
54410
54411

54412
54413
54414
54415
54416
54417
54418
54419
54420
54421
54422
54423
54424
54425
54426
54427
54428
54429
54430

54431



54432
54433
54434
54435
54436
54437
54438
54439
54440
54441
54442
54443
54444
.....
54447
54448
54449
54450
54451
54452
54453
54454
54455
54456
54457
54458
54459
54460
54461
54462
54463
54464
54465







54466


54467
54468
54469
54470
54471
54472
54473
54474
54475
54476
54477
54478
54479
54480
54481
54482
54483
54484
54485
54486
54487
54488
54489
54490
54491
.....
56356
56357
56358
56359
56360
56361
56362
56363
56364
56365
56366
56367
56368
56369
56370
   mov	sp, fp
   ldp	x19, x20, [sp], #16
   ldp	fp, lr, [sp], #16
   ret
end;
{$endif CPUAARCH64}

{$ifdef CPUX64} assembler;
{$ifdef FPC}
  nostackframe;
asm

    push rbp
    push r12
    mov rbp,rsp
    // simulate .params 60 ... size for 60 parameters
    lea rsp,[rsp-MAX_EXECSTACK]
    // align stack
    and rsp, -16
{$else DELPHI} // ensure we use regular .params command for easier debugging
asm
    .params 64    // size for 64 parameters
    .pushnv r12   // generate prolog+epilog to save and restore non-volatile r12
{$endif FPC}
    // get Args
    mov r12, Args
    // copy (push) stack content (if any)
    mov ecx, [r12].TCallMethodArgs.StackSize
    mov rdx, [r12].TCallMethodArgs.StackAddr
    jmp @checkstack
@addstack:

    push qword ptr [rdx]



    dec ecx
    sub rdx,8
@checkstack:
    or ecx, ecx
    jnz @addstack
    // fill registers and call method
    {$ifdef LINUX}
    // Linux/BSD System V AMD64 ABI
    mov rdi, [r12+TCallMethodArgs.ParamRegs+REGRDI*8-8]
    mov rsi, [r12+TCallMethodArgs.ParamRegs+REGRSI*8-8]
    mov rdx, [r12+TCallMethodArgs.ParamRegs+REGRDX *8-8]
    mov rcx, [r12+TCallMethodArgs.ParamRegs+REGRCX *8-8]
    mov r8, [r12+TCallMethodArgs.ParamRegs+REGR8*8-8]
................................................................................
    movsd xmm1, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM1*8-8]
    movsd xmm2, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM2*8-8]
    movsd xmm3, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM3*8-8]
    movsd xmm4, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM4*8-8]
    movsd xmm5, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM5*8-8]
    movsd xmm6, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM6*8-8]
    movsd xmm7, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM7*8-8]
    call [r12].TCallMethodArgs.method
    {$else}
    // Win64 ABI
    mov rcx, [r12+TCallMethodArgs.ParamRegs+REGRCX*8-8]
    mov rdx, [r12+TCallMethodArgs.ParamRegs+REGRDX*8-8]
    mov r8, [r12+TCallMethodArgs.ParamRegs+REGR8 *8-8]
    mov r9, [r12+TCallMethodArgs.ParamRegs+REGR9 *8-8]
    movsd xmm0, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM0*8-8]
    movsd xmm1, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM1*8-8]
    movsd xmm2, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM2*8-8]
    movsd xmm3, qword ptr [r12+TCallMethodArgs.FPRegs+REGXMM3*8-8]
    sub rsp,8*4   // reserve shadow-space for RCX,RDX,R8,R9 registers







    call [r12].TCallMethodArgs.method


    add rsp,8*4
    {$endif LINUX}
    // retrieve result
    mov [r12].TCallMethodArgs.res64, rax
    mov cl, [r12].TCallMethodArgs.resKind
    cmp cl, smvDouble
    je @d
    cmp cl, smvDateTime
    je @d
    cmp cl, smvCurrency
    jne @e
@d: movlpd qword ptr [r12].TCallMethodArgs.res64, xmm0
@e:
{$ifdef FPC}
    mov rsp, rbp
    pop r12
    pop rbp
{$endif}
end;
{$endif CPUX64}

{$ifdef CPUX86}
asm
    push esi
    push ebp
................................................................................
    {$else}
    {$ifdef CPUINTEL}
    call.StackSize := ArgsSizeInStack shr 3;
    // ensure stack aligned on 16 bytes (paranoid)
    if call.StackSize and 1 <> 0 then
      inc(call.StackSize);
    // stack is filled reversed (RTL)
    call.StackAddr := PtrInt(@Stack[call.StackSize shl 3-8]);
    {$else}
    // stack is filled normally (LTR)
    call.StackAddr := PtrInt(@Stack[0]);
    call.StackSize := ArgsSizeInStack shr 2;
    {$ifdef CPUAARCH64}
    call.StackSize := ArgsSizeInStack shr 3;
    // ensure stack aligned on 16 bytes (mandatory: needed for correct low level asm)

Changes to SynopseCommit.inc.

1
'1.18.2751'
|
1
'1.18.2752'