@@ -171,7 +171,8 @@ still needed for compilation. */
mingw_handle_selectany_attribute, NULL }
#undef SUB_TARGET_RECORD_STUB
-#define SUB_TARGET_RECORD_STUB mingw_pe_record_stub
+#define SUB_TARGET_RECORD_STUB(NAME, DECL) mingw_pe_record_stub((NAME), \
+ DECL_WEAK ((DECL)))
#define SUPPORTS_ONE_ONLY 1
@@ -186,7 +187,8 @@ still needed for compilation. */
#undef GOT_ALIAS_SET
#define GOT_ALIAS_SET mingw_GOT_alias_set ()
-#define PE_COFF_LEGITIMIZE_EXTERN_DECL 1
+#define PE_COFF_LEGITIMIZE_EXTERN_DECL(RTX) \
+ (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_WEAK (RTX))
#define HAVE_64BIT_POINTERS 1
@@ -461,7 +461,7 @@ do { \
#define TARGET_ASM_ASSEMBLE_VISIBILITY i386_pe_assemble_visibility
#undef SUB_TARGET_RECORD_STUB
-#define SUB_TARGET_RECORD_STUB mingw_pe_record_stub
+#define SUB_TARGET_RECORD_STUB(NAME, DECL) mingw_pe_record_stub((NAME), 0)
/* Static stack checking is supported by means of probes. */
#define STACK_CHECK_STATIC_BUILTIN 1
@@ -470,7 +470,7 @@ do { \
# define HAVE_GAS_ALIGNED_COMM 0
#endif
-#define PE_COFF_LEGITIMIZE_EXTERN_DECL \
+#define PE_COFF_LEGITIMIZE_EXTERN_DECL(RTX) \
(ix86_cmodel == CM_LARGE_PIC || ix86_cmodel == CM_MEDIUM_PIC)
#define HAVE_64BIT_POINTERS TARGET_64BIT_DEFAULT
@@ -134,7 +134,7 @@ get_dllimport_decl (tree decl, bool beimport)
{
SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
#ifdef SUB_TARGET_RECORD_STUB
- SUB_TARGET_RECORD_STUB (name);
+ SUB_TARGET_RECORD_STUB (name, decl);
#endif
}
@@ -206,7 +206,7 @@ legitimize_pe_coff_symbol (rtx addr, bool inreg)
}
}
- if (!PE_COFF_LEGITIMIZE_EXTERN_DECL)
+ if (!PE_COFF_LEGITIMIZE_EXTERN_DECL (addr))
return NULL_RTX;
if (GET_CODE (addr) == SYMBOL_REF
@@ -635,6 +635,7 @@ struct GTY(()) stub_list
{
struct stub_list *next;
const char *name;
+ bool is_weak_decl_needed;
};
static GTY(()) struct export_list *export_head;
@@ -672,7 +673,7 @@ mingw_pe_maybe_record_exported_symbol (tree decl, const char *name, int is_data)
}
void
-mingw_pe_record_stub (const char *name)
+mingw_pe_record_stub (const char *name, bool is_weak_decl_needed)
{
struct stub_list *p;
@@ -691,6 +692,7 @@ mingw_pe_record_stub (const char *name)
p = ggc_alloc<stub_list> ();
p->next = stub_head;
p->name = name;
+ p->is_weak_decl_needed = is_weak_decl_needed;
stub_head = p;
}
@@ -807,6 +809,15 @@ mingw_pe_file_end (void)
if (!startswith (name, "refptr."))
continue;
name += 7;
+
+ if (q->is_weak_decl_needed)
+ {
+#ifdef ASM_WEAKEN_LABEL
+ ASM_WEAKEN_LABEL (asm_out_file, name);
+#endif
+ mingw_pe_declare_function_type (asm_out_file, name, 1);
+ }
+
fprintf (asm_out_file, "\t.section\t.rdata$%s, \"dr\"\n"
"\t.globl\t%s\n"
"\t.linkonce\tdiscard\n", oname, oname);
@@ -28,7 +28,7 @@ extern void mingw_pe_declare_function_type (FILE *file, const char *name,
extern void mingw_pe_encode_section_info (tree, rtx, int);
extern void mingw_pe_file_end (void);
extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
-extern void mingw_pe_record_stub (const char *);
+extern void mingw_pe_record_stub (const char *, bool);
extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
extern void mingw_pe_unique_section (tree, int);
extern bool mingw_pe_valid_dllimport_attribute_p (const_tree);