summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/darwin-protos.h4
-rw-r--r--gcc/config/darwin.c23
-rw-r--r--gcc/config/darwin.h8
-rw-r--r--gcc/config/rs6000/rs6000.c3
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/darwin-weakimport-1.c16
7 files changed, 65 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6f7587ad7bb..8199b2a3e92 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -8,6 +8,16 @@
2004-10-27 Geoffrey Keating <geoffk@apple.com>
+ * config/rs6000/rs6000.c (rs6000_attribute_table): Add
+ SUBTARGET_ATTRIBUTE_TABLE.
+ * config/darwin.h (ASM_WEAKEN_DECL): Handle weak_import.
+ (SUBTARGET_ATTRIBUTE_TABLE): Define.
+ * config/darwin.c (darwin_handle_weak_import_attribute): New.
+ (HAVE_DEAD_STRIP): Delete.
+ (no_dead_strip): Don't test HAVE_DEAD_STRIP.
+ * config/darwin-protos.h (darwin_handle_weak_import_attribute):
+ Prototype.
+
* doc/tm.texi (USE_SELECT_SECTION_FOR_FUNCTIONS): Document.
* config/darwin.h (GTHREAD_USE_WEAK): Define.
diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h
index 9a915a2b16f..43ea4cd3363 100644
--- a/gcc/config/darwin-protos.h
+++ b/gcc/config/darwin-protos.h
@@ -82,6 +82,10 @@ extern void darwin_file_end (void);
extern void darwin_mark_decl_preserved (const char *);
+extern tree darwin_handle_weak_import_attribute (tree *node, tree name,
+ tree args, int flags,
+ bool * no_add_attrs);
+
/* Expanded by EXTRA_SECTION_FUNCTIONS into varasm.o. */
extern void text_coal_section (void);
extern void text_unlikely_section (void);
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 0c39fd80c65..73581f7346a 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -1209,13 +1209,30 @@ darwin_unique_section (tree decl ATTRIBUTE_UNUSED, int reloc ATTRIBUTE_UNUSED)
/* Darwin does not use unique sections. */
}
-#define HAVE_DEAD_STRIP 0
+/* Handle a "weak_import" attribute; arguments as in
+ struct attribute_spec.handler. */
+
+tree
+darwin_handle_weak_import_attribute (tree *node, tree name,
+ tree ARG_UNUSED (args),
+ int ARG_UNUSED (flags),
+ bool * no_add_attrs)
+{
+ if (TREE_CODE (*node) != FUNCTION_DECL)
+ {
+ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
+ *no_add_attrs = true;
+ }
+ else
+ declare_weak (*node);
+
+ return NULL_TREE;
+}
static void
no_dead_strip (FILE *file, const char *lab)
{
- if (HAVE_DEAD_STRIP)
- fprintf (file, ".no_dead_strip %s\n", lab);
+ fprintf (file, ".no_dead_strip %s\n", lab);
}
/* Emit a label for an FDE, making it global and/or weak if appropriate.
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index 917f4a94539..098caa2d76d 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -385,6 +385,9 @@ extern const char *darwin_fix_and_continue_switch;
targetm.asm_out.globalize_label (FILE, NAME); \
if (DECL_EXTERNAL (DECL)) \
fputs ("\t.weak_reference ", FILE); \
+ else if (! lookup_attribute ("weak", DECL_ATTRIBUTES (DECL)) \
+ && lookup_attribute ("weak_import", DECL_ATTRIBUTES (DECL))) \
+ break; \
else if (TREE_PUBLIC (DECL)) \
fputs ("\t.weak_definition ", FILE); \
else \
@@ -862,6 +865,11 @@ objc_section_init (void) \
#undef TARGET_ASM_ASSEMBLE_VISIBILITY
#define TARGET_ASM_ASSEMBLE_VISIBILITY darwin_assemble_visibility
+/* Extra attributes for Darwin. */
+#define SUBTARGET_ATTRIBUTE_TABLE \
+ /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ \
+ { "weak_import", 0, 0, true, false, false, \
+ darwin_handle_weak_import_attribute }
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index bfea35379a2..e2f97d7742c 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -16659,6 +16659,9 @@ const struct attribute_spec rs6000_attribute_table[] =
{ "altivec", 1, 1, false, true, false, rs6000_handle_altivec_attribute },
{ "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
{ "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
+#ifdef SUBTARGET_ATTRIBUTE_TABLE
+ SUBTARGET_ATTRIBUTE_TABLE,
+#endif
{ NULL, 0, 0, false, false, false, NULL }
};
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8d984cc8c34..647ab555dda 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-10-27 Geoffrey Keating <geoffk@apple.com>
+
+ * gcc.dg/darwin-weakimport-1.c: New.
+
2004-10-28 Ben Elliston <bje@au.ibm.com>
* gcc.dg/tree-ssa/sra-1.c: Pass --param sra-max-structure-size.
diff --git a/gcc/testsuite/gcc.dg/darwin-weakimport-1.c b/gcc/testsuite/gcc.dg/darwin-weakimport-1.c
new file mode 100644
index 00000000000..c797720e4e2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/darwin-weakimport-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-require-weak "" } */
+/* { dg-options "-fno-common" } */
+
+/* { dg-final { scan-assembler "weak_reference _a" } } */
+/* { dg-final { scan-assembler-not "weak_\[a-z \t\]*_b" } } */
+
+extern void a (void) __attribute__((weak_import));
+extern void b (void) __attribute__((weak_import));
+
+void b(void)
+{
+ a();
+}
+
+extern int c __attribute__((weak_import)); /* { dg-warning "ignored" } */
OpenPOWER on IntegriCloud