Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
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: |
c0b0fced3e79de5e4a9a0aafbc091ab2 |
User & Date: | ab 2016-06-16 12:05:46 |
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 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'
|