This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
fix -funwind-tables on Darwin
- From: gkeating at apple dot com (Geoffrey Keating)
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 9 Oct 2007 15:54:49 -0700 (PDT)
- Subject: fix -funwind-tables on Darwin
This fixes two problems with -funwind-tables on Darwin. First of all,
it would output a FDE and also output a '=0' absolute definition for
that FDE's symbol. Then there was a more obscure problem involving
__asm caused by darwin_emit_unwind_label not using assemble_name.
I believe this used to work in 4.0.
Bootstrapped & tested on powerpc-darwin8.
--
- Geoffrey Keating <geoffk@apple.com>
===File ~/patches/gcc-5480287.patch=========================
Index: gcc/ChangeLog
2007-10-09 Geoffrey Keating <geoffk@apple.com>
* dwarf2out.c (output_call_frame_info): FDEs are always emitted
if flag_exceptions is not set.
* config/darwin.c (darwin_emit_unwind_label): Rewrite to use
assemble_name rather than incorrectly emulating it.
Index: gcc/testsuite/ChangeLog
2007-10-09 Geoffrey Keating <geoffk@apple.com>
* gcc.dg/unwind-1.c: New.
Index: gcc/testsuite/gcc.dg/unwind-1.c
===================================================================
--- gcc/testsuite/gcc.dg/unwind-1.c (revision 0)
+++ gcc/testsuite/gcc.dg/unwind-1.c (revision 0)
@@ -0,0 +1,7 @@
+/* { dg-do assemble } */
+/* { dg-options "-fleading-underscore -funwind-tables" } */
+
+void func(void) __asm("_func");
+void _func(int x) {}
+void func(void) {}
+
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c (revision 129137)
+++ gcc/dwarf2out.c (working copy)
@@ -2223,6 +2223,7 @@
specialization doesn't. */
if (TARGET_USES_WEAK_UNWIND_INFO
&& ! flag_asynchronous_unwind_tables
+ && flag_exceptions
&& for_eh)
for (i = 0; i < fde_table_in_use; i++)
if ((fde_table[i].nothrow || fde_table[i].all_throwers_are_sibcalls)
Index: gcc/config/darwin.c
===================================================================
--- gcc/config/darwin.c (revision 129137)
+++ gcc/config/darwin.c (working copy)
@@ -1465,12 +1465,6 @@
return NULL_TREE;
}
-static void
-no_dead_strip (FILE *file, const char *lab)
-{
- fprintf (file, ".no_dead_strip %s\n", lab);
-}
-
/* Emit a label for an FDE, making it global and/or weak if appropriate.
The third parameter is nonzero if this is for exception handling.
The fourth parameter is nonzero if this is just a placeholder for an
@@ -1479,46 +1473,44 @@
void
darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty)
{
- const char *base;
char *lab;
- bool need_quotes;
- if (DECL_ASSEMBLER_NAME_SET_P (decl))
- base = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
- else
- base = IDENTIFIER_POINTER (DECL_NAME (decl));
-
- base = targetm.strip_name_encoding (base);
- need_quotes = name_needs_quotes (base);
-
if (! for_eh)
return;
- lab = concat (need_quotes ? "\"" : "", user_label_prefix, base, ".eh",
- need_quotes ? "\"" : "", NULL);
+ lab = concat (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), ".eh", NULL);
if (TREE_PUBLIC (decl))
- fprintf (file, "\t%s %s\n",
- (DECL_VISIBILITY (decl) != VISIBILITY_HIDDEN
- ? ".globl"
- : ".private_extern"),
- lab);
+ {
+ targetm.asm_out.globalize_label (file, lab);
+ if (DECL_VISIBILITY (decl) == VISIBILITY_HIDDEN)
+ {
+ fputs ("\t.private_extern ", file);
+ assemble_name (file, lab);
+ fputc ('\n', file);
+ }
+ }
if (DECL_WEAK (decl))
- fprintf (file, "\t.weak_definition %s\n", lab);
+ {
+ fputs ("\t.weak_definition ", file);
+ assemble_name (file, lab);
+ fputc ('\n', file);
+ }
+ assemble_name (file, lab);
if (empty)
{
- fprintf (file, "%s = 0\n", lab);
+ fputs (" = 0\n", file);
/* Mark the absolute .eh and .eh1 style labels as needed to
ensure that we don't dead code strip them and keep such
labels from another instantiation point until we can fix this
properly with group comdat support. */
- no_dead_strip (file, lab);
+ darwin_mark_decl_preserved (lab);
}
else
- fprintf (file, "%s:\n", lab);
+ fputs (":\n", file);
free (lab);
}
============================================================