Module: wine Branch: master Commit: e6fe7341f503b317eacd1380a7a1529e52c49c17 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e6fe7341f503b317eacd1380a7...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Dec 6 21:22:34 2007 +0100
winebuild: Improved checks for missing forward entry point targets.
---
tools/winebuild/import.c | 55 +++++++++++++++++++++------------------------ 1 files changed, 26 insertions(+), 29 deletions(-)
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 4487921..a1fdbd0 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -424,39 +424,39 @@ static int check_unused( const struct import* imp, const DLLSPEC *spec ) }
/* check if a given forward does exist in one of the imported dlls */ -static void check_undefined_forward( DLLSPEC *spec, ORDDEF *odp ) +static void check_undefined_forwards( DLLSPEC *spec ) { char *link_name, *api_name, *dll_name, *p; - int i, found = 0; + int i, j;
- assert( odp->flags & FLAG_FORWARD ); + for (i = 0; i < spec->nb_entry_points; i++) + { + ORDDEF *odp = &spec->entry_points[i];
- link_name = xstrdup( odp->link_name ); - p = strrchr( link_name, '.' ); - *p = 0; - api_name = p + 1; - dll_name = get_dll_name( link_name, NULL ); + if (!(odp->flags & FLAG_FORWARD)) continue;
- for (i = 0; i < nb_imports; i++) - { - struct import *imp = dll_imports[i]; + link_name = xstrdup( odp->link_name ); + p = strrchr( link_name, '.' ); + *p = 0; + api_name = p + 1; + dll_name = get_dll_name( link_name, NULL );
- if (!strcasecmp( imp->spec->file_name, dll_name )) + for (j = 0; j < nb_imports; j++) { - if (find_export( api_name, imp->exports, imp->nb_exports )) - { - found = 1; - break; - } + struct import *imp = dll_imports[j]; + + if (strcasecmp( imp->spec->file_name, dll_name )) continue; + if (!find_export( api_name, imp->exports, imp->nb_exports )) + warning( "%s:%d: forward '%s' not found in %s\n", + spec->src_name, odp->lineno, odp->link_name, imp->spec->file_name ); + break; } + if (j == nb_imports) + warning( "%s:%d: forward '%s' not found in the imported dll list\n", + spec->src_name, odp->lineno, odp->link_name ); + free( link_name ); + free( dll_name ); } - - free( link_name ); - free( dll_name ); - - if (!found) - warning( "%s:%d: forward '%s' not found in the imported dll list\n", - spec->src_name, odp->lineno, odp->link_name ); }
/* flag the dll exports that link to an undefined symbol */ @@ -468,11 +468,7 @@ static void check_undefined_exports( DLLSPEC *spec ) { ORDDEF *odp = &spec->entry_points[i]; if (odp->type == TYPE_STUB) continue; - if (odp->flags & FLAG_FORWARD) - { - check_undefined_forward( spec, odp ); - continue; - } + if (odp->flags & FLAG_FORWARD) continue; if (find_name( odp->link_name, &undef_symbols )) { switch(odp->type) @@ -597,6 +593,7 @@ int resolve_imports( DLLSPEC *spec ) ORDDEF *odp;
sort_names( &ignore_symbols ); + check_undefined_forwards( spec );
for (i = 0; i < nb_imports; i++) {