public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* fix -funwind-tables on Darwin
@ 2007-10-09 22:54 Geoffrey Keating
  0 siblings, 0 replies; only message in thread
From: Geoffrey Keating @ 2007-10-09 22:54 UTC (permalink / raw)
  To: gcc-patches


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);
 }
============================================================

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-10-09 22:54 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-10-09 22:54 fix -funwind-tables on Darwin Geoffrey Keating

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).