* defparse.y (opt_equal_name): allow "." in name.
authorChristopher Faylor <me+cygwin@cgf.cx>
Wed, 14 Mar 2001 02:56:45 +0000 (02:56 +0000)
committerChristopher Faylor <me+cygwin@cgf.cx>
Wed, 14 Mar 2001 02:56:45 +0000 (02:56 +0000)
* dlltool.c (def_exports): Added ability to generate forwarded exports.
(gen_exp_file): Likewise.

binutils/ChangeLog
binutils/defparse.y
binutils/dlltool.c

index 1767f67..6914410 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-13  Eric Kohl  <ekohl@rz-online.de>
+
+       * defparse.y (opt_equal_name): allow "." in name.
+       * dlltool.c (def_exports): Added ability to generate forwarded exports.
+       (gen_exp_file): Likewise.
+
 2001-03-12  Stefan Geuken <mail@stefan-geuken.de>
 
        * NEWS: Document addition of -B switch to objcopy.
index 7e13965..d0bccd9 100644 (file)
@@ -149,6 +149,12 @@ opt_ordinal:
 
 opt_equal_name:
           '=' ID       { $$ = $2; }
+       | '=' ID '.' ID 
+         { 
+           char *name = xmalloc (strlen ($2) + 1 + strlen ($4) + 1);
+           sprintf (name, "%s.%s", $2, $4);
+           $$ = name;
+         }
         |              { $$ =  0; }                     
        ;
 
index 9475b98..ca6199a 100644 (file)
    LIBRARY <name> [ , <base> ]
    The result is going to be <name>.DLL
 
-   EXPORTS  ( <name1> [ = <name2> ] [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) *
+   EXPORTS  ( (  ( <name1> [ = <name2> ] )
+               | ( <name1> = <module-name> . <external-name>))
+            [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) *
    Declares name1 as an exported symbol from the
-   DLL, with optional ordinal number <integer>
+   DLL, with optional ordinal number <integer>.
+   Or declares name1 as an alias (forward) of the function <external-name>
+   in the DLL <module-name>.
 
    IMPORTS  (  (   <internal-name> =   <module-name> . <integer> )
              | ( [ <internal-name> = ] <module-name> . <external-name> )) *
@@ -636,6 +640,7 @@ typedef struct export
     int noname;
     int data;
     int hint;
+    int forward;       /* number of forward label, 0 means no forward */
     struct export *next;
   }
 export_type;
@@ -848,6 +853,7 @@ static export_type *d_exports;      /*list of exported functions */
 static export_type **d_exports_lexically;      /* vector of exported functions in alpha order */
 static dlist_type *d_list;     /* Descriptions */
 static dlist_type *a_list;     /* Stuff to go in directives */
+static int d_nforwards = 0;    /* Number of forwarded exports */
 
 static int d_is_dll;
 static int d_is_exe;
@@ -882,6 +888,12 @@ def_exports (name, internal_name, ordinal, noname, constant, data)
   p->next = d_exports;
   d_exports = p;
   d_nfuncs++;
+  
+  if ((internal_name != NULL) 
+      && (strchr (internal_name, '.') != NULL))
+    p->forward = ++d_nforwards;
+  else
+    p->forward = 0; /* no forward */
 }
 
 void
@@ -1819,9 +1831,14 @@ gen_exp_file ()
                  i++;
                }
            }
-         fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE,
-                   ASM_PREFIX,
-                   exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
+
+         if (exp->forward == 0)
+           fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE,
+                    ASM_PREFIX,
+                    exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
+         else
+           fprintf (f, "\t%sf%d%s\t%s %d\n", ASM_RVA_BEFORE,
+                    exp->forward, ASM_RVA_AFTER, ASM_C, exp->ordinal);
          i++;
        }
 
@@ -1846,8 +1863,13 @@ gen_exp_file ()
       fprintf(f,"%s Export Name Table\n", ASM_C);
       for (i = 0; (exp = d_exports_lexically[i]); i++)
        if (!exp->noname || show_allnames)
-         fprintf (f, "n%d:     %s      \"%s\"\n",
-                  exp->ordinal, ASM_TEXT, exp->name);
+         {
+           fprintf (f, "n%d:   %s      \"%s\"\n",
+                    exp->ordinal, ASM_TEXT, exp->name);
+           if (exp->forward != 0)
+             fprintf (f, "f%d: %s      \"%s\"\n",
+                      exp->forward, ASM_TEXT, exp->internal_name);
+         }
 
       if (a_list)
        {