Module: wine Branch: master Commit: 0cb406ef290f46ba0060d609a2b1024c28cf1352 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0cb406ef290f46ba0060d609a2...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 25 11:50:42 2009 +0200
msvcrt: Add call frame annotations in x86 assembly code.
---
dlls/msvcrt/cppexcept.c | 8 ++++++++ dlls/msvcrt/except.c | 5 +++++ dlls/msvcrt/misc.c | 5 +++++ 3 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/dlls/msvcrt/cppexcept.c b/dlls/msvcrt/cppexcept.c index 6dafc9e..a777025 100644 --- a/dlls/msvcrt/cppexcept.c +++ b/dlls/msvcrt/cppexcept.c @@ -413,14 +413,22 @@ extern DWORD CDECL __CxxFrameHandler( PEXCEPTION_RECORD rec, EXCEPTION_REGISTRAT PCONTEXT context, EXCEPTION_REGISTRATION_RECORD** dispatch ); __ASM_GLOBAL_FUNC( __CxxFrameHandler, "pushl $0\n\t" /* nested_trylevel */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl $0\n\t" /* nested_frame */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl %eax\n\t" /* descr */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl 28(%esp)\n\t" /* dispatch */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl 28(%esp)\n\t" /* context */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl 28(%esp)\n\t" /* frame */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl 28(%esp)\n\t" /* rec */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "call " __ASM_NAME("cxx_frame_handler") "\n\t" "add $28,%esp\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset -28\n\t") "ret" )
diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c index 9b254f8..5de42db 100644 --- a/dlls/msvcrt/except.c +++ b/dlls/msvcrt/except.c @@ -117,14 +117,19 @@ static DWORD MSVCRT_nested_handler(PEXCEPTION_RECORD rec,
/* Provided for VC++ binary compatibility only */ __ASM_GLOBAL_FUNC(_EH_prolog, + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") /* skip ret addr */ "pushl $-1\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl %eax\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl %fs:0\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "movl %esp, %fs:0\n\t" "movl 12(%esp), %eax\n\t" "movl %ebp, 12(%esp)\n\t" "leal 12(%esp), %ebp\n\t" "pushl %eax\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "ret")
static void msvcrt_local_unwind2(MSVCRT_EXCEPTION_FRAME* frame, int trylevel, void *ebp) diff --git a/dlls/msvcrt/misc.c b/dlls/msvcrt/misc.c index 3d3c03b..082c38b 100644 --- a/dlls/msvcrt/misc.c +++ b/dlls/msvcrt/misc.c @@ -138,7 +138,10 @@ __ASM_GLOBAL_FUNC(_chkesp, "jnz 1f\n\t" "ret\n" "1:\tpushl %ebp\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") + __ASM_CFI(".cfi_rel_offset %ebp,0\n\t") "movl %esp,%ebp\n\t" + __ASM_CFI(".cfi_def_cfa_register %ebp\n\t") "subl $12,%esp\n\t" "pushl %eax\n\t" "pushl %ecx\n\t" @@ -148,6 +151,8 @@ __ASM_GLOBAL_FUNC(_chkesp, "popl %ecx\n\t" "popl %eax\n\t" "leave\n\t" + __ASM_CFI(".cfi_def_cfa %esp,4\n\t") + __ASM_CFI(".cfi_same_value %ebp\n\t") "ret")
void CDECL MSVCRT_chkesp_fail(void)