re PR c++/16924 (dllexport attribute now causes some symbols _not_ to be exported)
authorMark Mitchell <mark@codesourcery.com>
Fri, 13 Aug 2004 01:24:28 +0000 (01:24 +0000)
committerDanny Smith <dannysmith@gcc.gnu.org>
Fri, 13 Aug 2004 01:24:28 +0000 (01:24 +0000)
PR c++/16924
* config/i386/winnt.c (i386_pe_mark_dllexport): Set
SYMBOL_REF_DECL.
(i386_pe_mark_dllimport): Likewise.
(i386_pe_encode_section_info): Likewise, when overriding
dllimport attribute.

From-SVN: r85924

gcc/ChangeLog
gcc/config/i386/winnt.c

index 6f85e90ecdabe2b42b5a3d2c293e934f15b8d81c..4fee68d8cc99814e1ca09697bac3b9f983d6ccbb 100644 (file)
@@ -1,3 +1,12 @@
+2004-08-13  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/16924
+       * config/i386/winnt.c (i386_pe_mark_dllexport): Set
+       SYMBOL_REF_DECL.
+       (i386_pe_mark_dllimport): Likewise.
+       (i386_pe_encode_section_info): Likewise, when overriding
+       dllimport attribute.
+
 2004-08-12  Geoffrey Keating  <geoffk@apple.com>
 
        * configure.ac: When testing for flex, nm, ar, and bison, check
index 08e7864371e14d8523f4b68b2088a19e3cea7f01..41188584f727cf9c02a554e32adb499287c596c3 100644 (file)
@@ -241,6 +241,7 @@ i386_pe_mark_dllexport (tree decl)
   const char *oldname;
   char  *newname;
   rtx rtlname;
+  rtx symref;
   tree idp;
 
   rtlname = XEXP (DECL_RTL (decl), 0);
@@ -271,8 +272,9 @@ i386_pe_mark_dllexport (tree decl)
      identical.  */
   idp = get_identifier (newname);
 
-  XEXP (DECL_RTL (decl), 0) =
-    gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
+  symref = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
+  SYMBOL_REF_DECL (symref) = decl;
+  XEXP (DECL_RTL (decl), 0) = symref;
 }
 
 /* Mark a DECL as being dllimport'd.  */
@@ -284,6 +286,7 @@ i386_pe_mark_dllimport (tree decl)
   char  *newname;
   tree idp;
   rtx rtlname, newrtl;
+  rtx symref;
 
   rtlname = XEXP (DECL_RTL (decl), 0);
   if (GET_CODE (rtlname) == SYMBOL_REF)
@@ -320,9 +323,9 @@ i386_pe_mark_dllimport (tree decl)
      identical.  */
   idp = get_identifier (newname);
 
-  newrtl = gen_rtx_MEM (Pmode,
-                       gen_rtx_SYMBOL_REF (Pmode,
-                                           IDENTIFIER_POINTER (idp)));
+  symref = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
+  SYMBOL_REF_DECL (symref) = decl;
+  newrtl = gen_rtx_MEM (Pmode,symref);
   XEXP (DECL_RTL (decl), 0) = newrtl;
 
   /* Can't treat a pointer to this as a constant address */
@@ -450,7 +453,13 @@ i386_pe_encode_section_info (tree decl, rtx rtl, int first)
 
       /* Remove DLL_IMPORT_PREFIX.  */
       tree idp = get_identifier (oldname + strlen (DLL_IMPORT_PREFIX));
-      rtx newrtl = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
+      rtx symref = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
+      SYMBOL_REF_DECL (symref) = decl;
+      XEXP (DECL_RTL (decl), 0) = symref;
+      DECL_NON_ADDR_CONST_P (decl) = 0;
+
+      /* We previously set TREE_PUBLIC and DECL_EXTERNAL.
+        We leave these alone for now.  */
 
       if (DECL_INITIAL (decl) || !DECL_EXTERNAL (decl))
        warning ("%J'%D' defined locally after being "
@@ -458,13 +467,6 @@ i386_pe_encode_section_info (tree decl, rtx rtl, int first)
       else
        warning ("%J'%D' redeclared without dllimport attribute "
                 "after being referenced with dllimport linkage", decl, decl);
-
-      XEXP (DECL_RTL (decl), 0) = newrtl;
-
-      DECL_NON_ADDR_CONST_P (decl) = 0;
-
-      /* We previously set TREE_PUBLIC and DECL_EXTERNAL.
-        We leave these alone for now.  */
     }
 }