diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6f85e90ecdabe2b42b5a3d2c293e934f15b8d81c..4fee68d8cc99814e1ca09697bac3b9f983d6ccbb 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 08e7864371e14d8523f4b68b2088a19e3cea7f01..41188584f727cf9c02a554e32adb499287c596c3 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. */ } }