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
#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
#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
# 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
{
SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
#ifdef SUB_TARGET_RECORD_STUB
- SUB_TARGET_RECORD_STUB (name);
+ SUB_TARGET_RECORD_STUB (name, decl);
#endif
}
}
}
- if (!PE_COFF_LEGITIMIZE_EXTERN_DECL)
+ if (!PE_COFF_LEGITIMIZE_EXTERN_DECL (addr))
return NULL_RTX;
if (GET_CODE (addr) == SYMBOL_REF
{
struct stub_list *next;
const char *name;
+ bool is_weak_decl_needed;
};
static GTY(()) struct export_list *export_head;
}
void
-mingw_pe_record_stub (const char *name)
+mingw_pe_record_stub (const char *name, bool is_weak_decl_needed)
{
struct stub_list *p;
p = ggc_alloc<stub_list> ();
p->next = stub_head;
p->name = name;
+ p->is_weak_decl_needed = is_weak_decl_needed;
stub_head = p;
}
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);
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);