[cft] rewrite i386 dllimport/dllexport

Danny Smith dannysmith@clear.net.nz
Thu Mar 29 11:28:00 GMT 2007

> From: Richard Henderson 
> Sent: Tuesday, 27 March 2007 4:02 a.m.
> On Sun, Mar 25, 2007 at 10:18:03PM +1200, Danny Smith wrote:
> > Unfortunately the changes appear to force all local functions to be
> > called as indirect refs.
> Arg!  There's a missing "return true":

Hello Richard

Two problems, after the fix to predicates.md.

In winnt.c: i386_pe_encode_section_info: 

When generating the decorated name for stdcall/fastcall symbols, your
does this:
+	      XSTR (symbol, 0) = IDENTIFIER_POINTER (newid);

'symbol' has not yet been initialised,

This change (get the symbol_ref earlier) to your revised
i386_pe_encode_section_info works for me:

*** winnt.c.rth	Thu Mar 29 21:46:20 2007
--- winnt.c	Thu Mar 29 21:50:37 2007
*************** i386_pe_encode_section_info (tree decl, 
*** 221,226 ****
--- 221,232 ----
    /* Do this last, due to our frobbing of DECL_DLLIMPORT_P above.  */
    default_encode_section_info (decl, rtl, first);
+   if (!VAR_OR_FUNCTION_DECL_P (decl))
+      return;
+   symbol = XEXP (rtl, 0);
+   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
    switch (TREE_CODE (decl))
      case FUNCTION_DECL:
*************** i386_pe_encode_section_info (tree decl, 
*** 270,278 ****
-   symbol = XEXP (rtl, 0);
-   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
    /* Mark the decl so we can tell from the rtl whether the object is
       dllexport'd or dllimport'd.  tree.c:
       handles dllexport/dllimport override semantics.  */

This testcase:

extern int __attribute__ ((dllimport)) foo;
int* bar () {return &foo;}
int foo;

fails with
foo.c:3: warning: 'foo' redeclared without dllimport attribute after
being referenced with dll linkage
foo.c:3: internal compiler error: in
i386_pe_asm_output_aligned_decl_common, at config/i386/winnt.c:487

The problem is that in tree.c: merge_dllimport_decl_attributes we keep
the DECL_DLLIMPORT_P flag in the above case, but lose the attribute. The
DECL_DLLIMPORT_P flag is kept so that
isn't confused. The dllimport attribute is lost so that we don't change
into _imp__foo.

Should we just emit an undefined _imp__foo and make the user fix up the

If we always trust DECL_DLLIMPORT_P, the

if (delete_dllimport_p)

 path in  merge_dllimport_decl_attributes is unnecessary.


> r~

More information about the Gcc-patches mailing list