This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix ia64 unwind_info data output in gcc
- To: rth at redhat dot com
- Subject: [PATCH] Fix ia64 unwind_info data output in gcc
- From: Jakub Jelinek <jakub at redhat dot com>
- Date: Fri, 11 May 2001 15:17:15 +0200
- Cc: gcc-patches at gcc dot gnu dot org
- Reply-To: Jakub Jelinek <jakub at redhat dot com>
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