This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Fix ia64 unwind_info data output in gcc


Hi!

As I've just commited the binutils part of the unwind_info changes, here is
the corresponding gcc part (which has to match what binutils do exactly).
If the function is in .text section, we should output its unwind info using
	.xdata?	".IA64.unwind_info", ...
for section FOO it should be
	.xdata? ".IA64.unwind_infoFOO", ...
and for section .gnu.linkonce.t.FOO it should be
	.xdata? ".gnu.linkonce.ia64unwi.FOO", ...
Ok to commit, head & branch?

2001-05-11  Jakub Jelinek  <jakub@redhat.com>

	* config/ia64/ia64.h (ASM_OUTPUT_XDATA_CHAR, ASM_OUTPUT_XDATA_SHORT,
	ASM_OUTPUT_XDATA_INT, ASM_OUTPUT_XDATA_DOUBLE_INT): Pass section
	name as two strings.
	(IA64_OUTPUT_EH_SECTION): New helper macro.
	(ASM_OUTPUT_EH_CHAR, ASM_OUTPUT_EH_SHORT, ASM_OUTPUT_EH_INT,
	ASM_OUTPUT_EH_DOUBLE_INT): Use it.

--- gcc/config/ia64/ia64.h.jj	Wed Apr 25 16:08:15 2001
+++ gcc/config/ia64/ia64.h	Fri May 11 16:19:13 2001
@@ -2100,9 +2100,9 @@ do {									\
 /* This is how to output an assembler line defining a `char' constant
    to an xdata segment.  */
 
-#define ASM_OUTPUT_XDATA_CHAR(FILE, SECTION, VALUE)			\
+#define ASM_OUTPUT_XDATA_CHAR(FILE, PREFIX, SUFFIX, VALUE)		\
 do {									\
-  fprintf (FILE, "\t.xdata1\t\"%s\", ", SECTION);			\
+  fprintf (FILE, "\t.xdata1\t\"%s%s\", ", PREFIX, SUFFIX);		\
   output_addr_const (FILE, (VALUE));					\
   fprintf (FILE, "\n");							\
 } while (0)
@@ -2110,9 +2110,9 @@ do {									\
 /* This is how to output an assembler line defining a `short' constant
    to an xdata segment.  */
 
-#define ASM_OUTPUT_XDATA_SHORT(FILE, SECTION, VALUE)			\
+#define ASM_OUTPUT_XDATA_SHORT(FILE, PREFIX, SUFFIX, VALUE)		\
 do {									\
-  fprintf (FILE, "\t.xdata2\t\"%s\", ", SECTION);			\
+  fprintf (FILE, "\t.xdata2\t\"%s%s\", ", PREFIX, SUFFIX);		\
   output_addr_const (FILE, (VALUE));					\
   fprintf (FILE, "\n");							\
 } while (0)
@@ -2122,9 +2122,9 @@ do {									\
 
 /* ??? For ILP32, also need to handle function addresses here.  */
 
-#define ASM_OUTPUT_XDATA_INT(FILE, SECTION, VALUE)			\
+#define ASM_OUTPUT_XDATA_INT(FILE, PREFIX, SUFFIX, VALUE)		\
 do {									\
-  fprintf (FILE, "\t.xdata4\t\"%s\", ", SECTION);			\
+  fprintf (FILE, "\t.xdata4\t\"%s%s\", ", PREFIX, SUFFIX);		\
   output_addr_const (FILE, (VALUE));					\
   fprintf (FILE, "\n");							\
 } while (0)
@@ -2132,10 +2132,10 @@ do {									\
 /* This is how to output an assembler line defining a `long' constant
    to an xdata segment.  We also handle symbol output here.  */
 
-#define ASM_OUTPUT_XDATA_DOUBLE_INT(FILE, SECTION, VALUE)		\
+#define ASM_OUTPUT_XDATA_DOUBLE_INT(FILE, PREFIX, SUFFIX, VALUE)	\
 do {									\
   int need_closing_paren = 0;						\
-  fprintf (FILE, "\t.xdata8\t\"%s\", ", SECTION);			\
+  fprintf (FILE, "\t.xdata8\t\"%s%s\", ", PREFIX, SUFFIX);		\
   if (!(TARGET_NO_PIC || TARGET_AUTO_PIC)				\
       && GET_CODE (VALUE) == SYMBOL_REF)				\
     {									\
@@ -2148,19 +2148,34 @@ do {									\
   fprintf (FILE, "\n");							\
 } while (0)
 
+#define IA64_OUTPUT_EH_SECTION(OUTPUT, FILE, VALUE)			\
+do {									\
+  char *eh_prefix = ".IA_64.unwind_info", *eh_suffix = "";		\
+  if (in_section == in_named)						\
+    {									\
+      eh_suffix = in_named_name;					\
+      if (strncmp (in_named_name, ".gnu.linkonce.t.",			\
+		   sizeof (".gnu.linkonce.t.") - 1) == 0)		\
+	{								\
+	  eh_prefix = ".gnu.linkonce.ia64unwi.";			\
+	  eh_suffix += sizeof (".gnu.linkonce.t.") - 1;			\
+	}								\
+    }									\
+  OUTPUT (FILE, eh_prefix, eh_suffix, VALUE);				\
+} while (0)  
 
 /* Output EH data to the unwind segment. */
 #define ASM_OUTPUT_EH_CHAR(FILE, VALUE)					\
-		ASM_OUTPUT_XDATA_CHAR(FILE, ".IA_64.unwind_info", VALUE)
+  IA64_OUTPUT_EH_SECTION(ASM_OUTPUT_XDATA_CHAR, FILE, VALUE)
 
 #define ASM_OUTPUT_EH_SHORT(FILE, VALUE)				\
-		ASM_OUTPUT_XDATA_SHORT(FILE, ".IA_64.unwind_info", VALUE)
+  IA64_OUTPUT_EH_SECTION(ASM_OUTPUT_XDATA_SHORT, FILE, VALUE)
 
 #define ASM_OUTPUT_EH_INT(FILE, VALUE)					\
-		ASM_OUTPUT_XDATA_INT(FILE, ".IA_64.unwind_info", VALUE)
+  IA64_OUTPUT_EH_SECTION(ASM_OUTPUT_XDATA_INT, FILE, VALUE)
 
 #define ASM_OUTPUT_EH_DOUBLE_INT(FILE, VALUE)				\
-		ASM_OUTPUT_XDATA_DOUBLE_INT(FILE, ".IA_64.unwind_info", VALUE)
+  IA64_OUTPUT_EH_SECTION(ASM_OUTPUT_XDATA_DOUBLE_INT, FILE, VALUE)
 
 /* A C statement to output to the stdio stream STREAM an assembler instruction
    to assemble a single byte containing the number VALUE.  */

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]