From 1728c02561eb9b5cb423b073f3671bd71dc37a70 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 16 Sep 2004 22:14:05 +0000 Subject: [PATCH] Added debug info to OP_RETN in JIT --- amxmodx/JIT/jits.asm | 52 ++++++++++++++++++++++++++++++++++++++++--- amxmodx/JIT/jits.o | Bin 27214 -> 27566 bytes 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/amxmodx/JIT/jits.asm b/amxmodx/JIT/jits.asm index a0a97c3f..edd4f083 100755 --- a/amxmodx/JIT/jits.asm +++ b/amxmodx/JIT/jits.asm @@ -1073,11 +1073,57 @@ OP_RET: ;good OP_RETN: ;nop; - GO_ON j_retn, OP_CALL + ;save registers + push eax + push ebp + ;get .amx flags + mov ebp,[amxhead] + mov eax,[ebp+_h_flags] + ;check to see if the flag has line ops + and eax,AMX_FLAG_DEBUG + cmp eax,AMX_FLAG_DEBUG + ;restore registers + pop ebp + pop eax + ;if so, skip down to debug compiler + jmp _go_jit_retn_debug - j_retn: +_go_jit_retn_nodebug: + GO_ON j_retn_nodebug, _go_jit_retn_go + j_retn_nodebug: jmp [jit_retn] - CHECKCODESIZE j_retn + CHECKCODESIZE j_retn_nodebug +_go_jit_retn_go: + jmp _go_jit_retn_end + +_go_jit_retn_debug: + GO_ON j_retn, OP_CALL + j_retn: + push ebp + push eax + push edx + ;get AMX + mov ebp,amx + ;get debug call ptr + mov eax,[ebp+_userdata2] + ;check validity + mov edx, dword 0 + cmp eax, edx + je _go_jit_skip_debug + xchg esp,esi ;switch stack + push 1 ;param 2 mode 1 = pop + push ebp ;param 1 - amx + call eax ;indirect debug call + add esp, 8 ;restore stack + xchg esp,esi ;return to AMX stack + mov ebp,amx ;restore AMX [necessary?] + _go_jit_skip_debug: + pop edx + pop eax + pop ebp + jmp [jit_retn] + CHECKCODESIZE j_retn +_go_jit_retn_end: ;good OP_CALL: diff --git a/amxmodx/JIT/jits.o b/amxmodx/JIT/jits.o index 8b1a6bb616f7a4e5b2975e019e8191ae6ac211bc..a0d616ddb21bd29ab87ad50a45a1fed6b2473086 100755 GIT binary patch literal 27566 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 literal 27214 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 CPi;8>