Alexandre Julliard : winebuild: Add cfi annotations to the import thunk for i386.

Alexandre Julliard julliard at winehq.org
Mon Apr 12 09:54:08 CDT 2010


Module: wine
Branch: master
Commit: eba56752fd9ef5d41a7f1c2a3149f062ee4b9e75
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=eba56752fd9ef5d41a7f1c2a3149f062ee4b9e75

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr 12 12:04:50 2010 +0200

winebuild: Add cfi annotations to the import thunk for i386.

---

 tools/winebuild/import.c |   42 +++++++++++++++++++++++++-----------------
 1 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index bc34b5f..99619da 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -645,9 +645,10 @@ void output_get_pc_thunk(void)
     output( "\t.align %d\n", get_alignment(4) );
     output( "\t%s\n", func_declaration("__wine_spec_get_pc_thunk_eax") );
     output( "%s:\n", asm_name("__wine_spec_get_pc_thunk_eax") );
-    output( "\tpopl %%eax\n" );
-    output( "\tpushl %%eax\n" );
+    output_cfi( ".cfi_startproc" );
+    output( "\tmovl (%%esp),%%eax\n" );
     output( "\tret\n" );
+    output_cfi( ".cfi_endproc" );
     output_function_size( "__wine_spec_get_pc_thunk_eax" );
 }
 
@@ -657,6 +658,7 @@ static void output_import_thunk( const char *name, const char *table, int pos )
     output( "\n\t.align %d\n", get_alignment(4) );
     output( "\t%s\n", func_declaration(name) );
     output( "%s\n", asm_globl(name) );
+    output_cfi( ".cfi_startproc" );
 
     switch(target_cpu)
     {
@@ -672,9 +674,7 @@ static void output_import_thunk( const char *name, const char *table, int pos )
         }
         break;
     case CPU_x86_64:
-        output_cfi( ".cfi_startproc" );
         output( "\tjmpq *%s+%d(%%rip)\n", table, pos );
-        output_cfi( ".cfi_endproc" );
         break;
     case CPU_SPARC:
         if ( !UsePIC )
@@ -725,6 +725,7 @@ static void output_import_thunk( const char *name, const char *table, int pos )
         output( "\tbctr\n" );
         break;
     }
+    output_cfi( ".cfi_endproc" );
     output_function_size( name );
 }
 
@@ -968,19 +969,25 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
     output( "%s:\n", asm_name(delayed_import_loaders));
     output( "\t%s\n", func_declaration("__wine_delay_load_asm") );
     output( "%s:\n", asm_name("__wine_delay_load_asm") );
+    output_cfi( ".cfi_startproc" );
     switch(target_cpu)
     {
     case CPU_x86:
         output( "\tpushl %%ecx\n" );
+        output_cfi( ".cfi_adjust_cfa_offset 4" );
         output( "\tpushl %%edx\n" );
+        output_cfi( ".cfi_adjust_cfa_offset 4" );
         output( "\tpushl %%eax\n" );
+        output_cfi( ".cfi_adjust_cfa_offset 4" );
         output( "\tcall %s\n", asm_name("__wine_spec_delay_load") );
+        output_cfi( ".cfi_adjust_cfa_offset -4" );
         output( "\tpopl %%edx\n" );
+        output_cfi( ".cfi_adjust_cfa_offset -4" );
         output( "\tpopl %%ecx\n" );
+        output_cfi( ".cfi_adjust_cfa_offset -4" );
         output( "\tjmp *%%eax\n" );
         break;
     case CPU_x86_64:
-        output_cfi( ".cfi_startproc" );
         output( "\tsubq $88,%%rsp\n" );
         output_cfi( ".cfi_adjust_cfa_offset 88" );
         output( "\tmovq %%rdx,80(%%rsp)\n" );
@@ -1000,7 +1007,6 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
         output( "\taddq $88,%%rsp\n" );
         output_cfi( ".cfi_adjust_cfa_offset -88" );
         output( "\tjmp *%%rax\n" );
-        output_cfi( ".cfi_endproc" );
         break;
     case CPU_SPARC:
         output( "\tsave %%sp, -96, %%sp\n" );
@@ -1068,6 +1074,7 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
         output( "\tbctr\n");
         break;
     }
+    output_cfi( ".cfi_endproc" );
     output_function_size( "__wine_delay_load_asm" );
     output( "\n" );
 
@@ -1080,6 +1087,7 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
             const char *name = odp->name ? odp->name : odp->export_name;
 
             output( ".L__wine_delay_imp_%d_%s:\n", i, name );
+            output_cfi( ".cfi_startproc" );
             switch(target_cpu)
             {
             case CPU_x86:
@@ -1087,10 +1095,8 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
                 output( "\tjmp %s\n", asm_name("__wine_delay_load_asm") );
                 break;
             case CPU_x86_64:
-                output_cfi( ".cfi_startproc" );
                 output( "\tmovq $%d,%%rax\n", (idx << 16) | j );
                 output( "\tjmp %s\n", asm_name("__wine_delay_load_asm") );
-                output_cfi( ".cfi_endproc" );
                 break;
             case CPU_SPARC:
                 output( "\tset %d, %%g1\n", (idx << 16) | j );
@@ -1132,6 +1138,7 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
                 }
                 break;
             }
+            output_cfi( ".cfi_endproc" );
         }
         idx++;
     }
@@ -1214,6 +1221,7 @@ void output_stubs( DLLSPEC *spec )
         output( "\t.align %d\n", get_alignment(4) );
         output( "\t%s\n", func_declaration(name) );
         output( "%s:\n", asm_name(name) );
+        output_cfi( ".cfi_startproc" );
 
         switch (target_cpu)
         {
@@ -1229,7 +1237,8 @@ void output_stubs( DLLSPEC *spec )
             output(" \tnop\n" );
             output(" \tnop\n" );
 
-            output( "\tsubl $4,%%esp\n" );
+            output( "\tsubl $12,%%esp\n" );
+            output_cfi( ".cfi_adjust_cfa_offset 12" );
             if (UsePIC)
             {
                 output( "\tcall %s\n", asm_name("__wine_spec_get_pc_thunk_eax") );
@@ -1237,29 +1246,28 @@ void output_stubs( DLLSPEC *spec )
                 if (exp_name)
                 {
                     output( "\tleal .L%s_string-1b(%%eax),%%ecx\n", name );
-                    output( "\tpushl %%ecx\n" );
+                    output( "\tmovl %%ecx,4(%%esp)\n" );
                     count++;
                 }
                 else
-                    output( "\tpushl $%d\n", odp->ordinal );
+                    output( "\tmovl $%d,4(%%esp)\n", odp->ordinal );
                 output( "\tleal .L__wine_spec_file_name-1b(%%eax),%%ecx\n" );
-                output( "\tpushl %%ecx\n" );
+                output( "\tmovl %%ecx,(%%esp)\n" );
             }
             else
             {
                 if (exp_name)
                 {
-                    output( "\tpushl $.L%s_string\n", name );
+                    output( "\tmovl $.L%s_string,4(%%esp)\n", name );
                     count++;
                 }
                 else
-                    output( "\tpushl $%d\n", odp->ordinal );
-                output( "\tpushl $.L__wine_spec_file_name\n" );
+                    output( "\tmovl $%d,4(%%esp)\n", odp->ordinal );
+                output( "\tmovl $.L__wine_spec_file_name,(%%esp)\n" );
             }
             output( "\tcall %s\n", asm_name("__wine_spec_unimplemented_stub") );
             break;
         case CPU_x86_64:
-            output_cfi( ".cfi_startproc" );
             output( "\tsubq $8,%%rsp\n" );
             output_cfi( ".cfi_adjust_cfa_offset 8" );
             output( "\tleaq .L__wine_spec_file_name(%%rip),%%rdi\n" );
@@ -1271,11 +1279,11 @@ void output_stubs( DLLSPEC *spec )
             else
                 output( "\tmovq $%d,%%rsi\n", odp->ordinal );
             output( "\tcall %s\n", asm_name("__wine_spec_unimplemented_stub") );
-            output_cfi( ".cfi_endproc" );
             break;
         default:
             assert(0);
         }
+        output_cfi( ".cfi_endproc" );
         output_function_size( name );
     }
 




More information about the wine-cvs mailing list