diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-08-13 01:24:28 +0000 |
---|---|---|
committer | Danny Smith <dannysmith@gcc.gnu.org> | 2004-08-13 01:24:28 +0000 |
commit | ea3d83a77f78bb400f9406c0a5fcbd89307859fa (patch) | |
tree | 4631956ae793ee2755ae4fe428a99bd9d0a0f5bd | |
parent | 3fee54be329cad6ec896c9b243073e54b7556c85 (diff) | |
download | gcc-ea3d83a77f78bb400f9406c0a5fcbd89307859fa.zip gcc-ea3d83a77f78bb400f9406c0a5fcbd89307859fa.tar.gz gcc-ea3d83a77f78bb400f9406c0a5fcbd89307859fa.tar.bz2 |
re PR c++/16924 (dllexport attribute now causes some symbols _not_ to be exported)
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
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/i386/winnt.c | 28 |
2 files changed, 24 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6f85e90..4fee68d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c index 08e7864..4118858 100644 --- a/gcc/config/i386/winnt.c +++ b/gcc/config/i386/winnt.c @@ -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. */ } } |