Alexandre Julliard : msvcrt: Add call frame annotations in x86 assembly code.
Alexandre Julliard
julliard at winehq.org
Thu Jun 25 08:13:57 CDT 2009
Module: wine
Branch: master
Commit: 0cb406ef290f46ba0060d609a2b1024c28cf1352
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0cb406ef290f46ba0060d609a2b1024c28cf1352
Author: Alexandre Julliard <julliard at 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)
More information about the wine-cvs
mailing list