Module: wine Branch: master Commit: 77a13f69b41e98ac6321745b57f0a8250ee92914 URL: http://source.winehq.org/git/wine.git/?a=commit;h=77a13f69b41e98ac6321745b57...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 22 16:34:35 2016 +0900
winebuild: Add a separate structure to store the data of imported functions.
We only need the name and ordinal.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
tools/winebuild/import.c | 101 +++++++++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 43 deletions(-)
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index f6c70de..b549db8 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -38,18 +38,26 @@ #include "wine/list.h" #include "build.h"
+struct import_func +{ + const char *name; + const char *export_name; + int ordinal; +}; + struct import { - struct list entry; /* entry in global dll list */ - char *dll_name; /* exported file name of the dll */ - char *c_name; /* dll name as a C-compatible identifier */ - char *full_name; /* full name of the input file */ - dev_t dev; /* device/inode of the input file */ - ino_t ino; - ORDDEF **exports; /* functions exported from this dll */ - int nb_exports; /* number of exported functions */ - ORDDEF **imports; /* functions we want to import from this dll */ - int nb_imports; /* number of imported functions */ + struct list entry; /* entry in global dll list */ + char *dll_name; /* exported file name of the dll */ + char *c_name; /* dll name as a C-compatible identifier */ + char *full_name; /* full name of the input file */ + dev_t dev; /* device/inode of the input file */ + ino_t ino; + ORDDEF **exports; /* functions exported from this dll */ + int nb_exports; /* number of exported functions */ + struct import_func *imports; /* functions we want to import from this dll */ + int nb_imports; /* number of imported functions */ + int max_imports; /* size of imports array */ };
static struct strarray undef_symbols; /* list of undefined symbols */ @@ -298,10 +306,18 @@ void add_extra_ld_symbol( const char *name ) }
/* add a function to the list of imports from a given dll */ -static void add_import_func( struct import *imp, ORDDEF *func ) +static void add_import_func( struct import *imp, const char *name, const char *export_name, int ordinal ) { - imp->imports = xrealloc( imp->imports, (imp->nb_imports+1) * sizeof(*imp->imports) ); - imp->imports[imp->nb_imports++] = func; + if (imp->nb_imports == imp->max_imports) + { + imp->max_imports *= 2; + if (imp->max_imports < 32) imp->max_imports = 32; + imp->imports = xrealloc( imp->imports, imp->max_imports * sizeof(*imp->imports) ); + } + imp->imports[imp->nb_imports].name = name; + imp->imports[imp->nb_imports].export_name = export_name; + imp->imports[imp->nb_imports].ordinal = ordinal; + imp->nb_imports++; }
/* get the default entry point for a given spec file */ @@ -534,7 +550,8 @@ void resolve_dll_imports( DLLSPEC *spec, struct list *list ) odp->link_name, imp->dll_name ); else { - add_import_func( imp, odp ); + add_import_func( imp, (odp->flags & FLAG_NONAME) ? NULL : odp->name, + odp->export_name, odp->ordinal ); remove_name( &undef_symbols, j-- ); removed++; } @@ -693,16 +710,16 @@ static void output_immediate_imports(void) { for (j = 0; j < import->nb_imports; j++) { - ORDDEF *odp = import->imports[j]; - if (!(odp->flags & FLAG_NONAME)) + struct import_func *func = &import->imports[j]; + if (func->name) output( "\t%s .L__wine_spec_import_data_%s_%s-.L__wine_spec_rva_base\n", - get_asm_ptr_keyword(), import->c_name, odp->name ); + get_asm_ptr_keyword(), import->c_name, func->name ); else { if (get_ptr_size() == 8) - output( "\t.quad 0x800000000000%04x\n", odp->ordinal ); + output( "\t.quad 0x800000000000%04x\n", func->ordinal ); else - output( "\t.long 0x8000%04x\n", odp->ordinal ); + output( "\t.long 0x8000%04x\n", func->ordinal ); } } output( "\t%s 0\n", get_asm_ptr_keyword() ); @@ -719,14 +736,12 @@ static void output_immediate_imports(void) { for (j = 0; j < import->nb_imports; j++) { - ORDDEF *odp = import->imports[j]; - if (!(odp->flags & FLAG_NONAME)) - { - output( "\t.align %d\n", get_alignment(2) ); - output( ".L__wine_spec_import_data_%s_%s:\n", import->c_name, odp->name ); - output( "\t.short %d\n", odp->ordinal ); - output( "\t%s "%s"\n", get_asm_string_keyword(), odp->name ); - } + struct import_func *func = &import->imports[j]; + if (!func->name) continue; + output( "\t.align %d\n", get_alignment(2) ); + output( ".L__wine_spec_import_data_%s_%s:\n", import->c_name, func->name ); + output( "\t.short %d\n", func->ordinal ); + output( "\t%s "%s"\n", get_asm_string_keyword(), func->name ); } }
@@ -756,8 +771,8 @@ static void output_immediate_import_thunks(void) { for (j = 0; j < import->nb_imports; j++, pos += get_ptr_size()) { - ORDDEF *odp = import->imports[j]; - output_import_thunk( odp->name ? odp->name : odp->export_name, + struct import_func *func = &import->imports[j]; + output_import_thunk( func->name ? func->name : func->export_name, ".L__wine_spec_import_data_ptrs", pos ); } pos += get_ptr_size(); @@ -812,8 +827,8 @@ static void output_delayed_imports( const DLLSPEC *spec ) { for (j = 0; j < import->nb_imports; j++) { - ORDDEF *odp = import->imports[j]; - const char *name = odp->name ? odp->name : odp->export_name; + struct import_func *func = &import->imports[j]; + const char *name = func->name ? func->name : func->export_name; output( "\t%s .L__wine_delay_imp_%s_%s\n", get_asm_ptr_keyword(), import->c_name, name ); } @@ -824,12 +839,12 @@ static void output_delayed_imports( const DLLSPEC *spec ) { for (j = 0; j < import->nb_imports; j++) { - ORDDEF *odp = import->imports[j]; - if (!odp->name) - output( "\t%s %d\n", get_asm_ptr_keyword(), odp->ordinal ); + struct import_func *func = &import->imports[j]; + if (!func->name) + output( "\t%s %d\n", get_asm_ptr_keyword(), func->ordinal ); else output( "\t%s .L__wine_delay_data_%s_%s\n", - get_asm_ptr_keyword(), import->c_name, odp->name ); + get_asm_ptr_keyword(), import->c_name, func->name ); } }
@@ -849,10 +864,10 @@ static void output_delayed_imports( const DLLSPEC *spec ) { for (j = 0; j < import->nb_imports; j++) { - ORDDEF *odp = import->imports[j]; - if (!odp->name) continue; - output( ".L__wine_delay_data_%s_%s:\n", import->c_name, odp->name ); - output( "\t%s "%s"\n", get_asm_string_keyword(), odp->name ); + struct import_func *func = &import->imports[j]; + if (!func->name) continue; + output( ".L__wine_delay_data_%s_%s:\n", import->c_name, func->name ); + output( "\t%s "%s"\n", get_asm_string_keyword(), func->name ); } } output_function_size( "__wine_spec_delay_imports" ); @@ -998,8 +1013,8 @@ static void output_delayed_import_thunks( const DLLSPEC *spec ) { for (j = 0; j < import->nb_imports; j++) { - ORDDEF *odp = import->imports[j]; - const char *name = odp->name ? odp->name : odp->export_name; + struct import_func *func = &import->imports[j]; + const char *name = func->name ? func->name : func->export_name;
output( ".L__wine_delay_imp_%s_%s:\n", import->c_name, name ); output_cfi( ".cfi_startproc" ); @@ -1082,8 +1097,8 @@ static void output_delayed_import_thunks( const DLLSPEC *spec ) { for (j = 0; j < import->nb_imports; j++, pos += get_ptr_size()) { - ORDDEF *odp = import->imports[j]; - output_import_thunk( odp->name ? odp->name : odp->export_name, + struct import_func *func = &import->imports[j]; + output_import_thunk( func->name ? func->name : func->export_name, ".L__wine_delay_IAT", pos ); } }