Alexandre Julliard : winebuild: Improved checks for missing forward entry point targets.

Alexandre Julliard julliard at winehq.org
Fri Dec 7 11:01:47 CST 2007


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

Author: Alexandre Julliard <julliard at 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++)
     {




More information about the wine-cvs mailing list